gpui-starter v0.3.0 · auto-updater with signed manifests and ed25519 verification→
gpui-starter

One repo for the whole desktop app.

Routing, 24 themes, Fluent i18n, SQLite, keyring, tray, signed updates and a Cmd+K launcher are already wired. Run cargo run, then start deleting what you don't need.

Clone gpui-starter v0.3.0

$git clone https://github.com/freeoxide/gpui-starter.git
macOSLinuxWindows
Build requirements ↗

Then follow the quickstart→

$ cargo run
   Compiling gpui-starter v0.3.0
    Finished `dev` profile
     Running `target/debug/gpui-starter`

  ✓ lifecycle       first_run = true
  ✓ single-instance lock acquired
  ✓ themes          24 loaded, watching ./themes
  ✓ i18n            en, zh-CN
  ✓ sqlite          app support dir
  ✓ tray            menu bar registered

  window ready

illustrative output · your run logs the same subsystems

get started

Built on

RustGPUISQLiteFluentAccessKited25519keyringtokio

Four subsystems,
designed together.

Each one lives behind its own module. tray andtelemetry come out cleanly. Nothing else breaks.

App shell

replaces hand-rolled chrome

Custom title bar with drag regions and traffic lights, collapsible sidebar, status bar, route-based pages.

impl Render for PageRead the docs

Persistence

replaces sqlite glue · dirs · keyring

rusqlite storage, versioned JSON config with a migration chain, OS keyring for secrets.

db.migrate_to(V3)Read the docs

OS integration

replaces tauri plugins

Tray menu, native notifications with toast fallback, global hotkey, deep links through the instance guard.

gpui-starter://openRead the docs

gpui-query

replaces bespoke async state

TanStack-style caching for entities: stale-while-revalidate, retries, invalidation, infinite queries.

use_query("projects")Read the docs

Not a hello-world

Six pages, already wired.

Sidebar routing, theme switching, form validation and the command palette are all live the first time you run it. Delete the pages you don't need.

Home

01

Landing page for the shell, wired to gpui-query so you can see cached async data on first paint.

Form

02

gpui-form inputs bound to a struct, koruma validation rules, errors localized through Fluent.

Settings

03

Theme switcher, locale picker and telemetry consent gate, all persisted to versioned JSON config.

About

04

Version, build metadata and update check, backed by the ed25519-signed updater.

Diagnostics

05

Live subsystem health, active entities, theme metadata, and debug actions for support.

Notifications

06

Native OS notifications with in-app toast fallback and a persistent inbox the user can reopen.

See it running

The shell you get on the first run.

This cycles through five screens of it: sidebar routing, the theme picker, the Cmd+K launcher, a localized settings page, and form validation catching a bad email.

gpui-starter
Welcome to GPUI Starter
A boilerplate for building desktop apps with GPUI
24 themes
2 languages
100% Rust
Settings
Dark Mode
Theme
CatppuccinTokyo NightDraculaOne Dark
Search pages and commands...
⌂
Home
Open the Home page
☆
Form
Open the Form page
⚙
Settings
Open settings
设置
深色模式
语言
English简体中文
Create Account
Full Name
John Doe
Email
invalid
Enter a valid email address
Password
••••
Create AccountReset

A minute with gpui-starter

One binary, start to ship.

Install, develop, test and ship with the same toolchain. Every step below is a real command from this repo.

terminal · install
$ cargo run
   Compiling gpui-starter v0.3.0
    Finished `dev` profile
     Running `target/debug/gpui-starter`

  ✓ lifecycle       first_run = true
  ✓ single-instance lock acquired
  ✓ themes          24 loaded, watching ./themes
  ✓ i18n            en, zh-CN
  ✓ sqlite          app support dir
  ✓ tray            menu bar registered

  window ready

By the numbers

What ships in the box.

24
themes, hot-reloaded
6
pages wired
2
locales (en, zh-CN)
0
webviews shipped

Batteries included

Real APIs, not a feature checklist.

Page routing

A page is an entity plus a route entry. Sidebar, Cmd+K launcher and deep links all read the same registry.

Routing docs
src/shell/route.rsrust
// register once: sidebar, Cmd+K and deep links follow
pub fn routes(cx: &mut App) -> Vec<Route> vec![
        Route::new(Page::Home).icon("house"),
        Route::new(Page::Form).icon("file-text"),
        Route::new(Page::Settings).icon("settings"),
        Route::new(Page::Diagnostics).dev_only(),
    ]

Theming

24 themes, hot-reloaded.

Every theme is a plain JSON file in themes/. Drop one in while the app is running and it shows up in the switcher without a rebuild.

Adventure
Alduin
Asciinema
Ayu
Catppuccin
Crush
Everforest
Fahrenheit
Flexoki
Gruvbox
Harper
High Contrast Dark
High Contrast Light
Hybrid
Jellybeans
Kibble
macOS Classic
Matrix
Mellifluous
Molokai
Solarized
Spaceduck
Tokyo Night
Twilight

The unglamorous half

The parts nobody wants to write twice.

None of this is a differentiator on its own. All of it is a week you don't spend.

Command launcher

features/command_palette.rs

Cmd+K opens a floating palette with fuzzy search across every registered action. Full keyboard navigation.

Undo / redo

services/undo_stack.rs

Command-pattern stack behind Cmd+Z / Cmd+Y. One trait to implement per action, works across any operation.

Crash reporting

services/crash_report.rs

Panic hooks capture stack traces and write structured reports to disk. Surface or upload them on next launch.

Telemetry

services/telemetry/

Three modes (disabled, local-only, remote) behind an explicit consent gate. You decide what leaves the machine.

Logging

services/logging.rs

File-based logging through tracing-appender, with env-filter levels wired to the same config.

Accessibility

services/accessibility.rs

AccessKit integration so the tree is exposed to VoiceOver, Narrator and Orca.

Secure storage

services/secure_storage.rs

OS keyring for secrets: macOS Keychain, Windows Credential Manager, Linux Secret Service.

Deep links

platform/ipc/

URL-scheme handling forwarded through the single-instance guard, so a link reaches the running window.

Lifecycle

services/first_run.rs

Startup, shutdown and crash state machine, including first-run detection for onboarding.

Connectivity

services/connectivity.rs

Online/offline awareness so async work can back off instead of piling up retries.

Background tasks

services/tasks.rs

A task registry over the tokio runtime, cancelled cleanly on shutdown.

Error surface

services/error_surface.rs

One place errors are collected and rendered, instead of unwrap() scattered through the UI.

Comparison

What you get on day one.

Capabilitygpui-starterbare GPUITauriElectron
Native GPU rendering✓✓webviewwebview
Sidebar + page routing✓———
Theme system, hot-reload24 built in—CSSCSS
i18n with typed keys✓ Fluent—pluginlibrary
Command launcher (Cmd+K)✓———
Signed auto-updater✓ ed25519—✓✓
Keyring / secure storage✓—pluginplugin
Crash reports + diagnostics✓——✓
Screen reader support✓ AccessKitmanual✓✓
Ships a browser enginenonosystembundled

Stop rewriting the shell.

Clone it, delete what you don't need, and spend the week on your product instead of the update manifest.

$cargo run