Tempest Navigator 4.0 - Reference Documentation

Reference file: storage-sqlite.md

SQLite Storage

Tempest uses SQLite as the default storage backend for a small self-hosted PDS. The design favors inspectable local files over a required external database.

Concepts

A PDS stores several kinds of state:

  • account/auth state: who can act as whom
  • repository state: signed record blocks and commits
  • sequencer state: global event order for firehose consumers
  • blob state: uploaded bytes and whether records currently reference them

Repository data is public and content-addressed, but account/session keys and operator secrets are private operational state.

Data directory

TEMPEST_DATA_DIR owns all local persistent state. Development defaults to priv/tempest_dev.

Typical layout:

<TEMPEST_DATA_DIR>/
  account.sqlite
  sequencer.sqlite
  repos/
    <normalized-did>.sqlite
  blobs/
    <normalized-did>/
      <cid>

Databases

account.sqlite is managed through Ecto and stores account-oriented state: accounts, sessions, signing keys, app passwords, OAuth data, and blob metadata.

sequencer.sqlite is a raw SQLite database for the monotonic PDS-wide event sequence. It is the durable source for firehose cursors.

Each hosted DID gets a separate repo database under repos/. Repo databases store blocks, current record indexes, commits, and repo metadata.

Operational notes

SQLite runs with WAL where configured. Repo writes are serialized per DID and use explicit transaction boundaries so a record write cannot become visible without its corresponding commit metadata.

Backups must include account.sqlite, sequencer.sqlite, repos/, blobs/, and any WAL files or checkpointed equivalents.

Verification

hurl --test --variable base_url=http://localhost:4000 test/smoke/health.hurl

The health response includes the active data directory, account DB, sequencer DB, and writability status.

Start tempest docs / tempest.desertthunder.dev 2026-06-24 18:44:57Z