A self-typing ASCII portrait and live contribution stats, drawn by your own repository. No third-party widgets, no services that can rate-limit or go dark, and every pixel of it under your control.

Live example: github.com/andriidrok1 · all the code: andriidrok1/andriidrok1


Why not just use the usual cards

Most profile READMEs pull their graphics from someone else's server — stats cards, streak cards, activity graphs, the contribution snake. Two things go wrong with that.

They break. While building this, github-readme-stats.vercel.app returned 503 on every request for hours, and its replacement started answering ERROR!!! Cards are temporarily rate limited. Your profile is the one page where a broken image is most expensive.

You can't design them. You get somebody's theme list. If you want the page to look like one thing rather than five, you have to draw it yourself.

<aside> ⚡

Everything below is generated inside your own repository by a scheduled action. The whole page makes zero third-party requests.

</aside>

What GitHub actually allows

This is the part no guide writes down, and it dictates every decision that follows. Tested by posting markdown to GitHub's own rendering API (POST /markdown) and reading back what survived.

STRIPPED
  <style> blocks        style=" " attributes      class=" "
  inline <svg>          <font>   <small>   <big>

KEPT
  <sub>  <sup>  <kbd>  <samp>  <blockquote>  <details>  <hr>  <picture>
  align=" "     width=" " on <img> and <td>

Three consequences worth internalising:

  1. You cannot change the font of README text. Not with CSS, not with a font tag, not with inline SVG. Your only choice is GitHub's sans or its monospace, via backticks or a code / samp tag.
  2. Motion must live inside the SVG. Scripts are stripped, so animation has to be SMIL — animate and set elements — inside the file. GitHub does run those.
  3. Anything you want in your own typeface has to be an image.

Setup

# the repo has to be named exactly your GitHub username
gh repo create <your-username> --public --clone
cd <your-username>

pip install pillow numpy opencv-python-headless rembg onnxruntime

The first run downloads a ~176 MB background-removal model. Once, then cached.