bsky-browser#
A desktop app for searching your Bluesky bookmarks and likes.
I made this to stop having to
CTRL/CMD+Fand infinite scroll through my saved and liked posts.
What It Does#
- Authenticates with Bluesky using loopback OAuth.
- Stores session state, tokens, and DPoP metadata in a shared SQLite database.
- Indexes bookmarks and likes into a local FTS5-backed search index.
- Lets you browse recent indexed posts or search by text.
- Renders rich-text facets for links, mentions, and hashtags.
- Includes desktop-side refresh progress events and a frontend log viewer.
Screenshots#
Usage#
- Launch the app.
- Enter your Bluesky handle and complete OAuth in the browser.
- Click
Refreshto index bookmarks and likes. - Use the search box to run FTS queries, or leave it empty to browse recent posts.
- Filter results by
All,Saved, orLiked. - Click a row to open the original post on
bsky.app.
Keyboard Shortcuts#
Cmd+KorCtrl+K: focus the search inputCmd+RorCtrl+R: refresh indexed dataCmd+LorCtrl+L: toggle the log viewer
Project#
Requirements#
- Go
- Wails v2
- Node.js
pnpm
Install#
git clone <your-repo-url>
cd bsky-browser-gui
pnpm --dir frontend install
If you prefer task, the same setup is available through:
task init
Development#
Start the desktop app with hot reload:
wails dev
Or:
task dev
Useful checks:
go test ./...
pnpm --dir frontend check
OAuth and Local Data
- OAuth callback URL:
http://127.0.0.1:8787/callback - Default database path:
~/.config/bsky-browser/bsky-browser.db - Default log directory:
~/.config/bsky-browser/logs/
You can override paths with:
BSKY_BROWSER_DATABSKY_BROWSER_LOGXDG_CONFIG_HOME
Project Structure
- app.go: app startup/shutdown wiring
- auth_service.go: Bluesky OAuth flow and session refresh
- database.go: SQLite access, migrations, FTS search
- index_service.go: bookmark/like indexing
- search_service.go: Wails search bindings
- log_service.go: log event streaming
- frontend/src/App.svelte: main UI shell
Notes
- Session state is persisted so token refreshes and DPoP nonce updates survive app restarts.
- Empty searches intentionally return recent posts instead of sending an invalid FTS wildcard query.
Production Build#
Create a macOS app bundle:
wails build
Verified output:
build/bin/bsky-browser-gui.app
Equivalent task:
task build