Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
d5673ca
Add INTEGRATION document
markg85 May 12, 2022
9630240
Update INTEGRATION.md
markg85 Nov 21, 2022
b23caf5
Merge branch 'ipfs:main' into master
markg85 Nov 21, 2022
f956141
rewrote integration document
markg85 Nov 26, 2022
8a65c2c
Remove drawio files, we're using mermaid now
markg85 Nov 26, 2022
0e8fa0d
follow the template
markg85 Nov 26, 2022
81adfd0
linter fixes
markg85 Nov 26, 2022
ed0fe22
a few more linter fixes
markg85 Nov 26, 2022
0d6b8d6
wip image instead
markg85 Nov 28, 2022
0dd13f2
review feedback and updated to new concepts
markg85 Nov 29, 2022
d362c62
Refer to the new file as gateways (plural).
markg85 Nov 29, 2022
7ce0432
Move integrations document to:
markg85 Dec 8, 2022
9e5cd95
template fixes
markg85 Dec 8, 2022
4d80040
280. Not 180.
markg85 Dec 8, 2022
50b70cf
Add global configuration details
markg85 Dec 11, 2022
c6699f7
Little less bold
markg85 Dec 11, 2022
32b1cfd
Reword the compatibility section and fix some review feedback.
markg85 Sep 25, 2023
3990b3d
Merge branch 'main' into master
markg85 Sep 25, 2023
72cdde2
Merge origin/main into markg85-master
lidel Oct 3, 2023
6ee4e19
ipip-280: update and split into specs and ipip
lidel Oct 3, 2023
6290ead
fix: typos and clarify file encoding
lidel Dec 16, 2025
85702ce
fix: clarify single vs multiple URL handling in gateway file
lidel Dec 16, 2025
9d0024f
Merge remote-tracking branch 'origin/main' into pr-280
lidel Dec 16, 2025
e657c46
docs: document out-of-scope alternatives
lidel Dec 16, 2025
a5334ca
fix: remove stray word in curl section
lidel Dec 16, 2025
c65d0a6
fix: simplify and fix OS-specific path handling
lidel Dec 16, 2025
65e6099
chore: update metadata and relax MUST to SHOULD
lidel Dec 16, 2025
7acc773
fix: clarify gateway URL requirements
lidel Dec 16, 2025
e8581ce
fix: capitalize SHOULD for RFC 2119 consistency
lidel Dec 16, 2025
81e97eb
chore: add libp2p-gateway to integratingHttpGateways
lidel Dec 16, 2025
22779d6
chore: mark IPIP as ratified (implemented since 2022)
lidel Dec 16, 2025
b4e73a2
docs: add official ffmpeg docs reference
lidel Dec 16, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
107 changes: 107 additions & 0 deletions src/http-gateways/gateway-detection.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
---
title: Detecting User-Preferred IPFS Gateway
description: >
Specification of the rules and standards for detecting and identifying
user-preferred IPFS gateways within applications, enabling seamless
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
user-preferred IPFS gateways within applications, enabling seamless
user-preferred IPFS Gateways within applications, enabling seamless

integration and user control.
date: 2025-12-16
maturity: reliable
editors:
- name: Mark Gaiser
github: markg85
- name: Marcin Rataj
github: lidel
url: https://lidel.org/
affiliation:
name: Shipyard
url: https://ipshipyard.com
tags: ['httpGateways', 'integratingHttpGateways']
order: 99
---


## Introduction

This document defines conventions for how applications can identify available
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
This document defines conventions for how applications can identify available
This document defines conventions for how applications can identify an available

IPFS gateway, and how IPFS gateway implementations can signal own endpoint to
Copy link
Member

@2color 2color Dec 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
IPFS gateway, and how IPFS gateway implementations can signal own endpoint to
IPFS Gateway, and how IPFS Gateway implementations can signal their own endpoint to

client applications.

## Specification

There are two ways of hinting user-preferred gateway URL:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
There are two ways of hinting user-preferred gateway URL:
There are two ways of hinting the user-preferred gateway URL:


- Setting the `IPFS_GATEWAY` environment variable
- Creating a `gateway` file at a well-known path

Applications SHOULD evaluate these hints in order and stop on the first match:

1. Check if a valid `IPFS_GATEWAY` environment variable is set
2. Check if a valid `gateway` file is present at one of well-known filesystem paths
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
2. Check if a valid `gateway` file is present at one of well-known filesystem paths
2. Check if a valid `gateway` file is present at one of the well-known filesystem paths



