100% Free — All 7 Days

Build your first
website in 7 days.

Learn HTML & CSS from zero. No experience needed. By the end, you'll have a real, live website — deployed and yours forever.

7
Days to a live website
0
Experience needed
EN
English lessons
Hosted on GitHub Pages

Free forever. Your domain. Real on the internet.

Seven days,
one real project.

Every day you learn one concept and immediately build something with it. No fluff. No theory overload. Just code you can see.

Day 01
Your First HTML Page
Tags, structure, and your first words on a screen.
Free
Day 02
Text & Links
Headings, paragraphs, and connecting pages together.
Day 03
Styling with CSS
Colors, fonts, and making things look the way you want.
Day 04
Layout & Boxes
The box model, Flexbox, and controlling your layout.
Day 05
Images & Media
Adding images, video embeds, and responsive visuals.
Day 06
Full Page Build
Put it all together — build a real, complete page.
Day 07
Go Live
Deploy to GitHub Pages. Your site is on the internet.

A real website.
Not a tutorial project.

  • A personal portfolio page with your name, bio, and links
  • Responsive design that works on phones and computers
  • Deployed live on GitHub Pages with a real URL
  • Clean, readable code you fully understand and own
  • Skills to keep building — this is just day one of forever
<!-- Your first HTML -->
<html>
  <head>
    <title>My Website</title>
  </head>
  <body>
    <h1>Hello, world.</h1>
    <p>I built this.</p>
  </body>
</html>

All 7 days.
Completely free.

No credit card. No signup wall. Just click start and begin learning.

EB

Esdras Buelvas

Web developer · Teacher · Builder

I've been building websites with HTML & CSS for years, and I know exactly where beginners get lost — because I was one. This course is the guide I wish I had when I started. No jargon. No filler. Just the stuff that actually matters, taught in a way that sticks.

Day 01 — Free Lesson ~15 min read · Video coming soon

Your First HTML Page

Today you write your first line of code. By the end of this lesson you'll have a real HTML file open in your browser — created entirely by you, from scratch.

🎬 Video coming soon...

What is HTML?

HTML stands for HyperText Markup Language. It is the language that every website in the world is built with. When you visit any page on the internet — Google, YouTube, any news site — your browser is reading HTML and turning it into what you see on screen.

HTML is not a programming language. You don't need to do math, logic, or algorithms. You just write structured text using something called tags, and the browser handles the rest.

💡

Think of it this way: HTML is like the skeleton of a website. It defines what's there — the heading, the paragraph, the image, the link. CSS (which we'll learn on Day 3) is the skin and clothes — it defines how it looks.

The basic structure of every HTML file

Every HTML page in the world starts with the same basic structure. You only need to memorize this once — your code editor will often write it for you automatically.

index.html
<!DOCTYPE html>
<html lang="en">

  <head>
    <meta charset="UTF-8">
    <title>My First Website</title>
  </head>

  <body>
    <!-- Your content goes here -->
  </body>

</html>

Let's break down what each line does:

<!DOCTYPE html>

This tells the browser "this file is HTML5" — the modern version. It always goes on line 1. You'll never change this line.

<html lang="en">

This opens the HTML document. The lang="en" tells the browser the page is in English. Everything on your page goes inside this tag.

<head>

The head section contains information about the page — not content that the visitor sees. The title of the tab in the browser goes here, along with links to CSS files later.

<body>

Everything inside the body is what the visitor actually sees. All your text, images, links — everything goes here.

Rule to remember: Every tag you open must be closed. <body> opens, </body> closes. Notice the slash / in the closing tag — that's the signal that it's closing.

The essential tags you need today

You don't need to know every HTML tag. Here are the 8 tags that will get you through most of Day 1 — and honestly, most of your early web projects.

TagWhat it doesExample
<h1>Main heading — the biggest title on the page<h1>Hello</h1>
<h2>Sub-heading — smaller than h1, use for sections<h2>About me</h2>
<p>Paragraph — for regular body text<p>I am learning HTML.</p>
<strong>Bold text — makes words stand out<strong>Important</strong>
<em>Italic text — for emphasis<em>really</em>
<br>Line break — moves to the next line (no closing tag)Line one<br>Line two
<hr>Horizontal rule — a divider line (no closing tag)<hr>
<!-- -->Comment — notes for you, invisible in the browser<!-- note -->

