A native, multi-column Bluesky client for macOS desktop. Written in Rust + Dioxus, backed by Bluesky's official OAuth flow (PAR + PKCE + DPoP-bound tokens).
GIF heavily downsampled to fit GitHub's inline limit. Full quality: ▶ smooblue-demo.mp4 (1080p · 65 MB)
A 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).
Built fast, single-binary, ~11 MB native app — feels closer to a Finder window than an Electron browser tab.
Deck
- Multi-column horizontal scrolling deck (Home / Notifications / Discover / custom feeds / lists / search / profile / suggested follows)
- Drag-to-reorder columns
- "Your feeds" — feed generators you've authored show up first in the column picker
- Paste any feed AT-URI to add a custom column
- Trending topic chips + popular-feeds browser
- Per-column close + persistent layout across launches
- Light + dark themes (token-based, brand colors preserved)
Posts
- Compose, reply, repost, like, quote, delete
- Self-threading (chain replies on submit)
- Image attachments (up to 4) with auto-generated alt-text (Apple Vision OCR + LLM scene description)
- Drag-and-drop images or video onto the compose sheet
- Video attachments (mp4 / mov / webm)
- Rich-text facets — @mentions, #hashtags, http links auto-detected + resolved
- ⌘↵ to submit
- Draft persisted across launches
Read
- Thread view — click any post body to open the conversation
- Click a notification to jump to the relevant post (or profile for follows)
- "Reposted by X" / "Replying to @Y" chips on every feed card
- Tap the timestamp on any post to open it on bsky.app in your browser
- "More" → copy bsky.app permalink to clipboard
- Engagement modals (likes / reposts / quotes) — tap a count on any post
- Content-warning interstitial for labeled (NSFW / graphic / sensitive) posts
Profile
- Your own profile view + edit (display name, bio, avatar, banner via file picker)
- Other profiles with follow / mute / block / report
- Pinned post displayed at the top with a chip
- "Followed by ... and X others you follow" mutuals row
Accounts & moderation
- Multi-account switching (sign into as many as you want, flip via Settings)
- Mute & block list management in Settings → Moderation
- Report flow with bsky's canonical moderation reasons
Vim-style keyboard navigation
j/knext / previous posth/lprevious / next columnggtop of column,Gbottomgthenh/n/d/s/pfor Home / Notifications / Discover / Suggested / Profile- Space leader →
nnew post,/search,ssettings,fsaved feeds,?help,1–9jump to column N ?toggles the keyboard help overlay- Esc closes the topmost modal; ⌘K opens search anywhere
Operational
- Self-update notifier — checks GitHub releases on launch
- Optional system-level auto-updater (launchd job, hourly) that rebuilds + reinstalls from
main - macOS app activation done right — Cmd+Up / BetterSnapTool / Raycast hotkeys reach Smooblue without clicking the menu bar first
git clone https://github.com/SmooAI/smooblue.git
cd smooblue
./scripts/bundle-macos.sh # builds release + creates dist/Smooblue.app
cp -R dist/Smooblue.app /Applications/
xattr -dr com.apple.quarantine /Applications/Smooblue.app
open /Applications/Smooblue.appOr stay current automatically (hourly rebuild + reinstall from main):
sed -e "s|@USER@|$USER|g" -e "s|@HOME@|$HOME|g" \
scripts/ai.smoo.smooblue.updater.plist.template \
> ~/Library/LaunchAgents/ai.smoo.smooblue.updater.plist
launchctl load ~/Library/LaunchAgents/ai.smoo.smooblue.updater.plistThe updater is a no-op when there are no new commits on main or your working tree is dirty — safe to leave running.
| Data | Sent to | When |
|---|---|---|
| Handle, password (typed) | Nowhere — Bluesky handles auth | Never; OAuth means Smooblue never sees your password |
| Bluesky access token | Your PDS (which proxies to AppView) | Every XRPC call |
| Session (DPoP key + tokens) | Local file (0600 in config dir) | After sign-in; survives rebuilds (Keychain ACL was unreliable) |
| Display name, handle, DID | Smoo AI CRM (opt-in only) | Only if you tick "Stay in touch with Smoo AI" during sign-in |
The Smoo AI CRM sync is off by default and reversible from Settings.
# requires Rust 1.80+
cargo run --release -p smooblue-app # dev launch
cargo test --workspace --lib # unit tests (91 of them)
bash scripts/bundle-macos.sh # produces dist/Smooblue.app
bash scripts/build-icons.sh # regen PNG icons from icon.svgDemo mode (no network, canned data — useful for screenshots):
SMOOBLUE_DEMO=1 cargo run -p smooblue-app
SMOOBLUE_DEMO=1 SMOOBLUE_DEMO_SCALE=large cargo run -p smooblue-app # 500-post scale testsmooblue/
├── crates/
│ ├── smooblue-app/ # Dioxus desktop binary + components
│ ├── smooblue-atproto/ # XRPC client (timeline, profile, notifs, feeds, ...)
│ ├── smooblue-crm/ # opt-in Smoo CRM sync
│ ├── smooblue-oauth/ # ATproto OAuth (PAR + PKCE + DPoP)
│ └── smooblue-theme/ # CSS tokens + shared sheet
├── assets/
│ ├── icons/ # generated PNG app icons (16 → 1024)
│ ├── icon.svg # source SVG (Bluesky butterfly + smoo monogram chip)
│ └── styles.css # smooblue-specific component CSS
├── media/
│ └── smooblue-demo.mp4 # demo recording
├── scripts/
│ ├── bundle-macos.sh
│ ├── build-icons.sh
│ ├── smooblue-update.sh
│ └── ai.smoo.smooblue.updater.plist.template
└── Cargo.toml # Cargo workspace
- DMs (
chat.bsky.*) - Pinned posts ordering inside a thread sheet
- Trending topics → live deep-link to bsky search
- Cross-platform builds (Linux / Windows) — code is portable, just needs CI
Issues and PRs welcome — see CONTRIBUTING.md.
Smooblue is not affiliated with Bluesky Social, PBC. "Bluesky" and the Bluesky butterfly are trademarks of Bluesky Social, PBC.
