GitHub Profile Card Generator — a profile as a picture
A GitHub profile card turns the handful of public facts on a profile — the handle, the display name, the bio, the repo and follower counts — into one image you can drop into a README, a portfolio page, a conference slide or a post. This tool composes that image in your browser: you fill in the fields, pick a theme and a size, and the card is drawn onto a <canvas> in this tab and saved to your device as a PNG. Nothing is uploaded, because this site is a set of static files with no server behind it.
Type it, or paste the JSON
The tool opens in manual mode and stays fully usable with no network at all. Every field is optional except a name to put on the card, and a field you leave blank collapses its row rather than printing an empty label — no stray undefined, no floating dash, no gap where a company name would have gone.
If you already have the response body from https://api.github.com/users/{username}, the paste panel maps it onto those fields for you. It reads each key defensively: a key that is absent, null, or the wrong type leaves that field empty instead of throwing or printing the word "null". Invalid JSON produces an inline message naming the parse failure and leaves what you pasted exactly where it is. After a successful map every field is still editable — pasting is a shortcut into manual mode, not a locked state.
curl yourself instead. There is no API key anywhere in this tool, and there should never be one — a key shipped in a static bundle is a key anybody can read.How the card is drawn
The layout is proportional rather than fixed, so the same composition works at 1200×630, 800×400 and 1080×1080. The avatar is clipped to a circle and cover-fitted so it fills without distorting; the three stat tiles share the content width and abbreviate large numbers the way GitHub does, so 1200 becomes 1.2k; and the meta row centres whichever chips have values.
Text is measured, never estimated. Every wrap and every cut comes from measureText on the real canvas after the font is set, because the same font stack resolves to a different face on macOS, Windows, Linux and Android, and different letterforms break in different places. Truncation walks grapheme clusters rather than UTF-16 units, which is what keeps an emoji at the end of a bio from being sliced into a broken glyph. The card renders at twice its nominal size so the text stays crisp when the image is scaled.
Contrast, and why it is shown
A card is a bitmap. Once it is exported at low contrast, no reader can fix it — there is no zoom that helps, no reader mode, no theme switch. So the tool prints the WCAG ratio between the text colour and the background and warns below 4.5:1, before the colours become permanent.
The avatar, and the trap in exporting one
Snippets that tell the truth
Below the card are two copyable blocks. The Markdown one is written for a README and is honest about hosting: the PNG exists only in your downloads folder, so the snippet points at a relative path and says in a comment that you need to commit the file there. It never references an address that does not exist. The HTML one is a self-contained <div> with inline styles matching your theme, so it renders on a portfolio page without the PNG at all.
Both are escaped for their own context, because a bio is free text written by whoever owns that profile and can contain angle brackets, quotes or link syntax. It is drawn as literal text on the card and escaped again on the way into markup. The numbers on the card are public profile facts and nothing more — there is no comparison here, no ranking and no scoring, because a follower count is not a measure of a developer.