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 16

feat(threadbare): refine the lockup and explain each view
feat(threadbare): add score details, row actions, shareable scans and large-account controls
feat(longread): add specialized reach, cohort, labels and forks
feat(threadbare): condense results into 1/n thread rows
feat(longread): return compact root snippets and thumbnails
feat(threadbare): render author identity and engagement in root cards
feat(longread): expose author profiles and reply counts for embedded roots
feat(threadbare): add the THREADBARE lockup and embedded root cards
feat(longread): score threads with local craft signals and embed root previews
feat(threadbare): match the substandard theme and show local labels
feat(longread): label threads with local common words
build(threadbare): deploy the app at threadbare.substandard.blog
feat(threadbare): add the browser WASM app
feat(longread): embed quotes, hide published threads and add a publication view
test(longread): cover ranking, paging, opt-out and export
feat(longread): add scan and export commands