A native macOS PostgreSQL GUI client — fast, keyboard-friendly, DataGrip-inspired.
Built with Wails v2 (Go + React/TypeScript) so it ships as a single binary with no Electron overhead.
The tools in this space are genuinely good — this isn't a list of complaints, it's an explanation of a gap. Each of the popular clients is excellent at what it does, but none of them is, at the same time, beautiful, easy to use, open-source, and focused on the everyday needs of a developer or DevOps engineer:
- DataGrip — beautiful, powerful, and the UX reference Snowy admires. But it's commercial: the free tier is non-commercial only, so it can't be used at work without a paid license. Being a full multi-database IDE, it's also heavier than most people need for daily Postgres work.
- pgAdmin — the open-source standard, and comprehensive. But it's heavy, its web-app UX feels dated, and most of its surface area (server administration, dashboards, backup tooling) is rarely touched in a developer's day-to-day.
- Postico 2 — a lovely, native macOS app with great taste. But it's commercial software, and the free tier is limited enough that real use needs a paid license.
- Navicat for PostgreSQL — feature-rich and polished. But it's proprietary and expensive, priced for teams rather than an individual developer.
- TablePlus — fast and gorgeous, arguably the closest in spirit. But it's closed-source and the free tier is deliberately limited (open-tab and connection caps); unlocking it is a paid license.
- DBeaver — free, open-source, and supports every database under the sun. But that universality is the cost: it's a large Java/Eclipse application, and its broad, do-everything UI isn't a focused Postgres experience. The polished extras live in the paid Pro edition.
For the terminal-inclined, psql and pgcli are excellent and free — but they're CLI tools, not a GUI for browsing structure and eyeballing result sets.
So the gap is real: a client that is beautiful, easy to use, open-source, and covers the core features a developer or DevOps engineer reaches for every day — connections, schema browsing, a good SQL editor with autocomplete, readable results, history, and saved queries — without the weight, the license wall, or the everything-and-the-kitchen-sink surface area. That's why Snowy exists.
- Connection manager — add, edit, duplicate and delete PostgreSQL connections; per-connection environment tags (local / dev / staging / prod); test connection before saving
- Schema explorer — lazy-loading sidebar tree: datasources → schemas → tables → columns · keys · foreign keys · indexes · checks
- Query editor — CodeMirror SQL editor with syntax highlighting and DB-aware autocomplete (schemas, tables, columns, functions, keywords)
- Results panel — tabular grid with pinnable result tabs, row/duration counters, CSV export
- Query history — per-datasource execution log, click to restore any previous query
- Saved queries — save
.sqlfiles per datasource; rename and delete from the sidebar - Multiple consoles — open as many query tabs as needed, each with its own dirty-state tracking
- macOS (primary target)
- Go 1.26+
- Node.js 18+
- Wails v2 —
go install github.com/wailsapp/wails/v2/cmd/wails@latest - PostgreSQL (local or remote) — a Docker demo DB is included
# Clone
git clone https://github.com/nkcoder/snowy.git && cd snowy
# Install frontend dependencies
cd frontend && npm install && cd ..
# Start in dev mode (hot-reload)
wails devThe app opens automatically. Point it at any PostgreSQL instance using the connection manager.
A pre-seeded PostgreSQL instance with sample tables (users, accounts, transactions, audit_logs) is included for development:
docker compose -f docker/docker-compose-postgresql.yml up -d
# postgres://myuser:mypassword@localhost:5432/mydatabasewails build
# Output: build/bin/snowy.app# Frontend unit tests (vitest)
cd frontend && npm run test
# Backend unit tests
go test .
# Backend integration tests (requires demo DB running)
TEST_DB_URL=postgres://myuser:mypassword@localhost:5432/mydatabase go test .
# E2E tests (Playwright — starts Vite dev server automatically)
npx playwright testsnowy/
├── main.go # Wails bootstrap
├── app.go # All Go→frontend bindings
├── config.go # Connection config (~/.snowy/config.json)
├── db_service.go # PostgreSQL introspection + query execution
├── query_service.go # Saved queries (~/.snowy/queries/)
├── history_service.go # Query history (~/.snowy/history/)
├── frontend/
│ └── src/
│ ├── App.tsx # Root component + app state
│ ├── components/
│ │ ├── Sidebar.tsx # Schema explorer tree
│ │ ├── QueryEditor.tsx # CodeMirror editor
│ │ ├── ConnectionManager.tsx # Datasource CRUD
│ │ ├── ResultsPanel.tsx # Results grid + tabs
│ │ └── HistoryDrawer.tsx # Query history panel
│ └── lib/tokens.ts # Design token system
├── e2e/ # Playwright specs
├── spec/design/ # UI design references
└── docker/ # Demo PostgreSQL setup
| Layer | Technology |
|---|---|
| Desktop shell | Wails v2 |
| Backend | Go 1.26, pgx v5 |
| Frontend | React 19, TypeScript, Tailwind CSS |
| Editor | CodeMirror 6 |
| Unit tests | vitest + Testing Library (frontend), Go test (backend) |
| E2E tests | Playwright |
