Replace the static hero screenshot with a self-contained React mockup of the
full Gridline DB viewer (sidebar, table tree, tab bar, fake SQL editor,
data grid, queries/objects/schema-visualizer views, disabled Tools state).
- Add @astrojs/react and mount the island via client:visible
- 16:9 aspect-ratio mockup, hidden on mobile (static image fallback)
- JSON cell popover: solid surface, anchored within the mockup window,
Escape/outside-click close
- Dependency-free HTML5 drag-to-reorder tabs
- Theme-aware app tokens (canvas, surface-raised, popover bg)
- Site-wide max-w-7xl (was max-w-[1200px]) so sections center on big screens
- Regenerate standalone www/bun.lock for deterministic Dokploy builds
Hide entry-animated elements at first paint (html.anime-ready guard in
global.css) so the landing page no longer flashes visible content before
anime.js loads. Adds a <noscript> fallback and a JS load-error fallback to
guarantee content is never permanently hidden, and reveals the hero
immediately for prefers-reduced-motion users. Includes #macos-hint in the
hero entrance timeline so the macOS command box animates in correctly.
www/package.json declares vitest ^4.1.10 but the standalone www/bun.lock
(Railpack/Dokploy builds from /www with --frozen-lockfile) was stale and
missing it, failing every deployment with 'lockfile had changes, but
lockfile is frozen'. Regenerated www/bun.lock from www/package.json.
Add 'Copy connection URL' (with password, fetched from the OS keychain on
demand) and 'Copy connection URL (no password)' to the connection card kebab
menu. Builds postgresql://, mysql://, sqlite://, redis:// strings with
percent-encoded credentials and the PG sslmode appended. Bump to v0.7.10.
- Add 2-feature_request.md and 3-improvement.md templates (chooser now
lists Bug report, Feature request, Improvement in order)
- Improve bug report template: cross-template pointer, Linux log hint,
Related issues/PRs section, demo-DB reproduction hint
- Auto-assign every newly opened issue to the repo owner:
assignees in template front matter + a workflows/auto-assign.yml
(covers issues opened without a template)
- Add ISSUE_TEMPLATE/config.yml with Roadmap/README contact links
- Update README Contributing section
The bundle contains read-only files (e.g. the bundled OpenSSL dylibs), so a
sudo-less 'xattr -dr com.apple.quarantine' fails with Permission denied for
some users. Standardize on 'sudo xattr -dr com.apple.quarantine' in the
README, ROADMAP, the release.yml SIGNING STATUS comment, and the release
notes; AGENTS.md now requires release notes to carry the macOS first-launch
instructions until a Developer ID cert is secured.
Users at the top table previously saw no mention of the unsigned-app
warnings; the details lived ~200 lines down under Getting Started. Add a
callout right under the Download table linking to the macOS first-launch
instructions (right-click Open / xattr workaround).
* fix: macOS Finder launch (store path, ad-hoc signing, vendored openssl)
- Store::open was resolving 'gridline.db' relative to the working directory;
Finder/LaunchServices launches run with cwd=/ so the .expect() panicked
(exit 101, silent 'app does nothing') before Tauri ever started. Open the
store under app.path().app_data_dir() in setup instead (same dir as the
demo DB), creating the dir when needed.
- Add bundle.macOS.signingIdentity "-" + hardenedRuntime false so the
bundler ad-hoc signs the whole bundle. Previously only the inner binary
got Xcode 16's linker-signed signature, which macOS treats as unsigned:
quarantined downloads showed 'damaged and can't be opened', and after
quarantine removal LaunchServices silently refused to spawn it.
- ssh2 now builds OpenSSL vendored (feature vendored-openssl): the release
binary previously carried an absolute LC_LOAD_DYLIB to the build machine's
/opt/homebrew/opt/openssl@3/lib, which dyld aborted on (and hardened
runtime library-validation rejected even when present).
- README: document the macOS first-launch paths (right-click Open / xattr
for the damaged-error case, re-run after every upgrade).
- release.yml: update SIGNING STATUS comment to reflect ad-hoc signing.
* chore: bump 0.7.8 -> 0.7.9 (release prep)
- Version sync across package.json, src-tauri/Cargo.toml, src-tauri/tauri.conf.json
- version.test.ts / bundle-config.test.ts / docs-coverage.test.ts expect 0.7.9
- README: both download tables -> v0.7.9 asset names; new v0.7.9 changelog entry;
tag instructions -> v0.7.9; MAINTENANCE comment updated
- AGENTS.md maintenance note example -> v0.7.9
- ROADMAP: Shipped (0.7.9) section; Next up retitled (0.8.0) TBD
The releaseAssetNamePattern input was never honored by tauri-action —
the draft release got default versioned asset names (Gridline_0.7.5_*.dmg,
Gridline-0.7.5-1.x86_64.rpm, ...), so the version-free releases/latest
links in the README would 404. Per user decision, drop the dynamic
scheme: both README download tables now link statically to the v0.7.5
assets, with a MAINTENANCE comment and an AGENTS.md checklist entry
reminding to bump both tables on each release. Remove the dead
releaseAssetNamePattern config from release.yml.
Three independent pg-tools step failures on the 5th release run:
- Linux: 'ar: libpgcommon_srv.a: file format not recognized' — parallel
`make -C` tool builds race each other's recursion into src/common
(rm -f / ar crs on the same archive). Pre-build generated-headers +
libpq (which pulls in common/port) serially so the -j tool builds find
the archives up to date.
- macOS x86_64: strchrnul marked 'introduced in macOS 15.4' by Xcode 16.4
fails -Werror=unguarded-availability-new and would crash at runtime on
macOS < 15.4. Force ac_cv_func_strchrnul=no and rename PG16's inline
fallback (pg_strchrnul) so it compiles on any SDK without touching the
system symbol.
- Windows: EDB pg_dump.exe needs libcrypto/libssl/libiconv/libintl/
libwinpthread/liblz4/libzstd/ICU DLLs; copy every bin/*.dll, not just
libpq.dll.
All three verified locally (macOS: full build + tools run from resource
dir; YAML + bash -n for all platform variants).
The per-platform binary-suffix check used
f="$OUT/${b}$( [ platform = windows-latest ] && echo .exe )".
The [ ] test exits 1 when false (linux/macos), and under 'set -euo
pipefail' the failing command substitution aborts the whole step before
any check output — exit 1 right after checksums with no error message.
Replace with an if/else BIN_EXT variable set before the loops.
Verified locally: full script block (checksums -> file check -> sanity)
passes with real pg_dump/pg_restore/psql + libpq, exit 0.
- patchelf was passed '\$ORIGIN' (backslash-dollar inside single quotes),
so the ELF rpath was a literal \$ORIGIN path — the loader never expanded
it and the tools couldn't find libpq at runtime. Use '$ORIGIN'.
- macOS awk program had \$1, which awk rejects as a syntax error; use $1
(verified locally: otool -> install_name_tool -> all 3 tools run).
cp ran from /tmp/postgresql-16.4 after 'cd', so the relative
src-tauri/resources/pg_tools target didn't exist. Use
${GITHUB_WORKSPACE}/src-tauri/resources/pg_tools so copies land in the repo.
CI (release.yml) — pg-tools bundle step failed on Linux/macOS with
'catalog/pg_*_d.h not found': building src/bin/pg_dump directly raced its
generated-headers prerequisite under -j. Fix: run 'make -C src/backend
generated-headers' serially first. Also drop the unrecognized --disable-shared
flag (PG16 client tools link shared libpq) and bundle libpq alongside the
tools — @loader_path rewrite via install_name_tool on macOS, $ORIGIN rpath
via patchelf on Linux — plus a 'tools run' sanity check so a broken bundle
fails the step before release. Windows (EDB download + libpq.dll) already
passed. Verified locally: all 3 tools run from the bundled dir.
Cmd+K palette — selecting a result did nothing visible:
- non-table results set selectedObjectType but never switched the view (the
Objects page only mounts when DbViewerScreen's local currentView ===
'objects'), so nothing happened. Added a store 'requestedView' field that
DbViewerScreen consumes and clears; the palette now requests the right view
('objects' for functions/triggers/sequences/enums/etc., 'db-viewer' for
tables/views/matviews before openTab) so the tab or Objects list actually
appears.
- Added keyboard navigation: ↑/↓ move the highlight (wrapping), Enter picks,
Esc closes. scrollIntoView guarded with optional call so jsdom tests don't
crash on the ref callback.
- Tests: palette select now asserts requestedView; new ArrowDown/Enter,
ArrowUp-wrap, empty-Enter cases; store test for requestedView setter.
* chore: bump version to 0.7.5 (Task 1.1)
* feat(db): pure object DDL/search/depend builders (Task 1.2)
* feat(models): ObjectSearchHit, DependencyInfo, PgToolPaths, tool source fields (Task 1.3)
* feat(backup): bundle-aware pg tool resolution, system-first fallback (Task 2.1)
* feat(objects): schema CRUD commands + integration test (Task 2.2)
* feat(objects): search_objects command (current-schema, all types) (Task 2.3)
* feat(objects): get_object_ddl for all browsable types (Task 2.4)
* feat(objects): pg_depend object dependencies + schema contents (Task 2.5)
* feat(ipc): register object management commands (Task 3.1)
* feat(ipc): frontend wrappers + types for object management (Task 3.2)
* feat(build): declare bundled pg_tools resources (Task 3.3)
* test(capabilities): lock objects capability PG-only for search/ddl/dependencies (Task 3.4)
* feat(ui): Cmd+K object search palette in DB viewer (Task 4.1)
* feat(ui): schema CRUD menu + dependency dialog (Task 4.2)
* feat(ui): copy-as-DDL + dependency view context menu in Objects (Task 4.3)
* feat(ui): dependency check before table drop + bundled-tool status (Task 4.4)
* docs: v0.7.5 release notes + status table + bundled-tools (Task 5.1)
* ci: build/verify bundled pg client tools per platform before tauri build (Task 5.2)
* fix(objects): report pg_rewrite dependencies as the dependent view (pg_class)
pg_depend records view dependencies via the view's internal rewrite rule
(classid = pg_rewrite). The user-facing dependent object is the VIEW itself,
so map that classid to pg_class (name still resolved through ev_class).
Fixes the live-PG integration test object_dependencies_for_table_includes_view
and makes the dependency dialog readable for view dependents.
* test: add idempotent PG integration-test seed script
Seeds the first PG test db (GRIDLINE_TEST_SRC) with the objects the
#[ignore] integration tests assert against: users (+users_id_seq),
products (3 rows), orders (3 rows), order_summary view, audit_log +
get_user functions, user_role enum. Idempotent: DROP + recreate.
* fix(build): regenerate multi-resolution icons + roadmap Keychain item
- icon.ico previously contained a single 16x16 frame (Windows scaled it
up -> blurry taskbar/start-menu icon). Regenerated from the 512px source
via 'tauri icon': ICO now has 16/24/32/48/64/256 frames, icns has full
@2x coverage up to 1024px, PNGs re-rendered from the same source.
- Added icons/icon.png (512px) to bundle.icon so Linux hicolor installs
a high-DPI entry.
- ROADMAP: log the 'Enable Keychain' toggle (currently a form-only
placeholder) under Next up -> Connection & credentials.
* docs(readme): dynamic version-free download links + 3-col table
- release.yml: set releaseAssetNamePattern to '[name]_[platform]_[arch][setup][ext]'
(version-free), so asset filenames are stable across releases:
Gridline_darwin_aarch64.dmg, Gridline_windows_x64-setup.exe,
Gridline_linux_amd64.deb, Gridline_linux_x86_64.rpm, etc.
- README: both download tables now 3-column (OS | Architecture | Download)
and link via GitHub's releases/latest/download/<file> redirect — they
always point at the newest published release, no per-release edits.
- AGENTS.md: releases checklist updated — download links stay version-free.
* docs(readme): platform-per-column download table (macOS | Windows | Linux)
Table now mirrors the release layout: one column per OS with a logo row
and a download-links row underneath. Links stay version-free via
releases/latest/download/<file> (releaseAssetNamePattern in release.yml).
* docs(readme): revert download table to clean image-less 3-col layout
Logo row was hard to read on GitHub dark mode; the plain OS | Architecture
| Download table is cleaner and still uses dynamic releases/latest links.
* docs: correct competitor comparison for DB Pro, Beekeeper, TablePlus
Research-verified the 'Why Gridline vs the alternatives' claims against
vendor docs, pricing pages, GitHub, and release notes (May 2026):
- DB Pro is an Electron app (founder-confirmed), not native; add
TablePlus column to the comparison table
- Fix wrong cells: DB Pro has query/dashboard folders + table tags and
CSV/JSON export on the free tier; object-explorer depth corrected for
DB Pro (tables/views/indexes/enums) and Beekeeper
(tables/views/routines/triggers)
- Reframe differentiators: unlimited-everything framing dropped for
Beekeeper (free tier is already unlimited on tabs/connections/queries);
keep DB-to-DB sync as the genuinely unique feature
- Add a dated 'Competitor reality check' section to AGENTS.md so future
edits don't re-assert inaccurate claims
* docs: add project roadmap, link it from README and AGENTS
New ROADMAP.md is the source of truth for planned work, reflecting the
in-flight v0.7.0 connection-screen-revamp spec (new-connection flow,
full MySQL DB viewer, capability gating, Supabase/Neon presets,
SQLite path mode, tag overflow scroll, styling sweep).
Next-up scope: PostgreSQL object management CRUD with companion
features (schema CRUD, global object search, copy-as-DDL, object
dependencies) and an admin follow-up (users/roles/grants,
VACUUM/ANALYZE/REINDEX). MySQL Objects view explicitly deferred.
Queue: Redis browsing, MariaDB/TimescaleDB, PlanetScale/Turso,
query workbench upgrades (multiple result sets, query cancel,
result streaming, visual query builder), schema/data tooling,
SQLite .dump, schema diff, more export formats.
Planned: BYOK AI, website & docs, rolling UI/UX polish (incl.
onboarding tour, settings import/export, SSH key management).
README roadmap section now links to ROADMAP.md; AGENTS.md Related
Documents + Implementation Status reference it and the v0.7.0 spec.
* docs: release notes reference prod as the production branch
The repo's production branch is prod (feature branches merge back to
prod), not main. Update the release-cut instructions in the README and
the trigger comment in release.yml.
* docs: add robust bug report issue template
Structured .github/ISSUE_TEMPLATE/bug_report.md covering environment
(OS, Gridline version, install type, DB type/version, hosted provider,
connection method incl. SSH/TLS/socket), steps to reproduce, expected vs
actual, screenshots, logs, impact, and workarounds — plus a duplicate
checklist and secrets-redaction note. Referenced from the README
Contributing section.
* docs: drop in-flight branch mention from roadmap; remove unused starter assets
- ROADMAP.md no longer references the in-flight feature branch/spec
(removed at the end anyway when the branch PRs into prod)
- Remove unused Vite/Tauri starter SVGs from public/ (no favicon or
asset references anywhere in the app)
* test: fix stale README comparison-table regex in docs-coverage (5-col table)
* feat: shared INPUT_ROUNDING constant + bump to v0.7.0 (Task 1.1)
* fix: map SQLite file path to host field + provider host detection (Task 1.2)
* test: bump version expectation to 0.7.0 (Task 1.1 follow-up)
* feat: db capability matrix for DB viewer gating (Task 1.3)
* feat: provider tab definitions, Supabase/Neon icons + setup guides (Task 1.4)
* feat(rust): MySQL SQL builders + identifier quoting (Task 2.1)
* chore(rust): sync Cargo.lock to gridline 0.7.0
* feat(rust): MySQL db_connect (SSL + SSH tunnel) + pool variant (Tasks 2.2-2.3)
* feat(rust): MySQL execute_query with wrapped pagination + raw fallback (Task 2.4)
* feat(rust): MySQL introspection + changes-queue editing + DDL (Task 2.5)
* fix(ui): show table toolbar immediately while tab is still loading first data
* feat: gate DB viewer sidebar nav by db capabilities (Task 3.1)
* feat: guard DB viewer views by capability + Redis unsupported state (Task 3.2)
* feat(ui): 2-column provider tab grid (Task 4.1)
* feat(ui): collapsible Supabase/Neon setup guide (Task 4.2)
* feat(ui): SQLite file-path input with Browse (Task 4.3)
* feat(ui): connection metadata row (label + tags/env/folder) (Task 4.4)
* feat(ui): rework GeneralTab (URI + OR + manual) + reduce Detailed form tabs (Task 4.5)
* feat(ui): NewConnectionScreen two-stage flow; remove SimpleConnectionForm (Task 5.1)
* feat(ui): scroll connection-card tag row past 3 tags (Task 5.2)
* style: sweep form controls from rounded-full to rounded-lg (Task 5.3)
* feat(ui): EditConnectionModal parity + managed-preset SSL hint (Task 5.4)
* fix(rust): decode MySQL VARBINARY metadata columns (information_schema/SHOW) as strings
* test: full suite green for v0.7.0 connection revamp (Task 5.5)
* feat(ui): schema dropdown + tables tree loading state while schema tree fetches
* docs: update AGENTS/README/ROADMAP for v0.7.0 (connection revamp, MySQL viewer, gating)
- Expand demo schema to exercise every SQLite-available feature: composite PK
(order_items), self-referencing FK (categories), JSON columns (lowercase
'json' so the cell popover triggers), BLOBs (files), no-PK table (page_views,
rowid editing), TEXT PK (app_settings), empty table (marketing_campaigns),
read-only view (order_summary), CHECK/UNIQUE/defaults/indexes, smart-sort
tiers, and a 500-row audit_log for pagination/virtualization/filter demos
- Stamp PRAGMA user_version = 2; stale demo files auto-recreate on launch
(schema is idempotent, guarded inserts)
- Add regenerate_demo_db command: drops live pool handle, wipes + re-seeds
the demo file; new Settings > General > Demo 'Regenerate demo' button with
confirm dialog, loading state, toasts
- Fix Re-add demo to use the app data dir (was temp dir) so both paths match
startup; reload connections after re-add
- Add 9 unit tests (demo.test.rs) covering objects, seed counts, JSON
validity, FK consistency, view queryability, idempotency, constraint
shapes, and stale/regenerate file flows
* feat: settings back button returns to origin view (push/pop nav)
* feat: redesign settings screen with db-viewer border styling
* fix: settings sidebar — icon+text tabs, back at top, top border (PR feedback)
* fix: tighten settings sidebar — back and tabs in one group
* fix: settings header shows active tab name instead of duplicated title
* fix: settings — accent back button, header shows active tab; fix App test
* fix: tags settings — no create label, no card chrome (bg/border/padding)
* feat: drag-and-drop tag reordering in settings tags tab
* fix: general settings — remove section card chrome (bg/border/padding)
* fix: merge Appearance and Interface into one settings section
* fix: remove row separators between settings items within sections
* fix: settings rows use gap spacing instead of per-row padding
* feat: strip section cards from all settings tabs; delete SettingsSection
* feat: apply theme and font size settings (appearance wiring)
* feat: honor default folder setting on startup
* feat: confirm_before_delete setting now skips delete confirmations
* feat: default_ports setting prefills new connection forms
* fix: light theme — text colors, native window chrome, ThemePicker preview
* fix: sync window background color with theme so title bar follows light mode
* fix: window-sync test uses microtask flush instead of vi.waitFor
* fix: app root carries canvas bg so home-screen parent matches theme
* fix: grant window set-theme/set-background-color permissions so title bar follows theme
* fix: overlay title bar — webview paints under traffic lights, flat canvas color in both themes
* fix: compact 28px overlay titlebar with visible bottom border
* fix: in-flow titlebar strip (draggable via allowed permission); screens fill remaining height, no bottom clipping
* fix: top border only on settings + db viewer pages, not the titlebar strip
* fix: db viewer sidebar h-screen -> h-full (28px overflow clipped bottom icons)
* fix: system theme resets window to OS before reading matchMedia (was polluted by forced window theme)
* fix: theme switcher labels moved below previews for readability
* feat: configurable accent color setting (circle palette in Appearance)
* docs: update AGENTS.md + README for settings redesign, wired settings, accent color
* feat: add query_history table migration (v5) (Task 1)
* feat: add isDestructiveQuery utility (Task 2)
* feat: add tabType discriminator and openQueryTab to dbViewerStore (Task 3)
* feat: add execute_query command with pagination and query history (Task 4)
* feat: add typed wrappers for executeQuery, getQueryHistory, clearQueryHistory (Task 5)
* fix: global search bypasses folder scope when filters active (Task 6)
* feat: add TagFilterDropdown with checkboxes and empty state (Task 7)
* feat: add DbTypeFilterDropdown with checkboxes and clear all (Task 8)
* feat: wire TagFilterDropdown/DbTypeFilterDropdown into ActionRow, add inline tag creation (Task 9)
* feat: add Name input to GeneralTab for connection editing (Task 10)
* feat: add QueryEditor Monaco wrapper with SQL mode and Cmd+Enter (Task 11)
* feat: add DestructiveQueryDialog with SQL preview and confirmation (Task 12)
* feat: integrate query tabs, Monaco editor, destructive guard into DbViewerScreen (Task 13)
* fix: harden moveConnection against race conditions on rapid drags (Task 14)
* docs: update AGENTS.md implementation status for Home Screen UX + Query Editor (Task 15)
* feat: switch tag filter to OR semantics, add environment filter (F-T16)
* feat: add activeEnvironment filter state to uiStore and useFilteredConnections (F-T17)
* feat: add environment filter select to Filters dropdown (F-T18)
* feat: filter folder cards by tag match or contained connections (F-T19)
* fix: keep grid header width to content, border last column
* fix: hide select-all checkbox and empty-state when no table open
* fix: filter folder cards by any active filter, show global search results (F-T20)
* feat: show 'Showing Search Results' breadcrumb with clear button (F-T21)
* docs: update README + AGENTS.md for Query Editor, filters, and planned AI integration (BYOK)
* feat: refresh indicator with spinning icon and pulse, defer auto-refresh on tab switch
* feat: smart default schema selection, refresh schemas on database switch
* fix: auto-refresh waits for in-flight refresh to complete before next tick
* style: shrink db viewer sidebar nav icons from 20px to 16px
* style: shrink db viewer sidebar nav buttons to 32px (8px padding)
* style: make Tables panel title xs, regular weight, muted
* style: bump Tables panel title back to sm, keep regular weight and muted
* feat: export schema diagram as PNG/JPEG/SVG (entire schema or viewport)
* chore: lockfile for html-to-image
* fix: raise schema visualizer toolbar above legend so export menu isn't hidden
* feat: schema export via save dialog, transparent background option, save notification
* fix: render nothing in tab bar when no tabs are open
* style: reduce tab bar height from 40px to 36px
* style: reduce tab bar height to 32px
* style: revert tab bar height to 36px
* feat: split tab bar with fixed +Query and Changes actions on the right
* style: blue play-icon Query button in tab bar
* refactor: remove sidebar New Query button (now in tab bar)
* style: conditional bottom padding in sidebar toolbar when nothing is below
* feat: distinguish table and query tabs with icons
* style: tab icons follow active/inactive state, muted colors
* feat: query tab toolbar (run/format/dialect badge) + bare transparent editor
* style: blue rounded Run Query button in query toolbar
* feat: smart platform-aware shortcut tooltip on Run Query (⌘+⏎ / Ctrl+Enter)
* style: show only the shortcut in the Run Query tooltip
* fix: Cmd+Enter keybinding stale closure; add run pulse to query toolbar; bundle monaco locally (offline)
* feat: show placeholder text in empty query editor
* feat: SQL autocomplete — keywords + table names from active schema
* feat: per-table column autocomplete on 'table.' + docs update
* feat: query-variant result toolbar — export/refresh/columns left, smart-unit execution time right
* fix: populate execution_time_ms on query results so the toolbar can show time taken
* fix: re-measure monaco fonts after async font load to stop cursor drift
* feat: resizable + collapsible query results panel
* refactor: move results caret onto the resize handle (centered), bottom caret when collapsed
* style: thin drag strip with caret on its own centered pill
* refactor: remove Queue button from table toolbar (Changes lives in tab bar)
* style: changes button becomes bordered rounded icon with count badge
* docs: mark tab-bar Changes queue button in AGENTS.md and README