Engineering · Jun 18, 2026 · 10 min read
Your data, your database
An app without a database is a demo. Moonshift provisions one for every project that needs it, and then gives you the keys, literally. Not a hosted black box you can only reach through our UI, but a real connection string you can point anything at.
The Database tab shows live connection status, a copyable libsql URL, and a masked auth token behind a deliberate Reveal step. One click copies an .env snippet; another opens an embedded Studio to browse and edit your data, no separate tool to install.
Provisioned with the build
The database is provisioned during the run, before any code is written against it, and the schema is pushed as part of the build. By the time you see the live app, the data layer already exists and the app is already talking to it. There’s no separate “now connect a database” step.
The Studio
The embedded Studio lets you browse tables, run queries, and edit rows without leaving the project. It’s the difference between “your data is in there somewhere” and “here is your data, in a table, that you can read and change right now.”
Rotate, don’t leak
Tokens are owner-only and encrypted at rest. Rotating a token is one click, and a usable token is never logged or returned where it could leak. The admin path can create and destroy namespaces but never sees a data-plane token, the privilege to manage a database and the privilege to read it are deliberately separate.
- Tokens encrypted at rest, revealed only behind an explicit step.
- One-click rotation; the old token dies the moment you rotate.
- Admin can provision namespaces but never sees a data token.
- Nothing usable is ever written to a log.
Managed or self-hosted, same wire
Whether the database runs on a managed provider or our own self-hosted libsql, the wire protocol is the same, so the app code doesn’t change and you’re never locked in. You can take the connection string and the data and walk, which is exactly the point.
That portability is a deliberate constraint on us, not a feature we can quietly drop. If your data lives behind a proprietary API, leaving is a migration project. If it lives behind a standard connection string, leaving is a copy command.
“Owning your app should mean owning your data. Not a screenshot of it.”