Releases: Rohithgilla12/data-peek
0.28.0 — AI chat, live and grounded
v0.28.0 — AI chat, live and grounded
The AI assistant got a big upgrade. It now streams, grounds every answer against your real database, remembers the conversation, and can build things — all on the Claude Code CLI you already have (no API key to store).
✨ Streaming, grounded chat
- Live streaming — replies appear token-by-token instead of after a spinner, and each grounding step shows as it happens ("Running query…", "Reading schema…").
- Native structured output — generated SQL/charts/metrics come back through the CLI's
--json-schema, model-validated, so responses stop coming back malformed. - Session memory — follow-ups ("now just the top 3 of those") resume the same conversation via
--resume, so context carries turn to turn.
🧩 More in chat
- Follow-up chips — the assistant suggests 2–3 next questions; click one to ask it.
@mentions — type@in the composer to autocomplete real tables and columns, pinning the model to exact names.- Pin from chat — save a generated query, add it to a dashboard as a widget, or drop it into a notebook cell — straight from the answer.
- Mini-reports — ask for a "business overview" and get an inline mini-dashboard: KPIs, charts, and a table from a single prompt.
🔒 Same safety model
Reads auto-run only after a single read-only statement check; writes always ask via the approval dialog. Grounding runs through the built-in MCP server (read-only, rolled back). The "Grounded against your database" badge only shows when the assistant actually verified against your data.
Free for personal use · MIT source · macOS / Windows / Linux · https://datapeek.dev
0.27.2 — one-click keyless + AI self-heal
Patch release.
- One-click keyless providers — choosing Claude Code (local CLI) or Ollama in AI Settings now makes it active in a single click; the save button reads "Use " / "✓ Using " instead of asking for a key.
- Self-healing AI config — a corrupt or stale provider config (e.g. a deleted/renamed active provider, or a missing providers map) no longer crashes the AI panel ("Cannot read properties of undefined"). The config is sanitised on load/save and coerced back to a usable provider, so the assistant always recovers.
Free for personal use · MIT source · macOS / Windows / Linux · https://datapeek.dev
0.27.0 — AI, grounded
data-peek v0.27 brings AI into every corner of the app — the chat, dashboards, and notebooks — and lets it run on your own Claude, no API key required. Every answer is grounded in your real data, not guessed.
🧠 Bring your own harness
Point the AI assistant at the claude CLI you already have installed, and data-peek drives it on your own Claude Code login — nothing to paste, no key stored.
- Pick Claude Code (local CLI) in AI settings — a badge confirms it's detected.
- With the MCP server enabled, the assistant runs grounded: it queries your real database (read-only, always rolled back) to verify its answer before replying. Grounded answers carry a "Grounded against your database" badge.
- The API-key providers (OpenAI, Anthropic, and others) and local Ollama still work exactly as before.
✨ AI across the app
The same grounded assistant now shows up wherever you work:
- Chat — ask in plain English; read-only queries run automatically and show results inline, and asking for a chart renders one.
- Dashboards → Ask AI — describe a single widget and it's written, grounded, and pinned.
- Dashboards → Generate — describe a whole dashboard ("a business overview: revenue by plan, signups over time…") and it designs the board for you: KPI tiles, charts, and a table, with a verified query behind each widget.
- Notebooks → AI cell — a prompt becomes a ready-to-run SQL cell, with a short note above it.
Generated SQL is checked to be a single read-only statement before anything auto-runs — writes always wait for you.
✏️ Edit tables in the designer
Table Designer's Edit Table now issues real ALTER TABLE statements — add, drop, rename, retype, and re-default columns — diffed from the loaded table by stable column identity, so a rename is detected rather than guessed. Changes it can't safely express in place are refused with a pointer to SQL, instead of silently doing the wrong thing.
🔒 Hardening & correctness
- Audit log — fixed a case where a backward clock change during pruning could corrupt the hash chain; manual transactions now record
BEGIN/COMMIT/ROLLBACK, so a rolled-back write is visible in the trail; MCPexplain_queryis now recorded too. - MCP reads are bounded by a statement timeout, and the
run_queryfailure andalter-tableresult contracts were corrected. - PostgreSQL — the connection pool can no longer get stuck in a "shutting down" state after an aborted quit.
📦 Install
macOS / Linux — curl -fsSL https://install.cat/Rohithgilla12/data-peek | sh
Or grab a binary below: .dmg (Apple Silicon), .exe (Windows), .AppImage / .deb (Linux).
Personal use is free. A Pro licence covers commercial use inside a for-profit team of two or more — see datapeek.dev.
Full Changelog: v0.26.0...v0.27.0
0.26.0 — The Agent Release
data-peek v0.26 is the agent release. Your database is now something an AI agent can query — safely, on your terms, with a tamper-evident record of everything it touches. Plus manual transactions for PostgreSQL, a triggers view, and continuity commitments written down where they count.
🤖 Embedded MCP server
data-peek can now expose your connections to AI agents over the Model Context Protocol — Claude Code, Claude Desktop, or any MCP client.
- Off by default. Flip it on in Settings → MCP server. Streamable HTTP on
127.0.0.1:4722(configurable), secured with a bearer token. - Read-only tools run free —
list_connections,list_schemas,run_query,explain_query. Reads execute inside a rolled-back transaction with a 500-row cap; on PostgreSQL they additionally run underSET TRANSACTION READ ONLY. - Writes wait for you.
execute_statementpops an in-app Approve / Reject dialog showing the exact SQL. Nothing runs until you say so; a 60-second timeout auto-rejects. - One-command setup — copy the ready-made
claude mcp addsnippet straight from Settings.
Credentials are never exposed through any tool.
📜 Tamper-evident audit log
A local, hash-chained record of every SQL statement data-peek executes — editor queries, inline edits, table-designer DDL, scheduled queries, and agent statements, each tagged with its source.
- Off by default, in Settings → Audit log. Stored in a local file; nothing is ever uploaded.
- Hash-chained — each entry carries a SHA-256 of the previous one, so any edit or deletion inside the history is detectable. Verify integrity walks the chain and reports the first broken entry.
- Export to CSV or JSON, with retention pruning that preserves the chain.
- Not recorded: EXPLAIN, schema reads, and writes you reject in the approval dialog. SQL text can contain data values — it's a local file you can prune or delete at any time.
🔁 Manual transactions for PostgreSQL
Turn off auto-commit, then commit or roll back explicitly. Open transactions auto-roll-back on tab close or disconnect, so you can never accidentally leave one hanging.
⚡ Database triggers
View trigger definitions from the schema sidebar, and alter, enable/disable, or drop them inline.
🤝 Continuity & trust
Adoption shouldn't be a leap of faith. New this release, written down and versioned in the repo:
- Kill-switch-free guarantee — if the licence server ever disappears, your activated version keeps working forever, offline.
- Dormancy pledge — 12 months of maintainer inactivity waives the commercial-licence requirement for all released versions.
- Plus a
SECURITY.md, an expandedCONTRIBUTING.md, and a project-continuity page in the docs. MIT source means you can always build from source.
🛠️ Under the hood
- End-to-end test coverage for the MCP server, and CI now runs the Electron-ABI storage suites (audit, notebooks, time machine).
- Parallelised e2e runs and trimmed redundant CI work.
- Refactored the query editor into six focused hooks and cleared react-doctor findings.
📦 Install
macOS / Linux — curl -fsSL https://install.cat/Rohithgilla12/data-peek | sh
Or grab a binary below: .dmg (Apple Silicon), .exe (Windows), .AppImage / .deb (Linux).
Personal use is free. A Pro licence covers commercial use inside a for-profit team of two or more — see datapeek.dev.
Full Changelog: v0.25.0...v0.26.0
v0.25.0 — Time Machine
data-peek v0.25.0 — Time Machine
Every query gets a memory. You run the same SELECT all day — checking a
migration, watching a job table, verifying a fix — and until now every run
overwrote the last. v0.25.0 keeps the history: scrub back through past runs,
view any old result read-only, and diff any two runs cell by cell.
✨ New
- Time Machine. Every successful
SELECTin a query tab is snapshotted
locally — automatically, no setup. Press⌘⇧Hand a timeline strip appears
above the grid: one chip per run with a row-count sparkline. Click a chip to
see that result exactly as it was, banner and all; click Live to come
back. - Diff any two runs. Select a run, ⌥-click another, and data-peek diffs
them with the same cell-level engine that powers Watch Mode: changed cells
highlight amber with the old value preserved, added rows band green, and the
banner counts what moved (+6 added · −2 removed · 14 cells changed). Rows
are keyed by primary key when possible, and the banner says which strategy
was used. - Privacy-aware by construction. Masked columns (email, password, token,
ssn by default) are stored as[MASKED]— redacted before rows ever leave
the renderer. Storage is capped: 2,000 rows per snapshot, 50 runs per query,
512 MB global budget with oldest-first eviction and self-vacuuming. Settings
→ Time Machine shows exactly what's on disk, with a global toggle and a
one-click wipe.
Watch Mode shows you now; Time Machine shows you then. Run a query before
a migration, run it after, diff the two — a before/after audit that used to
need a scratch file and discipline.
🧱 Under the hood
- Snapshots live in a dedicated SQLite database (WAL, incremental vacuum,
checkpointed on quit), columnar-encoded, grouped by a normalized SQL
fingerprint soWHERE id = 1andWHERE id = 2share a timeline. - Values are normalized once at capture (timestamps → ISO, binary → hex
preview) so a diff between two snapshots never lies about a timestamp cell. - Only deliberate runs are captured: watch ticks, notebook cells, AI-assistant
runs and table-preview page flips never pollute the timeline.
Personal use is free. Commercial use needs a license. No telemetry, no
account — your data stays on your machine.
Full changelog: v0.24.0...v0.25.0
What's Changed
- feat(results-grid): enable row context menu on virtualized rows by @tembo[bot] in #206
- feat: Time Machine — snapshot, scrub, and diff query results by @Rohithgilla12 in #208
- fix(time-machine): store the user's SQL, not the fingerprint, in the sql column by @Rohithgilla12 in #209
Full Changelog: v0.24.0...v0.25.0
0.24.0
Sweat the details
This one's about trust. A database client either tells you the truth or it quietly lies — and a quiet lie in a data tool is the worst kind. v0.24.0 is a reliability release.
✨ New
- Watch Mode alerts. Pin a
SELECT, set an alert condition, and get a native OS notification the moment it trips — with a row-count sparkline in the toolbar so you can see the trend at a glance. - Query history that survives restarts. History is now persisted on disk per connection instead of renderer storage, so quitting the app no longer wipes where you've been.
🛠 Fixed
- JSON / JSONB cells edit correctly. Editing a json/jsonb cell holding a scalar (string, number, boolean) now saves instead of failing — scalars are serialized as valid JSON text. Verified end-to-end against a real Postgres.
- Timestamps tell the truth.
timestamp without time zonevalues are shown as stored instead of being silently shifted into the app's local timezone. - Multi-window focus. Clicking the dock/taskbar icon raises the window you were actually using — not the first one you opened — and each window carries its own title.
- Export follows the active result. Exporting from the nav bar uses the result tab you're looking at, not the first statement of a multi-statement query.
- Hardened credential storage and a batch of reliability fixes.
🖥 Platform note
- macOS is now Apple Silicon (arm64) only. Intel (x64) macOS builds have been discontinued.
Personal use is free. Commercial use needs a license. No telemetry, no account — your data stays on your machine.
Full changelog: v0.23.0...v0.24.0
0.22.0
Highlights
v0.22.0 has no new top-line features. It is a deliberate stability release.
We held a post-audit hunt across the editing, pagination, query-lifecycle,
and
schema-cache layers and killed every silent-corruption path we could find —
the kind of bug that does not throw, does not log, and changes the row your
UPDATE lands on. Alongside that, the end-to-end suite grew from 4 specs to
25, the design system was normalized onto theme tokens, and the query editor
lost ~1,000 lines of monolith.
If you use data-peek to edit data, paginate through results, or run DDL on a
long-lived schema-cache connection, upgrade. Several of the bugs in this
release could and did corrupt the wrong row.
What Changed
Silent-Corruption Hunt (#166)
Seven correctness bugs in the editing and pagination paths, all fixed:
• Inline edits are now keyed by primary key, not display position. The
previous keying meant: sort after an edit and the next keystroke landed on a
different DB row. Paginate and pending edits collided across pages. Switch
result tabs in a multi-statement query and edits silently jumped contexts.
Edits on rows without a usable PK are now rejected outright — better to drop
the keystroke than build an UPDATE with no safe WHERE .
• Row keys are bigint-safe. JSON.stringify throws on BigInt . Postgres +
pg-types overrides or mysql2's bigIntAsNumber: false would put a native
bigint into the PK snapshot and explode mid- set(...) , leaving the edit
store half-mutated. PK values are now encoded explicitly per type.
• Cancel no longer wipes pending edits. handleCancelQuery sets
multiResult to null to surface "Query cancelled by user". The result-
update path used to unconditionally clear pending edits on every result
write; hitting Stop silently destroyed in-progress inline edits. Edits now
survive a null result write.
• Edit-target table is resolved from executed SQL, not tab metadata. If you
rewrote the editor to query a different table from a table-preview tab, the
commit path used to target the original stored table.
• Pagination respects user-typed SQL. Three places (count-for-pagination,
page-change SQL rebuild, "Apply to Query") trusted the stored table over the
SQL on screen. Filtered SQL would have its WHERE quietly dropped on the
next page change; the pagination footer reported the whole-table row count
instead of the filtered total. A new hasFilters check in the SELECT parser
gates all three.
• The editing-cell focus state is now cleared on result reset.
clearPendingChanges / revertAllChanges used to spread the prior state and
leave editingCell set — Enter would commit an UPDATE against unrelated
fresh data.
• Stale total-row-count cleared. When SQL diverges from the table-preview
source, serverTotalRowCount resets to null so pagination falls back to
client-side over the actual result.
Query Lifecycle Hardening (#166)
Three races on the run/cancel path:
• Late responses can't overwrite newer queries. Each handleRunQuery and
handleCancelQuery invocation snapshots its executionId in a closure and
bails before writing tab state if the live executionId no longer matches.
• updateTabExecuting is compare-and-swap. A stale finally from execution
A no longer clears the executing flag of execution B started after the user
hit Stop.
• Closing a tab cancels its in-flight query. Single close, closeAllTabs ,
closeOtherTabs , closeTabsToRight — all of them now fire a best-effort
cancelQuery before dropping the tab. Otherwise the pg client kept
streaming results nobody read, holding a pool slot until the server-side
query completed. With POOL_MAX = 5 , a few abandoned long-runners starved
new connections.
Schema Cache, Made Correct (#166)
• DDL invalidates the cache. CREATE / ALTER / DROP TABLE used to leave
cached column sets, FK metadata, and table lists in place. With a 24-hour
TTL, edit-context column lookups and the table designer would read pre-DDL
columns and silently produce bad SQL. Every successful DDL handler now
invalidates.
• Concurrent db:schemas calls coalesce. App-start with two tabs on the
same connection used to fire two simultaneous full pg_catalog scans. A new
getOrFetchCachedSchema keeps in-flight fetches in a map keyed by connection
— second caller awaits the same promise.
• Per-key generation token. Without it, a fetch started just before a DDL
invalidate would capture pre-DDL state, finish after the invalidate, and
unconditionally repopulate the just-cleared cache with stale data —
defeating the invalidation it was racing. The fetcher now checks the
generation before writing, and the finally checks slot ownership before
deleting.
Tab Hardening (#166)
• handleRunQuery resolves the edit target from the SQL that was actually
executed, not the tab metadata. Switching between table-preview and query
tabs no longer drags a stale editContext along.
• isExecutableTab helper extracted; tab-store updates tightened to use it.
• Pending edits cleared whenever updateTabResult , updateTabMultiResult ,
or setActiveResultIndex writes a non-null result.
End-to-End Test Fortress (#168, #169, #170)
Playwright suite expanded from 4 specs to 25, plus IPC gap coverage. Drives
Monaco, exercises the click → IPC → main → adapter → DB → renderer loop
against a seeded Postgres container. Regression specs now pin every audit-
fix
path above.
Design System Normalization (#172)
• Hex colors replaced with theme tokens across docs and marketing components.
The codebase is no longer a graveyard of one-off #6b8cf5 literals.
• AI design anti-patterns removed — side-stripe borders and excessive
backdrop-blur walked out.
• Sidebar and table headers moved to solid backgrounds, aligned with the
"honest, minimal" direction.
• Button transitions switched from transition-all to transition-colors ,
removing the layout-thrashing repaints.
• Silent failure patterns logged. storage and pg-notification-listener
now emit explicit errors instead of swallowing.
• tab-query-editor extraction. EditorToolbar and QueryResults pulled
out — over 1,000 lines off the monolith. ~10 any props replaced with
concrete types. Triple-duplicated export menu item collapsed into one helper.
Performance
• Query editor handlers memoized and extracted components wrapped in React.
memo . The editor no longer rerenders on every keystroke in the unrelated
parts of the tree.
• Schema cache, in-memory, bounded and keyed by saved connection id rather
than full DSN — fewer collisions, predictable memory.
• PG client pooling per saved connection (#165, shipped in v0.21.6, hardened
further here).
Observability
• Vercel Speed Insights added to the marketing site (#173). Real-user vitals
from the marketing surface now feed back into design decisions.
Bug Fixes
• NotebookStorage initialization no longer errors on first launch (#176).
• Build error in mdx-components.tsx resolved (#175).
Upgrade
Download the latest release from the releases page
https://github.com/Rohithgilla12/data-peek/releases or auto-update from
inside
the app via data-peek → Check for Updates.
If you have edits in progress against a long-lived session, commit or revert
them before upgrading — the binary will restart.
Technical Notes
• 40+ new tests across edit-store, tab-store, schema-cache, and the table-
preview paths. The contracts that used to be "the code does what it does"
are now pinned.
• The row-key encoding is U+001F-delimited and tagged per type ( b
for bigint, d for Date, p for primitive). The unit-separator
can't appear inside JSON-encoded strings, so it can't collide with values
containing quotes or punctuation.
• analyzeEditableSelect now exposes hasFilters: boolean — true if a row-
set-modifying clause ( WHERE / GROUP BY / HAVING / UNION / FOR ) is
present at depth 0. ORDER BY / LIMIT / OFFSET don't count.
• Schema cache uses a per-key generation counter. invalidateSchemaCache
bumps the generation before clearing memory state, so any in-flight fetcher
already past await fetcher() sees the new generation when it tries to
write.
0.21.6
What's new
Five quality-of-life improvements tackling asks from #78.
Export respects the active result tab
Running multi-statement queries like SET …; EXPLAIN …; WITH … SELECT … produced multiple result tabs, but the Export dropdown always pulled from the first statement. Switching tabs and hitting Export silently exported the wrong one. Now it follows whatever tab you're looking at. (#78, commit 70fefbb)
Run selection only
Cmd/Ctrl+Enter now runs just the highlighted SQL when the editor has a non-empty selection — matching DBeaver/DataGrip. With no selection, the full buffer runs as before. (#78, commit 711cc80)
Query history persists across restarts
Query history was in-memory and evaporated every app quit. It's now persisted to localStorage with timestamps rehydrated properly. Results and the current draft stay ephemeral as before. (#78, commit 93526e7)
Commit errors surface in the SQL preview dialog
Edit commits that hit foreign-key violations, CHECK constraints, or any DB error previously just console.error'd and the dialog stayed open with zero feedback. You now get a red error banner inside the dialog with the full message, so you can fix and retry. (#78, commit c91d176)
Useful right-click on result rows
The native "Select All" right-click menu is gone. Every result row now has a Radix context menu with:
- Copy Row as JSON
- Copy Row as CSV
- Duplicate Row (editable tables only)
- Delete Row (editable tables only)
The Electron main-process handler was updated to skip its fallback popup in contexts where it would only show a useless "Select All", avoiding menu collisions. (#78, commit 28ddcb4)
Typecheck clean, 491 tests passing.