Skip to content

Point published S3 endpoints at filonecontent.com (FIL-627) - #115

Merged
pyropy merged 2 commits into
mainfrom
srdjan/fil-627-content-domain-docs
Aug 21, 2026
Merged

Point published S3 endpoints at filonecontent.com (FIL-627)#115
pyropy merged 2 commits into
mainfrom
srdjan/fil-627-content-domain-docs

Conversation

@pyropy

@pyropy pyropy commented Aug 5, 2026

Copy link
Copy Markdown
Member

Every code sample on the site tells customers to configure their tooling against
eu-west-1.s3.fil.one. User data is moving to its own registrable domain so that
abuse of uploaded content cannot flag the domain serving the console, this site,
the docs and company email — see the RFC.

⚠️ Prerequisites — do not merge until both are true

Merging publishes a hostname to every visitor and every AI crawler. If it isn't
serving yet, we are advertising an endpoint that fails TLS.

  1. infrastructure#41 merged and applied — creates filonecontent.com and the regional CNAMEs.
  2. eu-west-1 actually serving on the new hostname. That is the only region this site advertises, so us-east-1 is not a gate here. Aurora must have issued a certificate for it:
    curl -sI https://eu-west-1.s3.filonecontent.com/                  # valid TLS
    aws s3 ls --endpoint-url https://eu-west-1.s3.filonecontent.com   # SigV4 accepted
    
    Ideally fil-one#551 has also flipped eu-west-1, so the console and the site quote the same endpoint.

Scope

Nothing here is functional. All 35 occurrences were documentation or
copy-paste samples; no navigation, config, redirect or sitemap value referenced
the S3 host. The risk is entirely that a customer copies a stale sample.

src/** (19 files) 26 occurrences, now ${S3_ENDPOINT}
public/llms.txt, public/llms-full.txt 9 occurrences, edited directly

Why a constant, and why only partly

Centralised in src/lib/s3-endpoint.ts, following the pricing.ts pattern —
those same sample template literals already interpolate PRICE_PER_TB_MONTH.

A plain constant is correct here, and deliberately not a function like
console-url.ts. That helper must be called per render because it reads
window.location, and pre-rendering would otherwise freeze the build-time host
into all 60 static pages. This value doesn't depend on the visitor's host.

The two public/ files are static and React never touches them, so
centralisation is inherently partial and nothing stops the next landing page
pasting a literal hostname back in. s3-endpoint.test.ts closes that gap: it
scans src/, public/ and scripts/ on disk and fails if the old hostname
reappears, naming the offending files. Verified by reintroducing one

× has no hardcoded legacy endpoint under src/
  → import S3_ENDPOINT from @/lib/s3-endpoint instead:
    expected [ 'src/pages/Support.tsx' ] to deeply equal []

It matches the s3 host specifically, so www.fil.one and docs.fil.one are
untouched — otherwise the check would be unfixable and someone would delete it.

Easily-missed cases, all covered

  • public/llms-full.txt:155 — PyArrow endpoint_override is schemeless, so a https://… search misses it. Hence the separate S3_ENDPOINT_HOST export.
  • LogRetentionLandingPage.tsx — a Vector TOML sink, not boto3.
  • MlTrainingLandingPage.tsxfsspec and HuggingFace storage_options.
  • DeveloperSection.tsx / AgentsLandingPage.tsx — Go BaseEndpoint.
  • DataControlLandingPage.tsx — marketing prose, not a code block.
  • AgentReadableLandingPage.tsx — a mock-up of curl https://www.fil.one/llms.txt, a hand-maintained duplicate of the real file. Now interpolated, so it can't drift from it on this value.
  • Three occurrences were in double-quoted strings rather than template literals and needed the quoting changed too; done as explicit replacements so the surrounding copy is provably untouched.

Drive-by fix

Support.tsx and SupportBcnES.tsx told users to "point rclone at s3.fil.one"
— a bare hostname that has never had a DNS record and so never resolved. Now
eu-west-1.s3.filonecontent.com, which will.

Verification

npm run typecheck clean, npm run lint 0 errors (8 pre-existing warnings in
untouched src/components/ui/*), 27 tests pass, build + 60-route prerender green.

Checked against the built output, which is what catches an interpolation landing
in a plain string rather than a template literal:

  • dist/ contains 0 unrendered ${S3_ENDPOINT} occurrences
  • dist/ contains 0 occurrences of the old hostname
  • 22 built files carry the new host; dist/llms.txt has 4 and dist/llms-full.txt 5 — matching the originals exactly

Spot-checked in the prerendered HTML: the Vector TOML sink, the boto3 sample on
the home page, the schemeless PyArrow line, and the rclone copy all render correctly.

Note

docs.fil.one is a separate Vercel project whose source is in neither this repo
nor fil-one, and this site points users there as the authoritative "S3
compatibility reference" for exactly these connection details. Whatever endpoints
it documents are out of reach of this PR and need their own pass.

🤖 Generated with Claude Code

Every code sample on the site tells customers to configure their tooling against
eu-west-1.s3.fil.one. User data is moving to its own registrable domain so that
abuse of uploaded content cannot flag the domain serving the console, this site,
the docs and company email (FIL-627).

Nothing here is functional — all 35 occurrences were documentation or copy-paste
samples — but they are what customers actually configure, and the two llms.txt
files are explicitly crawlable by GPTBot/ClaudeBot/PerplexityBot, so a stale
value gets ingested and repeated back to people.

Centralises the value in src/lib/s3-endpoint.ts, following the pricing.ts
pattern of importing a constant into the sample template literals. A plain
constant is right here, unlike console-url.ts, which must stay a function
because it reads window.location and pre-rendering would freeze the build-time
host into every page; this value does not depend on the visitor's host.

The two files under public/ are static and React never touches them, so they are
edited directly and centralisation is inherently partial. s3-endpoint.test.ts
therefore scans src/, public/ and scripts/ on disk and fails if the old hostname
reappears anywhere — verified to fail by reintroducing one. It matches the s3
host specifically, so www.fil.one and docs.fil.one are unaffected.

Also fixes the rclone advice in Support.tsx and SupportBcnES.tsx, which pointed
at a bare s3.fil.one that has never had a DNS record and so never resolved.

Refs FIL-627. RFC: rfcs/2026-07-user-data-domain-separation.md

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@vercel

vercel Bot commented Aug 5, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
fil-one Ready Ready Preview Aug 20, 2026 11:35am

Request Review

@pyropy
pyropy marked this pull request as ready for review August 18, 2026 09:31
@pyropy
pyropy requested a review from filipagr August 18, 2026 09:31
…t-domain-docs

main migrated the landing pages to the LandingPage shell, which dropped the
code samples from 13 of the pages this branch had touched. Took main's version
of those files and re-applied S3_ENDPOINT only where a sample survived:
AgentsLandingPage (boto3, JS, Go), MigrateFromS3LandingPage (boto3, JS),
AgentReadableLandingPage (llms.txt mock-up) and Support (rclone prose, on
main's reworded "S3-compatible" copy).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@pyropy
pyropy merged commit 24cbccf into main Aug 21, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant