Resume, Portfolio & GitHub Profile Module 6 – Portfolio projects
Making a repository easy to review
How to make a repository a reader understands in two minutes: About details and topics, a README in four parts, tests, CI, a licence and no secrets.
What you will learn
- Structure a repository so that a reader understands it in two minutes
- Write a repository's About details: a description, a website and topics
- Show care through tests, CI, current dependencies and a licence
- Remove secrets, large files and generated clutter before you share it
Before you start
What you’ll learn · Before you start
What you will learn
- Structure a repository so that a reader understands it in two minutes
- Write a repository's About details: a description, a website and topics
- Show care through tests, CI, current dependencies and a licence
- Remove secrets, large files and generated clutter before you share it
Before you start
On this page
A hiring manager may give your project a couple of minutes, by the estimate in GitHub’s own tutorial for job seekers, and the first screen of its repository decides how they spend them: the About box, the file list and the README under it. A repository that answers what the project is, how to run it and how it is tested on that screen earns the rest of the reader’s time.
This lesson cleans up the canteen queue tracker’s repository: its first screen, the signs of care a reader looks for, and what must never be in a repository you share.
The first screen decides what a reader does next
GitHub’s tutorial names three repository details that help a hiring manager understand a project quickly: a brief description, a website where the project can be seen in action, and topic tags. They sit in the About box beside the file list, and the README appears under the files. Step through the canteen tracker’s first screen, as it was and after the clean-up:
The drawing shows the whole scene; its 8 steps are listed below.
Every step as text
- An empty About box. The reader opens the canteen tracker's repository. The About box, which GitHub's tutorial says should hold a brief description and a website where the project runs, is empty, so the first question goes unanswered.
- Topics nobody can use. The topics read Flask, college project and queue. GitHub accepts only lowercase letters, numbers and hyphens, at most 50 characters each, so the first two cannot be added as written, and the page shows queue alone.
- Tests, but nothing else. The file list shows a tests folder, the one good sign. There is no licence and no workflow that runs the tests, so the reader cannot tell whether the tests pass or whether the code may be reused.
- A README of two words. The README says our project and nothing more. With no features, no run steps, no demo and no tests to read about, the reader has nothing to spend the two minutes on.
- Description and website. After the clean-up, the About box describes the project in one sentence and links the demo, so the reader knows what it is and where to see it before reading anything else.
- Five topics that work. The topics become flask, sqlite, queue, python and student-project, in lowercase with hyphens, so they appear on the repository's main page and say at a glance what the project uses.
- Signs of care in sight. A LICENSE file and a workflow that runs the tests on every push join the tests folder. The reader sees, without opening a file, that the tests run and what they may do with the code.
- A README in four parts. The README now covers what the project does, the steps to install and start it, a demo, and how to run the tests, the four parts GitHub's tutorial names. The reader opens the demo, which is what the two minutes were for.
The clean-up changed no code. Every step from the fifth on fixed something the reader sees before opening a single file, and the README went from two words to the four parts GitHub’s tutorial lists: the key features, how to set up and run the project, an example or a demo, and how to test it.
topics: Tags on a GitHub repository that say what it is about or what it uses, written in lowercase letters, numbers and hyphens. They appear on the repository's main page. have rules of their own. GitHub accepts lowercase letters, numbers and hyphens, at most 50 characters for each topic and no more than 20 topics, which is why “Flask” and “college project” could not be added as written. You edit the description, the website and the topics from the gear icon beside About on the repository’s main page.
Key idea
A reader decides from the first screen: a description, a website and topics in the About box, and a README in four parts under the file list, before any code is read.
Checkpoint
Check: The first screen of a repository
Seven signals a reader can see, before and after
The first screen can show seven signals in all: the three About details, a README in four parts, tests, a workflow that runs them, which is continuous integration: Running a project's tests automatically on every change pushed to its repository, usually with a workflow file, so that a change that breaks them shows at once. or CI, and a licence. The program checks the canteen tracker’s repository for each, as it was and after the clean-up:
# Checks the seven things the first screen of a repository can show a reader, for the canteen queue tracker before and
# after a clean-up: the About details GitHub's tutorial for job seekers asks for (a description, a website, topics),
# GitHub's rules for topics (lowercase letters, numbers and hyphens, at most 50 characters each, at most 20), the four
# parts of a helpful README in that tutorial (features, how to set up and run, a demo, how to test), tests, a CI
# workflow and a licence. The repository is invented. Press Edit, describe your own repository in MINE, and run it.
import re
BEFORE = {
"description": "",
"website": "",
"topics": ["Flask", "college project", "queue"],
"files": ["app.py", "canteen/queue.py", "tests/test_queue.py", "requirements.txt", "README.md"],
"readme": "# canteen\n\nour project\n",
}
AFTER = {
"description": "A token queue for a college canteen: students take a numbered token and wait seated until it is called",
"website": "https://canteen-queue-example.onrender.com/",
"topics": ["flask", "sqlite", "queue", "python", "student-project"],
"files": ["app.py", "canteen/queue.py", "tests/test_queue.py", "requirements.txt", "README.md", "LICENSE",
".github/workflows/tests.yml"],
"readme": "# Canteen queue tracker\n\n## Features\n\n## Set up and run\n\n## Demo\n\n## Run the tests\n",
}
MINE = None # your own repository, in the same shape
README_PARTS = {"features": ("feature",), "setup and run": ("set up", "setup", "install", "run"),
"demo": ("demo", "example"), "tests": ("test",)}
TOPIC = re.compile(r"[a-z0-9-]{1,50}")
def signals(repo):
headings = [h.lower() for h in re.findall(r"^##+ (.+)$", repo["readme"], flags=re.M)]
readme_parts = [part for part, words in README_PARTS.items() if any(w in h for h in headings for w in words)]
return {
"a description": bool(repo["description"].strip()),
"a website": repo["website"].startswith("https://"),
"valid topics": 0 < len(repo["topics"]) <= 20 and all(TOPIC.fullmatch(t) for t in repo["topics"]),
"a README in four parts": len(readme_parts) == len(README_PARTS),
"tests": any(f.startswith("tests/") or re.search(r"(^|/)test_\w+\.py$", f) for f in repo["files"]),
"a CI workflow": any(f.startswith(".github/workflows/") for f in repo["files"]),
"a licence": any(f.split("/")[-1] in ("LICENSE", "LICENSE.md", "LICENCE") for f in repo["files"]),
}
for name, repo in [("before", BEFORE), ("after", AFTER)] + ([("mine", MINE)] if MINE else []):
found = signals(repo)
print(f"{name}: {sum(found.values())} of {len(found)} signals")
print(f" missing: {', '.join(s for s, ok in found.items() if not ok) or 'nothing'}")
bad = [t for t in repo["topics"] if not TOPIC.fullmatch(t)]
if bad:
print(f" topics GitHub will not accept: {bad}") Output
before: 1 of 7 signals missing: a description, a website, valid topics, a README in four parts, a CI workflow, a licence topics GitHub will not accept: ['Flask', 'college project'] after: 7 of 7 signals missing: nothing
Recorded with Python 3.14.8 on macOS 26 arm64. To run it yourself: mise exec python@3.14.8 -- python3 first_screen.py
Runs on this device, in your browser. The first run downloads Python (about 13.5 MB), which is kept for the next runs.
Your run, in this browser
Before, the repository showed one signal of seven, its tests folder. After, it shows all seven, and nothing in the code changed: the work was a sentence, a link, five topics, a README, a workflow file and a licence.
Three more things decide whether a repository is ready to share, and each needs a check of its own. A README follows rules on GitHub beyond its four parts, such as which copy is shown and how much of it. A repository must hold no secrets, no very large files and no generated clutter, such as cache folders, in any commit of its history. And each sign of care, from tests to a licence, tells a reader something specific about how you work.
A README that only says how to install
Wrong: a README that lists install commands and nothing else. Right: what the project does, how to run it, a demo and how to run the tests, in that order. A reader who cannot tell what the project does will not install it.
Checkpoint
Check: Seven signals a reader can see
A README GitHub shows the way you meant, with a preview image Pro: opens with a Pro, Premium or Ultimate pass
GitHub decides which README a repository shows, how much of it, and where its links point. This part checks the canteen tracker’s README against those rules, catches the one that surprises people most, and sets the image that represents the repository wherever its link is shared.
In this part:
- Which README GitHub shows, how much of it, and where its links point
- Writing each part so a reader can act on it
- A preview image for links that are shared
1 runnable example (Python, README.md) · about 4 minutes
Opening this part with your pass…
This part opens with any MySmartCoPilot pass.
- Pro pass · 1 week₹79$2.99
- 30 days₹179$5.99
- 1 year₹1,699$45
One payment; a pass never renews. The price shown is the total you pay: no fees or charges are added at checkout.
Passes can’t be bought right now, so this part can’t be opened at the moment. The free part above stands on its own. If you have a pass, enter your licence key.
It also opens every other in-depth part in Learn and every Pro tool. Sales are final, except where the law gives you a right to withdraw, for example in the EU and the UK (refund policy).
Secrets, large files and clutter, found and fixed before you share Pro: opens with a Pro, Premium or Ultimate pass
Everything a repository holds in any commit is published with it, not only what its last commit shows. This part audits the canteen tracker’s whole history, reproduces a deleted key that is still there, and fixes each finding in the order that matters.
In this part:
- A deleted key is still in the history: the audit, before and after
- Fixing each finding, in the order that matters
1 runnable example (Python) · about 4 minutes
Opening this part with your pass…Pro part. It opens with the same pass as the part above.
Tests, CI, dependencies and a licence: what each tells a reader Pro: opens with a Pro, Premium or Ultimate pass
Each sign of care answers a question a reader would otherwise ask in the interview. This part says what each one shows, what it takes to add, and what a missing licence leaves unsaid.
In this part:
- What each sign of care shows, and what it takes to add
- Tests a reader can read without running them
- A licence, or what a missing one means
about 4 minutes
Opening this part with your pass…Pro part. It opens with the same pass as the part above.
Practise: clean up a repository’s first screen
Arjun’s library seat booker has a repository whose first screen says almost nothing. Fix it from his records; the sample tests check the description, the website, the topics, the README’s four parts, and the tests, workflow and licence in its files:
Exercise · Easy · Python
Clean up a repository's first screen
Arjun's library seat booker, the project of this track's case study exercise, has a repository whose first screen says almost nothing. REPO in repo.py describes it: the About details, the topics, the files and the README. His records:
- What it is: a seat booking site for a college library's reading room, built with Django and PostgreSQL, which cut no-shows from 31 % to 12 % in one semester.
- Where it runs: https://seat-booker-example.vercel.app/ (a demo with invented bookings).
- How to run it: install the requirements, create the database with
python manage.py migrate, thenpython manage.py runserver. - The tests:
pytestruns 18 tests of booking, check-in and release.
Fix REPO so that its first screen shows all seven signals of this lesson:
- a description of one sentence, at most 160 characters, that says what the project is;
- a website that starts with
https://; - three to six topics that GitHub accepts: lowercase letters, numbers and hyphens, at most 50 characters each;
- a README whose
##headings cover the four parts GitHub's tutorial lists: features, setting up and running, a demo, and the tests; - tests (they are already there), a workflow under
.github/workflows/that runs them, and aLICENSEfile, added tofiles.
Starter code · repo.py
# Arjun's repository as a reader first sees it. Fix it from his records in the prompt.
REPO = {
"description": "",
"website": "http://seat-booker-example.vercel.app/",
"topics": ["Django", "Library Management", "postgres"],
"files": ["manage.py", "booker/models.py", "booker/views.py", "tests/test_booking.py", "requirements.txt",
"README.md"],
"readme": "# seat-booker\n\nDjango project.\n",
} The sample tests · test_repo.py
import re
from repo import REPO
TOPIC = re.compile(r"[a-z0-9-]{1,50}")
README_PARTS = {"features": ("feature",), "setting up and running": ("set up", "setup", "install", "run"),
"a demo": ("demo", "example"), "the tests": ("test",)}
def test_description_and_website():
"""gives a one-sentence description and an https website"""
description = REPO["description"].strip()
assert description, "write a description: what the project is, in one sentence"
assert len(description) <= 160, f"the description has {len(description)} characters: at most 160"
assert REPO["website"].startswith("https://"), "the website should start with https://"
def test_topics_github_accepts():
"""has three to six topics that GitHub accepts"""
topics = REPO["topics"]
assert 3 <= len(topics) <= 6, f"{len(topics)} topics: give three to six"
bad = [t for t in topics if not TOPIC.fullmatch(t)]
assert not bad, f"GitHub accepts only lowercase letters, numbers and hyphens: {bad}"
def test_readme_in_four_parts():
"""has a README whose headings cover features, setup and run, a demo and the tests"""
headings = [h.lower() for h in re.findall(r"^## (.+)$", REPO["readme"], flags=re.M)]
missing = [part for part, words in README_PARTS.items() if not any(w in h for h in headings for w in words)]
assert not missing, f"the README has no heading for: {missing}"
def test_tests_workflow_and_licence():
"""shows tests, a workflow that runs them and a licence in its files"""
files = REPO["files"]
assert any(f.startswith("tests/") for f in files), "keep the tests folder"
assert any(re.fullmatch(r"\.github/workflows/[\w.-]+\.ya?ml", f) for f in files), "add a workflow file under .github/workflows/"
assert "LICENSE" in files, "add a LICENSE file" A hint
Start with the topics: write each one in lowercase and join words with a hyphen, as in library-management. For the README, give each of the four parts its own ## heading, such as ## Features and ## Run the tests, with a line or two under each from Arjun's records.
Results of the sample tests
| Test | Result | Details |
|---|
What your code printed
The sample tests run on this device, in your browser (Pyodide): nothing is sent to mysmartcopilot.com. The first run downloads Python (about 13.5 MB), which is kept for the next runs. A check in your browser is feedback for you, not proof that the code is right for every input.
Then answer questions on the first screen and its seven signals, starting with the idea you have answered worst so far:
Practice that adapts to you
Practise this lesson
7 questions about 5 ideas of this lesson. Each answer is explained at once, and what you get right is kept in this browser.
Interview questions
Warm-up (fresher to mid-level): What does a reader look at first when they open your repository?
The first screen: the About box, the file list and the README under it. The About box should say in one sentence what the project is, link a place where it runs and carry a few topics. The file list shows at a glance whether there are tests, a workflow that runs them and a licence. The README should list what the project can do, give the commands that install and start it, link a demo and give the command that runs the tests. If those answer what it is, how to run it and how it is tested, the reader spends the rest of their time on the code.
Three questions of this module’s bank go further:
-
Fresher to senior
Six months ago you committed a .env file with a real API key to your portfolio repository, and deleted it a week later. The repository is public. What do you do now, in order, and how do you stop it happening again?
-
Fresher to mid
A recruiter will open your three pinned repositories tomorrow, and you have one evening. In what order do you spend it, and what do you leave for later?
-
Fresher to mid
Your project's history has 140 commits named "fix", "update" and "final final". Do you rewrite it before you apply, and what changes from now on?
Flashcards · 7 cards
Recall it, then check
Say the answer to yourself before you look: recalling it is what makes it stick.
-
What makes up the first screen of a repository that a reader judges?
The About box, the file list and the README shown under it. If they say what the project is, how to run it and how it is tested, the reader spends the rest of their time on the code.
-
Which three About-box details does GitHub's tutorial say help a hiring manager?
A short description, a link to a site where the project runs, and topic tags, all edited from the gear icon beside About on the repository's main page.
-
Which four parts should a project's README have?
The key features, how to set up and run the project, an example or a demo, and how to test it.
-
What rules do GitHub repository topics follow?
Lowercase letters, numbers and hyphens only, up to 50 characters per topic and no more than 20 topics, so neither “Flask” nor “college project” can be added as written.
-
Which seven signals can a repository show before anyone reads its code?
The three About details (a description, a website and topics), a README in four parts, tests, a workflow that runs them, which is continuous integration, and a licence.
-
How much code did the canteen tracker's repository clean-up change?
None. It went from one signal of seven to all seven by adding a sentence, a link, five topics, a README, a workflow file and a licence.
-
Why is a README that only lists install commands not enough?
A reader who cannot tell what the project does will not install it. Say what it does, how to run it, where the demo is and how to run the tests, in that order.
Key takeaways
- A reader decides from the first screen: the About box with a description, a website and topics, and a README in four parts under the file list.
- Topics take lowercase letters, numbers and hyphens, at most 50 characters each and no more than 20.
- Seven signals can show before any code is read: the three About details, the README, tests, CI and a licence.
Terms in this lesson
- continuous integration
- Running a project's tests automatically on every change pushed to its repository, usually with a workflow file, so that a change that breaks them shows at once.
- topics
- Tags on a GitHub repository that say what it is about or what it uses, written in lowercase letters, numbers and hyphens. They appear on the repository's main page.
References
- Using your GitHub profile to enhance your resume (GitHub Docs)
- Classifying your repository with topics (GitHub Docs)
- About the repository README file (GitHub Docs)
- Customizing your repository's social media preview (GitHub Docs)
- About large files on GitHub (GitHub Docs)
- Ignoring files (GitHub Docs)
- Removing sensitive data from a repository (GitHub Docs)
- About push protection (GitHub Docs)
- Dependabot quickstart guide (GitHub Docs)
- Build secrets (Docker Docs)
- No License (GitHub (choosealicense.com))
Related tools
Report a problem with this lesson
Kept only in this browser. Your Learn progress