Tabellum
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.

30 seconds, with sound. Also on YouTube.

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

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.

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

Try the demo

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:
  1. 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 .env beside the file. Without one, the app asks for it.
  2. docker compose up -d in that folder, then open port 8788 on 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.

Get a free key Try the demo