A GitHub profile gets scanned in about the time it takes to read this sentence. GitHub now hosts 180 million-plus developers and 630 million repositories (Octoverse 2025), which means every recruiter, hiring manager, and AI sourcing tool doing that scan has an almost unlimited supply of other profiles to move to next. Most "how to improve your GitHub profile" advice fixes the README and stops there — one layer out of six.
A GitHub profile is six separate surfaces, read in order, at different speeds, by different people: the avatar and bio line, pinned repositories, the profile README, the contribution graph, stats and badges, and the single external link GitHub allows. This GitHub profile guide walks through all six — what each one actually proves, where each one hits a hard ceiling, and the order they get read in before you ever find out whether the scan continued.
What a GitHub profile guide should actually cover in 2026#
A GitHub profile is six separate surfaces, not one: your avatar and bio line, your pinned repositories, your profile README, your contribution graph, your stats and language badges, and the one external link you're allowed to place. Each layer gets read differently, at a different speed, by a different kind of visitor. Most "optimize your GitHub profile" advice fixes one layer and ignores the other five.
That's the gap this guide closes. Instead of another README template roundup — or another list of developer bio components — this is a walkthrough of all six layers of what we'll call the GitHub Profile Stack — in the order a visitor actually scans them, with what each layer can and can't prove, and where it hits a hard ceiling GitHub itself will never remove.

