Quickstart
Vango is designed to get you from an empty directory to a real server-driven Go app quickly, but the scaffold only makes sense if you understand what it is giving you.
Requirements
Go 1.26.3 or newer
Vango v0.3.0
A modern browser with ES2020 support
Install the CLI
1go install github.com/vango-go/vango/cmd/vango@v0.3.0
Create an App
1vango create my-app
2cd my-app
3vango dev
By default the standard scaffold gives you:
cmd/server/main.go as the web entry point
app/routes for file-based routing
app/components for shared UI
app/stores for SessionKey declarations and durable state roots
app/middleware for route middleware
internal for business logic, services, database code, and config
public for static assets
vango_state_manifest.json and vango_state_schema.json for deploy-safe state tracking
go.mod for the app module
The Generated Shape
1my-app/
2├── cmd/
3│ └── server/
4│ └── main.go
5├── app/
6│ ├── routes/
7│ ├── components/
8│ ├── stores/
9│ └── middleware/
10├── internal/
11│ ├── services/
12│ ├── db/
13│ └── config/
14├── public/
15├── vango.json
16├── vango_state_manifest.json
17├── vango_state_schema.json
18└── go.mod
Good default
The scaffold is not a throwaway demo. Treat the generated structure as the canonical layout unless you have a specific reason to deviate.
Run the Dev Server
1vango dev
The dev workflow handles:
route generation
state artifact maintenance, including generated bindings
Tailwind compilation when enabled
hot reload for normal app authoring
The dev reload socket is only a development convenience. The live runtime is still Vango's normal SSR plus WebSocket patch runtime.
Your First Stateful Component
1func Counter(p CounterProps) vango.Component {
2 return vango.Setup(p, func(s vango.SetupCtx[CounterProps]) vango.RenderFn {
3 count := setup.Signal(&s, p.Initial)
4
5 return func() *vango.VNode {
6 return Div(
7 Button(OnClick(count.Dec), Text("-")),
8 Span(Textf("%d", count.Get())),
9 Button(OnClick(count.Inc), Text("+")),
10 )
11 }
12 })
13}
This illustrates the core Vango rule:
allocate state in Setup
return a pure render closure
keep event-driven writes on the session loop
move blocking work into Resources, Actions, or page Actions
What To Read Next
Programming Model
Components & State
Routing & User Flows