Cross-platform checklist
Also available: Markdown Β· Plain text
Cross-platform checklist
Use this whenever you add a feature, change UI, or tweak behavior. Gnomad ships one React app (src/) on macOS, Windows, and Linuxβbut shell chrome, OS integrations, and some menus differ by design.
Goal: Shared UI works everywhere; platform-specific behavior is explicit, documented, and testedβnot accidental Mac-only behavior.
Quick decision: does my change need per-OS work?
flowchart TD
Start[Change landed] --> Q1{Only React/CSS in src/?}
Q1 -->|Yes| Q2{Uses platformInfo or OS-specific CSS?}
Q1 -->|No| Q3{Rust in src-tauri?}
Q2 -->|No| Low[Usually OK on all OSes β run smoke checklist]
Q2 -->|Yes| Med[Verify each branch + Win/Linux windowed]
Q3 -->|Yes| High[Add cfg blocks + test on target OS or CI]
Q3 -->|shell/context/window| High
| If you changed⦠| Typical scope | Action |
|---|---|---|
| Chat, settings, knowledge, agent cards, composer | Shared | Smoke all OSes (panel + windowed on Win/Linux) |
index.css layout / spacing |
Shared | Check narrow width + windowed (toolbar may be hidden) |
| Title bar, traffic lights, toolbar, fullscreen | Per-OS | Update TitleBarLeading, AppToolbar, platform-*.css |
| Tray, panel position, global shortcut | Per-OS | window_manager.rs, platform.rs, lib.rs setup |
| Shell, elevation, credentials, context | Per-OS backend | privilege.rs, context.rs, keychain β UI can stay shared |
| New Tauri command | Shared invoke | Register in lib.rs; gate risky OS APIs with #[cfg] |
Code map
| Concern | Primary files |
|---|---|
| Platform flags & labels | src-tauri/src/platform.rs β src/lib/platform.ts |
| Frontend branching | src/App.tsx, hooks (useOsContext, β¦), platformInfo, data-platform on <html> |
| Title bar / toolbar | src/components/TitleBarLeading.tsx, src/components/AppToolbar.tsx |
| Win/Linux panel CSS | src/index.css (.platform-windows, .platform-linux) |
| Window modes & tray | src-tauri/src/window_manager.rs, src-tauri/src/menu_shell.rs |
| OS context & clipboard | src-tauri/src/context.rs |
| Safety / elevation | src-tauri/src/privilege.rs |
Before you merge (all platforms)
-
npm run buildpasses (TypeScript + Vite) -
cd src-tauri && cargo testpasses - No Mac-only paths in shared React (avoid hardcoding
/Users/β¦,osascript,pbcopyinsrc/) - New settings/UI visible in Settings without requiring macOS-only permissions
- Strings use
platformInfofor tray/menu labels when user-facing (e.g. βmenu barβ vs βsystem trayβ) - CI green on macOS, Windows, Linux (see
.github/workflows/build.yml)
UI & settings (shared React)
Test on each OS you have access to; at minimum run CI and spot-check one non-Mac OS before release.
All window modes
| Check | macOS | Windows | Linux |
|---|---|---|---|
| Panel (tray drop-down) opens, closes, global shortcut | β | β | β |
| Pop out / floating window usable | β | β | β |
| Windowed β content not clipped; settings reachable | β | β | β |
| Fullscreen enter/exit (if touched) | β | β | β |
| Close hides to tray (not quit) | β | β | β |
| Quit from tray menu exits app | β | β | β |
Chat & composer
| Check | macOS | Windows | Linux |
|---|---|---|---|
| Send message (cloud + local if applicable) | β | β | β |
| Attachments pick + show chips | β | β | β |
| Shell command cards show output | β | β | β |
| Sudo Gate appears for risky command; approve/deny works | β | β | β |
| Failed shell/elevation shows Agent error banner (code, hint, expandable detail) | β | β | β |
| Stop cancels in-flight work | β | β | β |
Settings panels (new work: tick your feature)
| Check | macOS | Windows | Linux |
|---|---|---|---|
| API keys β save/status (no secret in UI) | β | β | β |
| Agent access β workspace, trust mode, planner | β | β | β |
| Model / provider / Ollama URL | β | β | β |
| Accessibility block only on macOS (hidden elsewhere) | β | N/A | N/A |
| Knowledge import (file dialog) | β | β | β |
Windowed mode on Windows/Linux: in-app toolbar is often hidden; use View menu (OS menu bar) for mode switchesβconfirm your feature isnβt toolbar-only.
Platform-specific expectations
macOS
- Menu bar tray icon visible (not template-only broken)
- Traffic-light spacer in panel/pop-out (
titlebar-leading-macos) - Accessibility settings flow if context features changed
-
npm run tauri:build:macproduces.app/.dmg
Windows
- System tray icon and tooltip
-
Ctrl+Shift+Spacetoggles window - Panel opens near tray; no duplicate titlebar in windowed
- Active window / clipboard pills populate (PowerShell available)
- Elevated commands show structured elevation_unsupported (use admin terminal /
agent_fsfor writes) -
npm run tauri:build:winonwindows-latestor local VM
Linux
- System tray (AppIndicator); Wayland: left-click tray opens menu (shipped)
-
Ctrl+Shift+Spacetoggles window - Optional:
xdotool/wl-paste/xclipfor context pills (LINUX_PACKAGES.md) -
pkexecargv-only elevation (injection patterns rejected with structured error) -
npm run tauri:build:linux(deb or AppImage)
Agent & shell features
| Check | macOS | Windows | Linux |
|---|---|---|---|
shell_run / PTY executes simple command (command -v brew or echo hi) |
β | β | β |
cd updates cwd in follow-up command |
β | β | β |
| Path Gate for file outside workspace (Standard mode) | β | β | β |
| Path Gate mints signed token on approve (not boolean bypass) | β | β | β |
| YOLO mode reduces path prompts (if enabled) | β | β | β |
| Command planner (Ollama) converts prose β CLI when enabled | β | β | β |
Audit log written under app data (agent-audit.jsonl) |
β | β | β |
Injection-like elevation ($(, ;, pipes) rejected with safety_blocked payload |
β | β | β |
When you add a new feature (template)
Copy into your PR description or task notes:
### Cross-platform: [feature name]
**Layer:** β Shared React β CSS β Rust (all OS) β Rust `#[cfg(...)]` per OS
**UI entry points:** β Panel β Pop-out β Windowed β Settings β Tray menu β OS app menu
**Backend:** β Tauri command β Shell β FS β Keychain/credentials β OS context
**Tested:**
- [ ] macOS β panel + windowed
- [ ] Windows β panel + windowed (or CI artifact)
- [ ] Linux β panel + windowed (or CI artifact)
**Platform notes:** _e.g. βElevation on Windows still manualβ; βLinux needs wl-pasteβ_
Implementing platform-aware UI (do / donβt)
Do
- Use
getPlatformInfo()/platformInfoin React for labels and conditional sections. - Add Win/Linux rules next to macOS in
index.csswhen layout differs (.platform-windows.mode-windowed, etc.). - Put OS-specific logic in Rust with
#[cfg(target_os = "macos")]and keep the invoke API stable for the frontend. - Document gaps in this file or
BUILD_PLATFORMS.md.
Donβt
- Assume the in-app toolbar is visible on Windows/Linux windowed mode.
- Use macOS-only shortcuts in user-visible copy (prefer βglobal shortcutβ or list both).
- Test only menu-bar panel mode on Mac and ship.
- Fork React into
App.macos.tsxunless absolutely necessaryβprefer flags and small components.
CI & release
On push to main / master:
- GitHub Actions builds macOS, Windows, Linux (
build.yml). - Download artifacts and smoke-test installers when changing shell/window/tray code.
- Before tagging a release: run the Before you merge section on at least one build per OS (or delegate to CI + manual spot-check).
Related docs
- BUILD_PLATFORMS.md β build commands and parity table
- QA_CHECKLIST.md β formal release QA with P0/P1 IDs (use before shipping a version)
- LINUX_PACKAGES.md β optional Linux dependencies
- MACOS_PERMISSIONS.md β Accessibility / automation on macOS
- AGENT_CAPABILITIES_PROPOSAL.md β agent architecture