### `IPFS_GATEWAY` Environment Variable

When `IPFS_GATEWAY` environment variable is set, the value SHOULD be interpreted
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
When `IPFS_GATEWAY` environment variable is set, the value SHOULD be interpreted
When the `IPFS_GATEWAY` environment variable is set, the value SHOULD be interpreted

as URL of IPFS Gateway application to use.
Copy link
Member

@2color 2color Dec 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
as URL of IPFS Gateway application to use.
as the URL of the IPFS Gateway to use.


This variable SHOULD override gateway selection done by all other means, including
internal application configuration.

### The `gateway` Configuration File

Client application SHOULD check if file is present at specific filesystem paths, in order:

1. If `IPFS_PATH` is set, try `$IPFS_PATH/gateway`
2. If `HOME` is set, try `$HOME/.ipfs/gateway`
3. Try OS-specific paths:
- Linux/Unix:
1. `$XDG_CONFIG_HOME/ipfs/gateway` (only if `XDG_CONFIG_HOME` is set)
2. `$HOME/.config/ipfs/gateway` (default XDG location)
3. `/etc/ipfs/gateway` (system-wide)
- Windows:
1. `%LOCALAPPDATA%/ipfs/gateway` (local user)
2. `%APPDATA%/ipfs/gateway` (roaming user)
3. `%PROGRAMDATA%/ipfs/gateway` (system-wide)
- macOS:
1. `$HOME/Library/Application Support/ipfs/gateway` (user)
2. `/Library/Application Support/ipfs/gateway` (system-wide)

When `gateway` file is present, the file contents MUST be interpreted as an
ASCII text file with one URL per line (separated by `\n` or `\r\n`).

The first line MUST be a valid `http://` or `https://` URL without a path
(e.g., `http://127.0.0.1:8080`). The gateway at this URL MUST support
:cite[trustless-gateway], SHOULD support :cite[path-gateway] when deserialized
responses are required, and SHOULD support :cite[subdomain-gateway] when Origin
isolation is required.

Implementations MAY support additional lines for gateway pools or failover.
Implementations that do not support multiple URLs SHOULD read only the first
line and ignore the rest of the file.

### Security

Applications that integrate IPFS support via HTTP gateway:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Applications that integrate IPFS support via HTTP gateway:
Applications that integrate IPFS support via HTTP gateways:


MUST NOT hard-code non-localhost URL as a default fallback. Instead, SHOULD ask
user to define preferred IPFS gateway using one of methods defined in this
document.

SHOULD either warn user when non-localhost gateway is used for deserialized
responses (warning about the risk of MITM), or (preferred) limit HTTP use
outside of localhost to verifiable response types defined in
:cite[trustless-gateway].

### Privacy and User Control

Applications SHOULD never default to public gateways. Instead, suggest to the
user how to run a local node.

### Compatibility and Testing

Implementers SHOULD test against implementations mentioned in :cite[ipip-0280]
as the baseline for making decisions around maximizing interoperability.

## Copyright

Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/).
2 changes: 2 additions & 0 deletions src/http-gateways/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ <h3>Web</h3>
<a href="https://en.wikipedia.org/wiki/Same-origin_policy">origin-based security model</a>.
</p>
{% include 'list.html', posts: collections.webHttpGateways %}
<h3>Integration</h3>
{% include 'list.html', posts: collections.integratingHttpGateways %}
</main>

{% include 'footer.html' %}
2 changes: 1 addition & 1 deletion src/http-gateways/libp2p-gateway.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ xref:
- http-routing-v1
- path-gateway
- trustless-gateway
tags: ['httpGateways', 'lowLevelHttpGateways', 'exchange', 'transport']
tags: ['httpGateways', 'integratingHttpGateways', 'exchange', 'transport']
order: 3
---

Expand Down
4 changes: 4 additions & 0 deletions src/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,10 @@ <h3><a href="/http-gateways/">HTTP Gateways</a></h3>
Web semantics (for website hosting and web browsers):
</p>
{% include 'list.html', posts: collections.webHttpGateways %}
<p>
Other integrations:
</p>
{% include 'list.html', posts: collections.integratingHttpGateways %}
</section>
<section>
<h3><a href="/data-formats">Data Formats</a></h3>
Expand Down
123 changes: 123 additions & 0 deletions src/ipips/ipip-0280.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
---
title: "IPIP-0280: Conventions for HTTP Gateway Detection"
date: 2025-12-16
ipip: ratified
editors:
- name: Mark Gaiser
github: markg85
- name: Marcin Rataj
github: lidel
url: https://lidel.org/
affiliation:
name: Shipyard
url: https://ipshipyard.com
relatedIssues:
- https://github.com/ipfs/kubo/issues/8847
- https://git.ffmpeg.org/gitweb/ffmpeg.git/commit/f889837e00d3b2388a24c0a9d075ad62f47da825
- https://github.com/curl/curl/pull/8805
order: 280
tags: ['ipips']
---

