Context-aware autocomplete
“The editor knows if you are in the FROM, the WHERE, or the column list.”
Write less, and make fewer mistakes, because the suggestion understands where you are inside the statement.
Suggests columns of the active table, database names, schema tokens (tables, views, functions), DML/DDL/control keywords, data types and engine-filtered SQL helper phrases.
Live lexical linter
“Unbalanced parentheses never make it to the server.”
Catches the obvious mistake before the server rejects it.
Detects unclosed comments, unclosed strings, unbalanced parentheses and open backtick identifiers. O(n) scan, no full parser.
Formatter, and a safe mode
“A DROP does not go out by accident.”
Readable formatting for your queries, and a lock that keeps an UPDATE or a DROP from reaching the server before you mean it.
The formatter capitalises keywords from the engine's own vocabulary. Safe mode, on by default and saved per profile and per editor tab, refuses to run any statement that contains ALTER, CREATE, DELETE, DROP, GRANT, TRUNCATE, UPDATE, REPLACE or RENAME — from the editor, the Terminal and the SQL Player alike. It looks for the word, not for the WHERE: an UPDATE with one is stopped too, and nothing is sent until you turn it off.
Credential redaction in logs and sync
“Sync your history, not your credentials.”
Your query log does not become a password file on iCloud.
Neutralises IDENTIFIED BY, IDENTIFIED WITH … AS, IDENTIFIED BY PASSWORD, SET PASSWORD FOR and PASSWORD(…). Idempotent redaction, applied before exporting the query log to CloudKit.
Visual query builders
“Compose queries with clicks; they come out production-ready.”
A correct SELECT … WHERE … JOIN … without memorising syntax.
Dedicated visual builders for the four most frequent shapes: SELECT, WHERE, UPDATE, and table CREATE.
Rename symbol with word boundaries
“Rename id without breaking client_id.”
Refactor identifiers safely, without wrecking similar names.
Regex with \b word boundaries and proper regex escaping. Never matches inside larger identifiers.
Quick Open palette (⌘⇧O)
“⌘⇧O and you are on the table you were looking for.”
Reach any schema object without walking down the tree.
Incremental fuzzy search across tables, views, routines and objects, with arrow-key navigation and Enter to open.
Snippets manager with per-engine seeding
“Your snippets adapt to the engine, not the other way around.”
Your SQL recipes are always at hand, filtered to the engine you are using.
Stored in snippets.json, which travels over iCloud with the general sync switch and stays on the device when it is off. Each snippet declares which engines it applies to (MySQL, MariaDB, PostgreSQL…). Connecting to a new engine seeds defaults without duplicates. Supports categorisation.
DDL and function documentation popovers
“The docs for GROUP_CONCAT open where you're typing.”
Documentation without leaving the editor or opening a browser.
Shows the DDL of the schema object under the cursor, or the entry for the function: signature, description, parameters, an example and the version it arrived in. Each engine has its own entries, SQLite and DuckDB included, and so do MongoDB operators in the Query tool. Without the mouse, ⌥⌘?.
Advanced cell editor and inline row editing
“Edit the cell, see the SQL, and decide.”
Change data quickly and preview the exact SQL that will be executed.
Spreadsheet-like editing on result sets, with a preview of the generated UPDATE or DELETE before it runs.
SQL Player — a script, step by step
“Play, pause and step through your script like a video.”
Run a migration one statement at a time and check each result before the next one goes out.
Splits the editor's script into statements and runs them one by one, by hand or on a timer, with first, previous, next and last controls; automatic playback stops at the first error. Each statement shows its status, its time and the rows it returned or changed, and lands in the query history. Safe mode applies.
SQL Terminal docked in the editor
“The mysql> prompt, without leaving the app.”
Type a statement, press Return, read the answer as text — the way the command-line client does it, next to your script.
A panel under the editor with the engine's own prompt (mysql>, postgres=#…), results as an ASCII table, “Query OK” with the rows the server says it changed, and the server's warnings underneath. Its own history with the arrow keys on the Mac and buttons on iPad, iPhone and Apple Vision Pro; every statement also goes to the session history. Safe mode applies.
Result charts
“From a result set to a chart, without exporting anything.”
Bars, lines or a pie from the rows you just got, in a panel of the editor.
The axes are picked for you — the first text column for the categories, the first numeric one for the values — and you can change them. The chart exports to PNG or PDF.
One query, two databases
“Is staging the same as production? Ask both at once.”
Run the same query against two connections and see, row by row, what differs.
Run on two databases… sends the statement to both and replaces the grid with a comparison: changed cells marked, rows present on only one side, and a filter to show only the differences. Rows are matched by position, and only when both sides return the same columns.
iPad hint bars above the keyboard
“iPad keyboard with SQL superpowers.”
Fast touch suggestions right above the on-screen keyboard.
Contextual bars for the object or function under the cursor, with quick access to “View DDL” and function parameters.
Customisable toolbar
“Your toolbar, in your order.”
Each person has their own ergonomics; DBAs reorder once and forget.
Reorder or hide button groups from a dedicated customiser sheet. Layout is persisted.
Global search and replace, across a database
“One search across every text column you have.”
Search a string in every text column of every table at once, see the matches per table and column, preview the result computed by the server, and replace in bulk inside a transaction per table.
It shows two counts, not one: collation usually ignores case and REPLACE() never does, so without that warning a bulk edit announces 300 rows and changes 100 without anything failing. The mismatch is measured with CAST(col AS BINARY) rather than a named collation. Generated, primary-key and unique columns are excluded by default — MariaDB accepts an UPDATE on a generated column, reports one affected row and changes nothing. Escaping uses |, because a backslash breaks under NO_BACKSLASH_ESCAPES.
Spatial data on a real map
“Your GEOMETRY columns stop being 25 bytes.”
Points, lines and polygons drawn on a map docked in the editor, with satellite and flat styles, clustering and a fit-to-data control. Drag a pin or a vertex and Calíope composes the statement — it shows it to you before writing anything.
The WKB on the wire is always (longitude, latitude); what changes is the text, because MySQL 8 under a geographic SRID prints latitude first and MariaDB never does. The swap lives only at the textual boundary, where the parameter has no default value: getting it wrong does not raise an error, it moves the row to another continent and the server accepts it. The SRID travels with the geometry, editing is blocked without a reliable primary key and it says why, and there is no CoreLocation anywhere.