{"id":50485383,"url":"https://github.com/smooai/smooblue","last_synced_at":"2026-06-01T22:00:28.487Z","repository":{"id":359860341,"uuid":"1247241366","full_name":"SmooAI/smooblue","owner":"SmooAI","description":"Native multi-column Bluesky deck for macOS. Rust + Dioxus. OAuth + DPoP. Smoo-branded.","archived":false,"fork":false,"pushed_at":"2026-05-31T01:26:50.000Z","size":77080,"stargazers_count":0,"open_issues_count":6,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-31T02:20:55.858Z","etag":null,"topics":["atproto","bluesky","desktop-app","dioxus","macos","rust","social","tweetdeck"],"latest_commit_sha":null,"homepage":"https://github.com/SmooAI/smooblue","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SmooAI.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-23T04:11:02.000Z","updated_at":"2026-05-31T01:24:59.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/SmooAI/smooblue","commit_stats":null,"previous_names":["smooai/smooblue"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/SmooAI/smooblue","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SmooAI%2Fsmooblue","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SmooAI%2Fsmooblue/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SmooAI%2Fsmooblue/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SmooAI%2Fsmooblue/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SmooAI","download_url":"https://codeload.github.com/SmooAI/smooblue/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SmooAI%2Fsmooblue/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33795114,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-01T02:00:06.963Z","response_time":115,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["atproto","bluesky","desktop-app","dioxus","macos","rust","social","tweetdeck"],"created_at":"2026-06-01T22:00:19.470Z","updated_at":"2026-06-01T22:00:28.475Z","avatar_url":"https://github.com/SmooAI.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ca name=\"readme-top\"\u003e\u003c/a\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://smoo.ai\"\u003e\n    \u003cimg src=\"assets/icons/icon-256.png\" alt=\"Smooblue\" width=\"180\" /\u003e\n  \u003c/a\u003e\n\u003c/div\u003e\n\n## About SmooAI\n\nSmooAI is an AI-powered platform for helping businesses multiply their customer, employee, and developer experience.\n\nLearn more on [smoo.ai](https://smoo.ai).\n\n## SmooAI Open Source\n\nCheck out other SmooAI open-source packages at [smoo.ai/open-source](https://smoo.ai/open-source).\n\n## About Smooblue\n\nA native, multi-column [Bluesky](https://bsky.app) desktop client for macOS and Linux. Written in Rust + [Dioxus](https://dioxuslabs.com/), backed by Bluesky's official OAuth flow (PAR + PKCE + DPoP-bound tokens).\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"media/smooblue-demo.gif\" alt=\"Smooblue demo\" width=\"720\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\u003csub\u003e\n  GIF heavily downsampled to fit GitHub's inline limit. Full quality:\n  \u003ca href=\"media/smooblue-demo.mp4\"\u003e\u003cstrong\u003e▶ smooblue-demo.mp4 (1080p · 65 MB)\u003c/strong\u003e\u003c/a\u003e\n\u003c/sub\u003e\u003c/p\u003e\n\n---\n\n## Install\n\n### macOS — Homebrew (recommended)\n\n```bash\nbrew tap SmooAI/tools\nbrew install --cask smooblue\n```\n\nApple Silicon only today. `brew upgrade --cask smooblue` updates on every release.\n\n\u003e **Gatekeeper note:** Smooblue is adhoc-signed, not Apple Developer ID notarized — see [Security model](docs/Security/Security.md). The cask's `postflight` strips the macOS quarantine attribute on install so the .app launches without the \"Apple could not verify…\" dialog. If you're on a Smooblue version installed before that landed (≤ v1.3.0), or if you grabbed the .zip directly from a release, run once: `xattr -cr /Applications/Smooblue.app`. We're [tracking real Developer ID signing](https://github.com/SmooAI/smooblue/issues?q=is%3Aissue+notarize) as the eventual fix.\n\n### Linux — .deb (Debian / Ubuntu)\n\nGrab the `.deb` from the [latest release](https://github.com/SmooAI/smooblue/releases/latest) and:\n\n```bash\nsudo apt install ./Smooblue_*.deb\n```\n\napt pulls in `libwebkit2gtk-4.1` / `libgtk-3` / `libayatana-appindicator3` / `librsvg2` for you. `Smooblue` shows up in the launcher / activities overview. `sudo apt upgrade smooblue` after future releases (once you've installed once with the file).\n\n### macOS or Linux — curl one-liner\n\nAuto-detects platform; macOS gets the `.app`, Linux gets the tarball-extracted binary. Doesn't go through brew/apt, so updates are manual (re-run the same command):\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/SmooAI/smooblue/main/install.sh | bash\n```\n\n## What it is\n\nA TweetDeck-style desktop client for Bluesky. Stack as many columns as you want — Home, Notifications, Discover, your saved feeds, lists, search, individual profiles, suggested-follows — and watch them all live-update side-by-side. No app passwords; sign in once via OAuth and Smooblue holds DPoP-bound tokens on disk (0600, your config dir).\n\nBuilt fast, single-binary, ~11 MB native app — feels closer to a Finder window than an Electron browser tab.\n\n## Features\n\n**Deck**\n- Multi-column horizontal scrolling deck (Home / Notifications / Discover / custom feeds / lists / search / profile / suggested follows)\n- Drag-to-reorder columns\n- \"Your feeds\" — feed generators you've authored show up first in the column picker\n- Paste any feed AT-URI to add a custom column\n- Trending topic chips + popular-feeds browser\n- Per-column close + persistent layout across launches\n- Light + dark themes (token-based, brand colors preserved)\n\n**Posts**\n- Compose, reply, repost, like, quote, delete\n- Self-threading (chain replies on submit)\n- Image attachments (up to 4) with auto-generated alt-text (Apple Vision OCR + LLM scene description)\n- **Drag-and-drop** images or video onto the compose sheet\n- **⌘V paste** image from clipboard (handy for the macOS screenshot floater — Wry's drag handler can't resolve its NSFilePromise, so paste is the path that just works)\n- Video attachments (mp4 / mov / webm)\n- Rich-text facets — @mentions, #hashtags, http links auto-detected + resolved\n- ⌘↵ to submit\n- Draft persisted across launches\n\n**Read**\n- Thread view — click any post body to open the conversation\n- Click a notification to jump to the relevant post (or profile for follows)\n- \"Reposted by X\" / \"Replying to @Y\" chips on every feed card\n- Tap the timestamp on any post to open it on bsky.app in your browser\n- \"More\" → copy bsky.app permalink to clipboard\n- Engagement modals (likes / reposts / quotes) — tap a count on any post\n- Content-warning interstitial for labeled (NSFW / graphic / sensitive) posts\n\n**Profile**\n- Your own profile view + edit (display name, bio, avatar, banner via file picker)\n- Other profiles with follow / mute / block / report\n- Pinned post displayed at the top with a chip\n- \"Followed by ... and X others you follow\" mutuals row\n\n**Accounts \u0026 moderation**\n- Multi-account switching (sign into as many as you want, flip via Settings)\n- Mute \u0026 block list management in Settings → Moderation\n- Report flow with bsky's canonical moderation reasons\n\n**Vim-style keyboard navigation**\n- `j` / `k` next / previous post\n- `h` / `l` previous / next column\n- `gg` top of column, `G` bottom\n- `g` then `h` / `n` / `d` / `s` / `p` for Home / Notifications / Discover / Suggested / Profile\n- Space leader → `n` new post, `/` search, `s` settings, `f` saved feeds, `?` help, `1`–`9` jump to column N\n- `?` toggles the keyboard help overlay\n- Esc closes the topmost modal; ⌘K opens search anywhere\n\n**Operational**\n- Self-update notifier — checks GitHub releases on launch\n- Optional system-level auto-updater (launchd job, hourly) that rebuilds + reinstalls from `main`\n- macOS app activation done right — Cmd+Up / BetterSnapTool / Raycast hotkeys reach Smooblue without clicking the menu bar first\n\n## Install\n\n### macOS (supported)\n\nOne-liner — grabs the latest release, installs to `/Applications` (or `~/Applications` if that's not writable), and opens it:\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/SmooAI/smooblue/main/install.sh | bash\n```\n\nApple Silicon only today (`Smooblue-macos-arm64.zip`). Re-running upgrades in place. To install without launching after, set `SMOOBLUE_NO_OPEN=1`.\n\nOr build from source:\n\n```bash\ngit clone https://github.com/SmooAI/smooblue.git\ncd smooblue\n./scripts/bundle-macos.sh         # builds release + creates dist/Smooblue.app\ncp -R dist/Smooblue.app /Applications/\nxattr -dr com.apple.quarantine /Applications/Smooblue.app\nopen /Applications/Smooblue.app\n```\n\nOr stay current automatically (hourly rebuild + reinstall from `main`):\n\n```bash\nsed -e \"s|@USER@|$USER|g\" -e \"s|@HOME@|$HOME|g\" \\\n    scripts/ai.smoo.smooblue.updater.plist.template \\\n    \u003e ~/Library/LaunchAgents/ai.smoo.smooblue.updater.plist\nlaunchctl load ~/Library/LaunchAgents/ai.smoo.smooblue.updater.plist\n```\n\nThe updater is a no-op when there are no new commits on `main` or your working tree is dirty — safe to leave running.\n\n### Linux (x86_64)\n\nSame one-liner as macOS — it auto-detects platform and grabs `Smooblue-linux-x86_64.tar.gz` instead:\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/SmooAI/smooblue/main/install.sh | bash\n```\n\nInstalls the binary to `~/.local/bin/smooblue` and drops a `.desktop` file in `~/.local/share/applications/`. **You'll need the webkit2gtk runtime libs**; the installer prints the apt command after install. Debian/Ubuntu:\n\n```bash\nsudo apt install libwebkit2gtk-4.1-0 libgtk-3-0 libayatana-appindicator3-1 librsvg2-2\n```\n\n(Other distros: install the equivalents of `webkit2gtk-4.1`, `gtk3`, `libayatana-appindicator`, `librsvg`.)\n\nA few macOS-specific niceties degrade gracefully on Linux:\n- Apple Vision OCR for auto-alt-text → falls back to the LLM scene description.\n- \"Copy link\" on a post uses `pbcopy` — needs a one-line patch to call `xclip` / `wl-copy` instead.\n\nOr build from source (needs the `-dev` versions of the runtime libs above + `build-essential`):\n\n```bash\ngit clone https://github.com/SmooAI/smooblue.git\ncd smooblue\ncargo run --release -p smooblue-app\n```\n\n### Windows (not yet)\n\nWry supports Windows via WebView2, so the core should build, but nobody's tried. The `safe_open` shell-out, the macOS activation hook, and the bundle script would all need a Windows arm.\n\n## Security\n\nFor the full breakdown — auth model, transport, data egress, what's NOT done, and how to verify any of this yourself — see [docs/Security/Security.md](docs/Security/Security.md). The quick version is in the next section.\n\nTo report a vulnerability: email brent@smoo.ai or use [GitHub's private security advisories](https://github.com/SmooAI/smooblue/security/advisories).\n\n## Privacy — what Smooblue sends where\n\n| Data                      | Sent to                                                              | When                                                                 |\n| ------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- |\n| Handle, password (typed)  | **Nowhere** — Bluesky handles auth                                   | Never; OAuth means Smooblue never sees your password                 |\n| Bluesky access token      | Your PDS (which proxies to AppView)                                  | Every XRPC call                                                      |\n| Session (DPoP key + tokens) | Local file (0600 in config dir)                                    | After sign-in; survives rebuilds (Keychain ACL was unreliable)        |\n| DM contents               | Your PDS → **`api.bsky.chat`** (Bluesky's chat service, **not E2E encrypted** — see Security doc) | When you open the Messages column or send a message                  |\n| Display name, handle, DID | **Smoo AI CRM** *(opt-in only)*                                      | Only if you tick \"Stay in touch with Smoo AI\" during sign-in         |\n\nThe Smoo AI CRM sync is off by default and reversible from Settings.\n\n## Build from source\n\n```bash\n# requires Rust 1.80+\ncargo run --release -p smooblue-app          # dev launch\ncargo test --workspace --lib                  # unit tests (91 of them)\nbash scripts/bundle-macos.sh                  # produces dist/Smooblue.app\nbash scripts/build-icons.sh                   # regen PNG icons from icon.svg\n```\n\nDemo mode (no network, canned data — useful for screenshots):\n\n```bash\nSMOOBLUE_DEMO=1 cargo run -p smooblue-app\nSMOOBLUE_DEMO=1 SMOOBLUE_DEMO_SCALE=large cargo run -p smooblue-app  # 500-post scale test\n```\n\n## Layout\n\n```\nsmooblue/\n├── crates/\n│   ├── smooblue-app/      # Dioxus desktop binary + components\n│   ├── smooblue-atproto/  # XRPC client (timeline, profile, notifs, feeds, ...)\n│   ├── smooblue-crm/      # opt-in Smoo CRM sync\n│   ├── smooblue-oauth/    # ATproto OAuth (PAR + PKCE + DPoP)\n│   └── smooblue-theme/    # CSS tokens + shared sheet\n├── assets/\n│   ├── icons/             # generated PNG app icons (16 → 1024)\n│   ├── icon.svg           # source SVG (Bluesky butterfly + smoo monogram chip)\n│   └── styles.css         # smooblue-specific component CSS\n├── media/\n│   └── smooblue-demo.mp4  # demo recording\n├── scripts/\n│   ├── bundle-macos.sh\n│   ├── build-icons.sh\n│   ├── smooblue-update.sh\n│   └── ai.smoo.smooblue.updater.plist.template\n└── Cargo.toml             # Cargo workspace\n```\n\n## Roadmap\n\n- DMs (`chat.bsky.*`)\n- Pinned posts ordering inside a thread sheet\n- Trending topics → live deep-link to bsky search\n- Cross-platform builds (Linux / Windows) — code is portable, just needs CI\n\n## Contributing\n\nIssues and PRs welcome — see [CONTRIBUTING.md](CONTRIBUTING.md).\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## Contact\n\nBrent Rager\n\n- [Email](mailto:brent@smoo.ai)\n- [LinkedIn](https://www.linkedin.com/in/brentrager/)\n- [Bluesky](https://bsky.app/profile/brentragertech.bsky.social)\n- [TikTok](https://www.tiktok.com/@brentragertech)\n- [Instagram](https://www.instagram.com/brentragertech/)\n\nSmooAI on GitHub: [https://github.com/SmooAI](https://github.com/SmooAI)\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## License\n\n[MIT](LICENSE) © [Smoo AI](https://smoo.ai)\n\n---\n\n*Smooblue is not affiliated with Bluesky Social, PBC. \"Bluesky\" and the Bluesky butterfly are trademarks of Bluesky Social, PBC.*\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsmooai%2Fsmooblue","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsmooai%2Fsmooblue","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsmooai%2Fsmooblue/lists"}