A second ✦ in the menu bar
that pulses when new blocks land.
Sparrow.app is a small macOS menu-bar app that polls
/sparrow/api/latest.json at a cadence you choose, shows
the latest block and a "new since last open" count, and posts a
Notification Center alert when fresh broadcasts arrive. No Dock
icon, no Cmd-Tab entry — just ✦ in the status bar,
same glyph as the hosted HUD.
- menu bar
✦ in the status bar
A single glyph. Grows an ember "new" count when fresh blocks land.
- polling
Quiet, on a cadence
Hits /sparrow/api/latest.json every 5 minutes by default (30 s floor, 1 h ceiling).
- notifications
One per block · digest beyond three
Notification Center alerts for arrivals; a single digest when more than three land at once.
- preferences
Endpoint, interval, notifications
A small AppKit panel — no onboarding flow, no account. Point it at a fork or local dev if you want.
- privacy
One URL, no telemetry
Sparrow.app opens exactly one network connection: the feed URL you chose. Nothing else leaves the device.
- footprint
No dock icon, no cmd-tab
LSUIElement = true. Lives in the menu bar and the menu bar only.
- one
Clone or download the source
github.com/mhoydich/sparrow-app — self-contained Swift package, no external dependencies.
- two
Build with Xcode or SPM
open Package.swiftfor a proper bundled.app(recommended), orswift run SparrowAppfor a quick menu-bar-visible test from the terminal. - three
Grant notification permission
On first run macOS asks once. Decline safely — the app still works, it just stops posting alerts.
- four
Open Preferences if you want
⌘, from the menu. Feed URL defaults to https://pointcast.xyz/sparrow/api/latest.json; change it if you're running a fork.
cd sparrow-app
open Package.swift # Xcode — recommended, signs + bundles
# or
swift run SparrowApp # terminal — live menu-bar item, no bundle Tiny package — one executable target, one Resources/Info.plist, about 500 lines of Swift split across seven files. Reads in one sitting. Source: mhoydich/sparrow-app.
The endpoint at /sparrow/api/latest.json is a
polling-shaped companion to the Atom feed: snake_case keys,
summary-only fields, last 24 blocks, cache-friendly. The native
app decodes it directly into the same Block struct
the menu bar renders.
{
"total": 186,
"updated_at": "2026-04-21T...",
"window": 24,
"origin": "https://pointcast.xyz",
"blocks": [
{
"id": "0362",
"title": "AgarChat — instant messenger meets agar.io",
"dek": "...",
"channel": "FD",
"type": "LINK",
"mood": null,
"timestamp": "2026-04-21T12:00:00-08:00",
"author": "mh+cc",
"url": "/b/0362",
"sparrow_url": "/sparrow/b/0362"
}
]
}