Initial build. 6 modes (profiles, posts, followers, following, search_accounts,
search_posts) against the AT Protocol's public AppView (public.api.bsky.app) — no login,
no proxy needed for anything except search_posts, which requires a Bluesky App Password
(Bluesky's own requirement, confirmed live: 401 AuthMissing on the authenticated host without
a session token).
Verified live against the real API before shipping (not just mocks): getProfile,
getAuthorFeed, getFollowers, searchActors all confirmed working end-to-end against real
Bluesky data (bsky.app, bitcoin.bsky.social). search_posts auth flow (createSession +
Bearer token) also confirmed live on 2026-09-11 using a real Bluesky App Password (0xgollum
account): login succeeded, keyword search on "bitcoin" returned real posts. All 6 modes are now
verified against the real API, not just mocks.
18 unit tests (row flattening against real captured payload shapes, client against a mock
transport, orchestration mode dispatch / free-tier cap / skip-on-error-without-billing).
Cold review (same day) - 2 real issues found and fixed before shipping:
Quota for posts/followers/following across multiple handles was split evenly and fixed
upfront; a handle with fewer results than its share (e.g. an inactive account) wasted the
rest instead of it rolling over to the other handles. Fixed: the split is now recomputed
after each handle from what's actually left.
No retry on a transient failure - a single network hiccup or 5xx skipped a whole handle/term
outright. Added one retry with a short delay for network errors and 5xx only (a 4xx - bad
handle, blocked, not found - is not transient and is still skipped immediately). Also fixed:
a page with a cursor but zero items would have looped forever instead of stopping.
21 tests total after the fixes (3 new, covering both issues). Re-verified live against the
real API after the fix (paginate against 0xgollum.bsky.social and bsky.app).