- HTML 100%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| images | ||
| index.html | ||
| README.md | ||
hello-world-web
A Hello World page for MI 249, built and deployed entirely on self-hosted infrastructure instead of GitHub and Netlify.
- Live site: https://mi249.tunnel.schatzberglab.com/
- Source code: https://git.tunnel.schatzberglab.com
About
The page is plain HTML5 with no CSS, as the assignment requires. It shows a diagram of how the site gets from my editor to a visitor's browser, and it uses <head> metadata for search engines, link previews, and the browser tab icon.
How it's deployed
My apartment's internet doesn't allow port forwarding, so the site can't be served directly from home. Instead:
- Forgejo (self-hosted Git server) stores the repository. I push to it from my laptop.
- A webhook from Forgejo tells Coolify (self-hosted deployment platform) that there's a new commit.
- Coolify pulls the code, builds a container, and serves it behind its Traefik reverse proxy.
- Cloudflare hosts DNS for the domain and points it at a public AWS server.
- A NetBird reverse proxy on the AWS server receives HTTPS requests and sends them through a WireGuard tunnel back to my apartment, so no ports are open at home.
flowchart LR
subgraph Home["My apartment (no port forwarding)"]
Laptop -->|git push| Forgejo
Forgejo -->|webhook| Coolify
Coolify -->|builds container| Traefik
end
subgraph AWS["AWS (public IP)"]
NetBird["NetBird reverse proxy"]
end
Browser -->|DNS lookup| Cloudflare
Browser <-->|HTTPS| NetBird
NetBird <-->|WireGuard tunnel| Traefik
Metadata in <head>
| Tag | Purpose |
|---|---|
charset |
Uses UTF-8 so any character or emoji displays correctly |
viewport |
Renders the page at the device's real width on phones |
description |
The summary shown in search results |
author |
Credits the page's author |
robots |
Lets search engines index the page and follow its links |
canonical |
Marks the official URL of the page |
icon |
An emoji favicon for the browser tab, embedded as an SVG data URI |
theme-color |
Tints the browser's address bar on mobile |
og:* |
Open Graph tags that control the preview card on Discord, iMessage, Slack, etc. |
Project structure
.
├── index.html # The page
├── images/
│ ├── pipeline.svg # Diagram source (editable)
│ └── pipeline.png # Rendered diagram used on the page and in link previews
└── README.md
Running locally
Open index.html in a browser, or serve the folder:
python -m http.server
Then visit http://localhost:8000.
To regenerate the diagram after editing the SVG:
rsvg-convert -w 900 -h 420 images/pipeline.svg -o images/pipeline.png
AI usage disclaimer
I used Claude (Anthropic's AI assistant, through Claude Code) while working on this lab. It:
- Suggested ways to meet the "exceptional work" criteria, adapted to my Forgejo and Coolify setup
- Created the deployment pipeline diagram (
images/pipeline.svgandimages/pipeline.png) from my description of the setup - Drafted this README
I designed and set up the infrastructure myself (Forgejo, Coolify, NetBird, AWS and Cloudflare), chose what went on the page, and reviewed and edited everything the AI produced.
