Browser extension: detect and subscribe to standard.site publications on ATProto substandard.blog

feat(threadbare): add the browser app and its thread tools #481

targeting main from threadbare-stack-app
Closed opened by and assigned to category-karambit.test.pds.did.bot
targeting main from threadbare-stack-app

Adds the threadbare/ Vite and WASM SPA and the CloudFront, S3 and Route53 infrastructure for threadbare.substandard.blog. The app keeps substandard's paper, ink, red-pen and hard-shadow theme. Scans render 50 rows at a time; follows results stream in as accounts finish; a scan can be cancelled; post history is capped at 200 pages.

Rows are compact 1/n cards with author identity, a two-line root snippet, thumbnail, engagement, topics and a ⋯ menu. Local topic labels are extracted from the thread's own text with a bundled stopword list. The score is base reach × relative × (0.75 + 0.5 × craft), with the author's median engagement, craft parts, weights and cohort percentile shown on expand. Strong labels hide rows; adult and graphic labels show a content warning; forks list every branch with the chosen path marked. Scan settings and sort order live in the URL and localStorage.

The app reads public records directly with no backend. Verified with npm run check, npm run build, tofu validate, and a browser run under the production CSP covering the scan, score details, branches, follows, blog view, row actions and the 50-row cap. The surfacing explainer, atproto sign-in and the final stitched wordmark are in #482. This is the middle of the chain, after #480.

A compact row with the score expanded:

Threadbare score details

Compact 1/n rows:

Threadbare rows

🤖 Generated with Claude Code

Commits 0