
Click an ipfs:// link in most browsers today and nothing happens, or worse, the browser tries to search for it as plain text. This series has covered gateways as the practical way IPFS content reaches a browser, but not why that workaround is necessary at all: browsers, with one narrow exception, simply don't understand the ipfs:// URI scheme natively, and the story of why, and what actually gets built to work around it, is its own piece of this ecosystem.
TL;DR:
ipfs:// and ipns:// URI schemes natively; Opera for Android is a rare exception, translating requests to a public gateway subdomain under the hoodipfs:// links mostly don't work out of the boxhttps://gateway.example/ipfs/CID, became the practical, universally-working way to share IPFS content, working in any browser with zero extension or configuration requiredipfs:// at allipfs://<CID> and ipns://<name> are real, defined URI schemes, the intended, native way to reference IPFS content the same way https:// references a web page. But defining a scheme and having browsers act on it are different things, and almost no mainstream browser ships built-in support for either one. Opera for Android is the notable exception, shipping native handling that translates an ipfs:// request to a URL on a public subdomain gateway behind the scenes, effectively doing automatically what this section's later coverage of gateway URLs describes doing manually everywhere else.
The specific technical reason most browsers fall short traces back to Chromium, the engine underneath Chrome, Edge, and the majority of browsers in use today. Firefox supports registering custom protocol handlers declaratively, through a protocol_handlers entry in an extension's manifest, which is exactly the mechanism a browser extension needs to make ipfs:// links open correctly. Chromium doesn't support that manifest-based approach at all, which means the same clean solution simply isn't available to any extension running there, regardless of how well-built it is.
IPFS Companion, a browser extension that connects to a locally running IPFS node, exists specifically to bridge this gap, and it has to solve the problem differently depending on which engine it's running in. On Firefox, it uses the real protocol_handlers mechanism, registering genuine handling for ipfs://, ipns://, and dweb: links. On Chromium, lacking that option, it falls back to a workaround: a user types or clicks an ipfs://CID link, the browser treats it as a search query since it doesn't recognize the scheme, and the extension intercepts that search, extracts the actual CID, and redirects to a gateway URL. It works, but it depends on the browser's search-handling behavior rather than a proper protocol registration, a meaningfully more fragile mechanism than what Firefox allows.
Given that inconsistency, an ipfs:// link can't be relied on to work for an arbitrary visitor: it depends on their specific browser, and on Chromium, on having a specific extension installed and configured correctly. A gateway URL sidesteps all of that entirely, since it's just a regular https:// link any browser already knows exactly how to handle, no extension, no protocol registration, no local node required. This is the practical reason gateway links, not ipfs:// links, are what actually gets shared in practice across the ecosystem, not a failure to adopt the "proper" scheme, but a direct response to how inconsistently browsers actually support it.
Brave, built on Chromium but known for shipping privacy and decentralization-adjacent features other Chromium browsers don't bother with, is a natural place to look for an exception to this pattern. As of this writing it isn't one: native ipfs:// handling has been an open, actively discussed request in Brave's own issue tracker rather than a shipped feature, running into the same underlying Chromium limitation described above rather than something Brave's own team can route around unilaterally. It's a useful data point either way, it shows the gap isn't a lack of interest from privacy-focused browser vendors, it's a real constraint at the engine level that individual browsers built on Chromium can't fully solve on their own.
Every gateway URL this series has referenced, AIOZ Pin's dedicated gateways included, exists in the specific gap this article describes: the difference between what ipfs:// is supposed to do and what browsers will actually do with it today. A gateway link works identically whether a visitor is running Firefox with IPFS Companion installed, Chromium with nothing installed at all, or any other browser that will likely never ship native ipfs:// support. That universal compatibility, not a technical shortcut, is the entire reason gateway URLs are the link format that actually gets used.
Do browsers support ipfs:// links natively? Almost none do. Opera for Android is a rare exception, translating the request to a public gateway subdomain automatically. Most other browsers, including Chromium-based ones, don't recognize the scheme at all.
Why doesn't Chrome support ipfs:// the way Firefox extensions can? Chromium doesn't support the manifest-based custom protocol handler mechanism Firefox uses, so an extension can't register real handling for the scheme there the same way it can on Firefox.
What does IPFS Companion actually do? It connects to a locally running IPFS node and bridges ipfs:///ipns:///dweb: links to it, using a real protocol handler on Firefox and a search-query interception workaround on Chromium, since that's the only option available there.
Why do people share gateway links instead of ipfs:// links? Because a gateway URL is a plain https:// link that works in any browser without an extension or configuration, while an ipfs:// link's behavior depends heavily on which browser and setup the recipient has.
Is ipfs:// support likely to improve across more browsers? The core limitation is Chromium's lack of manifest-based protocol handler support, which is outside any single extension's control; broader native support would need engine-level changes, not just extension updates.
Does AIOZ Pin's gateway depend on visitors having IPFS Companion installed? No. A gateway URL is a standard HTTP link that works in any browser as-is, which is exactly why gateway links, not raw ipfs:// links, are the practical way AIOZ Pin content actually gets shared and accessed.

Pinning services can remove their own copy of a file. They cannot remove it from IPFS. Here is exactly what a takedown does and does not accomplish.

libp2p connections can run over more than one transport. Here is exactly what changes with QUIC instead of TCP, and why IPFS dials both at once.

The DHT answers who has a CID. GossipSub answers a different question: how do peers push real-time updates to everyone listening, without a lookup at all.

js-ipfs is deprecated. Helia is what replaced it: a modular, TypeScript-first IPFS implementation built for the browser and Node.js. Here is how it fits.

Not every retrieval needs the whole DAG. IPLD Selectors describe exactly which nodes to traverse and match, so a client can fetch a slice, not everything.

Almost no browser understands ipfs:// links natively. Here is exactly why, what IPFS Companion actually does about it, and why gateway URLs took over instead.