A fast, local-first SQL workbench built with Go + Wails.
No cloud. No accounts. No telemetry.
Just a focused, native desktop tool for working with databases.
Grab the latest build for Windows, macOS, or Linux from the Releases page - no installer, no account, just download and run.
Prefer to build it yourself? See Installation & Development below.
wails3 task buildOr during development:
wails3 devWork with SQLite, PostgreSQL, and MySQL / MariaDB in a single fast desktop app that runs entirely on your machine.
π§³ Portable
β‘ Fast startup
π Local-first
π§ Developer-focused
- Query faster with smart, schema-aware autocomplete
- Stream results - rows arrive as the driver yields them
- Run multi-statement scripts and get a result tab per output
- Explore schemas instantly
- Save and reuse queries
- Export anything in one click
XenSQL is a desktop SQL client built for developers who want speed, clarity, and control.
It combines:
- β‘ Go backend for performance
- π₯οΈ Wails for native desktop packaging (uses the OS webview)
- βοΈ React + TypeScript UI
- βοΈ Monaco Editor for a real IDE-like SQL experience
Most SQL tools today are:
- heavy Electron apps
- cloud-connected by default
- tied to subscriptions or accounts
- overloaded with features you donβt use
XenSQL focuses on one thing:
A fast, local environment for working with databases.
| Database | Read & write | Read-only mode | Secure transport | Notes |
|---|---|---|---|---|
| PostgreSQL | β | β | SSL - disable / require / verify-full |
via pgx |
| MySQL | β | β | TLS | |
| MariaDB | β | β | TLS | MySQL-compatible |
| SQLite | β | β | local file | file-picker workflow |
- Create, edit, test, and manage database connections
- Organize into folders with drag-and-drop reorder
- Per-connection tab colors
- Read-only mode with defense-in-depth - blocked at both the Wails layer and inside each driver
- PostgreSQL SSL (
disable/require/verify-full) and MySQL TLS - SQLite file picker workflow
- Tabbed workspace with drag-and-drop tabs and session restore
- Monaco-powered editing with custom dark/light themes
- Smart autocomplete - substring + prefix matching, context-aware (
SELECT/FROM/JOIN/WHERE/UPDATE/DELETE/INSERT),schema.table.columndot completion, quoted identifiers and aliases - Built-in snippets -
JOIN,SELECT * FROM, aggregate functions - Driver-correct identifier quoting (PostgreSQL, MySQL, SQLite)
- Run selection (
Ctrl+Enter) / run all (Ctrl+Shift+Enter) / stop long-running queries - Streaming results - rows render as the driver yields them
- Multi-statement scripts - run several
;-separated statements at once; they execute in order on one connection, so temp tables,SET, and scriptedBEGIN/COMMIThold - Multiple result outputs - a script or stored procedure that returns several result sets shows each in its own switchable result tab; a failing statement reports its error and stops the run
- Pinned transactions per tab - run
BEGIN/COMMIT/ROLLBACKas SQL or from the toolbar; queries run inside the open transaction until you commit or roll back UPDATE/DELETE/INSERTwithRETURNINGflow back to the Results Grid- Gutter icons to run individual statements
- Right-click menu with format SQL
- Remappable keyboard shortcuts
- Tree view: schemas β tables β columns
- Search tables and columns instantly
- Double-click a table β
SELECTin a new tab - Ctrl+double-click β browse table data in the grid (editable when primary keys exist)
- Refresh schema on demand
- Virtualized grid - smooth scroll over thousands of rows
- Result-set tabs - switch between outputs when a run returns multiple result sets
- Sortable columns with auto-sized widths and per-tab persistence
- Keyboard-first navigation (arrows, Shift+select, Enter for cell viewer)
- Column/row selection with Ctrl+click and Shift+click;
Ctrl+Ccopies as TSV - Cell editor for large values - JSON, XML, HTML, or plain text; beautify/minify; editable in table view
- JSON / JSONB auto-parsed in cell and side viewer
- Side JSON row viewer with filter / regex search, synced to focused row
View and modify table data directly in the grid - no hand-written UPDATE / DELETE (writable connections):
- Browse any table's rows (
Ctrl+double-clicka table in the Schema Explorer) - Inline edit cells in place - changes are staged, then applied on demand
- Insert new rows and bulk-delete selected ones
- Safe by design: edits require a primary key, and read-only connections are blocked at both the Wails layer and inside the driver
INSERT/UPDATE/DELETE β¦ RETURNINGresults flow straight back into the grid
- Saved queries - name, filter, sort, link tabs with dirty-state tracking
- Save, update, rename, and delete from the sidebar or toolbar
- Per-connection query history with success/error and duration
- Clear history per connection or delete individual entries
- CSV / JSON / Markdown / SQL INSERT
- Export all or selected rows and columns
- Copy to clipboard or save to file
- Remembers your last export format
- Dark & light themes
- English, Deutsch, and ΠΡΠ»Π³Π°ΡΡΠΊΠΈ
- Quick Search palette (
Ctrl+P) - jump to connections, saved queries, history, tabs - Custom shortcuts editor + keyboard tips
- Frameless native title bar
Every shortcut is remappable in the in-app shortcuts editor.
| Action | Shortcut |
|---|---|
| Quick Search palette | Ctrl/β + P |
| Run selection | Ctrl/β + Enter |
| Run all statements | Ctrl/β + Shift + Enter |
| Save query | Ctrl/β + S |
| Rename saved query | F2 |
| New / close tab | Ctrl/β + T / Ctrl/β + W |
| Next / previous tab | Ctrl/β + Tab / Ctrl/β + Shift + Tab |
| Toggle sidebar / JSON panel | Ctrl/β + B / Ctrl/β + J |
| Zoom in / out / reset | Ctrl/β + = / Ctrl/β + - / Ctrl/β + 0 |
| Editor font size + / β | Ctrl/β + Shift + . / Ctrl/β + Shift + , |
| Fullscreen | F11 |
Everything lives in a single XenSQL-data/ folder:
XenSQL(.exe)
XenSQL-data/
connections.json
editor_session.json
query_history.json
saved_queries.json
settings.json
settings.json keeps your UI preferences - theme, language, layout, and keyboard shortcuts.
When the app sits somewhere writable, that folder is created right next to the executable (beside the .app bundle on macOS) - move it to a USB stick, network drive, or another PC and it just works.
If the app lives in a read-only location (e.g. /Applications or a system path), it falls back to the OS per-user data directory instead:
- macOS β
~/Library/Application Support/XenSQL-data - Linux β
~/.config/XenSQL-data - Windows β
%AppData%\XenSQL-data
Override the location with XENSQL_DATA_DIR. During wails3 dev it's ./XenSQL-data in the project root.
XenSQL uses Wails v3, which embeds a web UI into a native desktop app.
- Go runs backend logic
- UI runs in the OS-native webview:
- Windows β WebView2
- macOS β WebKit
- Linux β WebKitGTK
- No bundled Chromium like Electron
- Go 1.26+
- Wails v3 CLI (
wails3) - Node.js 24.16+
go install github.com/wailsapp/wails/v3/cmd/wails3@latest
# wails3 dev installs frontend deps, generates bindings, and launches the app
wails3 devwails3 task build # or: wails3 task package (platform bundle/installer)Output:
bin/XenSQL(.exe) # bin/XenSQL.app on macOS
βββ main.go # Wails entry point (embeds frontend/dist)
βββ docker-compose.yml # PostgreSQL / MySQL / MariaDB for the E2E suite
βββ Taskfile.yml # dev tasks: build / test / e2e (run via `task` or `wails3 task`)
βββ internal/
β βββ app/ # Wails App API bindings + tests (connections, query, history, β¦)
β βββ database/ # Driver interface + SQLite / PostgreSQL / MySQL
β βββ storage/ # JSON persistence (incl. settings.json)
β βββ paths/ # Portable data directory
β βββ service/ # SQL format, export helpers
βββ frontend/ # React + TypeScript + Monaco (Vitest tests)
βββ test/ # TESTING.md - how to run all suites
| Layer | Technology |
|---|---|
| Backend | Go |
| Desktop | Wails v3 |
| UI | React + TypeScript |
| Editor | Monaco Editor |
| PostgreSQL | pgx |
| MySQL | go-sql-driver/mysql |
| SQLite | modernc.org/sqlite |
| Tables | TanStack Virtual |
| State | Zustand |
| Icons | Lucide |
| i18n | i18next |
See LICENSE.








