// the deep end

Features the pig is genuinely proud of

SQLly isn’t another grid with a query box bolted on. It understands your schema, your data, and the way you actually work - right down to the comments in your SQL. Here’s the good stuff - with an honest badge on every card saying exactly where it stands today.

// how to read the badges βœ“ functional works in the app today ◐ in progress partially built β—‹ planned designed, not built yet
// the workbench

The everyday stuff, done properly

Tabs, execution, formatting, history - the unglamorous core you touch a thousand times a day.

πŸ“‘
workspaceβœ“ functional

Tabs that come back

Every query lives in its own tab with its own server and database context. Close SQLly, reopen it, and your whole workspace - open tabs, query text, layout - is exactly where you left it.

crash-safe session restore
▢️
executionβœ“ functional

Run it all, run the selection, cancel anytime

Execute the whole document or just the highlighted statement, with proper cancellation that actually stops the server-side query. Multiple result sets land as separate grids, with a messages pane for errors, PRINT output, and timings.

πŸŽ›οΈ
command paletteβœ“ functional

Command palette

Every command one fuzzy search away - connections, actions, preferences, navigation - all reachable without touching the mouse.

⌨️
keybindingsβœ“ functional

Customizable keybindings

Rebind editor and app commands to match the muscle memory you already have, instead of learning someone else’s.

πŸ”
IntelliSenseβœ“ functional

Real autocomplete, two engines

Keywords, schemas, tables, columns, and functions complete as you type - pick the fast built-in parser or the fuller Rust engine in Preferences. Diagnostics underline problems before you run.

🧹
formatterβœ“ functional

A SQL formatter that can’t hurt your SQL

Configurable pretty-printing with a hard safety contract: the output is re-lexed and compared token-by-token against your input, and any mismatch returns your SQL untouched. Mark regions -- formatter:off / -- formatter:on to leave them verbatim.

never drops a comment or mangles a literal
πŸ•˜
history◐ in progress

Query history

Every execution is logged to a plain local file - your history is yours, greppable, and never leaves the machine. A searchable in-app history browser is on the way.

πŸ—œοΈ
execution plans◐ in progress

Query plans in human terms, by default

Hit Explain (or ⌘L) and SQLly captures the SHOWPLAN_XML, parses it in-process, and opens the Execution Plan pane right next to your results. Instead of a tree of operators, it leads with plain-language findings ranked by how much of the query’s cost they explain - the elements actually driving performance, each with its fix attached:

-- the plan pane, no EXPLAIN decoder ring required
● Add an index on dbo.Orders (CustomerId)  - optimizer estimates ~93% improvement
● Scans every row in dbo.Orders (48.2K rows) to find matches
● Estimated 10 rows but read 48.2K  - run UPDATE STATISTICS

Every finding says what’s wrong, why it matters, and what to do next - missing indexes come with a ready-to-adapt CREATE NONCLUSTERED INDEX skeleton, key columns and INCLUDEs filled in. Implicit conversions that quietly block seeks, joins missing their ON clause, tempdb spills, and (on actual plans) estimates that diverged wildly from reality get the same treatment. Below the findings, operators list most-expensive-first - “Nested Loops - 8,210 rows estimated, 75% of cost” - while node ids, cost figures, and output lists stay one expansion away.

Actual plans - captured by running the query, with real row counts - are the dependable path today. The no-execution estimated plan toggle is in the toolbar but currently has a capture bug on SQL Server that’s being fixed. Multi-statement batches get a per-statement switcher, clean plans say so explicitly, and the graphical node-and-edge canvas is the piece still being drawn.

SQL Server & Azure SQL
// intelligence

It actually knows your data

Most tools autocomplete your schema. SQLly autocompletes your data - and explains itself while it’s at it.

⌨️
value autocompleteβœ“ functional

Autocomplete for column values

IntelliSense doesn’t stop at schema matches. In a WHERE clause, hit Shift+Ctrl+Space and SQLly completes straight from your table’s actual data.

-- explicit gesture, live values
WHERE Name = 'Acme␣'  ⟢ Acme Corp, Acme Labs…

Behind the scenes it fetches the top 100 distinct values for the column, caches them, and quotes them correctly for the column’s type. Strictly opt-in, so normal typing never waits on the database.

fully configurable
🧠
on-device Β· private◐ in progress

On-device query summarization

SQLly gives you a plain-language preview of what a query does - before you run it. The summary bar, per-query preferences, and metadata persistence are in; the generation backends are being wired up.

Bring your own local model via Ollama or the MLX sidecar on Apple Silicon, or opt in to a cloud provider (OpenRouter, OpenAI, Claude) explicitly. No cloud, no API key, and no data leaving your laptop unless you say so.