Heads up: <br> and <hr> are self-closing — they don't need a closing tag. You'll learn more about these on Day 2 when we cover links and images.

Write your first page

Open VS Code. Create a new file. Name it index.html. Then type — don't copy-paste — every single line of this code:

index.html
<!DOCTYPE html>
<html lang="en">

  <head>
    <meta charset="UTF-8">
    <title>My First Page</title>
  </head>

  <body>

    <h1>Hello, my name is Esdras.</h1>

    <p>I am learning to build websites.</p>
    <p>This is my <strong>first page</strong> and I built it from scratch.</p>

    <hr>

    <h2>Why I'm learning HTML</h2>
    <p>Because I want to build things <em>by myself.</em></p>

  </body>

</html>

Type it, don't paste it. Your hands learning the structure is part of the lesson. You'll remember it 10x better if you type every character yourself today.

Open it in your browser

Save your file (Cmd+S on Mac, Ctrl+S on Windows). Now open your file explorer, find index.html, and double-click it. It will open in your default browser.

You should see your heading, your paragraphs, a horizontal line, and bold/italic text — exactly as you wrote them. That is a real webpage. Your webpage.

💡

Pro tip: Install the Live Server extension in VS Code. It auto-refreshes your browser every time you save. Right-click your file → "Open with Live Server".

Every time you change something in VS Code and save, your browser will update. This is your workflow for the entire course. Get comfortable with it.

Day 1 Challenge

Make it yours.

Don't move to Day 2 until you've done all of these. They'll take you 10–15 minutes and they'll lock in everything you just learned.

  • Change the <h1> to use your own name
  • Add a third <p> tag with something true about yourself
  • Add an <h2> with the title "My Hobbies"
  • Use <strong> on at least one word in your page
  • Change the <title> and watch the browser tab update
  • Add a comment using <!-- --> that only you can see
Up next — Day 2
Text, Links & Navigation
Day 02 — Free Lesson ~15 min read · Video coming soon

Text, Links & Navigation

Today you make your pages connect. You'll learn how to create links, build lists, and set up a basic navigation — the building blocks of every website on the internet.

🎬 Video coming soon...

What we're building today

On Day 1 you built a single page. Today you learn how to connect pages, create lists, and build navigation — so your site starts feeling like a real website with multiple sections and destinations.

By the end of today your page will have working links, an ordered and unordered list, and a simple navigation bar at the top.

💡

Quick recap from Day 1: You know HTML structure, headings, paragraphs, bold, italic, and line breaks. Everything today builds directly on top of that.

The anchor tag — how links work

Links in HTML are made with the <a> tag — short for anchor. It wraps around any text and turns it into a clickable link.

index.html
<a href="https://google.com">Click here to visit Google</a>

The href attribute is where you put the destination URL. That's it. Any text between the opening and closing tag becomes the clickable link text.

Opening links in a new tab

By default, links open in the same tab. If you want a link to open in a new tab — which is best practice for external sites — add target="_blank":

index.html
<a href="https://google.com" target="_blank">Visit Google</a>

Linking to another page on your own site

When linking between your own pages, you don't need the full URL — just the filename:

index.html
<!-- Link to another page in your project -->
<a href="about.html">About me</a>
<a href="contact.html">Contact</a>

Linking to a section on the same page

You can link to a specific section on the same page using an id and the # symbol:

index.html
<!-- The link -->
<a href="#about">Jump to About section</a>

<!-- The destination -->
<h2 id="about">About Me</h2>

Good to know: The id attribute can be added to any HTML element — not just headings. It gives that element a unique name so you can link directly to it.

Lists — ordered and unordered

HTML has two types of lists. An unordered list gives you bullet points. An ordered list gives you numbers. Both use the <li> tag for each item.

Unordered list — bullet points

index.html
<ul>
  <li>HTML</li>
  <li>CSS</li>
  <li>JavaScript</li>
</ul>

Ordered list — numbered

index.html
<ol>
  <li>Buy groceries</li>
  <li>Cook dinner</li>
  <li>Eat</li>
</ol>

