OverviewFilesCommitsIssuesDocsReleasesPeers

atproto-bridge commits / a2083ea

bridge: forward Cache-Control: no-store on favela service proxy (fix stale feed)
proxyToFavela forwarded only content-type + content-length + CORS, DROPPING the Cache-Control header favela-web sets on getFeedSkeleton. So favela said no-store, the membrane stripped it, and bsky's AppView / CDN / the Apache proxy were free to cache the (dynamic) feed skeleton — serving it stale for days while the generator itself was current. That is the "feed stuck 3 days behind, profile fine" symptom: repos federate via the firehose (push), but feeds are pull-only and a cached skeleton freezes them. Fix: set `Cache-Control: no-store, no-cache, max-age=0, must-revalidate` on the favela-proxied service reads (getFeedSkeleton/describeFeedGenerator/queryLabels) so bsky re-polls the current skeleton every time. Ships with the front re-key durability fix (0.9.22). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
a2083ea2f73f350028562d2c156f4f66dcfd752c
by plankatron <fleeky@gmail.com> · 2026-07-18T00:59:13.000Z

Changed files (2) +6 -2

package.json +1 -1
……@@ -1,6 +1,6 @@
11{
22 "name": "atproto-bridge",
3 "version": "0.9.22",
3 "version": "0.9.23",
44 "description": "Stateless keyless atproto MEMBRANE — fronts self-custody hyper-proto-peers to bluesky over HTTP/WS, holds no keys and never signs. Bare-runnable. Deploy root / flat closure over the identity+repo+store+pds packages.",
55 "type": "module",
66 "main": "index.js",
pds/lib/favela-proxy.js +5 -1
……@@ -45,6 +45,10 @@ export async function proxyToFavela (req, res, { nsid, search, cors, doFetch, up
4545 res.writeHead(502, { 'content-type': 'application/json', 'content-length': b.length, ...cors })
4646 return res.end(b)
4747 }
48 res.writeHead(up.status, { 'content-type': up.contentType || 'application/json', 'content-length': up.body.length, ...cors })
48 // These favela service reads are DYNAMIC — getFeedSkeleton returns new roster posts every minute. Mark
49 // them no-store so bsky's AppView / any CDN / the Apache proxy in front NEVER cache them and serve a
50 // stale ("stuck days behind") feed. favela sets this header too, but this proxy previously forwarded only
51 // content-type/length and DROPPED it, so bsky never saw it and cached the skeleton. Set explicitly here.
52 res.writeHead(up.status, { 'content-type': up.contentType || 'application/json', 'content-length': up.body.length, ...cors, 'cache-control': 'no-store, no-cache, max-age=0, must-revalidate' })
4953 res.end(up.body)
5054}