private by design Β· cloud strictly opt-in
πŸͺ„
introspectionβ—‹ planned

Auto-magic string documentation

See a magic string or mystery code in your results? When SQLly can trace it through DDL introspection, it drops an inline comment explaining exactly where that value comes from.

SELECT status /* ← enum: orders.status_id β†’ status_codes.code */
πŸ”Ž
grep-aiβ—‹ planned

Native grep-ai functionality

Search across your data and schema the way you think, not the way SQL demands. SQLly bakes in grep-ai-style semantic search so finding the right table, column, or row is one fuzzy query away.

// multi-modal schema

Work against what it will be

Your database is just the foundation. Overlay local files, half-baked ideas, and Git history to query the future.

πŸ—‚οΈ
multi-modal schema sourceβœ“ functional

Multi-modal schema source

Start with your live database as the source of truth, then layer reality on top of it:

  • Real-time local file overlay - a killer feature if you do Git-based schema management.
  • SQLly compares the DB object’s last-modification time (where your engine supports it) against your local files.
  • Got a newer local file? It swaps that file in for the live table, view, sproc, function, or query.

The query still fails if you run it before the schema catches up - but you get to build against the future, today. A huge time-saver when you work on checked-in DDL.

🌫️
incomplete-model intellisenseβœ“ functional

Incomplete-model IntelliSense

Working from a rough sketch? SQLly reads “general vibes” DDL - not technically valid, but clearly headed somewhere - and overlays its best guess on top of your real schema.

That means IntelliSense for column names, keys, indexes, and data types even before the model is finished and valid - tracked internally as an incomplete region with its own provenance and confidence, never silently passed off as authoritative.

πŸ•°οΈ
git-awareβ—‹ planned

Git modification times & live DDL blame

The overlay isn’t limited to local filesystem timestamps - SQLly applies Git modification times too, so the right version wins.

And it gives you live DB DDL git blame with notes: hover any object and see who changed it, when, and why.

πŸ”‘
key ↔ nameβ—‹ planned

Swap key lookup for name lookup

Hunting for a value that lives behind a foreign key? Just type the name you’re after. SQLly adds the join on the fly and lets you check against the readable value directly - no manual JOIN gymnastics.

🏷️
fk display values◐ in progress

Smart foreign-key display values

SQLly uses DDL introspection to figure out the most likely human-friendly display value for each foreign key. In the row editor, foreign-key fields already offer searchable dropdowns of the real referenced values; showing those friendly names directly in the result grid is the piece in flight.

wildly configurable
// results, your way

Your comments drive the output

SQLly reads the comments in your SQL and shapes the results around them - pivots, layouts, formats, and forms. Tweak it in the UI and the comments update themselves.

πŸ”€
comment-basedβœ“ functional

Output pivot & result pivoting

Pivot your output with a comment. No wizard, no separate pivot tool - annotate the query and SQLly reshapes rows into columns right in the result grid.

--! pivot rows=region cols=quarter value=revenue
🧱
comment-basedβœ“ functional

Custom result layouts

Stop reading result sets stacked one after another. Define configurable rows and columns for your results, so multiple sets land in a layout that actually makes sense - -- sqlly 4x2 and you’re done.

πŸ“
DDL-drivenβœ“ functional

Dynamic data forms - the row editor

Right-click any result row and SQLly generates a per-column edit form from the table’s own metadata - data types, defaults, and constraints included - so you can view and edit your data without writing a line of UI.

  • Edit, insert, duplicate, and delete rows with guarded, parameterized writes.
  • Foreign-key fields get searchable dropdowns of the real referenced values.
  • CHECK constraints are validated before the save ever leaves the app.
  • Related rows one click away, opened in their own tab.

where we’re going, we don’t need applications πŸš—βš‘

πŸ”’
comment-based◐ in progress

Custom data types & formatting

Date formats, number formats, rounding - driven by comments so they reapply on every run. The parsing and per-column formatting are in; the UI that rewrites the comments for you is still being wired.

--: amount  money  round=2
--: created date   'yyyy-MM-dd'
πŸ“€
exportβœ“ functional

Export every which way

Copy or save any result set as CSV, TSV, JSON, Markdown, HTML, XML, SQL INSERT, temp-table SQL, or VALUES - or straight to a real .xlsx workbook that opens as a formatted Excel table with banded rows and an auto-filter header.

βš–οΈ
compareβœ“ functional

Diff two result sets

Compare any two result sets and see exactly which rows were added, removed, or left unchanged - with schema mismatches called out instead of silently compared wrong.

