Shipping side projects before they ship you
My graveyard of unfinished side projects taught me more than any of the finished ones. Here is the system that finally broke the cycle.
Scope until it hurts
The version in your head has auth, teams, billing, and a mobile app. The version that ships has one feature and a login-free demo mode. Write down the one sentence the project must prove, then delete everything that doesn't serve it.
Deploy on day one
Before writing any real feature, set up the pipeline:
# .gitlab-ci.yml
pages:
image: node:20-alpine
script:
- npm install
- npm run build
pages:
publish: dist
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
A project that is live, even as a blank page, has momentum. A project that "will be deployed later" is already dead; it just doesn't know it yet.
Boring tech wins
Side projects die from novelty budget overdraft. Spend your novelty on one thing: the new framework, or the new domain, or the new design style. Everything else should be tools you can use half-asleep.
Done is a feature
The last 10% (favicon, meta tags, a real README) takes one evening and doubles how finished the project feels. Schedule that evening. It is the cheapest polish you will ever buy.