All posts

Engineering · Jun 18, 2026 · 10 min read

Your data, your database

EngineeringMoonshift10 min read

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.

projects/app — database
Connectionlibsql://…
idnamecreated
01row_02026-06
02row_12026-06
Connection status, a copyable URL, and an embedded Studio.

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.

1-click
connection string
embedded
Studio
owner-only
tokens

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.