Three chords and a domain name.
Live at indiewebispunk.net.
One hand-written HTML file. No build step, no framework, no bundler, no package manager, no trackers, no analytics, no cookies, and no fonts from anybody else's server. If that sounds like a constraint, read the manifesto.
| Path | |
|---|---|
index.html | The whole site — markup, styles and script in one file |
indieweb-is-punk-manifesto.md | The manifesto as plain Markdown, served at / and linked from the page |
fonts/ | Courier Prime, self-hosted (see Fonts) |
indieweb-is-punk.png | The header logo, background flood-filled to transparency |
IndieWeb.png | Original source art, kept for reference — not served |
og-image.png | 1200×630 social card |
favicon.ico, icon-*.png, apple-touch-icon.png | Icons, cut from the magenta "P" |
deploy/ | nginx server block, security-headers snippet, traffic.sh — not served |
python3 -m http.server 8000
That's the entire toolchain. Open http://localhost:8000.
Note that the "Copy the manifesto" buttons need a secure context, so they
stay inert over plain http:// and only work once it's on HTTPS.
nginx on a Hetzner box, alongside jimmitchell.org. The web root is this repo, so deploying is:
git pull
deploy/ holds the nginx server block, the security-headers snippet, and
traffic.sh. All of it gets denied by nginx along with .git, since it lives
inside the web root but isn't part of the site.
Since nothing here tracks visitors, traffic means reading the access log.
The server block writes its own — /var/log/nginx/indiewebispunk.net.access.log,
kept separate from jimmitchell.org's on the same box — and deploy/traffic.sh
summarises the last N days of it:
sudo sh deploy/traffic.sh 7
Per day: requests, human vs bot, unique IPs, pageviews. Then top pages, external referrers, and user agents. It reads rotated and gzipped logs too, so N can reach back past today's file.
Courier Prime, self-hosted as four woff2 files (~49 KB total), latin subset. Licensed under the SIL Open Font License 1.1, which permits redistribution.
Self-hosted rather than pulled from a font CDN, because a page whose footer says "no fonts from anybody else's server" ought to mean it.
The page is marked up as an h-entry
with p-name, p-summary, e-content, dt-published, u-url and a nested
p-author h-card. The title is carried by the logo's alt text, so the
image is the p-name rather than duplicating it in a hidden element.
Inspired by Jamie Thingelstad's original "IndieWeb is Punk" post, Jim Mitchell's response and t-shirt tribute, and the IndieWeb community's guiding principles at indieweb.org/principles.
There's a shirt and a sticker.
MIT © 2026 Jim Mitchell. Take it, fork it, put it on your own site.
One carve-out: the bundled fonts are not covered by the MIT grant. Courier Prime is licensed separately under the SIL Open Font License 1.1 and stays under the OFL wherever it travels — including in forks of this repo.
19 commits
HTML
87.3%
Shell
12.7%
Three chords and a domain name.
Live at indiewebispunk.net.
One hand-written HTML file. No build step, no framework, no bundler, no package manager, no trackers, no analytics, no cookies, and no fonts from anybody else's server. If that sounds like a constraint, read the manifesto.
| Path | |
|---|---|
index.html | The whole site — markup, styles and script in one file |
indieweb-is-punk-manifesto.md | The manifesto as plain Markdown, served at / and linked from the page |
fonts/ | Courier Prime, self-hosted (see Fonts) |
indieweb-is-punk.png | The header logo, background flood-filled to transparency |
IndieWeb.png | Original source art, kept for reference — not served |
og-image.png | 1200×630 social card |
favicon.ico, icon-*.png, apple-touch-icon.png | Icons, cut from the magenta "P" |
deploy/ | nginx server block, security-headers snippet, traffic.sh — not served |
python3 -m http.server 8000
That's the entire toolchain. Open http://localhost:8000.
Note that the "Copy the manifesto" buttons need a secure context, so they
stay inert over plain http:// and only work once it's on HTTPS.
nginx on a Hetzner box, alongside jimmitchell.org. The web root is this repo, so deploying is:
git pull
deploy/ holds the nginx server block, the security-headers snippet, and
traffic.sh. All of it gets denied by nginx along with .git, since it lives
inside the web root but isn't part of the site.
Since nothing here tracks visitors, traffic means reading the access log.
The server block writes its own — /var/log/nginx/indiewebispunk.net.access.log,
kept separate from jimmitchell.org's on the same box — and deploy/traffic.sh
summarises the last N days of it:
sudo sh deploy/traffic.sh 7
Per day: requests, human vs bot, unique IPs, pageviews. Then top pages, external referrers, and user agents. It reads rotated and gzipped logs too, so N can reach back past today's file.
Courier Prime, self-hosted as four woff2 files (~49 KB total), latin subset. Licensed under the SIL Open Font License 1.1, which permits redistribution.
Self-hosted rather than pulled from a font CDN, because a page whose footer says "no fonts from anybody else's server" ought to mean it.
The page is marked up as an h-entry
with p-name, p-summary, e-content, dt-published, u-url and a nested
p-author h-card. The title is carried by the logo's alt text, so the
image is the p-name rather than duplicating it in a hidden element.
Inspired by Jamie Thingelstad's original "IndieWeb is Punk" post, Jim Mitchell's response and t-shirt tribute, and the IndieWeb community's guiding principles at indieweb.org/principles.
There's a shirt and a sticker.
MIT © 2026 Jim Mitchell. Take it, fork it, put it on your own site.
One carve-out: the bundled fonts are not covered by the MIT grant. Courier Prime is licensed separately under the SIL Open Font License 1.1 and stays under the OFL wherever it travels — including in forks of this repo.
19 commits
HTML
87.3%
Shell
12.7%