From b0d747ea3822b7be8dab0745fb711a1729ef7a60 Mon Sep 17 00:00:00 2001 From: Srdjan S Date: Wed, 5 Aug 2026 14:28:21 +0200 Subject: [PATCH 1/2] Keep the filone.ai demo alias out of search results MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- README.md | 15 ++++++ vercel.json | 149 ++++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 141 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index bd5b008..850f60b 100644 --- a/README.md +++ b/README.md @@ -111,3 +111,18 @@ Copy `.env.example` to `.env` and set `HUBSPOT_PRIVATE_APP_ACCESS_TOKEN` to a Hu ## Deployment Deployed on **Vercel**. Pushing to `main` triggers a production deployment automatically. SPA routing is handled via `vercel.json`. + +### Demo-alias domain + +`fil.one` keeps landing on blocklists, and the `.one` TLD itself is flagged, which breaks live demos. The same deployment is therefore also served from **`filone.ai`** — an alias whose only value is an unflagged reputation. `fil.one` remains the canonical, public, indexed domain. + +`filone.ai` and `www.filone.ai` are attached to this Vercel project alongside the `fil.one` hostnames. The console is served on `app.filone.ai` from the same CloudFront distribution — see `PROD_CONSOLE_ALIAS_HOSTS` in `fil-one/fil-one`, `packages/shared/src/constants.ts`. DNS for the whole zone lives in `environments/prod/filone-ai.tf` in `fil-one/infrastructure`. + +**The alias must stay out of search results.** `vercel.json` sends `X-Robots-Tag: noindex, nofollow` for `(www.)?filone.ai` via a host-conditional `has` rule, placed first so it applies regardless of whether Vercel evaluates `headers` cumulatively or first-match. Canonicals need no special handling: `index.html` and `useSeo` already emit absolute `https://www.fil.one/…` URLs on every host, so the alias points search engines at the canonical domain by itself. **Do not** add a `Disallow` for the alias in `robots.txt` — that would stop crawlers fetching the page at all, so they would never see the `noindex` header, and the two mechanisms would cancel out. The `has.value` pattern is unanchored, so it also matches a host merely containing the alias; that only ever over-applies `noindex`, which is the safe direction. + +Keep the alias unadvertised: no public links, no marketing references, and do not add it to Search Console. + +Two things about `filone.ai` worth knowing before you change anything here: + +- It 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, so treat a phishing report against the alias as a mail-deliverability incident too. +- **`docs.fil.one` and `status.fil.one` links still leave the alias.** There is nothing to point them at — those subdomains do not exist on `filone.ai` — so on a network that blocks the `.one` TLD, clicking "docs" from an alias page fails. Known and accepted; fixing it means provisioning the subdomains on the docs Vercel project and Instatus. diff --git a/vercel.json b/vercel.json index 6ffc1b0..19d8c7a 100644 --- a/vercel.json +++ b/vercel.json @@ -1,50 +1,153 @@ { "headers": [ + { + "source": "/(.*)", + "has": [ + { + "type": "host", + "value": "(www\\.)?filone\\.ai" + } + ], + "headers": [ + { + "key": "X-Robots-Tag", + "value": "noindex, nofollow" + } + ] + }, { "source": "/assets/(.*)", "headers": [ - { "key": "Cache-Control", "value": "public, max-age=31536000, immutable" } + { + "key": "Cache-Control", + "value": "public, max-age=31536000, immutable" + } ] }, { "source": "/fonts/(.*)", "headers": [ - { "key": "Cache-Control", "value": "public, max-age=31536000" } + { + "key": "Cache-Control", + "value": "public, max-age=31536000" + } ] }, { "source": "/", "headers": [ - { "key": "Cache-Control", "value": "public, max-age=0, must-revalidate" } + { + "key": "Cache-Control", + "value": "public, max-age=0, must-revalidate" + } ] }, { "source": "/:path((?!assets/|fonts/|api/|blog/).*)", "headers": [ - { "key": "Cache-Control", "value": "public, max-age=0, must-revalidate" } + { + "key": "Cache-Control", + "value": "public, max-age=0, must-revalidate" + } ] } ], "redirects": [ - { "source": "/decentralizedstorage", "destination": "/", "permanent": true }, - { "source": "/company", "destination": "/", "permanent": true }, - { "source": "/destor-directory-akave", "destination": "/", "permanent": true }, - { "source": "/products", "destination": "/", "permanent": true }, - { "source": "/products/datadrop-free-trial", "destination": "/", "permanent": true }, - { "source": "/products/s3-cloud", "destination": "/", "permanent": true }, - { "source": "/resources/blog/destor-solves-archiving-issues", "destination": "/", "permanent": true }, - { "source": "/solutions/ransomware", "destination": "/", "permanent": true }, - { "source": "/victor-chang-cardiac-research-institute-case-study", "destination": "/", "permanent": true }, - { "source": "/contact/talk-with-sales", "destination": "/contact-sales", "permanent": true }, - { "source": "/destor-network/overview", "destination": "/", "permanent": true }, - { "source": "/en-us/filecoin-network-client-explorer", "destination": "/", "permanent": true }, - { "source": "/products/archival", "destination": "/", "permanent": true }, - { "source": "/resources/blog/cloud-storage-past-present-and-future", "destination": "/", "permanent": true }, - { "source": "/resources/news/destor-partners-with-kabat-to-deliver-energy-efficient-cloud-storage-solutions", "destination": "/", "permanent": true }, - { "source": "/resources/news/qamcom-dds-destor-partnership", "destination": "/", "permanent": true }, - { "source": "/resources/news/solana-integrates-filecoin", "destination": "/", "permanent": true }, - { "source": "/solutions/archival", "destination": "/", "permanent": true }, - { "source": "/solutions/backup", "destination": "/", "permanent": true } + { + "source": "/decentralizedstorage", + "destination": "/", + "permanent": true + }, + { + "source": "/company", + "destination": "/", + "permanent": true + }, + { + "source": "/destor-directory-akave", + "destination": "/", + "permanent": true + }, + { + "source": "/products", + "destination": "/", + "permanent": true + }, + { + "source": "/products/datadrop-free-trial", + "destination": "/", + "permanent": true + }, + { + "source": "/products/s3-cloud", + "destination": "/", + "permanent": true + }, + { + "source": "/resources/blog/destor-solves-archiving-issues", + "destination": "/", + "permanent": true + }, + { + "source": "/solutions/ransomware", + "destination": "/", + "permanent": true + }, + { + "source": "/victor-chang-cardiac-research-institute-case-study", + "destination": "/", + "permanent": true + }, + { + "source": "/contact/talk-with-sales", + "destination": "/contact-sales", + "permanent": true + }, + { + "source": "/destor-network/overview", + "destination": "/", + "permanent": true + }, + { + "source": "/en-us/filecoin-network-client-explorer", + "destination": "/", + "permanent": true + }, + { + "source": "/products/archival", + "destination": "/", + "permanent": true + }, + { + "source": "/resources/blog/cloud-storage-past-present-and-future", + "destination": "/", + "permanent": true + }, + { + "source": "/resources/news/destor-partners-with-kabat-to-deliver-energy-efficient-cloud-storage-solutions", + "destination": "/", + "permanent": true + }, + { + "source": "/resources/news/qamcom-dds-destor-partnership", + "destination": "/", + "permanent": true + }, + { + "source": "/resources/news/solana-integrates-filecoin", + "destination": "/", + "permanent": true + }, + { + "source": "/solutions/archival", + "destination": "/", + "permanent": true + }, + { + "source": "/solutions/backup", + "destination": "/", + "permanent": true + } ], "rewrites": [ { "source": "/blog/rss.xml", "destination": "/api/rss" }, From a30c77e43818fc2a571bc5ec14ac6afb8bb818c9 Mon Sep 17 00:00:00 2001 From: Srdjan S Date: Tue, 18 Aug 2026 15:42:25 +0200 Subject: [PATCH 2/2] chore: reformat --- vercel.json | 144 +++++++++------------------------------------------- 1 file changed, 25 insertions(+), 119 deletions(-) diff --git a/vercel.json b/vercel.json index 19d8c7a..9ba9614 100644 --- a/vercel.json +++ b/vercel.json @@ -3,151 +3,57 @@ { "source": "/(.*)", "has": [ - { - "type": "host", - "value": "(www\\.)?filone\\.ai" - } + { "type": "host", "value": "(www\\.)?filone\\.ai" } ], "headers": [ - { - "key": "X-Robots-Tag", - "value": "noindex, nofollow" - } + { "key": "X-Robots-Tag", "value": "noindex, nofollow" } ] }, { "source": "/assets/(.*)", "headers": [ - { - "key": "Cache-Control", - "value": "public, max-age=31536000, immutable" - } + { "key": "Cache-Control", "value": "public, max-age=31536000, immutable" } ] }, { "source": "/fonts/(.*)", "headers": [ - { - "key": "Cache-Control", - "value": "public, max-age=31536000" - } + { "key": "Cache-Control", "value": "public, max-age=31536000" } ] }, { "source": "/", "headers": [ - { - "key": "Cache-Control", - "value": "public, max-age=0, must-revalidate" - } + { "key": "Cache-Control", "value": "public, max-age=0, must-revalidate" } ] }, { "source": "/:path((?!assets/|fonts/|api/|blog/).*)", "headers": [ - { - "key": "Cache-Control", - "value": "public, max-age=0, must-revalidate" - } + { "key": "Cache-Control", "value": "public, max-age=0, must-revalidate" } ] } ], "redirects": [ - { - "source": "/decentralizedstorage", - "destination": "/", - "permanent": true - }, - { - "source": "/company", - "destination": "/", - "permanent": true - }, - { - "source": "/destor-directory-akave", - "destination": "/", - "permanent": true - }, - { - "source": "/products", - "destination": "/", - "permanent": true - }, - { - "source": "/products/datadrop-free-trial", - "destination": "/", - "permanent": true - }, - { - "source": "/products/s3-cloud", - "destination": "/", - "permanent": true - }, - { - "source": "/resources/blog/destor-solves-archiving-issues", - "destination": "/", - "permanent": true - }, - { - "source": "/solutions/ransomware", - "destination": "/", - "permanent": true - }, - { - "source": "/victor-chang-cardiac-research-institute-case-study", - "destination": "/", - "permanent": true - }, - { - "source": "/contact/talk-with-sales", - "destination": "/contact-sales", - "permanent": true - }, - { - "source": "/destor-network/overview", - "destination": "/", - "permanent": true - }, - { - "source": "/en-us/filecoin-network-client-explorer", - "destination": "/", - "permanent": true - }, - { - "source": "/products/archival", - "destination": "/", - "permanent": true - }, - { - "source": "/resources/blog/cloud-storage-past-present-and-future", - "destination": "/", - "permanent": true - }, - { - "source": "/resources/news/destor-partners-with-kabat-to-deliver-energy-efficient-cloud-storage-solutions", - "destination": "/", - "permanent": true - }, - { - "source": "/resources/news/qamcom-dds-destor-partnership", - "destination": "/", - "permanent": true - }, - { - "source": "/resources/news/solana-integrates-filecoin", - "destination": "/", - "permanent": true - }, - { - "source": "/solutions/archival", - "destination": "/", - "permanent": true - }, - { - "source": "/solutions/backup", - "destination": "/", - "permanent": true - } + { "source": "/decentralizedstorage", "destination": "/", "permanent": true }, + { "source": "/company", "destination": "/", "permanent": true }, + { "source": "/destor-directory-akave", "destination": "/", "permanent": true }, + { "source": "/products", "destination": "/", "permanent": true }, + { "source": "/products/datadrop-free-trial", "destination": "/", "permanent": true }, + { "source": "/products/s3-cloud", "destination": "/", "permanent": true }, + { "source": "/resources/blog/destor-solves-archiving-issues", "destination": "/", "permanent": true }, + { "source": "/solutions/ransomware", "destination": "/", "permanent": true }, + { "source": "/victor-chang-cardiac-research-institute-case-study", "destination": "/", "permanent": true }, + { "source": "/contact/talk-with-sales", "destination": "/contact-sales", "permanent": true }, + { "source": "/destor-network/overview", "destination": "/", "permanent": true }, + { "source": "/en-us/filecoin-network-client-explorer", "destination": "/", "permanent": true }, + { "source": "/products/archival", "destination": "/", "permanent": true }, + { "source": "/resources/blog/cloud-storage-past-present-and-future", "destination": "/", "permanent": true }, + { "source": "/resources/news/destor-partners-with-kabat-to-deliver-energy-efficient-cloud-storage-solutions", "destination": "/", "permanent": true }, + { "source": "/resources/news/qamcom-dds-destor-partnership", "destination": "/", "permanent": true }, + { "source": "/resources/news/solana-integrates-filecoin", "destination": "/", "permanent": true }, + { "source": "/solutions/archival", "destination": "/", "permanent": true }, + { "source": "/solutions/backup", "destination": "/", "permanent": true } ], "rewrites": [ { "source": "/blog/rss.xml", "destination": "/api/rss" },