Skip to content

Releases: Rohithgilla12/data-peek

0.29.0 — Bring your own agent

Choose a tag to compare

@github-actions github-actions released this 07 Aug 11:21
2fe5204

v0.29.0 — Bring your own agent

The AI assistant is no longer Claude-only. Point it at whichever coding CLI you already have — Claude Code, Codex, or Google Antigravity (agy) — and it runs on that CLI's own sign-in. No API key to paste, and none stored.

🔌 Three harnesses, one assistant

  • Codex (local CLI) — runs codex exec with model-validated structured output, conversation resume, and hermetic runs (--ignore-user-config, read-only sandbox). Verified live against codex-cli 0.146.0.
  • Antigravity (local CLI) — Google's agy, streaming structured output with conversation resume. Verified live against agy 1.1.8.
  • Claude Code (local CLI) — unchanged, and still the only harness that grounds answers against your live database over MCP.
  • Pick one in Settings → AI — each row detects the CLI on your PATH and shows its version ("Detected · codex-cli 0.146.0"), or the sign-in command if it isn't set up yet.
  • Your keys stay out of itOPENAI_API_KEY, GEMINI_API_KEY, and GOOGLE_API_KEY are dropped from the child process environment. Bring-your-own-harness means the CLI's own auth, nothing else.

⚠️ What Codex and Antigravity can't do yet

Both ship chat-only: schema-aware answers, generated SQL, charts and metric cards — but no live database grounding, and no grounded badge. Headless codex exec auto-cancels MCP tool calls regardless of approval policy (openai/codex#24135), and agy's MCP permissions are config-file-based with only a blanket skip-permissions override. Rather than fake it, the assistant is told it has no live access, so its answers stay honest.

The MCP plumbing is built and tested for both, one capability flag away from lighting up when upstream approval handling lands. Claude Code is unaffected — grounded chat still streams and still shows the badge.

🧱 Under the hood

The Claude-only harness code became a HarnessAdapter seam, mirroring the existing DatabaseAdapter pattern: a generic runner (spawn, PATH resolution, timeouts, JSONL buffering, temp schema files), one orchestrator holding the validation and grounded-ness rules, and a small adapter per CLI. The next harness is one file.

Sessions are now provider-aware, so switching harness mid-chat starts a fresh conversation instead of failing to resume. Every adapter is tested against real captured output from the CLI it drives.


Full Changelog: v0.28.3...v0.29.0

Free for personal use · MIT source · macOS / Windows / Linux · https://datapeek.dev

0.28.3

Choose a tag to compare

@github-actions github-actions released this 04 Aug 06:04
64c05cb

What's Changed

  • fix(desktop): key Postgres pools by connection shape, not just id by @Rohithgilla12 in #253

Full Changelog: v0.28.2...v0.28.3

0.28.2 — Schemas, and AI that acts

Choose a tag to compare

@github-actions github-actions released this 03 Aug 06:15
184a042

v0.28.2 — Schemas, and AI that acts

Everything since 0.28.0 — 0.28.1 was never published, so its AI performance work ships here too.

🗂 Pin a default schema

Connections to a database with many schemas no longer dump everything into the sidebar.

  • Default Schema field on PostgreSQL connections — pins search_path so unqualified table names resolve where you expect, and focuses the sidebar on that schema.
  • Comma-separate for a fallback chainbbl, public resolves against bbl first, then public. Leave it empty to keep the server default.
  • ?schema= in pasted URLs now works — previously it was parsed and silently discarded. ?search_path= and the libpq ?options=-c search_path= form are read too, and the parsed value is shown back to you before you save.

🤖 AI that applies the fix

  • Apply Index & Re-run — one click executes the DDL the assistant suggests and re-runs your query against it, so you see the real speedup rather than a prediction.
  • Predicted speedup and lock-free safety badges on each performance issue, so you know before you run it whether the index build will lock the table.
  • AI copilot drawer on performance issues, with an expandable raw-JSON viewer if you want to see exactly what the CLI returned.
  • Analyze on demand from the query editor toolbar.
  • AI Schema Architecture Audit in the Schema Intel tab — a structural review of your schema, not just per-query tuning.

🔧 Fixes

  • Watch Mode diff highlights now render for results of 50 rows or fewer — they were gated behind virtualisation, so small result sets showed no changed-cell highlighting at all.
  • Watch Mode reads its diff baseline from the tab, labels the hold, and refreshes displayed rows on every tick.
  • In-app license purchase and dashboard links no longer 404.

🌐 Site

Tabbed feature showcase with looping clips, expanded comparison pages, and a batch of Postgres blog guides — firefighting (kill query, blocking, too many connections) and cleanup (duplicate indexes, unused indexes, bloat).


Full Changelog: v0.28.0...v0.28.2

Free for personal use · MIT source · macOS / Windows / Linux · https://datapeek.dev

0.28.0 — AI chat, live and grounded

Choose a tag to compare

@github-actions github-actions released this 21 Jul 10:14
be8f94b

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

Choose a tag to compare

@github-actions github-actions released this 20 Jul 16:30
06ddd3e

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

Choose a tag to compare

@github-actions github-actions released this 20 Jul 14:00
9f0d8ed

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; MCP explain_query is now recorded too.
  • MCP reads are bounded by a statement timeout, and the run_query failure and alter-table result contracts were corrected.
  • PostgreSQL — the connection pool can no longer get stuck in a "shutting down" state after an aborted quit.

📦 Install

macOS / Linuxcurl -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

Choose a tag to compare

@github-actions github-actions released this 18 Jul 02:15
c65df25

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 freelist_connections, list_schemas, run_query, explain_query. Reads execute inside a rolled-back transaction with a 500-row cap; on PostgreSQL they additionally run under SET TRANSACTION READ ONLY.
  • Writes wait for you. execute_statement pops 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 add snippet 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 expanded CONTRIBUTING.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 / Linuxcurl -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

Choose a tag to compare

@github-actions github-actions released this 03 Jul 08:04
592776d

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 SELECT in a query tab is snapshotted
    locally — automatically, no setup. Press ⌘⇧H and 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 so WHERE id = 1 and WHERE id = 2 share 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

Choose a tag to compare

@github-actions github-actions released this 01 Jul 05:04
ffd2ad2

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 zone values 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

Choose a tag to compare

@github-actions github-actions released this 13 May 09:35
19faebf

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.