Verified against Beeper Desktop 4.3.73 with a real token:
- inbox=primary combined with unreadOnly=true returned 0 of 78 genuinely
unread chats, and includeMuted=false returned muted chats anyway. Both
params are gone; muted/archived/low-priority are now decided here from
isMuted/isArchived/isLowPriority, and a hand-marked-unread chat counts.
- Snippets now come from GET /v1/messages/search (1.1 ms/chat) instead of
GET /v1/chats/{id}/messages (145 ms/chat), which is kept as the fallback
for chats the index has not reached. list --limit 50 went 3.33s -> 0.16s.
3.1 KiB
Setup
1. Turn on the Beeper Desktop API
Beeper Desktop serves a local-only HTTP API on http://localhost:23373. Check
it is up — this endpoint needs no token:
curl -s http://localhost:23373/v1/info
You should get JSON describing the app and "status": "running". If the
connection is refused, Beeper Desktop is not running, or the API is disabled in
its settings.
2. Create an access token
In Beeper Desktop: Settings → Integrations → create an access token.
Read access is all this plugin needs. It calls exactly seven endpoints:
| Call | Why |
|---|---|
GET /v1/info |
Tell "Beeper is down" apart from "the token is wrong" |
GET /v1/accounts |
Network names for the chips, and the account count |
GET /v1/chats/search |
The unread pile (unreadOnly=true) |
GET /v1/messages/search |
The last message of a visible row, for the snippet |
GET /v1/chats/{chatID}/messages |
Snippet fallback for a chat the index has not reached |
POST /v1/chats/{chatID}/read |
Mark a chat read |
POST /v1/focus |
Bring Beeper Desktop forward on a chat |
Nothing else. No sends, no edits, no reactions, no drafts.
3. Store the token
~/.config/omarchy/plugins/prdlk.beeper/bin/omarchy-beeper auth
The command refuses to run unless stdin and stderr are both terminals, so a
token can never be piped in from a script or a shell history. It reads the
token with a hidden prompt, verifies it with one GET /v1/accounts, and only
then writes it to:
~/.config/omarchy-beeper/secrets/token.json # mode 600
~/.config/omarchy-beeper/secrets/ # mode 700
The write is atomic: a temp file in the same directory, fchmod 600, fsync,
rename, then fsync on the directory.
4. Check it
~/.config/omarchy/plugins/prdlk.beeper/bin/omarchy-beeper list --limit 5
A healthy answer starts with {"ok": true, "unread": …}. Then click the bar
icon.
Troubleshooting
| Message | Meaning |
|---|---|
Beeper Desktop is not running |
Nothing is listening on localhost:23373. Start Beeper. |
token missing or invalid; run: omarchy-beeper auth |
No token stored, or Beeper rejected it (401/403). Re-run auth. |
secret file for beeper is too open; chmod 600 it |
Someone widened the token file. chmod 600 ~/.config/omarchy-beeper/secrets/token.json. |
secret directory for beeper is too open; chmod 700 it |
chmod 700 ~/.config/omarchy-beeper/secrets. |
showing the newest 200 unread chats |
The pile is deeper than the display cap. Use A to clear it. |
| Snippets are blank | Beeper is still indexing, or that chat has only media. Titles and counts are still correct. |
python3 is required |
The bar could not find python3 on PATH. |
The bar is not a login shell, so bin/omarchy-beeper only extends PATH with
~/.local/share/mise/shims and ~/.local/bin. If your python3 lives
somewhere else, symlink it into ~/.local/bin.
Removing everything
omarchy plugin remove prdlk.beeper
rm -rf ~/.config/omarchy-beeper
Then revoke the token in Beeper Desktop → Settings → Integrations. Removing the plugin does not revoke it for you.