Index

Mirrors

This site is deliberately hard to take offline. The same pages are served from more than one independent host, and the source that builds them is mirrored across several code forges, so if any single provider disappears, both the live site and its source survive. The approach follows the Privacy Guides mirror model: one source of truth, many mirrors.


Live site

Independent hosts serving the same site. The first three follow every push; the 4EVERLAND copy serves from IPFS and moves only at each release, like the permanent mirrors further down.

Cloudflare Pages · primary thebenmeadows.com Netlify · second host thebenmeadows.netlify.app Pages direct URL tbm-linktree.pages.dev Codeberg Pages · third host thebenmeadows.codeberg.page sourcehut pages · fourth host thebenmeadows.srht.site 4EVERLAND · releases only thebenmeadows-cbvr.ipfs.4everland.app

Tor

The same pages as an onion service, reachable only through the Tor network. It runs on a server I control and is not published in DNS, so it keeps working if the domain, Cloudflare, or Netlify does not. Open it in Tor Browser; an ordinary browser cannot resolve it.

Onion service meadowsvn6ah25czpa3mv735fizgdz6xp7vlzeqxpydfwnnsygtcleyd.onion

One caveat: the minted editions on essentialism are fetched live from tzkt.io and bootloader.art, so that gallery stays empty over Tor if those services refuse Tor traffic. The generator itself runs locally and works either way.

I2P

The same pages again on I2P, a different anonymity network from Tor and served by the same machine. Two networks rather than one means neither being blocked takes the site with it. You need an I2P router to open it.

Eepsite d24ftl3svuczr2neg7dhlys7hgj4oinz3u3d5rwd2t4rbkbwt4wa.b32.i2p

Names

The same site under blockchain name systems. Each name is set once and follows every release on its own, so none of them can quietly go stale. Brave resolves the .eth and .sol names natively.

thebenmeadows.eth · Ethereum thebenmeadows.eth.limo thebenmeadows.tez · Tezos thebenmeadows.tez.page thebenmeadows.sol · Solana thebenmeadows.sol.site ar://thebenmeadows · Arweave thebenmeadows.permagate.io thebenmeadows.sol.site the .sol name's own web bridge

The Ethereum, Tezos, and Solana names all point at the same IPFS name, ipns://k51qzi5uqu5dkx54ehvkna983zjtfn04eu4sklgx2ag1tozh9js5p9cn5jwqmy, published from this site's own IPFS nodes. The Arweave name points at a permanent copy of each release; some ar.io gateways are still catching up to it.

The domain is a content name as well. A DNSLink record at _dnslink.thebenmeadows.com carries the hash of the current build, so a client that speaks IPFS can open ipfs://thebenmeadows.com and fetch the pages from the network instead of from this server. No blockchain and no gateway: a DNS lookup answers it.

Six machines hold that copy, five of mine and one pinning service. One publishes the name; the rest read the hash it published and fetch the blocks that match. A copy can lag, but it cannot disagree, because only one machine ever writes.

Nostr

The site is also published as an nsite: every file lives as a signed blob on Blossom servers, with a manifest event on Nostr relays under the same key this site publishes at /.well-known/nostr.json. No conventional host involved.

Part of that machinery is mine. The manifest rides four relays, two of them run under this roof: relay.mdws.me on Cloudflare Workers and relay2.mdws.me, a strfry on my own hardware that only I can write to. The files sit on five Blossom servers, and one of them, blossom.mdws.me, is also mine: uploads locked to my key, blobs never pruned. If every third-party relay and blob host disappeared, the nsite would still resolve from machines I control.

nsite npub1wldqfuy…nq29.nsite.run

Small web

The same pages on five pre-web protocols, generated from the site's own search index at each release. You need a Gemini client (Lagrange, Amfora) or a gopher client (lynx works) - ordinary browsers speak neither. The last three need nothing but a terminal.

Gemini gemini://gemini.thebenmeadows.com Gopher gopher://gopher.thebenmeadows.com
SSH ssh -p 2222 [email protected]
Telnet telnet text.thebenmeadows.com
FTP · anonymous ftp://text.thebenmeadows.com

No login for any of them: SSH takes the user text with no password and drops you straight into a read-only pager. FTP is plain, deliberately: these pages are public, so there is nothing to encrypt, and clients this old predate TLS. When you want the encrypted path, that is what HTTPS, the onion service and Gemini are for.

BitTorrent

