Lesson 7 of 7 · 15 min · 1 hands-on step
Deploying & Your Capstone Project
Ship a real app to the internet, and plan the portfolio project that gets you hired.
From your laptop to the internet
Deploying means putting your app on a computer that's always online. Today that's easy and often free:
| You're shipping | Good options |
|---|---|
| Static sites (HTML/CSS/JS) | GitHub Pages, Cloudflare Pages, Netlify |
| Full-stack apps | Cloudflare Workers, Vercel, Render, Railway, Fly.io |
| Databases | Managed Postgres (Neon, Supabase), Cloudflare D1 |
The typical flow: push to GitHub → the platform builds and deploys automatically → you get a URL. Add a custom domain and HTTPS comes free.
Environment variables
Code is public (or will be). Secrets are not. Database URLs, API keys and passwords go in environment variables set on the hosting platform:
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY);
Check them at startup and fail loudly if one is missing. That's what the practice exercise builds.
Your capstone: a full-stack app employers can use
Build one project that shows everything from this roadmap. Pick something real, ideally for a real person:
- A booking or waitlist app for a local business
- A habit or workout tracker with accounts
- A study-group finder for your school or community
Must-haves:
- Sign up and log in (auth)
- Create, read, update and delete data (CRUD) in a database
- A REST API with validation and proper status codes
- A responsive front end (React or plain JS)
- Deployed at a public URL with HTTPS
- A README: what it does, a screenshot, how to run it, and what you learned
- Tests for the important logic
Stand-out extras: accessibility, loading/error states, a small admin view, or a feature a real user asked for.
Use AI assistants while you build, like professionals do, but be ready to explain every file in an interview. "Walk me through how login works in your app" is a very common question.
🧪 Practice
Apps read settings from environment variables so secrets never live in code. Write loadConfig(env) that returns:
port:env.PORTas a number, default3000databaseUrl:env.DATABASE_URL, throw an Error if missingisProduction:trueonly whenenv.NODE_ENV === "production"
function loadConfig(env) {
return {};
}
Output appears here. Press Run or Ctrl/⌘ + Enter.
✅ Check your understanding
Where should an API key for a payment provider live?
Create a free account to track your progress.