Skip to content

Architecture

Rique edited this page Sep 25, 2026 · 1 revision

Architecture

Homebase is a Rust workspace: one app crate with a Slint UI, and a set of focused library crates. The full write-up, with diagrams and data-flow examples, is in docs/ARCHITECTURE.md.

Crates

Crate Responsibility
app The Homebase executable: Slint UI (app/ui), focus model, orchestrator (app/src/state.rs)
hb-core Shared vocabulary: ids, models, input actions, settings, theme tokens, errors
hb-store SQLite storage with migrations; the only owner of the database
hb-sys Every Windows API: launching, windows and focus, media sessions, audio, power, display, icons, UI Automation
hb-input SDL3 controllers, keyboard, remotes, gestures, bindings and input injection
hb-appexp App experiences: launching apps and websites, exact window tracking, controller verbs, the pointer thread
hb-providers Steam (library folders, owned-games cache, artwork), local games, the media/app catalog, site icons
hb-session Game session state machine and identity-verified process tracking
hb-policy Profiles, ratings, time limits and approvals
hb-audio UI sounds
hb-ext .hbpkg packages
xtask Build, package and install automation

Rules the code follows

  • All Win32/WinRT calls live in hb-sys; everything above it is portable.
  • hb-core defines vocabulary only and does no IO.
  • hb-store is the only code that touches SQLite.
  • The UI thread never blocks: scans, downloads, UI Automation and shell opens run on worker threads and report back through channels.
  • Input to apps is only sent after verifying the app's own window is in front.

Threads

Thread Job
UI Slint event loop, plus a 16 ms pump that drains every channel
Gamepad Owns SDL3; posts input events and publishes stick positions
Pointer Moves the mouse and scrolls for apps at about 250 Hz, straight from the stick
Session trackers Follow game processes and play time
Workers Library scans, artwork downloads, text-field checks, shell opens
Watchdog Logs a warning if the UI thread ever stalls

Clone this wiki locally