GitHub Actions Workflows
The Unified Profile Updater workflow runs every generator job on a daily schedule.
Workflow file
.github/workflows/profile-updater.yml
Triggers: push to main/master/dev, daily at 01:00 UTC, workflow_dispatch.
Manual dispatch also exposes metrics_probe_mode, which runs only the probe lane for the full historical lowlighter/metrics surface.
Job graph
probe-full-metrics (manual only)
update-starred-lists
▼
generate-assets
▼
generate-profile-metrics
▼
generate-event-art
▼
update-readme-wakatime
▼
update-skillsJob details
update-starred-lists
Uses the starred CLI to rebuild .github/assets/topics.md and .github/assets/languages.md from your GitHub stars.
uv run starred --username wyattowalsh --sort \
--filename .github/assets/languages.md
uv run starred --username wyattowalsh --sort --topic --topic_limit 500 \
--filename .github/assets/topics.mdCommits both files with chore(data): update awesome-stars lists.
generate-assets
Depends on update-starred-lists. Generates:
- QR code —
generate qr - Word cloud by topic —
generate word-cloud --from-topics-md→wordcloud_typographic_by_topics.svg - Word cloud by language —
generate word-cloud --from-languages-md→wordcloud_typographic_by_languages.svg
Commits to .github/assets/img/.
update-readme-wakatime
Uses anmol098/waka-readme-stats to inject WakaTime coding stats. Requires WAKATIME_API_KEY secret.
generate-profile-metrics
Uses lowlighter/metrics pinned to the v3.34 release SHA 65836723097537a54cd8eb90f61839426b4266b6 for the stable GitHub-native cards:
metrics.svg— personal metrics (header, activity, community, metadata, languages, notable, topics)metrics.additional.svg— stable GitHub-native secondary panels (featured repositories, recently starred repositories, stargazers)
The same job also generates repo-owned supplemental cards that replace the upstream-brittle or deprecated panels:
metrics-habits.svg— custom GitHub-backed coding habits cardmetrics-activity.svg— custom GitHub-backed recent activity cardmetrics-music.svg— custom Spotify-backed recently played cardmetrics-posts.svg— custom X-backed latest posts card
The intended steady state for the canonical repo is a stable two-card lowlighter surface plus the validated supplemental cards below it in the README.
The job now hardens metrics updates with scripts.metrics_svg:
- backs up the previously committed metrics SVGs before regeneration
- validates each render and rejects known degraded payloads
- validates supplemental assets against a manifest of required markers
- restores the previous valid
lowlighterasset if a new SVG is malformed, contains a known error payload, or matches the placeholder SVG - commits only after both stable cards plus all enabled supplemental cards pass validation
Placeholder metrics SVGs are treated as invalid recovery artifacts, not the desired output, and are never the intended steady state.
probe-full-metrics
Manual diagnostics lane for the legacy fuller lowlighter/metrics surface. It exists to answer questions like:
- does the current
METRICS_TOKENsatisfy the repositories block? - is the Spotify refresh token healthy?
- are the X OAuth1 credentials present?
- do upstream
habitsoractivitypanels still render degraded payloads?
It uploads probe SVG artifacts and fails closed if the probe renders or validation fail.
generate-event-art
Fetches live metrics + history via scripts/fetch_metrics.py and scripts/fetch_history.py, then runs uv run python -m scripts.cli generate living-art to refresh the canonical living-art timelapse surface.
The job stages and commits:
.github/assets/img/living-*.gif.github/assets/img/living-art-manifest.json.github/assets/img/living-art-preview.htmldocs/public/showcase/living-*.gifdocs/public/showcase/living-art-manifest.jsondocs/public/showcase/living-art-preview.html
The uploaded staging bundle also includes the fetched metrics.json and history.json inputs plus the mirrored docs showcase surface for review.
update-skills
Depends on update-readme-wakatime. Runs:
generate readme-sections— assembles all dynamic README sectionsgenerate skills— re-renders skills badges
Commits:
README.md.github/assets/img/readme/featured-card-*.svg.github/assets/img/readme/featured-projects.manifest.json- mirrored docs showcase assets under
docs/public/showcase/featured-projects/ docs/public/showcase/featured-projects.manifest.json
Secrets used by the workflow
| Secret | Used by | Notes |
|---|---|---|
GITHUB_TOKEN | All jobs | Auto-provided by Actions |
METRICS_TOKEN | generate-profile-metrics, probe-full-metrics | Canonical repo: expected classic PAT for repo-aware metrics (read:user, repo, read:org, and optionally gist). Forks can omit it, but repository-aware sections will be reduced and recovery may preserve the last valid asset. |
WAKATIME_API_KEY | update-readme-wakatime | Optional WakaTime API key; README WakaTime update is skipped when absent |
SPOTIFY_CLIENT_ID | generate-profile-metrics, probe-full-metrics | Optional for the repo-owned metrics-music.svg supplemental card |
SPOTIFY_CLIENT_SECRET | generate-profile-metrics, probe-full-metrics | Optional for the repo-owned metrics-music.svg supplemental card |
SPOTIFY_REFRESH_TOKEN | generate-profile-metrics, probe-full-metrics | Optional for the repo-owned metrics-music.svg supplemental card; mint it with uv run readme auth spotify-refresh-token and store it as a repo secret |
X_API_KEY | generate-profile-metrics, probe-full-metrics | Optional X API key for the repo-owned metrics-posts.svg supplemental card via OAuth 1.0a user-context |
X_API_KEY_SECRET | generate-profile-metrics, probe-full-metrics | Optional X API key secret for the repo-owned metrics-posts.svg supplemental card |
X_ACCESS_TOKEN | generate-profile-metrics, probe-full-metrics | Optional X access token for the repo-owned metrics-posts.svg supplemental card |
X_ACCESS_TOKEN_SECRET | generate-profile-metrics, probe-full-metrics | Optional X access token secret for the repo-owned metrics-posts.svg supplemental card |