Follow this page start to finish during class. It is the whole exercise: one
Linear issue, one branch, one file, one pull request, one review, one merge.
Everything you need is in this repository; the field rules for the file you
write are in bios/README.md.
Add bios/firstname-lastname.yml for yourself, get it reviewed and merged into
testing, and see it appear on the deployed site.
The file is a YAML file — structured key: value data. Only one field,
about, is prose, and that prose is Markdown.
There is exactly one long-lived branch here: testing. It is the default
branch, it is protected, and it is the branch that gets deployed. There is no
staging, no production and no main. You branch from testing and you
pull-request back into testing. Real client projects usually promote a change
through several environments; this exercise stops at the first deployed one on
purpose, so the class practises the review loop and not release plumbing.
- Linear issue "Add bio for <Your Name>" assigned to you
- Branch created from Linear's Copy git branch name
-
bios/firstname-lastname.ymlwritten and previewed locally - PR open into
testing, CI green, assigned reviewer requested - You reviewed the PR you were assigned
- Squash-merged, Linear issue in Done, site rebuilt
Open the Linear project your instructor pointed you at, find Add bio for <Your Name>, assign it to yourself, and read the description — it names the person you must request as your reviewer.
On the issue, click Copy git branch name. You get something like
abc-12-add-bio-for-jane-doe. The abc-12 part is your Linear team's key plus
the issue number, so yours starts with your own team's key. Do not invent your
own name: that ID is what moves the issue through Todo -> In Progress -> In
Review -> Done.
git switch testing
git pull
git switch -c abc-12-add-bio-for-jane-doe # paste YOUR name from Linear
git push -u origin HEADNever push directly to testing: it is protected, and work reaches it only
through a reviewed pull request. Push to your own branch.
Check Linear: the issue should now be In Progress with the branch linked.
cp bios/TEMPLATE.yml bios/jane-doe.yml # use YOUR nameThe filename must be the slug of your name field: "Jane Doe" ->
bios/jane-doe.yml. The extension is .yml, not .yaml. See
bios/README.md for the filename rule and the full field
table.
Open your file and edit it. Nothing needs deleting to make it parse — the
template is valid YAML as it ships, and the # lines are YAML comments.
- Set
nameandheadline(90 characters maximum), and setteamto the one named on your Linear issue. It must match a team listed in../site.yml— open that file to see the exact names your instructor is using. Case does not matter; spelling does. - Replace the
abouttext with 40–2000 characters about you. Keep theabout: |line and keep your text indented two spaces under it; it is rendered as Markdown, so**bold**, links and-lists work. - Uncomment any optional fields you want (
pronouns,location,focus,links,avatar,fun_fact) and leave the rest commented out.
The result looks like this:
name: Jane Doe
team: Team Falcon
headline: Backend engineer who likes boring infrastructure
about: |
I work on **APIs** and the boring infrastructure underneath them. Most
recently I built a rate limiter that nobody has had to think about since.
- Comfortable in Python and Go
- Learning Kubernetes the hard way
focus:
- Python
- Postgres
links:
GitHub: https://github.com/janedoeWith Docker, from the repository root:
docker compose up --buildOpen http://localhost:8088 and find your card. Ctrl-C stops it.
Two things that trip people up here:
- Keep
--build. The site is baked into the image, so a plaindocker compose upserves the previous build and your card will be missing. - Port already allocated? Something else on your machine owns 8088. Run
SITE_PORT=9090 docker compose up --buildand open that port instead.
Without Docker:
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
python -m generator serve # http://localhost:8000Rules only, no browser:
python -m generator validateYou want 1 bio file(s) valid. — or however many files are in the folder.
git add bios/jane-doe.yml
git commit -m "Add bio for Jane Doe"
git pushWrite the subject in the imperative mood — "Add bio for Jane Doe", not "added
my bio". Keep commits small and keep this one to your single file. Never commit
secrets, credentials or a .env file; this repo needs none of them.
On GitHub, open a PR with base = testing, compare = your branch. The PR
template fills in the checklist; tick it honestly. The Linear issue links itself
because the branch carries the issue ID, and opening the PR moves the issue to
In Review.
Then, in the Reviewers panel, request the reviewer named on your Linear issue. Not a friend, not whoever is nearest — the assigned one.
You are also somebody's reviewer. The roster is a ring: student n reviews student n+1, and the last student reviews the first. Open their PR, read Files changed, and check:
- the file has
name,team,headlineandabout;teamis one of the teams listed insite.yml - the filename matches their name and ends in
.yml aboutreads professionally and is a sentence or two, not a placeholder- no files outside
bios/were touched
Be specific and be kind: comment on the code, never on the person, and say what you would change rather than only that something is wrong. Approve when the change is good enough to ship, not when it is perfect, and save Request changes for a real blocker — anything smaller is a comment.
Fix or reply to every comment, push, resolve the threads, re-request review.
When you have one approval and green CI, use Squash and merge, then
Delete branch. Squash merge keeps one commit per issue on testing.
The merge moves your issue to Done automatically. The deployment watches the
testing branch and rebuilds on the push, so within a minute or two your card
is on the deployed site (your instructor will give you its URL). Then:
git switch testing
git pullCI is red. Open the PR, go to Files changed, and read the annotation
attached to your file. It names the exact fix, for example
bios/jane-d.yml: filename must be 'jane-doe.yml' to match name 'Jane Doe'. Run
python -m generator validate locally to see the same message. Fix, commit,
push — the PR re-runs itself.
A tab in your indentation. YAML does not allow tabs anywhere in the indentation, and most editors insert one if you press Tab:
bios/jane-doe.yml: indented with a tab - YAML only allows spaces, so replace tabs with two spaces
An unquoted value containing ': '. A colon followed by a space starts a
new key as far as YAML is concerned, so
headline: Backend engineer: infrastructure fails:
bios/jane-doe.yml: invalid YAML at line 3: mapping values are not allowed here - a value containing ': ' must be wrapped in quotes
Wrap the whole value in quotes:
headline: "Backend engineer: infrastructure".
You saved it as .yaml. The extension is .yml. A .yaml file is
reported as filename must be lowercase 'firstname-lastname.yml' (letters, digits and hyphens only) rather than being silently skipped.
Your card shows up under "Unassigned", or with placeholder text where your
headline or bio should be. The generator could not read part of your file, so
it substituted fallback values: a team that does not match site.yml lands
in a trailing Unassigned group, a missing headline renders as
Bio still needs a headline, and an unreadable about renders a placeholder
telling readers to run the validator. The site stays up so one bad file does
not hide everybody's cards. It does not let you off: validate fails on every
one of those substitutions, so CI is still red and the fix is still yours. Run
python -m generator validate, fix what it names, push.
Merge conflict. You should not get one. Your PR adds one brand-new file that
nobody else touches, and site.yml is instructor-owned, so there is no shared
file to collide on. If you do have a conflict, you probably worked on testing
itself or edited someone else's bio — undo the changes that are not your own
file, and if you have not committed yet, git switch -c <your-branch> carries
your work onto a branch of your own (next entry).
You started on the wrong branch (you edited files while on testing, and
have not committed). Take the work with you:
git switch -c abc-12-add-bio-for-jane-doeIf you already committed to the wrong branch, ask the instructor before rewriting anything.
Your reviewer is stuck or absent. Say so out loud; the instructor approves so you are not blocked.
-
python -m generator validateexits without problems - Your card appears at http://localhost:8088 (or
:8000without Docker) - The PR is base
testing, one file changed, CI green, one approval - The PR you were assigned has your submitted review on it
- The Linear issue is in Done and the branch is deleted
- Your page is live on the deployed site
Your bio is merged into testing, you approved someone else's bio, your Linear
issue is Done, and the deployed site shows your card. All six boxes above
ticked.