GitHub profile as living artifact

Self-updating without becoming self-important.

A tiny system that turns public GitHub activity into a concise profile README, refreshes weekly, and keeps the human in control.

The problem

Profiles rot because they are marketing copy.

The useful signal is already in the work: repos pushed, PRs merged, issues opened, workflows shipped. The profile should sample that stream and compress it.

$ gh api users/erain/events/public
PushEvent        erain/glue-review-eval
PullRequestEvent erain/glue
PullRequestEvent GoogleCloudPlatform/k8s-stackdriver

facts first, phrasing second
The architecture

A README generator with a boring blast radius.

GitHub is the source of truth. OpenRouter is optional copy refinement. Deterministic fallback keeps the job useful when free models rate-limit.

GitHub API repos + events Python job facts -> README README profile page OpenRouter optional polish fallback: linked deterministic bullets
The implementation

Three small contracts beat one clever prompt.

The script owns facts, the model owns tone, and the workflow owns delivery. Each layer can fail without taking down the profile.

01

Collect facts

Recent repos, public events, and selected project links become structured JSON.

02

Generate bullets

OpenRouter tries free models, requires linked bullets, then falls back if output is weak.

03

Publish safely

GitHub Actions commits only README changes and keeps the repository self-contained.

The guardrails

The cool part is what we refused to automate.

The profile stays compact because the generator has a narrow output shape. No infinite timeline, no vanity metrics, no fragile dependence on model availability.

Short by designOne terminal block, three current-signal bullets, toolbelt, contact.
LLM optionalThe profile updates even when free models return 429s or empty content.
Links requiredGenerated bullets are rejected unless they keep Markdown links intact.
Human-editableThe whole thing is still just a README and a Python script.
The bigger pattern

Now make the learning itself publishable.

The profile job became a template: agents can summarize engineering work into self-contained HTML decks, commit them, deploy them, and return a URL.

$ agent publish-slides
input:  conversation + git history + repo context
output: content/public/decks/self-updating-github-profile/index.html
commit: knowledge-pages@main
url:    https://knowledge.11tech.xyz/decks/self-updating-github-profile/
Takeaways

Make publishing boring, then let the artifacts get interesting.

1

Repo for artifacts

Static HTML, stable URLs, generated gallery.

2

Repo for skills

Reusable instructions, templates, scripts, validation.

3

Visibility modes

Public, unlisted, and protected preview later.