BlueSky & more on desktop lazurite.stormlightlabs.org/
tauri rust typescript bluesky appview atproto solid
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

docs: composer extension

+79 -4
+7 -4
README.md
··· 10 10 11 11 ## Stack 12 12 13 - Rust/Tauri 14 - - `rustqlite`/`tokio-rustqlite` & `tokio` for sqlite (FTS and vector search) 15 - - `jacquard` for atproto client 16 - - `fastembed` and `nomic-embed-text` for embeddings 13 + ### Rust/Tauri 14 + 15 + - `rustqlite`/`tokio-rustqlite` & `tokio` for sqlite (FTS and vector search) 16 + - `jacquard` for atproto client 17 + - `fastembed` and `nomic-embed-text` for embeddings 18 + 19 + Solid.js for UI with Tailwind 17 20 18 21 ## Inspiration 19 22
+71
docs/specs/feeds.md
··· 89 89 - Skeleton screens while feeds load; error toast with retry button on network failure 90 90 - Per-feed display preferences (hide reposts/replies/quotes) stored via `putPreferences` 91 91 92 + ## System Tray & Global Composer Shortcut 93 + 94 + 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. 95 + 96 + ### System Tray 97 + 98 + Uses Tauri's built-in tray support (core feature flag, not a plugin). 99 + 100 + **Setup:** 101 + - Enable `tray-icon` feature in `src-tauri/Cargo.toml`: `tauri = { version = "2", features = ["tray-icon"] }` 102 + - Icon: `public/tray-icon.png` (already exists) 103 + - Build tray in `lib.rs` `setup()` via `TrayIconBuilder` 104 + 105 + **Tray menu items:** 106 + 107 + | Item | Action | 108 + | --------------- | ------------------------------------------------------- | 109 + | New Post… | Show + focus window, emit `"composer:open"` event | 110 + | Show / Hide | Toggle main window visibility | 111 + | Quit | `app.exit(0)` | 112 + 113 + **Tray icon click (left click):** Toggle window visibility — if visible, hide; if hidden, show + focus. 114 + 115 + **Key types:** `TrayIconBuilder`, `TrayIconEvent::Click`, `MouseButton`, `MenuItem::with_id` 116 + 117 + **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. 118 + 119 + ### Global Keyboard Shortcut 120 + 121 + Uses `tauri-plugin-global-shortcut` (separate plugin, registers OS-level hotkeys that work even when the app is unfocused). 122 + 123 + **Setup:** 124 + - `cargo add tauri-plugin-global-shortcut` (desktop only via `cfg(any(target_os = "macos", windows, target_os = "linux"))`) 125 + - Register plugin in `lib.rs` builder with a handler 126 + - No capability permissions needed since registration happens in Rust only 127 + 128 + **Shortcut:** `Ctrl+Shift+N` (maps to `Modifiers::CONTROL | Modifiers::SHIFT`, `Code::KeyN`) 129 + 130 + **Handler flow:** 131 + 1. On `ShortcutState::Pressed`, get the main webview window 132 + 2. Call `window.unminimize()`, `window.show()`, `window.set_focus()` (all three to cover every hidden state) 133 + 3. Emit `"composer:open"` event to the frontend 134 + 135 + **Key types:** `Shortcut::new()`, `Modifiers`, `Code`, `ShortcutState`, `GlobalShortcutExt` 136 + 137 + ### Frontend Integration 138 + 139 + Both tray "New Post…" and the global shortcut emit a `"composer:open"` Tauri event. The frontend listens for this event and opens the composer: 140 + 141 + ```ts 142 + import { listen } from "@tauri-apps/api/event"; 143 + 144 + listen("composer:open", () => { 145 + // set composer.open = true in FeedWorkspace state 146 + }); 147 + ``` 148 + 149 + This reuses the existing `FeedComposer` component and state — no new UI needed. 150 + 151 + ### Window Show/Focus Pattern 152 + 153 + Reliable cross-platform pattern used in both tray and shortcut handlers: 154 + 155 + ```rust 156 + if let Some(window) = app.get_webview_window("main") { 157 + let _ = window.unminimize(); 158 + let _ = window.show(); 159 + let _ = window.set_focus(); 160 + } 161 + ``` 162 + 92 163 ## Direct Messages 93 164 94 165 - `chat.bsky.convo.*` lexicons for DM support
+1
docs/tasks/03-feeds.md
··· 42 42 - [ ] Mention/hashtag autocomplete 43 43 - [ ] Reply threading with parent/root refs 44 44 - [ ] Quote post embed 45 + - [ ] Tray button and global keyboard shortcut to open composer from anywhere 45 46 46 47 ### Frontend — Feed Preferences 47 48