The Problem
Database work usually splits across tools: a GUI client for browsing, a separate editor for SQL, another tool for visualizing query plans, and nothing native for handing query context to AI agents. Tabularis tries to collapse that into one desktop app with SQL notebooks, visual EXPLAIN, and a built-in MCP server so AI tools can query your databases directly.
What This Does
Tabularis is a Tauri-based desktop client (Rust backend, React/TypeScript frontend) for PostgreSQL, MySQL/MariaDB, and SQLite. The src/ tree holds the UI and state; src-tauri/ holds the Rust shell; packages/ contains a plugin API and a scaffolding CLI (packages/create-plugin/src/cli.ts) for building drivers and UI extensions. AI features live in src/utils/aiActivity.ts and src/utils/explainPlan.ts (visual EXPLAIN-to-flow rendering).
The repo is a portfolio of five distinct projects: the main app (src/), the Tauri shell (src-tauri/), the plugin tooling (packages/), a demo stack (demo/docker-compose.yml), and CI scripts. Don't look for a single architecture across these—they share conventions but are separate codebases.
How It Is Wired
Execution enters through src/App.tsx, which mounts the React tree. The app is driven by a handful of high-fan-in hooks: useSettings (called from 38 places), useDatabase (36), useAlert (19), and useEditorTheme (12). These are the blast-radius hubs—change their signatures and the whole UI breaks. The module graph confirms this: src/types/editor.ts and src/types/notebook.ts are each imported by ~40 modules and are part of a circular import cycle with src/utils/explainPlan.ts. That cycle means any edit to those types forces a full recompile and risks subtle runtime order bugs.
The heaviest UI files are src/pages/Editor.tsx (1422 lines, nesting depth 11) and src/components/ui/DataGrid.tsx (oversized). ExplorerSidebar.tsx imports 48 modules—it's the wiring hub for the left panel. The call graph shows runQuery is called from 10 places and quoteTableRef from 13, so query execution and identifier quoting are core utilities.
One function reads/writes a database (the driver layer), and one calls a model for inference (the AI feature). The wiring from UI to database is short: a hook like useDatabase feeds a query into runQuery, which goes through the driver. The MCP server path hasn't been mapped in the analysis.
How To Use It
git clone https://github.com/moses-y/tabularis
cd tabularis
npm install # or pnpm install, per package.json
npm run tauri dev # launches the desktop app
For the demo stack: docker compose -f demo/docker-compose.yml up. The plugin CLI is packages/create-plugin/src/cli.ts—run it with node packages/create-plugin/src/cli.ts. No environment variables are documented in the repo for the core app; database credentials are entered through the connection modal.
Real-World Use
A data team runs Tabularis against a shared Postgres instance. An analyst writes a notebook with EXPLAIN on a slow query, sees the visual plan from src/utils/explainPlan.ts, and flags a bad join. A second analyst points an MCP-enabled AI assistant at the same database via the built-in MCP server; the assistant runs splitQueries (in src/utils/sqlSplitter/index.ts) to execute multi-statement SQL safely.
Code Health & Issues
Static analysis (not opinion) found 155 issues: 52 high, 101 medium, 2 low. Key findings:
- High - Import cycle in
src/types/editor.ts,src/types/notebook.ts,src/utils/explainPlan.ts- mutually reachable modules, break the cycle. - High - Hub modules:
editor.tsandnotebook.tshave ~40 dependents each; churn here is expensive. - High - Oversized files:
DataGrid.tsx,NewConnectionModal.tsx,Editor.tsx(1422 lines). - High - Deep nesting (max depth 11) in
Editor.tsx,ExplorerSidebar.tsx,SidebarRoutineItem.tsx. - Medium - High branching density in
identifiers.ts,driverCapabilities.ts,driverUI.tsx.
Security audit found one high: GitHub Actions pinned to tags not commit SHAs (e.g., dtolnay/rust-toolchain@stable), which risks supply-chain compromise. Also: no least-privilege GITHUB_TOKEN permissions, no Dependabot, no dependency scan in CI, and persist-credentials not disabled. A test_ca.pem file in src-tauri/tests/ is flagged as secret-shaped—verify it's a test fixture. Tests exist (163 files), CI runs, and a license is present.
The Bottom Line
Solid scope for a database client: notebooks, visual EXPLAIN, MCP, and a genuinely extensible plugin system. The code works but is heavy in the wrong places—the UI layer needs decomposition before it becomes unmaintainable. Worth using if you want a free, cross-platform client with AI integration and don't mind the rough edges.