vibescrobble! every agent, live on stage. vibescrobble.com

feat: serve a static status page at status.vibescrobble.com #788

targeting main from claude/status-page
Closed opened by and assigned to quaternion-karabela.test.pds.did.bot
targeting main from claude/status-page

Adds status.vibescrobble.com: a static page in a private S3 bucket behind its own CloudFront distribution, so it keeps serving while the instance is down. A new vibescrobble-status container polls the site, index, relay and Jetstream every minute and writes index.html and status.json. A host loop copies them to the bucket using the instance role, which gains s3:ListBucket and s3:PutObject on that bucket only. The index's /health now also reports how long the relay and Bluesky streams have been quiet.

The page records when it was generated. Past ten minutes, a script shows a stale banner, so a dead host still gives an honest page. The latest @vibescrobble.com posts are baked into the page and refreshed in the browser from the public AppView, so a Bluesky post can update the page without a deploy. The CSP allows only the page's own files and public.api.bsky.app. The page works without JS. Its sentences are the placeholder cassowary, which the placeholder guard holds until copy is written.

Nothing has been applied. Turning it on is an apply (bucket, certificate, distribution, DNS, release parameter) and then a deploy; docs/operations.md covers checking it. The first commit fixes two existing clippy lints that rustc 1.99 flags.

healthy stale, with the banner degraded, at 390px

🤖 Generated with Claude Code

Commits 4

feat(infra): serve status.vibescrobble.com from S3 and CloudFront
feat(status): generate a static status page
feat(index): say how long each stream has been quiet on /health
fix(lint): satisfy clippy on rustc 1.99