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.
The rewrite is complete. Studio today gives you typed create + edit
forms (enum dropdowns, JSON textarea,
datetime-local, numeric
inputs), plus
SQL preview and query plans,
drift detection,
CSV/JSON export,
schema search,
an audit log that can
persist across restarts, 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 havecratestack from the workspace build, you’re set.
Otherwise from a checkout of the framework repo:
2. Seed studio.toml
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]:
[target.db] nor [target.api] is rejected at
load time — Studio has no other way to reach data.
The optional audit_file key persists Studio’s own writes to an
append-only JSONL file, replayed on boot. Left unset, the audit log
lives in process memory only and Studio writes nothing to your
filesystem — see persisting the log.
3. Run It
127.0.0.1:7878. Override with --bind:
Quick smoke test:
http://127.0.0.1:7878 and you get the browser UI against those
targets:
Studio browsing a rw target. Sidebar = models in the schema; the RW badge and + New only appear on read/write targets.
4. Multiple Schemas
Studio is designed around multi-target workspaces — onestudio.toml
can describe every .cstack in a monorepo:
SQLite targets
Studio talks to SQLite databases throughrusqlite. The url accepts
sqlite:, sqlite://, sqlite::memory:, and bare file paths.
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. Note that “bypass” is literal: no@@allow/@@denyand no@@internal(...)suppression is enforced on this channel. -
[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 — the target is a
[target.db]target for every read and write. The workspace loader takes[target.db]whenever the target declares one and falls back to[target.api]only when there is no[target.db]block at all, so adding[target.api]alongside buys no policy or route-suppression enforcement. See[target.db]is a direct database connection.
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 with403."rw"— adds inline edits, create flows, delete confirmations, and the validation-error pass-through fromcratestack-policy. Lands in Phase 3.
[workspace] default_mode, then override
per target via mode = "...".
Migration from generate-studio
If you were on the 0.3.x scaffold generator:
-
Delete the generated
studio/workspace from your repo — Studio is no longer code you check in. -
Run
cratestack studio initand translate your old flags into[[target]]blocks. Roughly: -
Add a
[target.db]block if you want direct DB browsing. The old generator’s reverse-proxy mode mapped to[target.api]exclusively.
cratestack studio eject --out ./fork gives you a standalone,
runnable Studio project with the UI already bundled in; add
--with-ui if you also want the Leptos UI sources to customize — see
Studio Eject.