Part 1 · Publish your portfolio on GitHub Pages
GitHub Pages hosts static websites straight from a repository, for free, with HTTPS. Everything in the gallery runs on it.
-
Pick a starting point
Browse the gallery and open the source of a design you like. Check the repository's license before reusing it, and keep the credit the author asks for. You can also start from a single
index.html. -
Create your repository
On the template's GitHub page click Use this template → Create a new repository, or Fork if there is no template button. The repository name decides the address:
Repository name Your site's URL <username>.github.iohttps://<username>.github.io/anything else, e.g. portfoliohttps://<username>.github.io/portfolio/Each account gets one
<username>.github.iosite and as many project sites as it likes. The repository must be public on a free plan. -
Make it yours
Replace the template's content with yours: name, bio, projects, links, photo. Most templates keep this in one file (
config.js,_config.yml,data.json…), so read their README first.You can edit on GitHub directly (press . in the repository to open the web editor) or locally. Templates with a build step usually run with
npm installthennpm run dev. -
Turn on GitHub Pages
In your repository open Settings → Pages and under Build and deployment → Source choose:
- Deploy from a branch for plain HTML/CSS/JS or Jekyll sites. Pick your branch (usually
main) and the/ (root)or/docsfolder. - GitHub Actions for sites that need a build step (React, Vue, Astro, Next.js, Hugo…). GitHub suggests ready-made workflows for popular frameworks.
A minute or two later the address of your site shows at the top of the Pages settings. GitHub docs
Using a framework on a project site? Set its base path to
/<repository>/(basein Vite and Astro,basePathin Next.js), otherwise styles and scripts will not load. - Deploy from a branch for plain HTML/CSS/JS or Jekyll sites. Pick your branch (usually
-
Use your own domain optional
Enter it in Settings → Pages → Custom domain, then add DNS records at your domain registrar:
- Subdomain such as
www.example.com: aCNAMErecord pointing to<username>.github.io. - Apex domain such as
example.com: fourArecords pointing to185.199.108.153,185.199.109.153,185.199.110.153and185.199.111.153.
When the certificate is ready, tick Enforce HTTPS. GitHub docs
- Subdomain such as
-
Final checks
- It opens over
https://and looks right on a phone. - No leftover template text, placeholder names or broken links.
- The page has a
<title>and a meta description, so it previews well when shared.
- It opens over
Part 2 · Add it to this list
The list is generated from data: each portfolio is one small YAML file in data/portfolios/. You never edit the README. After your pull request is merged, automation regenerates it and redeploys this site.
name: Jane Doe
repo: janedoe/janedoe.github.io
demo: https://janedoe.github.io/
# optional
description: Minimal dark portfolio built with Astro.
tags: [astro, minimal, dark]
Option A · In your browser, no git needed
- Open the pre-filled entry file . GitHub forks the repository for you if needed.
- Rename
your-name.ymlto something unique, e.g.jane-doe.yml(lowercase, dashes). - Replace the placeholder values with yours.
- Click Commit changes… → Propose changes → Create pull request.
Option B · From the command line
Fork the repository, then:
git clone https://github.com/<you>/awesome-github-pages-portfolios.git
cd awesome-github-pages-portfolios
npm install
npm run new # asks a few questions and writes your file
npm run validate # runs the same checks as CI
git switch -c add-jane-doe
git add data/portfolios/jane-doe.yml
git commit -m "Add Jane Doe's portfolio"
git push -u origin add-jane-doe
Then open a pull request from your fork.
The fields
| Field | Required? | What to put |
|---|---|---|
name | required | Your name, your handle or the template's name. |
repo | required | The public GitHub repository as owner/name, not a URL. |
demo | required | The live site's full https:// URL. |
description | optional | One line, 10-160 characters. Defaults to the repository description. |
tags | optional | Up to 5 lowercase keywords used by the gallery filters, e.g. [react, minimal, dark]. |
added | optional | YYYY-MM-DD. Defaults to the date your file was first committed. |
Editors with the YAML extension autocomplete and check these fields thanks to the JSON schema.
What happens next
- Automatic checks run on your pull request: format, duplicates, the site is online, the repository exists. Any problem is shown next to the exact line in the Files changed tab.
- A maintainer reviews and merges. Please keep to one portfolio per pull request.
- Automation takes over: the README is regenerated, a screenshot of your site is taken and the gallery is redeployed, usually within five minutes.
FAQ
How do I update or remove my entry?
Edit or delete your file in data/portfolios/ and open a pull request. The README and the gallery follow automatically.
A check failed on my pull request. What now?
Open the Files changed tab: the error is shown next to the line that needs fixing, and the Checks tab has a summary. Commit the fix to the same branch and the checks run again.
My screenshot is outdated or looks wrong.
Screenshots are retaken every week, a few seconds after the page loads, with reduced motion turned on. If yours still looks broken (a loader or cookie banner, for example), open an issue.
Why one file per portfolio instead of editing the README?
Pull requests never conflict with each other, every entry is validated the same way, and the README, this gallery and the JSON feed are all built from the same data.
Can I add a portfolio that isn't mine?
Yes, as long as the site and its repository are public and it is hosted on GitHub Pages.