## Summary

This IPIP creates conventions for how applications can identify available IPFS gateway,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
This IPIP creates conventions for how applications can identify available IPFS gateway,
This IPIP creates conventions for how applications can identify an available IPFS gateway,

and how IPFS gateway implementations can signal own endpoint.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
and how IPFS gateway implementations can signal own endpoint.
and how IPFS gateway implementations can signal their own endpoint.


This convention has been implemented and in use since 2022 (Kubo 0.15, ffmpeg, curl 8.4).

## Motivation

Applications wanting to leverage IPFS Gateways are, without a common
convention, left to invent their own ways of finding a gateway, including naive
approaches such as localhost port scanning.

This IPIP introduces specification that defines how an application wanting to
implement IPFS support can find a local or user-preferred gateways.

## Detailed design

We introduce two ways of hinting user-preferred gateway URL to cover
the majority of runtimes and use cases:

- `IPFS_GATEWAY` environment variable
- `gateway` file and filesystem paths to look for it

See: :cite[gateway-detection] for details.

## Design rationale

### User benefit

End users can define their preferred gateway once, and benefit from
opportunistic support in applications they use.

Application developers save time as they only need to implement support for
vendor-agnostic convention to be able to read user preferred gateway.

### Compatibility

#### Kubo

Kubo ([>0.15.0](https://github.com/ipfs/kubo/blob/master/docs/changelogs/v0.15.md#-ipfs_pathgateway-file))
creates a hint file in `$IPFS_PATH/gateway` (default being `$HOME/.ipfs/gateway`, see [kubo#8847](https://github.com/ipfs/kubo/issues/8847)).

The file contains a single line being the local HTTP gateway URL. For example: `http://localhost:8080`.

Every time `ipfs daemon` starts, it updates the the content of `$IPFS_PATH/gateway` or creates the file if it doesn't exist.

#### IPFS Chromium

ipfs-chromium uses `IPFS_GATEWAY` environment variable
([ipfs-chrompium#29](https://github.com/little-bear-labs/ipfs-chromium/issues/29)).

It can be a single URL, or a whitespace-separated URLs to be used as the initial gateway pool.

Ref. <https://blog.ipfs.tech/2023-05-multigateway-chromium-client/>

#### FFMPEG

FFMPEG's libavformat supports both `$HOME/.ipfs/gateway` file and `IPFS_GATEWAY` environment variable
([ffmpeg.git/commit/f889837](https://git.ffmpeg.org/gitweb/ffmpeg.git/commit/f889837e00d3b2388a24c0a9d075ad62f47da825)).


Ref. <https://ffmpeg.org/ffmpeg-protocols.html#ipfs>, <https://blog.ipfs.tech/2022-08-01-ipfs-and-ffmpeg/>

#### Curl

Curl (>8.4.0, [curl#8805](https://github.com/curl/curl/pull/8805))
will try the `IPFS_GATEWAY` environment variable first, and then look for
`$IPFS_PATH/gateway` or `$HOME/.ipfs/gateway`, if present.

It expects a single URL.

Ref. <https://curl.se/docs/ipfs.html>

### Security

See "Security" section of :cite[gateway-detection].

### Alternatives

#### Browser Environment Detection

Detection via browser APIs (e.g., `localStorage.getItem('IPFS_GATEWAY')`) was
considered but is explicitly out of scope. Any JavaScript running on a page
could overwrite such values and hijack gateway requests. Browser-based detection
requires a separate IPIP with proper security review.

#### Gateway Health Checking

This specification does not mandate health checking of detected gateways.
Implementations MAY verify that a gateway is responsive before using it,
but the specific approach is left to implementers.

#### Stale Gateway File Handling

If a daemon crashes without removing the `gateway` file, it may contain a stale
URL. This specification does not mandate specific handling. Implementations MAY
implement timeout-based health checks or other recovery mechanisms.

### Copyright

Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/).