Summary
https://gifs.sable.moe/.well-known/matrix/server currently returns:
{"m.server":"example.org:443"}
Because of this, every spec-compliant homeserver resolving an mxc://gifs.sable.moe/... URI delegates the federation media request to example.org:443, which serves the IANA placeholder page and returns HTTP 404. The net effect is that every GIF sent through Sable's GIF picker fails to load for every user on every homeserver and every client.
The media proxy itself is fine. Only the delegation is wrong.
Impact
- All
mxc://gifs.sable.moe/* media 404s globally, including GIFs already in room history.
- Affects all clients (Element Web/Desktop/X, Cinny, Sable) since the failure is server-side during federation.
- Silent: Synapse logs a generic remote-media 404; users just see broken images.
Root cause
src/index.ts builds the well-known response from environment variables:
} else if (url.pathname === '/.well-known/matrix/server') {
return new Response(JSON.stringify({ 'm.server': `${env.HOSTNAME}:${env.PORT}` } satisfies MatrixWellKnownServer));
}
and wrangler.jsonc commits placeholder values:
The production Worker appears to be running with these committed placeholder defaults rather than real values.
Note that vars in wrangler.jsonc are applied on every deploy and override values previously set in the Cloudflare dashboard. So if the correct hostname was only ever configured as a dashboard variable, any redeploy silently reverts production to example.org.
Suspected trigger
The commit sequence on 2026-09-19 looks like the trigger:
| Commit |
Time (UTC) |
Description |
7847714 |
13:57 |
fix: serve giphy media in the format its id asks for |
bfd86c3 |
14:00 |
Merge PR #2 |
f315de2 |
14:28 |
(empty) "trigger cloudflare deployment" |
Independent corroboration from an affected homeserver's media cache: the last successful fetch from gifs.sable.moe was 2026-09-19 03:13:09 UTC (about 10 hours before that deploy); the first observed 404s were 2026-09-20 10:15 UTC. The delay is consistent with Synapse's ~24h .well-known cache TTL.
Reproduction
$ curl https://gifs.sable.moe/.well-known/matrix/server
{"m.server":"example.org:443"}
$ curl -o /dev/null -w '%{http_code}\n' https://example.org/_matrix/federation/v1/media/download/tenor_dzVaaTd4S3NncGNBQUFBQw
404
matrix.org's federation tester agrees:
$ curl 'https://federationtester.matrix.org/api/report?server_name=gifs.sable.moe'
FederationOK: false
WellKnownResult: {"m.server": "example.org:443", "CacheExpiresAt": 0}
ConnectionErrors: 104.20.26.136:443 -> "Non-200 response 404 from remote server" (and 3 more)
Bypassing delegation proves the proxy is healthy:
$ curl https://gifs.sable.moe/_matrix/federation/v1/media/download/tenor_dzVaaTd4S3NncGNBQUFBQw
HTTP/2 200
content-type: multipart/mixed; boundary=soliditas1a0bea0cc91a55eb2fb8206b
--soliditas1a0bea0cc91a55eb2fb8206b
Content-Type: application/json
{}
--soliditas1a0bea0cc91a55eb2fb8206b
Content-Type: application/octet-stream
Location: https://media.tenor.com/w5Zi7xKsgpcAAAAC/tenor.gif
--soliditas1a0bea0cc91a55eb2fb8206b--
and that CDN URL returns 200 image/gif, 3138665 bytes.
Also observed from a real Synapse instance:
[gifs.sable.moe] Request failed: GET matrix-federation://gifs.sable.moe/_matrix/federation/v1/media/download/tenor_dzVaaTd4S3NncGNBQUFBQw?timeout_ms=20000: HttpResponseException('404: Not Found')
HTTP error fetching remote media gifs.sable.moe/tenor_dzVaaTd4S3NncGNBQUFBQw: b'<!doctype html><html lang="en"><head><title>Example Domain</title>...'
Suggested fix
- Immediate: set the production Worker's
HOSTNAME/SERVERNAME to gifs.sable.moe and redeploy. Verify with the federation tester before closing.
- Prevent recurrence: remove the placeholder
vars block from the committed wrangler.jsonc (or move it into a non-default environment) so a deploy can never stamp example.org over production config. Committed vars beat dashboard values on every deploy.
- Guard: consider refusing to serve a well-known at all when
HOSTNAME is unset or equals example.org, so a misconfigured deploy fails loudly instead of poisoning delegation. A one-line check in src/index.ts would do it.
- Optional: a smoke test in
.github/workflows/ that curls /.well-known/matrix/server post-deploy and asserts the host matches the deployment target.
Environment
- Affected homeserver: Synapse (federating normally with other servers; only
gifs.sable.moe fails)
- Sable client image:
ghcr.io/sableclient/sable 1.21.0
- Observed: 2026-09-20
Summary
https://gifs.sable.moe/.well-known/matrix/servercurrently returns:{"m.server":"example.org:443"}Because of this, every spec-compliant homeserver resolving an
mxc://gifs.sable.moe/...URI delegates the federation media request toexample.org:443, which serves the IANA placeholder page and returns HTTP 404. The net effect is that every GIF sent through Sable's GIF picker fails to load for every user on every homeserver and every client.The media proxy itself is fine. Only the delegation is wrong.
Impact
mxc://gifs.sable.moe/*media 404s globally, including GIFs already in room history.Root cause
src/index.tsbuilds the well-known response from environment variables:and
wrangler.jsonccommits placeholder values:The production Worker appears to be running with these committed placeholder defaults rather than real values.
Note that
varsinwrangler.jsoncare applied on every deploy and override values previously set in the Cloudflare dashboard. So if the correct hostname was only ever configured as a dashboard variable, any redeploy silently reverts production toexample.org.Suspected trigger
The commit sequence on 2026-09-19 looks like the trigger:
7847714bfd86c3f315de2Independent corroboration from an affected homeserver's media cache: the last successful fetch from
gifs.sable.moewas 2026-09-19 03:13:09 UTC (about 10 hours before that deploy); the first observed 404s were 2026-09-20 10:15 UTC. The delay is consistent with Synapse's ~24h.well-knowncache TTL.Reproduction
matrix.org's federation tester agrees:
Bypassing delegation proves the proxy is healthy:
and that CDN URL returns
200 image/gif, 3138665 bytes.Also observed from a real Synapse instance:
Suggested fix
HOSTNAME/SERVERNAMEtogifs.sable.moeand redeploy. Verify with the federation tester before closing.varsblock from the committedwrangler.jsonc(or move it into a non-default environment) so a deploy can never stampexample.orgover production config. Committedvarsbeat dashboard values on every deploy.HOSTNAMEis unset or equalsexample.org, so a misconfigured deploy fails loudly instead of poisoning delegation. A one-line check insrc/index.tswould do it..github/workflows/that curls/.well-known/matrix/serverpost-deploy and asserts the host matches the deployment target.Environment
gifs.sable.moefails)ghcr.io/sableclient/sable1.21.0