GitHub's own 180 million-plus developers are all working with the same six layers. What separates a profile that gets read from one that gets skimmed and closed isn't a trick — it's knowing what each layer is actually for.
Layer 1: Your avatar and bio line#
This is the only layer visible before anyone clicks anything — it shows up in search results, in commit history, in PR review lists, everywhere your username appears. GitHub caps the bio field at 160 characters, which is tight enough that most people waste it.
A bio line has room for exactly one of three things: what you build, what you're best at, or what you're looking for. Trying to fit all three reads as noise. "Backend engineer, ex-Stripe, building developer tools" tells a recruiter more in nine words than a paragraph of adjectives does, because it's three concrete facts instead of zero.
Use a real photo, not a generated avatar or a logo — GitHub's own profile setup guidance treats the avatar as an identity signal, and profiles with a real face get a beat more trust in the first half-second than ones without. We go deeper on the exact character math and 50+ real examples in our GitHub profile bio guide.
Layer 2: Pinned repositories that actually get read#
GitHub gives you six pinned repository slots on your profile. Most developers fill them with whatever they pushed most recently, which is the wrong sort order — recency isn't relevance.
Pin for range, not chronology. Six slots covering six different signals (a production app, an open-source contribution, a CLI tool, something with real users, something technically hard, something recent) tell a fuller story than six variations of the same side project.
Each pinned repo's one-line description is doing real work here — "React + Supabase app, 400 stars, three companies in production" earns a click. "My project" doesn't. If a pinned repo doesn't have a working README with a screenshot or GIF and a two-line "what this does," it's costing you the click it just earned.
Weak description | Stronger rewrite |
|---|---|
"My project" | "CLI tool for batch image compression — 1.2k downloads/month on npm" |
"Tutorial follow-along" | "Full-stack e-commerce build following [course] — extended with Stripe webhooks and admin dashboard" |
"Fork of X" | "Fork of X with a Postgres backend swapped in — used to learn migration patterns, not shipped" |
"WIP" | "In progress: rate limiter middleware for Express — core logic done, tests in progress" |
The pattern in the right column: every description names what the thing does, a number or outcome if one exists, and — for unfinished work — an honest status instead of silence. Our open source portfolio guide covers how to show contribution impact on repos you don't own, which pinned slots alone can't capture.
Layer 3: The profile README#
Creating a repository with the same name as your username and adding a README.md is the one piece of profile customization GitHub actively built a feature around — it renders directly on your profile page, above your pinned repos.
The README is where most guides stop, and where most profiles overdo it. The direct-answer version: a good profile README is a 20-to-40-second read with a one-line identity statement, a tight tech-stack list, three to five real project links with actual outcomes attached, and one way to reach you. Nothing else earns its place.
What belongs in a 2026 profile README:
A one-line identity statement (not a job title dump)
4-8 tech stack items, shown as text or badges, not 20
3-5 project links, each with a one-line outcome, not just a name
One contact method — email, site, or bio link, never all three
Optionally, one stats widget — but only one
What doesn't:
Typing animations, visitor counters, or spinning logos
A "currently learning" list longer than three items
Multiple redundant stats widgets stacked on top of each other
A wall of badges with no visual hierarchy
We cover the full template breakdown in our profile README guide, ten ready-to-adapt patterns in our README templates post, and real, dissected examples in what the best profiles actually do.
A minimal README you can copy right now#
If you're starting from a blank README.md, this is the entire skeleton — fill in the brackets and delete nothing else:
### Hey, I'm [Name] — [Backend engineer | Frontend dev | ML engineer], focused on [specialty]
**Currently building:** [one-line project description + link]
**Stack:** [Language 1] · [Language 2] · [Framework] · [Database]
**A few things I've shipped:**
- [Project 1] — [one-line outcome, e.g. "400 stars, used in production by 3 teams"]
- [Project 2] — [one-line outcome]
- [Project 3] — [one-line outcome]
**Reach me:** [email or single link]That's it. No headers for "About Me," no bullet list of hobbies, no badge wall. Every line above earns its place by answering a specific question a visitor has — the moment a line stops doing that, it's a candidate for deletion, not addition.
Why more sections isn't better#
There's a temptation to keep adding README sections once the first draft works — a "Currently Learning" list, a "Fun Facts" block, a visitor counter. Each addition trades scroll time for content that doesn't change a visitor's read of you. A profile README isn't graded on completeness; it's graded on how fast it answers "does this person do what I need, and can they show it." Past four sections, most additions are pushing the actually-useful content further down the page.
Layer 4: The contribution graph — and why it's the layer recruiters trust least#
Here's the part most GitHub profile advice skips: the contribution graph is the single most-viewed layer on your profile, and it's also the easiest one to fake.
The graph counts a narrow set of events — commits to a repo's default branch, plus issues, PRs, and discussions opened in non-fork repos. It reads timestamps, not diffs. A backdated commit script or a cron job pushing a trivial whitespace change lights up the same green square as a day spent shipping a real feature. Developers have built entire scripts around exactly this, and there's now a documented market for "achievement-loaded" GitHub accounts with dense commit histories, selling for upwards of $5,000.
That's a textbook Goodhart's Law problem: once a metric becomes a target, it stops measuring what it was meant to measure. One breakdown of the graph's incentives put it bluntly — a dense graph "suggests an engaged developer" while a sparse one "might raise questions," even though junior developers chasing portfolio projects often out-green senior engineers shipping production code in private repos that never touches a public timeline.
That asymmetry is structural, not incidental. GitHub's own 2025 data shows why: 81.5% of all contributions in 2025 happened in private repositories, even though public and open-source repos still made up 63% of all repos on the platform (Octoverse 2025). Most of the work the graph would need to reward doesn't reach it at all.

