Quickstart

Create a Vango app, understand the generated layout, and run the dev server.

Updated 2026-05-31Edit this page

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

shell
1go install github.com/vango-go/vango/cmd/vango@v0.3.0

Create an App

shell
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

text
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

shell
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

go
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

  • Programming Model

  • Components & State

  • Routing & User Flows