Your country

Tools that support it use your country for local currency, number formats, units and paper size. Your choice is saved only in this browser.

Type a name or a two-letter code. Use the up and down arrow keys to move through the countries, Enter to choose one and Escape to close.

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.

  • Intermediate
  • 20 minutes
  • Examples run with Python 3.14.8, Node.js 24.21.0 and Pyodide 314.0.7
  • By MySmartCoPilot
Free core, Pro depth: 7 of 20 minutes free
Free: The first screen decides what a reader does next · Seven signals a reader can see, before and after. With a pass: 3 in-depth parts and 3 interview answers, about 13 minutes.

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

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:

Interactive · step by step The first screen of a repository, before and after Step through what a reader meets on the canteen tracker's repository page, first as it was, then after the clean-up.
The first screen of a repository, before and after, step 8 of 8. Showing About box (one sentence, a demo link), Topics (flask, sqlite, queue …), File list (tests/ and workflows/), Licence and CI (LICENSE, tests passing), README (features, run, demo, tests), The reader (opens the demo). In focus: README, The reader.what they readAbout boxone sentence, a demo linkTopicsflask, sqlite, queue …File listtests/ and workflows/Licence and CILICENSE, tests passingREADMEfeatures, run, demo, testsThe readeropens the demoa demo to open

The drawing shows the whole scene; its 8 steps are listed below.

Every step as text
  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.
  7. 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.
  8. 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

  1. Question 1 of 2 Which details does GitHub's tutorial for job seekers ask you to fill in for a repository? Choose every one.

    Choose every answer that is right.

    Show the answer: Question 1 of 2

    Answer:

    • A website where the project can be seen in action
    • Topic tags that categorise the project
    • A brief description of the project

    GitHub's tutorial lists three repository details that help hiring managers understand a project quickly: a brief description, a website where it can be seen in action, and topic tags.

  2. Question 2 of 2 Which of these topics can GitHub accept as written?

    Choose one answer.

    Show the answer: Question 2 of 2

    Answer: student-project

    Topics use lowercase letters, numbers and hyphens, at most 50 characters each, with no more than 20 for a repository. That is why "Flask" and "college project" could not be added to the canteen tracker as written.

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:

Seven first-screen signals, before and after Python · first-screen/first_screen.py
# 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

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

  1. Question 1 of 2 Before the clean-up, how many of the seven signals did the canteen tracker's repository show?

    Type a number.

    A hint

    Look for the first line of the program's output.

    Show the answer: Question 1 of 2

    Answer: 1 signals

    Before the clean-up the repository showed one signal of seven, its tests folder. The description, the website, valid topics, a README in four parts, a CI workflow and a licence were all missing.

  2. Question 2 of 2 The clean-up took the canteen tracker's repository from one signal to seven. What changed in its code?

    Choose one answer.

    Show the answer: Question 2 of 2

    Answer: Nothing; the work was a sentence, a link, five topics, a README, a workflow file and a licence

    The seven signals are all on the first screen: the three About details, the README, tests, a CI workflow and a licence. A repository can go from one to seven in an evening without touching its code.

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.

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, then python manage.py runserver.
  • The tests: pytest runs 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 a LICENSE file, added to files.

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.

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.

  1. Question 1 of 7 Where does the README appear on a repository's main page?

    Choose one answer.

    Show the answer: Question 1 of 7

    Answer: Under the file list

    The About box sits beside the file list, and the README appears under the files. Together they are the first screen a reader judges.

  2. Question 2 of 7 At most how many topics can a repository have?

    Type a number.

    Show the answer: Question 2 of 7

    Answer: 20 topics

    GitHub allows no more than 20 topics for a repository, each of at most 50 characters in lowercase letters, numbers and hyphens.

  3. Question 3 of 7 Which description fits the canteen tracker's About box?

    Choose one answer.

    Show the answer: Question 3 of 7

    Answer: A token queue for a college canteen: students take a numbered token and wait seated until it is called

    The About box's description is one brief sentence that says what the project is and for whom. The canteen tracker's says what a student does and how the queue then calls them.

  4. Question 4 of 7 You have ten minutes before a reader opens your repository. Which fix comes first?

    Choose one answer.

    Show the answer: Question 4 of 7

    Answer: A description and a website in the About box, which the reader sees before anything else

    The first screen decides what the reader does next, and the About box is its top. A description and a website take a minute and answer the reader's first two questions.

  5. Question 5 of 7 Which of these are among the lesson's seven first-screen signals? Choose every one.

    Choose every answer that is right.

    Show the answer: Question 5 of 7

    Answer:

    • A licence file
    • A CI workflow that runs the tests
    • A description in the About box

    The seven signals are a description, a website, valid topics, a README in four parts, tests, a CI workflow and a licence. Each can be seen before any code is read.

  6. Question 6 of 7 What does this lesson mean by continuous integration, or CI?

    Choose one answer.

    Show the answer: Question 6 of 7

    Answer: A workflow that runs the project's tests on every push

    CI here is a workflow, such as .github/workflows/tests.yml, that runs the tests automatically on every push, so a reader can see that they run.

  7. Question 7 of 7 A repository shows all seven first-screen signals. Is it ready to share?

    Choose one answer.

    Show the answer: Question 7 of 7

    Answer: Not yet, until no commit of its history holds secrets, very large files or generated clutter

    The seven signals cover the first screen. Three more things decide whether a repository is ready to share: its README's rules on GitHub, no secrets, very large files or generated clutter in any commit, and what each sign of care says.

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:

  1. 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?

    Model answer, Pro. Model answers open with any pass; prices are in the notice on this page. First step and follow-ups

  2. 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?

    Model answer, Pro. First step and follow-ups

  3. 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?

    Model answer, Pro. First step and follow-ups

Flashcards · 7 cards

Recall it, then check

Say the answer to yourself before you look: recalling it is what makes it stick.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

  7. 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

Related tools

Report a problem with this lesson

Quick answers and tool search

Type to search tools or to get a quick answer, for example 18% of 2500. Use the up and down arrow keys to move through the results, Enter to choose, and Escape to close.