The Academy

Loading the search index…

Searches the academy on this device only.

Final project: build and publish a personal web page

Build a small, accessible personal page from scratch, check it, and publish it on a free static host with a public address, while keeping your private details safe.

45 minintermediatePractical task needs a laptop or desktop

Marking a lesson as read does not prove you can do it. Skills count as demonstrated when you pass the quiz (not yet) and complete the practical tasks (not yet).

By the end of this lesson you will be able to

  • Build a one-page personal site with semantic HTML and a stylesheet.
  • Check the page for accessibility: headings, alt text, contrast, keyboard use and zoom.
  • Compare GitHub Pages, Netlify and Vercel as places to publish a static site.
  • Publish the page and confirm it loads over HTTPS from its public address.
  • Decide what personal information should never go on a public page.

This is the project that brings the whole programming path together. You will write a small personal page, test it, and put it on the internet at an address anyone can open. Publishing is easier than most people expect, because a simple page is only a few files. It also brings a responsibility: once a page is public, strangers can read it, so you will decide carefully what goes on it. Use a made-up persona if you prefer; the skills are identical.

Plan before you build

Decide the purpose first. A personal page might introduce you, list a hobby or skill, or show a small portfolio. Write down three sections, such as About, What I am learning and Contact, and a short sentence for each. Sketch the order on paper. Planning for five minutes avoids rewriting later, in the same way that the flowcharts you drew earlier helped you plan an algorithm.

Build the page

Create a folder called personal-site with index.html and style.css inside it. This page uses the semantic elements from the HTML lessons (header, main, section, footer), one h1, headings in order, a descriptive alt for the image, a viewport line so it works on phones, and a language on the html element so screen readers pronounce it correctly. Write your own words and replace the fictional content.

HTML
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Amina Wanjiru - Garden notes</title>
  <meta name="description" content="Amina's page about learning to grow vegetables and to code.">
  <link rel="stylesheet" href="style.css">
</head>
<body>
  <header>
    <h1>Amina Wanjiru</h1>
    <p>Learning to grow vegetables and to build web pages.</p>
  </header>

  <main>
    <section id="about">
      <h2>About me</h2>
      <p>I keep a small vegetable plot and I am teaching myself computing. This page is my first website.</p>
    </section>

    <section id="learning">
      <h2>What I am learning</h2>
      <ul>
        <li>HTML for structure</li>
        <li>CSS for looks</li>
        <li>JavaScript for behaviour</li>
      </ul>
    </section>

    <section id="contact">
      <h2>Contact</h2>
      <p>Email me at <a href="mailto:amina@example.com">amina@example.com</a>.</p>
    </section>
  </main>

  <footer>
    <p>Made by Amina. Last updated October 2026.</p>
  </footer>
</body>
</html>
index.html: a complete fictional personal page. Adapt it to yourself.
CSS
body {
  font-family: Arial, Helvetica, sans-serif;
  font-size: 1.125rem;
  line-height: 1.6;
  color: #222222;
  background-color: #f6faf6;
  margin: 0;
}

header, main, footer {
  max-width: 40rem;
  margin: 0 auto;
  padding: 1rem;
}

header {
  background-color: #1b5e20;
  color: #ffffff;
  max-width: none;
}

header h1, header p {
  max-width: 40rem;
  margin-left: auto;
  margin-right: auto;
}

h2 {
  color: #1b5e20;
}

a {
  color: #0b4f9c;
}

a:focus {
  outline: 3px solid #e65100;
  outline-offset: 2px;
}

footer {
  border-top: 1px solid #cccccc;
  font-size: 0.9rem;
}
style.css: readable, responsive and focus-friendly.
Simulated interface: not a real screenshot

A simulated browser showing the finished personal page.

file:///home/amina/personal-site/index.html

AMINA WANJIRU

Learning to grow vegetables and to build web pages.

About me: I keep a small vegetable plot...

What I am learning: HTML, CSS, JavaScript

Contact: amina@example.com

Made by Amina. Last updated October 2026.

  1. Marker 1: header: name and tagline
  2. Marker 2: main: one section per topic
  3. Marker 3: footer: maker and date
A simulated browser showing the finished personal page.
Read this figure as text

A simulated browser window with the personal page: green header, three sections and a footer.

A simulated browser window with the address file:///home/amina/personal-site/index.html. The page has a dark green header with the name Amina Wanjiru and a one-line description. Below it are three sections: About me with a paragraph, What I am learning with three bullet points, and Contact with an email link. At the bottom is a footer with the maker's name and the update date. Marker 1 is the header, marker 2 the main sections and marker 3 the footer.

Check it before you publish

