Live status: ghstats.dev/status for API uptime, endpoint health, and response times.
Free, real-time GitHub stat cards, badges, and charts -- drop a URL into your README and you're done. No tokens, no setup.
Standard card
[](https://github.com/rowkavdev/GitHub-profile-stats)
Compact grids (3 / 4 / 6)
[](https://github.com/rowkavdev/GitHub-profile-stats)
[](https://github.com/rowkavdev/GitHub-profile-stats)
[](https://github.com/rowkavdev/GitHub-profile-stats)
Combine an org (orgs=)
Moved your repos into an organisation? Add orgs= to count that org's public repos on your card too. Stars, repos and languages are combined. Commits, PRs, issues and streaks stay yours, because GitHub already credits your work in org repos to you.
Just rowkav09 |
rowkav09 + orgs=rowkavdev |
|---|---|
[](https://github.com/rowkavdev/GitHub-profile-stats)
Languages (bar, stacked, grid, horizontal list, vertical list, donut, vertical donut, compact)
Mini badges (drop anywhere)
Any metric, any colour, any style — perfect for sprinkling through a README.
Pass label=... to override the default label text and style=... to switch between flat, flat-square, for-the-badge, plastic, and minimal (see the table below).
Workflow runs across public repos
[](https://github.com/rowkavdev/GitHub-profile-stats)
/api/workflows is currently limited to Rowan's public repositories: username=rowkav09, with optional orgs=rowkavdev. Other usernames and orgs are rejected to protect the shared GitHub API quota. It counts all-time GitHub Actions workflow runs, not jobs, including runs by other people in those public repos. Forks are included; private repos are not. For quota safety it refuses a set above 150 public repos rather than publishing a partial total. Use the same style, color, and label controls as mini badges. Fresh snapshots last 24 hours; the edge may serve a stale image for up to two additional days while revalidating, and Redis may serve a last verified count for up to seven days if refreshes fail. Each of the two allowed variants has one upstream attempt per 24 hours, successful or not (at most two bounded sweeps in total). Redis is required: without it the route fails closed rather than polling every repository.
Badge styles -- pick a look
| Style | Preview |
|---|---|
flat |
|
flat-square |
|
for-the-badge |
|
plastic |
|
minimal |
Apply with ?style=for-the-badge on /api/mini or /api/badge. Works alongside color and label.
Activity sparkline (7--90 days)
[](https://github.com/rowkavdev/GitHub-profile-stats)
Quick colour override
https://ghstats.dev/api/card?username=YOUR_USERNAME&bg=0f0f23&text=cccccc&title_color=ffff66&icon_color=ff6644
- Create a public repo named your-username on GitHub and add a
README.md. - Paste an embed from the gallery above. Done.
Need tweaks? Use the on-page editor to toggle stats, themes, borders, titles, and copy Markdown/HTML instantly.
Card ( /api/card )
username(required)alltime=true(optional; returns all-time commit, PR, issue, and estimated-hours totals)orgs=my-org(optional; comma list, up to 3; also works on/api/langs,/api/miniand/api/profile) - also counts the public, non-fork repos owned by these accounts. Stars, repo count and languages are combined. Commits, PRs, issues, contributions and streaks stay your own, since GitHub already credits your work in org repos to you. Handy after moving repos into an org.themedefaultdefault- Layout:
size=default|compact,compact_count=3|4|6,show_emoji=true - Visibility:
hide=stars,issues,...,show_ring,show_icons,hide_title,hide_border - Styling:
bg,text,title_color,icon_color,border_color,border_radius,custom_title,order
Languages ( /api/langs )
layout=bar|stacked|horizontal_list|vertical_list|grid,max_langs(1--12)hide_border,hide_title,custom_title,border_radius, theme overrides as above
Mini badges ( /api/mini )
metric=stars|commits|prs|issues|hours|streak|week|followers|repos|contributionslabel(override text),color(value side),theme(for errors)style=flat|flat-square|for-the-badge|plastic|minimal(defaultflat)
Counter badge ( /api/badge )
style=flat|flat-square|for-the-badge|plastic|minimal(defaultflat)
Visits badge ( /api/visits )
style=flat|flat-square|for-the-badge|plastic|minimal(defaultflat)
Note:
hoursis currently WIP and is an estimate, not exact tracked coding time.
Sparkline ( /api/sparkline )
days(7--90),width(180--800),height(40--240),line_color,fill_color,title,hide_border,border_radius
Default, Light, Radical, Tokyo Night, Dracula, Nord, Gruvbox, Catppuccin, Ocean, Sunset, Forest, Midnight, Night Owl, Solarized, Ayu, Rose Pine, Kanagawa, Material Palenight.
- Token needed? Yes -- the GitHub GraphQL API requires a valid token. Set
GITHUB_TOKEN,GH_TOKEN, orGITHUB_ACCESS_TOKEN. - Refresh rate? Tiered by endpoint so slower-moving badges can stay cached longer while activity-focused embeds refresh sooner.
- Free? Yes. MIT licensed.
- Where to tweak without URLs? ghstats.dev/builder.
/api/cardand activity-oriented mini badges (commits,prs,issues,streak,week,contributions) are cached for about 30 minutes at the edge./api/langs,/api/badge, and slower-moving mini badges likefollowersandreposare cached for about 6 hours at the edge.starsmini badges are cached for about 24 hours at the edge./api/visitsis intentionally uncached so counters increment on every request.
- PRs welcome -- see CONTRIBUTING.md.
- Like it? Drop a star on the repo: GitHub.
MIT
Generate a shareable profile card for posts, portfolios, and profile pages:
https://ghstats.dev/api/profile?repo=octocat/Hello-World&theme=github&type=repo
Use the PNG endpoint for LinkedIn and other sites that require an uploaded raster image:
https://ghstats.dev/api/profile/png?username=octocat&theme=dark&type=profile&download=true
# Contribution heatmap
https://ghstats.dev/api/profile/png?username=octocat&theme=dark&type=contributions
| Parameter | Values | Default |
|---|---|---|
username |
GitHub username (profile card) | required unless repo is set |
repo |
owner/name (repository card) |
required unless username is set |
type |
repo, profile, compact, contributions |
repo |
theme |
github, light, dark, ocean, violet, amber |
github |
title |
custom heading, up to 80 characters | generated |
subtitle |
custom description, up to 140 characters | generated |
show_avatar |
true, false |
true |
show_languages |
true, false |
true |
bg, panel, text, muted, accent, border |
six-digit hex without # |
theme value |
download |
true forces attachment download (PNG only) |
false |
The preset and layout registries are separate, so adding a new colour preset or card type does not require changing the API routes.