🧬
structured cellsβœ“ functional

JSON & XML cell viewer

Cells holding JSON or XML open in a structured viewer - pretty-printed and explorable - instead of a wall of text in a grid cell.

🧩
templatingβ—‹ planned

Simple templating language

Don’t hand-write the same transform across 30 columns. A small, readable templating language lets you express it once and let SQLly fan it out.

// guardrails

Make the dangerous thing require a deliberate step

Safety policy rides alongside your connection settings - set it per client, project, environment, server, or database, and it inherits down the tree until you deliberately override a branch.

πŸ”’
select-onlyβœ“ functional

Lock a connection to reads, period

Block everything but SELECT on a given connection. Perfect for a read replica, an analyst-facing environment, or a server you never want a stray script touching.

↩️
auto-wrap rollbackβœ“ functional

Wrap writes in a transaction automatically

Turn on auto-wrap and anything beyond a plain read runs inside an outer transaction scope you can review - and roll back - before it commits for real.

πŸ’¬
confirmationβœ“ functional

Force a confirmation before it runs

Require an explicit “yes, really” before executing non-SELECT statements against a connection - the extra half-second that catches the query you meant for staging.

🚧
mutation reviewβœ“ functional

Refuse an UPDATE or DELETE with no WHERE

SQLly scans every batch before it runs - masking strings and comments so keywords inside literals don’t false-positive - and flags UPDATE/DELETE statements with no WHERE clause. Per-connection policy can block them outright.

DELETE FROM orders  ⟢ ⚠ affects every row
🎨
environment cuesβœ“ functional

Color prod an angry red

Custom colors and icons per client, project, environment, or server - so the “wait, that was prod?” moment gets intercepted by your peripheral vision before it reaches your fingers.

πŸ€–
ai review◐ in progress

AI review for data-changing queries

Require a generated, plain-language review of a query’s side effects before it can run in a protected context. The detection, gating, and review dialog are in - including the big, explicit WE WILL MAKE UPDATE AND DELETE CHANGES. warning; the on-device model that writes the explanation is being wired up.

// identity guardrails

Prove it’s really you before prod runs

Wire your operating system’s native secure identity verification (Touch ID on macOS, Windows Hello on Windows) into the exact places a mistake actually hurts. The safety-policy engine underneath these gates already ships (see guardrails above); the identity layer itself is being wired up now.

πŸ”
connect gate◐ in progress

Verify your identity to connect

Require your OS-native identity check (Touch ID, Windows Hello, or your platform’s equivalent) before SQLly will even open a connection. Set it at any level of your hierarchy - lock down a single touchy server or an entire client’s prod environment in one switch.

# inherits down the tree, override anywhere
client:    Acme Corp   identity=connect
env:       prod        identity=connect
server:    db-01.prod  identity=inherit
per client Β· project Β· env Β· server Β· database
βœ‹
write gate◐ in progress

Identity check for anything but a SELECT

Reads stay frictionless. The moment a statement isn’t a plain SELECT - an INSERT, UPDATE, DELETE, DROP, TRUNCATE, DDL, anything with teeth - SQLly asks you to verify your identity first. The statement classification that decides what has teeth already works; the OS-native prompt is the in-flight piece.

SELECT * FROM orders        βœ“ runs
UPDATE orders SET …         ☝ identity check required
read-free, write-guarded
πŸͺ†
inheritance◐ in progress

Set it once, inherit it everywhere

Identity rules ride the same multi-dimensional hierarchy as everything else. Set a rule on a client and every project, environment, and server underneath picks it up - until you deliberately override a branch.

Lock all of prod with one switch; carve out a single read-replica as the exception. No copy-pasting policy across fifty connections.

⏱️
re-auth windowβ—‹ planned

Configurable re-auth window

Decide how long a verification is good for. Authenticate every statement on the scariest boxes, or once per session / N minutes on the friendlier ones. Your prod, your paranoia dial.

every-statement β†’ per-session
πŸ“œ
audit trailβ—‹ planned

Tamper-evident verification log

Every gated action records who verified, what statement, which target, and when - a local, tamper-evident audit trail you can point at when someone asks “who ran that against prod?”

stays on device unless you export it

πŸ›Ÿ
graceful fallbackβ—‹ planned

Watchdog & passcode fallback

No biometric hardware, or a sensor that won’t cooperate? SQLly falls back to your device passcode or OS account sign-in, so a gate is never a lockout, just a deliberate pause.

Pair it with statement classification: SQLly shows you exactly why a prompt fired before you approve it.

// organize everything

Servers, sorted the way your brain works

🧭
multi-dimensional groupingβœ“ functional

