I'm Tracking My Dog's Walk to Mordor - On the Blockchain
My dog Finn wears a GPS tracker on every walk. One day, while looking at his cumulative distance, I thought: how far has he actually walked in total? And then the more interesting question: what if I mapped that distance onto something?
Turns out the Fellowship of the Ring walked roughly 1,800 km from the Shire to Mordor. Finn does about 5–8 km a day. That’s a journey that could take a few years of real walks, tracked in real kilometers, visualized on a real map of Middle-earth.
So I built it. A website that tracks Finn’s progress along the Fellowship’s route. Every walk counts. Every kilometer is real.
And then I made a decision that changed the whole project: I put it on the blockchain.
Why would you put a dog tracker on the blockchain?
I know how it sounds. But hear me out.
This isn’t a project that needs to scale. It doesn’t need a database, a backend, or server-side logic. It’s a small, static, personal site that updates whenever I process a new batch of GPS data. The perfect scope for what the “permaweb” is actually good at.
The traditional approach would be: rent a domain from some registrar, pay monthly for a VPS or a hosting plan, hope nothing breaks, remember to renew everything, and accept that if I stop paying one day, it all disappears.
But this is a journal of my dog’s life. I don’t want it to disappear.
The stack
The frontend is Vue 3 with Vite and Tailwind CSS v4, running on Bun.
The interesting part is the data pipeline. Finn wears a Tractive GPS on his collar. I export his walks as GPX files, then run them through a Bun CLI tool I wrote that converts the raw GPS data into anonymized walk records, just distances, no actual coordinates. Nobody needs to know which park we go to.
Those JSON files get bundled into the static build. bun run build, done.
Deployment: pay once, live forever
Here’s where it gets different from any project I’ve ever shipped.
The built files go to Arweave, a blockchain designed specifically for permanent data storage. You pay once, in crypto, and your files are stored across hundreds of nodes with economic incentives to keep them available. Not for a year. Not for ten years. Permanently.
The cost? Cents. Literally cents for a small static site.
The domain is fellowfinn.eth, an ENS (Ethereum Name Service) name. It’s not rented from a registrar. It’s an NFT sitting in my wallet. I set the content hash to point to the Arweave manifest, and the site is live at fellowfinn.eth.limo.
The full deployment is three steps:
bun run build
turbo upload-folder # uploads dist/ to Arweave
# update ENS content hash via app.ens.domains
Build, upload, point. No CI/CD pipeline, no server to SSH into, no Docker containers. It’s the simplest deployment I’ve ever had.
What “ownership” means here
When you register a .com domain, you don’t own it. You’re renting it. There’s a chain of authority above you, ICANN controls the root DNS, delegates .com to Verisign, who authorizes registrars to sell you a lease. Stop paying, it’s gone. Get flagged by some policy, it’s gone. The registrar decides they don’t like your content, gone. You’re a tenant, not an owner.
fellowfinn.eth works differently. When I registered it, the ENS smart contract minted a token and assigned it to my wallet address. That token gives me the right to set records on that name, where it points, what content it serves. The only person who can change those records is whoever holds the private key to my wallet.
This isn’t ownership as a legal concept, enforced by contracts and courts. It’s ownership as a mathematical concept. I own fellowfinn.eth because I hold a private key that can produce a valid cryptographic signature. No court, no company, no government can produce that signature without my key. It’s not that they’re not allowed to take it, they literally cannot.
It’s the same kind of ownership you have over a physical object. If you hold a rock in your hand, you have it. Nobody needs to agree that it’s yours. The possession is the ownership.
Three layers, each decentralized
The whole project sits on three layers, and none of them have a single point of failure:
Ethereum holds the identity: the ENS name, the pointer to the content. Secured by thousands of validators worldwide. Arweave holds the data: the actual website files, stored permanently across hundreds of nodes, paid once. My wallet ties it together. One private key controls the domain, the content hash, the payment history.
Every version of the site is permanently preserved on Arweave. Each deployment is a snapshot in time. In 10 years, every walk Finn ever took will still be there, on a network that doesn’t need me to keep it alive.
The tradeoffs are real
I’m not going to pretend this is all upside. ENS names expire, I registered for a few years, and if I forget to renew, someone else can take it. There’s no customer support. If I lose my private key, nobody can help me recover fellowfinn.eth. The same property that makes it uncensorable makes it unrecoverable.
And let’s be honest, accessibility is still rough. Most people can’t just type .eth into their browser. The .eth.limo gateway bridges that gap, but it’s an extra layer of indirection that regular hosting doesn’t need.
For a commercial product, I wouldn’t choose this stack. But for a personal archive, a journal of my dog’s life that I want to outlast any single service or payment cycle, it’s exactly right.
This is what Web3 was supposed to be about
Not speculation, not monkey JPEGs. Actual ownership of your digital presence.
A small, personal project about a dog walking to Mordor, built on infrastructure that makes it mathematically, permanently mine. No landlords, no terms of service. Just a wallet, a key, and a dog who has no idea he’s on an epic quest.
Build your own permanent website
Want to try this yourself? I put together a ready-to-go prompt you can paste into Claude Code or Cursor. It scaffolds a Vue 3 + Vite + Tailwind project with Arweave deployment and ENS domain setup.
No crypto experience required. The README walks you through everything from installing Bun to connecting your ENS domain.
You’ll need Bun, an Ethereum wallet (Rabby or MetaMask) with a small amount of ETH (~$1 worth is plenty, ~$6 if you want an ENS domain), and optionally an ENS domain from app.ens.domains.
You get a clean static site scaffold, one-command deployment to Arweave, and ENS integration so your site lives at yourname.eth.limo.
Download the prompt, paste it into Claude Code, replace the config values with your own, and you’ll have a live site on the blockchain in under an hour.
The total cost: a few cents for Arweave storage, and whatever your ENS name costs to register.
You can follow Finn’s journey at fellowfinn.eth.limo. If you want to hear about more projects like this, and about building SaaS, Laravel, and developer life, subscribe to my newsletter.