None of this means the graph is worthless — a consistent pattern over years is still a real signal, just a noisy one. It means treating it as the only signal is the mistake, not the graph itself. Our contribution heatmap guide covers how to read your own graph honestly and what it's structurally unable to show.
What actually counts as a contribution#
Per GitHub's own documentation, only specific actions light up a square:
Commits to a repository's default branch — but only if the commit's author email is connected to your GitHub account
Opening issues, pull requests, or discussions, but only in repositories that aren't forks
Submitting a pull request review
Commits to other branches or forks don't count unless merged into the parent's default branch
That last point trips up more developers than any other: work done entirely on feature branches, or commits authored with an email address that was never linked to a GitHub account, can be substantial and still show a blank square. A gap in the graph is frequently a bookkeeping issue, not a work-ethic one — which is one more reason to treat the graph as a rough signal rather than a verdict.
Layer 5: Stats widgets and tech-stack badges#
Stats widgets — the auto-generated cards showing star counts, top languages, and streaks — are popular for a reason: they're one line of markdown and they update themselves. They're also the layer most likely to get overused, since it costs nothing to add a fourth or fifth widget once the first one works.
One widget, well-chosen, adds signal. Three or four stacked widgets add scroll length without adding information — a visitor who wanted "top languages" got that from widget one and doesn't need it repeated three more ways.
Widget type | What it actually shows | What it can't show |
|---|---|---|
Language breakdown | Bytes of code by language across public repos | Code quality, architecture decisions |
Streak counter | Consecutive days with a graph-counted event | Whether those events were meaningful |
Star/fork counts | Public repo popularity | Private/enterprise contribution volume |
Tech-stack badges | Tools and languages you've chosen to display | Actual proficiency level in any of them |
Badges have the same tradeoff: a clean row of 6-8 relevant tech-stack badges reads as a fast, scannable skill list. Twenty badges in four colors and three icon styles reads as clutter, and clutter costs the same attention a recruiter was about to spend reading your pinned repos. Our README stats guide and tech stack badges guide go deeper on which specific widgets and badge sets are worth the markdown line.
Layer 6: The external link — where GitHub profiles run out of runway#
GitHub gives you exactly one clickable link field outside your README. That's not a bug, it's the platform staying in its lane — GitHub is a code host, not an audience or hiring platform, and it was never going to build visitor analytics, revenue verification, or resume export into 180 million profiles.
That's the wall every one of the first five layers eventually hits. A profile README can list your projects, but it can't show which ones still have paying customers. The contribution graph can't distinguish real engineering from a $5,000 fake history. Stats widgets show language bytes, not outcomes. The external link is the only layer built to go past what GitHub itself can verify.
This is also the one query GitHub gets asked constantly and will never answer: "who viewed my GitHub profile" has been a recurring feature request for over a decade, and it's staying unanswered by design — a code host has no product reason to add visitor-level tracking. A bio page that link points to is a different animal: a single page built to be shared, where visitor analytics are a first-party signal about your own page, not a request to deanonymize a stranger.
GitHub profile alone vs. GitHub profile + a developer bio#
Capability | GitHub profile alone | GitHub profile + bio page |
|---|---|---|
Shows pinned projects | Yes, 6 slots, manual descriptions | Yes, plus live star/commit counts pulled automatically |
Proves revenue on a project | No | Yes — live MRR from Stripe, Dodo, Lemon Squeezy, or Polar |
Who viewed the page | Never — not a GitHub feature | Yes, live visitor location, device, referrer |
ATS-ready resume export | No | Yes — PDF generated from the same profile data |
Custom domain | No (github.io subdomains only) | Yes — a domain you own |
Contribution graph context | Raw squares, no explanation | Same graph, framed alongside real project outcomes |
The point isn't that GitHub's layers are wrong — they're the foundation everything else is built on. It's that six layers built by a code host will always stop at "here's activity." Proving what that activity produced needs a seventh layer GitHub was never going to build — the same proof-over-claims shift already reshaping developer portfolios. That's the exact gap a developer bio — a page that pulls live GitHub and revenue data onto one link — is built to close.
The 6-second scan: how a GitHub profile actually gets read#
Recruiters and hiring managers don't read a GitHub profile top to bottom like an article — they scan it the way any page gets scanned under time pressure. A 2025 review of resume-screening behavior found recruiters spend an average of 11.2 seconds on an initial pass and advance only about 19% to a deeper read (InterviewPal, 2025) — GitHub profiles get the same triage treatment, just faster, because there's no cover letter buying extra time.
In that window, the scan order follows the Stack almost exactly: avatar and bio (does this person do what I'm looking for), pinned repos (do they ship real things), README (can they explain what they built), graph (are they consistently active), stats (what's the language fit), link (is there more proof). A weak layer anywhere in the first three stops the scan before layers four through six ever get seen — which is why fixing only the README while ignoring the bio line or pinned repos still loses the scan.
The trend accelerating this isn't just human reviewers moving faster. AI-assisted sourcing tools are increasingly the first read: platforms built for engineering recruiting now aggregate GitHub activity, work history, and skill signals into a single ranked view before a human ever opens the profile directly. A weak first three layers can get a profile filtered out of that first pass entirely, before a person is in the loop at all.
What changed in 2026: your profile gets read by a model first#
The six layers haven't changed. What's changed since last year is who — or what — reads them first. GitHub's own 2025 data shows 80% of new developers use Copilot within their first week on the platform, and public repositories built around LLM SDKs crossed 1.1 million, with nearly 694,000 of those created in the last twelve months alone — a 178% year-over-year jump (Octoverse 2025). AI tooling isn't a niche corner of GitHub anymore; it's the default onboarding experience for new accounts.
GitHub developer advocate Andrea Griffiths, discussing the same report, described the pattern behind it as a "convenience loop" — AI tooling makes certain languages and workflows feel frictionless, which pulls more developers toward them, which deepens the loop further (GitHub Blog). The same loop is reshaping hiring: AI-assisted sourcing tools now read GitHub activity, summarize it, and rank candidates before a recruiter opens a single profile page. That model doesn't get bored after 11 seconds, but it does pattern-match against the same six layers — an empty bio, stale pinned repos, or a graph full of trivial commits gets flagged by an algorithm just as fast as by a human, just earlier in the funnel.
The practical upshot: cleaning up all six layers now protects a profile from two filters instead of one — the automated first pass and the human second look, in that order.

