The Rest
The URL Is the Honest One
Everything else on the screen can lie about where you are. The sidebar highlight, the page title, the breadcrumb — all of it is the application describing itself, and an application can describe itself wrong. The URL can't, or shouldn't. It's the one piece of location that's universal, persistent, and independent of whatever the interface happens to be pretending in the moment. It's the coordinate system of the web — and for anything web-based, single-page apps most of all, it's the deepest promise navigation makes.
The promise is plain: when the URL changes, you've moved; when it holds, you haven't. The person who understands the web — which is nearly everyone, even the ones who couldn't say so — reads the address bar to know where they are. So every real navigation should change the URL, and every URL change should mean a real navigation. Parity between the two is the contract. Break it in either direction and you've made the person's most reliable instrument start lying to them.
The test for whether something earns a URL is whether a person could paste it into a browser on another device and land somewhere that makes sense. If they could send this exact view to a colleague, if the back button should return here, if the screen has its own title and purpose, if a refresh should restore it — it needs a URL. And the inverse holds just as hard: opening a modal, expanding an accordion, switching a tab inside a component, a half-finished form step, a spinner — those aren't places. Put them in the URL and you've over-specified the location and stuffed the history stack with states the back button was never meant to walk through.
A URL isn't only a technical address, either — it's readable text a person sees, types, copies, and sends. So its shape is interface. The hierarchy of the path should mirror the hierarchy of the app: /section/subsection/record/view tells the person — and the browser, and the crawler — exactly where they are and how the place is organized.
Which is why raw UUIDs in a URL are rude. /team/members/12847362-f8a3-4c1d-b93e-7f2a18dc4501/profile makes a person decode a database key before they can understand where they're standing. The UUID was generated for the system's convenience, not theirs; it can't be read, remembered, guessed, typed, or understood by a colleague who receives it as a link. It is the system talking to itself through a channel that belongs to the user. The fix isn't always a pretty slug — some records have no natural name, and that's fine — but the structure around the identifier should always give it meaning: /orders/7f2a18dc beats /7f2a18dc, and /team/members/7f2a18dc/profile beats both. Where a thing does have a name — a person, an organization, a project, an article — use it. /team/members/sarah-chen can be read, remembered, and shared. It respects the person's relationship with the address.
(The same structure that serves the person serves the search engine — hierarchy in the path, readable slugs, consistent patterns, every segment earning its place. That isn't a coincidence: SEO's URL rules are just a formalization of the same promise — that an address should legibly say where a thing lives and what it is. Serve the human and the crawler comes along for free.)
Single-page apps are where this promise quietly dies, because they can swap the entire view without touching the URL — and it's easy, so it happens. The screen says you've gone somewhere new; the URL says you never moved; the back button, reading the URL, says there's nowhere to return to; and a refresh drops you somewhere else entirely. Every serious framework ships routing tools for exactly this reason, and using them isn't optional polish — it's how a client-side app keeps the same promises a plain server-rendered page kept for free: every named route gets a URL, navigation writes to history, view state stays out of the address unless it passes the share test, and a link opened cold restores the right place.
The whole contract collapses to one move: close the tab, reopen the last URL. Land where you were, and the URL told the truth. Land anywhere else, and it was lying the entire time — along with everything on the screen that agreed with it.