Coding stats in your GitHub profile README, without an API key

How a GitHub profile README shows stats, the three ways tools put them there, how to set up the inlinr card in light and dark, and how to move from waka-readme or github-readme-stats.

Setup5 min readBy

: The block is text by default, a table per list with your daily average and best day, with the card or both as choices that Settings → README keeps. And its sources: GitHub's documentation on profile READMEs, themed images and its image proxy.

A GitHub profile README with the inlinr card: 27h 40m over the last 7 days, 42% with an AI assistant, time per language, editor and AI tool, shown in GitHub's dark and light themes
In this guide

A line of coding stats on a GitHub profile says what you work in, more honestly than a list of logos. Getting one there is mostly a question of where the numbers come from and who keeps them fresh: a service that draws an image on request, or a scheduled job that rewrites your README.

How a profile README shows stats

GitHub shows the README.md of the public repository named after your username at the top of your profile. It renders Markdown and a little HTML, and nothing else: no script runs there, and GitHub never fetches Markdown from another site. Images are the exception. An image address in the README is fetched through GitHub's image proxy, which caches it and serves it to every visitor.

So a stats card is an image that a service draws when GitHub asks for it. Text in the README itself, a table of languages for instance, can only change when something commits a new version of the file.

Three ways to get them there

Every tool you will find does one of three things. They differ in what you have to store and in what keeps the numbers current.

What it isWhat you storeRefreshed by
Hosted imageOne image line pointing at a service that draws the cardNothingThe service, on each fetch through GitHub's cache
Rewritten MarkdownA job replaces the text between two comment markersUsually an API key as a repository secretA GitHub Action, on a schedule
Generated imageA job draws an SVG and commits it to your repositoryUsually an API key as a repository secretA GitHub Action, on a schedule
The inlinr card is a hosted image. Its Markdown style is the second kind, and needs no key because it reads your public profile.

A hosted image is the least to look after: nothing in your repository changes and there is no secret to rotate. Rewritten Markdown is plain text in your README, which some people prefer to an image, at the cost of a workflow and a commit a day.

Set up the inlinr card

The card shows the time an inlinr extension records in your editor, so it needs a free account and an extension before it shows anything.

  1. Sign in with GitHub. Your GitHub username becomes the card's address: inlinr.com/u/your-handle.
  2. Install an extension for VS Code, Cursor, Windsurf or Claude Code, or point any editor's WakaTime plugin at inlinr. Code for a minute and the first session shows up.
  3. Turn on your public profile in Settings → Sharing. Tick the sections the card shows: languages, editors, AI tools, the share of your time with an assistant, active days. Off by default, and nothing shows until you turn it on.
  4. Add the block from the README card page to your profile README: text by default (a table per list, your daily average and best day, the weekdays if you want them, with a daily job that rewrites it), the card, or both. The page previews your real block first, in GitHub's light and dark themes. Signed in, Settings → README keeps your choices and ticks each step as GitHub shows it; the job is then the public action inlinrhq/readme-stats ↗, one line with no secret.

A free profile shows the last 7 days. On Pro you can pick 30 or 90 days, or all time, for the profile and for each card.

Check it before you paste

The README card page checks a handle before giving you its line, says what is missing when a profile is not public yet, and hands out the text block with its workflow, prefilled on GitHub.

Light and dark

GitHub readers pick a light or a dark theme, and a card drawn for one looks out of place on the other. GitHub's documented way to serve both is a picture element: one source for readers in dark mode, the image for everyone else. That is the line the card page gives you by default:

README.md
<a href="https://inlinr.com/u/your-handle">
  <picture>
    <source media="(prefers-color-scheme: dark)" srcset="https://inlinr.com/u/your-handle/stats?format=svg&theme=dark">
    <img alt="inlinr coding stats" src="https://inlinr.com/u/your-handle/stats?format=svg&theme=light">
  </picture>
</a>

To pin one theme instead, pick Light or Dark on the page and paste the single Markdown image it gives you.

Layouts, status and what to leave out

The card comes in three layouts, picked on the card page or with layout= in its address:

  • the classic card, one column in the accent colour, the default;
  • layout=columns, wider, with languages on the left in GitHub's own colour for each, and editors and AI tools on the right;
  • layout=compact, three lines: your total, the share with AI and one bar of your languages, for a README that already has a lot in it.

The address can also leave things out: hide=editors,ai (any of languages, editors, ai, status, project, days) and rows=3. days is the strip under the total, a bar per day of a 7, 14, 30 or 90 day period, shown while your calendar is public. It can only take away. What your settings hide stays hidden whatever the address says, so a link copied from your README cannot show more than you chose.

Three more change how it looks, never what it shows: lang=fr writes the card and the text in French (dernière session · 28 oct.), accent= picks its colour (blue, violet, orange, pink or teal; green is the default) and border=0 takes its frame off, for a README with its own. Settings → README has the same three choices.

The status is off until you turn it on in Settings → Sharing. On, the card says last session · 28 Oct, the day of your last session in your time zone, never a time; at its second level it says coding now while you code. A badge of its own, /u/your-handle/status.svg, says the same next to your other badges. Caches make it 5 to 10 minutes late, a little more through GitHub.

Coming from waka-readme or github-readme-stats

waka-readme is an Action that rewrites the text between its waka markers with your WakaTime stats, using your WakaTime API key stored as a secret. To move:

  • for an image, delete the markers, the workflow and the WAKATIME_API_KEY secret, and paste the card line;
  • to keep text, pick Text on the card page: replace the markers with inlinr's two below, and the workflow with the one the page gives you. It reads your public profile, so the secret can go.
README.md
<!--START_SECTION:inlinr-->
<!--END_SECTION:inlinr-->

Or keep waka-readme as it is: set its API_BASE_URL to https://inlinr.com/api/compat/wakatime and replace the secret with a WakaTime key created in Settings → Editors. The title, the total and the languages come through. Mind that a key reads all your stats, private projects included, whatever your public profile hides.

github-readme-stats draws a WakaTime card from your public WakaTime profile. Replace its image line with the inlinr card; nothing else in your README has to change. Your history can come along too: the WakaTime switching guide imports it, and your WakaTime plugins can keep sending to inlinr.

Or keep its WakaTime card and point it at inlinr: add &api_domain=inlinr.com to the image's address, after username=your-handle. It reads your public profile with no key, so it shows what your profile shows and nothing more; the same address serves metrics' WakaTime plugin, with plugin_wakatime_url: https://inlinr.com.

What the card shows, and what it never does

The card shows totals and percentages, over the period you chose, for the sections you ticked. It never shows a file name, a client or an amount, and no project unless you tick one whose GitHub repository is public (in the project's settings): then it reads “Working on owner/repo” with your time there, and drops off by itself if the repository turns private. A project you hide in Settings is left out of the totals too, and a language you hide is left off the list. The security page lists everything on inlinr that can be public, and who sees it.

Sources

What changed

  • : The block is text by default, a table per list with your daily average and best day, with the card or both as choices that Settings → README keeps. And its sources: GitHub's documentation on profile READMEs, themed images and its image proxy.
  • : first published.

See it on your own sessions

Install an inlinr extension, turn on your public profile, and paste one line: your card fills in with your own week.

GitHub README stats card

Free for solo use · no source code leaves your machine

Read also