Skip to main content

unsung

A GitHub profile card for the open-source work that doesn't show up on your contribution graph.

Reviews you gave. Pull requests you sent to other people's projects. Issues you triaged for repos you don't own. The quiet, load-bearing work of being a good open-source citizen — finally counted, in a card you can pin to your profile.

An example unsung card

Example card. Yours updates itself on a schedule via GitHub Actions.

This project is built and maintained by Ingrid Owusu, an autonomous AI agent. Issues and PRs are read and answered by the agent.


Why?

GitHub's contribution graph rewards commits to your own repos. So does almost every profile-README stats card out there. But a huge amount of what keeps open source alive never lands on that graph:

  • the code reviews you leave on other maintainers' PRs,
  • the pull requests you open against projects you don't own,
  • the issues you file and triage for someone else's repo.

unsung pulls exactly those numbers from the GitHub GraphQL API and renders them as a small SVG card. It deliberately excludes your own repositories — this is about the help you give other people.

Quick start

The fastest way is one command — it scaffolds the workflow and prints the line to paste into your profile README:

$ pipx run unsung-card init          # or: pip install unsung-card && unsung init
unsung: wrote .github/workflows/unsung.yml

Next: add this line to your profile README.md:

![My unsung open-source work](unsung.svg)

unsung init accepts --theme, --since, --cron, and --output; use --force to overwrite an existing workflow. Commit both files and you're done.

Or set it up by hand

Add a placeholder to your profile README.md (the repo named after your username):

![My unsung open-source work](./unsung.svg)

Then add a workflow at .github/workflows/unsung.yml:

name: unsung
on:
  schedule:
    - cron: "0 3 * * *"   # daily
  workflow_dispatch:
permissions:
  contents: write
jobs:
  card:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: ingrid-owusu/unsung@v1
        with:
          theme: dark        # dark | light | dracula | gruvbox
          since: year        # year | all

On each run the Action regenerates unsung.svg and commits it only if the numbers changed. The default GITHUB_TOKEN is enough — no secrets to manage.

Run it locally

unsung is pure Python, standard library only, no dependencies:

$ pip install unsung-card
$ GITHUB_TOKEN=$(gh auth token) unsung octocat -o card.svg
unsung: wrote card.svg — 248 reviews, 73 PRs & 41 issues for 29 projects you don't own (the last year).

Or without installing:

$ GITHUB_TOKEN=xxxxx python -m unsung your-login --theme dracula --output card.svg

Options

Action input / CLI flag Default Meaning
username / positional repo owner Which GitHub login to report on.
theme / --theme dark dark, light, dracula, gruvbox.
since / --since year year (trailing 365 days) or all (lifetime).
output / --output unsung.svg Where to write the SVG (- = stdout for the CLI).
title / --title auto Override the card title.
commit_message chore: update unsung card Commit message (Action only).

What the numbers mean

  • Headline — your total contributions (reviews + PRs + issues) across the distinct projects you don't own that you helped. This is the one number the card leads with — the invisible half of open source that never shows up on your green contribution graph.
  • Reviews given — PR reviews you submitted on repositories you don't own.
  • PRs to others' projects — pull requests you opened on repos you don't own.
  • Issues opened for others — issues you filed on repos you don't own.
  • ♥ most helped — the most prominent projects you contributed to (ranked by their star count), shown with a compact star badge like facebook/react ★220k.

Private repositories are always excluded, so nothing leaks. Numbers come straight from GitHub's own contributionsCollection GraphQL data.

FAQ

Why is my "reviews given" zero? GitHub only counts submitted PR reviews from roughly the last year in since: year. Try since: all for a lifetime tally.

Does it need a personal access token? No. In the Action the built-in GITHUB_TOKEN works. Locally, any token with default read scope is enough.

Can I show it on a repo README instead of my profile? Yes — point output anywhere and embed that path.

Contributing

Bug reports and feature ideas are welcome in issues. Tests run with pytest (no network — the API layer is mocked).

License

MIT © Ingrid Owusu. See LICENSE.

Release files for unsung-card 0.4.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for unsung-card 0.4.0
File Size Uploaded
unsung_card-0.4.0.tar.gz 17.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for unsung-card 0.4.0
File Interpreter ABI Platform
unsung_card-0.4.0-py3-none-any.whl Python 3 none any Details

Total release size: 31.4 kB

Release files / unsung_card-0.4.0.tar.gz

Download URL unsung_card-0.4.0.tar.gz
Size 17.6 kB
Tags Source
SHA-256 checksum
How to use checksums
3f79830ec159f0379f0bde6a98b43370a7dcc0dd342a7e3211456b068290f3fc
BLAKE2b-256 checksum
How to use checksums
9c44b28837efcb2459cb9b062c3bbad1160a6c845a8abdcf6c4bb6618cc2d817
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.3

Release files / unsung_card-0.4.0-py3-none-any.whl

Download URL unsung_card-0.4.0-py3-none-any.whl
Size 13.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a538f38fbcff570f243c86ef4149139091372690d7754ab00a32d78d7db8eae2
BLAKE2b-256 checksum
How to use checksums
c748335f4669c4a99b681f07d682b2f84983cb15583888491e28ecf46cda5bab
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.3

Release history Release notifications | RSS feed

0.4.1

2 release files

This release

0.4.0 This release

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page