Server multi-dimensional grouping

A database is any combination of the things below - and at each level you can define your own customizations: security rules, icons, colors, and fuck-up protections that stop the “wait, that was prod?” moment.

  • Client
  • Project
  • Environment
  • Server

Color prod an angry red, lock it behind a confirmation, give each client their own icon - whatever keeps you safe and fast.

☁️
azure / entra◐ in progress

Real Entra ID auth & Azure discovery

Connect to Azure SQL with device-code or browser-based Entra authentication - no storing a service principal secret just to get IntelliSense working. SQLly can also discover your Azure SQL servers and databases, and helps you add a firewall rule when the server says no.

// speed & access

Fast where it counts, private by default

A purpose-built engine under the hood, your databases reachable from anywhere, and absolutely nothing phoning home unless you say so.

βš™οΈ
rust engineβœ“ functional

Dedicated Rust query & IntelliSense engine

IntelliSense and querying are driven by a dedicated, multithreaded, heavily-tested Rust engine - not a bolted-on afterthought.

  • No long schema updates stalling you mid-thought.
  • Advanced caching keeps everything instant.
  • On-the-fly intelligent cache invalidation - fresh when it needs to be, fast the rest of the time.
🌊
unbounded resultsβœ“ functional

Result sets that can’t eat your RAM

Rows stream over a back-pressured channel and spill to disk, so the grid pages from the on-disk store and peak memory stays flat - whether the query returned 50 rows or 50 million.

🌐
remote access◐ in progress

Reach your database from anywhere

Connect to your databases from wherever you are - no VPN scavenger hunt, no jump-box ritual. An end-to-end encrypted tunnel runs through a relay that can route your traffic but never read it - here’s exactly how it works.

part of SQLly Cloud · included with Lifetime · direct connections stay free

πŸ”’
private by designβœ“ functional

No check-ins, period

SQLly doesn’t phone home - there is no telemetry in the app today, full stop. If opt-in check-ins ever arrive, the privacy policy gets updated first, they ship off by default, and they’d only ever be used to help improve the product. Your data and your habits stay yours.

// everywhere

One codebase, everywhere you work

πŸ–₯️
cross-platformβœ“ functional

macOS, Windows & Linux from one tree

A GPU-rendered native UI on all three desktop platforms - not a webview in a trench coat. Same engine, same features, same pig.

macOS builds target Apple Silicon (M-series)
🌍
wasmβ—‡ in-tab demo

SQLLY browser preview (in-tab demo)

A labeled preview of the workbench compiles to WebAssembly and runs in your tab against a sample database. It is not a hosted Cloud app and cannot reach your servers, relay, or production SQL Server. Cloud AI, Azure sign-in, and local files stay native-only; download the desktop app for the real product.

demo only - not a Cloud SKU
// sync, your way

Your data lives in files. iCloud just carries them.

πŸ“„
file-basedβœ“ functional

Everything is a file

Connections, query history, snippets, entity cards, identity gate rules - every byte SQLly stores lands in plain files on disk. No opaque database, no lock-in. Back it up, diff it, drop it in a git repo if you want.

☁️
iCloud Driveβ—‹ planned

Everything comes with you

Switch it on and your whole SQLly world follows you to every Mac you own - credentials, configuration, and customization, all carried by Apple’s sync, not ours. Sit down at another Mac and it’s already set up exactly how you left it. We never see your data.

🎚️
Preferencesβ—‹ planned

On when you say so, off when you don’t

A single toggle in Preferences β†’ iCloud. Enable it to sync, disable it to keep everything strictly local. Off doesn’t mean half-on - flip it off and the files never leave the machine.

// Preferences β†’ iCloud
Sync via iCloud Drive   [ off ]
↳ stores everything locally only
// macOS craft

Built like a proper Mac app

πŸ“
macOS◐ in progress

Intuitive file navigation

A custom open & save dialog designed for how you actually browse files on macOS - the project file picker already searches files with prefixes like v:, p:, f:, and schema:. (We genuinely don’t know why more apps don’t do this.)

⌨️
keyboard-firstβœ“ functional

Flexible search & keyboard navigation

Move and find things at the speed of thought: a command palette, a keyboard tab switcher, and fuzzy matching baked into search and navigation throughout the app - with customizable keybindings on top.

🐷
non-negotiableβœ“ functional

An adorable pig mascot

Look, every other feature on this page is serious engineering. This one is just a genuinely adorable pig in glasses who is delighted you’re writing SQL. Worth it.

// convinced?

Bring your databases home to the pig

Free forever on every major platform. All of the above, none of the bloat.

⬇ Download SQLly - it’s free See supported databases