Writing Projects on Your Resume Honestly
35 min · Intermediate
Need help? Ask a tutor on WhatsApp (opens in a new tab)A resume line is a promise. Every word can become an interview question, and one invented number can end the interview. An honest bullet is short, specific and easy to prove from your repository.
A bullet has a verb, a thing and a fact
A resume bullet is one line that starts with a verb, names what you built or changed, and ends with a fact someone can check, such as a count, a test or a link.
Compare "Worked on a booking project" with "Built a booking API in FastAPI where a unique constraint rejects double booking, tested with 50 threads". The second line can be checked and questioned.
bullets = [ "Built a booking API in FastAPI and PostgreSQL.", "Stopped double booking with a unique constraint.", "Tested it with 50 threads booking one seat.",]for b in bullets: print("-", b)Use two or three bullets per project. Start each with a different verb: built, tested, added, fixed, designed.
Numbers: count them, never invent them
A checkable number is a count that anyone can reproduce from your repository or running app, such as endpoints, tables or tests. If you cannot reproduce it, do not write it.
Do not write "handles 10,000 users" unless you ran a load test that shows it. Write what you can count: "14 endpoints, 5 tables, 22 tests". You can prove each in a minute.
routes = ["GET /products", "POST /products", "GET /orders", "POST /orders", "POST /login"]endpoints = len(routes)print(f"{endpoints} endpoints")Example 1 · Count facts straight from a list
routes = [ "GET /courses", "POST /courses", "GET /courses/{id}", "POST /enrollments", "DELETE /enrollments/{id}", "POST /login",]tables = ["student", "course", "enrollment"]tests = 18print(f"{len(routes)} endpoints, {len(tables)} tables, {tests} tests")6 endpoints, 3 tables, 18 tests
What this code does
- The route and table lists come from the project, so the counts are real.
lencounts them, which avoids a wrong number typed by hand.- The test count would come from running pytest, and stays a plain number here.
Example 2 · Check a claim against facts
facts = {"endpoints": 12, "tables": 4, "tests": 20}claims = {"endpoints": 12, "tables": 6, "tests": 20}for key, claimed in claims.items(): if facts[key] != claimed: print(f"Fix {key}: claimed {claimed}, repo has {facts[key]}")print("Check done")Fix tables: claimed 6, repo has 4 Check done
What this code does
factsholds numbers counted from the repository.- The loop compares each claim with its fact.
- Only the table count is wrong, so only that line is printed.
In a real project, run the app and read the docs page for the endpoint count, and run pytest for the test count. Write the number from the run, and update it when the code changes.
Course projects, links and what to leave out
Say plainly when a project came from a course: "Built in a backend course; added JWT roles and tests." Link the repository and keep its README clear: what it does, how to run it, and how to test it.
Example 3 · A bullet builder keeps the shape
def bullet(verb, thing, fact): return f"{verb} {thing}, {fact}."
print(bullet("Built", "an order API in FastAPI", "with 12 endpoints"))print(bullet("Tested", "stock rules with pytest", "covering 8 failure cases"))Built an order API in FastAPI, with 12 endpoints. Tested stock rules with pytest, covering 8 failure cases.
What this code does
- A function keeps every bullet in the same verb, thing, fact shape.
- The facts passed in must be counted by you.
- The shape is the lesson, so write your own words and your own numbers.
Leave out tools you only installed, skills you cannot explain, and users or revenue you do not have. A short, true project section beats a long one that falls apart under the second question.
Next step
Check your understanding
8 quick questions