Seven small habits that made my side projects actually finish
Like most people who build things, I have abandoned projects. These are habits that help me finish. They're my experience, not a universal law, but each one has a concrete reason behind it. Let's go through all seven, w
Like most people who build things, I have abandoned projects. These are habits that help me finish. They're my experience, not a universal law, but each one has a concrete reason behind it.
Let's go through all seven, with something you can try this week for each.
1. Write a one-line goal
If I can't say what the project does in one sentence, I'm not ready to code it.
A good one-liner names who it's for and what changes for them. For example, a goal for CardBridge could read: "Let someone buy a discounted item using a card they don't own, without either party having to trust the other with money." One sentence, a real problem, a clear promise.
Try it: Write your goal on a sticky note and stick it where you code.
2. Ship an ugly version first
Polish later, if ever. An ugly working version teaches you more than a beautiful half-working one, because it shows you the real problems earlier.
I try to get a project end to end, with the most basic UI, before touching spacing, animations or colours.
Try it: Set a rule that you can't style anything until the main flow works.
3. Keep a "not now" list
Great ideas will arrive halfway through. If each one goes straight into the code, the project never finishes. A "not now" list lets you honour the idea without acting on it.
That's how scope stays under control: the idea is kept, just not acted on yet.
Try it: Create a file called NOT_NOW.md at the start of every project.
4. Deploy early
A live URL changes how seriously I take a project. A project on localhost is easy to abandon; a project someone can click is not.
Deploying early also surfaces problems you can't see locally. (See Day 3: my deploy broke for two weeks because of a difference between my laptop and the host. Finding that on day one would have been far cheaper.)
Try it: Deploy the skeleton on day one, before it does anything useful.
5. Write the README as I go
Future me forgets everything. The reasoning behind a decision is the first thing to evaporate.
For my projects, the habit became writing case studies with a fixed structure: the problem, the approach, key decisions, what broke and how I fixed it, and limits. Writing "limits" is the part that keeps me honest.
Try it: After each work session, add three lines: what I did, what's next, what's stuck.
6. Stop at a natural pause
Quit mid-function and leave a TODO comment, so tomorrow starts easy.
Starting is the hardest part of any session. If you stop at a clean finish, tomorrow begins with a blank page. If you stop mid-thought with a note, tomorrow begins with momentum.
// TODO: next, handle the case where the dispute window has already closed.
// Test idea: transition DISPUTED -> RELEASED must fail for a non-admin.
Try it: End your session by writing the first line of tomorrow's work.
7. Make it for someone
Even one real user beats a hypothetical thousand. A real person gives you real questions. A hypothetical crowd gives you endless imaginary requirements.
This is also a defence against over-engineering: when you know the one person who'll use it, you know which features don't matter.
Try it: Name a specific person who'd use your project and show them the ugly version.
The one I'd start with
If you could only adopt one: number 4. Seeing a project online, even rough, raises the stakes. A localhost project is easy to abandon.
A quick self-audit
Rate yourself honestly, 0 to 2, on each habit:
| Habit | Score |
|---|---|
| One-line goal | |
| Ugly first | |
| "Not now" list | |
| Deploy early | |
| README as I go | |
| Natural pause | |
| Made for someone |
Anything scored 0 is your next experiment. Don't try to fix all seven at once. One habit, two weeks, then add another.
What these don't fix
Habits won't rescue a project nobody needs, and they won't replace skill. They only reduce the chance that a good idea dies from friction. Your mileage will vary, and some of these may not suit how you work.
A project kickoff template
Copy this into a PROJECT.md at the start of any project. It bakes in several of the habits above.
# Project name
## One-line goal
(Who is it for, and what changes for them?)
## Smallest useful version
(What can I ship in a weekend?)
## Not now
- idea 1
- idea 2
## Deploy plan
(Where will the skeleton live on day one?)
## Done means
- [ ] live URL
- [ ] README with setup steps
- [ ] one real person has tried it
## Log
- YYYY-MM-DD: what I did / what's next / what's stuck
Common failure patterns and fixes
| Pattern | What it looks like | Fix |
|---|---|---|
| Perfect-start syndrome | Spending days on the logo and folder structure | Timebox setup to 2 hours |
| Scope creep | The feature list doubles every week | The "not now" list |
| The 90% trap | Everything works except the last annoying part | Define "done" up front, then finish the boring part first |
| Tool hopping | Switching frameworks mid-project | Decide the stack before starting; change only for a clear blocker |
| Silent abandonment | You just stop opening it | Stop at a natural pause with a note about what's next |
| Private perfection | Never showing anyone | Show the ugly version to one person this week |
How to restart a project you abandoned
- Read your last log entry. If there isn't one, write down what you remember.
- Run it. Often the first obstacle is that it no longer builds. Fix that first.
- Shrink the goal to something finishable in two sessions.
- Schedule the sessions. Put them on the calendar.
- Decide what "done" means, then do only that.
A note on finishing versus shipping
Shipping means it's available to someone. Finishing means you're happy with it. The two are different and easy to confuse. My template is an example: built and verified, but not yet shipped, because a last step is outstanding. I'd rather ship something imperfect than finish something nobody sees.
Measuring progress without fooling yourself
Instead of "hours worked", track things that exist: a deployed URL, a passing test, a written paragraph, a merged branch. They're harder to fake and make a better record over time.
Which of these do you already do? What would you add as number eight?
Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.