Common mistake: Always put <li> items directly inside <ul> or <ol>. Never put raw text directly inside a list tag without wrapping it in <li>.

Building a simple navigation

A navigation bar is just a list of links at the top of your page. In HTML, we use the <nav> tag to tell the browser "this is navigation", and a <ul> with links inside for the actual items.

index.html
<nav>
  <ul>
    <li><a href="index.html">Home</a></li>
    <li><a href="#about">About</a></li>
    <li><a href="#hobbies">Hobbies</a></li>
    <li><a href="contact.html">Contact</a></li>
  </ul>
</nav>

Right now it looks like a plain vertical list — that's normal. On Day 3 when we add CSS, you'll style it into a real horizontal navbar that looks professional. Today we focus on getting the structure right.

💡

Why use <nav>? It's a semantic tag — it tells the browser and screen readers that this section is navigation, not just a random list. Good habit to build early.

Put it all together

Open your index.html from Day 1. Add a navigation at the top, a list of your hobbies, and a few links. Type every line — don't paste.

index.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>My Website</title>
  </head>
  <body>

    <nav>
      <ul>
        <li><a href="#home">Home</a></li>
        <li><a href="#about">About</a></li>
        <li><a href="#hobbies">Hobbies</a></li>
      </ul>
    </nav>

    <h1 id="home">Hello, I'm Esdras.</h1>
    <p>I'm learning to build websites from scratch.</p>

    <hr>

    <h2 id="about">About Me</h2>
    <p>I'm 17 and teaching myself to code.</p>

    <h2 id="hobbies">My Hobbies</h2>
    <ul>
      <li>Building websites</li>
      <li>Learning new things</li>
      <li>Teaching others</li>
    </ul>

    <p>Check out <a href="https://github.com" target="_blank">my GitHub</a>.</p>

  </body>
</html>

Notice: The nav links use #home, #about, #hobbies — and the headings have matching id attributes. Click a nav link and the page jumps straight to that section.

Day 2 Challenge

Make it yours.

Complete all of these before moving to Day 3. Should take 10–15 minutes.

  • Add a 4th nav link that jumps to a new section you create
  • Add an ordered list ranking your top 3 favorite things
  • Add a link to your favorite website that opens in a new tab
  • Add an email link using href="mailto:your@email.com"
  • Make sure every nav link jumps to the correct section
  • Add a "Back to top" link at the bottom of the page
Up next — Day 3
Styling with CSS
Day 03 — Free Lesson ~15 min read · Video coming soon

Styling with CSS

Today everything changes. You've built the structure — now you make it look good. CSS controls colors, fonts, spacing, and layout. By the end of today your plain HTML page will actually look like a real website.

🎬 Video coming soon...

What is CSS?

CSS stands for Cascading Style Sheets. If HTML is the skeleton of your website, CSS is everything that makes it look good — colors, fonts, spacing, borders, backgrounds, layout.

Without CSS, every website on the internet would look like a plain text document. With CSS, the same HTML becomes something people actually want to look at.

💡

How it works: You write CSS rules that say "find this HTML element and apply these styles to it." The browser reads both files and combines them to display the final page.

Three ways to add CSS

There are three ways to write CSS. We'll use the best one — an external stylesheet. But here are all three so you know them:

1. Inline — directly on the element (avoid this)

index.html
<h1 style="color: red;">Hello</h1>

2. Internal — inside a <style> tag in the head

index.html
<head>
  <style>
    h1 { color: red; }
  </style>
</head>

3. External stylesheet — a separate .css file (use this)

index.html
<head>
  <link rel="stylesheet" href="style.css">
</head>

Create a new file called style.css in the same folder as your index.html. Add the link tag to your head. Now everything you write in style.css applies to your page automatically.

Why external? Because one CSS file can style many HTML pages at once. Change one file — every page updates. That's the power of separation.

Selectors — how CSS finds elements

A CSS rule has two parts: a selector that finds the element, and declarations inside curly braces that apply styles to it.

style.css
/* Select by tag name */
h1 {
  color: #0d0d0d;
  font-size: 2rem;
}

/* Select by class */
.my-paragraph {
  color: #555;
}

/* Select by id */
#hero {
  background-color: #f5f5f5;
}