The whole site as a torrent, rebuilt on every push. It is the one copy where readers become mirrors: every client left seeding is capacity nobody had to provision. It carries no tracker, so peers find each other over the DHT and no third party sits in the middle of a download.

Torrent · current release thebenmeadows.com/tbm.torrent

An empty swarm would normally make a torrent useless, so this one names this site as a webseed: with no peers at all your client just downloads over HTTPS from here, and with peers it takes the pieces from them instead. The worst case is an ordinary download. Each release is a different torrent with its own magnet link, held inside the file above, because the content it names has changed.

Offline

Every mirror above answers "can I still reach it". This one answers "can I hold it": the whole site as a single ZIM file, attached to each release. It opens in Kiwix on a phone or from a USB stick, with no network at all, and the format needs no cooperation from this site to stay readable.

ZIM archive · current release github.com/TheBenMeadows/tbm/releases

Feeds

One entry per release, in both syndication formats, with WebSub pings on deploy so subscribed readers hear about releases without polling. Listed in the I ♥︎ RSS directory.

Atom /feed.xml RSS 2.0 /rss.xml

Source code

The repository, mirrored to independent forges and kept in sync automatically - each holds the full history.

GitHub · source of truth github.com/TheBenMeadows/tbm Codeberg codeberg.org/thebenmeadows/tbm Gitea gitea.com/thebenmeadows/tbm GitLab gitlab.com/TheBenMeadows/tbm SourceHut git.sr.ht/~thebenmeadows/tbm Tangled · AT Protocol tangled.org/thebenmeadows.com/tbm Radicle · peer-to-peer rad:z3vBEjEJAvd3CjciS1JBiFzHda3KA Nostr · GRASP nostr://npub1wld…4nq29/tbm

The last two have no host. On Radicle the repository is replicated between peer-to-peer nodes, so it stays reachable for as long as any one node still seeds it: rad clone rad:z3vBEjEJAvd3CjciS1JBiFzHda3KA fetches it from whichever node answers first. On Nostr, signed GRASP events are the authority and git servers are interchangeable relays: with the ngit plugin installed, git clone nostr://npub1wldqfuy0yge4fvxukdm43gze2ral9dnp5avlps5a6t8q0vyv2nds84nq29/tbm pulls from any server carrying it. No forge, no account, nothing to take down.

Archived

Point-in-time snapshots held by a third party, outside any host above.

Wayback Machine · latest web.archive.org Wayback Machine · all snapshots web.archive.org archive.today · second web archive archive.ph Software Heritage · the source archive.softwareheritage.org

Three of these keep the pages and one keeps the source. A web archive and a code archive fail for different reasons and hold different things, so neither can restore what the other has: Software Heritage takes the repository with its full history, which is what rebuilds the site, while the page archives take the site as a reader saw it on a given day, which is what survives the repository being wrong.

Verify

Every build publishes manifest.json, listing the SHA-256 of every file it shipped. Hash the files you received and compare. That catches a mirror that has gone stale, and it catches a gateway that rewrote the page on its way to you: some public IPFS gateways do inject their own script, so the copy you are handed is not always the copy that was stored.

Each release's manifest hash is signed with my Nostr key and timestamped into the Bitcoin blockchain with OpenTimestamps, so the signature says who published it and the anchor says roughly when. The signature covers the newest release, and this site deploys ahead of releases by design, so the live manifest usually hashes differently than the signed one; the release-pinned mirrors (Arweave, the nsite, 4EVERLAND) are the copies it matches exactly. Proofs are served at commitments/<hash>.ots here and on every mirror, one per release, named for the hash they attest, and browsable in commitments/ in the repository.

To fetch the signature itself, ask any of the relays for my latest release event with nak:

nak req -k 30078 -a 77da04f08f223354b0dcb37758a05950fbf2b661a759f0c29dd2ce07b08c54db \
    -d thebenmeadows.com wss://relay2.mdws.me

The event's content names the manifest hash, the commit, the Arweave transaction and the proof path; kind 30078 is replaceable, so relays keep only the newest release's signature. Older releases keep their Bitcoin proofs in commitments/, but their Nostr signatures are replaced with each new release.

The manifest also carries this mirror list itself, as a mirrors array. This page dies with the site that serves it; the manifest is replicated to IPFS, Arweave and Nostr with everything else. Whichever copy you are reading, its manifest names every other copy, and the signature tells you nobody edited the list on the way.

Curious how it's put together? See the tech stack.