Bring a little retro warmth to your GitHub profile: turn your contributions into a CRT “signal board” SVG — animated scanlines, noise, and a dashboard-style vibe — generated automatically on a schedule.
github-profile-crt is a GitHub Action that:
- Fetches contribution data for a user (GraphQL) or an organization (REST aggregation)
- Renders a CRT-style weekly chart as SVG
- Applies themes (dark + light variants), custom palettes are supported too
- Optionally commits & pushes the generated files back to your repo
It’s designed for:
- Profile READMEs (user and organization)
- Project READMEs (if you want a living “activity panel” in a repo)
- User profile README: create a public repo named
.githubunder your user account, then addprofile/README.md - Organization profile README: create a public repo named
.githubunder the organization, then addprofile/README.md
(Those are GitHub’s rules; this action simply generates files you embed.)
Create a workflow file in the repository that will store the generated SVGs — your profile .github repo, your organization .github repo, or any other repository you want to use for hosting them.
Example: .github/workflows/github-profile-crt.yml
name: Build CRT contribution SVGs
on:
workflow_dispatch:
schedule:
# Every day at 10:15 UTC (edit to taste)
- cron: '15 10 * * *'
permissions:
contents: write
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Generate SVGs
uses: stefashkaa/github-profile-crt@v1
with:
output-dir: assets
themes: crt
# github-user - set for a different user/org or to aggregate org data (defaults to repo owner)
# github-token - set for org data access (defaults to GITHUB_TOKEN)
# include-org-private - set to 'true' to include private repos in org aggregation (defaults to 'false')- For personal accounts, enable private contributions in your profile settings
- For organizations, use a custom token if you want to include private repository activity: see setup steps
Commit, push, and run the workflow once (or wait for the schedule).
In your profile/README.md (or somewhere else), embed the generated SVG:
<picture>
<source media="(prefers-color-scheme: dark)" srcset="../assets/crt-dark.svg">
<source media="(prefers-color-scheme: light)" srcset="../assets/crt-light.svg">
<img alt="My CRT contribution chart" src="../assets/crt-dark.svg" width="100%">
</picture>The picture element ensures the correct theme variant is shown based on user preference. Adjust paths if your SVGs are in a different location.
Tip: keep the SVGs in a simple folder like assets/ so paths stay stable.
Preset themes:
- crt: the original green terminal glow
- amber: warm fossil-era monitor amber
- ice: cold blue signal from the future
- ruby: red alert with style
- mint: fresh green with a cleaner edge
- mono: grayscale, quiet, and sharp
- winamp: loud Y2K media-player nostalgia
- neon: midnight cyber-club voltage
- rainbow: pure color chaos, but joyful
- chaos: unstable signal, controlled damage
- chaos-max: full visual meltdown
- static: no motion, just clean signal
Use one, a list, or all:
with:
themes: crt,rainbow,winampwith:
themes: allWant your own custom theme? Customize it!
All inputs are optional unless stated otherwise.
| Input | Default | What it does |
|---|---|---|
github-token |
${{ github.token }} |
Token for reading data and (optionally) pushing commits. |
github-user |
repo owner | GitHub login to render (user or org). |
output-dir |
assets |
Output folder written inside the workspace repo. |
themes |
crt |
Themes to render: comma-separated list, all, and/or custom. |
year |
current year | If current year: rolling last ~365 days; otherwise full calendar year. |
commit-and-push |
true |
Commit & push changed SVGs back to the repo. |
commit-message |
auto | Custom commit message for generated files. |
show-grid |
true |
Toggle chart grid lines. |
show-stats |
true |
Toggle the dashboard panels (language + activity vector). |
show-stats-footer |
true |
Toggle footer metrics line. |
enable-hover-attrs |
false |
Adds <title> hover text per week (larger SVG). |
include-org-private |
false |
For org logins: include private repos in aggregation (token must allow it). |
minify-svg |
true |
SVGO optimize output (recommended). |
| Output | Meaning |
|---|---|
output-directory |
Where SVGs were written in the workspace. |
generated-files |
Number of SVG files generated. |
weeks |
Weeks rendered in the chart. |
total-contributions |
Total contributions in the rendered window. |
committed |
true if a commit was created and pushed. |
with:
commit-and-push: falseRender a specific year:
with:
year: 2021with:
show-stats: false
show-stats-footer: falseSet github-user to the organization login and use a github-token that has access to organization data (see setup steps).
with:
github-user: DeSource-Labs
github-token: ${{ secrets.ORG_TOKEN }}
include-org-private: trueAt a high level:
- Fetch contribution data (user: GraphQL; org: REST aggregation)
- Render themed SVG(s)
- Optionally optimize (SVGO)
- Optionally commit & push changes
If nothing updates:
- Confirm
permissions: contents: writein your workflow. - Confirm the SVG paths in your README match your
output-dir. - If the action errors about the workspace not being a git repo, add
actions/checkout.
- Pin actions to a release tag or commit SHA in production workflows.
- Use the minimum required workflow permissions (
contents: writeonly when committing).
See SECURITY.md for reporting & workflow hardening notes.
Contributions, bug reports, theme ideas, and docs fixes are welcome.
- Questions / help: open an issue
- Vulnerabilities: use GitHub Security Advisories (private report)
See SUPPORT.md for details.
If this project helps your profile stand out, star the repo and share your theme setup