Pick Hosting for a Side Project Without Overpaying

pick-hosting-for-a-side-project-without-overpaying

Pick Hosting for a Side Project Without Overpaying. A Build Next Stack field guide for learners shipping small projects.

Hosting tiers mapped to project stage

Stage 0 — local only: zero cost, zero uptime promises. Good until someone besides you needs to click it.

Stage 1 — static hosting: HTML/JS/CSS or generated site on Netlify, Cloudflare Pages, GitHub Pages. Pennies to free tier; custom domain ~$10–15/year. No server state.

Stage 2 — managed app platform: Render, Fly.io, Railway run your Node/Python/Ruby container or buildpack. $0–7/month starter tiers; sleep on idle common on free plans.

Stage 3 — VPS: DigitalOcean, Hetzner, Linode VM you SSH into. $4–6/month buys control and chores—patching, systemd, nginx. Stage 4 — managed Kubernetes is not a side-project default.

Pay for the stage you are in, not stage four because you might go viral.

Stage transitions should be triggered by incidents: cold starts caused demo failure, SQLite wiped on deploy, static site cannot handle authenticated uploads. Write the incident next to the stage number in README—future you trusts evidence.

Static, VPS, and PaaS — cost and ops tradeoffs

Static: cheapest, global CDN, deploy on git push. Cannot run long-lived server logic without adding functions (small extra cost/complexity).

PaaS: git push deploy, logs UI, env var secrets. Price climbs with always-on instances and background workers. Read egress and build minute limits.

VPS: flat monthly, predictable at low traffic, but your time is the hidden bill—SSL renewals, firewall rules, database backups on same VM.

Solo learners optimizing money should default static → PaaS free/low tier → VPS only when PaaS limits bite repeatedly.

Time-box VPS curiosity: if you have not needed SSH in thirty days on PaaS, VPS homework is a hobby separate from your product. VPS shines when you need custom cron, odd binaries, or learning sysadmin on purpose—not when PaaS deploy failed once.

Anti-pattern: paying for scale you will never hit

Provisioning a $40/month database for a project with zero users is common regret. Another: multi-region load balancers for a read-heavy blog. Fear of downtime on hobbies with no SLA promises burns budget.

Also watch free tier traps: card on file, autoscale to paid tier, bandwidth overage on media-heavy experiments. Set billing alerts at $5 and $20.

Reserved instances and annual plans reward stable production apps, not experiments that might pivot next month. Monthly billing preserves optionality for side projects.

Worked example: deploy path for a small API

App: JSON API + SQLite file, single user admin. Month 1: PaaS free tier, one web service, disk ephemeral—SQLite resets on deploy (acceptable for experiments). Month 2: attach managed disk or switch to hosted Postgres free tier when data must survive deploys.

Deploy steps: connect repo, set PORT env, health check route /health, enable auto deploy on main branch. Total setup under two hours if Dockerfile or buildpack docs followed once.

Custom domain optional until sharing widely—default subdomain is fine for friend testing.

Document deploy in DEPLOY.md: repo link, env vars list, health URL, rollback step (redeploy previous git tag). One hour writing DEPLOY.md saves five hours when you return after a vacation.

Failure modes: surprise bills and locked configs

Sleepy free dynos: first request after idle takes 30+ seconds—friends think app is broken. Fix: $5 always-on or explain cold starts in README.

Log retention costs: verbose debug in production fills paid log quotas. Fix: structured logs at info level default.

Vendor nginx quirks: trailing slash redirects breaking OAuth callbacks. Fix: read one host-specific deploy guide fully.

SSH key only on one laptop: lockout when laptop dies. Fix: backup key stored offline, or use PaaS git deploy without SSH.

Ephemeral disk surprises: uploaded files vanish on restart. Fix: object storage for uploads or managed disk addon—note in DEPLOY.md before users attach files.

Monthly cost snapshot — three real side-project shapes

Static portfolio + form function: $0–12/year domain, hosting free tier, function invocations within free cap—total often under a coffee monthly averaged annually.

Always-on small API on PaaS: $5–7/month single instance, $0–15 managed database free/low tier, domain annualized—typically $8–15/month combined if you avoid background workers.

VPS everything-on-one-box: $5–6 VM plus your time for patches; no per-request billing surprises; database on same disk risks data loss if you snapshot rarely.

Compare monthly cost to hours you earn elsewhere—if optimizing hosting saves $8 but costs six hours, ship features instead until bill exceeds $20.

Hosting checklist under twenty dollars

  1. Does static hosting cover 80% of routes? If yes, stop there.
  2. If not, can one PaaS service run app + cron in free/low tier?
  3. Is database managed with a free cap and backup toggle?
  4. Are billing alerts configured on the cloud account?
  5. Can you redeploy from scratch in under an hour using documented steps?

Under $20/month is achievable for most solo CRUD side projects if you avoid always-on GPU, multi-AZ databases, and egress-heavy media.

Review hosting bill same day each month; circle line items you cannot explain in one sentence. Unexplained line items are where side projects leak money quietly.

Keep a screenshot of first successful deploy settings—env vars redacted—in DEPLOY.md. Host UIs change; your notes prevent panic when recreating services.

Free tiers that sleep are acceptable for private experiments; pay for always-on when you demo to strangers who will not refresh twice. The upgrade is a product decision, not a hosting brag.

Treat domain renewal as part of hosting budget—forgetting annual domain charges surprises side projects every year that thought they were completely free.

Buy uptime you need, not uptime you imagine

Deploy stage 1 or 2 this weekend, set a calendar reminder to review cost and cold-start pain in 30 days, and upgrade one tier only when a logged issue repeats.

Hosting bill horror story or clever cheap setup? [email protected] — we anonymize when sharing patterns.

Include your stage number and monthly total when you write—real numbers help other solo builders calibrate faster than abstract advice.