17: Putting It All Together ship it

You can stop following tutorials now. Combine everything into one page you can send to someone.

What you are building

One page. Pick one:

Must use: semantic HTML (03), flex or grid (09 or 10), responsive layout (12), typography (13), color and variables (14), form pseudo-classes (15), and one transform or transition (16). Check the checklist below.


File organization

my-site/
  index.html
  shared.css        # or style.css: variables, layout, components
  images/
    me.jpg
  README.md         # optional: what you built + link

Naming with BEM-lite

<!-- block__element--modifier, just enough structure -->
<section class="card card--featured">
  <h2 class="card__title">Hello</h2>
  <p class="card__body">...</p>
</section>
/* shared.css. organize top to bottom */
:root { --bg:#fff; --fg:#111; --accent:#0b57d0; --radius:12px; } /* 1. vars */
* { box-sizing: border-box; }                                      /* 2. reset */
body { max-width: 720px; margin: 0 auto; }                        /* 3. base */
.card { border: 1px solid #ddd; border-radius: var(--radius); }  /* 4. components */
@media (max-width: 600px) { ... }                                 /* 5. responsive */

Starter template to clone

Mira

Portfolio · 2026

Design & code that ships

I build small, fast sites, no frameworks, just HTML/CSS. Here's what I made recently.

Project A
Landing page with flex and grid
Project B
Form with validation
Project C
Responsive article

Get in touch

© 2026 Mira. Built with HTML and CSS only
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Mira's Portfolio</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
  <header>... nav ...</header>
  <main>
    <section>... hero ...</section>
    <section>... work grid ...</section>
    <section>... contact form ...</section>
  </main>
  <footer>...</footer>
</body>
</html>

Checklist before ship

CheckHowPass?
Valid HTMLPaste into validator.w3.org0 errors
ResponsiveDevTools device toolbar (320px, 768px, 1024px)No horizontal scroll
LighthouseDevTools Lighthouse panel: Generate report90+ on Performance and A11y
Keyboard a11yTab through. All interactive elements reachable, focus visibleYes
ContrastDevTools color picker shows contrast ratio4.5:1 min
Links/imagesAll href/src relative, alt presentYes
ShareableOpen in private window does it still work?Yes

Deploy: drag, drop, done

HostHowURL
GitHub PagesRepo: Settings, Pages, Deploy from mainyou.github.io/my-site
NetlifyDrag folder to app.netlify.com/droprandom-name.netlify.app
Cloudflare PagesDrag folder*.pages.dev

No build step. Just HTML and CSS files. Any static host works.

# quick local test before deploy
python -m http.server 8000
# then open http://localhost:8000

What comes next: JS teaser

You have hit the ceiling of what HTML and CSS can do. Next:

For now, try :has() and :checked with label to fake toggles without JS. Then you will want JS.

Exercise: Ship one page (30 to 60 min)
  1. Build the portfolio, blog, or landing. Use every phase at least once.
  2. Run the checklist above and fix what fails.
  3. Deploy to GitHub Pages or Netlify drag and drop.
  4. Send the link to someone. Ask: "What confused you?" Fix that and ship again.

Done? You can build a real webpage without crying. Everything after this is iteration.

Prev16: Transitions & Animations HomeCourse map