Roadmap

Here's what's next — and what's already done.

Chwilio already covers most day-to-day SQLite work. I keep this roadmap public so you always know what's real today and what's still coming.

Shipped

Live in the beta today.
Phase 0

Extension Foundation

Generic, user-controlled, diagnosable loading of trusted SQLite .dylib extensions.

- Generic extension config with original-path loading - Entry-point auto-detection (no hardcoded names), manual override - One-time trust warning; helper-process preflight before every real load - Duplicate-load handling, missing-file disable, rebuilt-same-path restart detection - Architecture / quarantine / dependency diagnostics - Per-database scope; load order; menu-driven management - Dedicated Extension Manager window with searchable list + detail inspector --- Status as of site build: largely implemented. Extension loading is the most battle-tested area of the app.
Phase 1

Data Grid Reliability & Depth

A custom AppKit grid tuned for large result sets, with SQL-backed sorting, paging, a multi-row filter builder, and column freeze/pin.

- Safe identifier quoting and stable row identity - SQL-backed sorting (spans the whole table) and configurable paging - Multi-row quick-filter builder: per-row enable, column or Raw SQL rows, AND/OR grouping, live WHERE preview - Saved filter presets per database - Row inspector and per-cell value viewer (text / pretty JSON / hex / image) - BLOB file export and import; foreign-key navigation - Whole-table / all-columns search; selection stats (count/sum/avg/min/max) - Column show/hide, reorder, persisted widths, and **freeze/pin** in a synchronized two-pane layer-backed grid - Browse views, virtual tables, and attached schemas as first-class sidebar objects - Lazy metadata loading; background row counting — 20–30 GB databases open instantly
Phase 2

Change-Set Editing

Edits never mutate SQLite immediately — every change is a reviewable item in a pending change set.

- Pending edit model: inline edits, staged insert/delete, duplicate - SQL preview per change, single-change and bulk revert - Unified undo/redo across cells, rows, duplicates, paste, and delete - Transactional batch commit with Safe Mode confirmation - Set EMPTY / NULL / DEFAULT quick actions - Paste clipboard rows as new inserts (JSON / CSV / TSV / INSERT / HTML) - Edit query results back to the source table when columns map to one base table --- Conflict detection is still being hardened. Multi-cell fill-down and paste-into-selection, and a bulk `SET col = val WHERE …` routed through the change set, are still pending.
Phase 3

SQL Editor

A multi-tab query editor with smart run, async execution + cancellation, multi-statement results, EXPLAIN, bind parameters, and edit-back.

- Multiple SQL tabs per database with syntax highlighting - Autocomplete for keywords, tables, columns, built-in functions, and pragmas - Smart run — ⌘↩ runs selection or current statement; ⇧⌘↩ runs all - Asynchronous execution off the main thread with a live timer and Stop (sqlite3_interrupt) - Multi-statement results in a result sub-tab bar - EXPLAIN QUERY PLAN tree + raw EXPLAIN bytecode - Bind-parameter prompts for :name / @name / $name / ? / ?NNN with NULL toggle - Explicit transaction controls (BEGIN / COMMIT / ROLLBACK) with in-transaction pill - Format/beautify SQL, comment toggle, native find/replace, snippets - Query history and saved queries in folders with drag-and-drop - Auto-refresh sidebar and data after every execution (total_changes / schema_version / data_version) --- Read concurrency via a reader/writer connection pool is the only deferred item — see Planned.
Phase 4

Import & Export

A unified export engine across nine formats and a guided import pipeline reachable from every tabular surface.

