{"id":48385564,"url":"https://github.com/frkdrgt/ferox","last_synced_at":"2026-04-05T22:01:18.977Z","repository":{"id":344843798,"uuid":"1183262516","full_name":"frkdrgt/ferox","owner":"frkdrgt","description":"A blazing-fast PostgreSQL client built in Rust. No Electron. No JVM. No bloat.","archived":false,"fork":false,"pushed_at":"2026-03-23T10:16:26.000Z","size":401,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-24T06:02:18.008Z","etag":null,"topics":["database-client","database-gui","datagrip-alternative","dbeaver-alternative","egui","lightweight","postgres","postgresql","rust","sql-client","tokio"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/frkdrgt.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-16T12:40:42.000Z","updated_at":"2026-03-23T10:16:29.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/frkdrgt/ferox","commit_stats":null,"previous_names":["frkdrgt/ferox"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/frkdrgt/ferox","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frkdrgt%2Fferox","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frkdrgt%2Fferox/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frkdrgt%2Fferox/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frkdrgt%2Fferox/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/frkdrgt","download_url":"https://codeload.github.com/frkdrgt/ferox/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frkdrgt%2Fferox/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31451446,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-05T21:22:52.476Z","status":"ssl_error","status_checked_at":"2026-04-05T21:22:51.943Z","response_time":75,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["database-client","database-gui","datagrip-alternative","dbeaver-alternative","egui","lightweight","postgres","postgresql","rust","sql-client","tokio"],"created_at":"2026-04-05T22:00:56.738Z","updated_at":"2026-04-05T22:01:18.164Z","avatar_url":"https://github.com/frkdrgt.png","language":"Rust","readme":"\u003cdiv align=\"center\"\u003e\n\n```\n███████╗███████╗██████╗  ██████╗ ██╗  ██╗\n██╔════╝██╔════╝██╔══██╗██╔═══██╗╚██╗██╔╝\n█████╗  █████╗  ██████╔╝██║   ██║ ╚███╔╝\n██╔══╝  ██╔══╝  ██╔══██╗██║   ██║ ██╔██╗\n██║     ███████╗██║  ██║╚██████╔╝██╔╝ ██╗\n╚═╝     ╚══════╝╚═╝  ╚═╝ ╚═════╝ ╚═╝  ╚═╝\n```\n\n**A blazing-fast PostgreSQL client built in Rust.**\n*No Electron. No JVM. No bloat.*\n\n[![Build](https://img.shields.io/github/actions/workflow/status/frkdrgt/ferox/release.yml?style=flat-square\u0026logo=github)](https://github.com/frkdrgt/ferox/actions)\n[![Release](https://img.shields.io/github/v/release/frkdrgt/ferox?style=flat-square\u0026color=orange)](https://github.com/frkdrgt/ferox/releases)\n[![License: MIT](https://img.shields.io/badge/license-MIT-blue?style=flat-square)](LICENSE)\n[![Rust](https://img.shields.io/badge/rust-1.75+-orange?style=flat-square\u0026logo=rust)](https://www.rust-lang.org)\n\n\u003c/div\u003e\n\n---\n\n\u003e **Ferox** runs under 50 MB and starts in under 200 ms — because your database client shouldn't be the bottleneck.\n\n---\n\n## Screenshots\n\n| Main editor | Dashboard |\n|:-----------:|:---------:|\n| ![Main screen](screenshots/main_screen.png) | ![Dashboard](screenshots/dashboard.png) |\n\n| EXPLAIN ANALYZE | Join Builder |\n|:---------------:|:------------:|\n| ![Explain](screenshots/explain_screen.png) | ![Join Builder](screenshots/join_builder.png) |\n\n\u003cdiv align=\"center\"\u003e\n\n![Menu](screenshots/main_menu.png)\n\n*Settings → Language for EN/TR switch · Settings → About*\n\n\u003c/div\u003e\n\n---\n\n## Features\n\n### Core\n- **Multi-tab query editor** — Ctrl+T new tab, Ctrl+W close, right-click for Close / Close Others / Close All\n- **Per-table tabs** — clicking a table opens it in its own tab; existing tabs are reused\n- **Schema browser** — lazy-loaded tree: schemas → tables / views / mat-views / foreign tables, live filter\n- **Data browser** — double-click any table or view to browse with server-side pagination \u0026 ORDER BY\n- **Inline editing** — double-click a cell to edit, Enter to commit, Escape to cancel\n- **Persistent query history** — last 500 queries, searchable, click to reload\n\n### Query Tools\n- **Multi-statement execution** — paste multiple SQL statements separated by `;`, all run in sequence\n- **View DDL** — right-click any view or materialized view → Show DDL\n- **EXPLAIN visualizer** — tree view of query plans with cost, rows, and timing per node; optimization suggestions\n- **Safe mode transactions** — DML wrapped in explicit BEGIN/COMMIT/ROLLBACK\n- **Export** — CSV \u0026 JSON via native OS file dialog (no temp files)\n- **Script generation** — right-click table → Generate SELECT / INSERT / UPDATE / DELETE scripts\n- **Join Builder** — visual multi-table JOIN composer (`Query → Join Builder…`)\n\n### Developer Experience\n- **SQL syntax highlighting** — zero-dependency tokenizer, dark (`base16-ocean.dark`) and light (`InspiredGitHub`) themes\n- **SQL autocomplete** — table names, column names, keywords\n- **Connection profiles** — saved to `~/.config/ferox/config.toml`; SSL modes + SSH tunnel supported\n- **Multiple simultaneous connections** — per-connection sidebar, tabs, and DB threads\n- **ER diagram** — visual schema relationship viewer with FK arrows, pan/zoom, draggable nodes\n- **Database dashboard** — table sizes, index stats, active connections with kill support\n- **F5 / Ctrl+Enter** to run, **Ctrl+C** to cancel mid-query\n- **EN / TR localisation** — full bilingual UI; language choice persists to config\n\n---\n\n## Performance\n\n| Metric | Ferox |\n|--------|-------|\n| RAM at idle | **~45 MB** |\n| Cold startup | **\u003c 200 ms** |\n| Binary size | **~7 MB** |\n\n*Measured on Windows 10, release build with LTO.*\n\n---\n\n## Installation\n\n### Pre-built binaries\n\nDownload the latest release for your platform from the [Releases page](https://github.com/frkdrgt/ferox/releases).\n\n| Platform | File |\n|----------|------|\n| Windows 10+ | `ferox-windows-x86_64.exe` |\n| macOS 12+ (Intel + Apple Silicon) | `ferox-macos-universal` |\n| Linux x86\\_64 | `ferox-linux-x86_64` |\n\n### Build from source\n\n```bash\n# Prerequisites: Rust 1.75+ (https://rustup.rs)\ngit clone https://github.com/frkdrgt/ferox.git\ncd ferox\ncargo build --release\n```\n\nBinary lands at `target/release/ferox` (or `ferox.exe` on Windows).\n\n---\n\n## Quick Start\n\n1. Launch Ferox\n2. **Connection → New Connection…** — enter host, port, user, password, database\n3. Toggle SSL if needed (`prefer` works for most setups)\n4. Hit **Connect** — schema tree loads on the left\n\n### Running a query\n\nType SQL in the editor, press `F5` or `Ctrl+Enter`.\n\n```sql\nSELECT u.name, COUNT(o.id) AS orders\nFROM users u\nLEFT JOIN orders o ON u.id = o.user_id\nGROUP BY u.name\nORDER BY orders DESC;\n```\n\nOr use the **Join Builder** (`Query → Join Builder…`) to construct joins visually.\n\n### Keyboard shortcuts\n\n| Shortcut | Action |\n|----------|--------|\n| `F5` / `Ctrl+Enter` | Run query |\n| `Ctrl+C` | Cancel running query |\n| `Ctrl+T` | New tab |\n| `Ctrl+W` | Close tab |\n| `Ctrl+Tab` | Next tab |\n| `Ctrl+Shift+Tab` | Previous tab |\n| `F5` (sidebar focused) | Refresh schema tree |\n\n---\n\n## Configuration\n\nProfiles are stored automatically:\n\n| Platform | Path |\n|----------|------|\n| Windows | `%APPDATA%\\ferox\\config.toml` |\n| macOS / Linux | `~/.config/ferox/config.toml` |\n\n```toml\n[[connections]]\nname     = \"prod-readonly\"\nhost     = \"db.example.com\"\nport     = 5432\nuser     = \"analyst\"\npassword = \"\"        # leave empty to prompt\ndatabase = \"warehouse\"\nssl      = \"require\"\n\n[language]          # \"en\" or \"tr\"\nlanguage = \"en\"\n```\n\nQuery history lives at `~/.local/share/ferox/history.txt` (max 500 entries).\n\n---\n\n## Architecture\n\nFerox is deliberately simple. Two threads, zero shared mutable state between them:\n\n```\n┌─────────────────────────────────────┐\n│         UI Thread (eframe)          │\n│  egui immediate-mode rendering      │\n│  sidebar · tabs · join builder      │\n└──────────┬────────────┬─────────────┘\n           │ DbCommand  │ DbEvent\n           ▼            ▼\n┌─────────────────────────────────────┐\n│         DB Thread (tokio)           │\n│  tokio-postgres · native-tls        │\n│  async queries · metadata loading   │\n└─────────────────────────────────────┘\n```\n\nAll DB communication goes through `mpsc` channels — the UI thread never blocks.\n\n---\n\n## Tech Stack\n\n| Role | Crate |\n|------|-------|\n| GUI framework | [`egui`](https://github.com/emilk/egui) + `eframe` |\n| Table widget | `egui_extras` |\n| PostgreSQL driver | [`tokio-postgres`](https://github.com/sfackler/rust-postgres) |\n| Async runtime | `tokio` (current-thread in DB thread) |\n| TLS | `native-tls` + `postgres-native-tls` |\n| SSH tunnel | `russh` |\n| SQL highlighting | custom zero-dependency tokenizer (`src/ui/syntax.rs`) |\n| Config | `serde` + `toml` |\n| File dialogs | [`rfd`](https://github.com/PolyMeilex/rfd) |\n\n---\n\n## Roadmap\n\n- [x] **Auto-complete** — table names, column names, SQL keywords\n- [x] **Database dashboard** — table sizes, index bloat, active connections\n- [x] **Multiple simultaneous connections** — separate DB threads per connection\n- [x] **SSH tunnel** — connect through a jump host\n- [x] **ER diagram** — visual schema relationships\n- [x] **Multi-statement queries** — run multiple statements separated by `;`\n- [x] **View DDL** — right-click any view or materialized view to see its definition\n- [x] **Safe mode transactions** — explicit BEGIN/COMMIT/ROLLBACK for DML\n- [x] **Join Builder** — visual multi-table JOIN composer\n- [x] **EN/TR localisation** — full bilingual UI, language persists to config\n- [x] **Settings \u0026 About** — Settings menu with language switcher and About dialog\n- [x] **Test Connection** — verify credentials before connecting, from the connection dialog\n- [x] **Close connection** — disconnect and remove a connection from the sidebar with one click\n- [x] **Connection status indicators** — color-coded dots replacing broken emoji squares on Windows\n- [ ] **Ctrl+A** select-all in query editor\n- [ ] **Bookmarked queries** — save \u0026 name frequently used SQL\n- [ ] **Dark / light theme toggle** — runtime switch\n- [ ] **Result diff** — compare two query results side-by-side\n- [ ] **CSV / JSON import** — drag-and-drop data into a table\n\n---\n\n## Contributing\n\nBug reports, feature requests, and pull requests are welcome.\n\n```bash\n# Run against a local Postgres\ndocker run -d -p 5432:5432 -e POSTGRES_PASSWORD=test postgres:16\n\n# Dev build (faster compile, debug symbols)\ncargo build\n\n# Integration tests (requires Postgres on localhost:5432)\ncargo test --test integration\n```\n\nPlease keep the UI thread non-blocking and all DB work behind `DbCommand` / `DbEvent`.\nSee `CLAUDE.md` for architecture notes.\n\n---\n\n## How This Was Built\n\nThis project is an experiment in **vibe-coding** — writing software primarily through conversation with an AI, rather than typing code by hand.\n\nEvery line of Rust in this repository was generated by [Claude](https://claude.ai) (Anthropic) via [Claude Code](https://github.com/anthropics/claude-code). Every commit was authored through an AI session. The developer's role was to define what to build, review what came out, and decide what to do next — not to write the code itself.\n\n### Why be upfront about this?\n\nBecause it matters. If you're evaluating this project — as a tool, as a reference, or as a hiring signal — you deserve to know how it was made. Passing this off as hand-crafted Rust would be dishonest.\n\n### What the human actually did\n\n- Chose the goal: a lightweight, native PostgreSQL client as an alternative to DBeaver/DataGrip\n- Picked the stack: `egui`, `tokio-postgres`, `russh` — no Electron, no JVM\n- Defined the architecture: two-thread model, `mpsc` channels, no shared mutable state between UI and DB\n- Wrote the `CLAUDE.md` spec that guided every session\n- Planned each feature phase, reviewed diffs, caught bugs, and made judgment calls\n- Did *not* write the actual Rust\n\n### What Claude actually did\n\n- Wrote all source files from scratch (`src/app.rs`, `src/db/`, `src/ui/`, etc.)\n- Made architectural decisions within the constraints given\n- Debugged compile errors iteratively\n- Kept the codebase consistent across sessions using the `CLAUDE.md` context\n\n### Is the code good?\n\nHonestly: mostly yes, sometimes no. The architecture is clean and the UI thread never blocks. There are places where a seasoned Rust developer would've made different tradeoffs — but it compiles, it runs, and it does what it's supposed to do. It started from zero and grew to a multi-feature desktop app across a handful of sessions.\n\n### The point\n\nThis isn't about whether AI-generated code is \"real\" code. It's about what's now possible when you pair a clear technical vision with a capable AI. Ferox exists because it was cheap enough — in time and effort — to just build the thing.\n\nWhether that's exciting or unsettling probably says something about where you are in your relationship with these tools.\n\n---\n\n## License\n\nMIT — see [LICENSE](LICENSE)\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\n*Built with Rust because life's too short for slow database clients.*\n*Written by Claude because that's just where we are now.*\n\n\u003c/div\u003e\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffrkdrgt%2Fferox","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffrkdrgt%2Fferox","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffrkdrgt%2Fferox/lists"}