We spend weeks agonizing over button radii and hover states, then generate URLs that look like a cat walked across the keyboard. This is backwards. The URL is one of the most visible, most shared, and most permanent pieces of interface you'll ever ship. People read them, guess them, edit them, and email them to each other. A good one is quietly reassuring. A bad one leaks your database schema to the world.
Every URL you publish is a small commitment: this address will point at this thing. People bookmark it, link to it, paste it into documents that outlive your redesign. Break it and you break trust — the dreaded 404 is a promise you failed to keep. This is why the classic advice has aged so well:
Cool URIs don't change. It takes commitment to keep them alive, and that commitment is the whole point.
Design URLs as if you'll have to honor them in ten years, because you will. That single constraint filters out most of the bad patterns before you ever type them.
Compare two addresses for the same article:
https://example.com/index.php?p=482&cat=7&ref=nav
https://example.com/writing/urls-are-a-user-interfaceThe second one tells you where you are, what you're reading, and how to get to the section above it — just by reading. You could delete the last segment and reasonably expect to land on the writing archive. That guessability isn't an accident; it's information architecture made visible in the address bar.
/products/standing-desk beats /products/8823 for everyone who has to read it..php, #!, and ?id= are all telling the world about your plumbing.A well-structured URL space is a site map you didn't have to draw. When paths mirror how content is actually organized, the address bar becomes a navigation tool: users climb, trim, and jump around by editing the string directly. That's a power-user affordance you get for free, purely from taking hierarchy seriously.
And when the structure does have to change — sites grow, sections get renamed, the inevitable happens — you owe the old URLs a graceful exit. A 301 redirect is how you keep the promise even after the thing behind it moves:
/blog/2019/my-post 301 → /writing/my-postNobody's bookmark breaks. Nobody's link rots. The commitment survives the reorganization.
The lesson underneath all of this is simple: a URL isn't a technical detail that leaks out of your routing config. It's the front door. Treat it with the same care you'd give any other surface a user touches, because it's often the first one they see and the last one they'll forget.