Open the page in your browser and work down this list. It takes ten minutes and catches most problems. The first four are accessibility checks, which help everyone, including people using screen readers or magnification, and are good practice for any page you publish.

Pre-publication checklist
CheckHow to test itPass looks like
Headings in orderRead only the h1 and h2 linesOne h1, then h2 sections, no skipped levels
Image alt textHover or read the alt attributesEach meaningful image says what it shows; decorative ones use alt=""
Colour contrastSquint at the page; try a contrast checkerText is easy to read against its background
Keyboard usePress Tab repeatedlyEvery link gets a visible outline, in a sensible order
Zoom and phone widthPress Ctrl and + several times; narrow the windowText grows, nothing is cut off, no sideways scrolling
Links workClick every linkNo 404 errors; the email link opens your mail app
Console is cleanPress F12 and open the ConsoleNo red errors
Private detailsRead every line as a strangerNothing you would not want public

Where to publish

Your page is a static site: only ready-made files, no database and no program running on the server. That is the easiest kind to host, and several services give you a free plan for it. Free plans and screens change over time, so treat the steps below as the shape of the process and follow the host's current help page.

Diagram

Three popular ways to publish a static page.

GitHub PagesFrom a repository
  • Files live in a GitHub repo
  • Switch on Pages in Settings
  • username.github.io/repo-name
NetlifyDrag a folder
  • Drop the site folder on Netlify Drop
  • Or connect a Git repo
  • Address ends in netlify.app
VercelConnect a repository
  • Import a Git repo
  • Republishes after each push
  • Address ends in vercel.app
Three popular ways to publish a static page.
Read this figure as text

Three columns comparing GitHub Pages, Netlify and Vercel by how you upload and what address you get.

Three columns. GitHub Pages: you keep the files in a GitHub repository and switch on Pages in the repository settings; the address looks like username.github.io/repository-name. Netlify: you can drag your site folder onto a web page, called Netlify Drop, or connect a Git repository; you get a generated address ending in netlify.app. Vercel: you connect a Git repository and it publishes automatically after each push; the address ends in vercel.app. All three serve over HTTPS and offer a free plan, with terms that can change.

The simplest option is Netlify Drop: sign in, open the drop page, drag the whole personal-site folder onto it and the host gives you an address. To use GitHub Pages, create a GitHub repository, push your project to it (see the Git lesson), then open the repository's Settings, choose Pages, set the source to deploy from the main branch at the root folder, and wait a minute or two. To use Vercel, sign in, choose to add a new project, import the repository and accept the defaults for a plain HTML site. Names of menus move around between releases, so follow the on-screen wording.

Publish with GitHub Pages

  1. Step 1: Commit your site

    In personal-site run git init, git add ., git commit -m "First version of my page" and git branch -M main.

    You should see: git log --oneline shows your commit.

  2. Step 2: Create the online repository

    On github.com choose to create a new repository, name it for example personal-site, make it public, and do not add extra files.

    You should see: GitHub shows a page with instructions and an empty repository.

  3. Step 3: Push your code

    Run the two lines GitHub shows: git remote add origin <the address it gives you> and git push -u origin main. Sign in the way GitHub asks.

    You should see: Your files appear in the repository on the website.

  4. Step 4: Switch on Pages

    In the repository open Settings, then Pages. Under the build and deployment section choose to deploy from a branch, select main and the root folder, then save.

    You should see: After a minute or two a banner shows the address of your live site.

  5. Step 5: Open and test the address

    Open the address in a private window and on your phone.

    You should see: The page loads, the address starts with https:// and a padlock appears.

Addresses, domains and basic web security

A free host gives you an address on its own domain, which is perfectly good for a personal page. If you later want a name such as aminagarden.example, you buy the name from a domain registrar for a yearly fee and point it at your host; the host's help pages explain the steps. The registrar and the host are separate companies. Do not rush this: free addresses are enough to learn and to share a page.

Diagram

The parts of a GitHub Pages address.

https://ProtocolEncrypted connection
amina-demoAccountYour GitHub name
.github.ioHost domainOwned by the service
/personal-site/ProjectRepository name
The parts of a GitHub Pages address.
Read this figure as text

The fictional address https://amina-demo.github.io/personal-site/ split into protocol, account, host and project path.

The fictional address https://amina-demo.github.io/personal-site/ is split into parts. https:// is the protocol: the connection is encrypted. amina-demo is the account name chosen at GitHub. .github.io is the domain owned by the host. /personal-site/ is the repository name, which is where your page lives. The index.html file is shown automatically.

Basic safety for a static page comes down to a few habits. Serve the page over HTTPS, which these hosts do automatically. Keep passwords and tokens out of your files and out of Git. Do not add forms that collect people's details unless you use a trusted form service and know what it does with the data. Load scripts only from sources you trust, and keep your hosting and GitHub accounts protected with a strong Passphrase and multifactor authentication. Finally, tell the world only what you meant to.