Three selector types to know right now. Tag selectors target every element of that type — h1 styles every h1. Class selectors start with a dot and target elements with that class. ID selectors start with a hash and target a single unique element.

index.html
<!-- Add a class to an element -->
<p class="my-paragraph">This paragraph has a class.</p>

Colors, fonts & spacing

These are the CSS properties you'll use every single day. Learn them well.

style.css
body {
  background-color: #ffffff;
  color: #0d0d0d;
  font-family: Arial, sans-serif;
  font-size: 16px;
  line-height: 1.6;
  margin: 0;
  padding: 0;
}

h1 {
  font-size: 2.5rem;
  color: #0d0d0d;
  margin-bottom: 1rem;
}

p {
  color: #555555;
  margin-bottom: 1rem;
}

a {
  color: #0066cc;
  text-decoration: none;
}

a:hover {
  text-decoration: underline;
}
💡

Color formats: You can write colors as hex codes like #0d0d0d, color names like red, or RGB values like rgb(13,13,13). Hex codes are the most common — learn to read them.

Style your page

Create a new file called style.css. Link it in your HTML head. Then type this full stylesheet — this will completely transform your page from plain text to a real designed website.

style.css
/* === RESET & BASE === */
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

body {
  font-family: Arial, sans-serif;
  font-size: 16px;
  line-height: 1.6;
  color: #333;
  background-color: #fafafa;
  padding: 2rem;
}

/* === NAV === */
nav {
  background-color: #0d0d0d;
  padding: 1rem 2rem;
  margin: -2rem -2rem 2rem -2rem;
}

nav ul {
  list-style: none;
  display: flex;
  gap: 2rem;
}

nav a {
  color: #ffffff;
  text-decoration: none;
  font-size: 0.9rem;
}

nav a:hover {
  opacity: 0.7;
}

/* === HEADINGS === */
h1 {
  font-size: 2.5rem;
  margin-bottom: 0.5rem;
  color: #0d0d0d;
}

h2 {
  font-size: 1.5rem;
  margin-top: 2rem;
  margin-bottom: 0.5rem;
  color: #0d0d0d;
}

/* === LINKS === */
a {
  color: #0066cc;
  text-decoration: none;
}

a:hover { text-decoration: underline; }

/* === LISTS === */
ul, ol {
  padding-left: 1.5rem;
  margin-bottom: 1rem;
}

li { margin-bottom: 0.4rem; }

/* === HR === */
hr {
  border: none;
  border-top: 1px solid #e0e0e0;
  margin: 2rem 0;
}

Watch what happens: Save style.css and look at your browser. Your nav is now dark with white horizontal links. Your headings are larger. Your page has breathing room. That's the power of CSS — same HTML, completely different look.

Day 3 Challenge

Make it look like you.

Don't move to Day 4 until you've done all of these.

  • Change the body background color to something you like
  • Change the nav background to a color that represents you
  • Change the h1 and h2 colors
  • Add a font-family you like — try Georgia, Verdana, or Courier New
  • Add a max-width to body (e.g. 800px) and center it with margin: 0 auto
  • Style the hr to use a different color
Up next — Day 4
Layout & The Box Model
Day 04 — Free Lesson ~15 min read · Video coming soon

Layout & The Box Model

Today you learn how HTML elements take up space and how to control exactly where things go on the page. This is the most important concept in CSS — once you understand the box model and Flexbox, you can build any layout.

🎬 Video coming soon...

The Box Model

Every single HTML element on your page is a box. Even text. Even images. Everything is a box, and every box has four parts: content, padding, border, and margin.

Understanding this is the key to controlling layout. Once you see the box model, you'll see it everywhere.

style.css
/* Visualize the box model */
.box {
  width: 300px; /* content width */
  padding: 20px; /* space inside */
  border: 2px solid #333; /* the border line */
  margin: 30px; /* space outside */
}
💡

Pro tip: Open Chrome DevTools (right-click → Inspect) and hover over any element. You'll see the box model diagram — blue is content, green is padding, orange is margin. Use this constantly.

Margin & Padding — the difference

Padding is space between the content and the border — it's inside the element. Margin is space outside the border — it pushes other elements away.

style.css
/* Shorthand — all four sides */
p {
  padding: 10px; /* all sides */
  margin: 10px 20px; /* top/bottom left/right */
}

