tako docs guide reference api
GitHub

The local story

Starting from nothing

tako new blog --kind site
cd blog && tako dev

tako new writes the smallest app that runs — go.mod, one handler, a .gitignore with .env in it — and for --kind site the layout and page a site cannot start without. It resolves the module and generates before it finishes, so the next command is tako dev rather than two more commands. (Until tako is tagged and published, add --replace /path/to/tako; the refusal prints it.)

Everything below is about the app you now have.

tako dev runs your app as one ordinary Go process. There are no emulators and no Docker anywhere in local development:

Declared Local backing
tako.Entity[T] a bbolt file, .tako/data/entity.db
tako.Bucket directories under .tako/data/buckets/
tako.Queue / tako.Topic in-process channels calling your handlers
tako.Lock / singleflight / Singleton an in-process lease table
tako.Job executions ride the local queue dispatcher
signed URLs served by your own process
tako.Auth a dev bar: sign in as alice/bob, no GCP anywhere
tako.Secret .env in the module directory (tako secrets set)

Because queues are channels calling your functions, a breakpoint steps from a publish straight into the worker — and a cross-service Endpoint.Call is a direct function call locally, so the debugger steps across "service" boundaries too.

The database is a directory

.tako/data IS your local state. Deleting it is the reset story: next boot starts empty (an empty shop has an empty shelf — stock it). Nothing else persists.

Fidelity

Local and cloud backends pass one shared conformance suite — that is the contract keeping them honest with each other, instead of an emulator's imitation. Where v0 behavior differs by design (the cache is per-instance; local queue retries pace in milliseconds), the doc comment on the declaration says so.

Dev-loop details worth knowing

Testing

tako.NewTestApp(t) boots the same in-process backends, fresh per test: app.Ctx(app.SignIn("alice")) for identities, Endpoint.Call to invoke handlers, app.DrainQueues() to settle async work (jobs included), app.AdvanceCron(Cleanup) to fire a cron, app.Chaos() for delivery chaos, and app.Handler() for the app's real HTTP surface. tako test regenerates stale code, builds any declared site, maps in the generated test harness, and runs go test ./... — an app's tests want tako test rather than go test, because the overlay carrying that harness is what go test does not apply.