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
Repository and profile cards default to a plain GitHub-style layout. Use style=github, compact, split, editorial or minimal for layout changes, independently of theme=github, light, dark, ocean, violet or amber.
Both builders have separate style and theme controls. The selected style is preserved in the SVG, PNG download and markdown embed URLs. Cards show a segmented language bar at the bottom with language names and percentages, based on GitHub language data. Use show_languages=false to hide it or show_avatar=false to hide the avatar. Empty or unavailable language data is labelled, not replaced by a decorative colour strip. Repository cards show contributors, open issues, stars and forks, like GitHub's native preview.
Existing type=repo, profile and compact URLs use the new layouts; type=contributions keeps its contribution graph. Styles are for the repository/profile layouts, not the graph. The compact layout is shorter; other styles have heights matched to their content.
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.
The hosted site uses GA4 measurement ID G-ZGXCN93Z7E only after a visitor accepts optional analytics. Decline and Accept have equal weight. No Google tag or request loads before consent; the Analytics choices control allows withdrawal, clears this site's GA cookies and reloads without the tag. Advertising consent and Google signals stay off. Enhanced measurement is off in the GA4 stream. Manual page views use route classes, not profile/repo names, query strings or referrers. The privacy page explains the choice and the separate existing Vercel measurement. GA4 starts with consenting visits after deployment; it has no retroactive history.
Profile and repository view counters expire after 90 days without an increment. Every view atomically refreshes the retention window and preserves the accumulated count, including counts on pre-existing keys. Reads do not extend retention. Inactive counters reset after expiration; active cards keep their totals. No existing keys are deleted during deployment. Untouched legacy keys have no TTL until their next view. Retention bounds lifetime, not the number of requests an attacker can make inside the 90-day window.