A realistic before/after#

Picture a mid-level backend developer with three years of real work, none of it visible on their GitHub profile the way it should be. Before: a default avatar, an empty bio field, six pinned repos sorted by "last updated" (two abandoned tutorials, a fork, three unfinished side projects), no profile README, and a contribution graph with visible gaps during a year they were heads-down on a production system at work.
After a single afternoon of layer-by-layer cleanup: a real photo and a nine-word bio ("Backend engineer — Go and Postgres — building infra tools"). Pinned repos re-sorted to lead with a deployed API gateway (with real GitHub stars) and an open-source PR history to a tool they use daily. A profile README with one identity line, six tech-stack badges, and three project links each carrying a one-line outcome. No new code was written — the six layers were just re-ordered to lead with what actually mattered, and the profile went from a 6-second bounce to a full read.
That's the entire exercise. Nothing on this list requires new skills — it requires spending the same afternoon on the layers that get scanned first instead of the one that's easiest to decorate.
The GitHub Profile Stack checklist#
Copy this and work through it once, then revisit quarterly:
Bio line states one clear thing: what you build, your specialty, or what you want next
Real photo as avatar, not a default or generated image
Six pinned repos chosen for range, not recency — sorted to lead with your strongest
Every pinned repo has a working README, a one-line outcome, and a screenshot or GIF
Profile README readable in under 40 seconds: identity, stack, 3-5 projects, one contact method
No more than one stats widget and one badge row in the README
Contribution graph gaps explained (or ignored) rather than papered over with filler commits
One external link included, pointing to a page that shows what GitHub can't
How the six layers weigh differently by career stage#
The Stack doesn't get equal weight from everyone reading it. Who's evaluating a profile — and why — changes which of the six layers actually decides the outcome.
Early-career developers get judged hardest on the contribution graph and pinned repos, because there's little else to go on yet. A consistent graph and two or three well-documented portfolio projects carry more weight here than they will later — this is the one career stage where "prove you can finish things" is the entire question. Our developer profile for job search guide covers what hiring managers specifically check at this stage.
Mid-to-senior engineers get judged less on the graph — most of their real work sits in private repos an employer can't see anyway — and more on the README's technical depth and the quality of open-source contributions in pinned repos. A thoughtful PR history on a well-known project outweighs a green graph at this stage, because it's third-party evidence, not self-reported activity.
Indie hackers and founders get judged on a layer GitHub doesn't have at all: whether any of the pinned projects have real users or revenue behind them. The six GitHub layers can show a project exists; they can't show it makes money. That's the exact gap covered in our indie hacker profile setup guide and our live MRR developer profile guide.
Open-source maintainers get judged on contribution graph context more than volume — issue triage, review comments, and cross-repo activity matter more than raw commit count, since maintainer work is often review-heavy rather than commit-heavy. Our open source portfolio guide covers how to make that kind of work visible when the graph alone undersells it.
The layers are the same for everyone. Which layer decides whether the scan continues is not.
Common mistakes that undo a strong GitHub profile#
Front-loading the README and ignoring the bio. A great README behind an empty bio field still loses the first three seconds of the scan.
Treating the graph as the whole story. A dense graph with nothing else configured reads as "active," not "hireable" — the other five layers are what convert that activity into a decision.
Stacking widgets instead of choosing one. Every additional stats widget past the first is diminishing returns on the same information.
Letting pinned repos go stale. Six repos sorted by "last updated" six months ago is a solvable problem in ten minutes.
Assuming the profile is the whole pitch. GitHub's six layers can't show revenue, visitor interest, or an ATS-ready resume — pretending they can is why the external link field exists at all.
FAQ#
What should I put in my GitHub bio in 2026? One clear line: what you build, your specialty, or what you're looking for next — not all three. GitHub's bio field caps at 160 characters, so specificity beats a list of adjectives. "Backend engineer, ex-Stripe, building developer tools" reads faster and says more than a generic self-description.
How many repositories should I pin on my GitHub profile? Use all six available slots, but choose them for range rather than recency. A mix of a production project, an open-source contribution, and something technically hard tells a fuller story than six similar side projects sorted by "last updated."
Does the GitHub contribution graph actually matter to recruiters? It matters as one weak signal among many, not as a verdict. The graph only counts commits to default branches plus issues, PRs, and discussions in non-fork repos — it can't see the 81.5% of contributions that happen in private repositories, and it can be gamed with backdated commits, so treating a sparse graph as disqualifying misreads what it measures.
Should I add a profile README if I already have pinned repos? Yes — pinned repos show what you built, but a README is the only layer that explains who you are and how the pieces connect. Keep it to a 20-40 second read: identity line, tech stack, a few project outcomes, one way to reach you.
How many stats widgets or badges should a GitHub README have? One stats widget and one row of 6-8 relevant tech-stack badges is the ceiling. Beyond that, each addition repeats information the first widget already gave a visitor, at the cost of scroll length.
Can I see who viewed my GitHub profile? No. GitHub has never shipped this feature and has no product reason to, since it's a code host serving 180 million-plus developers, not an audience platform. Any browser extension or app claiming to show GitHub profile views isn't reading real GitHub data — a separate bio page with its own analytics is the only way to get this for a developer profile.
What's the biggest mistake developers make on their GitHub profile? Optimizing one layer — usually the README — while leaving the bio line empty and the pinned repos sorted by recency instead of relevance. A scan stops at the first weak layer it hits, and that's often layer one or two, before a strong README ever gets seen.
Does a GitHub profile replace a resume or portfolio site? No. GitHub's six layers can show what you've built and how consistently you've worked, but they can't show live revenue, visitor interest, or export to an ATS-ready PDF. A bio page connected to the same GitHub account extends the profile past that ceiling instead of replacing it.
How often should I update my GitHub profile? Revisit the full Stack quarterly — repin projects, refresh the README's project list, and confirm the bio still matches what you're doing now. Between quarterly passes, update pinned repos any time you ship something worth replacing an older project with; the bio and README rarely need more frequent changes than that.
Key takeaways#
A GitHub profile is six layers — bio, pinned repos, README, contribution graph, stats, and one external link — read fast and in that order. Most advice fixes the README and calls it done, but a scan stops at the first weak layer, which is usually the bio line or pinned repos, long before the README gets read. The graph is the least trustworthy layer of the six: 81.5% of 2025's contributions happened in private repos the graph will never see, and the public side is gameable enough that a market for fake commit histories already exists.
Fix all six layers, in scan order, and the profile stops losing the 6-second read. Then use the one link GitHub gives you to point somewhere that shows what none of the other five can: real revenue, real visitors, an ATS-ready resume.
Your GitHub activity already proves you can build. Put the whole stack on one link — devbio.me