/* Longhand — individual sides */
h1 {
  margin-top: 0;
  margin-bottom: 1rem;
  padding-left: 1rem;
}

Remember: Padding adds space inside, margin adds space outside. If your element needs more breathing room around it — use margin. If it needs space between its edge and its content — use padding.

Display — block vs inline

Every HTML element has a default display type. The two most important are block and inline.

Block elements take up the full width of their container and always start on a new line — headings, paragraphs, divs. Inline elements only take up as much space as their content and don't break the flow — links, spans, strong, em.

style.css
/* Change display type */
a {
  display: inline-block; /* inline but accepts width/height */
  padding: 0.5rem 1rem;
  background-color: #0066cc;
  color: white;
  border-radius: 4px;
}

That turns any link into a button. inline-block is the sweet spot — it flows like inline but accepts width, height, and padding like a block.

Flexbox — the modern layout tool

Flexbox lets you arrange elements in a row or column, control spacing between them, and align them — all in a few lines of CSS. It's how almost every modern layout is built.

You apply Flexbox to the parent element, and it controls the layout of all its children.

style.css
.container {
  display: flex;
  flex-direction: row; /* row or column */
  justify-content: space-between; /* horizontal spacing */
  align-items: center; /* vertical alignment */
  gap: 1rem; /* space between items */
}
💡

The most used Flexbox values: justify-content: center centers horizontally. align-items: center centers vertically. gap adds space between flex items without touching margins.

Build a two-column layout

Let's put it all together. Add a <div class="container"> around two sections in your HTML, then use Flexbox to place them side by side.

index.html
<div class="container">
  <div class="card">
    <h2>About Me</h2>
    <p>I'm learning to build websites.</p>
  </div>
  <div class="card">
    <h2>My Skills</h2>
    <p>HTML, CSS, and growing.</p>
  </div>
</div>
style.css
.container {
  display: flex;
  gap: 2rem;
  margin-top: 2rem;
}

.card {
  flex: 1; /* each card takes equal space */
  background: #fff;
  border: 1px solid #e0e0e0;
  border-radius: 8px;
  padding: 1.5rem;
}

flex: 1 tells each card to take up an equal share of the available space. Two cards with flex: 1 each take 50%. Three cards each take 33%. It's that simple.

Day 4 Challenge

Control your layout.

Do all of these before moving to Day 5.

  • Add a max-width: 900px and margin: 0 auto to your body to center your content
  • Turn one of your links into a styled button using inline-block and padding
  • Add a two-column card layout somewhere on your page
  • Use border-radius on at least one element
  • Open DevTools and inspect your page — identify margin and padding on 3 elements
  • Use justify-content: space-between on your nav
Up next — Day 5
Images & Media
Day 05 — Free Lesson ~15 min read · Video coming soon

Images & Media

Today your page gets visuals. You'll learn how to add images, control their size, embed YouTube videos, build a hero section, and make everything look good on any screen size.

🎬 Video coming soon...

The image tag

Images in HTML use the <img> tag. It's self-closing — no closing tag needed. It takes two important attributes: src for the image path, and alt for a text description.

index.html
<!-- Local image (file in your project folder) -->
<img src="photo.jpg" alt="A photo of me">

<!-- Image from the web (URL) -->
<img src="https://example.com/image.jpg" alt="Description">

Always write alt text. It shows when the image fails to load, helps search engines understand your page, and is required for accessibility. Describe what's actually in the image.

Sizing and styling images with CSS

Never set image dimensions in HTML. Always use CSS — it gives you more control and keeps your code clean.

style.css
/* Make all images responsive by default */
img {
  max-width: 100%;
  height: auto;
  display: block;
}

/* Profile photo — circular */
.avatar {
  width: 120px;
  height: 120px;
  border-radius: 50%;
  object-fit: cover;
}

/* Full-width banner image */
.banner {
  width: 100%;
  height: 300px;
  object-fit: cover;
  object-position: center;
}
💡

object-fit: cover is the magic property. It makes your image fill its container without stretching or distorting — like background-size: cover but for actual img tags.

Embedding YouTube videos

You don't host videos yourself. You upload to YouTube and embed the player using an <iframe>. YouTube gives you the embed code — you just paste it in.

