Adds a `tag` input so a release can be re-run without rewriting its tag.
Tag-triggered runs use the workflow file at the tagged commit, so fixing the
workflow and re-pushing the same tag was previously the only way to rebuild —
which rewrites a published release ref and misrepresents what the tag points
at.
RELEASE_TAG resolves to the input on workflow_dispatch and to the ref
otherwise, and drives both the checkout ref and tauri-action's tagName.
Replace the HOMEBREW_TAP_TOKEN PAT with HOMEBREW_TAP_DEPLOY_KEY, a
write-enabled SSH deploy key scoped to only AdrianBonpin/homebrew-gridline.
actions/checkout's `ssh-key` input wires the key into the SSH agent for the
job, so the cask push goes over SSH and no broadly-scoped personal access
token has to be stored as a repository secret.
Also drops the now-wrong claim that the job no-ops until the secret is set.
`gh secret set` strips the trailing newline when storing APPLE_API_KEY_CONTENT,
and Apple's PEM parser expects the key file to end with one. Write it back
explicitly so notarization can load the key.
GitHub is unsuspended, so releases move back from Gitea to GitHub, with the
Gitea mirror kept as a fallback.
- release.yml: re-enable as the active path and wire up Developer-ID signing
+ notarization for the macOS jobs. The Apple steps are guarded on the
secrets being present, so the workflow stays green (ad-hoc signed) until
they are configured.
- release.yml: re-sign the bundled PostgreSQL/MariaDB client binaries with
the Developer ID identity + hardened runtime + timestamp — Apple rejects
ad-hoc-signed nested executables during notarization.
- release.yml: move the Homebrew cask bump to the `release: published` event.
It previously ran on tag push, but the releases/tags API does not serve
drafts, so it could never download the DMGs. It now also skips cleanly
when HOMEBREW_TAP_TOKEN is unset rather than failing the workflow.
- release.yml: drop the stale header note claiming this is not the active
release path.
- README + cask template: point downloads, issues, releases and the Homebrew
tap back at github.com/AdrianBonpin.
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
Add 4 app screenshots in a 2x2 gallery:
- Home screen with saved connections
- Data grid with FK preview
- Interactive ER diagram / schema visualizer
- PostgreSQL enum detail view
Images are stored under screenshots/ and embedded above
the Features section.
* feat(grid): VirtualDataGrid component with TanStack Virtual (Task A1)
* fix(grid): address code review — header bg, row hover/select, table classes, measureElement removal
* feat(grid): column resize, FK popover, JSON popover in VirtualDataGrid (Task A2)
* fix(grid): address code review — accessibility, indeterminate checkbox, safe jp default
* feat(grid): wire VirtualDataGrid into DbViewerScreen, increase page size to 500 (Task A3)
* feat(grid): polish VirtualDataGrid — large datasets, hidden columns, select-all (Tasks A4+A5)
* feat(dnd): moveConnection store action with optimistic update + rollback (Task D1)
* feat(dnd): draggable connection cards + droppable folder tree (Task D2)
* feat(dnd): wire DndContext, onDragEnd, DragOverlay, drop targets in ConnectionGrid (Tasks D3-D5)
* feat(backup): models, v4 migration for backup_history, TypeScript types (Task C1)
* feat(backup): pg_dump, pg_restore, detect_tools, db_sync commands (Task C2)
* feat(backup): frontend wrappers, backup store, dialogs, tool detection, confirmations (Tasks C3-C5)
* feat(objects): add FunctionInfo, TriggerInfo, SequenceInfo, EnumInfo, ExtensionInfo models (Task B1)
* feat(objects): introspection queries + Tauri commands for functions, triggers, sequences, enums, extensions (Task B2)
* feat(objects): ObjectTree component, sidebar navigation, search, source expand (Tasks B3-B5)
* fix: drag handle position, env tag layout, transparent header, virtual row rendering
* fix: remove table toolbar bg, fix sticky header with flex layout, match header/row widths
* fix: vertical borders on all cells, horizontal border scrolls with header, checkbox column borders
* fix: full-height cell borders, centered checkboxes, horizontal scroll borders
* fix: header bg fills full width on scroll, page sizes match settings (50-500)
* fix: add subtle bg to panel resize handle to eliminate visual gap
* fix: FK preview showing 'db error' + make entire tab clickable
- VirtualDataGrid: added schema prop to fix empty schema sent to FK preview,
which produced invalid SQL (SELECT * FROM ""."table")
- Rust get_fk_preview: use pg_error_message() instead of .to_string() so
real PostgreSQL error messages surface instead of just 'db error'
- TabBar: moved onClick to the outer tab container so the entire tab area
is clickable, not just the table name text
* feat: push filters and sorts to server-side SQL queries
- Added FilterRule/SortRule models to Rust backend with serde support
- Built dynamic WHERE (parameterized /?) and ORDER BY clauses
- Both COUNT(*) and data queries now include filter clauses for
correct pagination with filtered results
- Store setFilterRules/setSortRules now trigger page-1 re-fetch
- Removed client-side applyFilters/applySorts — data arrives
pre-filtered/sorted from the database
- Added column name validation (is_safe_identifier) to prevent
SQL injection in filter/sort column names
* chore: center drag handle vertically on connection cards
* feat: convert backup/restore/sync from unreachable modals to in-page views
- Added BackupPage, RestorePage, SyncPage as full-page views inside
the DB viewer, replacing the old unused modal dialogs
- Added sidebar navigation items: Backup (Download), Restore (Upload),
DB Sync (ArrowLeftRight)
- Wired routing in DbViewerScreen — currentView switches to the new
page components, all scoped to the active connection
- Styled with toolbar header, underline inputs, glass cards, and
destructive confirmation checkboxes matching the app aesthetic
- Auto-detects pg_dump/pg_restore availability with platform-specific
install instructions when tools are missing
* fix: backup/restore/sync event-driven flow and styling
- Registered tauri-plugin-dialog in Rust lib.rs (was missing — browse
buttons were silently failing)
- Added #[serde(rename_all = "camelCase")] to BackupOptions,
RestoreOptions, SyncOptions so frontend camelCase fields map
correctly to Rust snake_case fields
- Made backup/restore/sync fully event-driven: pages now derive
running/completed/failed state from the backupStore instead of
the pgDump/pgRestore/dbSync promise (which returns immediately
while the actual work runs in the background)
- Added initListener() call in App.tsx so the backupStore actually
listens to Tauri backup-progress events
- failJob no longer clears activeJobId so the component can still
find the job to read its error message
- BackupProgress now receives real job status and error_message;
visible for all states (running/completed/failed) so the error
bar renders on failure
- Schema field converted from free-text to database-populated
dropdown (getSchemas) on all three pages
- Removed unused parseError functions and dead code
- Progress bar shows 100% on completed, 50% indeterminate while
running, red bar + error text on failure
* feat: object explorer pages with split-pane layout and schema switching
Created ObjectExplorerPage — a reusable split-pane component for
Functions, Triggers, Sequences, Enums, and Extensions:
Left panel:
- Database/schema dropdowns for switching context (solves 'no
functions showing' when they're in a non-default schema)
- Searchable object list with animated search input
- Refresh button to re-query
- Selected item highlighting
Right panel:
- Detail view with icon, name, schema
- Type-specific fields:
- Functions: return type, language, kind, arguments (with
mode/type badges), full source code with show/hide
- Triggers: table (schema-qualified), event, timing,
orientation, enabled status, trigger definition
- Sequences: current value, increment, start, min, max,
cycle flag
- Enums: labeled pill badges for each enum value
- Extensions: version, schema, comment
- Empty state showing count of available objects
Bug fix: pg_get_function_result() replaced with format_type()
in Rust introspection — the former returns multiple rows for
SETOF/TABLE functions (generate_series, etc.), causing the
entire query to fail silently. This was the root cause of
'no functions showing even though I know there are'.
* fix: correct PostgreSQL tgtype bitmask in trigger query
The trigger query used wrong bit positions for all events.
PostgreSQL tgtype bits:
bit 0 (1): ROW vs STATEMENT
bit 1 (2): BEFORE vs AFTER
bit 2 (4): INSERT
bit 3 (8): DELETE
bit 4 (16): UPDATE
bit 5 (32): TRUNCATE
The old query had every event shifted one bit down (INSERT=2
instead of 4, DELETE=4 instead of 8, etc.). Timing checked bit 0
instead of bit 1. Orientation label was inverted (showed STATEMENT
when bit 0=1 which actually means ROW).
* fix: object page re-mount on type switch + matching dropdown style
- Added key={type} to each ObjectExplorerPage instance so React
forces a fresh mount when switching between Functions → Triggers
→ Sequences → Enums → Extensions (was reusing the same component
instance, showing stale data from the previous type)
- Replaced raw <select> elements with SelectDropdown variant="ghost"
to match the Explorer page toolbar style (ghost text buttons with
chevron and dropdown menus)
* fix: match ObjectExplorerPage sidebar exactly to Explorer page
- Added draggable resize handle between panels (same style as
Explorer: w-1 cursor-col-resize, bg-border/20, hover/accent)
- Panel width is now resizable (180–500px, double-click resets to
280px, same as tablePanelWidth)
- Changed list row gap from gap-2 to gap-1 and py-1.5 to py-1
so list items match TableTree row sizing exactly
- Removed py-1 from the scrollable list container so the first
item sits flush against the toolbar border (matching TableTree)
- Fixed dropdown separator: gap-3→gap-2, removed text-sm from |
(now identical to Explorer toolbar dropdown spacing)
* fix: handle overloaded PostgreSQL functions in object explorer
PostgreSQL supports function overloading — same name, different
argument types. The old code used bare name as React key and for
selection comparison, causing:
- Multiple overloads sharing the same key → rendering glitches
(looked like 'duplicate instances' or missing items)
- Clicking one overload highlighted ALL overloads with that name
Changes:
- itemKey(): unique key using name(arg_type1,arg_type2) for
functions, bare name for other object types
- itemLabel(): display name with argument signature for functions
with args (e.g. 'calculate_tax(numeric, integer)')
- Selection comparison uses itemKey equality instead of name
- Search now matches against the full label (name + args)
- Detail view header shows the full label
* feat: card-based detail views with border separators for all object types
Redesigned detail views to match the Explorer page aesthetic:
Functions:
- Signature card: Returns, Language, Kind, Schema in border-separated rows
- Arguments card: each arg shown as 'name: type' with OUT/VARIADIC mode badges
- Source card: header bar with language label, bordered code block
Triggers:
- Details card: Table (schema-qualified), Event, Timing+Orientation,
Status (color-coded enabled/disabled), Schema
- Definition card with SQL code block
Sequences:
- Compact card: Current Value (highlighted), Increment, Start,
Min/Max (combined row), Cycle (amber/neutral)
Enums:
- Details card with schema
- Values card with label count, pill badges in rounded-md style
Extensions:
- Card with Version, Schema, optional Comment
Shared: Source code now has bg-surface-raised, rounded-lg, border,
better padding (p-4), and longer default truncation (800 chars).
Removed unused DetailRow helper.
* feat: syntax-highlighted line-numbered source code + flat border layout
SyntaxCode:
- Tokenizes PL/pgSQL/SQL: keywords (blue), types (emerald),
strings (amber), comments (subtle italic), numbers (purple),
operators (muted)
- Handles dollar-quoted strings (26325...26325 / $tag$...$tag$),
single-quoted strings with escape (''), -- line comments,
/* block comments */
- Line numbers on the left with border-r separator
- Hover row highlight (bg-surface/30)
- Collapsed by default at 60 lines with 'Show all N lines…'
toggle; expand/collapse button
Flat border layout (matching Explorer table viewer):
- All cards (rounded-lg border bg-surface overflow-hidden)
replaced with plain divs using border-b border-border rows
- Section headers use same border-b + tracking-wider style as
the data grid column headers
- Each field row: px-4 py-2 flex with 24/28px label column
- Source code uses bg-canvas (lets app bg show through)
- No space-y-4 gaps or card wrappers — clean flat aesthetic
* fix: infinite loop in tokenizer + memoize syntax highlighting
- Added catch-all fallback for unrecognized characters (non-ASCII,
unicode, symbols) that weren't matched by any tokenizer branch,
causing an infinite loop and app hang
- Wrapped tokenization in useMemo to avoid re-tokenizing on every
render (source and expanded state as deps)
- Pre-tokenize all visible lines at once instead of per-line in
the render loop
- Added explicit type annotations to fix TS7022/TS7024 errors
* fix: horizontal scroll for long source lines in SyntaxCode
Changed the <pre> wrapper from block to inline-block min-w-full
so it grows past the viewport width when lines are long, enabling
the outer overflow-x-auto to kick in. Added overscroll-x-contain
for smoother scroll behavior on macOS.
* fix: proper horizontal scroll containment for source code
- Right panel: overflow-x-hidden prevents code content from
pushing the entire panel past the viewport
- SyntaxCode pre: whitespace-pre on the pre itself (not just
inner spans) so long lines stay on one line
- Removed inline-block min-w-full hack on the pre — instead
the outer overflow-x-auto div clips and scrolls
- Removed unused overscroll-none class
* fix: horizontal scroll containment in object explorer detail view
- Removed overflow-x-hidden from right panel (was clipping
scrollbars and preventing proper scroll context)
- Added max-w-full overflow-x-auto on the detail content wrapper
so long lines scroll within the content area instead of pushing
the entire panel
- Added w-max min-w-full on the SyntaxCode pre so it grows to
fit content while the parent overflow-x-auto clips and scrolls
* fix: use w-0 overflow-x-hidden pattern to constrain right panel width
The Explorer page uses 'flex-1 w-0 min-w-0 overflow-hidden' on the
right panel. Without w-0, the flex item can expand past its
allocated share when content is wider. Adding w-0 forces the
initial width to zero so the panel can only grow via flex
allocation, not from content pressure.
Detail content wrapper uses inline overflowX: auto + width: 100%
to create the scroll context for the SyntaxCode pre.
* fix: add overscroll-x-none to source code scroll container
* style: refine object explorer page layout and detail views
* fix: replace enum pill badges with bordered row list
Enum values now display as numbered rows with border-b border-border,
matching the Arguments section style exactly. Each value shows a #N
index in muted mono + the label in accent mono, consistent with how
argument names and types are displayed.
* docs: update implementation status in AGENTS.md and README.md
Object Explorer (formerly all ❌ stubs):
- Functions: ✅ detail view, syntax highlighting, overload support
- Triggers: ✅ detail view, tgtype bitmask fix, definition display
- Sequences: ✅ detail view, schema-filtered
- Enums: ✅ bordered row list matching Arguments style
- Extensions: ✅ detail view, DB-scoped query
Database Viewer:
- Column filtering/sorting: now server-side (was client-side)
Backup & Restore (formerly all ❌):
- pg_dump/pg_restore wrappers: ✅ with progress events
- Backup/Restore/Sync UI: ✅ in-page views with event-driven status
README roadmap: Phases 3 & 5 marked complete
* fix: SQLite data rows showing null for non-text columns
The SQLite branch of get_table_data always read row values as
Option<String>, which silently failed for INTEGER, REAL, and other
non-text types — returning Null for every non-text column.
Added sqlite_value_to_json() that uses rusqlite's ValueRef enum
(Null/Integer/Real/Text/Blob) to properly convert each column to
the correct serde_json::Value type. Applied to all three query
branches (unfiltered, filtered, and FK preview).
* fix: handle PostgreSQL ENUM and USER-DEFINED types in table viewer
- pg_value_to_json: added robust String fallback that catches enum
values and any other custom/user-defined types not matched by
the specific type checks (i32, i64, f64, bool, uuid, etc.)
- pg_columns_query: replaced bare c.data_type with CASE WHEN
c.data_type = 'USER-DEFINED' THEN c.udt_name ELSE c.data_type
so enum columns show their actual type name (e.g. badge_category)
instead of 'USER-DEFINED'
- The get_table_data inline column query already had this fix;
now pg_columns_query in introspection.rs matches
* fix: cast PostgreSQL custom/enum columns to ::text in data query
tokio-postgres FromSql<String> rejects custom type OIDs (enums,
composite types, domains) even under simple query protocol where
all values arrive as text. This caused all enum column values to
display as NULL.
Fix: dynamically build the SELECT column list by inspecting the
column metadata. For standard PostgreSQL types (int4, text, bool,
jsonb, etc.) use the bare column name. For anything else (custom
enums, domains), append ::text so the value reaches the client as
a regular text column that FromSql<String> accepts.
* chore: replace app icons with 1024x1024 Default variant (proper padding)
* chore: fix Rust warnings — unused import and unnecessary mut
- Removed unused pub use backup::* from models/mod.rs (backup
types are imported directly via crate::models::backup::*)
- Removed unnecessary mut on filter_params in db_viewer.rs
* chore: bump v0.2.0 + update docs status
AGENTS.md:
- Virtualized data grid: ❌ → ✅ (row-level virtualization
via @tanstack/react-virtual)
- Column metadata: noted ENUM/custom type resolution and ::text
casting for data retrieval
Version bump: 0.1.0 → 0.2.0 across package.json, tauri.conf.json,
and Cargo.toml
* docs: update README features to reflect current implementation
Rewrote aspirational sections with accurate current-state descriptions:
Object Explorer:
- Removed Indexes & Constraints (not yet implemented)
- Added syntax highlighting, line numbers, overload support for Functions
- Clarified Extensions are view-only (no enable/disable toggling yet)
SQL Editor & Query Workbench:
- Removed Monaco, autocomplete, formatter, history (not yet built)
- Kept what's real: multi-tab workspace, changes queue, smart sort
- Added 'coming soon' note
Data Grid:
- Removed inline editing, visual filter builder, import (not yet built)
- Added what's real: server-side filtering, FK preview, JSON viewer
Admin Tools:
- Updated backup/restore/sync descriptions to match actual UI
- Removed aspirational 'drag-and-drop', 'dry-run', 'diff viewer'
Tech Stack:
- Monaco marked as planned; Glide removed (we use TanStack Virtual)
* chore: configure Tailwind, Vitest, Rust deps, dialog plugin (Task 1)
* feat: shared types and validation/filter utilities (Task 2)
* feat: Rust models, SQLite store, and migrations (Task 3)
* feat: Tauri commands for connections and folders (Task 4)
* feat: tag, settings, import/export Tauri commands (Task 5)
* feat: frontend command wrappers and Zustand stores (Task 6)
* feat: useSearch debounce and useFilteredConnections hooks (Task 7)
* feat: App view router with load-on-mount (Task 8)
* feat: UI primitives Button, Input, Badge, Card (Task 9)
* feat: SearchBar, ActionRow, ImportExportMenu (Task 10)
* feat: ConnectionCard, ConnectionGrid, TagBadge (Task 11)
* fix: resolve TypeScript errors across utils, Input, and test files
* feat: FolderTree, CreateFolderDialog, NewConnectionForm, SettingsPage, HomeScreen (Task 12)
* feat: Tauri file dialog integration for import/export (Task 13)
* feat: error/loading states and full App router integration (Task 14)
* chore: final integration gate — full test + build green (Task 15)
* fix: move folders inline, rearrange ActionRow layout, add borders to buttons
* feat: upgrade to Tailwind v4, apply new color palette
* Landing page restyle, folder explorer, selection/delete, and icon update
- Black-and-white color scheme with blue accent
- Glassmorphic New Folder modal with auto-parent
- Nested folder explorer with breadcrumb navigation
- Folder/connection selection with hover checkboxes
- Select All / Clear Selection / Delete dropdown
- Delete reparents children to parent folder
- Fixed Rust serde camelCase mismatch (models now use snake_case)
- Updated app icons from Apple Icon Composer exports
- Search bar with ⌘K badge
- Button styling: rounded pills, borders, cursor-pointer
- Prevent drag selection across app
* Tag system, folder edit/delete, searchable tag picker, delete confirmation, tag reordering
- Added folder_tags table for folder-tag associations
- Tags now show configured colors on folder and connection cards
- Searchable tag picker with text filtering in New/Edit Folder dialogs
- Edit Folder dialog with name and tag management
- Edit/Delete buttons next to breadcrumb with icons
- Delete confirmation dialog with reparenting notice
- Tag reordering in Settings with up/down buttons, persisted via tag_order setting
- useSortedTags hook for consistent tag ordering
- Cmd+K focuses search input
- Selection dropdown simplified to Select All/Clear/Delete
- Click-outside closes all dropdowns
- cursor-pointer on all interactables
* deps: install motion for animations
* feat(types): add system theme option
* feat(settings): default stored theme to system
* feat(ui): add Toggle primitive
* feat(ui): add Select primitive
* feat(ui): add SettingsRow and SettingsSection primitives
* fix(ui): improve SettingsRow and SettingsSection quality
* feat(ui): add ThemePicker primitive
* feat(ui): add AnimatedModal primitive with motion
* refactor(dialogs): use AnimatedModal for enter/exit animations
* fix(dialogs): ensure exit animations and Escape handling work with AnimatedModal
* feat(settings): redesign page with multi-section layout
* refactor(settings): split tabs, improve accessibility and animation
* fix(tauri): set window background color to dark canvas
* fix(settings): remove fake traffic lights, add header background, transparent title bar
* fix(settings): move Back into sidebar, add Settings heading, dynamic window title
* fix(tauri): show native window title so Home/Settings labels are visible
* fix(ui): disable overscroll on both axes
* test(dialogs): verify CreateFolderDialog shows and saves tags
* chore: ignore .worktrees directory
* refactor: centralize db type icons and labels
* feat: add connection string parser and detection
* test: add edge cases for connection string parser
* fix: preserve absolute paths in SQLite connection strings
* types: add new connection form fields
* feat: add folder path label helper
* test: cover missing folder in path label helper
* feat: add stub connection string parse and test commands
* feat: add stub test connection command
* feat: add new connection form primitives
* feat: add connection form shell
* feat: add shared form type and simple connection form
* fix: keep SimpleConnectionForm fully controlled
* style: format and tighten types for simple connection form
* feat: add detailed connection form
* fix: export DetailedConnectionFormProps and assert port update
* feat: add new connection screen container
* fix: clean up useEffect dependencies in new connection screen
* fix: address quality feedback on new connection screen
* feat: wire new connection screen into app and remove old form
* feat: open new connection screen from pasted db url in search
* test: add home search URL shortcut integration test
* refactor: replace FolderSelect and EnvironmentSelect with shared SelectDropdown
Add a reusable SelectDropdown component that keeps the select-styled
trigger while using the ActionRow-style popover menu. Update both
FolderSelect and EnvironmentSelect to use it.
* refactor: remove db type icon and label from connection form shell
Drop DbTypeHeader and the db_type prop from ConnectionFormShell so the
form header no longer displays the database icon/type. Update
NewConnectionScreen and its test accordingly.
* feat: home screen redesign and connection form updates
- Redesign HomeScreen layout and settings page
- Update connection card, grid, and simple form
- Replace selects with SelectDropdown component
- Remove DbTypeHeader from connection form
- Fix tests to match updated components
* fix: hide folders during search, update placeholder, and set window titles
- ConnectionGrid now hides folders when hasSearch is true so only
matching connections are shown.
- SearchBar placeholder now mentions typing a database URL to create
a new connection.
- App window titles set to Gridline (home), Settings, and New Connection.
* fix: shorter placeholder, dynamic window title, and startup flash
- Shorten SearchBar placeholder to mention DB URL creation concisely.
- Add core:window:allow-set-title permission and set document.title so
the window title updates per view (Gridline, Settings, New Connection).
- Add inline dark background style to index.html to prevent white flash
before CSS loads.
* feat: extend connection models with SSH/SSL/database fields, add db_viewer models (Task 1a)
* feat: extend frontend types with SSH/SSL fields and DB viewer types (Task 1b)
* feat: migrate connections table with SSH/SSL columns (Task 1c)
* chore: add new Rust dependencies (tokio, sqlx, redis, ssh2, indexmap, etc.) for Phase 2
* feat: connection pool manager with LRU eviction (Task 2a)
* feat: schema introspection query builders for PG, MySQL, SQLite (Task 2b)
* feat: test connection command (all 4 DB types) and SSH tunnel manager (Task 2c)
* feat: db viewer Rust commands and AppState refactor (Task 2d)
* feat: frontend command wrappers for DB viewer and updated validation (Task 3a)
* feat: dbViewer store with tabs, changes queue, pagination; uiStore activeConnectionId (Task 3b)
* feat: ConnectionCard navigates to DB Viewer, App routes to DbViewerScreen (Task 3c)
* feat: tooltip UI primitive (Task 4a)
* feat: SSH/SSL form tabs in DetailedConnectionForm (Task 4b)
* feat: DbViewerScreen shell with sidebar navigation (Task 4c)
* feat: toolbar, table tree, and overflow menu (Task 4d)
* fix: align TableInfo interface between frontend types and test files
* feat: tab bar, data grid, and pagination controls (Task 4e)
* feat: changes queue panel with cancel per change (Task 4f)
* feat: wire real IPC connect/disconnect/load in DbViewerScreen (Task 5a)
* feat: error banner, guard dialogs for destructive actions (Task 5b)
* feat: changes queue commit all with per-change IPC and error handling (Task 5c)
* chore: suppress expected dead-code warnings during multi-phase development
* fix: wire ConnectionCard click through to DB Viewer (HomeScreen -> ConnectionGrid -> ConnectionCard -> App route)
* fix: click connection opens DB viewer when nothing selected, toggles selection when items already selected; fix delete connections + generic confirm message
* fix: align ConnectionTestResult field name (ok vs success) and fix testConnection invoke param name (input vs config) to match Rust backend
* feat: implement DB Viewer Tauri commands (db_connect, get_databases, etc.)
* fix: align DB viewer IPC param names (snake_case), implement execute_change + refresh_connection, snake_case Change enum tags
* fix: use camelCase IPC keys for multi-word Tauri command params (Tauri v2 converts snake_case Rust -> camelCase)
* fix: surface full postgres error detail and redact credentials instead of opaque 'db error'; URL-encode pg connection strings
* fix: cache passwords per-session so saved connections can auto-connect; surface full postgres error detail
* fix: auto-fetch table data, full-row click, fill viewport, load columns on expand, database switching
* fix: align ColumnInfo/QueryResult types with Rust backend (columns=ColumnInfo[], rows=unknown[][], field names match)
* feat: truncate cell text, resizable columns with drag handles, tab bar no-wrap horizontal scroll
* fix: QueryResult uses total_rows/page/page_size (match Rust), brighter table borders, pagination NaN fix
* fix: table horizontal scrolling, viewport fills screen height (h-screen), remove clipping overflow-hidden
* fix: constrain layout to viewport with overflow-hidden on content column; flex-1 fills height; sidebar+grid scroll independently
* fix: move overflow-hidden down to grid wrapper so DataGrid scrollbars surface properly
* fix: add min-w-0 to DataGrid wrapper so flexbox allows shrinking for horizontal scroll
* fix: add overflow-hidden to flex row and right column to clip at viewport, DataGrid scrolls inside
* fix: use w-0 on right column to force width:0 flex-basis, preventing any content-based expansion
* fix: overscroll-contain on DataGrid and TableTree scroll areas to prevent bounce
* fix: inline overscroll-behavior:none + WebkitOverflowScrolling:auto for reliable macOS bounce prevention
* feat: page-size selector (50/100/200) in pagination bar, setPageSize resets to page 1 and triggers re-fetch
* fix: column resize with refs, FK cell click opens table with filter, vertical borders, tooltip positioning (right/bottom), sidebar transparent bg
* fix: sidebar bg-canvas, remove overflow-hidden from toolbar parent so dropdown tooltips aren't clipped
* chore: rename sidebar label from DB Viewer to Explorer
* feat: resizable table panel (180-600px) with drag handle on right edge
* feat: double-click panel resize handle resets to default 280px
* feat: column visibility dropdown in filter bar, max column width 800px, double-click resets column width
* fix: enforce column width on th cells, remove min-width:100% so columns stay at set width instead of stretching
* fix: removable resize handle always clickable (remove opacity-0), maxWidth+overflow on th/td to prevent column blowout
* feat: add environment label to connections (production/staging/development) with badge on cards
* feat: OS keychain integration for connection passwords via tauri-plugin-keyring-store
* style: monospace font for table data cells
* style: use Space Mono (font-heading) for table data cells
* feat: unified table controls bar (insert, refresh, auto-refresh, filter modal, sort modal, export, columns, pagination); fix pagination setPage not clearing data
* fix: auto-refresh defaults to off, click opens dropdown to pick interval
* fix: pagination/refresh keeps existing data visible, shows subtle loading bar instead of blank
* fix: new tabs start with loading:true so auto-fetch triggers instead of stuck on 'loading table data'
* feat: checkbox column for row selection (header=all, row=individual, selected state tracks indices)
* feat: selected row count in toolbar with clear button
* feat: bulk actions dropdown on selection (Copy JSON, Copy CSV, Copy SQL INSERT, Delete rows)
* docs: add changes-queue-before-execution rule to AGENTS.md guardrails
* docs: broaden CRUD guardrail to cover all destructive operations (DB data via queue, app entities via confirm dialog)
* feat: auto-create demo SQLite DB on first launch with sample e-commerce schema (users, products, orders, order_items)
* fix: demo DB startup panic (state before manage), add settings: re-add demo, table refresh rate, table page size
* feat: Cmd+W closes tab or navigates home, edit connection modal with update_connection backend, action queue button with count badge and dropdown
* fix: columns button icon-only, wire settings.table_page_size and table_refresh_rate to actual table behavior
* feat: shortcuts settings tab showing all keyboard shortcuts (Cmd+K, Cmd+W, Esc, Enter, Space, click, header checkbox)
* feat: editable keyboard shortcuts - click pencil to record new keybinding, persisted to settings, useShortcut hook for dynamic binding
* feat: add Tags & Env tab to edit connection modal (environment, folder, tag picker)
* feat(db-viewer): UX polish - cursor pointers, icon-only toolbar, top border
- Add cursor-pointer to all interactive elements across db-viewer components
- Simplify TableControls: Filter/Sort/Export show icons only with tooltips
- Add border-t to DbViewerScreen for visual separation from window frame
* fix(db-viewer): style EditConnectionModal, fix test connection, working refresh button
- Match EditConnectionModal styling to home screen modals (AnimatedModal, Button, no dividers)
- Fix test connection sending null password by fetching from keychain first
- Make refresh database button functional with success/error visual feedback and spin animation
* feat(db-viewer): compact ghost-style DB/schema dropdowns in single row
- Add variant prop to SelectDropdown (pill | ghost) for minimal text-only style
- Place DB and schema dropdowns side-by-side on one row with | separator
* fix(db-viewer): proper FK/enum detection and improved schema tree display
Rust backend:
- PostgreSQL: fix column query to detect FKs (was hardcoded false) and map
USER-DEFINED types to udt_name for enum display
- SQLite: use PRAGMA table_info for types/PK/NOT NULL/defaults and
PRAGMA foreign_key_list for FK detection
Frontend:
- FK columns show orange key icon in TableTree
- Data type abbreviations (varchar, int, bool, timestamptz, etc.) with
full type name on hover tooltip
- Column icons use shrink-0 to maintain size
* feat(db-viewer): PK/FK icons and shorthand types in DataGrid headers
* fix(db-viewer): fix NULL values for UUID and timestamp columns, FK underline style
- Add uuid::Uuid, chrono types to pg_value_to_json chain so UUID PKs/FKs
and timestamp columns display correctly instead of NULL
- Enable with-serde_json-1 feature on tokio-postgres
- Change FK cell styling from blue text to dotted underline
* feat(db-viewer): FK preview popover with inline filter
- Replace direct FK navigation with popover showing the referenced row
- New get_fk_preview Rust command fetches single row by column value
- FkPreviewPopover component displays columns with PK/FK icons
- 'Open' button creates filtered tab, visible in existing Filter UI
- Consolidate columnFilter into filterRules (no duplicate filter logic)
* feat(db-viewer): selectable cell text, JSON/JSONB popover with formatted/raw views
- Add select-text to cell contents for copy support
- New JsonCellPopover component with Formatted/Raw tabs and copy button
- JSON/JSONB columns show brief preview ({ N keys } / [ N items ])
- Click JSON cells to open popover with pretty-printed or raw output
* feat(db-viewer): smart default sort adds newest-first sorting automatically
- 12-tier priority system detects recency/ordering columns
- Prefers updated_at, created_at, *_at suffixes, last_* prefixes
- Falls back to timestamp types, numeric IDs, sequence/position cols
- Also covers rank, version, count/quantity columns
- Applied once per tab, visible in Sort dropdown for manual override
* feat(db-viewer): search tables input with slide animation and tree filtering
- Search icon in toolbar toggles animated input with slide-down effect
- Filters TableTree by table name as user types
- Clean border-bottom styling, search icon on left, X clear on right
- Auto-hides on blur when empty, stays when content present
- Search icon highlights when active
* docs: add comprehensive implementation status to AGENTS.md
- Status matrix across 6 areas: connections, home, db viewer, object explorer, query editor, backup/restore, settings, onboarding
- Covers 60+ features with ✅/🟡/❌ markers and details
- Identifies remaining work: query editor, object explorer, virtualized grid, MySQL browsing, SSH tunnels, backup/restore