···10101111## Stack
12121313-Rust/Tauri
1414- - `rustqlite`/`tokio-rustqlite` & `tokio` for sqlite (FTS and vector search)
1515- - `jacquard` for atproto client
1616- - `fastembed` and `nomic-embed-text` for embeddings
1313+### Rust/Tauri
1414+1515+- `rustqlite`/`tokio-rustqlite` & `tokio` for sqlite (FTS and vector search)
1616+- `jacquard` for atproto client
1717+- `fastembed` and `nomic-embed-text` for embeddings
1818+1919+Solid.js for UI with Tailwind
17201821## Inspiration
1922
+71
docs/specs/feeds.md
···8989- Skeleton screens while feeds load; error toast with retry button on network failure
9090- Per-feed display preferences (hide reposts/replies/quotes) stored via `putPreferences`
91919292+## System Tray & Global Composer Shortcut
9393+9494+The composer should be accessible from anywhere on the system — even when the app window is hidden or unfocused — via a system tray icon and a global keyboard shortcut.
9595+9696+### System Tray
9797+9898+Uses Tauri's built-in tray support (core feature flag, not a plugin).
9999+100100+**Setup:**
101101+- Enable `tray-icon` feature in `src-tauri/Cargo.toml`: `tauri = { version = "2", features = ["tray-icon"] }`
102102+- Icon: `public/tray-icon.png` (already exists)
103103+- Build tray in `lib.rs` `setup()` via `TrayIconBuilder`
104104+105105+**Tray menu items:**
106106+107107+| Item | Action |
108108+| --------------- | ------------------------------------------------------- |
109109+| New Post… | Show + focus window, emit `"composer:open"` event |
110110+| Show / Hide | Toggle main window visibility |
111111+| Quit | `app.exit(0)` |
112112+113113+**Tray icon click (left click):** Toggle window visibility — if visible, hide; if hidden, show + focus.
114114+115115+**Key types:** `TrayIconBuilder`, `TrayIconEvent::Click`, `MouseButton`, `MenuItem::with_id`
116116+117117+**Platform note:** Use `.show_menu_on_left_click(false)` so left click toggles the window. Linux does not support tray mouse events; on Linux the menu is the only interaction.
118118+119119+### Global Keyboard Shortcut
120120+121121+Uses `tauri-plugin-global-shortcut` (separate plugin, registers OS-level hotkeys that work even when the app is unfocused).
122122+123123+**Setup:**
124124+- `cargo add tauri-plugin-global-shortcut` (desktop only via `cfg(any(target_os = "macos", windows, target_os = "linux"))`)
125125+- Register plugin in `lib.rs` builder with a handler
126126+- No capability permissions needed since registration happens in Rust only
127127+128128+**Shortcut:** `Ctrl+Shift+N` (maps to `Modifiers::CONTROL | Modifiers::SHIFT`, `Code::KeyN`)
129129+130130+**Handler flow:**
131131+1. On `ShortcutState::Pressed`, get the main webview window
132132+2. Call `window.unminimize()`, `window.show()`, `window.set_focus()` (all three to cover every hidden state)
133133+3. Emit `"composer:open"` event to the frontend
134134+135135+**Key types:** `Shortcut::new()`, `Modifiers`, `Code`, `ShortcutState`, `GlobalShortcutExt`
136136+137137+### Frontend Integration
138138+139139+Both tray "New Post…" and the global shortcut emit a `"composer:open"` Tauri event. The frontend listens for this event and opens the composer:
140140+141141+```ts
142142+import { listen } from "@tauri-apps/api/event";
143143+144144+listen("composer:open", () => {
145145+ // set composer.open = true in FeedWorkspace state
146146+});
147147+```
148148+149149+This reuses the existing `FeedComposer` component and state — no new UI needed.
150150+151151+### Window Show/Focus Pattern
152152+153153+Reliable cross-platform pattern used in both tray and shortcut handlers:
154154+155155+```rust
156156+if let Some(window) = app.get_webview_window("main") {
157157+ let _ = window.unminimize();
158158+ let _ = window.show();
159159+ let _ = window.set_focus();
160160+}
161161+```
162162+92163## Direct Messages
9316494165- `chat.bsky.convo.*` lexicons for DM support
+1
docs/tasks/03-feeds.md
···4242- [ ] Mention/hashtag autocomplete
4343- [ ] Reply threading with parent/root refs
4444- [ ] Quote post embed
4545+- [ ] Tray button and global keyboard shortcut to open composer from anywhere
45464647### Frontend — Feed Preferences
4748