33.2. Building a Portfolio
Table of Contents
Why a Portfolio Matters for Backend Developers
A portfolio is concrete proof that you can build and ship working software. As a backend developer, you do not rely on visual design to impress people. Instead, you show:
- That you understand real problems.
- That you can design and implement robust APIs and data models.
- That you can deploy and maintain running systems.
Your portfolio is often more important than your formal education, especially for junior positions and self-taught developers.
A good backend portfolio is not a list of technologies.
It is a small set of real, running projects that solve clear problems and are easy to explore.
In this chapter you will learn how to plan, build, present, and grow such a portfolio.
What a Strong Backend Portfolio Includes
Think of your portfolio like a product. Your “users” are:
- Hiring managers
- Tech leads
- Other developers reviewing your GitHub
They want to quickly answer:
- Can this person write clean, maintainable backend code?
- Can they design APIs and data models?
- Can they work with databases, authentication, and deployment?
- Can they communicate their work clearly?
Your portfolio should provide evidence for each question:
| Question | Evidence in Portfolio |
|---|---|
| Can you write backend code? | Clear repositories, tests, clean structure, documentation |
| Can you work with databases and APIs? | Projects with real DB schema, REST APIs, queries, indexing |
| Can you handle auth, security, performance? | Auth & roles, validation, caching, pagination, logging |
| Can you deliver and maintain apps? | Deployed demos, CI/CD pipelines, Docker setups |
| Can you communicate? | README files, diagrams, short explanations of choices |
Choosing the Right Number and Type of Projects
You do not need many projects. You need a few good ones.
How many projects?
For a solid junior backend portfolio, aim for:
- 1 flagship project
Complex, well designed, deployed, and thoroughly documented. Ideally something full-featured like an e-commerce backend or multi-tenant app. - 2 to 3 supporting projects
Each focused on a different area, for example: - Task management / CRUD + auth
- Background jobs and email sending
- Real-time API or WebSocket based app
- Integration with a third-party API
More than 5 projects usually means each one is too shallow or poorly presented.
Types of projects that stand out
Choose projects that show core backend skills:
| Project Idea | What it Shows |
|---|---|
| Task Management API | CRUD, validation, auth, pagination, tests |
| E-commerce Backend | Complex relationships, payments, orders, inventory, caching |
| Authentication Service | Password hashing, JWT, refresh tokens, sessions |
| File Storage Service | S3 integration, presigned URLs, secure uploads/downloads |
| Analytics / Metrics Collector | Background processing, queueing, batch tasks |
| Real-time Chat API | WebSockets, message persistence, rate limiting |
You want coverage across data modeling, APIs, security, background tasks, and deployment.
Designing Portfolio Projects Intentionally
Do not just code randomly. Design each project to show specific skills.
Decide the “skills you want to prove”
Before writing code, write a short design note:
- Target: “I want this project to show that I can:”
- Design a REST API with good resource modeling.
- Handle authentication and authorization.
- Design and query a relational database.
- Write tests and set up CI.
- Deploy using Docker and a cloud host.
Then you map features to these skills:
| Skill | Design Decision Example |
|---|---|
| API design | Clean REST endpoints with versioning and pagination |
| Data modeling | Use relational DB, proper primary and foreign keys, indexes |
| Auth & permissions | JWT or session-based auth, roles, resource ownership checks |
| Background jobs | Queue for sending emails, generating reports, processing media |
| Deployability | Dockerfile, docker-compose, environment variables, logging |
Keep scope realistic, but non-trivial
A common mistake is to aim for something huge and never finish it.
Instead:
- Start with a Minimum Viable Version (MVV):
- Small set of features
- Clean architecture
- Good documentation
- Then iterate and improve in visible, well-documented steps.
Examples of scoped versions of an e-commerce backend:
| Version | Features Included |
|---|---|
| v0.1 | Users, products, simple cart, place order, no payments, local dev only |
| v0.2 | Basic auth, separated admin/user roles, simple SQL database, Dockerized |
| v0.3 | Stripe sandbox payments, background email notifications, deployed to a cloud host |
| v0.4 | Caching for product list, rate limiting, basic monitoring and logging |
Each version adds depth and demonstrates growth.
Making Projects Easy to Explore
Your projects must be easy to understand, run, and test.
A clear, friendly README
Every repository should have a README.md with:
- Short description
One paragraph: what this project is and what problem it solves. - Stack and features table
## Tech Stack
- Backend: Python, FastAPI
- Database: PostgreSQL
- Queue: Redis + RQ
- Auth: JWT (access + refresh)
- Containerization: Docker, Docker Compose
| Area | Features |
|------------|--------------------------------------------------------|
| API | REST, pagination, filtering, validation |
| Security | Hashed passwords, JWT, role-based access |
| Database | Migrations, indexes, foreign keys, constraints |
| DevOps | Dockerfile, docker-compose, basic CI pipeline |
| Testing | pytest, coverage for core endpoints and services |
- How to run locally
Example:
# 1. Clone repository
git clone https://github.com/yourname/task-api.git
cd task-api
# 2. Copy environment template
cp .env.example .env
# 3. Start with Docker
docker compose up --build
# 4. Open API docs
# Visit http://localhost:8000/docs- API overview
A short table of main endpoints:
| Method | Path | Description |
|--------|-----------------------|-----------------------------|
| POST | /auth/register | Create user account |
| POST | /auth/login | Obtain access / refresh |
| GET | /tasks | List tasks (paginated) |
| POST | /tasks | Create a task |
| PATCH | /tasks/{task_id} | Update task |
| DELETE | /tasks/{task_id} | Delete task (owner only) |
- Architecture summary
Briefly describe structure:
- `app/`
- `api/` FastAPI routes
- `core/` configuration, security, dependencies
- `models/` SQLAlchemy models
- `schemas/` Pydantic schemas
- `services/` business logic
- `tests/` unit and integration tests- Screenshots or diagrams (for APIs, screenshots of docs or Postman)
Consistent project structure
Use a clean, recognizable layout. For example, for FastAPI:
app/
api/
core/
models/
schemas/
services/
db.py
tests/
Dockerfile
docker-compose.yml
README.md
pyproject.toml or requirements.txt
.env.exampleConsistency between projects makes you look professional and organized.
Using Git and GitHub Effectively
Your Git history and GitHub profile tell a story about how you work.
Clean commit history
Avoid giant commits like “stuff” or “fixes.” Use small, descriptive commits:
feat(auth): add JWT login endpointfix(tasks): validate due date is in the futuretest(users): add registration API testschore(ci): add GitHub Actions workflow for tests
You can group work logically, for example:
- Add new feature in one or several
featcommits. - Fix small issues with
fixcommits. - Adjust docs with
docscommits.
Branches and pull requests
Even for your own projects, you can:
- Create feature branches:
feature/add-task-search. - Open pull requests into
mainordevelop. - Write a short PR description, for example:
## Summary
- Added text search endpoint for tasks
- Indexed `title` and `description` fields in PostgreSQL
- Updated OpenAPI docs and tests
## Notes
- Uses `ILIKE` for case-insensitive search
- Added limit to results to avoid heavy queriesThis shows that you understand collaborative workflows.
GitHub profile hygiene
- Pin 3 to 6 of your best repositories.
- Add a short GitHub profile README that:
- Says you focus on backend development.
- Links to your portfolio site or main project.
- Lists main technologies you use.
- Archive or hide messy, very early experiments, or clearly label them as “playground” projects.
Demonstrating Backend Skills Explicitly
You are a backend developer. Make that obvious.
Skills to highlight inside projects
Try to show at least some of these across your portfolio:
| Area | Examples to Implement |
|---|---|
| API design | REST endpoints, versioning, pagination, filtering, sorting |
| Database design | Proper schemas, indexes, foreign keys, migrations |
| Authentication | Login, registration, password hashing, token based auth |
| Authorization | Roles, permissions, resource ownership checks |
| Validation | Robust input validation, clear error responses |
| Testing | Unit tests, integration tests, API tests |
| Background processing | Queued jobs, email sending, long running tasks |
| Caching | Redis caching for heavy queries or responses |
| Logging & monitoring | Structured logs, health checks, basic metrics |
| Deployment | Docker, CI pipeline, deployment scripts or guides |
You do not need all of these in every project, but your portfolio as a whole should cover them.
Show good security habits
Even small personal projects should:
- Hash passwords with a strong algorithm.
- Never store secrets in code.
- Validate and sanitize inputs.
- Return appropriate HTTP status codes.
- Avoid revealing internal details in error messages.
Mention these explicitly in README files, for example:
## Security
- Passwords hashed using Argon2
- JWT tokens signed using HS256, secret stored in environment variables
- Rate limiting on login endpoint
- Validation of all incoming data using Pydantic modelsMaking Projects Deployable and Live
A running demo is powerful proof that you can ship.
Minimal deployability
At least your flagship project should have:
- A
Dockerfileanddocker-compose.yml. - A clear deployment section in the README:
- How to build the image.
- Required environment variables.
- Example
docker runordocker composecommands.
For example:
docker build -t yourname/task-api .
docker run -p 8000:8000 --env-file .env yourname/task-apiLive demos (if affordable and safe)
If you can, deploy to a cloud platform. For example:
- Backend API on a small VPS or platform (Render, Fly.io, Railway, etc.).
- PostgreSQL as a managed service or small container.
- Redis for caching and background tasks.
Add:
- Base URL in the README, for example:
https://api.example.com. - Link to OpenAPI / Swagger docs.
- Test/demo credentials if appropriate (for non sensitive environments).
Never expose real secrets in a public demo:
- Use demo accounts and fake data.
- Keep
.envfiles out of Git. - Use environment variables for tokens and passwords.
Presenting Your Portfolio on a Website or Profile
You do not need a fancy frontend, but you do need a clear entry point.
Simple portfolio site
You can use:
- A static site generator.
- A very simple frontend.
- Or even a GitHub profile README as a “home page.”
For each project, provide:
- Title.
- 2 or 3 line description.
- Tech stack.
- Links:
- GitHub repository.
- Live API or demo (if available).
- API docs link.
- Short bullet list of “What this shows”:
**What this demonstrates**
- REST API design with FastAPI
- JWT based auth (access + refresh)
- PostgreSQL schema with indexes and foreign keys
- Background jobs with Redis Queue
- Dockerized deployment and CI with GitHub ActionsTarget your audience
If you are applying for backend roles, emphasize:
- Backends and infrastructure projects first.
- Data modeling, performance, scalability.
- Security and testing.
Do not hide backend behind flashy UI. Frontend is optional, not required.
Writing About Your Work
Being able to explain your decisions is a valuable skill.
Short case studies
For your flagship project, consider writing a short “case study” page or section:
- Problem: what is the app for?
- Constraints: what assumptions you made.
- Architecture: diagrams of main components.
- Key decisions and why you chose them:
- Why FastAPI instead of another framework.
- Why PostgreSQL and not NoSQL.
- How you modeled certain relationships.
- Challenges and how you solved them.
Example structure:
## Architecture Overview
This service is built as a monolithic FastAPI application with a PostgreSQL database.
A separate worker process consumes Redis-backed queues for background tasks such as:
- Sending email notifications
- Generating PDF invoices
- Cleaning up old data
The API is deployed with Docker and served via Uvicorn behind an Nginx reverse proxy.These explanations help interviewers ask good questions and see how you think.
Updating and Maintaining Your Portfolio
Your portfolio is not static. It should grow as you grow.
Keep it curated
Every few months:
- Review your projects.
- Archive ones that no longer represent your current skills.
- Improve documentation and tests for the ones you keep.
Show progression
It is good to have older, simpler projects next to newer, more complex ones.
You can emphasize the learning journey:
- “My first REST API, now archived, but kept to show progress.”
- “Second version of my Task API, with auth and tests added.”
This shows that you can learn and improve over time.
Common Mistakes to Avoid
Avoid these pitfalls that weaken backend portfolios:
| Mistake | Why It Is a Problem |
|---|---|
| Only frontend or toy scripts | Does not show backend architecture or data modeling |
| No README or documentation | Hard to understand, looks unprofessional |
| Cannot run the project locally | Suggests poor understanding of environments and dependencies |
| No tests at all | Red flag for maintainability and quality mindset |
| Hard coded secrets in code | Serious security concern |
| Forked projects without real contributions | Does not prove you can build or maintain systems |
| Overuse of tutorial code without changes | Shows you can follow tutorials, not solve new problems |
If you followed a tutorial, that is fine, but:
- Clearly state it.
- Explain what you built on top.
- Show your own improvements or extensions.
A Practical Action Plan
You can follow this concrete sequence to build your portfolio from scratch.
Step 1: Core learning
Use the rest of this course to learn:
- Python backend development with FastAPI.
- SQL and PostgreSQL.
- Authentication and authorization basics.
- Docker and simple deployment.
Step 2: Build 2 small focused projects
Examples:
- Task Management API
- CRUD tasks, user accounts.
- JWT auth.
- Pagination and filtering.
- Basic tests.
- Local Docker setup.
- Authentication and User Service
- Registration, login, password reset flow.
- Email verification with a background worker.
- Security best practices.
Each project gets a clean README and consistent structure.
Step 3: Build 1 flagship project
For example, an e-commerce backend:
- Products, categories, inventory.
- Shopping cart and orders.
- Payments integration in sandbox mode.
- Admin endpoints.
- Background jobs (emails, reports).
- Caching for some views.
- Docker and minimal CI.
- Optional: deployed demo.
Step 4: Polish presentation
- Improve README files, add diagrams.
- Clean up Git history and branches.
- Pin repositories on GitHub.
- Create a small portfolio page linking everything.
Step 5: Keep improving
- Add tests and metrics where missing.
- Improve performance for one feature and document it.
- Try new tools, for example Redis, Celery, or message queues, in small side projects.
Summary
A strong backend portfolio:
- Focuses on a few well executed projects, not many unfinished ones.
- Demonstrates real backend skills: APIs, databases, auth, security, testing, deployment.
- Is easy to explore, with clean code, clear structure, and good documentation.
- Shows your ability to ship and maintain working systems.
- Evolves over time to reflect your current capabilities.
If you follow the action plan in this chapter, by the time you finish this course you will not only understand backend development, you will also have a concrete portfolio that proves it.
Views: 8
KAHIBARO