index.html
<!-- Responsive video wrapper -->
<div class="video-container">
  <iframe
    src="https://www.youtube.com/embed/YOUR_VIDEO_ID"
    title="Video title"
    allowfullscreen
  ></iframe>
</div>
style.css
/* Responsive 16:9 video */
.video-container {
  position: relative;
  padding-bottom: 56.25%; /* 16:9 ratio */
  height: 0;
  overflow: hidden;
  border-radius: 12px;
  margin: 2rem 0;
}

.video-container iframe {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  border: none;
}

To get your YouTube embed URL: go to your video → Share → Embed → copy the URL from the src attribute. Replace YOUR_VIDEO_ID with your actual video ID.

Building a hero section

A hero section is the big visual area at the top of a page — usually a background image, a headline, and a button. Here's how to build one with CSS background images.

index.html
<section class="hero">
  <div class="hero-content">
    <h1>Hello, I'm Esdras.</h1>
    <p>I build things for the internet.</p>
    <a href="#about" class="button">See my work</a>
  </div>
</section>
style.css
.hero {
  background-color: #0d0d0d;
  background-image: url('hero.jpg');
  background-size: cover;
  background-position: center;
  min-height: 80vh;
  display: flex;
  align-items: center;
  justify-content: center;
}

.hero-content {
  text-align: center;
  color: white;
  padding: 2rem;
}

Making images responsive

Responsive means your site looks good on any screen — phone, tablet, desktop. For images, three rules cover 90% of cases:

style.css
/* Rule 1: Images never overflow their container */
img { max-width: 100%; height: auto; }

/* Rule 2: Use media queries for different screen sizes */
@media (max-width: 768px) {
  .container {
    flex-direction: column; /* stack on mobile */
  }
  .hero {
    min-height: 50vh;
  }
}

/* Rule 3: Use relative units (%, rem, vh) not fixed px */
.card { width: 100%; max-width: 400px; }

Test on mobile: In Chrome DevTools, click the device icon (top left of DevTools) to toggle mobile view. Check your site at 375px wide — that's iPhone size. Fix anything that looks broken.

Day 5 Challenge

Add visuals to your page.

  • Add a profile photo — circular, 120px, using border-radius: 50%
  • Add max-width: 100%; height: auto to all images globally
  • Build a hero section with a dark background and centered white text
  • Embed a YouTube video using the responsive iframe technique
  • Add a media query that stacks your flex columns on mobile
  • Test your page in DevTools mobile view at 375px wide
Up next — Day 6
Full Page Build
Day 06 — Free Lesson ~20 min read · Video coming soon

Full Page Build

No new concepts today. We use everything from Days 1–5 and build a complete, real portfolio page from scratch — nav, hero, about section, skills, and footer. This is the page you deploy tomorrow.

🎬 Video coming soon...

The plan

Today we build a complete personal portfolio page. Here's exactly what we're making:

  • 1Nav bar — fixed at top, logo left, links right
  • 2Hero section — full-width, dark background, your name, a button
  • 3About section — photo + bio side by side using Flexbox
  • 4Skills section — three cards in a row
  • 5Footer — your name, copyright, social links
💡

Start fresh. Create a new folder called portfolio. Inside it: a new index.html and a new style.css. This is the file you'll deploy on Day 7.

The full HTML

Type all of this into your new index.html. Replace the placeholder content with your real information.

index.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Your Name — Portfolio</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>

  <!-- NAV -->
  <nav>
    <span class="logo">Esdras Buelvas</span>
    <ul>
      <li><a href="#about">About</a></li>
      <li><a href="#skills">Skills</a></li>
      <li><a href="mailto:you@email.com">Contact</a></li>
    </ul>
  </nav>

  <!-- HERO -->
  <section class="hero">
    <h1>Hi, I'm Esdras.</h1>
    <p>I build websites from scratch.</p>
    <a href="#about" class="btn">Learn more ↓</a>
  </section>

  <!-- ABOUT -->
  <section class="about" id="about">
    <img src="photo.jpg" alt="Esdras Buelvas" class="avatar">
    <div>
      <h2>About Me</h2>
      <p>I'm 17 and teaching myself to build websites. I created this course to help others learn HTML and CSS for free.</p>
    </div>
  </section>

  <!-- SKILLS -->
  <section class="skills" id="skills">
    <h2>Skills</h2>
    <div class="cards">
      <div class="card"><h3>HTML</h3><p>Structure and content.</p></div>
      <div class="card"><h3>CSS</h3><p>Design and layout.</p></div>
      <div class="card"><h3>GitHub</h3><p>Version control and deployment.</p></div>
    </div>
  </section>

  <!-- FOOTER -->
  <footer>
    <p>© 2026 Esdras Buelvas</p>
    <a href="https://github.com/dras8u" target="_blank">GitHub</a>
  </footer>

