Skip to content

Keep the filone.ai demo alias out of search results (FIL-897) - #112

Merged
pyropy merged 2 commits into
mainfrom
srdjan/fil-897-alias-noindex
Aug 18, 2026
Merged

Keep the filone.ai demo alias out of search results (FIL-897)#112
pyropy merged 2 commits into
mainfrom
srdjan/fil-897-alias-noindex

Conversation

@pyropy

@pyropy pyropy commented Aug 5, 2026

Copy link
Copy Markdown
Member

The same deployment is served from filone.ai as well as fil.one, so demos survive
fil.one being blocklisted. That alias must not compete with fil.one in search
results or dilute it with duplicate content.

⚠️ Prerequisites

  1. infrastructure#40 merged and applied — until then filone.ai redirects at the Cloudflare edge and never reaches Vercel, so this rule matches nothing.
  2. filone.ai and www.filone.ai attached to this Vercel project (part of infrastructure#40's prerequisites).

Note this PR was previously closed and has been reopened. It originally targeted
filone.net, which was never registered; it now targets filone.ai, whose zone is
already Active.

Blocks

website#113 — stacked on this branch.

What changes

One host-conditional entry in vercel.json headers:

{ "source": "/(.*)",
  "has": [{ "type": "host", "value": "(www\\.)?filone\\.ai" }],
  "headers": [{ "key": "X-Robots-Tag", "value": "noindex, nofollow" }] }

Plus a README section explaining the alias, since vercel.json can't carry comments.

Escaping matters here. The JSON source needs \\.; after JSON parsing the regex
engine receives (www\.)?filone\.ai. Writing \. is invalid JSON, and writing .
unescaped turns it into a wildcard. Verified the parsed value is
(www\.)?filone\.ai.

The pattern is unanchored, so it also matches a host merely containing the alias.
That only ever over-applies noindex, which is the safe direction, so I left it
rather than risk an anchoring change that can't be verified without a Vercel preview.
Noted in the README.

Two things deliberately not done

  • Canonicals need no change. index.html and useSeo already emit absolute
    https://www.fil.one/… URLs on every host, so pages served from the alias already
    point search engines at the canonical domain. Confirmed in the built output.
  • robots.txt is left alone. Adding a Disallow for the alias would stop crawlers
    fetching the page at all, so they would never see the noindex header — the two
    mechanisms would cancel out and the alias could still be listed from external links.

Verification

npm run typecheck clean, npm run lint 0 errors (8 pre-existing warnings in
untouched src/components/ui/*), 32 tests pass, build + 60-route prerender green.
vercel.json validated as JSON and the parsed has.value inspected directly.

Needs a Vercel preview to confirm end to end, since has-on-headers can't be
exercised locally:

curl -sI https://<preview>/ -H 'Host: filone.ai'     | grep -i x-robots-tag   # present
curl -sI https://<preview>/ -H 'Host: www.filone.ai' | grep -i x-robots-tag   # present
curl -sI https://<preview>/ -H 'Host: www.fil.one'   | grep -i x-robots-tag   # ABSENT

That last one is the important assertion — a rule that accidentally matched fil.one
would deindex the production site.

Note

filone.ai is also the domain every production Auth0 email is sent from, and a
HubSpot campaign sender. Reputation damage earned by pages served here lands on the
domain that delivers password resets — an accepted trade recorded on
infrastructure#40, and one more
reason to keep the alias unadvertised and unindexed.

Review remediation applied

  • The noindex rule moved to headers[0]. It was last, behind two entries that
    between them match every path. Vercel's headers are believed cumulative rather than
    first-match, but if that is wrong the rule never fired and this PR was a no-op that read
    as done. Moving it is free under cumulative semantics and the fix under first-match, so
    it no longer needs a preview to be safe.
  • README corrected. It asserted the alias console already answers and that
    filone.ai "served a Cloudflare redirect until FIL-897" — one depends on unmerged work,
    the other describes a state that will not exist once this lands. The Linear key is out of
    the heading, and the consoleUrl() bullet moved to Point console CTAs at the console on the current hostname (FIL-897) #113, where the module it documents
    actually exists.

🤖 Generated with Claude Code

@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 18, 2026 6:14pm

Request Review

@pyropy pyropy changed the title Keep the filone.net demo alias out of search results Keep the filone.net demo alias out of search results (FIL-897) Aug 5, 2026
@pyropy pyropy closed this Aug 10, 2026
@pyropy pyropy reopened this Aug 10, 2026
@pyropy
pyropy force-pushed the srdjan/fil-897-alias-noindex branch from a362daf to aca5459 Compare August 10, 2026 17:05
@pyropy pyropy changed the title Keep the filone.net demo alias out of search results (FIL-897) Keep the filone.ai demo alias out of search results (FIL-897) Aug 10, 2026
@pyropy
pyropy force-pushed the srdjan/fil-897-alias-noindex branch from aca5459 to dd2dcf2 Compare August 11, 2026 14:44
@pyropy
pyropy marked this pull request as ready for review August 18, 2026 08:52
@pyropy
pyropy force-pushed the srdjan/fil-897-alias-noindex branch from dd2dcf2 to 47888e1 Compare August 18, 2026 09:00
Comment thread vercel.json Outdated
Comment on lines +5 to +24
"headers": [
{ "key": "Cache-Control", "value": "public, max-age=31536000, immutable" }
{
"key": "Cache-Control",
"value": "public, max-age=31536000, immutable"
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

All changes from this line to the end of the file seem like JSON reformatting. Can you please revert them?

pyropy and others added 2 commits August 18, 2026 20:13
fil.one keeps landing on blocklists and the .one TLD itself is flagged, which
breaks live demos, so the same deployment is also served from filone.ai. That
alias must not compete with fil.one in search results or dilute it with
duplicate content.

A host-conditional `has` rule in vercel.json sends X-Robots-Tag: noindex, nofollow
for filone.ai and www.filone.ai only, leaving fil.one untouched. It is placed first
in the headers array: Vercel's headers are believed to be cumulative rather than
first-match, but the two catch-all Cache-Control rules would shadow it if that is
wrong, and putting it first costs nothing either way.

Canonicals need no change: index.html and useSeo already emit absolute
https://www.fil.one/ URLs on every host, so pages served from the alias already
point search engines at the canonical domain.

robots.txt is deliberately left alone. A Disallow for the alias would stop crawlers
fetching the page at all, so they would never see the noindex header — the two
mechanisms would cancel out and the alias could still be listed from external links.

Refs FIL-897

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@pyropy
pyropy force-pushed the srdjan/fil-897-alias-noindex branch from b8c2b35 to a30c77e Compare August 18, 2026 18:14
@pyropy
pyropy merged commit 4ee026c into main Aug 18, 2026
4 of 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.

2 participants