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.
- 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 with debounced live queries.
- Supports source filters, configurable result limits, and server-side sorting.
- Renders rich-text facets for links, mentions, and hashtags.
- Includes desktop-side refresh progress events, partial-refresh warnings, and a frontend log viewer.
- 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 as you type, or leave it empty to browse recent posts.
- Filter results by
All,Saved, orLiked, and adjust the result count from theResultsselector. - Click a row to inspect a post, or open
Aboutto view the current build version. - Use
Open on Blueskyin the reading pane to open the original post onbsky.app.
Cmd+KorCtrl+K: focus the search inputCmd+Shift+RorCtrl+Shift+R: refresh indexed dataCmd+LorCtrl+L: toggle the log viewerEsc: close the About dialog
- Go
- Wails v2
- Node.js
pnpm
git clone <your-repo-url>
cd bsky-browser-gui
pnpm --dir frontend installIf you prefer task, the same setup is available through:
task initStart the desktop app with hot reload:
wails devOr:
task devTo run the dev app with an explicit build tag:
task dev VERSION=v0.1.0Useful checks:
go test ./...
pnpm --dir frontend check
task lint
task testOAuth and Local Data
- OAuth callback URL:
http://127.0.0.1:<random-port>/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.
Create a macOS app bundle:
task buildVerified output:
build/bin/bsky-browser-gui.app
To embed a specific build tag, override VERSION:
task build VERSION=v0.1.0The desktop binary also reports its embedded build tag:
./bsky-browser-gui --version



