Using Taula
Everything from the first launch to wiring your saved connections into a coding agent. Most of it fits on one screen, so this page is long on purpose and short on ceremony.
Install
Taula ships as a disk image. Download it, open it, and drag Taula into your Applications folder. It needs macOS 15 Sequoia or later.
The app is signed ad hoc rather than notarized, so the first launch takes one extra step: right-click Taula in Applications and choose Open, then confirm. After that it opens like any other app.
The assistant runs on a local llama.cpp server. If you want it, install llama.cpp once with Homebrew. Taula finds the binary, starts the server and downloads the model on first use.
$ brew install llama.cpp
Nothing else to set up. There is no account and no license server; the app works offline.
Connections
The first window is the connection list. Add a connection with the plus button or ⇧⌘N, pick the engine, fill in the details and press Test connection before saving.
- PostgreSQL. Host, port, database, user and password. Typed decoding covers numeric, uuid, jsonb and timestamps.
- SQLite. Pick a file. Attached databases show up in the Objects tab.
- Cloudflare D1. Account, database and an API token. Same grid, same editor, same guardrails.
Passwords and tokens go to the macOS Keychain. The connection itself is saved as JSON on disk without any secret in it.
Connection colors
Give a connection a color to mark it as production. The color shows as a dot in the session tab and a thin bar across the top of the window, and destructive statements on colored connections get an extra warning before they run.
SSH tunnels
For Postgres, turn on SSH in the connection editor and enter the bastion host and user. Taula opens the tunnel in-process, authenticates with your key file or the running SSH agent, and picks a free local port for you. The tunnel closes when the session does.
Browsing data
Once connected, the sidebar lists tables and views grouped by schema. Type in the filter box to narrow the list. Click a table to open it in the Data tab.
- Filter rows. The WHERE box in the toolbar takes a SQL condition, for example
status = 'active' AND age > 30. It applies when you press ⏎. - Sort. Click a column header. The sort runs on the server, so it covers the whole table, not just the loaded rows.
- Load more. Rows load in pages as you scroll toward the bottom. The page size is a setting.
- Search the page. ⌘F filters the rows already loaded and shows a match count in the status bar.
Foreign keys
Columns that reference another table carry a ↗ badge in the header, or 🔑↗ when the column is both primary and foreign key. Right-click a foreign-key cell and choose Jump to referenced row to open the target table filtered to that row.
Cell actions
Right-click any cell for context actions. URLs open in the browser, email addresses open a new message, and Column stats shows row count, non-null count, NULL ratio, distinct values and min and max for that column.
Editing
Edits in the grid are staged, not written. Change as many cells as you like; each pending cell is highlighted. Nothing reaches the database until you commit.
- Edit a cell. Double-click or press ⏎ on a selected cell. ⏎ stages the value and moves down a row, Esc reverts the cell.
- Set NULL. Available from the cell's context menu.
- Insert a row. The plus button opens a sheet with one field per column, aware of defaults and NULL.
- Delete rows. Select rows and press the minus button. Deletion is staged too, and pressing it again un-stages it.
- Commit. ⌘S writes the staged changes as primary-key-matched UPDATE, INSERT and DELETE statements in one go.
- Review first. Review changes shows the exact SQL Taula is about to run. Deletes are shown struck through and can be toggled off before committing.
- Discard. Throws away everything staged.
Type-aware editors
Taula reads the declared column type and adapts. Date, time and timestamp columns get a graphical date picker. Booleans flip with one click and accept spellings like on, off, yes and no. UUID columns have a Generate button in the insert sheet, JSON is validated and edited in a pretty-printed sheet, and binary values open in a hex inspector with a copy-as-base64 action. Long text opens in the same editor sheet as JSON.
Tables without a primary key
SQLite tables are matched on rowid and Postgres tables on ctid, so they stay editable. A SQLite table declared WITHOUT ROWID is read-only in the grid; use the Query tab to change it.
Change journal
Every committed grid edit is recorded with the SQL that undoes it, per connection. Open Change Journal from the wrench menu in the sidebar footer or from the command bar. Each entry has an Undo button and a copy action for the undo SQL. The journal keeps the last 500 entries.
Query editor
The Query tab gives you one or more SQL editors per connection, each with its own results.
- Run. ⌘⏎ runs the editor. ⌘E runs only the selected text.
- Tabs. ⌘T opens a new query tab. Each tab keeps its editor and result.
- Several statements. A script with more than one statement returns one result set per statement. The splitter understands quotes, comments and dollar-quoted strings.
- Highlighting and completion. Keywords, strings and numbers are colored. Completions pop up after three characters, or on F5 from two. They know which tables are in your FROM clause and resolve alias.column.
- Explain. EXPLAIN and EXPLAIN ANALYZE render as a tree, for Postgres plans and SQLite query plans.
- Stop. A running query shows a Stop button. Postgres queries are cancelled through a side connection; SQLite queries are interrupted.
Snippets and history
Save the current editor as a named snippet and open it later from the command bar. Every run is kept in a history per connection, capped at a number you choose in Settings.
Exporting results
Any result set, and any table, can be exported as CSV or JSON. Selected rows can be copied as CSV, JSON or INSERT statements from the context menu.
Command bar
⌘K or ⌘P opens one bar for everything. Start typing and Taula fuzzy-matches across tables, columns, server objects, snippets, query history, databases, connections and actions. Actions depend on what is selected, so a table with staged edits offers Review, Commit and Discard.
- Jump. Pick a table to open it, a column to open its table, a database to open it in a new session, a connection to switch.
- SQL mode. Start with a SQL keyword and the bar becomes a mini editor with completions. ⏎ runs it and shows the rows inline.
- Ask mode. Start with
?and describe what you want in plain language. Taula writes the SQL and offers Use SQL or Open in Query Tab.
Assistant
⌘L or the Assistant pill opens a chat panel for the current connection. The assistant runs on your Mac: Taula starts a llama.cpp server with Qwen3-4B-Instruct-2507 by default and downloads the model the first time. Your schema and your data stay on the machine.
- Reads run by themselves. Listing tables, describing a table, sampling rows and running a query happen automatically, behind the same read-only gate the MCP server uses.
- Writes are proposals. Anything that would change data comes back as a card with the SQL and any guardrail warnings. Approve it to run it; approved writes land in the change journal.
- SQL in replies has Insert, Run and Copy buttons.
- Ghost text. In the query editor the model suggests the rest of the line as dimmed text. Tab accepts, Esc dismisses. It never touches your text on its own.
- Inline edit. ⌘I rewrites the selection, or the whole editor, from an instruction you type. You see a preview before Apply.
- Schema memory. The brain button in the chat header lists facts the assistant has learned about this database, such as units or naming quirks. Add or forget them there; they are included in every future conversation on that connection.
Safety
Guardrails
UPDATE or DELETE without a WHERE clause, TRUNCATE and DROP TABLE each ask for confirmation before running, in query tabs and in the command bar. On colored connections the dialog carries an extra warning. The scan understands strings, comments and dollar quotes, so a keyword inside a string does not trigger it.
Snapshots
Snapshot table creates a frozen copy with CREATE TABLE snapshot_… AS SELECT *. It is in the table's export menu, the command bar and the wrench menu. Take one before a risky change.
Schema diff
Schema Diff in the File menu compares tables, columns, indexes and foreign keys between two connections and shows a color-coded report of what exists only on each side. Comparing Postgres to SQLite works by normalizing the public schema prefix.
Data diff
Data Diff in the wrench menu compares two tables on one connection row by row, keyed on the primary key over the shared columns. Changed cells show old and new values; added and removed rows are colored. With a snapshot open, the snapshot and live table are preselected.
Backup and restore
Backup runs pg_dump in custom format for Postgres and .dump for SQLite. Restore runs pg_restore with --clean, or replays the SQLite dump. Taula looks for the tools in the usual Homebrew locations.
Structure, Relations, Activity
Structure
Columns with type, nullability, default and primary-key flag, plus indexes, foreign keys and triggers, and the table's DDL. Add, rename, retype or drop a column from here; the ALTER statement is previewed before it runs. For Postgres, changing a type uses ALTER … USING.
Objects
Functions, sequences, enums and extensions on Postgres. Attached databases and triggers on SQLite.
Relations
An entity-relationship view of the whole database: one box per table, one edge per foreign key. Click a table to highlight its relations, double-click to open it, and zoom with the controls in the corner.
Activity
On Postgres, a live view of pg_stat_activity with state, duration, wait events and blocking process ids. Cancel a query or terminate a backend from the row; termination asks for confirmation. Auto-refresh runs every three seconds when switched on. On SQLite the tab shows journal mode, file size and the main pragmas.
MCP server
Taula ships a second binary, taula-mcp, that speaks the Model Context Protocol over stdio. It reuses the connections you saved in the app and reads passwords from the same Keychain items, so an agent can work with your databases without ever seeing a credential.
Wire it into Claude Code:
$ claude mcp add taula -- taula-mcp
Any other MCP client can point at the binary directly.
Tools
| Tool | What it does |
|---|---|
list_connections | Saved connections by name and engine. |
list_tables | Tables and views for a connection. |
describe_table | Columns, primary key, indexes, foreign keys and DDL. |
sample_rows | A capped sample of rows. |
query | Run a read-only statement. |
explain | Plan for a read-only statement. |
execute | Run a write. Only present when writes are enabled. |
Read-only by default
Every statement passed to query or explain goes through a hard gate: the leading keyword must be a read keyword, and no write keyword may appear at any nesting depth. Data-modifying CTEs are rejected. Results are capped and carry a truncation flag.
To allow writes, start the server with the environment variable set. The execute tool then appears and still returns guardrail warnings in its responses.
$ TAULA_MCP_ALLOW_WRITES=1 taula-mcp
Settings
⌘, opens Settings.
- Rows per fetch. How many rows each page of the grid loads.
- Query history. How many runs to keep per connection.
- Grid font size. Applies to data and result grids.
- Native editors. Turn the date picker and boolean editors off if you prefer typing values.
- AI model. Haiku or Sonnet when an Anthropic key is present.
- Local AI. Server URL, model spec, llama-server binary path, auto-start, ghost text and a global on-off switch for all local AI features.
Settings are stored as JSON and read tolerantly, so an older file still loads after an update.
Shortcuts
| Keys | Action |
|---|---|
| ⌘K or ⌘P | Open the command bar |
| ⌘L | Toggle the assistant panel |
| ⇧⌘N | New connection |
| ⌘S | Commit staged changes |
| ⌘R | Reload the current table |
| ⌘F | Search the loaded page |
| ⏎ | Apply the WHERE filter; in a cell, stage and move down |
| Esc | Revert the cell being edited; dismiss ghost text |
| ↑ ↓ | Move cell focus by row |
| ⌘⏎ | Run the query |
| ⌘E | Run the selection only |
| ⌘T | New query tab |
| F5 | Force completions |
| Tab | Accept the ghost-text suggestion |
| ⌘I | Inline AI edit of the selection |
| ⌘, | Settings |
Files on disk
Taula keeps its state in plain files under Application Support/Taula in your home Library folder. Nothing is synced anywhere.
- Connections as JSON, without secrets. Passwords, tokens and the optional Anthropic key live in the macOS Keychain.
- Query history and saved snippets, per connection.
- Change journal entries with their undo SQL.
- Saved query-builder specs.
- Assistant transcripts and schema memory, per connection.
- Settings.
Delete the folder to reset the app. Remove the Keychain items named after Taula to forget the secrets too.