Your databases. One client.
A database client whose AI agent asks before it writes.
Tabellum opens PostgreSQL, MySQL and MariaDB, SQL Server, BigQuery, SQLite, and MongoDB in one window: browse schemas, run queries in tabs, edit rows, back up and restore. Its agent — and any agent you connect over MCP — can read freely and can change nothing until you click Run on the exact SQL.
Get a free key Try the demo User guide
macOS · Windows · Linux · iPhone and iPad · Android ·
a browser
No telemetry. The key is checked offline.
Get a key and a build
Registration is free. Your key is valid for 180 days, verified offline — the app never calls home.
Already registered and your key expired? Request a fresh one.
What you get
-
Nothing changes without your click. The engine's own SQL parser classifies every statement. Writes, DDL, and admin statements from the agent or an MCP client wait for your approval with the exact SQL, and run in a transaction where the database supports one.
-
All your databases in one window. PostgreSQL, MySQL/MariaDB, SQL Server, BigQuery, SQLite, and MongoDB, on macOS, Windows, Linux, iOS, and Android — and in a browser, served by a worker you run.
-
Private servers without a VPN. SSH and userspace WireGuard tunnels are built into the app: no root, no system VPN.
-
Backups from anywhere. The database's own tools where they are installed, and the engine's export to SQL, CSV, or JSON everywhere, phones included.
-
A workspace you own. Connections and queries are plain YAML and .sql files in a folder you can keep in git; passwords stay in your OS keychain, never in a file.
The agent drafts the SQL.The engine says what it does.Nothing runs until you click.
User guide
Every screen, step by step, with the screenshots marked up: a page per chapter here, a PDF to keep, and the same guide inside the app under Help.
- Tabellum for desktop — macOS, Windows, and Linux: connections, data, queries, charts, the schema designer, backups, and the agent.
- Tabellum for mobile — iPhone and Android: the same, laid out for a touch screen.
Downloads
Loading the current release…
Every desktop build's SHA-256 is listed above and in version.json, which is also what the app checks for updates. Phones, tablets, and the Mac App Store copy install from the store, and ask for no key.
In a browser
The app in this tab, on SQLite: the demo shop, files of your own, the editor, the designer, dashboards, and the agent on your own key. It runs in your browser — the engine is compiled to WebAssembly — and your databases and files stay there; nothing reaches our servers. No install, no key.
For PostgreSQL, MySQL, SQL Server, and the rest, the same app runs in a
tab served by tabellum-worker: the
engine as a service on a machine of yours that reaches the databases. One
container, one origin, your token — there is no Tabellum server in the
path, ever.
docker run -d --name tabellum-worker -p 8788:8788 -e TABELLUM_WORKER_TOKEN=<at least 32 random characters> -v tabellum-data:/data ghcr.io/dudko-dev/tabellum-worker:latest
Put a token of at least 32 random characters in place of the placeholder; the app asks for it once.
The image carries the web app itself, on the port the
command publishes: open it and paste the token once. Then work: connections, queries, tunnels, and backups run on the worker;
passwords and provider keys stay in the browser's encrypted vault and
travel only inside the authenticated connection. Put a TLS reverse proxy
in front for anything beyond a LAN. The key gates connecting as on the
desktop download; with TABELLUM_LICENSE_KEY set on the worker,
the app it serves needs none pasted. The desktop app can point at the same worker through
Engine… in its menu.
How
the worker works.
To hand out databases without
handing out their passwords, put the connection files in a read-only
folder on the worker (TABELLUM_MANAGED_DIR) and their
passwords in its environment, in mounted secret files, or in HashiCorp
Vault. People see those connections locked: they browse and query, and
never see a password or change where a connection points. The desktop
and phone apps can keep a workspace's passwords in the same Vault.
Vault
and managed connections.
A managed database in one file
To see it on your own computer: the worker, the demo shop on
PostgreSQL as a managed connection, your key on the worker, and no
token. Nothing else to create — save this as compose.yaml:
# Tabellum in a browser on this computer, with a database the worker manages
# (https://tabellum.dudko.dev/#compose). Nothing to create beside this file:
# the connection is written below, your key comes from the environment, and
# the workspace lives in a Docker volume.
#
# export TABELLUM_LICENSE_KEY='TABL1.…' # or that line in .env beside this file
# docker compose up -d
# open http://localhost:8788
#
# The browser shows Shop locked: it browses and queries, never sees the
# password, and cannot point the connection anywhere else.
name: tabellum
services:
# The demo shop on PostgreSQL 16 (an invented store) with a read-only login,
# `reader`. For a database of your own, change host, port, database, and
# user in the connection below and the password under the worker, then
# drop this service and the worker's depends_on.
shop-db:
image: ghcr.io/dudko-dev/tabellum-test-postgres:latest
volumes:
- shop-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD", "pg_isready", "-h", "127.0.0.1", "-d", "shop"]
interval: 2s
retries: 60
worker:
image: ghcr.io/dudko-dev/tabellum-worker:latest
depends_on:
shop-db:
condition: service_healthy
ports:
# This computer only: that is what lets the worker run without a token.
- "127.0.0.1:8788:8788"
environment:
TABELLUM_WORKER_AUTH: none
# Unset, the app asks for the key instead.
TABELLUM_LICENSE_KEY: ${TABELLUM_LICENSE_KEY:-}
TABELLUM_MANAGED_DIR: /managed
# Answers {secret: shop/password}. A real password belongs in a Docker
# secret or Vault: an environment variable shows in `docker inspect`.
TABELLUM_SECRET_SHOP_PASSWORD: reader
configs:
- source: shop
target: /managed/connections/shop.yaml
volumes:
- workspace:/data
configs:
shop:
content: |
id: 01JC5M00000000000000000001
name: Shop
driver: postgres
host: shop-db
port: 5432
database: shop
user: reader
password: {secret: shop/password}
tls: {mode: disable}
readOnly: true
volumes:
shop-data:
workspace:
- Put your key where the file looks for it:
export TABELLUM_LICENSE_KEY='TABL1.…'(PowerShell:$env:TABELLUM_LICENSE_KEY='TABL1.…'), or that line in a.envbeside the file. Without one, the app asks for it. docker compose up -din that folder, then open port8788on this computer in a browser.
Shop shows a shield and a lock: it browses and queries,
the password never reaches the browser, and a write is refused — the
connection is read-only. For a database of your own, change the
connection under configs and its password, and drop the
demo database. Port 8788 is published on
127.0.0.1 only, which is what lets the worker skip the
token; on a server, set TABELLUM_WORKER_TOKEN instead of
TABELLUM_WORKER_AUTH and put TLS in front.
Agents — inside the app, and outside it
The built-in agent uses your own OpenAI, Anthropic, or Gemini key and talks to that provider directly. It sees schema metadata by default and row data only for connections where you switch that on. On desktop the app also hosts a local MCP server, so Claude Code and friends can draft queries that appear live in your editor:
npx @dudko.dev/tabellum-mcp
One rule for both: a read runs, a write waits for you. The engine classifies the statement — never the model.
Commercial licensing for the npm package beyond the small-entity thresholds: siarhei@dudko.dev.
Questions
What does it cost?
The download for macOS, Windows, and Linux is free for personal, non-commercial use: register with an email address and you get a key valid for 180 days, renewed for free. The Google Play copy is free and the App Store and Mac App Store copies are paid; those three need no key and may be used commercially. For commercial use of the download, write to siarhei@dudko.dev.
What happens when the key expires?
Connecting stops until you paste a fresh key; your connections, queries, and files stay as they are. Request a fresh one with the same email address on this page, at no cost.
Can the AI agent change my database?
Only after your click. Reads run; every write, DDL, or admin statement waits for your approval with the exact SQL on screen, and runs in a transaction where the database supports one. The engine's own parser decides what a statement is, never the model, and a statement it cannot classify counts as a write. The same holds for agents connected over MCP.
Does the agent see my data?
By default it sees schema metadata: table and column names, types, and keys. Row data reaches it only for the connections where you switch that on. It talks to the provider whose key you gave it, OpenAI, Anthropic, or Gemini, directly; nothing passes through our servers.
Does anything else leave my computer?
Only what you point it at: the database, through your tunnel, and the AI provider you chose. There is no telemetry and no crash reporting, and the key is checked offline. The one request to this site is the desktop download's update check, which you can turn off.
Where are my passwords kept?
In the operating system's secure storage (the Keychain on Apple devices, DPAPI on Windows, libsecret on Linux, the Keystore on Android), or in a HashiCorp Vault your workspace names. A connection file holds a reference to the password, never the password.
Can I try it without installing anything?
Yes. The demo runs the app in your browser on SQLite: the demo shop, files of your own, and the agent on your own key, all kept in the browser. For PostgreSQL, MySQL, SQL Server, and the rest, run the worker on a machine that reaches them.
How do the store copies differ from the download?
They need no key, may be used commercially, and the store keeps them up to date. The Mac App Store copy runs in Apple's sandbox: it backs up through the connection instead of tools such as pg_dump, takes an SSH key pasted into the tunnel instead of the SSH agent, opens one window, and has no local MCP server.
Point it at your own database
The key is free and needs only an email address. The demo needs nothing at all.