Quick answer
Give each backend project its own page with a plain-English summary, your contribution, an annotated architecture diagram, sample requests and responses, documentation, GitHub links and an honest outcome. Offer a sandbox or recorded walkthrough only when you can maintain it safely. This follows the case-study approach recommended by backend portfolio guides: show the problem, decisions and evidence—not just a technology list. [2]
1. Choose projects that support the work you want
Start with two or three projects aligned with your target role, rather than documenting every repository. The API project guide recommends a small, role-relevant selection and treating documentation as part of the deliverable. [8]
- Backend applications: foreground API contracts, data modelling, failure handling and deployment decisions.
- Full-stack applications: show the interface briefly, then identify the backend work you personally owned.
- Freelance enquiries: explain the workflow solved, integration boundaries, handover documentation and maintenance scope.
Have only learning projects? Develop an expense tracker, URL shortener or reservation API beyond its tutorial version. These are among roadmap.sh’s suggested backend projects. Document a meaningful constraint and your solution, rather than implying commercial usage. [5]
For applications in India, state your city, remote or relocation preferences, and notice period if relevant. For freelance work, add IST availability and a contact route. Keep project ownership and outcomes consistent across your portfolio, resume and GitHub.
2. Copy this backend project-page template
Replace every bracketed field. Put the summary and strongest evidence first; leave implementation detail further down.
[Project name]: [problem solved]
Summary: [Who needs this system, what it does, and why it matters—in two sentences.]
Context and status: [Personal, open-source or authorised client work.] [Prototype, sandbox, maintained deployment or archived.]
My contribution: [What I designed, implemented and tested.] [Team contributions and exclusions.]
Constraints: [Data sensitivity, integration requirements, hosting limits or consistency needs.]
Architecture: [Annotated request-flow diagram, database relationships and trust boundaries.]
Decisions: [Chosen approach, alternative considered, reason and downside.]
Try it: [Safe demo or walkthrough.] [Sample request, success response and failure response.]
Evidence: [Repository, relevant tests, API specification, decision record and reproducible benchmark.]
Outcome and limitations: [Verified result.] [What remains untested or incomplete.]
Next step: [Contact me about relevant work / view another project.]
This structure expands the architecture, schema, monitoring, tradeoff and evidence sections recommended in Fueler’s backend portfolio guide. [3]
3. Complete before-and-after example
The following project is fictional. It illustrates portfolio copy and an API contract, not a real client engagement, running service or measured benchmark. Adapt it only to match work you have actually completed.
Before: a technology list without evidence
Order API
Node.js, Express, PostgreSQL. CRUD endpoints for products and orders. GitHub link.
This gives the reader no problem, ownership boundary, design reasoning or way to inspect behaviour.
After: a recruiter-friendly project page
Stock-reservation API for a fictional Indian stationery shop
Problem: Model online stock reservations so that retrying an order request does not create another order. Keep unavailable stock and invalid requests distinguishable.
Scope and ownership: Solo backend prototype covering API design, schema and reservation logic. No real customer records, payment collection or production traffic. The sample contract uses INR as its currency field without connecting to a payment provider.
Stack: Node.js and Express for the API; PostgreSQL for orders, inventory and request-key records.
Diagram 1: annotated request flow
[Demo caller] → [Sandbox gateway] → [Order service] → [Database transaction] → [API response]
| Component | What its annotation should explain |
|---|---|
| Demo caller | Sends synthetic items and a request key; never uses a customer account. |
| Sandbox gateway | Checks the demo session and request limits before forwarding traffic. |
| Order service | Validates input and checks whether the same request key was already used. |
| Database transaction | Groups stock reservation, order creation and request-key recording into the intended write boundary. |
| API response | Returns an order identifier or a documented error; hides internal exception details. |
Diagram note: This is a logical flow, not a claim that each box is a separate deployed service. The public boundary ends at the gateway; the database is not a public demo endpoint.
Diagram 2: annotated data relationships
[Order] 1 → many [Order items] many → 1 [Product]
[Demo session + request key] → [Request record] → [Order]
- Order items: connect each order to its requested products and quantities.
- Request record: associates a session-scoped key and payload fingerprint with the resulting order.
- Integrity rules to implement: reject non-positive quantities, prevent negative stock and reject key reuse with a different payload.
Decision and tradeoff: Keep reservation writes in one database transaction rather than introduce a queue. This keeps the prototype’s consistency boundary explicit; asynchronous fulfilment is outside its scope. Record the alternative and its implications in a short architecture decision record.
Outcome: A prototype with an explicit API contract and failure model—not evidence of production scale. Publish test results and benchmarks only after running them.
Evidence links: Repository, OpenAPI specification and tests. These are placeholder links: replace them before publishing.
4. Show API behaviour without exposing production
Continue the example with a copyable request. The hostname and token below are placeholders, and the responses describe expected behaviour—not output captured from a live deployment.
Create a reservation:
curl -X POST 'https://demo.example.com/v1/orders' -H 'Authorization: Bearer DEMO_TOKEN' -H 'Content-Type: application/json' -H 'Idempotency-Key: demo-order-001' -d '{"items":[{"sku":"DEMO-NOTEBOOK","quantity":1}],"currency":"INR"}'
Expected success: HTTP 201
{"id":"ord_demo_001","status":"reserved","currency":"INR","items":[{"sku":"DEMO-NOTEBOOK","quantity":1}]}
Expected unavailable-stock response: HTTP 409
{"error":{"code":"OUT_OF_STOCK","message":"Requested quantity is unavailable."}}
Replay check: Repeat the same request with the same key. For this design, expect the existing order identifier and no additional stock reduction. Link to the test that verifies this; do not merely describe it.
Publish an OpenAPI specification or sanitised Postman collection beside the examples. Both are recognised backend portfolio artifacts. [7]
Choose a demo you can safely maintain
- Static examples: provide request/response pairs and a walkthrough; label simulated output clearly.
- Read-only sandbox: expose seeded records without arbitrary writes.
- Interactive sandbox: isolate demo sessions, restrict permissions, cap requests and resource usage, and reset synthetic data.
Disable real emails, SMS, payments and unrestricted outbound callbacks. Remove production servers from interactive documentation. State the reset policy and any cold-start delay, and keep static examples available when the sandbox is offline.
5. Present performance evidence honestly
Do not turn a local experiment into a scalability claim. Separate production observations, controlled benchmarks and untested design intentions. For the fictional project, the honest evidence table is:
| Evidence | Current status | What to publish |
|---|---|---|
| Latency | Not measured | p50, p95 and p99 for a named endpoint and workload |
| Throughput and errors | Not measured | Completed requests per second, failure rate and timeout count |
| Reservation correctness | Not verified | Concurrent-request and duplicate-request test output |
When measurements exist, include the code commit, runtime, CPU/RAM, database version, dataset size, concurrency, duration, warm-up, cache state and load-generator location. Document whether the database and generator shared a machine.
For a before-and-after claim, keep the workload and environment comparable, describe the change, repeat the test and report variation. Publish the benchmark script and sanitised raw output—not just a cropped chart. If you change hardware or datasets, disclose that alongside the result.
Without measurements, discuss the decision and its limits. Write added an index; performance impact not yet benchmarked rather than dramatically improved performance.
6. Protect credentials, client data and ownership
Treat publication as a separate release with its own review. A private repository, an NDA or client ownership may limit what you can share; obtain permission before reusing material.
- Secrets: exclude environment files, private keys, database URLs and privileged tokens. Provide an example configuration containing placeholders only.
- History: inspect commits, branches, issues, logs and screenshots. Rotate exposed credentials before cleaning up the publication.
- Personal data: use synthetic records. Remove customer names, phone numbers, addresses, Aadhaar/PAN details and transaction identifiers from every artifact.
- Infrastructure: redraw diagrams with generic service labels. Remove private hostnames, account identifiers and internal access paths.
- Demo access: issue restricted sandbox credentials; never embed production credentials in browser code or downloadable collections.
- Client work: describe only approved scope, decisions and outcomes. Do not publish a sanitised fork unless you have permission to share the underlying code.
If permission is unavailable, create an independent project demonstrating the same general engineering skill. Label it as a recreation, not the client’s delivered system. Anonymised summaries and write-ups are alternatives to public production details. [2]
7. DIY implementation or a custom-built portfolio?
Choose based on your presentation needs and available time—not the assumption that backend work requires a complex website.
| Decision | DIY or template | Custom-built portfolio |
|---|---|---|
| Best fit | You can adapt a layout and maintain project content. | You want help organising case studies and building a tailored presentation. |
| Implementation work | You handle navigation, mobile layout, accessibility and deployment. | Agree these deliverables explicitly with the builder. |
| Evidence ownership | You supply and verify every claim. | You still supply and verify every claim. |
| Ongoing maintenance | You manage updates and broken links. | Clarify editing access, handover and support responsibilities. |
| Cost planning | List domain, hosting and demo-service expenses separately. | Request an itemised quote separating website work from API hosting. |
For DIY, start with a homepage, reusable project-page layout, resume and contact page. Keep the portfolio itself simple; host an interactive API separately if needed. Avoid rebuilding your backend merely to fit a decorative theme.
For a commissioned site, request editable content, readable diagrams, copyable examples, clear repository buttons and an offline-demo fallback. Confirm domain ownership, source-code handover, recurring charges and whether the quote includes GST where applicable.
PaidPortfolio builds portfolio websites for Indian professionals; explore a custom portfolio or its templates if you want help with presentation. Keep technical evidence and credential handling under your control.
Final publishing checklist
- Can someone understand the problem and your contribution before opening GitHub?
- Do diagrams explain responsibilities and boundaries?
- Are requests copyable, links working and demo limitations visible?
- Can another developer reproduce the setup and verify important claims?
- Have you reviewed every public artifact for secrets and client data?
- Does the page work on mobile without login or a running API?
For further inspiration, browse the developer portfolio directory [4] and the backend portfolio demo API [11]. Borrow presentation ideas, not someone else’s engineering claims.