Diagram

What happens when you update a page that is already published.

YouGitHubHostVisitor1git push new commit2New version ready3Copy new files4Request your address5Send latest page(HTTPS)
What happens when you update a page that is already published.
Read this figure as text

A sequence between you, GitHub, the host and a visitor showing push, deploy and viewing.

Four actors: You, GitHub, Host and Visitor. 1: You push a new commit to GitHub. 2: GitHub tells the host there is a new version. 3: The host copies the new files to its servers. Later, 4: a Visitor asks the host for your address. 5: the host sends back the latest page over HTTPS. Updates are normally live within a minute or two.

Common mistakes

  • ✖ Instead of: Publishing a page containing a home address, phone number or children's photos.

    ✔ Do this: Keep private details off public pages. Use a project email address and share the rest privately.

  • ✖ Instead of: Naming the home page Home.html or index.htm.txt.

    ✔ Do this: Call it exactly index.html and check that your editor did not add .txt.

  • ✖ Instead of: Skipping alt text because the picture is obvious to you.

    ✔ Do this: Describe each meaningful image in the alt attribute so everyone gets the information.

  • ✖ Instead of: Testing only on your laptop.

    ✔ Do this: Open the public address on a phone and in a private window too.

If something goes wrong

The published page has no styling.
The stylesheet link is probably wrong or the file was not uploaded. Open the Network panel (F12), refresh, and look for a red 404 on style.css. Fix the file name, capitals and folder in the href, commit, push.
GitHub Pages says the site is not published yet, or shows 404.
Wait a few minutes. Then check Settings, then Pages, for the correct branch and root folder, and that index.html is at the top of the repository, not inside a subfolder.
My change does not appear on the live page.
Confirm you committed and pushed. Wait a minute or two for the host to rebuild, then do a hard refresh with Ctrl+Shift+R, or open a private window.
git push asks for a password and refuses my account password.
GitHub does not take account passwords for command-line pushes. Follow the sign-in method GitHub's help page describes, such as a browser sign-in or a personal access token, and never paste a token into a file in your project.

Key terms

Static site
A website made of ready-written files (HTML, CSS, JavaScript, images) that the server sends unchanged.
Deployment
Putting your finished site on a server so other people can reach it on the internet.
HTTPS
The secure version of HTTP, which encrypts what passes between you and a website.
Domain name
The readable name of a website, such as example.com.
Hosting
A service that keeps a website's files on a server so people can visit it.

Practise it for real

Reading is not the same as being able to do it. Complete these on your own computer, then tick only what you have actually done. These ticks are your own honest record: nothing checks them for you.

Guided exerciseNeeds a laptop or desktop

Build and check your page

Create personal-site with index.html and style.css. Write your own content in three sections, with only information you are happy for the public to see. Work through the pre-publication checklist and fix anything that fails.

You have succeeded when:
Independent challengeNeeds a laptop or desktop

Challenge: publish and test on a phone

Choose one host and publish your page without step-by-step help, using the host's own help page. Open the public address on a different device. Then change one sentence, republish, and confirm the change appears.

You have succeeded when:

Knowledge check

6 questions. You need 80% to pass. Mistakes here are part of learning, and you can retry as often as you like.

  1. Question 1.Why is a page made only of HTML, CSS and a little JavaScript easy to host?
  2. Question 2.Fatuma wants to add her home address, her daily timetable and a photo of her children's school uniform to her public page so friends can find her.What is the best advice?
  3. Question 3.Put the GitHub Pages publishing steps in order.
    1. Turn on Pages in Settings
    2. Push the commits
    3. Commit the site locally
    4. Create an online repository
  4. Question 4.Free static hosts normally serve your page over HTTPS without you buying a certificate.
  5. Question 5.Match each check to the problem it prevents.
  6. Question 6.Your GitHub Pages address shows 404 Not Found. What is the most likely cause?

Summary

  • Plan sections first, then build with semantic HTML and one stylesheet.
  • Check headings, alt text, contrast, keyboard use, zoom, links and the console before publishing.
  • A static site can be published free on GitHub Pages, Netlify or Vercel; the process matters more than the menu names.
  • Pages are served over HTTPS and appear at the host's address; a custom domain is optional and costs money.
  • Public means public: keep private details, passwords and tokens out of your site and repository.

Checklist: can you do these?

Marking a lesson as read does not prove you can do it. Skills count as demonstrated when you pass the quiz (not yet) and complete the practical tasks (not yet).

Related lessons

References and further reading

Official sources for details that can change between versions.

On this page