</body>
</html>

The full CSS

Now type this into your new style.css. This is a complete, clean stylesheet for the portfolio.

style.css
* { margin:0; padding:0; box-sizing:border-box; }

body { font-family:Arial,sans-serif; color:#333; line-height:1.6; }

/* NAV */
nav {
  position:fixed; top:0; left:0; right:0;
  background:#0d0d0d; padding:1rem 2rem;
  display:flex; justify-content:space-between; align-items:center;
  z-index:100;
}
.logo { color:white; font-weight:bold; font-size:1.1rem; }
nav ul { list-style:none; display:flex; gap:2rem; }
nav a { color:rgba(255,255,255,0.7); text-decoration:none; font-size:0.9rem; }
nav a:hover { color:white; }

/* HERO */
.hero {
  min-height:100vh; background:#0d0d0d;
  display:flex; flex-direction:column;
  align-items:center; justify-content:center;
  text-align:center; color:white; padding:2rem;
}
.hero h1 { font-size:clamp(2rem,5vw,4rem); margin-bottom:1rem; }
.hero p { color:rgba(255,255,255,0.6); margin-bottom:2rem; font-size:1.1rem; }
.btn {
  display:inline-block; padding:0.75rem 1.75rem;
  background:white; color:#0d0d0d;
  border-radius:100px; text-decoration:none;
  font-weight:500;
}

/* SECTIONS */
section { padding:5rem 2rem; max-width:900px; margin:0 auto; }
h2 { font-size:1.75rem; margin-bottom:1.5rem; color:#0d0d0d; }

/* ABOUT */
.about { display:flex; gap:3rem; align-items:center; }
.avatar {
  width:160px; height:160px;
  border-radius:50%; object-fit:cover; flex-shrink:0;
}

/* SKILLS */
.skills { background:#f5f5f5; max-width:100%; padding:5rem 2rem; }
.skills h2 { max-width:900px; margin:0 auto 1.5rem; }
.cards { display:flex; gap:1.5rem; max-width:900px; margin:0 auto; }
.card {
  flex:1; background:white;
  border-radius:12px; padding:1.5rem;
  border:1px solid #e5e5e5;
}
.card h3 { margin-bottom:0.5rem; color:#0d0d0d; }

/* FOOTER */
footer {
  background:#0d0d0d; color:rgba(255,255,255,0.5);
  padding:2rem; text-align:center;
  display:flex; justify-content:space-between; align-items:center;
}
footer a { color:rgba(255,255,255,0.5); text-decoration:none; }
footer a:hover { color:white; }

/* RESPONSIVE */
@media (max-width: 768px) {
  .about { flex-direction:column; text-align:center; }
  .cards { flex-direction:column; }
  footer { flex-direction:column; gap:1rem; }
}

Polish & review

Before you call it done, go through this checklist on your page:

  • ✓ Nav stays fixed at top when you scroll
  • ✓ Hero fills the full viewport height
  • ✓ About section image and bio are side by side on desktop
  • ✓ Three skill cards are equal width
  • ✓ Footer has your name and a link
  • ✓ On mobile everything stacks cleanly
  • ✓ No horizontal scroll on any screen size
  • ✓ All nav links jump to the correct section

Add a real photo. Put an image file called photo.jpg in your project folder. It can be any photo of you — even a selfie. A real face makes your portfolio 10x more credible.

Day 6 Challenge

Make it production-ready.

  • Replace all placeholder text with your real name, bio, and info
  • Add a real profile photo to the about section
  • Add a fourth skill card with something you're learning
  • Add a smooth scroll behavior: html { scroll-behavior: smooth; }
  • Test on mobile in DevTools — fix anything broken
  • Share a screenshot of your finished page
Last day — Day 7
Go Live on GitHub Pages 🚀
Day 07 — Final Lesson 🎉 ~10 min read · Video coming soon

Go Live on GitHub Pages

This is it. Today you take the portfolio you built on Day 6 and put it on the real internet — with a real URL that anyone in the world can visit. Forever. For free.

🎬 Video coming soon...

Step 1 — Create your GitHub repository

If you don't have a GitHub account, go to github.com and sign up free. It takes two minutes.

Once you're in:

  1. Click the + icon top right → New repository
  2. Name it exactly: yourusername.github.io (replace yourusername with your GitHub username)
  3. Set it to Public
  4. Leave everything else default and click Create repository
💡

The name matters. If your GitHub username is dras8u, name your repo dras8u.github.io. This special naming convention activates GitHub Pages automatically for your main portfolio site.

Step 2 — Upload your files

Inside your new empty repository:

  1. Click uploading an existing file or drag and drop
  2. Upload your index.html and style.css from Day 6
  3. If you have a photo.jpg — upload that too
  4. Scroll down and click Commit changes

Your file MUST be named index.html — not portfolio.html, not mysite.html. GitHub Pages looks specifically for index.html as the entry point.

Step 3 — Enable GitHub Pages

For the special yourusername.github.io repo, GitHub Pages is enabled automatically. Your site is already live — just wait 1–2 minutes then visit:

Your live URL
https://dras8u.github.io

If it's not live yet: go to your repo → SettingsPages → under Branch select main → click Save.

💡

HTTPS is free. GitHub Pages automatically gives you SSL — the padlock icon. Your site is secure by default. No setup needed.

Step 4 — Connect your custom domain (optional)

If you have a domain like esdrasbuelvas.org, you can point it to your GitHub Pages site so it shows your domain instead of dras8u.github.io.

  1. In your repo → SettingsPagesCustom domain
  2. Type your domain (e.g. esdrasbuelvas.org) and click Save
  3. In your domain registrar (IONOS), add these 4 A records pointing to GitHub:
DNS records in IONOS
Type Host Value
A @ 185.199.108.153
A @ 185.199.109.153
A @ 185.199.110.153
A @ 185.199.111.153
CNAME www dras8u.github.io

Wait up to 24 hours for DNS to propagate. Then check Enforce HTTPS in GitHub Pages settings.

🎉 You're live

You just shipped a real website. Not a tutorial. Not a CodePen. A real page on the real internet with a real URL that anyone on earth can visit right now.

In 7 days you went from zero to:

  • Understanding HTML structure and tags
  • Building links, lists, and navigation
  • li>Writing CSS — colors, fonts, selectors, and the box model
  • Building layouts with Flexbox
  • Adding images, media, and a hero section
  • Building a complete portfolio page
  • Deploying to the internet for free

Share it. Post your URL on social media, send it to friends, put it in your bio. You built this. Show it off.

What's next

HTML and CSS are the foundation. Here's what to learn next to keep growing as a web developer:

JavaScript

Make your pages interactive — buttons that do things, forms that submit, animations. This is the next big step.

CSS Grid

A more powerful layout system than Flexbox for two-dimensional layouts. Learn it after you're comfortable with Flexbox.

Git & command line

Instead of uploading files manually, learn to push code from your terminal. This is how real developers work.

Keep building

The best way to learn is to build real things. Pick a project — a page for a local business, a fan site, a personal blog — and build it.

You finished the course

Congratulations. 🎉

You started 7 days ago knowing nothing about HTML. Today you have a live website on the internet. That's real. Share your site URL with Esdras — he wants to see what you built.

Back to
Course Home
Esdras Buelvas
Certificate of Completion
This certifies that
Student Name
has successfully completed the Build Your First Website in 7 Days sprint — mastering HTML structure, CSS styling, Flexbox layout, responsive design, and deploying a live website to the internet.
Date issued
Instructor
Esdras Buelvas
esdrasbuelvas.org
${['HTML','CSS','Flexbox','Responsive Design','GitHub Pages'].map(s => `${s}`).join('')}

Share your certificate and show the world what you built. 🚀

?
Your Dashboard