Your first pull request starts here.
Plain HTML and CSS. No build step, no framework, no npm install.
A small website that teaches people how to make their first open source contribution β and is itself the project they practise on.
Three pages of content, one contributor wall, and about thirty issues sized for someone who has never opened a pull request before.
git clone https://github.com/github-community-gitam/open-source-launchpad.git
cd open-source-launchpad
python3 -m http.server 8000Open http://localhost:8000. That is the entire setup.
Why a server instead of double-clicking
index.html? Every page works either way except the contributor wall, which reads a JSON file. Browsers block reading local files from afile://page for security, so the wall would show an error. The one command above avoids that.
Any static server works β npx serve, VS Code Live Server, whatever you like.
A repository looks like a lot of folders the first time you open one. Almost none of them are yours to worry about. Here is the honest breakdown.
| Folder / file | What is in it |
|---|---|
contributors/ |
One JSON file per person. Adding yourself here is the easiest possible first pull request β copy _TEMPLATE.json, rename it to your username, fill in your name. |
The .html files at the top level |
The four pages of the site: index.html, git-basics.html, pr-checklist.html, wall.html, plus 404.html. Most beginner issues are "fix the text / add a link / add alt text" and happen in exactly one of these. |
css/ |
How the site looks. Start with theme.css β every colour and spacing value in the whole site is a variable in that one file. |
js/ |
Three small scripts: the dark-mode switch, the copy buttons on code blocks, and the contributor wall. Intermediate issues live here. |
| File | Why |
|---|---|
CONTRIBUTING.md |
The workflow: claim an issue, branch, commit, open a PR. |
contributors/README.md |
Exactly how to add yourself to the wall. |
You will never need to touch any of these, and nothing in your issue will require it.
| Thing | What it actually is |
|---|---|
.github/ |
Robots. The checks that run on your PR, the issue templates, the bot that assigns you an issue when you comment /claim. Maintainer territory. |
scripts/build_contributors.py |
A helper a GitHub Action runs by itself after your PR merges. You do not run it. |
contributors/index.json |
Generated automatically β never edit it by hand. A robot rebuilds it from everyone's individual files. |
.htmlvalidate.json |
Settings for the HTML checker. |
.gitignore |
A list of files Git should not track. |
LICENSE, SECURITY.md, CODE_OF_CONDUCT.md |
Standard paperwork every open source project carries. |
assets/ |
Images the site uses. |
The short version: open an issue, it tells you the file. That file is
almost always one .html page or one .css file. Everything else is scenery.
This repository exists so you can make your first pull request.
- Copy
contributors/_TEMPLATE.jsontocontributors/your-username.json - Fill in your name
- Open a pull request
Ten minutes, and you will have done every step of a real contribution: fork, clone, branch, commit, push, PR. Full instructions on the contributor wall page.
- Browse issues labelled
good first issue - Comment
/claimβ a bot assigns it to you within seconds - Read CONTRIBUTING.md
- Open a PR with
Closes #<issue number>
Every issue names the exact file to open, what "done" looks like, and how to check your work. If one does not, that is our mistake β tell us.
Everything marked ignore is infrastructure. It is listed only so that nothing in the repo looks mysterious.
open-source-launchpad/
βββ index.html # the landing page
βββ git-basics.html # fork β clone β branch β commit β push β PR
βββ pr-checklist.html # run through this before opening a PR
βββ wall.html # the contributor wall
βββ 404.html
βββ css/
β βββ theme.css # all colours and spacing live here, as variables
β βββ base.css # element defaults and resets
β βββ layout.css # header, nav, footer, grid, print styles
β βββ components.css # cards, buttons, callouts, the wall
βββ js/
β βββ theme-toggle.js # light/dark, remembered per browser
β βββ copy-code.js # copy buttons on code blocks
β βββ wall.js # loads and filters the contributor wall
βββ contributors/
β βββ _TEMPLATE.json # copy this
β βββ index.json # generated β do not edit
β βββ <username>.json # one file per person
βββ scripts/
β βββ build_contributors.py # ignore β a robot runs this for you
βββ assets/ # ignore β images
βββ .github/ # ignore β CI checks, issue templates, bots
βββ .htmlvalidate.json # ignore β HTML-checker settings
βββ .gitignore # ignore
βββ LICENSE # ignore β MIT
βββ SECURITY.md # ignore
βββ CODE_OF_CONDUCT.md # ignore
Each person adds contributors/<their-handle>.json. Because nobody shares a
file, eighty people can add themselves during a two-hour event without a
single merge conflict. A GitHub Action rebuilds contributors/index.json
after each merge.
This is a real technique, not a teaching exercise β the same pattern shows up in changelog folders and infrastructure configs anywhere a large team edits one project.
Changing a colour? Edit css/theme.css. Every colour in the project is a
variable defined there, and there is a dark-theme value right below the light
one. Change both.
Adding a page? Copy the <head>, header, and footer from an existing page,
add your page to the nav in all five files, and add aria-current="page" to its
own nav link.
Adding a component? It goes in css/components.css, and it uses the
variables from theme.css rather than hard-coded colours.
Four checks run on every pull request, and each one only fires on something genuinely broken:
| Blocks the merge | Looks for |
|---|---|
| contributor files | Invalid JSON, a filename that does not match the handle, an over-long quote |
| HTML | A tag that was never closed, malformed markup |
| accessibility | Images with no alt, a missing lang, <title>, or viewport tag |
| internal links | An href or src pointing at a file that does not exist |
Style is never a blocker. Quote marks, tag casing, heading order and similar
house-style points appear as warnings in the log and are ignored by the gate.
If the log says warning, it cannot stop your pull request β only error can.
This is deliberate. Nobody's first contribution should be rejected by a robot over a style preference.
Check the first one yourself before pushing:
python3 scripts/build_contributors.py --checkMaintained by OS & DevX, GITHUB Community GITAM.
| Date | Event |
|---|---|
| Mon, Oct 5 | Open Source Kickoff & Live PR Lab |
| Mon, Oct 12 | PR Debug Clinic #1 β bring a broken branch |
| Wed, Oct 21 | PR Debug Clinic #2 |
Also worth a look: terminal-arcade, our Python mini-games project, if you would rather write Python than HTML.