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:

  1. Sign up and log in (auth)
  2. Create, read, update and delete data (CRUD) in a database
  3. A REST API with validation and proper status codes
  4. A responsive front end (React or plain JS)
  5. Deployed at a public URL with HTTPS
  6. A README: what it does, a screenshot, how to run it, and what you learned
  7. 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.PORT as a number, default 3000
  • databaseUrl: env.DATABASE_URL, throw an Error if missing
  • isProduction: true only when env.NODE_ENV === "production"
JavaScript
function loadConfig(env) {
  return {};
}

Output appears here. Press Run or Ctrl/⌘ + Enter.

✅ Check your understanding

  1. Where should an API key for a payment provider live?

Create a free account to track your progress.