Finish something real.

Most side projects die at 60% — not from a technical wall, but from scope, setup, or never shipping. This path is the process: choose something worth building, cut it until it fits, ship it live, document it, and be able to talk about it without saying "I used React and Node."

Duration
6 weeks
Format
Your own idea
Prerequisite
Any one build track
You'll build
A shipped, documented project

Each stage is where projects usually die

Each stage targets one specific reason side projects fail — wrong idea, too much scope, bad setup, designing too early, ignoring edge cases, never deploying, no README, can't explain it.

A live playground, right here

No setup, no account. This is Stage 1's scope-cutting exercise as code — move features between the lists and see what actually ships in three weeks.

playground.js
Console
Run the code to see output here.

This is what's waiting at the end

Certificate of Completion
Your Name
has completed Finish Something Real — 9 stages, 9 passed quizzes
9 / 9 stagesShipped projectVerified ID
🔒

Complete all 9 stages and their quizzes to unlock this.

Nine stages, in this order

Each stage leans on the one before it — you can't scope an idea you haven't chosen, and you can't document a project you never shipped.

STAGE 00

Choosing something worth building

Week 1

The single biggest reason portfolio projects fail isn't technical — it's picking a project you don't care about, or one that's been built ten thousand times identically.

What you'll learn
  • Why clones make weak portfolio pieces (and the narrow case where they don't)
  • Finding problems from your own life — the ones you can evaluate honestly
  • Judging an idea by whether it's demonstrable, not by whether it's impressive
Code
// Weak: no decisions of yours are visible in this
"A Netflix clone"

// Stronger: a real problem, a scope you can finish, decisions you must make
"A tool that tracks which of my college assignments are due,
 pulls deadlines from a shared class calendar, and nags me
 at a time I actually choose."

// The test: can you explain, in one sentence, who it's for
// and what specifically it makes easier?
BuildWrite down 5 problems you personally have. For each, one sentence on who else has it and what the smallest useful version looks like.
Self-checkWhy does “build a clone of a popular app” usually make a weaker portfolio piece than a smaller original idea?
STAGE 01

Scoping — cutting to something you'll actually finish

Week 1

Ambition is why most side projects die at 60%. A finished modest project beats an abandoned ambitious one every single time, in a portfolio and in your own confidence.

What you'll learn
  • Defining the smallest version that's genuinely useful to one person
  • Ruthless feature triage: must-have vs. nice-to-have vs. never
  • Time-boxing, and planning for the fact that everything takes longer
Code
// Everything you thought of
[auth, reminders, calendar sync, mobile app, sharing,
 dark mode, notifications, analytics, export, teams]

// The version that ships in 3 weeks
[auth, reminders, calendar sync]

// Everything else goes in a "later" list — visible, but not blocking.
// Cutting scope is a skill, not an admission of defeat.
BuildTake your chosen idea and write the must-have list. If it's more than 3–4 items, cut again until it isn't.
Self-checkWhat actually makes a scope “too big” for a portfolio project?
STAGE 02

Setting up like it matters

Week 1–2

Ten minutes of setup on day one prevents the specific disasters — committed secrets, unreproducible environments, a broken deploy discovered too late — that kill projects in week three.

What you'll learn
  • Git from commit one: .gitignore, meaningful commit messages
  • Environment variables and .env.example from the start
  • A README written before the code, not after
Code
// .gitignore — before your first commit, not after the leak
node_modules/
.env
.DS_Store
dist/

// .env.example — committed, documents what's needed without leaking it
DATABASE_URL=
JWT_SECRET=

// A secret that reaches git history isn't fixed by deleting the file —
// it's in the history. You have to rotate the key.
BuildInitialize the repo properly, push a working “hello world” to production on day one, and confirm the deploy pipeline runs.
Self-checkWhy commit and push on day one, before the project does anything useful?
STAGE 03

Building the ugly version first

Week 2–3

Designing before the core flow works means designing for a product you don't understand yet. Make it work, then make it good — in that order, always.

What you'll learn
  • Vertical slices — one complete flow beats five half-finished features
  • Deliberately deferring styling until the flow is proven
  • Committing at every working state so you can always retreat to one
Code
// Vertical slice: one flow, working end to end, ugly but real
User submits form → API saves to DB → list shows it back

// NOT: build all the UI, then all the API, then hope they connect

// Once one slice works, the next is far easier —
// the hard integration questions are already answered.
BuildBuild one complete vertical slice of your app — unstyled, but genuinely working end to end.
Self-checkWhy build the ugliest working version first instead of designing the UI upfront?
STAGE 04

Making it real — edge cases and honest states

Week 3–4

The difference between a demo and a product is entirely in what happens when things go wrong — and things go wrong constantly for real users on real networks.

What you'll learn
  • Loading, empty, and error states as required work, not polish
  • Input validation on both sides, and what each side is actually for
  • Testing on a slow connection and a real phone, not just your laptop
Code
// The four states every data-driven view actually has
if (loading) return <Spinner />;
if (error)   return <ErrorMessage retry={refetch} />;
if (!items.length) return <EmptyState hint="Add your first task" />;
return <List items={items} />;

// Skipping the middle two is why demos break in front of people.
BuildGo through every screen and handle all four states properly. Then throttle your network to 3G in devtools and use the app.
Self-checkYour app works perfectly for you but breaks for the first real user. What's the most likely category of cause?
STAGE 05

Shipping it live

Week 4

A project only on localhost effectively doesn't exist — nobody will clone your repo to try it. The live URL is what makes it real to anyone else.

What you'll learn
  • Deploying frontend and backend, and wiring production config
  • Production environment variables and secrets handling
  • Custom domains, and why a real URL changes how the project is perceived
Code
// Fail loudly at startup if config is missing —
// far better than a mysterious 500 an hour into debugging
const required = ["DATABASE_URL", "JWT_SECRET"];
for (const key of required) {
  if (!process.env[key]) throw new Error(`Missing env var: ${key}`);
}

// Deploy early and often. The first deploy always surprises you;
// better it surprises you in week 2 than the night before a demo.
BuildDeploy the app to a real URL. Send it to one friend on their phone and watch them use it without helping.
Self-checkWhy deploy before the project feels finished?
STAGE 06

Documenting it so people care

Week 5

A reviewer gives your project about 30 seconds before deciding whether to look closer. A bad README wastes work you already did.

What you'll learn
  • A README that leads with what it does and why it exists
  • Screenshots and a live link above the fold
  • Documenting the interesting decision, not every function
Code
# TaskNudge

Tracks college assignment deadlines from a shared class calendar
and reminds you at a time you actually choose.

**[Live demo](https://tasknudge.example.com)** · [Screenshot below]

## Why I built it
I kept missing deadlines that were technically "on the calendar."

## Interesting bit
Reminder scheduling runs in a queue worker so a failed
notification retries without blocking anything else.

// Lead with what and why. Setup instructions go further down.
BuildWrite the README: one-line description, live link, screenshot, why you built it, and one genuinely interesting technical decision.
Self-checkWhat does a good README do that a reviewer actually cares about?
STAGE 07

Talking about your work

Week 5–6

In an interview, your project is only as good as your ability to explain the decisions inside it. “I used React and Node” tells them nothing that distinguishes you.

What you'll learn
  • Framing: problem → your approach → tradeoffs → what you'd change
  • Discussing what you'd do differently without undermining yourself
  • Turning a bug you fixed into evidence of how you debug
Code
// Weak — describes tools, identical to every other candidate
"I built a full-stack app with React and Node."

// Strong — problem, decision, tradeoff, reflection
"I kept missing assignment deadlines, so I built something that
 pulls them from our class calendar and nags me on my schedule.
 The interesting part was reminders — I moved them to a queue
 worker so a failed send retries without blocking signup.
 If I rebuilt it, I'd add proper timezone handling from the start;
 I hardcoded IST and that bit me the moment a friend traveled."
BuildWrite and rehearse a 2-minute spoken walkthrough of your project using that structure. Record it and listen back.
Self-checkWhy is “I built a full-stack app with React and Node” a weak way to describe your project?
STAGE 08

Keeping it alive

Week 6

A project with real users — even one — generates real feedback and real problems, and that's where genuinely interesting engineering starts. It also proves you finish things.

What you'll learn
  • Getting the first real user and gathering honest feedback
  • Deciding what to fix versus what to ignore
  • Knowing when a project is genuinely done versus abandoned
Code
// The most valuable feedback loop there is:
1. Watch someone use it without helping them
2. Write down every moment they hesitate
3. Fix the top hesitation
4. Repeat

// You will learn more from one confused real user
// than from a week of adding features nobody asked for.
BuildGet 3 people to use your project. Sit with them silently, write down every point of confusion, then fix the most common one.
Self-checkWhat makes a project genuinely worth continuing after it's “done”?

The capstone: your project, actually shipped

The project you carried through all 9 stages IS the deliverable — your own idea, scoped down, built ugly first, hardened, deployed to a real URL, documented, and used by at least three real people whose confusion you watched and fixed.

Live URL — anyone can try it without cloning
Your own idea, not a tutorial clone
All four states handled on every screen
README with live link, screenshot, and the why
3 real people have used it
A rehearsed 2-minute walkthrough you can give cold

Common pitfalls

  • Restarting instead of finishing. The third abandoned repo teaches less than one finished small thing.
  • Polishing before it works. Perfecting a login screen for an app with no core flow is procrastination wearing a productive hat.
  • Deploying last. Production bugs are their own category. Find them in week two, not the night before a demo.
  • Never showing anyone. One confused real user teaches more than a week of features nobody asked for.

Resources worth your time

  • Vercel / Netlify docsdeploy
  • Render / Railway docsdeploy
  • Makeareadme.comREADME
  • Shape Up (Basecamp)scoping
  • Conventional Commitsgit hygiene