An alternative to URLs
URLs are a problem. But why are they a problem, you ask?
Because we ask one string to do two jobs. It has to be a readable place people can share — and the only address every README, nav file, and CI config uses to find the resource. Rename the place for clarity, and those addresses break. You get broken links, unpaid grepping across repos, and the sense that the rename was correct while the cleanup is somehow still yours.
If you already feel that ache, start with the short essay and demo, then come back here for the diagnosis and what to do about it:
| Face | Job | Where |
|---|---|---|
Symptom |
Name what you already feel |
|
Diagnosis |
Name the mistake |
An alternative to URLs · this page |
Treatment |
What to do near-term and long-term |
Sections below · |
This article sits under the umbrella of Internet Reliability @ DevCentr — the systems-level story about making references on the internet stay usable when names and locations move. Here we stay on the HCI / DevX face: what breaks in docs and repos, and how to stop treating the pretty URL as identity.
Symptom
Cross-repo prose is the weak edge of the modern web and of multi-repo orgs. Package registries already expose reverse dependents for code. Markdown, AsciiDoc, CI configs, and marketing sites still bake path strings as if they were APIs.
What people notice:
-
Rename a docs path → another project’s README and Antora nav rot
-
Move a site → every hardcoded URL becomes archaeology
-
AI agents sweep the wrong trees because nobody recorded who depends on you
URL reliability on today’s internet is the familiar slice of this pain — not the whole claim. Same mistake shows up in package names, doc slugs, and file paths.
Diagnosis
An alternative to URLs is the claim that identity should follow the thing, not the pretty name we hang on it today. Canonical URLs, package names, and doc paths stay useful for humans. They must not be the only way machines and other projects find the resource.
This is a UX argument and, more sharply, a DevX argument: developers should not spend attention chasing renamed strings across repos.
-
Labels are for people —
/docs/api/auth,awesome-lib,hci-nerdz.github.io/…orient readers. -
Wires are for systems — fetch, cite, depend, and refactor should bind to content identity (hash / GUID / graph node) or to an explicit mutable pointer that resolves to that identity.
-
When labels must change, producers know their consumers (reverse dependency graph) so updates are search-and-fix under known trees — not org-wide guesswork.
Two naming failures (orthogonal layers)
Research and industry work on naming often gets conflated. They solve different bounds.
| Layer | What it names | Representative work |
|---|---|---|
Network / delivery |
How to fetch named data without depending on a host IP |
Named Data Networking (NDN) — e.g. NSF Future Internet work; Dr. Lan Wang / University of Memphis Networking Research Lab as a known PI node in that community |
Application / DevX |
How dependents stay correct when symbols, paths, or docs change |
Kythe / Sourcegraph graphs; OpenRewrite multi-repo recipes; Unison content-addressed definitions; producer-owned |
NDN (and similar ICN designs) decouple data from location.
They do not rewrite a Markdown link when you rename /docs/v1 to /docs/v2.
To the network those are unrelated names.
Conversely, a perfect CONSUMERS.md works the same whether bytes travel over TCP/IP or NDN.
UX complement without collapsing the layers
The human want is one sentence: I should not care where the file lives or what we currently call it, if it is still the same thing.
That want is served by stacking layers, not by pretending one layer does both jobs:
-
CAS answers “same bytes?”
-
Mutable pointer answers “same intent after an edit?”
-
Reverse consumers answer “who still holds an old label?”
-
Redirects / aliases absorb breaks on today’s IP web
Treatment
Content-addressed identity
If file_A moves and renames but bytes are unchanged, \(Hash(Bytes_{old}) = Hash(Bytes_{new})\).
Consumers that stored the hash still fetch the right object.
Human path metadata can ride inside or beside the object once retrieved.
Mutable pointers for updates
Edits change bytes → a new hash:
A fixed semantic name (/docs/latest/auth, NDN hierarchical name, IPNS-style pointer) must advance to the new hash.
Without that pointer layer, CAS alone freezes you on v1 forever — which is correct for immutability and wrong for “give me the current auth guide.”
Reverse consumer manifests (today’s gap)
Until the world stops wiring on strings, producers maintain an explicit inbound list:
# Consumers (reverse dependencies)
| Consumer | Tree | Coupling | Notes |
|---|---|---|---|
| docs hub | `…/dev-centr/docs` | antora / xref | playbook + nav |
| sibling site | `…/foo/bar` | hardcoded URL | `https://example.com/docs/…` |
Rules that make it work:
-
Own the list on the producer
-
Record coupling type (package import vs URL vs Antora component vs secret name)
-
Prefer aliases over renames
-
Let agents search listed trees instead of guessing
Name the file CONSUMERS.md or REVERSE_DEPENDENCIES.md — not bare DEPENDENCIES.md (that usually means outbound deps / SBOM).
Pragmatic absorb layer
Cool URIs don’t change (W3C). When they must: 301s, Antora page aliases, vanity domains, CI link checkers. These do not replace identity; they buy time.
Near-term adoption (multi-repo orgs)
-
Freeze public path contracts where possible; alias instead of rename
-
Add
CONSUMERS.mdon anything other people hardcode -
Teach agents: read consumers → search those trees → open PRs
-
Keep redirects forever for anything that ever was public
-
Prefer hub docs (
xref:) over raw foreign URLs
Long-term adoption (internet-shaped)
-
Publish content-addressed artifacts (or graph nodes) as the cite/fetch target
-
Keep human URLs as labels that resolve through a pointer service
-
Grow reverse-deps from manifests toward indexed graphs (Kythe-class) where scale demands
-
Treat NDN/ICN as a delivery upgrade, not a substitute for application graphs
Relationship to connectome-fs
connectome-fs attacks the same mistake at the filesystem / association plane: path strings are navigation slices; nodes and edges are truth. Unison shows content-addressed identity for code definitions; connectome-fs aims at the substrate under many languages and non-code artifacts.
See the sibling explanation on the connectome-fs docs hub (Labels versus wires) and xref-style links from Semantic change units.
Public faces
| Face | Where |
|---|---|
Systems umbrella (DevCentr) |
|
Symptom essay |
|
Diagnosis essay |
|
Symptom demo |
|
connectome-fs |
Project site · docs explanation Labels versus wires |
Literature / sources
-
Case study: agent voice vs reader voice — how this cluster’s titles and openings were rewritten (DevCentr agent-rules wiki)
-
Gemini export — Dependency Management and Network Architecture (2026-08-11)
-
Cursor analysis seed (2026-08-11)
-
W3C: Cool URIs don’t change
-
NDN project materials; Unison language; Sourcegraph / Kythe; OpenRewrite / Moderne