[Feat]: Explore a native GPUI desktop shell on top of the Rust application core
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 5/5
- Estimated time
- Over a week
- Newbie friendliness
- 35/100
- Issue type
- Feature
- Clarity
- Mostly clear
- Activity status
- Active
- Tech stack
- react, rust, tauri, typescript
- Domain
- backend-api-design, database, desktop
Research direction
Start by reading the architecture split in src-tauri/src/application/ and transport/desktop/, then review the design tokens in packages/web-ui and the constraints described in the linked Tauri post. This issue asks for an RFC and a time-boxed spike covering a connection list and a virtualized result grid; done means maintainers record a yes, later, or no decision and, if exploring, document the spike comparison.
Written by the indexing model from the issue text.
Description
Prerequisites
- I have written a descriptive issue title.
- I have searched existing issues and open pull requests to avoid duplicating an existing feature request. Nothing currently tracks a GPUI / native-Rust UI path.
🚀 Feature Proposal
Treat a native GPUI desktop shell as a first-class long-term option for Tabularis, and start with a spike / RFC rather than a rewrite.
Today the product is already a Rust systems program (src-tauri/src/application/) with a React 19 + Tailwind UI running in a Tauri v2 webview. The proposal is to keep that application core, and explore rendering the desktop workspace — chrome, explorer, SQL editor, data grid, notebooks, visual EXPLAIN, settings — with GPUI instead of the webview.
GPUI is the GPU-accelerated, hybrid immediate/retained UI used by Zed. A practical component layer already exists in GPUI Kit: virtualized tables, a Tree-sitter code editor, dock/split/tab layout, themes, AccessKit, and Lucide icons. Adjacent data tools such as Zedis already ship a GPUI client in this product category.
This is not “three native UIs” (AppKit / WinUI / GTK). It is one Rust UI on macOS, Windows and Linux, talking to the existing application layer without JSON-serializing every result page across Tauri IPC.
Suggested shape:
- Keep
application/as the product. Drivers, tunnels, plugins (JSON-RPC over stdio), MCP, keyring, exports stay where they are. - Keep the current React/Tauri UI as the production desktop (and web) surface until a GPUI shell is actually better.
- Spike a second desktop transport that renders a small slice of the workspace in GPUI (connection list + one result grid is enough).
- Port the design system, not a new product look. Map the tokens and primitives from #195 onto GPUI themes so a native shell still looks like Tabularis.
- Only then decide whether GPUI becomes the default desktop UI, an optional “native” build, or a closed experiment.
Motivation
Andrea already wrote the argument in Why I chose Tauri, and what it cost me:
A database client is a systems program with a UI problem, not a web app with a database problem.
That post also names the bill:
- Three webviews. WKWebView, WebKitGTK and WebView2 disagree about CSS, input and GPU compositing. Linux reports such as #9, #45, #54, #423 are the webview lottery, not Tabularis logic.
- The IPC tax. A
QueryResultofserde_json::Valueis serialized into the webview before React can paint the grid. Paging to 500 rows and streaming exports on the Rust side exist because of that fence. - Native was rejected because it meant three interfaces. GPUI changes that comparison. It is one cross-platform GPU UI in the same language as the core, not Sequel Ace × 3.
A native GPUI shell would also line up with work already happening on the core:
- Query results, grid edits and EXPLAIN graphs could stay as Rust types and be rendered in-process.
- The design-system work in #195 becomes a theme + primitive catalog instead of CSS variables kept in sync by hand across light/dark.
- Contributor plugins stay language-agnostic (stdio JSON-RPC). Only the host UI changes.
- Web / managed mode (#224, #1273) can keep the React UI. GPUI is a desktop renderer, not a replacement for the Axum transport.
I am not asking to freeze feature work or to throw away Monaco, XYFlow and the current contributor loop. I am asking whether the seams in the Tauri post are now expensive enough to justify a time-boxed native spike, now that GPUI + GPUI Kit cover editor, table and dock layouts that did not exist as a realistic option when Tabularis started.
Example
A 200k-row query stays in Rust. The GPUI grid virtual-scrolls the visible window
from the same QueryResult the application layer already owns. No IPC round-trip,
no JSON copies into a webview, no WebKitGTK blank window on that distro.
The window chrome, sidebar, tabs and tokens still read as Tabularis — the same
surfaces, type scale and accent as the current design system — drawn by GPUI.
Web/managed deployments keep serving the existing React UI from the same
application crate.
Hard parts that the spike has to answer honestly:
- SQL editor. Monaco is the current editor. GPUI Kit has a Tree-sitter editor with LSP hooks; Zed has a production editor. Feature parity (multi-cursor, folding, clause-aware autocomplete, notebooks) is the largest port.
- Diagrams. Visual query builder (XYFlow) and visual EXPLAIN are DOM/canvas today. They need a GPUI canvas story, or they stay web-only for a long time.
- GPUI churn. GPUI is still tied to Zed and still pre-1.0. GPUI Kit pins snapshots (
gpui-pre-*). A Tabularis shell would need a version policy. - Contributor pool. Most UI PRs today are TypeScript. A GPUI default UI raises the bar for the people shipping grid/editor polish.
- i18n. 13 locales already exist under
packages/web-ui/src/i18n/locales/. A native shell must reuse those catalogs, not fork strings. - Hybrid escape hatch. tauri-plugin-gpui can render GPUI inside a Tauri window. That may be a smaller first experiment than replacing Tauri’s event loop.
Acceptance criteria
This issue is an RFC. It is done when maintainers can say yes, later, or no with a recorded reason.
- Confirm there is no existing decision that native UI is off the table (the Tauri post argues against three native toolkits; it does not mention GPUI).
- Decide the venue: keep this as a GitHub issue, move it to Discussions, and/or add a line to
roadmap.json. - If the answer is “explore”: publish a short spike brief (goals, non-goals, time box) that reuses
src-tauri/src/application/and does not fork drivers/plugins/MCP. - Spike scope is small and observable: one window, connection list, run a query, render a virtualized grid from native
QueryResultwithout Tauri IPC. - Spike records a written comparison on Linux webview bugs, result-grid latency/memory, installer size, editor-gap vs Monaco, and whether web mode still builds (
cargo check --no-default-features). - Design tokens / visual identity from #195 are treated as the source of truth for any GPUI theme. This is a renderer port, not a restyle.
- Current React/Tauri desktop and web transports stay production. No feature freeze. No deletion of
packages/web-uias part of the spike. - Explicit non-goals for v1 of a native shell: replacing the plugin protocol, rewriting drivers in the UI crate, dropping web/managed mode, matching every Monaco/XYFlow affordance on day one.
Where to start
- Architecture split is already documented:
src-tauri/src/application/is shared;transport/desktop/is Tauri; web is a separate transport. A GPUI shell should be another transport, not a fork of the core. - UI that would move:
packages/web-ui(workspace chrome, explorer, editor, grid, notebooks, settings) and the visual EXPLAIN package. - Design source: #195,
packages/web-uitheme tokens. - Constraints already written down: Why I chose Tauri (IPC tax, three webviews, “native meant three UIs”).
- References: GPUI, GPUI Kit (tables, editor, docks), Zedis as a GPUI data client, optional tauri-plugin-gpui hybrid.
Contributor notes
- Follow AGENTS.md and the repository rules.
- Shared backend behavior stays in
src-tauri/src/application/or plain modules. A GPUI experiment belongs in a new desktop transport / crate, not inside Tauri command handlers. - Preserve
cargo check --no-default-featuresfromsrc-tauri/so the web transport keeps building. - Reuse existing locale catalogs; do not hardcode UI strings.
- Map Tabularis design tokens into the GPUI theme. Do not introduce a second visual identity.
- This proposal used an AI assistant for research (repo layout, the Tauri blog post, GPUI/GPUI Kit). I will review any follow-up I submit.
- Questions for maintainers:
- Is a GPUI spike interesting, or is the current Tauri/React split the settled architecture?
- If interesting, should the first experiment be a standalone GPUI binary against
application/, or GPUI hosted inside Tauri? - Should web/managed mode remain the reason the React UI stays indefinitely, even if desktop goes native?
Questions? Ask here or on Discord.
- Dominant language
- TypeScript
- Stars
- 5.1k
- Forks
- 335
- Avg merge
- 1d 11h
- Merged PRs (30d)
- 280
Getting set up
- No Dockerfile or Docker Compose file
- No pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from TabularisDB/tabularis
-
[Feat]: Text viewer: show character, line and UTF-8 byte countsPossibly taken @maxteneff claimed this 1 day ago. Openfeature request good first issue
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
TabularisDB/tabularis#1395 ·
Maintainers usually reply within 1 day
-
[Bug]: SQLite REAL values of infinity show as NULL in the data gridPossibly taken @markankamaransheogarat-sys claimed this today. Open
TabularisDB/tabularis#1433 · 3 comments · 1 assignee ·
Maintainers usually reply within 1 day
-
feature request help wanted
Difficulty 5/5 Over a week Newbie friendliness 38/100
TabularisDB/tabularis#1418 ·
Maintainers usually reply within 1 day
-
[Feat]: SQL editor: reusable snippets with tab-stop placeholdersPossibly taken @markankamaransheogarat-sys claimed this today. Openfeature request help wanted
Difficulty 5/5 Over a week Newbie friendliness 35/100
TabularisDB/tabularis#1417 · 2 comments · 1 assignee ·
Maintainers usually reply within 1 day
-
[Feat]: Visual EXPLAIN: save plan snapshots and compare against a baselinePossibly taken @markankamaransheogarat-sys claimed this 2 days ago. Openfeature request help wanted
TabularisDB/tabularis#1416 · 2 comments · 1 assignee ·
Maintainers usually reply within 1 day
All issues in TabularisDB/tabularis
Similar issues
-
Waiting for: Product Owner
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
getsentry/sentry-javascript#26203 · 1 comment ·
Maintainers usually reply within 1 day
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
bytedance/flowgram.ai#1235 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
devswha/herdr-web-ui#3325 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100