OverviewFilesCommitsIssuesDocsReleasesPeers

favela-web commits / bd87516

0.3.86: show a bsky account's posts even when we hold their profile
Reported: a bsky user's page shows no posts and no images. Two faults, and the second only becomes visible once the first is fixed. 1. THE GATE WAS WRONG if (lensProfile && lensReader && LENSES.length && !result.posts.length) lensProfile is itself only fetched when we hold NO profile record for the DID. So the moment a bsky account's profile arrived through a backlink — which is the common case, that is how they get discovered — the header rendered from our own data, lensProfile stayed null, and their posts were never requested. The page then looked legitimate and empty: real name, real avatar, "no posts from this author" for someone who posts daily. The condition that was meant is the one the block exists for: we hold nothing of our OWN to show. A DID we index renders our records; anything else may be filled in from a named foreign source, unchanged in every other respect — attributed, no affordances, never retained (DESIGN §7.6 Tier C). 2. NO LENS IS CONFIGURED ANYWHERE, so the whole path is dead regardless Not a code fault — the default is deliberately none, so an unconfigured favela reaches out to nobody. But it means this feature has never run in production. ⚠ CONFIG, NOT SHIPPED: set FAVELA_BRIDGE_URL to enable it. Our own membrane already answers app.bsky.feed.getAuthorFeed (verified against pds.7rnx.net), so reads go through our bridge and no bsky URL or credential lands in any node's config, which is exactly what lenses.js's shorthand was built for. Verified end to end locally with FAVELA_BRIDGE_URL=https://pds.7rnx.net against a real bsky account: "30 posts via bsky · not indexed by this node", post text, and feed thumbnails from the lens CDN. Before the fix the same page said "no posts from this author". Suite green. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bd8751647d1038ee0f0513a0a5c53d67fd251787
by plankatron <fleeky@gmail.com> · 2026-08-25T18:52:44.000Z

Changed files (2) +11 -2

bin/favela-web.js +10 -1
……@@ -1898,7 +1898,16 @@ const server = http.createServer(async (req, res) => {
18981898 // not a remote view of them. Shown as a NAMED foreign source with no affordances, same rule as the
18991899 // thread view's lens replies — acting on a post we do not hold would be a lie.
19001900 let lensPosts = null
1901 if (lensProfile && lensReader && LENSES.length && !(result && result.posts && result.posts.length)) {
1901 // ⛔ NOT GATED ON lensProfile. It used to be, and lensProfile is itself only fetched when we hold NO
1902 // profile record — so the moment a bsky account's profile arrived through a backlink, the header
1903 // rendered from our own data, lensProfile stayed null, and their posts were never asked for. The
1904 // page then looked legitimate and empty: a real name, a real avatar, "no posts from this author"
1905 // for someone who posts daily. Reported 2026-08-25.
1906 //
1907 // The real condition is the one this is for: we have nothing of our OWN to show for this DID. A DID
1908 // we index renders our records; anything else may be filled in from a named foreign source.
1909 const holdNothing = !(result && result.posts && result.posts.length)
1910 if (lensReader && LENSES.length && holdNothing) {
19021911 try {
19031912 const l = LENSES[0]
19041913 // The tab maps to the same getAuthorFeed filter the lexicon defines, so Media stays Media.
package.json +1 -1
……@@ -1,6 +1,6 @@
11{
22 "name": "favela-web",
3 "version": "0.3.85",
3 "version": "0.3.86",
44 "description": "favela-web — the web/SSR surface of Favela, the native P2P-local, community-owned social client + appview over the self-custody atproto stack (hyper-proto-peer). One of the Favela surfaces (alongside favela-cli and favela-native). bsky is an optional POSSE export, not the home. See DESIGN.md.",
55 "type": "module",
66 "main": "bin/favela-web.js",