Sync version in desktop/package.json, Cargo.toml, tauri.conf.json, the Astro
landing page, version/bundle-config/docs-coverage tests, and both README
download tables. Add v0.7.12 changelog entry.
The Windows runner's act_runner service env still lacks python/python3, so the
release-upload step failed to parse JSON. Use grep to pull the release id,
removing the Python dependency from both upload steps.
Windows installs Python as 'python' (python3 is a Store alias), so the upload
step's python3 JSON parsing failed on the Windows runner. Fall back to 'python'
when python3 is absent.
msvc-dev-cmd sets the env but rustc still resolved link.exe to Git's GNU
coreutils link (C:\Program Files\Git\usr\bin\link.exe), so build-script
linking failed with 'extra operand'. Run the tauri build in a cmd shell that
sources vcvars64.bat so PATH/LIB/INCLUDE point at the real MSVC toolchain in
the same process.
archive.mariadb.org / get.enterprisedb.com downloads are extremely slow from
the self-hosted Windows runner (30-40+ min for the MariaDB zip). Check for a
pre-downloaded copy at C:\ci\cache\ first and copy it, falling back to the
network download only when absent.
rustc resolves link.exe via PATH for the windows-msvc target, but Git for
Windows ships GNU coreutils' link.exe which shadows MSVC's linker, breaking
every build-script link. Add ilammy/msvc-dev-cmd@v1 before the tauri build so
PATH/LIB/INCLUDE point at the real MSVC toolchain (and it fails fast if MSVC
is missing instead of at link time).
The frontend commits edited cell values as plain strings (and PK locators as
numbers/booleans), but tokio-postgres' String binds only text-ish types and
i64 only int8, so editing integer/boolean/uuid/jsonb/… columns failed with
'cannot convert between the Rust type and the Postgres type'.
Introduce PgText — a ToSql impl that accepts any Postgres type and writes the
value as UTF-8 in text wire format so the server parses it into the column's
own type. NULL binds as SQL NULL. Adds the bytes crate and unit tests.
The Recent strip was computed from get().connections which is still empty
while loadAll() is in flight on app startup, so cached recent IDs got
filtered out and the strip could appear empty/flaky until a remount.
loadAll now refreshes recents after connections populate.
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