How bradnichol/personal-blog works
This repository is a small static personal site plus a publishing workflow for its Recent work feed. The main workflow fetches allowlisted GitHub activity, filters and groups it, prepares sanitized input for an external coding agent, validates the candidate summaries, and writes a public JSON artifact that the site fetches and renders. The README documents this workflow and the reusable skill; sampled source supports the detailed extraction, validation, state, and rendering links shown. Other site content, including RotationLab and contact information, is served as static HTML.
Main entry points: prepare.mjs Prepare activity · finalize.mjs Finalize artifact · github.mjs GitHub activity extractor · SKILL.md Publishing skill
Components 17
Personal site
- Homepage
public/index.html - Contact page
public/contact/index.html - Recent work renderer
public/scripts/recent-work.js - Recent work feed
public/data/recent-work.json
Activity preparation
- Prepare activity
scripts/activity/prepare.mjs - Activity configuration
scripts/activity/config.mjs - GitHub activity extractor
scripts/activity/github.mjs - Filter and group activity
scripts/activity/eligibility.mjs
Safe summaries
- Text redaction
scripts/activity/text.mjs - Summarizer input
scripts/activity/model.mjs
Publishing and state
- Publishing skill
skills/publish-recent-work/SKILL.md - Finalize artifact
scripts/activity/finalize.mjs - Public contract
scripts/activity/contract.mjs - Activity state
scripts/activity/state.mjs
Other components
- Site visitor
- GitHub API
- Coding agent
Connections 23
- Site visitor → Homepage: visits
- Site visitor → Contact page: visits
- Homepage → Recent work renderer: loads
- Recent work renderer → Recent work feed: fetches
- Publishing skill → Prepare activity: runs preparation
- Publishing skill → Coding agent: invokes
- Publishing skill → Finalize artifact: runs finalization
- Prepare activity → Activity configuration: reads config
- Prepare activity → GitHub activity extractor: extracts activity
- Prepare activity → Filter and group activity: groups activity
- Prepare activity → Summarizer input: builds input
- Prepare activity → Activity state: reads and records
- GitHub activity extractor → GitHub API: requests activity
- GitHub activity extractor → Filter and group activity: selects eligible
- GitHub activity extractor → Text redaction: redacts source text
- GitHub activity extractor → Activity state: creates source keys
- Summarizer input → Text redaction: sanitizes input
- Prepare activity → Coding agent: provides prepared input
- Coding agent → Finalize artifact: returns candidates
- Finalize artifact → Public contract: validates candidates
- Finalize artifact → Activity configuration: reads private terms
- Finalize artifact → Activity state: reads and updates
- Finalize artifact → Recent work feed: writes artifact