Studio Quickstart

CrateStack Studio is a single binary you launch locally to inspect data behind one or more .cstack schemas. You describe the workspace once in a studio.toml — schemas, database URLs, and (optionally) deployed service endpoints — and cratestack studio run serves a web UI against those targets. Studio replaces the older generate-studio codegen scaffold from the 0.3.x line. If you were generating a Leptos+Axum project per schema set, see the migration section.
Phase 1d + 4 (current) complete the rewrite. Phase 1d retires the one-text-box-per-field create + edit forms in favor of typed inputs (enum dropdowns, JSON textarea, datetime-local, numeric inputs). Phase 4 ships SQL preview, drift detection, CSV/JSON export, schema search, an audit log, and a SQLSTATE → VALIDATION_ERROR mapping so unique / foreign-key violations come back through the same per-field envelope as the in-process validators.Reference pages: Studio Read API, Studio Write API, Studio UI, Studio Power Tools, Studio Eject.

1. Install The CLI

If you already have cratestack from the workspace build, you’re set. Otherwise from a checkout of the framework repo:
Verify:

2. Seed studio.toml

This writes a starter studio.toml in the current directory. Pass --out <dir> to target a different directory; pass --force to overwrite an existing file. The starter file is heavily commented. The minimum a real target needs is a key, a schema path, and one of [target.db] / [target.api]:
A target with neither [target.db] nor [target.api] is rejected at load time — Studio has no other way to reach data.

3. Run It

By default Studio binds to 127.0.0.1:7878. Override with --bind:
While Studio is running: Quick smoke test:

4. Multiple Schemas

Studio is designed around multi-target workspaces — one studio.toml can describe every .cstack in a monorepo:
Each target gets its own entry in the UI’s target switcher.

SQLite targets

Studio talks to SQLite databases through rusqlite. The url accepts sqlite:, sqlite://, sqlite::memory:, and bare file paths.
Studio uses rusqlite rather than sqlx-sqlite so it coexists with the rest of the framework’s SQLite path (cratestack-rusqlite).

Direct DB vs deployed service

A target can declare a [target.db] block, a [target.api] block, or both:
  • [target.db] only — Studio opens its own sqlx pool. Best for schemas without a running service, or when you want to bypass application-level RBAC for debugging.
  • [target.api] only — Studio proxies through your deployed CrateStack service. Same auth and policy the service enforces in production. Pick this for shared environments where direct DB access is undesirable.
  • Both — Studio uses the DB for browsing and routes procedures (and anything in prefer_for) through the API. The DB pool is read-only unless the target also has mode = "rw".

Read-only vs read/write

mode controls whether Studio renders edit affordances and accepts mutation calls for a target:
  • "ro" (workspace default) — list, paginate, follow relations, copy generated Rust queries. No edit/delete UI. Mutation endpoints reject with 403.
  • "rw" — adds inline edits, create flows, delete confirmations, and the validation-error pass-through from cratestack-policy. Lands in Phase 3.
Set the workspace default in [workspace] default_mode, then override per target via mode = "...".

Migration from generate-studio

If you were on the 0.3.x scaffold generator:
  1. Delete the generated studio/ workspace from your repo — Studio is no longer code you check in.
  2. Run cratestack studio init and translate your old flags into [[target]] blocks. Roughly:
  3. Add a [target.db] block if you want direct DB browsing. The old generator’s reverse-proxy mode mapped to [target.api] exclusively.
If you forked the Leptos UI, you’ll want to wait for Phase 2 — cratestack studio eject --out ./fork will then copy Studio’s own sources into a workspace you can customize. In Phase 0 / 1 the eject subcommand returns NotImplemented.

Phase roadmap