Pre-1.0 · built in the open

SQL, at native speed.

Sen is a desktop SQL client for PostgreSQL, MySQL, SQLite and SQL Server — written in Rust on GPUI. One binary. No Electron. No web stack.

  • 4dialects
  • 1binary
  • 0Electron processes
  • 100%Rust
PostgreSQL logo

PostgreSQL

Server-side cancel, statement timeout, transactional tabs

MySQL logo

MySQL

One driver per dialect behind a single DbDriver trait

SQLite logo

SQLite

A connection is a file — the form asks for nothing else

SQL Server logo

SQL Server

T-SQL that colours right, semicolon or not

The workspace

One window. The whole lifecycle.

Explorer, tabbed editor and results grid — pick a dialect below and watch a real query run. The tabs actually switch; the grid actually fills.

Sen

Rendering the app itself is Rust on the GPU — this page is just an honest impression of it.

Features

Small decisions that compound.

Every one of these exists because a real workflow asked for it. Hover a card — it leans in.

A tab owns one server session

The first statement a tab runs opens its own connection; every later statement reuses it. BEGIN…COMMIT, temp tables, SET search_path and prepared statements behave like they do in psql — and statements in different tabs never share a backend.

Stop cancels on the server

The Stop button issues pg_cancel_backend against the tab's own backend, so a runaway query or pg_sleep halts mid-flight. A cancelled statement is reported as “Query cancelled” — not an error — and the session stays usable.

Catalogue-aware completion

Ctrl Space completes keywords plus the tables, columns and functions your explorer already discovered — each item a precise edit over the engine's own span.

No blind DDL

Cell edits stage into one batch; the exact statements are confirmed before they run, and the grid shows the staged state until they do.

Editable results grid

Double-click a cell on a keyed single-table SELECT; Enter commits a primary-key-keyed UPDATE and patches the cell in place. Empty input writes SQL NULL.

Keys never touch disk

Passwords live only in the OS credential store — Windows Credential Manager, macOS Keychain, Linux keyutils. Everything else is atomic tmp + rename.

History & drafts survive anything

Every statement is recorded with outcome and duration; unsaved buffers autosave, so a crash takes nothing with it. Click a history row to re-insert the SQL.

Ctrl+K everything

The command palette ranks commands, saved connections, loaded tables and views — and every bundled theme. .

The editor

An SQL engine lives in the editor.

Not a textarea with regex paint: the tokenizer, splitter, analyzer, formatter, safety and lint engine run in-process, on a debounce that wraps the whole pass.

  • Dialect-aware highlighting — the engine's own token layer paints the buffer; a semicolon-free T-SQL script colours the same as a ;-separated one.
  • Lint squiggles from the in-process rule engine — no subprocess, capped to an interactive byte budget so typing never waits.
  • Format with Ctrl Shift F — the dialect-aware formatter, one undoable edit. Selection only, when there is one.
  • Multi-statement scripts run statement by statement and stop at the first failure; earlier row-returning results stay stacked on screen.
  • Auto-commit toggle — off, a tab runs inside one transaction with an “in transaction” pill; closing the tab rolls it back.

Appearance

The theme is the mode.

There is no dark-mode toggle in Sen — picking a theme switches the palette and the mode together. These swatches are real bundled themes. Click one: this whole page recolours, 3D scenes included.

Performance

Correct is not done.

Sen holds a smooth frame rate or it is broken. Anything that scales stays out of render(); blocking reads go to the background executor; everything that can grow is virtualized.

  • In-process enginetokenizer · splitter · analyzer · formatter · linter — no subprocess, interactive passes byte-capped
  • Virtualized everythinggrids via a virtual table, the tree on borrowed ids — one element per visible row, never per item
  • Display strings cached onceresult cells precompute their text off-thread; the common paint path is a refcount bump
  • Never a blocked framekeyring, file writes, dialogs — all background spawns; a slow credential store can't stall a frame

Security & your data

Secrets in the keyring. Everything else in the open.

The SSL checkbox is honoured, not decorative: ticked means ssl_mode=require, and a server that refuses TLS fails the connect instead of silently continuing in plaintext.

  • Passwords only in the OS credential store — service sen, one entry per connection. Never on disk in plaintext.
  • Atomic persistence — tmp file + rename, and startup never blocks on a failed write.
  • Errors you can act on — the SQLSTATE as a pill, the server's message, its HINT: and DETAIL: lines intact.
connections.jsonconnection fields · no secrets
settings.jsontheme · fonts · timeout
history.jsonlevery statement + duration
drafts.jsonautosaved editor buffers
OS credential storepasswords · service “sen”

Download

Install Sen. Skip the toolchain.

A real installer — no Rust, no build steps, no runtime to fetch. First launch opens the connection manager; your passwords go to the OS keyring from day one.

Windows

x64 · NSIS installer · 12.6 MB

v0.1.0
Download installer
SHA-256 e8869411e5cd92427303624234be615855ba052bd232394c75408b2bedccef1c

Unsigned build — SmartScreen may ask for “More info → Run anyway”. Uninstalling preserves your data: connections, history and drafts stay in %APPDATA%\sen, passwords stay in the OS keyring.

macOS

planned

A .dmg ships once there is a Developer certificate to sign it with.

Linux

planned

.deb and AppImage packages follow the same packaging pipeline.

Optional environment, after install

SEN_CONNECT_URLpostgres://user:password@host/db — auto-connect at startup
SEN_CONFIG_DIRoverride the config directory