- Export to CSV, TSV, JSON, Markdown, HTML, XML, INSERT, SQL dump, Excel (.xlsx) - Adaptive export options: header toggle, NULL token, JSON pretty, delimited BOM/CRLF, SQL-dump scope (schema/data/both) - Large table exports stream to disk off the main thread with a Cancel - Guided import of CSV/TSV/JSON with preview, auto-detected delimiter/header, encoding picker - Target existing table or create-new with inferred types; per-column type override - NULL handling (token or empty→NULL) and conflict policy (Insert / Ignore / Replace) - Hybrid-by-size commit: small imports stage as pending changes, large ones commit directly - Multi-format copy (plain / JSON / HTML / Markdown / CSV / INSERT) sharing one cell renderer with file export - Paste rows as JSON / CSV / TSV / INSERT / HTML --- Excel / XML / JSONL **import**, upsert beyond OR IGNORE/REPLACE, and per-column date/number reformatting are deferred (out of scope for v1).
Phase 5

Schema Editing

Create, rename, drop, and edit tables, views, indexes, and triggers — through native ALTERs or the official table-rebuild workflow.

- Per-object DDL viewer with Copy - Create / rename / drop table (GUI); staged-edit clearing and renamed-object re-selection - Full column editing: type, default, nullable, PK, unique, check, collate, generated, reorder - Native ALTERs when sufficient; the official table-rebuild otherwise (off-main, row-count-verified, FK-checked) - Rebuild preserves rowids, AUTOINCREMENT high-water mark, user indexes and triggers - Column renames propagate into dependent indexes, triggers, views, and foreign keys - Index create/edit/drop (unique, partial, expression) and trigger create/edit/drop - View create/edit/drop with explicit column list preserved across edit and rename - Composite PK / UNIQUE / CHECK / FK editing as table-level clauses - Virtual-table visibility via "Show System Objects"; schema-edit gated off system objects - Read-only schema diff between two open databases - Read-only ER / schema diagram window
Phase 6

Database Administration

Create / in-memory / read-only databases, ATTACH, WAL control, maintenance, backup, and a database info panel.

- Create new empty database, ephemeral in-memory database, or open read-only - Save / Save As situation-aware; in-memory promoted to file in place (same window) - Read-only mode with visual lock; blocks edits, commits, and mutating SQL - ATTACH / DETACH databases as sidebar roots (multi-schema) - Database Settings: journal mode (incl. WAL) with checkpoint, foreign-key enforcement, busy timeout - Maintenance: VACUUM, VACUUM INTO, ANALYZE, integrity_check, quick_check - Online backup / clone via the SQLite backup API - Open a read-only SQLite database from a URL over HTTP (bundled web VFS) - Database Info panel: file/logical size, page size/count, free pages, encoding, versions, compile options --- A full generic PRAGMA browser (read + safe write of common pragmas) remains an open question. SQLCipher-based (AES-256) encryption has since shipped as the ChwilioCipher edition.

In progress

Actively being built for the next beta.
Phase 7

Polish & Release

Extension Manager, resizable panes, and the launch readiness pass. Preferences, status bar, command palette, and signing remain.

- Dedicated Extension Manager window — done - Resizable split panes (sidebar, row inspector, Structure columns/indexes) — done - Preferences window — pending - Status bar (row count, exec time, connection/encoding) — pending - Command palette — pending - Keyboard-shortcut pass — pending - Accessibility pass — pending - Error-messaging pass — pending - App icon and visual polish — pending - Window / tab state restoration across launches — pending - Developer ID signing and notarization — pending - Auto-update (Sparkle) and crash reporting — pending - Localization — pending

Planned

On the roadmap, not started or deferred.
Beyond v1

GPU-drawn grid & read concurrency

The headline items deferred from earlier phases — a GPU-drawn grid canvas and a reader/writer connection pool.

- Custom GPU-drawn grid canvas for native-grade scroll smoothness (would replace view-based NSTableView cells and make frozen columns trivial). A pragmatic smoothness pass already landed with column freeze/pin. - Read concurrency in the SQL editor via a reader/writer connection pool (GRDB DatabasePool, WAL-only) so a long query doesn't block other operations. - Safe interruption beyond the SQL editor (e.g. data-grid fetches). - Broader encryption options (e.g. SEE) — SQLCipher-based (AES-256) encryption already ships as the ChwilioCipher edition.