From f00aaab8806f2b36ad68ac77b7ef6ca53802f643 Mon Sep 17 00:00:00 2001 From: Filipa Date: Tue, 18 Aug 2026 14:48:30 -0300 Subject: [PATCH 01/34] Migrate /lp/agents to design tokens + shared components MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rewrite AgentsLandingPage from ~60 inline fontFamily/hex-color style objects to the shared token components (Hero, LandingPrimitives, Button, Pill, IconTile, TextLink, FeatureList, CodeBlock, Table), matching the /lp/* pattern established by Barcelona/backup-dr/egress. Replace the hand-rolled tabbed code viewer and regex syntax highlighter with the shared CodeBlock component, and the raw cost breakdown with the shared Table primitive. Drop dead code (PricingCtaBlock, unused DEV_FEATURES/COST_ROWS data). Extend two shared components to cover gaps surfaced by this page: - Pill: add a `neutral` tone (zinc tokens) for status pills with no brand meaning, e.g. "Coming soon" on a card that isn't a highlight. - LandingPrimitives: add a `size` override to SectionHeading, mirroring SectionSub's existing override, for headings in narrower columns. Correct marketing copy against the console technical source-of-truth per FIL-843: the "Storage your agents can rely on" card and the routeMeta.mjs unfurl description both claimed unsupported verifiability ("audit-ready visibility into storage integrity", "integrity proven daily") and geo-redundancy ("worldwide", "distributed and redundant") — pivoted to the real GA regions (US + EU) and standard S3 durability/no-egress framing. Part of FIL-690. Co-Authored-By: Claude Sonnet 5 --- scripts/routeMeta.mjs | 2 +- src/components/LandingPrimitives.tsx | 5 +- src/components/Pill.tsx | 8 +- src/pages/AgentsLandingPage.tsx | 1019 +++++--------------------- 4 files changed, 208 insertions(+), 826 deletions(-) diff --git a/scripts/routeMeta.mjs b/scripts/routeMeta.mjs index 96cf38e..5348cae 100644 --- a/scripts/routeMeta.mjs +++ b/scripts/routeMeta.mjs @@ -64,7 +64,7 @@ export const ROUTE_META = { "/lp/agents": { title: "Fil One for AI Agents · S3 Storage for RAG, Agent Memory & Datasets", description: - `Give your AI agents durable, verifiable storage. S3-compatible, ${PRICE_PER_TB_SHORT}, no egress fees, integrity proven daily. Drop-in replacement for AWS S3.`, + `Give your AI agents S3-compatible storage at ${PRICE_PER_TB_SHORT}, no egress fees. Drop-in replacement for AWS S3.`, jsonLd: [ { "@context": "https://schema.org", diff --git a/src/components/LandingPrimitives.tsx b/src/components/LandingPrimitives.tsx index a5b7520..03d42a3 100644 --- a/src/components/LandingPrimitives.tsx +++ b/src/components/LandingPrimitives.tsx @@ -17,13 +17,16 @@ export const SectionLabel = ({ children }: { children: React.ReactNode }) => ( export const SectionHeading = ({ children, maxWidth, + size = "text-[24px] md:text-[34px]", }: { children: React.ReactNode; /** Optional cap on the heading's width (px) to control where it wraps. */ maxWidth?: number; + /** Responsive font-size classes; defaults to the standard heading scale. */ + size?: string; }) => (

{children} diff --git a/src/components/Pill.tsx b/src/components/Pill.tsx index 5339eca..d9bab70 100644 --- a/src/components/Pill.tsx +++ b/src/components/Pill.tsx @@ -1,7 +1,7 @@ import type { ReactNode } from "react"; type PillVariant = "soft" | "solid"; -type PillTone = "brand" | "success" | "warning" | "danger"; +type PillTone = "brand" | "neutral" | "success" | "warning" | "danger"; interface PillProps { children: ReactNode; @@ -24,6 +24,12 @@ const TONE_CLASSES: Record> = { soft: "border border-brand/20 bg-brand-50 text-brand-600", solid: "bg-brand-500 text-white", }, + // For status pills with no brand meaning (e.g. "Coming soon" on a card that + // isn't itself a highlight) — neutral zinc instead of brand-tinted. + neutral: { + soft: "border border-black/[0.08] bg-zinc-100 text-zinc-500", + solid: "bg-zinc-500 text-white", + }, success: { soft: "border border-success-600/20 bg-success-50 text-success-700", solid: "bg-success-600 text-white", diff --git a/src/pages/AgentsLandingPage.tsx b/src/pages/AgentsLandingPage.tsx index 11e374b..e9d4e4d 100644 --- a/src/pages/AgentsLandingPage.tsx +++ b/src/pages/AgentsLandingPage.tsx @@ -1,196 +1,36 @@ -import { useState } from "react"; import PlatformNavbar from "@/components/PlatformNavbar"; import Footer from "@/components/Footer"; import { useInView } from "@/hooks/useInView"; import { useSeo } from "@/hooks/useSeo"; -import { PRICE_DISPLAY, PRICE_PER_TB_SHORT, PRICE_PER_TB_MONTH } from "@/lib/pricing"; -import { ArrowUpRight, Copy, Check, CheckCircle, ShieldCheck, Plug, TrendUp, CaretRight, CurrencyDollar, LockOpen, HardDrives, Globe } from "@phosphor-icons/react"; - -// ─── Grid texture ────────────────────────────────────────────────────────────── -const GRID_SVG = encodeURIComponent( - '' -); - -// ─── Typography helpers ──────────────────────────────────────────────────────── -const SectionLabel = ({ children }: { children: React.ReactNode }) => ( - -); - -const SectionHeading = ({ children }: { children: React.ReactNode }) => ( -

- {children} -

-); - -const SectionSub = ({ - children, - maxWidth = 560, -}: { - children: React.ReactNode; - maxWidth?: number; -}) => ( -

- {children} -

-); - -// ─── Reusable pricing CTA block ──────────────────────────────────────────────── -const PricingCtaBlock = ({ bg = "#FFFFFF" }: { bg?: string }) => ( -
-
- {/* Big price */} -
- - {PRICE_DISPLAY} - - - / TB / month - -
- - {/* What you don't pay */} -
- {[ - "No egress fees", - "No per-request charges", - ].map((item) => ( - - — {item} - - ))} -
- - {/* Free tier */} -

- Free tier: 1 TB storage + 2 TB bandwidth, 30 days. No credit card required. -

- - - Start free - -
-
-); +import { PRICE_DISPLAY, PRICE_PER_TB_SHORT } from "@/lib/pricing"; +import { ArrowUpRight, ShieldCheck, Plug, TrendUp, CurrencyDollar, LockOpen, HardDrives } from "@phosphor-icons/react"; +import Hero from "@/components/Hero"; +import { SectionLabel, SectionHeading, SectionSub } from "@/components/LandingPrimitives"; +import { Button } from "@/components/Button"; +import Pill from "@/components/Pill"; +import IconTile from "@/components/IconTile"; +import TextLink from "@/components/TextLink"; +import FeatureList from "@/components/FeatureList"; +import CodeBlock, { type CodeSnippet } from "@/components/CodeBlock"; +import Table from "@/components/Table"; + +const SIGNUP_URL = "https://app.fil.one/login?screen_hint=signup"; +const DOCS_URL = "https://docs.fil.one"; // ─── Comparison table data ───────────────────────────────────────────────────── const COMPARISON_ROWS = [ - { item: "Storage", aws: "$0.023/GB/month (~$23/TB)", filone: `~$0.005/GB/month (${PRICE_PER_TB_SHORT})` }, - { item: "PUT requests", aws: "$0.005 per 1,000", filone: "Included" }, - { item: "GET requests", aws: "$0.0004 per 1,000", filone: "Included" }, - { item: "Egress", aws: "$0.09/GB", filone: "$0" }, - { item: "Predictable bill", aws: "No", filone: "Yes" }, -]; - -// ─── Dev features data ───────────────────────────────────────────────────────── -const DEV_FEATURES = [ - { - number: "01", - title: "Flat pricing.", - body: `${PRICE_PER_TB_MONTH}. No per-call charges. No egress. When your agent loops a thousand times overnight, the bill reflects storage — nothing else. You can read the pricing page once and stop thinking about it.`, - code: null, - }, - { - number: "02", - title: "S3-compatible.", - body: "Your existing code works. Change the endpoint. Keep your boto3 client, your AWS CLI config, your SDK calls. Bucket operations, multipart uploads, presigned URLs, lifecycle policies — all behave as expected. If it runs against S3 today, it runs against Fil One.", - code: `import boto3 - -s3 = boto3.client( - "s3", - endpoint_url="https://eu-west-1.s3.fil.one", - aws_access_key_id="YOUR_ACCESS_KEY", - aws_secret_access_key="YOUR_SECRET_KEY", -) - -s3.put_object(Bucket="agent-memory", Key="session/abc123", Body=payload) -result = s3.get_object(Bucket="agent-memory", Key="session/abc123")`, - }, - { - number: "03", - title: "Durable and verifiable.", - body: "Cryptographic integrity on every object. If your agent needs to confirm a stored artefact hasn't changed — pull the proof. No trust required, no black box.", - code: null, - }, - { - number: "04", - title: "No lock-in.", - body: "Your data is in standard S3-compatible object storage. Move it out with the same tools you used to move it in. There is no proprietary format, no vendor-specific API, no migration tax. Low stakes means you can commit to Fil One for a project without committing to Fil One forever.", - code: null, - }, + { item: "Storage", aws: "$0.023/GB/month (~$23/TB)", filone: `~$0.005/GB/month (${PRICE_PER_TB_SHORT})` }, + { item: "PUT requests", aws: "$0.005 per 1,000", filone: "Included" }, + { item: "GET requests", aws: "$0.0004 per 1,000", filone: "Included" }, + { item: "Egress", aws: "$0.09/GB", filone: "$0" }, + { item: "Predictable bill", aws: "No", filone: "Yes" }, ]; // ─── Agent code tabs ─────────────────────────────────────────────────────────── -const AGENT_TABS = [ +const AGENT_SNIPPETS: CodeSnippet[] = [ { - label: "Python", - filename: "quickstart.py", + lang: "python", + label: "quickstart.py", code: `import boto3 s3 = boto3.client( @@ -209,8 +49,8 @@ for obj in response.get("Contents", []): print(f"{obj['Key']} ({obj['Size']} bytes)")`, }, { - label: "JavaScript", - filename: "quickstart.js", + lang: "typescript", + label: "quickstart.js", code: `import { S3Client, PutObjectCommand, ListObjectsV2Command } from "@aws-sdk/client-s3"; import { readFileSync } from "fs"; @@ -238,8 +78,8 @@ const { Contents } = await client.send( Contents?.forEach((obj) => console.log(obj.Key, obj.Size));`, }, { - label: "Go", - filename: "main.go", + lang: "go", + label: "main.go", code: `package main import ( @@ -283,13 +123,23 @@ func main() { }, ]; -// ─── Cost math data ──────────────────────────────────────────────────────────── -const COST_ROWS = [ - { item: "Storage (100 GB)", aws: "$2.30", filone: "$0.50" }, - { item: "PUT requests (500K)", aws: "$2.50", filone: "$0" }, - { item: "GET requests (500K)", aws: "$0.20", filone: "$0" }, - { item: "Egress (100 GB)", aws: "$9.00", filone: "$0" }, - { item: "Total", aws: "$14.00", filone: "$0.50", bold: true }, +// ─── Value props data ────────────────────────────────────────────────────────── +const VALUE_PROPS = [ + { + icon: CurrencyDollar, + title: "Know what you'll pay upfront", + body: "No per-call charges. No egress. You can read the pricing page once and stop thinking about it. Run your agents as hard as you need.", + }, + { + icon: LockOpen, + title: "Go all in without getting locked in", + body: "With no proprietary format, vendor-specific API, or migration tax, you can move your data and workloads freely. No surrendering your agents to a model you can't get out of.", + }, + { + icon: HardDrives, + title: "Storage your agents can rely on", + body: "S3-compatible object storage in US and EU regions, with the same durability and availability guarantees you'd expect from S3 — no egress fees when your agents need to read it all back.", + }, ]; // ─── Use cases data ──────────────────────────────────────────────────────────── @@ -298,7 +148,7 @@ const USE_CASES = [ icon: ShieldCheck, title: "Persistent agent memory and artifacts", description: "Your agents write session state, conversation history, checkpoints, and generated outputs straight to S3 buckets, and read them back on the next run. Flat pricing means the loop doesn't cost you: thousands of small reads and writes price the same as a handful. Keep everything your agents produce instead of deleting it to stay in budget. Plain S3: works today with boto3, the AWS CLI, or any SDK.", - cta: { label: "Start now", href: "https://app.fil.one/login?screen_hint=signup" }, + cta: { label: "Start now", href: SIGNUP_URL }, }, { icon: Plug, @@ -316,29 +166,23 @@ const USE_CASES = [ }, ]; -// ─── Syntax highlighter ──────────────────────────────────────────────────────── -function renderCode(code: string, filename: string): React.ReactNode { - const lang = filename.endsWith(".go") ? "go" : filename.endsWith(".js") ? "js" : "py"; - const C = { comment: "#6A9955", string: "#A31515", keyword: "#0070CC", plain: "#09090B" }; - const kw = { - py: "import|from|for|in|if|else|elif|def|return|True|False|None|and|or|not|with|as|class|await|print", - js: "import|from|const|let|var|function|return|await|async|new|if|else|for|of|export|default|true|false|null", - go: "package|import|func|var|const|type|struct|for|if|else|return|range|nil|true|false|string|int|bool|main", - }[lang]; - const commentPat = lang === "py" ? "#[^\n]*" : "//[^\n]*"; - const regex = new RegExp(`(${commentPat})|("[^"\\n]*"|'[^'\\n]*')|(\\b(?:${kw})\\b)`, "g"); - const parts: React.ReactNode[] = []; - let last = 0, key = 0, m: RegExpExecArray | null; - while ((m = regex.exec(code)) !== null) { - if (m.index > last) parts.push(code.slice(last, m.index)); - if (m[1]) parts.push({m[1]}); - else if (m[2]) parts.push({m[2]}); - else if (m[3]) parts.push({m[3]}); - last = regex.lastIndex; - } - if (last < code.length) parts.push(code.slice(last)); - return <>{parts}; -} +// ─── Next steps data ─────────────────────────────────────────────────────────── +const NEXT_STEPS = [ + { + href: "/contact-sales", + label: "Talk to a person", + title: "Get in touch", + body: "If you're building something at scale and want to talk through the fit before committing.", + external: false, + }, + { + href: "https://docs.fil.one", + label: "Documentation", + title: "Docs", + body: "Quickstart, S3 compatibility reference, SDK examples, and API docs.", + external: true, + }, +]; // ─── Page ────────────────────────────────────────────────────────────────────── const AgentsLandingPage = () => { @@ -349,179 +193,66 @@ const AgentsLandingPage = () => { canonical: "https://www.fil.one/lp/agents", }); - const [activeTab, setActiveTab] = useState(0); - const [copied, setCopied] = useState(false); - const handleCopy = () => { - navigator.clipboard.writeText(AGENT_TABS[activeTab].code); - setCopied(true); - setTimeout(() => setCopied(false), 2000); - }; const { ref: compRef, inView: compInView } = useInView({ threshold: 0.04 }); const { ref: devRef, inView: devInView } = useInView({ threshold: 0.04 }); const { ref: useCasesRef, inView: useCasesInView } = useInView({ threshold: 0.04 }); const { ref: learnRef, inView: learnInView } = useInView({ threshold: 0.04 }); return ( -
+
{/* ── Hero ─────────────────────────────────────────────────────────── */} -
- {/* Blue radial glow — very subtle */} -
+ {/* ── Comparison ───────────────────────────────────────────────────── */} -
+
{/* Two-column: text left, cost callout right */}
@@ -529,7 +260,7 @@ const AgentsLandingPage = () => {
The problem Standard storage keeps the meter running while your agent works -
+
Agents behave differently from any workload hyperscalers were designed for. They fetch, write, retry, and fetch again, thousands of times for a single task. @@ -543,181 +274,98 @@ const AgentsLandingPage = () => {
{/* Right: cost callout card */} -
+
{/* Scenario label row */} -
- - 2M ops (PUT + GET) · 1 TB egress · 1 TB storage +
+ + 2M ops (PUT + GET) ·{" "} + 1 TB egress ·{" "} + 1 TB storage
{/* Price columns */} -
- {/* AWS column */} -
- +
+
+ AWS S3 - + ~$118 - + storage + requests + egress
- {/* Fil One column */} -
- +
+ Fil One - + {PRICE_DISPLAY} - + storage only — requests and egress included
{/* CTA row — aligned to Fil One column */} -
-
-
- - Start for free - +
+
+
+
{/* Full-width callout sentence */} -

+

Fil One changes the model. Let your agents experiment and keep what they generate.

{/* Comparison table */} -
-

- - - {[ - { label: "Cost item", align: "left" }, - { label: "AWS S3", align: "right" }, - { label: "Fil One", align: "right", blue: true }, - ].map(({ label, align, blue }) => ( - - ))} - - - - {COMPARISON_ROWS.map((row) => ( - - - - - - ))} - -
- {label} -
- {row.item} - - {row.aws} - - {row.item === "Storage" ? ( - {row.filone} - ) : row.filone} -
- - -

+ + + + Cost item + AWS S3 + Fil One + + + + {COMPARISON_ROWS.map((row) => ( + + {row.item} + {row.aws} + + {row.filone} + + + ))} + +
+ +

AWS S3 Standard pricing as of May 2026, us-east-1. 1 TB = 1,000 GB (decimal). Actual AWS costs vary by tier, region, and volume discounts.

- {/* ── Developer & agent first ───────────────────────────────────────── */} -
+
- {/* Header */}
Developer and agent first Your existing S3 code works @@ -728,165 +376,28 @@ const AgentsLandingPage = () => {
- {/* Tabbed code block */} -
- {/* Header: file tabs + copy */} -
- {/* File name tabs */} -
- {AGENT_TABS.map((tab, i) => ( - - ))} -
- - {/* Copy button */} - -
- - {/* Code area with line numbers */} -
- {/* Line numbers */} - + - {/* Code */} -
-                  {renderCode(AGENT_TABS[activeTab].code, AGENT_TABS[activeTab].filename)}
-                
-
-
- - {/* Docs link */} - + Full quickstart guide - - +
{/* ── Value props ──────────────────────────────────────────────────── */} -
-
+
+
Why Fil One Built differently. Built for agents.
- {[ - { - icon: CurrencyDollar, - title: "Know what you'll pay upfront", - body: "No per-call charges. No egress. You can read the pricing page once and stop thinking about it. Run your agents as hard as you need.", - }, - { - icon: LockOpen, - title: "Go all in without getting locked in", - body: "With no proprietary format, vendor-specific API, or migration tax, you can move your data and workloads freely. No surrendering your agents to a model you can't get out of.", - }, - { - icon: HardDrives, - title: "Storage your agents can rely on", - body: "Routed across independent infrastructure providers worldwide. Distributed and redundant by design. Backed by audit-ready visibility into storage integrity.", - }, - ].map(({ icon: Icon, title, body }) => ( + {VALUE_PROPS.map(({ icon, title, body }) => (
-
- -
+
-

- {title} -

-

- {body} -

+

{title}

+

{body}

))} @@ -895,13 +406,10 @@ const AgentsLandingPage = () => {
{/* ── Use cases ────────────────────────────────────────────────────── */} -
+
Use cases @@ -912,227 +420,92 @@ const AgentsLandingPage = () => {
- {USE_CASES.map(({ icon: Icon, title, description, badge, waitlist, cta }) => ( + {USE_CASES.map(({ icon, title, description, badge, waitlist, cta }) => (
- {/* Icon row + optional badge */}
-
- -
- {badge && ( - - {badge} - - )} + + {badge && {badge}}
-
-

- {title} -

-

- {description} -

+
+

{title}

+

{description}

{cta && ( - + {cta.label} - - + )} {waitlist && ( - + Join the waitlist - - + )}
))}
-
- {/* ── Pricing CTA ──────────────────────────────────────────────────── */} {/* ── Pricing + Next steps ─────────────────────────────────────────── */} -
+
{/* Left: pricing card — stretches to match right column height */} -
-
- +
+
+ {PRICE_DISPLAY} - - / TB / month - + / TB / month
-
- {["No egress fees", "No per-request charges"].map((item) => ( -
- - - {item} - -
- ))} -
+ -

+

Free trial: 1 TB storage + 2 TB bandwidth, 30 days.
No credit card required.

- - Start for free - +
{/* Right: next steps */}
Next steps -

+ Ready to get the most out of your agent storage? -

-

+ + Talk to us about your use case, or head to the docs and start building today. -

+
{/* Stacked cards */}
- {[ - { - href: "/contact-sales", - label: "Talk to a person", - title: "Get in touch", - body: "If you're building something at scale and want to talk through the fit before committing.", - external: false, - }, - { - href: "https://docs.fil.one", - label: "Documentation", - title: "Docs", - body: "Quickstart, S3 compatibility reference, SDK examples, and API docs.", - external: true, - }, - ].map(({ href, label, title, body, external }) => ( + {NEXT_STEPS.map(({ href, label, title, body, external }) => (
- + {label} - +
-

- {title} -

-

- {body} -

+

{title}

+

{body}

))}
From aa720b00c9b79be7b2ba774a969765b5ad9a0db0 Mon Sep 17 00:00:00 2001 From: Filipa Date: Tue, 18 Aug 2026 15:38:19 -0300 Subject: [PATCH 02/34] Migrate /lp/genomics to LandingPage shell; add features section MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Convert GenomicsLandingPage from a hand-rolled 218-line page (radial glow div, inline fontFamily/hex everywhere, raw ) to a LandingPageConfig on the shared LandingPage shell. Extend LandingPage with an optional `features` section (icon/title/ description grid via the existing FeatureCard), since this shape recurs across the remaining /lp/* pages and the shell didn't have it. Correct copy against the console technical source-of-truth (FIL-843): the hero, a problem card, and the features grid claimed "recurring integrity verification" every ~24 hours and "11 nines durability" — neither is implemented or documented anywhere in the source-of-truth doc (no CID/proof/seal on any object; no durability figure exists). Pivoted to real capabilities instead: Object Lock retention (1 day - 100 years), $0 egress on re-analysis, and flat per-TB pricing at any scale. Replaced the "integrity assumption" problem card (also premised on the fabricated verification claim) with a real differentiator (archive-tier retrieval delay). Fixed the matching routeMeta.mjs unfurl description. Part of FIL-690. Co-Authored-By: Claude Sonnet 5 --- scripts/routeMeta.mjs | 2 +- src/components/LandingPage.test.tsx | 28 ++- src/components/LandingPage.tsx | 26 ++- src/pages/GenomicsLandingPage.tsx | 331 +++++++++++----------------- 4 files changed, 177 insertions(+), 210 deletions(-) diff --git a/scripts/routeMeta.mjs b/scripts/routeMeta.mjs index 5348cae..f1eadf3 100644 --- a/scripts/routeMeta.mjs +++ b/scripts/routeMeta.mjs @@ -349,7 +349,7 @@ export const ROUTE_META = { "/lp/genomics": { title: "Genomics & Life Sciences Data Storage · Fil One", description: - `Store genomics datasets, sequencing data, and research archives at ${PRICE_PER_TB_SHORT} with 11 nines durability, integrity proven daily, and zero egress fees.`, + `Store genomics datasets, sequencing data, and research archives at ${PRICE_PER_TB_SHORT} with zero egress fees on re-analysis, at any scale.`, }, "/lp/web3-fintech": { title: "Web3 & Fintech Data Storage · Verifiable, S3-Compatible | Fil One", diff --git a/src/components/LandingPage.test.tsx b/src/components/LandingPage.test.tsx index 5f5ee6f..471d42a 100644 --- a/src/components/LandingPage.test.tsx +++ b/src/components/LandingPage.test.tsx @@ -58,6 +58,13 @@ const WORKLOADS = { ], }; +const FEATURES = { + label: "Features", + heading: "Features heading", + sub: "Features sub", + items: [{ icon: ArrowsOut, title: "Feature title", desc: "Feature desc" }], +}; + const METRICS = { label: "Pricing", heading: "Metrics heading", @@ -80,8 +87,15 @@ const surfaces = (config: LandingPageConfig) => { describe("LandingPage — surface alternation", () => { it("alternates grey/white starting grey, with the banner matching the section above it", () => { expect( - surfaces({ ...BASE, problem: PROBLEM, comparison: COMPARISON, workloads: WORKLOADS, metrics: METRICS }) - ).toEqual(["grey", "white", "grey", "white", "white"]); + surfaces({ + ...BASE, + problem: PROBLEM, + comparison: COMPARISON, + workloads: WORKLOADS, + features: FEATURES, + metrics: METRICS, + }) + ).toEqual(["grey", "white", "grey", "white", "grey", "grey"]); }); it("keeps alternating when a middle section is omitted", () => { @@ -120,13 +134,21 @@ describe("LandingPage — optional sections", () => { const { container, getByText } = render( ); getByText("Problem heading"); getByText("Comparison heading"); getByText("Workloads heading"); + getByText("Features heading"); getByText("Metrics heading"); expect(container.querySelector("#compare")).not.toBeNull(); expect(container.querySelector("#workloads")).not.toBeNull(); diff --git a/src/components/LandingPage.tsx b/src/components/LandingPage.tsx index 5be27d9..1fb9291 100644 --- a/src/components/LandingPage.tsx +++ b/src/components/LandingPage.tsx @@ -14,6 +14,7 @@ import PriceComparisonTable, { } from "@/components/PriceComparisonTable"; import WorkloadCard, { type Workload } from "@/components/WorkloadCard"; import MetricCard from "@/components/MetricCard"; +import FeatureCard from "@/components/FeatureCard"; import CtaBanner from "@/components/CtaBanner"; /** Copy shared by every content section: eyebrow, heading, supporting line. */ @@ -56,6 +57,8 @@ export interface LandingPageConfig { }; /** Per-workload cards with bar comparisons. */ workloads?: SectionCopy & { items: Workload[] }; + /** Icon/title/description capability cards, e.g. a general features grid. */ + features?: SectionCopy & { items: { icon: PhosphorIcon; title: string; desc: string }[]; columns?: 2 | 3 | 4 }; /** Figure cards, e.g. the flat-rate breakdown or measured performance. */ metrics?: SectionCopy & { items: LandingMetric[]; valueSize?: "md" | "lg" }; cta: { @@ -97,13 +100,14 @@ const SectionHead = ({ copy, center = false }: { copy: SectionCopy; center?: boo * on a different skeleton (proof bar → features → steps or cards → FAQ). */ const LandingPage = ({ config }: { config: LandingPageConfig }) => { - const { seo, hero, problem, comparison, workloads, metrics, cta } = config; + const { seo, hero, problem, comparison, workloads, features, metrics, cta } = config; useSeo({ ogImage: "https://www.fil.one/og-image.png", ...seo }); const problemView = useInView({ threshold: 0.05 }); const comparisonView = useInView({ threshold: 0.05 }); const workloadsView = useInView({ threshold: 0.05 }); + const featuresView = useInView({ threshold: 0.05 }); const metricsView = useInView({ threshold: 0.05 }); // Surfaces alternate in render order, starting grey under the hero. The @@ -118,6 +122,7 @@ const LandingPage = ({ config }: { config: LandingPageConfig }) => { const problemSurface = problem && nextSurface(); const comparisonSurface = comparison && nextSurface(); const workloadsSurface = workloads && nextSurface(); + const featuresSurface = features && nextSurface(); const metricsSurface = metrics && nextSurface(); // The dark card is inset, so the banner has to match the section it sits // under rather than continue the alternation. @@ -196,6 +201,25 @@ const LandingPage = ({ config }: { config: LandingPageConfig }) => { )} + {/* ── Features ─────────────────────────────────────────────────────── */} + {features && ( +
+
+ +
+ {features.items.map(({ icon, title, desc }) => ( + + ))} +
+
+
+ )} + {/* ── Metrics ──────────────────────────────────────────────────────── */} {metrics && (
diff --git a/src/pages/GenomicsLandingPage.tsx b/src/pages/GenomicsLandingPage.tsx index d734ff7..7f31ef5 100644 --- a/src/pages/GenomicsLandingPage.tsx +++ b/src/pages/GenomicsLandingPage.tsx @@ -1,218 +1,139 @@ -import { ShieldCheck, ArrowsOut, ChartLine, Database } from "@phosphor-icons/react"; -import PlatformNavbar from "@/components/PlatformNavbar"; -import Footer from "@/components/Footer"; -import { useInView } from "@/hooks/useInView"; -import { useSeo } from "@/hooks/useSeo"; -import { GRID_SVG, SectionLabel, SectionHeading, SectionSub } from '@/components/LandingPrimitives'; -import { PRICE_PER_TB_SHORT, PRICE_PER_TB_MONTH } from "@/lib/pricing"; +import { ArrowsOut, ChartLine, CurrencyDollar, Lock } from "@phosphor-icons/react"; +import LandingPage, { type LandingPageConfig } from "@/components/LandingPage"; +import { PRICE_PER_TB_SHORT } from "@/lib/pricing"; +const SIGNUP_URL = "https://app.fil.one/login?screen_hint=signup"; +const SALES_URL = "/contact-sales"; -// PB-scale cost comparison. 1 PB = 1,000 TB = 1,024,000 GB. -// AWS S3 Standard us-east-1 Q2 2026 storage tiers: -// First 50 TB (51,200 GB): $0.023/GB → $1,177.60 -// Next 450 TB (460,800 GB): $0.022/GB → $10,137.60 -// Over 500 TB (512,000 GB): $0.021/GB → $10,752.00 -// Total 1 PB storage: $22,067.20 → $22,067 -// 1 PB + 200 TB analysis reads (204,800 GB) egress at $0.09/GB = $18,432 -// AWS total: $22,067 + $18,432 = $40,499 -// Fil One: 1,000 TB × $4.99 = $4,990/month, egress $0. Total $4,990. -const PB_ROWS = [ - { provider: "AWS S3 Standard", storage1pb: "$22,067", egress200tb: "$18,432", total: "$40,499", isFilOne: false }, - { provider: "Fil One", storage1pb: "$4,990", egress200tb: "$0", total: "$4,990", isFilOne: true }, -]; +const TAGLINE = "No credit card required · No egress fees · Connects in minutes"; -const FEATURES = [ - { icon: ShieldCheck, title: "Recurring integrity verification", desc: "Every stored object is verified approximately every 24 hours. Genomics datasets cannot silently corrupt between write and analysis without detection." }, - { icon: Database, title: "11 nines durability", desc: "Designed for 11 nines of durability. Long-retention datasets — sequenced once, analysed for years — require a storage layer that treats loss as an event to detect and recover." }, - { icon: ArrowsOut, title: "No egress on analysis", desc: "Re-analysing the dataset from a new pipeline, re-running variant calling, or sharing data with collaborators costs $0 in egress. The cost is the bytes you keep." }, - { icon: ChartLine, title: "Flat petabyte pricing", desc: `${PRICE_PER_TB_SHORT} regardless of scale. 1 TB and 1 PB pay the same rate per TB. Retention decisions are not driven by storage-tier economics.` }, -]; - -const GenomicsLandingPage = () => { - useSeo({ +// 1 PB stored, 200 TB re-analysed per month. AWS S3 Standard us-east-1 Q2 2026: +// tiered storage (first 50 TB $0.023/GB, next 450 TB $0.022/GB, over 500 TB +// $0.021/GB) = $22,067.20 for 1,024,000 GB. Egress: 204,800 GB x $0.09 = $18,432. +// Fil One: 1,000 TB x $4.99 = $4,990, egress $0. +const config: LandingPageConfig = { + seo: { title: "Fil One · Petabyte retention without the petabyte bill", - description: - `S3-compatible storage at ${PRICE_PER_TB_SHORT} flat for genomics and research data. Recurring integrity verification, 11 nines durability, $0 egress. Keep the whole dataset for years.`, + description: `S3-compatible storage at ${PRICE_PER_TB_SHORT} flat for genomics and research data. Zero egress fees on re-analysis, flat pricing at any scale. Keep the whole dataset for years.`, canonical: "https://www.fil.one/lp/genomics", - }); - - const { ref: problemRef, inView: problemInView } = useInView({ threshold: 0.05 }); - const { ref: tableRef, inView: tableInView } = useInView({ threshold: 0.05 }); - const { ref: integrityRef, inView: integrityInView } = useInView({ threshold: 0.05 }); - const { ref: featuresRef, inView: featuresInView } = useInView({ threshold: 0.05 }); - const { ref: ctaRef, inView: ctaInView } = useInView({ threshold: 0.05 }); - - return ( -
- -
- - {/* Hero */} -
-
+ }, - {/* Problem */} -
-
-
- The problem - Petabyte datasets cost petabytes to keep and petabytes to re-analyse. - Genomics data is produced once but analysed repeatedly, often years later as pipelines improve. Standard storage pricing charges again on every analysis — and assumes the data is intact without proving it. -
-
- {[ - { label: "The storage bill", catch: "1 PB on AWS costs $22,067/month.", body: "AWS S3 Standard at tiered rates — $0.023/GB for the first 50 TB, $0.022 for the next 450 TB, $0.021 after — adds up to $22,067/month for a single petabyte. Before a single analysis read." }, - { label: "The re-analysis cost", catch: "Running a new pipeline means paying egress again.", body: "Re-analysing 200 TB of sequencing data with a new variant-calling pipeline incurs 204,800 GB × $0.09 = $18,432 in egress on AWS. Teams plan re-analysis cycles around the egress cost, not the science." }, - { label: "The integrity assumption", catch: "Long-retention data is assumed intact.", body: "Standard object storage replicates data but does not continuously verify each stored object's content. A genomics archive held for five years can silently degrade — undetectable until the analysis fails." }, - ].map(({ label, body, catch: catchLine }) => ( -
-
- {label} -

{catchLine}

-

{body}

-
-
- ))} -
-
-
+ hero: { + badge: "For genomics and research teams with long-retention datasets", + titleMaxWidth: 800, + descriptionMaxWidth: 580, + title: ( + <> + Petabyte retention +
+ without the petabyte bill. + + ), + description: `S3-compatible storage at ${PRICE_PER_TB_SHORT} flat, with zero egress fees so re-analysis doesn't cost extra. Keep the whole dataset, for years.`, + ctas: [ + { label: "Start for free", href: SIGNUP_URL, variant: "primary" }, + { label: "Talk to an expert", href: SALES_URL, variant: "secondary" }, + ], + tagline: TAGLINE, + }, - {/* Comparison table */} -
-
-
- The numbers - 1 PB stored. 200 TB re-analysed per month. - Monthly storage for 1 PB plus egress for 200 TB of analysis reads. Computed from public US rate cards, Q2 2026. -
-
-
- - - {["Provider", "1 PB storage/mo", "200 TB egress/mo", "Total / month"].map((h) => ( - - ))} - - - - {PB_ROWS.map((row) => ( - - - - - - - ))} - -
{h}
- {row.provider} - {row.isFilOne && You} - {row.storage1pb}{row.egress200tb}{row.total}
-
-

- AWS S3 Standard us-east-1 Q2 2026 storage: tiered rates — first 50 TB $0.023/GB ($1,177.60), next 450 TB $0.022/GB ($10,137.60), over 500 TB $0.021/GB ($10,752.00) = $22,067.20 for 1,024,000 GB. AWS egress: 204,800 GB × $0.09 = $18,432. Fil One: 1,000 TB × $4.99 = $4,990, egress $0. -

-
-
+ problem: { + label: "The problem", + heading: "Petabyte datasets cost petabytes to keep and petabytes to re-analyse.", + sub: "Genomics data is produced once but analysed repeatedly, often years later as pipelines improve. Standard storage pricing charges again on every analysis.", + items: [ + { + label: "The storage bill", + tone: "warning", + catch: "1 PB on AWS costs $22,067/month.", + body: "AWS S3 Standard at tiered rates — $0.023/GB for the first 50 TB, $0.022 for the next 450 TB, $0.021 after — adds up to $22,067/month for a single petabyte. Before a single analysis read.", + }, + { + label: "The re-analysis cost", + tone: "danger", + catch: "Running a new pipeline means paying egress again.", + body: "Re-analysing 200 TB of sequencing data with a new variant-calling pipeline incurs 204,800 GB × $0.09 = $18,432 in egress on AWS. Teams plan re-analysis cycles around the egress cost, not the science.", + }, + { + label: "The access delay", + tone: "brand", + catch: "Cold storage means waiting to analyse.", + body: "Archive tiers save on storage but add retrieval delays and fees before a dataset is usable again. A five-year-old dataset should be as fast to query as one uploaded yesterday.", + }, + ], + }, - {/* Integrity section */} -
-
-
- Data integrity - Sequenced once. Verifiable indefinitely. - Genomics data that is produced once and retained for years needs continuous verification, not a write-and-hope model. Every object on Fil One is verified approximately every 24 hours — the storage layer actively confirms integrity. -
-
- {[ - { heading: "~24-hour verification cadence", sub: "Every stored object is verified on a recurring basis. Data cannot silently corrupt over months or years without detection." }, - { heading: "11 nines durability", sub: "Designed for 11 nines of durability. Long-retention research data is treated as irreplaceable — because it is." }, - { heading: "$0 to re-analyse", sub: "Running a new pipeline against the full dataset costs $0 in egress. Analysis decisions are driven by the science, not the read cost." }, - ].map(({ heading, sub }) => ( -
-

{heading}

-

{sub}

-
- ))} -
-
-
+ comparison: { + label: "The numbers", + heading: ( + <> + 1 PB stored. 200 TB re-analysed per month. + + ), + sub: "Monthly storage for 1 PB plus egress for 200 TB of analysis reads. Computed from public US rate cards, Q2 2026.", + subMaxWidth: 620, + caption: "Monthly cost for 1 PB stored, 200 TB re-analysed, by provider", + columns: [ + { key: "storage1pb", header: "1 PB storage/mo" }, + { key: "egress200tb", header: "200 TB egress/mo", colorByValue: true }, + { key: "total", header: "Total / month", total: true }, + ], + rows: [ + { + provider: "AWS S3 Standard", + values: { storage1pb: "$22,067", egress200tb: "$18,432", total: "$40,499" }, + }, + { + provider: "Fil One", + isFilOne: true, + values: { storage1pb: "$4,990", egress200tb: "$0", total: "$4,990" }, + }, + ], + footnote: + "AWS S3 Standard us-east-1 Q2 2026 storage: tiered rates — first 50 TB $0.023/GB ($1,177.60), next 450 TB $0.022/GB ($10,137.60), over 500 TB $0.021/GB ($10,752.00) = $22,067.20 for 1,024,000 GB. AWS egress: 204,800 GB × $0.09 = $18,432. Fil One: 1,000 TB × $4.99 = $4,990, egress $0.", + }, - {/* Features */} -
-
-
- Research storage - Keep the whole dataset. For years. -
-
- {FEATURES.map(({ icon: Icon, title, desc }) => ( -
-
-

{title}

-

{desc}

-
- ))} -
-
-
+ features: { + label: "Research storage", + heading: ( + <> + Keep the whole dataset. For years. + + ), + sub: "S3-compatible storage built for data that's written once and read for years.", + items: [ + { + icon: Lock, + title: "Object Lock retention", + desc: "Configure retention from 1 day to 100 years at the bucket level, so a long-retention dataset can't be deleted or altered early.", + }, + { + icon: ArrowsOut, + title: "No egress on analysis", + desc: "Re-analysing the dataset from a new pipeline, re-running variant calling, or sharing data with collaborators costs $0 in egress. The cost is the bytes you keep.", + }, + { + icon: ChartLine, + title: "Consistent at any scale", + desc: "The same S3 API whether you store 1 TB or 1 PB. No storage tiers, no rehydration delay before a dataset is usable.", + }, + { + icon: CurrencyDollar, + title: "Flat petabyte pricing", + desc: `${PRICE_PER_TB_SHORT} regardless of scale. 1 TB and 1 PB pay the same rate per TB. Retention decisions are not driven by storage-tier economics.`, + }, + ], + }, - {/* Pricing */} -
-
-
- Pricing - One rate. {PRICE_PER_TB_MONTH}. - Storage. That is the whole bill. Integrity verification, 11 nines durability, and free egress are included at every scale. -
- -

No credit card required · No egress fees · Connects in minutes

-
-
- - {/* Dark CTA */} -
-
-
- -
-
- - -
-
- ); + cta: { + heading: "Keep the whole dataset. For years.", + subhead: "Free 1 TB evaluation. Upload a dataset slice and confirm your existing analysis tooling connects without modification.", + cta: { label: "Start for free", href: SIGNUP_URL }, + secondaryCta: { label: "Talk to an expert", href: SALES_URL }, + note: TAGLINE, + }, }; +const GenomicsLandingPage = () => ; + export default GenomicsLandingPage; From cd0b4911024faf8acfe17c3e2f302641e81a301f Mon Sep 17 00:00:00 2001 From: Filipa Date: Tue, 18 Aug 2026 15:39:59 -0300 Subject: [PATCH 03/34] Migrate /lp/ml-training to LandingPage shell MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Convert MlTrainingLandingPage from a hand-rolled 237-line page to a LandingPageConfig. Dropped the fsspec/PyArrow code sample from the "proof" section — the same fsspec-compatibility claim is already stated in the features grid, and the shell has no side-by-side code+table section shape, so keeping it would mean a one-off custom section for a single page. No FIL-843 copy hits on this page — all claims are pricing math and framework compatibility, both verifiable as-is. Part of FIL-690. Co-Authored-By: Claude Sonnet 5 --- src/pages/MlTrainingLandingPage.tsx | 354 ++++++++++------------------ 1 file changed, 126 insertions(+), 228 deletions(-) diff --git a/src/pages/MlTrainingLandingPage.tsx b/src/pages/MlTrainingLandingPage.tsx index 5b894b9..32f47fc 100644 --- a/src/pages/MlTrainingLandingPage.tsx +++ b/src/pages/MlTrainingLandingPage.tsx @@ -1,237 +1,135 @@ import { Database, ArrowsOut, ChartLine, Plug } from "@phosphor-icons/react"; -import PlatformNavbar from "@/components/PlatformNavbar"; -import Footer from "@/components/Footer"; -import { useInView } from "@/hooks/useInView"; -import { useSeo } from "@/hooks/useSeo"; -import { GRID_SVG, SectionLabel, SectionHeading, SectionSub } from '@/components/LandingPrimitives'; -import { PRICE_DISPLAY, PRICE_PER_TB_SHORT, PRICE_PER_TB_MONTH } from "@/lib/pricing"; +import LandingPage, { type LandingPageConfig } from "@/components/LandingPage"; +import { PRICE_DISPLAY, PRICE_PER_TB_SHORT } from "@/lib/pricing"; +const SIGNUP_URL = "https://app.fil.one/login?screen_hint=signup"; +const SALES_URL = "/contact-sales"; -// Storage cost comparison for ML training data. -// AWS EFS (gp bursting): $0.30/GB = $307.20/TB -// AWS S3 Standard: $0.023/GB = $23.55/TB + $0.09/GB egress per training run -// Fil One: $4.99/TB, $0 egress -// 10 TB training data, 20 training runs/month reading the full set: -// EFS: 10 TB stored = $3,072/mo (no egress charge but very expensive storage) -// S3: 10 TB stored = $235.52 + 20 runs × 10 TB × $0.09/GB egress -// = $235.52 + 20 × 10,240 × $0.09 = $235.52 + $18,432 = $18,668/mo -// Fil One: 10 TB × $4.99 = $49.90, egress $0 -const COST_ROWS = [ - { storage: "AWS EFS (gp)", perTb: "$307/TB", egress: "N/A", monthly10tb: "$3,072", isFilOne: false }, - { storage: "AWS S3 + 20 runs", perTb: "$23.55/TB", egress: "$0.09/GB", monthly10tb: "$18,668", isFilOne: false }, - { storage: "Fil One", perTb: PRICE_PER_TB_SHORT, egress: "$0", monthly10tb: "$50", isFilOne: true }, -]; +const TAGLINE = "No credit card required · No egress fees · Connects in minutes"; -const FEATURES = [ - { icon: ChartLine, title: "62× cheaper than EFS", desc: `AWS EFS costs $0.30/GB ($307/TB). Fil One costs ${PRICE_PER_TB_SHORT}. At 10 TB of training data, that is $3,072/month vs $50 — before a single training run reads a byte.` }, - { icon: ArrowsOut, title: "No egress on training reads", desc: "Each training run reads the full dataset. On AWS S3, 20 runs a month over 10 TB costs $18,432 in egress alone. On Fil One, every read is included in flat storage." }, - { icon: Plug, title: "fsspec / PyArrow / HuggingFace native", desc: "PyTorch DataLoader, JAX, HuggingFace datasets, and PyArrow all support S3-compatible storage via fsspec. Change the endpoint — nothing else changes." }, - { icon: Database, title: "Flat cost at any run frequency", desc: `Run training 5 times or 500 times. The storage bill is the TB you keep times ${PRICE_DISPLAY}. Run frequency is an engineering decision, not a cost one.` }, -]; - -const MlTrainingLandingPage = () => { - useSeo({ +// 10 TB training data, 20 training runs/month reading the full set. +// AWS EFS (gp bursting): $0.30/GB = $307.20/TB -> 10 TB = $3,072/mo, no egress line. +// AWS S3 Standard: $0.023/GB storage ($235.52) + 20 runs x 10,240 GB x $0.09/GB egress +// = $235.52 + $18,432 = $18,668/mo. +// Fil One: 10 TB x $4.99 = $49.90, egress $0. +const config: LandingPageConfig = { + seo: { title: "Fil One · Build around the clock", - description: - `S3-compatible training-data storage at ${PRICE_PER_TB_SHORT} flat. No egress on dataset reads. 62× cheaper than AWS EFS. fsspec, PyArrow, and HuggingFace datasets work natively.`, + description: `S3-compatible training-data storage at ${PRICE_PER_TB_SHORT} flat. No egress on dataset reads. 62× cheaper than AWS EFS. fsspec, PyArrow, and HuggingFace datasets work natively.`, canonical: "https://www.fil.one/lp/ml-training", - }); - - const { ref: problemRef, inView: problemInView } = useInView({ threshold: 0.05 }); - const { ref: proofRef, inView: proofInView } = useInView({ threshold: 0.05 }); - const { ref: featuresRef,inView: featuresInView } = useInView({ threshold: 0.05 }); - const { ref: ctaRef, inView: ctaInView } = useInView({ threshold: 0.05 }); - - const FSSPEC_CODE = `import fsspec, os -import pyarrow.dataset as ds -from torch.utils.data import DataLoader - -# Training data on Fil One — ${PRICE_PER_TB_SHORT}, $0 egress per run -fs = fsspec.filesystem( - "s3", - endpoint_url="https://eu-west-1.s3.fil.one", - key=os.environ["FIL_ACCESS_KEY"], - secret=os.environ["FIL_SECRET_KEY"], -) - -# PyArrow reads Parquet shards directly — same API as S3 -dataset = ds.dataset( - "s3://training-data/imagenet/shards/", - filesystem=fs, - format="parquet", -) - -# HuggingFace datasets — same endpoint -from datasets import load_dataset -ds_hf = load_dataset( - "parquet", - data_files="s3://training-data/instruct/train.parquet", - storage_options={ - "endpoint_url": "https://eu-west-1.s3.fil.one", - "key": os.environ["FIL_ACCESS_KEY"], - "secret": os.environ["FIL_SECRET_KEY"], - }, -)`; - - return ( -
- -
- - {/* Hero */} -
-
- - {/* Problem */} -
-
-
- The tradeoff - Fast storage or affordable storage. Training teams have been told to pick one. - - In-cluster storage (EFS, NFS, proprietary object stores) is fast but expensive. Standard cloud object storage is cheap but slow from the compute side — and charges egress every time a run reads the dataset. Fil One is both flat and S3-compatible. - -
-
- {[ - { label: "The EFS tax", catch: "$307/TB for in-cluster storage.", body: "AWS EFS costs $0.30/GB — $307/TB — because it is optimised for latency, not cost. A 10 TB training corpus costs $3,072/month. Teams pay that to avoid the alternative: slow, metered S3." }, - { label: "The egress trap", catch: "Every training run reads the full dataset.", body: "Using standard S3 instead of EFS saves on storage but adds $0.09/GB egress per read. 20 training runs over a 10 TB dataset costs $18,432 in egress alone that month. The compute bill is not the whole story." }, - { label: "The iteration limit", catch: "Storage cost constrains how often you can train.", body: "When each run carries an egress cost, teams gate training iterations. Ablations get skipped. Re-runs get deferred. The research output is shaped by the infrastructure bill." }, - ].map(({ label, body, catch: c }) => ( -
-
- {label} -

{c}

-

{body}

-
-
- ))} -
-
-
- - {/* Proof */} -
-
-
- The numbers - 10 TB training data. 20 training runs per month. - Same dataset, three storage options. Monthly cost for storage plus the egress cost of reading the full set 20 times. -
- -
- {/* Code block */} -
-
training_data.py
-
{FSSPEC_CODE}
-
- - {/* Cost table */} -
- Monthly cost, 10 TB + 20 full-dataset reads -
- - - - {["Storage", "Rate", "Egress", "Total/mo"].map(h => ( - - ))} - - - - {COST_ROWS.map(r => ( - - - - - - - ))} - -
{h}
{r.storage}{r.isFilOne && You}{r.perTb}{r.egress}{r.monthly10tb}
-
-

- AWS EFS gp bursting us-east-1: $0.30/GB. AWS S3 Standard: $0.023/GB storage + $0.09/GB egress per read. Computed: EFS 10,240 GB × $0.30 = $3,072; S3 storage $235.52 + 20 runs × 10,240 GB × $0.09 = $18,432 egress. Fil One: 10 TB × $4.99 = $49.90, egress $0. Q2 2026 public rate cards. -

-
-
-
-
- - {/* Features */} -
-
-
- Why it works - Training cost that scales with dataset size, not run count. -
-
- {FEATURES.map(({ icon: Icon, title, desc }) => ( -
-
-

{title}

-

{desc}

-
- ))} -
-
-
- - {/* Pricing */} -
-
-
- Pricing - One rate. {PRICE_PER_TB_MONTH}. - Storage. That is the whole bill. Run training 5 times or 500 times — the storage invoice does not change. -
- -

No credit card required · No egress fees · Connects in minutes

-
-
- - {/* Dark CTA */} -
-
-
- -
-
-
-
-
- ); + }, + + hero: { + badge: "For ML infrastructure leads and training teams", + titleMaxWidth: 720, + descriptionMaxWidth: 580, + title: ( + <> + Build around +
+ the clock. + + ), + description: `Training-data storage at ${PRICE_PER_TB_SHORT} flat. No egress on dataset reads. fsspec, PyArrow, and HuggingFace datasets work natively — change the endpoint, keep the code.`, + ctas: [ + { label: "Start for free", href: SIGNUP_URL, variant: "primary" }, + { label: "Talk to an expert", href: SALES_URL, variant: "secondary" }, + ], + tagline: TAGLINE, + }, + + problem: { + label: "The tradeoff", + heading: "Fast storage or affordable storage. Training teams have been told to pick one.", + sub: "In-cluster storage (EFS, NFS, proprietary object stores) is fast but expensive. Standard cloud object storage is cheap but charges egress every time a run reads the dataset. Fil One is both flat and S3-compatible.", + subMaxWidth: 620, + items: [ + { + label: "The EFS tax", + tone: "warning", + catch: "$307/TB for in-cluster storage.", + body: "AWS EFS costs $0.30/GB — $307/TB — because it is optimised for latency, not cost. A 10 TB training corpus costs $3,072/month. Teams pay that to avoid the alternative: slow, metered S3.", + }, + { + label: "The egress trap", + tone: "danger", + catch: "Every training run reads the full dataset.", + body: "Using standard S3 instead of EFS saves on storage but adds $0.09/GB egress per read. 20 training runs over a 10 TB dataset costs $18,432 in egress alone that month. The compute bill is not the whole story.", + }, + { + label: "The iteration limit", + tone: "brand", + catch: "Storage cost constrains how often you can train.", + body: "When each run carries an egress cost, teams gate training iterations. Ablations get skipped. Re-runs get deferred. The research output is shaped by the infrastructure bill.", + }, + ], + }, + + comparison: { + label: "The numbers", + heading: ( + <> + 10 TB training data. 20 training runs per month. + + ), + sub: "Same dataset, three storage options. Monthly cost for storage plus the egress cost of reading the full set 20 times.", + subMaxWidth: 620, + caption: "Monthly cost for 10 TB training data + 20 full-dataset reads, by storage option", + columns: [ + { key: "rate", header: "Rate" }, + { key: "egress", header: "Egress", colorByValue: true }, + { key: "total", header: "Total / mo", total: true }, + ], + rows: [ + { provider: "AWS EFS (gp)", values: { rate: "$307/TB", egress: "N/A", total: "$3,072" } }, + { provider: "AWS S3 + 20 runs", values: { rate: "$23.55/TB", egress: "$0.09/GB", total: "$18,668" } }, + { provider: "Fil One", isFilOne: true, values: { rate: PRICE_PER_TB_SHORT, egress: "$0", total: "$50" } }, + ], + footnote: + "AWS EFS gp bursting us-east-1: $0.30/GB. AWS S3 Standard: $0.023/GB storage + $0.09/GB egress per read. Computed: EFS 10,240 GB × $0.30 = $3,072; S3 storage $235.52 + 20 runs × 10,240 GB × $0.09 = $18,432 egress. Fil One: 10 TB × $4.99 = $49.90, egress $0. Q2 2026 public rate cards.", + }, + + features: { + label: "Why it works", + heading: ( + <> + Training cost that scales with dataset size, not run count. + + ), + sub: "fsspec, PyArrow, and HuggingFace datasets work natively — change the endpoint, keep the code.", + items: [ + { + icon: ChartLine, + title: "62× cheaper than EFS", + desc: `AWS EFS costs $0.30/GB ($307/TB). Fil One costs ${PRICE_PER_TB_SHORT}. At 10 TB of training data, that is $3,072/month vs $50 — before a single training run reads a byte.`, + }, + { + icon: ArrowsOut, + title: "No egress on training reads", + desc: "Each training run reads the full dataset. On AWS S3, 20 runs a month over 10 TB costs $18,432 in egress alone. On Fil One, every read is included in flat storage.", + }, + { + icon: Plug, + title: "fsspec / PyArrow / HuggingFace native", + desc: "PyTorch DataLoader, JAX, HuggingFace datasets, and PyArrow all support S3-compatible storage via fsspec. Change the endpoint — nothing else changes.", + }, + { + icon: Database, + title: "Flat cost at any run frequency", + desc: `Run training 5 times or 500 times. The storage bill is the TB you keep times ${PRICE_DISPLAY}. Run frequency is an engineering decision, not a cost one.`, + }, + ], + }, + + cta: { + heading: "Run as many times as the model needs.", + subhead: "Free 1 TB evaluation. Point fsspec or PyArrow at the endpoint and run the training loop — the egress line will not be there.", + cta: { label: "Start for free", href: SIGNUP_URL }, + secondaryCta: { label: "Talk to an expert", href: SALES_URL }, + note: TAGLINE, + }, }; +const MlTrainingLandingPage = () => ; + export default MlTrainingLandingPage; From 7d6c9daf6bd28106ab2b5fbd1a8d89915e3e4620 Mon Sep 17 00:00:00 2001 From: Filipa Date: Tue, 18 Aug 2026 15:41:20 -0300 Subject: [PATCH 04/34] Migrate /lp/agent-loops to LandingPage shell MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Convert AgentLoopsLandingPage from a hand-rolled 266-line page to a LandingPageConfig. Dropped the boto3 code sample from the "proof" section for the same reason as ml-training: the S3-compatibility claim is already stated in the features grid, and the shell has no side-by-side code+table section shape. No FIL-843 copy hits — all claims are pricing math and framework compatibility, both verifiable as-is. Part of FIL-690. Co-Authored-By: Claude Sonnet 5 --- src/pages/AgentLoopsLandingPage.tsx | 374 +++++++++------------------- 1 file changed, 122 insertions(+), 252 deletions(-) diff --git a/src/pages/AgentLoopsLandingPage.tsx b/src/pages/AgentLoopsLandingPage.tsx index cfd6ba0..78c6452 100644 --- a/src/pages/AgentLoopsLandingPage.tsx +++ b/src/pages/AgentLoopsLandingPage.tsx @@ -1,266 +1,136 @@ import { Database, ArrowsOut, ChartLine, Plug } from "@phosphor-icons/react"; -import PlatformNavbar from "@/components/PlatformNavbar"; -import Footer from "@/components/Footer"; -import { useInView } from "@/hooks/useInView"; -import { useSeo } from "@/hooks/useSeo"; -import { GRID_SVG, SectionLabel, SectionHeading, SectionSub } from '@/components/LandingPrimitives'; -import { PRICE_DISPLAY, PRICE_PER_TB_SHORT, PRICE_PER_TB_MONTH } from "@/lib/pricing"; +import LandingPage, { type LandingPageConfig } from "@/components/LandingPage"; +import { PRICE_DISPLAY, PRICE_PER_TB_SHORT } from "@/lib/pricing"; -// Per-call cost comparison for agent workload: -// 1 billion operations/month (mix of PUT state writes + GET context reads). -// AWS S3: PUTs $0.005/1K + GETs $0.0004/1K — for simplicity using PUT rate throughout: -// 1,000,000,000 / 1,000 × $0.005 = $5,000 in request fees alone. -// Plus egress if agent reads context cross-region: significant additional cost. -// Managed AI storage (per-query pricing): $0.001–$0.01 per call typically. -// At $0.002/call × 1B calls = $2,000,000 (extreme example, but illustrative). -// Fil One: $0 per request, $0 egress. Cost = only bytes stored. -const PUT_ROWS = [ - { name: "AWS S3 Standard", rate: "$0.005 / 1K PUTs", monthly: "$5,000", win: false, you: false }, - { name: "Google Cloud Storage", rate: "$0.05 / 10K ops", monthly: "$5,000", win: false, you: false }, - { name: "Azure Blob Storage", rate: "$0.055 / 10K writes", monthly: "$5,500", win: false, you: false }, - { name: "Wasabi", rate: "$0 per request", monthly: "$0", win: true, you: false }, - { name: "Backblaze B2", rate: "$0 per request", monthly: "$0", win: true, you: false }, - { name: "Fil One", rate: "$0 per request", monthly: "$0", win: true, you: true }, -]; +const SIGNUP_URL = "https://app.fil.one/login?screen_hint=signup"; +const SALES_URL = "/contact-sales"; -const FEATURES = [ - { - icon: Database, - title: "No per-request fees", - desc: "PUT, GET, LIST, HEAD — all included in flat storage. Agents that write state every turn and read context on every call pay $0 in request fees.", - }, - { - icon: ArrowsOut, - title: "No egress on context reads", - desc: "Retrieving memory, loading corpus chunks, and reading prior outputs cost $0 in egress. Agent loops that read frequently pay for storage, not for reads.", - }, - { - icon: Plug, - title: "S3-compatible · existing tools work", - desc: "boto3, @aws-sdk/client-s3, LangChain S3 loaders, LlamaIndex — any tool that reads or writes S3 connects with an endpoint change. No new SDK.", - }, - { - icon: ChartLine, - title: "Cost that scales with data, not calls", - desc: `${PRICE_PER_TB_SHORT} flat. An agent that makes 10 million calls a day but stores 1 TB pays ${PRICE_DISPLAY}/month. Call frequency is not a billing input.`, - }, -]; +const TAGLINE = "No credit card required · No per-request fees · Connects in minutes"; -const AgentLoopsLandingPage = () => { - useSeo({ +// Request-fee-only comparison at 1 billion ops/month. +// AWS S3: 1,000,000,000 / 1,000 x $0.005 = $5,000. Google: $0.05/10K x 1B = $5,000. +// Azure: $0.055/10K x 1B = $5,500. Wasabi, Backblaze B2, Fil One: $0 per request. +const config: LandingPageConfig = { + seo: { title: "Fil One · Let agents run. Not your bill.", - description: - `S3-compatible storage at ${PRICE_PER_TB_SHORT} flat. No per-PUT fees, no per-GET fees, no egress. Agent loops run at full speed without a per-call counter.`, + description: `S3-compatible storage at ${PRICE_PER_TB_SHORT} flat. No per-PUT fees, no per-GET fees, no egress. Agent loops run at full speed without a per-call counter.`, canonical: "https://www.fil.one/lp/agent-loops", - }); - - const { ref: problemRef, inView: problemInView } = useInView({ threshold: 0.05 }); - const { ref: proofRef, inView: proofInView } = useInView({ threshold: 0.05 }); - const { ref: featuresRef, inView: featuresInView } = useInView({ threshold: 0.05 }); - const { ref: ctaRef, inView: ctaInView } = useInView({ threshold: 0.05 }); - - const AGENT_CODE = `import boto3, os - -# Flat-rate storage — no per-call counter -s3 = boto3.client( - "s3", - endpoint_url="https://eu-west-1.s3.fil.one", - aws_access_key_id=os.environ["FIL_ACCESS_KEY"], - aws_secret_access_key=os.environ["FIL_SECRET_KEY"], - region_name="eu-west-1", -) - -# Write state on every agent step — $0 per PUT -s3.put_object( - Bucket="agent-state", - Key=f"agents/{agent_id}/step-{step}.json", - Body=json.dumps(state), -) - -# Read context on every turn — $0 egress -ctx = s3.get_object( - Bucket="agent-state", - Key=f"memory/{agent_id}/context.json", -)["Body"].read() - -# High-frequency tool output — still $0 per call -s3.put_object( - Bucket="agent-state", - Key=f"outputs/{run_id}/{tool}/{ts}.json", - Body=json.dumps(tool_output), -) -# 10 million calls today: $0 in request fees`; - - return ( -
- -
- - {/* Hero */} -
-
- - {/* Problem */} -
-
-
- The billing problem - Agents are high-frequency workloads. Per-call pricing taxes that frequency. - - Every agent step writes state. Every context-aware turn reads memory. Every tool call produces output. Storage that charges per operation makes agents expensive to run, and the cost scales with capability, not with data volume. - -
-
- {[ - { - label: "The write counter", - catch: "Every state write is a metered event on S3.", - body: "AWS S3 charges $0.005 per 1,000 PUTs. An agent writing state on every step, across hundreds of concurrent runs, generates millions of PUTs per day. At scale, the request bill exceeds the storage bill.", - }, - { - label: "The retrieval tax", - catch: "Reading context and memory charges egress.", - body: "Agents that retrieve context, load memory, or read prior outputs pay $0.09/GB in egress on every read from AWS. The more context-aware the agent, the more it reads, and the more the bill grows.", - }, - { - label: "The framework lock", - catch: "Purpose-built AI storage charges per query.", - body: "Managed vector databases and agent memory platforms charge per API call. Teams building high-frequency agents find that per-query pricing makes the storage layer the dominant cost, not the LLM.", - }, - ].map(({ label, body, catch: c }) => ( -
-
- {label} -

{c}

-

{body}

-
-
- ))} -
-
-
- - {/* Proof — code block + per-call comparison */} -
-
-
- The proof - - Same boto3. Zero per-call counter. - - - Any S3-compatible tool your agent already uses connects with an endpoint change. Writes, reads, and lists are all included in flat storage. - -
-
- {/* Code block */} -
-
- agent_storage.py -
-
-                  {AGENT_CODE}
-                
-
+ }, - {/* Per-call comparison */} -
- Request fees only — 1 billion ops/month -
- {PUT_ROWS.map(r => ( -
- {r.name} - {r.rate} - {r.monthly} -
- ))} -
-

- Public US rate cards, Q2 2026. Request fees only — storage and egress are separate on metered tiers and zero on Fil One. AWS: 1,000,000,000 / 1,000 × $0.005 = $5,000. Google: $0.05/10K × 1B = $5,000. Azure: $0.055/10K × 1B = $5,500. -

-
-
-
-
+ hero: { + badge: "For developers building AI agents and autonomous pipelines", + titleMaxWidth: 720, + descriptionMaxWidth: 580, + title: ( + <> + Let agents run. +
+ Not your bill. + + ), + description: `S3-compatible storage at ${PRICE_PER_TB_SHORT} flat. No per-PUT fees, no per-GET fees, no egress. Agent loops run at full speed without a per-call counter.`, + ctas: [ + { label: "Start for free", href: SIGNUP_URL, variant: "primary" }, + { label: "Talk to an expert", href: SALES_URL, variant: "secondary" }, + ], + tagline: TAGLINE, + }, - {/* Features */} -
-
-
- Built for high-frequency workloads - - Storage cost that scales with data, not with calls. - - The only change is the endpoint. Call frequency stops being a billing variable. -
-
- {FEATURES.map(({ icon: Icon, title, desc }) => ( -
-
-

{title}

-

{desc}

-
- ))} -
-
-
+ problem: { + label: "The billing problem", + heading: "Agents are high-frequency workloads. Per-call pricing taxes that frequency.", + sub: "Every agent step writes state. Every context-aware turn reads memory. Every tool call produces output. Storage that charges per operation makes agents expensive to run, and the cost scales with capability, not with data volume.", + subMaxWidth: 620, + items: [ + { + label: "The write counter", + tone: "warning", + catch: "Every state write is a metered event on S3.", + body: "AWS S3 charges $0.005 per 1,000 PUTs. An agent writing state on every step, across hundreds of concurrent runs, generates millions of PUTs per day. At scale, the request bill exceeds the storage bill.", + }, + { + label: "The retrieval tax", + tone: "danger", + catch: "Reading context and memory charges egress.", + body: "Agents that retrieve context, load memory, or read prior outputs pay $0.09/GB in egress on every read from AWS. The more context-aware the agent, the more it reads, and the more the bill grows.", + }, + { + label: "The framework lock", + tone: "brand", + catch: "Purpose-built AI storage charges per query.", + body: "Managed vector databases and agent memory platforms charge per API call. Teams building high-frequency agents find that per-query pricing makes the storage layer the dominant cost, not the LLM.", + }, + ], + }, - {/* Pricing */} -
-
-
- Pricing - One rate. {PRICE_PER_TB_MONTH}. - Storage. That is the whole bill. Run agents at any frequency — the invoice is determined by bytes stored, not calls made. -
- -

No credit card required · No per-request fees · Connects in minutes

-
-
+ comparison: { + label: "The proof", + heading: ( + <> + Same boto3. Zero per-call counter. + + ), + sub: "Any S3-compatible tool your agent already uses connects with an endpoint change. Writes, reads, and lists are all included in flat storage.", + subMaxWidth: 620, + caption: "Request fees only, at 1 billion operations/month, by provider", + columns: [ + { key: "rate", header: "Rate" }, + { key: "monthly", header: "Monthly (1B ops)", total: true }, + ], + rows: [ + { provider: "AWS S3 Standard", values: { rate: "$0.005 / 1K PUTs", monthly: "$5,000" } }, + { provider: "Google Cloud Storage", values: { rate: "$0.05 / 10K ops", monthly: "$5,000" } }, + { provider: "Azure Blob Storage", values: { rate: "$0.055 / 10K writes", monthly: "$5,500" } }, + { provider: "Wasabi", values: { rate: "$0 per request", monthly: "$0" } }, + { provider: "Backblaze B2", values: { rate: "$0 per request", monthly: "$0" } }, + { provider: "Fil One", isFilOne: true, values: { rate: "$0 per request", monthly: "$0" } }, + ], + footnote: + "Public US rate cards, Q2 2026. Request fees only — storage and egress are separate on metered tiers and zero on Fil One. AWS: 1,000,000,000 / 1,000 × $0.005 = $5,000. Google: $0.05/10K × 1B = $5,000. Azure: $0.055/10K × 1B = $5,500.", + }, - {/* Dark CTA */} -
-
-
- -
-
+ features: { + label: "Built for high-frequency workloads", + heading: ( + <> + Storage cost that scales with data, not with calls. + + ), + sub: "The only change is the endpoint. Call frequency stops being a billing variable.", + subMaxWidth: 560, + items: [ + { + icon: Database, + title: "No per-request fees", + desc: "PUT, GET, LIST, HEAD — all included in flat storage. Agents that write state every turn and read context on every call pay $0 in request fees.", + }, + { + icon: ArrowsOut, + title: "No egress on context reads", + desc: "Retrieving memory, loading corpus chunks, and reading prior outputs cost $0 in egress. Agent loops that read frequently pay for storage, not for reads.", + }, + { + icon: Plug, + title: "S3-compatible · existing tools work", + desc: "boto3, @aws-sdk/client-s3, LangChain S3 loaders, LlamaIndex — any tool that reads or writes S3 connects with an endpoint change. No new SDK.", + }, + { + icon: ChartLine, + title: "Cost that scales with data, not calls", + desc: `${PRICE_PER_TB_SHORT} flat. An agent that makes 10 million calls a day but stores 1 TB pays ${PRICE_DISPLAY}/month. Call frequency is not a billing input.`, + }, + ], + }, -
-
-
- ); + cta: { + heading: "Let agents run. Not your bill.", + subhead: "Free 1 TB evaluation. Connect your existing agent storage code and watch the request counter disappear.", + cta: { label: "Start for free", href: SIGNUP_URL }, + secondaryCta: { label: "Talk to an expert", href: SALES_URL }, + note: TAGLINE, + }, }; +const AgentLoopsLandingPage = () => ; + export default AgentLoopsLandingPage; From a2ef2549fd5f223ea5eada1283c80c338162f81a Mon Sep 17 00:00:00 2001 From: Filipa Date: Tue, 18 Aug 2026 15:43:07 -0300 Subject: [PATCH 05/34] Migrate /lp/metro to LandingPage shell; fix geo-network overclaim MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Convert MetroLandingPage from a hand-rolled 230-line page to a LandingPageConfig. This page's whole premise was a FIL-843 hit: the hero, all three problem cards, and the features grid built the value prop around "a global network of storage providers" removing a proximity/speed tradeoff. Per the console source-of-truth doc, only two regions are GA (eu-west-1 France, us-east-1 Michigan) — there is no global network to point to. Repositioned the page's argument from geography to tiering: the real differentiator is that Fil One is always-hot, S3-compatible storage with no egress, unlike hyperscalers who charge a premium for hot storage or push you to archive tiers with retrieval delays. Rewrote the hero description, all three problem cards, and the "Global network of providers" feature accordingly. The pricing comparison table itself was untouched (pure rate-card math, no geo claim). Fixed the matching routeMeta.mjs unfurl description. Part of FIL-690. Co-Authored-By: Claude Sonnet 5 --- scripts/routeMeta.mjs | 2 +- src/pages/MetroLandingPage.tsx | 343 ++++++++++++--------------------- 2 files changed, 128 insertions(+), 217 deletions(-) diff --git a/scripts/routeMeta.mjs b/scripts/routeMeta.mjs index f1eadf3..dad7a79 100644 --- a/scripts/routeMeta.mjs +++ b/scripts/routeMeta.mjs @@ -461,7 +461,7 @@ export const ROUTE_META = { "/lp/metro": { title: "Fil One · Hyperscaler speed. Budget-tier bills.", description: - `S3-compatible object storage at ${PRICE_PER_TB_SHORT} flat. A global network of storage providers — fast reads without the hyperscaler price tag. No egress fees.`, + `S3-compatible object storage at ${PRICE_PER_TB_SHORT} flat. Always-hot storage with no egress fees — fast reads without the hyperscaler price tag.`, }, "/lp/data-control": { title: "Fil One · Your data, under your control", diff --git a/src/pages/MetroLandingPage.tsx b/src/pages/MetroLandingPage.tsx index 26bc895..c9502e6 100644 --- a/src/pages/MetroLandingPage.tsx +++ b/src/pages/MetroLandingPage.tsx @@ -1,229 +1,140 @@ -import { ArrowsOut, ChartLine, Plug, ShieldCheck } from "@phosphor-icons/react"; -import PlatformNavbar from "@/components/PlatformNavbar"; -import Footer from "@/components/Footer"; -import { useInView } from "@/hooks/useInView"; -import { useSeo } from "@/hooks/useSeo"; -import { GRID_SVG, SectionLabel, SectionHeading, SectionSub } from '@/components/LandingPrimitives'; -import { PRICE_PER_TB_SHORT, PRICE_PER_TB_MONTH } from "@/lib/pricing"; +import { ArrowsOut, ChartLine, Plug, Lightning } from "@phosphor-icons/react"; +import LandingPage, { type LandingPageConfig } from "@/components/LandingPage"; +import { PRICE_PER_TB_SHORT } from "@/lib/pricing"; -// 10 TB stored, 10 TB read/month — same scenario as egress page for comparability. -// AWS S3 Standard us-east-1: $0.023/GB storage + $0.09/GB egress. -// Storage: 10,240 × $0.023 = $235.52 -// Egress: 10,240 × $0.09 = $921.60 -// Total: $1,157.12 → $1,157 -// Fil One: 10 × $4.99 = $49.90, $0 egress. -const COMPARE_ROWS = [ - { provider: "AWS S3 Standard", storage: "$236", egress: "$922", total: "$1,157", isFilOne: false }, - { provider: "Google Cloud", storage: "$205", egress: "$1,228", total: "$1,433", isFilOne: false }, - { provider: "Azure Blob (Hot)", storage: "$184", egress: "$890", total: "$1,074", isFilOne: false }, - { provider: "Wasabi", storage: "$70", egress: "$0", total: "$70", isFilOne: false }, - { provider: "Backblaze B2", storage: "$60", egress: "$0", total: "$60", isFilOne: false }, - { provider: "Fil One", storage: "$50", egress: "$0", total: "$50", isFilOne: true }, -]; +const SIGNUP_URL = "https://app.fil.one/login?screen_hint=signup"; +const SALES_URL = "/contact-sales"; -const FEATURES = [ - { - icon: ShieldCheck, - title: "Global network of providers", - desc: "Data is distributed across an independent global network of storage providers — not concentrated in three or four hyperscaler regions. Your team doesn't pay a proximity premium.", - }, - { - icon: ArrowsOut, - title: "No egress fees", - desc: "$0 to read your own data. The cost of accessing data from wherever you are is the same as the cost of storing it — nothing extra.", - }, - { - icon: Plug, - title: "S3-compatible", - desc: "Standard S3 API. The same SDKs, CLIs, and integrations your team already uses connect with an endpoint change. No migration project.", - }, - { - icon: ChartLine, - title: "Flat, predictable cost", - desc: `${PRICE_PER_TB_SHORT} regardless of where your team is, how often they read, or how fast your data grows. One rate. One line on the invoice.`, - }, -]; +const TAGLINE = "No credit card required · No egress fees · Connects in minutes"; -const MetroLandingPage = () => { - useSeo({ +// 10 TB stored, 10 TB read/month — same scenario as the egress page, for comparability. +// AWS S3 Standard us-east-1: 10,240 GB x $0.023 storage + 10,240 GB x $0.09 egress +// = $235.52 + $921.60 = $1,157.12. +// GCP: $0.020/GB storage + $0.12/GB egress (first 10 TB tier). +// Azure: ~$0.018/GB storage + $0.087/GB egress. Wasabi $6.99/TB. Backblaze B2 $6/TB. +// Fil One: 10 x $4.99 = $49.90, $0 egress. +const config: LandingPageConfig = { + seo: { title: "Fil One · Hyperscaler speed. Budget-tier bills.", - description: - `S3-compatible object storage at ${PRICE_PER_TB_SHORT} flat. A global network of storage providers — fast reads without the hyperscaler price tag. No egress fees.`, + description: `S3-compatible object storage at ${PRICE_PER_TB_SHORT} flat. Always-hot storage with no egress fees — fast reads without the hyperscaler price tag.`, canonical: "https://www.fil.one/lp/metro", - }); - - const { ref: problemRef, inView: problemInView } = useInView({ threshold: 0.05 }); - const { ref: tableRef, inView: tableInView } = useInView({ threshold: 0.05 }); - const { ref: featuresRef, inView: featuresInView } = useInView({ threshold: 0.05 }); - const { ref: ctaRef, inView: ctaInView } = useInView({ threshold: 0.05 }); - - const valueColor = (val: string) => { - if (val === "$0") return "#16a34a"; - const n = parseFloat(val.replace(/[$,]/g, "")); - if (n > 100) return "#dc2626"; - return "#52525B"; - }; - - return ( -
- -
- - {/* Hero */} -
-
- - {/* Problem */} -
-
-
- The assumption - Fast and affordable storage are assumed to be a tradeoff. They aren't. - Hyperscalers price storage and egress to capture teams who assume they need the largest network. The assumption is that cheaper alternatives are slower or further away. Fil One's distributed network removes that tradeoff. -
-
- {[ - { - label: "The proximity premium", - catch: "Hyperscalers charge extra for being close.", - body: "Storing and reading data from a major cloud region costs full hyperscaler rates. Teams assume they pay for the proximity. In reality, they pay for the brand — and the egress on every read compounds it.", - }, - { - label: "The egress multiplier", - catch: "Reading your data adds to the bill every time.", - body: "At $0.09/GB egress, a team reading 10 TB of assets per month pays $921 just to access their own data — on top of $236 in storage. The data is nearby; the bill is not proportional.", - }, - { - label: "The cheap-but-slow assumption", - catch: "Teams assume alternatives compromise on speed.", - body: "The reason most teams stay on hyperscaler storage is the fear that alternatives are slower or less reliable. A globally distributed network of providers removes that constraint — without the hyperscaler invoice.", - }, - ].map(({ label, body, catch: c }) => ( -
-
- {label} -

{c}

-

{body}

-
-
- ))} -
-
-
+ }, - {/* Comparison table */} -
-
-
- The comparison - 10 TB stored. 10 TB read per month. - Same workload, six providers. Storage is a small line — egress is the bill on hyperscalers. On Fil One, egress does not exist as a line item. -
-
- - - - {["Provider", "Storage", "Egress", "Total / month"].map(h => ( - - ))} - - - - {COMPARE_ROWS.map(r => ( - - - - - - - ))} - -
{h}
- {r.provider}{r.isFilOne && You} - {r.storage}{r.egress}{r.total}
-
-

AWS S3 Standard, Google Cloud Storage, Azure Blob Hot — public US rate cards Q2 2026. AWS: 10,240 GB × $0.023 storage + 10,240 GB × $0.09 egress. GCP: $0.020/GB storage + $0.12/GB egress first 10 TB. Azure: ~$0.018/GB storage + $0.087/GB egress. Wasabi $6.99/TB. Backblaze B2 $6/TB. Fil One $4.99/TB, $0 egress.

-
-
+ hero: { + badge: "For SaaS and creative teams who need fast, affordable storage", + titleMaxWidth: 720, + descriptionMaxWidth: 580, + title: ( + <> + Hyperscaler speed. +
+ Budget-tier bills. + + ), + description: `S3-compatible object storage at ${PRICE_PER_TB_SHORT} flat, always hot with $0 egress fees — fast reads without the hyperscaler price tag.`, + ctas: [ + { label: "Start for free", href: SIGNUP_URL, variant: "primary" }, + { label: "Talk to an expert", href: SALES_URL, variant: "secondary" }, + ], + tagline: TAGLINE, + }, - {/* Features */} -
-
-
- Why it works - - Fast access. Flat cost. - - A global network of providers, S3-compatible, no egress. The tradeoff between performance and cost doesn't hold here. -
-
- {FEATURES.map(({ icon: Icon, title, desc }) => ( -
-
-

{title}

-

{desc}

-
- ))} -
-
-
+ problem: { + label: "The assumption", + heading: "Fast and affordable storage are assumed to be a tradeoff. They aren't.", + sub: "Hyperscalers price hot, instantly-readable storage at a premium and egress on top of it. The assumption is that avoiding that premium means archive tiers and retrieval delays. It doesn't have to.", + subMaxWidth: 620, + items: [ + { + label: "The hot-tier premium", + tone: "warning", + catch: "Instantly-readable storage costs hyperscaler rates.", + body: "AWS S3 Standard, Google Cloud Storage, and Azure Blob Hot all charge premium rates for storage with no archive delay and no rehydration wait. Teams pay hyperscaler prices just to avoid the archive-tier trade-off.", + }, + { + label: "The egress multiplier", + tone: "danger", + catch: "Reading your data adds to the bill every time.", + body: "At $0.09/GB egress, a team reading 10 TB of assets per month pays $921 just to access their own data — on top of $236 in storage. Storing is cheap; reading is where the bill compounds.", + }, + { + label: "The cheap-but-slow assumption", + tone: "brand", + catch: "Teams assume affordable storage means archive tiers.", + body: "The reason most teams stay on hyperscaler storage is the fear that cheaper alternatives are cold-tier, slow-to-restore options. Fil One is hot, S3-compatible storage at a flat rate — without the hyperscaler invoice.", + }, + ], + }, - {/* Pricing */} -
-
-
- Pricing - One rate. {PRICE_PER_TB_MONTH}. - Storage. That is the whole bill. No egress, no per-request charges, no regional pricing tiers. Fast access doesn't cost extra here. -
- -

No credit card required · No egress fees · Connects in minutes

-
-
+ comparison: { + label: "The comparison", + heading: ( + <> + 10 TB stored. 10 TB read per month. + + ), + sub: "Same workload, six providers. Storage is a small line — egress is the bill on hyperscalers. On Fil One, egress does not exist as a line item.", + subMaxWidth: 620, + caption: "Monthly cost for 10 TB stored, 10 TB read, by provider", + columns: [ + { key: "storage", header: "Storage" }, + { key: "egress", header: "Egress", colorByValue: true }, + { key: "total", header: "Total / month", total: true }, + ], + rows: [ + { provider: "AWS S3 Standard", values: { storage: "$236", egress: "$922", total: "$1,157" } }, + { provider: "Google Cloud", values: { storage: "$205", egress: "$1,228", total: "$1,433" } }, + { provider: "Azure Blob (Hot)", values: { storage: "$184", egress: "$890", total: "$1,074" } }, + { provider: "Wasabi", values: { storage: "$70", egress: "$0", total: "$70" } }, + { provider: "Backblaze B2", values: { storage: "$60", egress: "$0", total: "$60" } }, + { provider: "Fil One", isFilOne: true, values: { storage: "$50", egress: "$0", total: "$50" } }, + ], + footnote: + "AWS S3 Standard, Google Cloud Storage, Azure Blob Hot — public US rate cards Q2 2026. AWS: 10,240 GB × $0.023 storage + 10,240 GB × $0.09 egress. GCP: $0.020/GB storage + $0.12/GB egress first 10 TB. Azure: ~$0.018/GB storage + $0.087/GB egress. Wasabi $6.99/TB. Backblaze B2 $6/TB. Fil One $4.99/TB, $0 egress.", + }, - {/* Dark CTA */} -
-
-
- -
-
+ features: { + label: "Why it works", + heading: ( + <> + Fast access. Flat cost. + + ), + sub: "Always-hot, S3-compatible storage with no egress. The tradeoff between performance and cost doesn't hold here.", + subMaxWidth: 560, + items: [ + { + icon: Lightning, + title: "Always hot, never archived", + desc: "No storage tiers, no rehydration wait, no retrieval fee. Every object is instantly readable, whether it was written a minute ago or a year ago.", + }, + { + icon: ArrowsOut, + title: "No egress fees", + desc: "$0 to read your own data. The cost of accessing your data is the same as the cost of storing it — nothing extra.", + }, + { + icon: Plug, + title: "S3-compatible", + desc: "Standard S3 API. The same SDKs, CLIs, and integrations your team already uses connect with an endpoint change. No migration project.", + }, + { + icon: ChartLine, + title: "Flat, predictable cost", + desc: `${PRICE_PER_TB_SHORT} regardless of how often you read or how fast your data grows. One rate. One line on the invoice.`, + }, + ], + }, -
-
-
- ); + cta: { + heading: "Hyperscaler speed. Budget-tier bills.", + subhead: "Free 1 TB evaluation. Point your existing S3 tools at the endpoint and run the same workload.", + cta: { label: "Start for free", href: SIGNUP_URL }, + secondaryCta: { label: "Talk to an expert", href: SALES_URL }, + note: TAGLINE, + }, }; +const MetroLandingPage = () => ; + export default MetroLandingPage; From 90088d71a997d72710ee3d0abd12b2d3b1010b4a Mon Sep 17 00:00:00 2001 From: Filipa Date: Tue, 18 Aug 2026 15:44:29 -0300 Subject: [PATCH 06/34] Migrate /lp/media to LandingPage shell; fix GCP/Azure egress math MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Convert MediaLandingPage from a hand-rolled 220-line page to a LandingPageConfig. No FIL-843 copy hits — all claims are pricing math and S3-compatibility. Also fixed a real correctness bug found while converting the comparison table: the source file's own code comments recomputed the GCP and Azure 50 TB egress figures ($5,734.40 and $4,290.56) after finding the original EGRESS_ROWS values wrong, but the corrected numbers were never actually applied to the rendered table — it still showed the stale $5,222/$5,427 (GCP) and $4,096/$4,280 (Azure) figures the comments say are incorrect. Used the corrected math, which now matches the footnote's methodology exactly. Part of FIL-690. Co-Authored-By: Claude Sonnet 5 --- src/pages/MediaLandingPage.tsx | 345 +++++++++++++-------------------- 1 file changed, 132 insertions(+), 213 deletions(-) diff --git a/src/pages/MediaLandingPage.tsx b/src/pages/MediaLandingPage.tsx index 9df5242..3a8db84 100644 --- a/src/pages/MediaLandingPage.tsx +++ b/src/pages/MediaLandingPage.tsx @@ -1,219 +1,138 @@ import { ArrowsOut, ChartLine, Plug, Database } from "@phosphor-icons/react"; -import PlatformNavbar from "@/components/PlatformNavbar"; -import Footer from "@/components/Footer"; -import { useInView } from "@/hooks/useInView"; -import { useSeo } from "@/hooks/useSeo"; -import { GRID_SVG, SectionLabel, SectionHeading, SectionSub } from '@/components/LandingPrimitives'; -import { PRICE_DISPLAY, PRICE_PER_TB_SHORT, PRICE_PER_TB_MONTH } from "@/lib/pricing"; - - -// Media delivery scenario: 10 TB library stored, 50 TB delivered to viewers per month. -// AWS S3 Standard us-east-1 Q2 2026: -// Storage: 10,240 GB × $0.023 = $235.52 (tiered first 50TB) -// Egress: 50,000 GB × $0.09 = $4,500 (first 10 TB tier = $0.09/GB; rest also $0.09 in simplified) -// Total AWS: ~$4,736 -// (Note: first 1GB free, then $0.09/GB for first 10TB out, $0.085 next 40TB, $0.07 next 100TB -// Precise: 10,240×$0.09 + 40,960×$0.085 = $921.60 + $3,481.60 = $4,403.20 + 235.52 storage = $4,638.72) -// Fil One: 10 TB × $4.99 = $49.90, egress $0. Total $49.90. - -const EGRESS_ROWS = [ - { provider: "AWS S3 Standard", storage10tb: "$236", egress50tb: "$4,403", total: "$4,639", isFilOne: false }, - { provider: "Google Cloud Storage", storage10tb: "$205", egress50tb: "$5,222", total: "$5,427", isFilOne: false }, - { provider: "Azure Blob (Hot)", storage10tb: "$184", egress50tb: "$4,096", total: "$4,280", isFilOne: false }, - { provider: "Wasabi", storage10tb: "$70", egress50tb: "$0", total: "$70", isFilOne: false }, - { provider: "Backblaze B2", storage10tb: "$60", egress50tb: "$0", total: "$60", isFilOne: false }, - { provider: "Fil One", storage10tb: "$50", egress50tb: "$0", total: "$50", isFilOne: true }, -]; - -// GCP egress 50TB: 10TB@$0.12 + 40TB@$0.11 = $1,228.80 + $4,505.60 = wait, 50TB total: -// 10,240 × $0.12 = $1,228.80 (first 10TB) -// 40,960 × $0.11 = $4,505.60 (next 40TB) -// Total GCP egress: $5,734.40 — but let's use $5,222 and note it -// Actually: 10TB = 10,240GB × $0.12 = $1,228.80; 40TB = 40,960GB × $0.11 = $4,505.60; total = $5,734.40 -// Let me recompute: $5,734 + $205 storage = $5,939 - -// I'll correct this and use accurate numbers: -// AWS: storage $236, egress 10,240×$0.09 + 40,960×$0.085 = $921.60 + $3,481.60 = $4,403.20. Total = $4,639 -// GCP: storage $205, egress 10,240×$0.12 + 40,960×$0.11 = $1,228.80 + $4,505.60 = $5,734.40. Total = $5,939 -// Azure: storage $184, egress 10,240×$0.087 + 40,960×$0.083 = $890.88 + $3,399.68 = $4,290.56. Total = $4,475 -// Those numbers don't match my table above. Let me update the EGRESS_ROWS with correct values. - -const FEATURES = [ - { icon: ArrowsOut, title: "Zero egress fees", desc: "Every viewer fetch is a read from origin storage. On Fil One those reads cost nothing. The delivery margin is not eaten by the storage provider." }, - { icon: Database, title: "Store the full library", desc: `At ${PRICE_PER_TB_SHORT} flat, a 10 TB media library costs $50/month. A 100 TB library costs $499. The rate per TB does not increase with library size.` }, - { icon: Plug, title: "S3-compatible origin", desc: "Media players, CDNs, and delivery pipelines that read from S3 origins connect without modification. Swap the endpoint; the delivery stack does not change." }, - { icon: ChartLine, title: "Predictable delivery cost", desc: `Storage × ${PRICE_DISPLAY}. The number of views, downloads, or streams in a month does not change the storage bill. Viral moments are not billing events.` }, -]; - -const MediaLandingPage = () => { - useSeo({ +import LandingPage, { type LandingPageConfig } from "@/components/LandingPage"; +import { PRICE_DISPLAY, PRICE_PER_TB_SHORT } from "@/lib/pricing"; + +const SIGNUP_URL = "https://app.fil.one/login?screen_hint=signup"; +const SALES_URL = "/contact-sales"; + +const TAGLINE = "No credit card required · No egress fees · Connects in minutes"; + +// Media delivery scenario: 10 TB library stored, 50 TB delivered to viewers/month. +// AWS S3 Standard us-east-1 Q2 2026: storage 10,240 GB x $0.023 = $235.52. +// Egress 50 TB: 10,240 GB x $0.09 + 40,960 GB x $0.085 = $921.60 + $3,481.60 = $4,403.20. +// GCP: storage $205. Egress 50 TB: 10,240 x $0.12 + 40,960 x $0.11 = $1,228.80 + $4,505.60 = $5,734.40. +// Azure Blob Hot: storage $184. Egress 50 TB: 10,240 x $0.087 + 40,960 x $0.083 = $890.88 + $3,399.68 = $4,290.56. +// Wasabi $6.99/TB, Backblaze B2 $6/TB, both $0 egress. Fil One $4.99/TB, $0 egress. +const config: LandingPageConfig = { + seo: { title: "Fil One · Your media library shouldn't bleed money on delivery", - description: - `S3-compatible object storage, ${PRICE_PER_TB_SHORT} flat, $0 egress. Store media libraries and deliver at scale without egress fees eating your margin.`, + description: `S3-compatible object storage, ${PRICE_PER_TB_SHORT} flat, $0 egress. Store media libraries and deliver at scale without egress fees eating your margin.`, canonical: "https://www.fil.one/lp/media", - }); - - const { ref: problemRef, inView: problemInView } = useInView({ threshold: 0.05 }); - const { ref: tableRef, inView: tableInView } = useInView({ threshold: 0.05 }); - const { ref: featuresRef, inView: featuresInView } = useInView({ threshold: 0.05 }); - const { ref: ctaRef, inView: ctaInView } = useInView({ threshold: 0.05 }); - - const valueColor = (val: string) => { - if (val === "$0") return "#16a34a"; - const n = parseFloat(val.replace(/[$,]/g, "")); - if (n > 100) return "#dc2626"; - return "#52525B"; - }; - - return ( -
- - -
- {/* Hero */} -
-
- - {/* Problem */} -
-
-
- The trap - Storage is cheap. Delivery is the bill. - Media storage pricing looks manageable until someone streams it. The egress line grows proportionally to usage — exactly the direction the business wants to go. -
-
- {[ - { label: "The storage illusion", catch: "Storage looks cheap. Delivery does not.", body: "A 10 TB media library on AWS S3 costs $236/month in storage. Delivering that same 10 TB to viewers once costs $921 in egress. Deliver it five times and the egress bill is $4,403. The library is not the cost." }, - { label: "The usage trap", catch: "More viewers means a higher storage bill.", body: "Egress fees scale with audience. A viral clip, a successful release, a live event — the moments that make media valuable are the moments the storage bill peaks. The business model works against itself." }, - { label: "The margin problem", catch: "Egress eats the delivery margin.", body: "For streaming platforms, CDN delivery costs are already a significant operating cost. Adding $0.09/GB in origin egress on top of CDN fees makes the storage-to-delivery economics difficult to model profitably." }, - ].map(({ label, body, catch: catchLine }) => ( -
-
- {label} -

{catchLine}

-

{body}

-
-
- ))} -
-
-
- - {/* Comparison table */} -
-
-
- The delivery comparison - 10 TB library. 50 TB delivered per month. - Same workload, six providers. Monthly storage for the library plus egress for 50 TB of viewer delivery. -
-
- - - - {["Provider", "10 TB storage", "50 TB egress", "Total / month"].map((h) => ( - - ))} - - - - {EGRESS_ROWS.map((row) => ( - - - - - - - ))} - -
{h}
- {row.provider} - {row.isFilOne && You} - {row.storage10tb}{row.egress50tb}{row.total}
-
-

- AWS S3 Standard us-east-1, GCP Standard, Azure Blob Hot East US — public US rate cards Q2 2026. AWS storage: 10,240 GB × $0.023 = $235.52. AWS egress 50 TB: 10,240 GB × $0.09 + 40,960 GB × $0.085 = $921.60 + $3,481.60 = $4,403.20. GCP egress 50 TB: 10,240 × $0.12 + 40,960 × $0.11 = $5,734.40. Azure egress 50 TB: 10,240 × $0.087 + 40,960 × $0.083 = $890.88 + $3,399.68 = $4,290.56. Wasabi $6.99/TB. Backblaze B2 $6/TB. Fil One $4.99/TB, $0 egress. -

-
-
- - {/* Features */} -
-
-
- Built for delivery - A media origin that doesn't bill per view. -
-
- {FEATURES.map(({ icon: Icon, title, desc }) => ( -
-
-

{title}

-

{desc}

-
- ))} -
-
-
- - {/* Pricing */} -
-
-
- Pricing - One rate. {PRICE_PER_TB_MONTH}. - Storage. That is the whole bill. Delivery volume does not change the invoice. Viral moments are not billing events. -
- -

No credit card required · No egress fees · Connects in minutes

-
-
- - {/* Dark CTA */} -
-
-
- -
-
-
- -
-
- ); + }, + + hero: { + badge: "For media, CTV, and OTT teams", + titleMaxWidth: 800, + descriptionMaxWidth: 580, + title: ( + <> + Your media library shouldn't +
+ bleed money on delivery. + + ), + description: `S3-compatible object storage, ${PRICE_PER_TB_SHORT} flat, $0 egress. Store the library and deliver at scale without egress fees eating margin.`, + ctas: [ + { label: "Start for free", href: SIGNUP_URL, variant: "primary" }, + { label: "Talk to an expert", href: SALES_URL, variant: "secondary" }, + ], + tagline: TAGLINE, + }, + + problem: { + label: "The trap", + heading: "Storage is cheap. Delivery is the bill.", + sub: "Media storage pricing looks manageable until someone streams it. The egress line grows proportionally to usage — exactly the direction the business wants to go.", + items: [ + { + label: "The storage illusion", + tone: "warning", + catch: "Storage looks cheap. Delivery does not.", + body: "A 10 TB media library on AWS S3 costs $236/month in storage. Delivering that same 10 TB to viewers once costs $921 in egress. Deliver it five times and the egress bill is $4,403. The library is not the cost.", + }, + { + label: "The usage trap", + tone: "danger", + catch: "More viewers means a higher storage bill.", + body: "Egress fees scale with audience. A viral clip, a successful release, a live event — the moments that make media valuable are the moments the storage bill peaks. The business model works against itself.", + }, + { + label: "The margin problem", + tone: "brand", + catch: "Egress eats the delivery margin.", + body: "For streaming platforms, CDN delivery costs are already a significant operating cost. Adding $0.09/GB in origin egress on top of CDN fees makes the storage-to-delivery economics difficult to model profitably.", + }, + ], + }, + + comparison: { + label: "The delivery comparison", + heading: ( + <> + 10 TB library. 50 TB delivered per month. + + ), + sub: "Same workload, six providers. Monthly storage for the library plus egress for 50 TB of viewer delivery.", + subMaxWidth: 620, + caption: "Monthly cost for a 10 TB library and 50 TB of viewer delivery, by provider", + columns: [ + { key: "storage", header: "10 TB storage" }, + { key: "egress", header: "50 TB egress", colorByValue: true }, + { key: "total", header: "Total / month", total: true }, + ], + rows: [ + { provider: "AWS S3 Standard", values: { storage: "$236", egress: "$4,403", total: "$4,639" } }, + { provider: "Google Cloud Storage", values: { storage: "$205", egress: "$5,734", total: "$5,939" } }, + { provider: "Azure Blob (Hot)", values: { storage: "$184", egress: "$4,291", total: "$4,475" } }, + { provider: "Wasabi", values: { storage: "$70", egress: "$0", total: "$70" } }, + { provider: "Backblaze B2", values: { storage: "$60", egress: "$0", total: "$60" } }, + { provider: "Fil One", isFilOne: true, values: { storage: "$50", egress: "$0", total: "$50" } }, + ], + footnote: + "AWS S3 Standard us-east-1, GCP Standard, Azure Blob Hot East US — public US rate cards Q2 2026. AWS storage: 10,240 GB × $0.023 = $235.52. AWS egress 50 TB: 10,240 GB × $0.09 + 40,960 GB × $0.085 = $4,403.20. GCP egress 50 TB: 10,240 × $0.12 + 40,960 × $0.11 = $5,734.40. Azure egress 50 TB: 10,240 × $0.087 + 40,960 × $0.083 = $4,290.56. Wasabi $6.99/TB. Backblaze B2 $6/TB. Fil One $4.99/TB, $0 egress.", + }, + + features: { + label: "Built for delivery", + heading: ( + <> + A media origin that doesn't bill per view. + + ), + sub: "S3-compatible origin storage with zero egress fees, at any library size.", + items: [ + { + icon: ArrowsOut, + title: "Zero egress fees", + desc: "Every viewer fetch is a read from origin storage. On Fil One those reads cost nothing. The delivery margin is not eaten by the storage provider.", + }, + { + icon: Database, + title: "Store the full library", + desc: `At ${PRICE_PER_TB_SHORT} flat, a 10 TB media library costs $50/month. A 100 TB library costs $499. The rate per TB does not increase with library size.`, + }, + { + icon: Plug, + title: "S3-compatible origin", + desc: "Media players, CDNs, and delivery pipelines that read from S3 origins connect without modification. Swap the endpoint; the delivery stack does not change.", + }, + { + icon: ChartLine, + title: "Predictable delivery cost", + desc: `Storage × ${PRICE_DISPLAY}. The number of views, downloads, or streams in a month does not change the storage bill. Viral moments are not billing events.`, + }, + ], + }, + + cta: { + heading: "Store the library. Skip the egress.", + subhead: "Free 1 TB evaluation. Upload a few assets, stream them, and watch the egress line stay at zero.", + cta: { label: "Start for free", href: SIGNUP_URL }, + secondaryCta: { label: "Talk to an expert", href: SALES_URL }, + note: TAGLINE, + }, }; +const MediaLandingPage = () => ; + export default MediaLandingPage; From ddfb77e9a5a4ab9cb7b0d81dcd10ecd858519478 Mon Sep 17 00:00:00 2001 From: Filipa Date: Tue, 18 Aug 2026 15:45:37 -0300 Subject: [PATCH 07/34] Migrate /lp/cost-ticker to LandingPage shell MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Convert CostTickerLandingPage from a hand-rolled 172-line page to a LandingPageConfig. No FIL-843 copy hits — all claims are pricing math. No redundant pricing section to drop; this page was already lean (problem, comparison, features, closing CTA). Part of FIL-690. Co-Authored-By: Claude Sonnet 5 --- src/pages/CostTickerLandingPage.tsx | 278 ++++++++++++---------------- 1 file changed, 122 insertions(+), 156 deletions(-) diff --git a/src/pages/CostTickerLandingPage.tsx b/src/pages/CostTickerLandingPage.tsx index 67b1200..e6af5fb 100644 --- a/src/pages/CostTickerLandingPage.tsx +++ b/src/pages/CostTickerLandingPage.tsx @@ -1,171 +1,137 @@ import { ChartLine, ArrowsOut, Plug, ShieldCheck } from "@phosphor-icons/react"; -import PlatformNavbar from "@/components/PlatformNavbar"; -import Footer from "@/components/Footer"; -import { useInView } from "@/hooks/useInView"; -import { useSeo } from "@/hooks/useSeo"; -import { GRID_SVG, SectionLabel, SectionHeading, SectionSub } from "@/components/LandingPrimitives"; +import LandingPage, { type LandingPageConfig } from "@/components/LandingPage"; import { PRICE_DISPLAY, PRICE_PER_TB_SHORT, PRICE_PER_TB_MONTH } from "@/lib/pricing"; -// Same 10 TB workload, 10 TB read/month — the "meter" each provider runs. -// AWS: 10,240×$0.023 = $235.52 storage + 10,240×$0.09 = $921.60 egress ≈ $1,157 -// Google: 10,240×$0.020 = $204.80 + 10,240×$0.12 = $1,228.80 ≈ $1,434 -// Azure (Hot): ~$184 storage + 10,240×$0.087 = $890.88 ≈ $1,075 -// Fil One: 10×$4.99 = $49.90, $0 egress -const COMPARE_ROWS = [ - { provider: "AWS S3 Standard", storage: "$236", egress: "$922", total: "$1,157", isFilOne: false }, - { provider: "Google Cloud", storage: "$205", egress: "$1,229", total: "$1,434", isFilOne: false }, - { provider: "Azure Blob (Hot)", storage: "$184", egress: "$891", total: "$1,075", isFilOne: false }, - { provider: "Fil One", storage: "$50", egress: "$0", total: "$50", isFilOne: true }, -]; +const SIGNUP_URL = "https://app.fil.one/login?screen_hint=signup"; +const SALES_URL = "/contact-sales"; -const FEATURES = [ - { icon: ArrowsOut, title: "No egress meter", desc: "Every byte you read on a hyperscaler ticks the egress meter at $0.09/GB. On Fil One that meter doesn't exist — reads are included." }, - { icon: ChartLine, title: "No request meter", desc: "PUT, GET, LIST, HEAD all run a per-operation counter elsewhere. Here they're free, so a busy month doesn't become an expensive one." }, - { icon: Plug, title: "S3-compatible", desc: "Point your existing tools at the endpoint. The workload doesn't change — only the meter that was quietly running underneath it." }, - { icon: ShieldCheck, title: "The invoice you can predict", desc: `Stored TB times ${PRICE_DISPLAY}. You know December's bill in January, because nothing in between is metered.` }, -]; +const TAGLINE = "No credit card required · No egress fees · Connects in minutes"; -const CostTickerLandingPage = () => { - useSeo({ +// Same 10 TB workload, 10 TB read/month, on each provider's meter. +// AWS: 10,240x$0.023 = $235.52 storage + 10,240x$0.09 = $921.60 egress ~ $1,157. +// Google: 10,240x$0.020 = $204.80 + 10,240x$0.12 = $1,228.80 ~ $1,434. +// Azure (Hot): ~$184 storage + 10,240x$0.087 = $890.88 ~ $1,075. +// Fil One: 10x$4.99 = $49.90, $0 egress. +const config: LandingPageConfig = { + seo: { title: "Fil One · Watch the meter you're not paying", - description: - `Hyperscalers meter every read, request, and byte out. Fil One is flat ${PRICE_PER_TB_SHORT} with no egress and no per-request fees. See the side-by-side.`, + description: `Hyperscalers meter every read, request, and byte out. Fil One is flat ${PRICE_PER_TB_SHORT} with no egress and no per-request fees. See the side-by-side.`, canonical: "https://www.fil.one/lp/cost-ticker", - }); + }, - const { ref: problemRef, inView: problemInView } = useInView({ threshold: 0.05 }); - const { ref: tableRef, inView: tableInView } = useInView({ threshold: 0.05 }); - const { ref: featuresRef, inView: featuresInView } = useInView({ threshold: 0.05 }); - const { ref: ctaRef, inView: ctaInView } = useInView({ threshold: 0.05 }); + hero: { + badge: "For anyone tired of cloud bill surprises", + titleMaxWidth: 760, + descriptionMaxWidth: 600, + title: ( + <> + Watch the meter +
+ you're not paying. + + ), + description: `Hyperscalers meter every read, every request, every byte out. Fil One is flat ${PRICE_PER_TB_SHORT} — no egress, no per-request fees. Same workload, side by side.`, + ctas: [ + { label: "Start for free", href: SIGNUP_URL, variant: "primary" }, + { label: "Talk to an expert", href: SALES_URL, variant: "secondary" }, + ], + tagline: TAGLINE, + }, - return ( -
- -
+ problem: { + label: "The invisible meter", + heading: "The bill is a surprise because the meter runs where you can't see it.", + sub: "Storage looks cheap on the rate card. The cost shows up later, metered against activity you don't watch in real time — and lands as a number nobody forecast.", + subMaxWidth: 620, + items: [ + { + label: "The egress meter", + tone: "warning", + catch: "Every read ticks at $0.09/GB.", + body: "Reading 10 TB back from AWS in a month adds $922 — nearly 4× the $236 storage charge. The meter runs hardest exactly when your data is most useful.", + }, + { + label: "The request meter", + tone: "danger", + catch: "Every operation is counted.", + body: "PUT, GET, LIST, and HEAD each carry a per-thousand charge. A busy pipeline or a chatty app spins the counter all month, and the total only appears at the end.", + }, + { + label: "The month-end reveal", + tone: "brand", + catch: "You learn the cost after you've spent it.", + body: "Activity-metered billing means the invoice is a report of what already happened. There's no knob to turn in advance — only a number to absorb afterward.", + }, + ], + }, - {/* Hero */} -
-
+ comparison: { + label: "The meter, side by side", + heading: ( + <> + 10 TB stored, 10 TB read in a month. + + ), + sub: "The same workload on four providers. Storage barely moves; the egress meter is the whole story — and on Fil One it reads zero.", + subMaxWidth: 620, + caption: "Monthly cost for 10 TB stored, 10 TB read, by provider", + columns: [ + { key: "storage", header: "Storage" }, + { key: "egress", header: "Egress meter", colorByValue: true }, + { key: "total", header: "Total / month", total: true }, + ], + rows: [ + { provider: "AWS S3 Standard", values: { storage: "$236", egress: "$922", total: "$1,157" } }, + { provider: "Google Cloud", values: { storage: "$205", egress: "$1,229", total: "$1,434" } }, + { provider: "Azure Blob (Hot)", values: { storage: "$184", egress: "$891", total: "$1,075" } }, + { provider: "Fil One", isFilOne: true, values: { storage: "$50", egress: "$0", total: "$50" } }, + ], + footnote: + "Public US rate cards, Q2 2026. AWS: 10,240 GB × $0.023 = $235.52 storage + 10,240 GB × $0.09 = $921.60 egress. Google: $0.020/GB storage + $0.12/GB egress. Azure Hot: ~$0.018/GB storage + $0.087/GB egress. Fil One: $4.99/TB, $0 egress, no per-request fees.", + }, - {/* Problem */} -
-
-
- The invisible meter - The bill is a surprise because the meter runs where you can't see it. - Storage looks cheap on the rate card. The cost shows up later, metered against activity you don't watch in real time — and lands as a number nobody forecast. -
-
- {[ - { label: "The egress meter", catch: "Every read ticks at $0.09/GB.", body: "Reading 10 TB back from AWS in a month adds $922 — nearly 4× the $236 storage charge. The meter runs hardest exactly when your data is most useful." }, - { label: "The request meter", catch: "Every operation is counted.", body: "PUT, GET, LIST, and HEAD each carry a per-thousand charge. A busy pipeline or a chatty app spins the counter all month, and the total only appears at the end." }, - { label: "The month-end reveal", catch: "You learn the cost after you've spent it.", body: "Activity-metered billing means the invoice is a report of what already happened. There's no knob to turn in advance — only a number to absorb afterward." }, - ].map(({ label, body, catch: c }) => ( -
-
- {label} -

{c}

-

{body}

-
-
- ))} -
-
-
+ features: { + label: "Meters you don't pay", + heading: ( + <> + The bill is the rate times what you store. No meters. + + ), + sub: "Flat storage pricing with nothing metered underneath it.", + items: [ + { + icon: ArrowsOut, + title: "No egress meter", + desc: "Every byte you read on a hyperscaler ticks the egress meter at $0.09/GB. On Fil One that meter doesn't exist — reads are included.", + }, + { + icon: ChartLine, + title: "No request meter", + desc: "PUT, GET, LIST, HEAD all run a per-operation counter elsewhere. Here they're free, so a busy month doesn't become an expensive one.", + }, + { + icon: Plug, + title: "S3-compatible", + desc: "Point your existing tools at the endpoint. The workload doesn't change — only the meter that was quietly running underneath it.", + }, + { + icon: ShieldCheck, + title: "The invoice you can predict", + desc: `Stored TB times ${PRICE_DISPLAY}. You know December's bill in January, because nothing in between is metered.`, + }, + ], + }, - {/* Proof — side-by-side meter */} -
-
-
- The meter, side by side - 10 TB stored, 10 TB read in a month. - The same workload on four providers. Storage barely moves; the egress meter is the whole story — and on Fil One it reads zero. -
-
- - - - {["Provider", "Storage", "Egress meter", "Total / month"].map(h => ( - - ))} - - - - {COMPARE_ROWS.map(r => ( - - - - - - - ))} - -
{h}
- {r.provider}{r.isFilOne && You} - {r.storage}{r.egress}{r.total}
-
-

Public US rate cards, Q2 2026. AWS: 10,240 GB × $0.023 = $235.52 storage + 10,240 GB × $0.09 = $921.60 egress. Google: $0.020/GB storage + $0.12/GB egress. Azure Hot: ~$0.018/GB storage + $0.087/GB egress. Fil One: $4.99/TB, $0 egress, no per-request fees.

-
-
- - {/* Features */} -
-
-
- Meters you don't pay - The bill is the rate times what you store. No meters. -
-
- {FEATURES.map(({ icon: Icon, title, desc }) => ( -
-
-

{title}

-

{desc}

-
- ))} -
-
-
- - {/* Dark CTA */} -
-
-
- -
-
-
-
-
- ); + cta: { + heading: `Turn off the meter. ${PRICE_PER_TB_MONTH}.`, + headingMaxWidth: 560, + subhead: "Storage only — no egress meter, no request meter, no tiers. Free 1 TB evaluation: run your real workload and compare the invoice. The egress line will read zero.", + cta: { label: "Start for free", href: SIGNUP_URL }, + secondaryCta: { label: "Talk to an expert", href: SALES_URL }, + note: TAGLINE, + }, }; +const CostTickerLandingPage = () => ; + export default CostTickerLandingPage; From 346bad06db8a8c4e39c20f97afc51b6e867ca581 Mon Sep 17 00:00:00 2001 From: Filipa Date: Tue, 18 Aug 2026 15:47:23 -0300 Subject: [PATCH 08/34] Migrate /lp/gaming to LandingPage shell; fix verifiability claim MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Convert GamingLandingPage from a hand-rolled 195-line page to a LandingPageConfig. Reshaped the cost-at-scale table: the original had one row per scale point (1/10/100/500 TB) with separate AWS-storage/ AWS-egress/AWS-total/Fil-One columns, which doesn't fit the shared PriceComparisonTable's per-provider-row highlighting. Flipped it to rows=providers (AWS S3 Standard, Fil One), columns=scale points — same numbers, but the Fil One row now gets proper highlight treatment across all four columns. Fixed a FIL-843 hit in routeMeta.mjs (not the page itself): the unfurl description claimed "Durable, verifiable storage" — not backed by anything in the console source-of-truth doc. Replaced with the real claim (S3-compatible, zero egress). Part of FIL-690. Co-Authored-By: Claude Sonnet 5 --- scripts/routeMeta.mjs | 2 +- src/pages/GamingLandingPage.tsx | 310 ++++++++++++++------------------ 2 files changed, 131 insertions(+), 181 deletions(-) diff --git a/scripts/routeMeta.mjs b/scripts/routeMeta.mjs index dad7a79..e709653 100644 --- a/scripts/routeMeta.mjs +++ b/scripts/routeMeta.mjs @@ -344,7 +344,7 @@ export const ROUTE_META = { "/lp/gaming": { title: "Game Asset & Save-Data Storage · Fil One", description: - `Durable, verifiable storage for game assets, saves, and telemetry at ${PRICE_PER_TB_SHORT}. Zero egress fees and S3-compatible — built for game backends.`, + `S3-compatible storage for game assets, saves, and telemetry at ${PRICE_PER_TB_SHORT}. Zero egress fees — built for game backends.`, }, "/lp/genomics": { title: "Genomics & Life Sciences Data Storage · Fil One", diff --git a/src/pages/GamingLandingPage.tsx b/src/pages/GamingLandingPage.tsx index c2a45f6..0fd2ece 100644 --- a/src/pages/GamingLandingPage.tsx +++ b/src/pages/GamingLandingPage.tsx @@ -1,194 +1,144 @@ import { ArrowsOut, ChartLine, Plug, Database } from "@phosphor-icons/react"; -import PlatformNavbar from "@/components/PlatformNavbar"; -import Footer from "@/components/Footer"; -import { useInView } from "@/hooks/useInView"; -import { useSeo } from "@/hooks/useSeo"; -import { GRID_SVG, SectionLabel, SectionHeading, SectionSub } from '@/components/LandingPrimitives'; -import { PRICE_PER_TB_SHORT, PRICE_PER_TB_MONTH } from "@/lib/pricing"; +import LandingPage, { type LandingPageConfig } from "@/components/LandingPage"; +import { PRICE_PER_TB_SHORT } from "@/lib/pricing"; +const SIGNUP_URL = "https://app.fil.one/login?screen_hint=signup"; +const SALES_URL = "/contact-sales"; -// Cost-at-scale table. Scenario: 50% egress ratio (reads = 50% of stored volume per month). -// AWS S3 Standard us-east-1 Q2 2026 (storage tiered; egress $0.09/GB): -// 1 TB: storage 1,024×$0.023=$23.55, egress 512×$0.09=$46.08. Total $69.63 → $70 -// 10 TB: storage 10,240×$0.023=$235.52, egress 5,120×$0.09=$460.80. Total $696.32 → $696 -// 100 TB: storage (51,200×$0.023)+(51,200×$0.022)=$1,177.60+$1,126.40=$2,304, -// egress 51,200×$0.09=$4,608. Total $6,912 -// 500 TB: storage (51,200×$0.023)+(460,800×$0.022)=$1,177.60+$10,137.60=$11,315.20, -// egress 256,000×$0.09=$23,040. Total $34,355 -// Fil One: 1TB×$4.99=$4.99, 10TB×$4.99=$49.90, 100TB×$4.99=$499, 500TB×$4.99=$2,495 -const SCALE_ROWS = [ - { scale: "1 TB", awsStorage: "$24", awsEgress: "$46", awsTotal: "$70", filOne: "$5" }, - { scale: "10 TB", awsStorage: "$236", awsEgress: "$461", awsTotal: "$697", filOne: "$50" }, - { scale: "100 TB", awsStorage: "$2,304", awsEgress: "$4,608", awsTotal: "$6,912", filOne: "$499" }, - { scale: "500 TB", awsStorage: "$11,315",awsEgress: "$23,040",awsTotal: "$34,355", filOne: "$2,495" }, -]; +const TAGLINE = "No credit card required · No egress fees · Connects in minutes"; -const FEATURES = [ - { icon: ChartLine, title: "Flat, predictable cost", desc: "One rate per TB. Player growth, UGC spikes, and live-event surges don't change the rate. Cost planning for storage is one multiplication." }, - { icon: ArrowsOut, title: "No egress fees", desc: "Serving game assets, player replays, or UGC to clients costs $0 in egress. Multiplayer downloads are not a billing event." }, - { icon: Database, title: "S3-compatible", desc: "Standard S3 SDKs for asset pipelines, save-game syncs, and replay storage. Drop in as a replacement without changing the existing upload code." }, - { icon: Plug, title: "No per-request fees", desc: "High-frequency asset reads during matchmaking, lobby loading, and live sessions don't accrue per-GET charges. Request rate is not a cost input." }, -]; - -const GamingLandingPage = () => { - useSeo({ +// Cost-at-scale, 50% egress ratio (reads = 50% of stored volume per month). +// AWS S3 Standard us-east-1 Q2 2026 (storage tiered $0.023/GB first 50 TB, +// $0.022/GB next 450 TB; egress $0.09/GB): +// 1 TB: storage 1,024x$0.023=$23.55, egress 512x$0.09=$46.08. Total $70. +// 10 TB: storage 10,240x$0.023=$235.52, egress 5,120x$0.09=$460.80. Total $697. +// 100 TB: storage (51,200x$0.023)+(51,200x$0.022)=$2,304, egress 51,200x$0.09=$4,608. Total $6,912. +// 500 TB: storage (51,200x$0.023)+(460,800x$0.022)=$11,315.20, egress 256,000x$0.09=$23,040. Total $34,355. +// Fil One: 1/10/100/500 TB x $4.99 = $5 / $50 / $499 / $2,495. +const config: LandingPageConfig = { + seo: { title: "Fil One · Player data that scales without bill shock", - description: - `${PRICE_PER_TB_SHORT} flat storage for game studios. Store player data, UGC, and game assets without egress fees or per-request billing. No bill shock on growth.`, + description: `${PRICE_PER_TB_SHORT} flat storage for game studios. Store player data, UGC, and game assets without egress fees or per-request billing. No bill shock on growth.`, canonical: "https://www.fil.one/lp/gaming", - }); - - const { ref: problemRef, inView: problemInView } = useInView({ threshold: 0.05 }); - const { ref: tableRef, inView: tableInView } = useInView({ threshold: 0.05 }); - const { ref: featuresRef, inView: featuresInView } = useInView({ threshold: 0.05 }); - const { ref: ctaRef, inView: ctaInView } = useInView({ threshold: 0.05 }); - - return ( -
- -
+ }, - {/* Hero */} -
-
+ hero: { + badge: "For game studios storing player data, UGC, and assets", + titleMaxWidth: 760, + descriptionMaxWidth: 580, + title: ( + <> + Player data that scales +
+ without bill shock. + + ), + description: `${PRICE_PER_TB_SHORT} flat. No egress, no per-request fees, S3-compatible. Storage cost grows linearly with your player base — not ahead of it.`, + ctas: [ + { label: "Start for free", href: SIGNUP_URL, variant: "primary" }, + { label: "Talk to an expert", href: SALES_URL, variant: "secondary" }, + ], + tagline: TAGLINE, + }, - {/* Problem */} -
-
-
- The trap - Spiky growth makes hyperscaler storage bills unpredictable. - Player data, UGC, replays, and game assets grow with the game. On AWS, storage cost scales with volume but egress scales with activity — and player activity is exactly what you're trying to drive. -
-
- {[ - { label: "Launch day", catch: "Traffic spikes become egress bills.", body: "A successful launch or live event brings player spikes. On AWS, every asset served — game files, player avatars, replays — adds to the egress counter. The best day for the game is the most expensive day for the storage bill." }, - { label: "UGC growth", catch: "More uploads means more reads means more cost.", body: "User-generated content that gets shared, downloaded, and viewed is high-read storage. On per-egress pricing, popular UGC costs more to serve than unpopular UGC. The platform success penalises the infrastructure bill." }, - { label: "The surprise invoice", catch: "Storage forecasts omit egress.", body: "Infra cost planning for a game typically models storage volume. Egress is an activity multiplier that is hard to forecast without production data. The invoice after a good month regularly surprises." }, - ].map(({ label, body, catch: catchLine }) => ( -
-
- {label} -

{catchLine}

-

{body}

-
-
- ))} -
-
-
+ problem: { + label: "The trap", + heading: "Spiky growth makes hyperscaler storage bills unpredictable.", + sub: "Player data, UGC, replays, and game assets grow with the game. On AWS, storage cost scales with volume but egress scales with activity — and player activity is exactly what you're trying to drive.", + items: [ + { + label: "Launch day", + tone: "warning", + catch: "Traffic spikes become egress bills.", + body: "A successful launch or live event brings player spikes. On AWS, every asset served — game files, player avatars, replays — adds to the egress counter. The best day for the game is the most expensive day for the storage bill.", + }, + { + label: "UGC growth", + tone: "danger", + catch: "More uploads means more reads means more cost.", + body: "User-generated content that gets shared, downloaded, and viewed is high-read storage. On per-egress pricing, popular UGC costs more to serve than unpopular UGC. The platform success penalises the infrastructure bill.", + }, + { + label: "The surprise invoice", + tone: "brand", + catch: "Storage forecasts omit egress.", + body: "Infra cost planning for a game typically models storage volume. Egress is an activity multiplier that is hard to forecast without production data. The invoice after a good month regularly surprises.", + }, + ], + }, - {/* Cost-at-scale comparison */} -
-
-
- Flat vs tiered - What storage costs as the game grows. - AWS S3 Standard vs Fil One at 50% egress ratio (reads = half of stored volume per month). Storage and egress computed from stated volume and public rate cards. -
-
- - - - {["Scale", "AWS storage", "AWS egress (50%)", "AWS total", "Fil One total"].map((h) => ( - - ))} - - - - {SCALE_ROWS.map((row) => ( - - - - - - - - ))} - -
{h}
{row.scale}{row.awsStorage}{row.awsEgress}{row.awsTotal}{row.filOne}
-
-

- AWS S3 Standard us-east-1 Q2 2026: storage tiered $0.023/GB (first 50 TB), $0.022/GB (next 450 TB); egress $0.09/GB. Fil One $4.99/TB flat, egress $0. Computed from stated inputs — 1 TB: 1,024 GB × $0.023 = $23.55 storage + 512 GB × $0.09 = $46.08 egress; 500 TB: (51,200 × $0.023) + (460,800 × $0.022) = $11,315.20 storage + 256,000 × $0.09 = $23,040 egress. -

-
-
+ comparison: { + label: "Flat vs tiered", + heading: ( + <> + What storage costs as the game grows. + + ), + sub: "AWS S3 Standard vs Fil One at 50% egress ratio (reads = half of stored volume per month), at increasing scale.", + subMaxWidth: 620, + caption: "Monthly cost at increasing scale, 50% egress ratio, AWS S3 Standard vs Fil One", + columns: [ + { key: "t1", header: "1 TB" }, + { key: "t10", header: "10 TB" }, + { key: "t100", header: "100 TB" }, + { key: "t500", header: "500 TB", total: true }, + ], + rows: [ + { + provider: "AWS S3 Standard", + values: { t1: "$70", t10: "$697", t100: "$6,912", t500: "$34,355" }, + }, + { + provider: "Fil One", + isFilOne: true, + values: { t1: "$5", t10: "$50", t100: "$499", t500: "$2,495" }, + }, + ], + footnote: + "AWS S3 Standard us-east-1 Q2 2026: storage tiered $0.023/GB (first 50 TB), $0.022/GB (next 450 TB); egress $0.09/GB. Fil One $4.99/TB flat, egress $0. Computed from stated inputs — 1 TB: 1,024 GB × $0.023 = $23.55 storage + 512 GB × $0.09 = $46.08 egress; 500 TB: (51,200 × $0.023) + (460,800 × $0.022) = $11,315.20 storage + 256,000 × $0.09 = $23,040 egress.", + }, - {/* Features */} -
-
-
- Built for games - Storage that grows with player count, not bill. -
-
- {FEATURES.map(({ icon: Icon, title, desc }) => ( -
-
-

{title}

-

{desc}

-
- ))} -
-
-
+ features: { + label: "Built for games", + heading: ( + <> + Storage that grows with player count, not bill. + + ), + sub: "Flat, S3-compatible storage for player data, UGC, and game assets.", + items: [ + { + icon: ChartLine, + title: "Flat, predictable cost", + desc: "One rate per TB. Player growth, UGC spikes, and live-event surges don't change the rate. Cost planning for storage is one multiplication.", + }, + { + icon: ArrowsOut, + title: "No egress fees", + desc: "Serving game assets, player replays, or UGC to clients costs $0 in egress. Multiplayer downloads are not a billing event.", + }, + { + icon: Database, + title: "S3-compatible", + desc: "Standard S3 SDKs for asset pipelines, save-game syncs, and replay storage. Drop in as a replacement without changing the existing upload code.", + }, + { + icon: Plug, + title: "No per-request fees", + desc: "High-frequency asset reads during matchmaking, lobby loading, and live sessions don't accrue per-GET charges. Request rate is not a cost input.", + }, + ], + }, - {/* Pricing */} -
-
-
- Pricing - One rate. {PRICE_PER_TB_MONTH}. - Storage. That is the whole bill. No egress, no per-request fees. The invoice is predictable before the season starts. -
- -

No credit card required · No egress fees · Connects in minutes

-
-
- - {/* Dark CTA */} -
-
-
- -
-
- -
-
-
- ); + cta: { + heading: "Flat storage for unpredictable growth.", + subhead: "Free 1 TB evaluation. Connect your existing S3 asset pipeline and see a storage bill that doesn't react to player activity.", + cta: { label: "Start for free", href: SIGNUP_URL }, + secondaryCta: { label: "Talk to an expert", href: SALES_URL }, + note: TAGLINE, + }, }; +const GamingLandingPage = () => ; + export default GamingLandingPage; From 6a1a9e31592f0ccbcb92308f93409aa5d7679a27 Mon Sep 17 00:00:00 2001 From: Filipa Date: Tue, 18 Aug 2026 15:48:37 -0300 Subject: [PATCH 09/34] Migrate /lp/exit-first to LandingPage shell; drop fabricated claim MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Convert ExitFirstLandingPage from a hand-rolled 175-line page to a LandingPageConfig. Dropped the migrate-off rclone code sample from the "proof" section (same rationale as other conversions: the S3-parity claim is already in the features grid). Fixed a FIL-843 hit: the fourth feature card claimed "Integrity- verified data... every object is verified approximately every 24 hours" — the same fabricated verification cadence used on the Genomics page, not backed by anything in the console source-of-truth doc. Replaced with a real, on-thesis claim: the exit itself is testable today, for free, rather than only discovered under duress. Part of FIL-690. Co-Authored-By: Claude Sonnet 5 --- src/pages/ExitFirstLandingPage.tsx | 280 +++++++++++++---------------- 1 file changed, 120 insertions(+), 160 deletions(-) diff --git a/src/pages/ExitFirstLandingPage.tsx b/src/pages/ExitFirstLandingPage.tsx index 0cbe2e5..6b6be76 100644 --- a/src/pages/ExitFirstLandingPage.tsx +++ b/src/pages/ExitFirstLandingPage.tsx @@ -1,174 +1,134 @@ -import { ArrowsOut, Plug, ChartLine, ShieldCheck } from "@phosphor-icons/react"; -import PlatformNavbar from "@/components/PlatformNavbar"; -import Footer from "@/components/Footer"; -import { useInView } from "@/hooks/useInView"; -import { useSeo } from "@/hooks/useSeo"; -import { GRID_SVG, SectionLabel, SectionHeading, SectionSub } from "@/components/LandingPrimitives"; +import { ArrowsOut, Plug, ChartLine, Rocket } from "@phosphor-icons/react"; +import LandingPage, { type LandingPageConfig } from "@/components/LandingPage"; import { PRICE_PER_TB_SHORT, PRICE_PER_TB_MONTH } from "@/lib/pricing"; -// Exit cost on 100 TB. Hyperscaler internet egress vs Fil One. -// AWS S3 us-east-1: 102,400 GB × $0.09 = $9,216. Fil One: $0. -const EXIT_ROWS = [ - { provider: "AWS S3 Standard", egressRate: "$0.09 / GB", exit100tb: "$9,216", isFilOne: false }, - { provider: "Google Cloud", egressRate: "$0.08–$0.12 / GB", exit100tb: "$9,831", isFilOne: false }, - { provider: "Azure Blob (Hot)", egressRate: "up to $0.087 / GB", exit100tb: "$7,602", isFilOne: false }, - { provider: "Fil One", egressRate: "$0", exit100tb: "$0", isFilOne: true }, -]; +const SIGNUP_URL = "https://app.fil.one/login?screen_hint=signup"; +const SALES_URL = "/contact-sales"; -const FEATURES = [ - { icon: Plug, title: "Full S3 parity", desc: "Standard S3 API. The tools that read and write Fil One are the same ones that read and write everywhere else, so the migrate-off command is one you already know." }, - { icon: ArrowsOut, title: "$0 egress on exit", desc: "Moving your data out costs nothing. The exit is a sync command you can run today, for free — not a contract renegotiation or a budget request." }, - { icon: ChartLine, title: "Flat, predictable cost", desc: `${PRICE_PER_TB_MONTH} while you stay. With no egress and no per-request fees, the bill that would normally make leaving expensive doesn't exist.` }, - { icon: ShieldCheck, title: "Integrity-verified data", desc: "Every object is verified approximately every 24 hours, so the data you eventually move out is provably the data you put in." }, -]; +const TAGLINE = "No credit card required · No egress fees · Connects in minutes"; -const ExitFirstLandingPage = () => { - useSeo({ +// Exit cost on 100 TB. AWS: 102,400 GB x $0.09 = $9,216. +// GCP tiered (10 TB @ $0.12 + 40 @ $0.11 + 50 @ $0.08) = $9,831. +// Azure tiered = $7,602. Fil One: $0 egress. +const config: LandingPageConfig = { + seo: { title: "Fil One · Here's how to leave. Read it before you start.", - description: - `S3-compatible storage with $0 egress. The exit is a documented one-line sync command you can run on day one. Verify the way out before you commit. ${PRICE_PER_TB_SHORT} flat.`, + description: `S3-compatible storage with $0 egress. The exit is a documented one-line sync command, not a renegotiation. Verify the way out before you commit. ${PRICE_PER_TB_SHORT} flat.`, canonical: "https://www.fil.one/lp/exit-first", - }); + }, - const { ref: problemRef, inView: problemInView } = useInView({ threshold: 0.05 }); - const { ref: proofRef, inView: proofInView } = useInView({ threshold: 0.05 }); - const { ref: featuresRef, inView: featuresInView } = useInView({ threshold: 0.05 }); - const { ref: ctaRef, inView: ctaInView } = useInView({ threshold: 0.05 }); + hero: { + badge: "For anyone who's been burned by lock-in", + titleMaxWidth: 800, + descriptionMaxWidth: 600, + title: ( + <> + Here's how to leave. +
+ Read it before you start. + + ), + description: "S3-compatible, $0 egress. The exit is a documented one-line command you can run on day one. You can verify the way out before you ever commit.", + ctas: [ + { label: "Start for free", href: SIGNUP_URL, variant: "primary" }, + { label: "Talk to an expert", href: SALES_URL, variant: "secondary" }, + ], + tagline: TAGLINE, + }, - const MIGRATE_OFF = `# Leaving Fil One — the whole migration, one command. -# Same S3 API on both ends; $0 egress means it costs nothing. + problem: { + label: "The lock-in you can't see", + heading: "Every vendor says \"no lock-in.\" Few will show you the exit.", + sub: "If you've been burned before, the claim isn't enough. You want to see the way out before you put data in, and with most providers you only discover the real exit cost when you try to leave.", + subMaxWidth: 620, + items: [ + { + label: "Egress is the lock", + tone: "warning", + catch: "Leaving 100 TB costs $9,216 on AWS.", + body: "At $0.09/GB internet egress, the bill to move data out scales with how valuable your dataset has become. The lock isn't in the contract — it's in the exit invoice.", + }, + { + label: "Proprietary surface", + tone: "danger", + catch: "A non-S3 API means leaving is a rewrite.", + body: "When the storage API is bespoke, exiting means re-engineering every integration. The switching cost is engineering time, and it grows with every feature you build on top.", + }, + { + label: "The untested exit", + tone: "brand", + catch: "You learn the cost only when you try to go.", + body: "Most teams never run the migration until they have to — by then the dataset is large, the egress bill is real, and the \"no lock-in\" promise meets the actual number.", + }, + ], + }, -rclone sync filone:my-bucket aws:my-bucket --progress + comparison: { + label: "The exit, in advance", + heading: ( + <> + The way out is one command and $0. + + ), + sub: "Here is the migration off Fil One — before you've put anything in. Same S3 API on both ends, no egress charge to move data out.", + subMaxWidth: 620, + caption: "Cost to move 100 TB out, by provider", + columns: [ + { key: "rate", header: "Egress rate" }, + { key: "exit", header: "Cost to exit 100 TB", total: true }, + ], + rows: [ + { provider: "AWS S3 Standard", values: { rate: "$0.09 / GB", exit: "$9,216" } }, + { provider: "Google Cloud", values: { rate: "$0.08–$0.12 / GB", exit: "$9,831" } }, + { provider: "Azure Blob (Hot)", values: { rate: "up to $0.087 / GB", exit: "$7,602" } }, + { provider: "Fil One", isFilOne: true, values: { rate: "$0", exit: "$0" } }, + ], + footnote: + "Public US rate cards, Q2 2026. AWS: 102,400 GB × $0.09 = $9,216. GCP tiered (10 TB @ $0.12 + 40 @ $0.11 + 50 @ $0.08) = $9,831. Azure tiered = $7,602. Fil One: $0 egress.", + }, -# 'filone' and 'aws' are standard S3 remotes in rclone.conf. -# Point any S3 client the same way — the data is yours to move, -# any time, at no exit cost.`; + features: { + label: "Why the exit is real", + heading: ( + <> + Portable by default, provable on day one. + + ), + sub: "The migration off Fil One uses the same S3 API and tools you already have, and costs nothing to run.", + items: [ + { + icon: Plug, + title: "Full S3 parity", + desc: "Standard S3 API. The tools that read and write Fil One are the same ones that read and write everywhere else, so the migrate-off command is one you already know.", + }, + { + icon: ArrowsOut, + title: "$0 egress on exit", + desc: "Moving your data out costs nothing. The exit is a sync command you can run today, for free — not a contract renegotiation or a budget request.", + }, + { + icon: ChartLine, + title: "Flat, predictable cost", + desc: `${PRICE_PER_TB_MONTH} while you stay. With no egress and no per-request fees, the bill that would normally make leaving expensive doesn't exist.`, + }, + { + icon: Rocket, + title: "Test the exit before you need it", + desc: "Run the migrate-off command against a real bucket today, not after you've built years of data on top of it. If it doesn't do what this page says, you'll know in minutes, not in a crisis.", + }, + ], + }, - const valueColor = (val: string) => (val === "$0" ? "#16a34a" : "#dc2626"); - - return ( -
- -
- - {/* Hero */} -
-
- - {/* Problem */} -
-
-
- The lock-in you can't see - Every vendor says "no lock-in." Few will show you the exit. - If you've been burned before, the claim isn't enough. You want to see the way out before you put data in, and with most providers you only discover the real exit cost when you try to leave. -
-
- {[ - { label: "Egress is the lock", catch: "Leaving 100 TB costs $9,216 on AWS.", body: "At $0.09/GB internet egress, the bill to move data out scales with how valuable your dataset has become. The lock isn't in the contract — it's in the exit invoice." }, - { label: "Proprietary surface", catch: "A non-S3 API means leaving is a rewrite.", body: "When the storage API is bespoke, exiting means re-engineering every integration. The switching cost is engineering time, and it grows with every feature you build on top." }, - { label: "The untested exit", catch: "You learn the cost only when you try to go.", body: "Most teams never run the migration until they have to — by then the dataset is large, the egress bill is real, and the 'no lock-in' promise meets the actual number." }, - ].map(({ label, body, catch: c }) => ( -
-
- {label} -

{c}

-

{body}

-
-
- ))} -
-
-
- - {/* Proof — migrate-off command + exit cost */} -
-
-
- The exit, in advance - The way out is one command and $0. - Here is the migration off Fil One — before you've put anything in. Same S3 API on both ends, no egress charge to move data out. -
-
-
-
migrate-off.sh
-
{MIGRATE_OFF}
-
-
- Cost to move 100 TB out -
- {EXIT_ROWS.map(r => ( -
- {r.provider} - {r.egressRate} - {r.exit100tb} -
- ))} -
-

Public US rate cards, Q2 2026. AWS: 102,400 GB × $0.09 = $9,216. GCP tiered (10 TB @ $0.12 + 40 @ $0.11 + 50 @ $0.08) = $9,831. Azure tiered = $7,602. Fil One: $0 egress.

-
-
-
-
- - {/* Features */} -
-
-
- Why the exit is real - Portable by default, provable on day one. -
-
- {FEATURES.map(({ icon: Icon, title, desc }) => ( -
-
-

{title}

-

{desc}

-
- ))} -
-
-
- - {/* Dark CTA */} -
-
-
- -
-
-
-
-
- ); + cta: { + heading: "Know the exit before you commit.", + headingMaxWidth: 560, + subhead: `${PRICE_PER_TB_MONTH} — storage only, no egress in or out. Free 1 TB evaluation: put data in, run the migrate-off command, and watch it cost nothing. Then decide.`, + cta: { label: "Start for free", href: SIGNUP_URL }, + secondaryCta: { label: "Talk to an expert", href: SALES_URL }, + note: TAGLINE, + }, }; +const ExitFirstLandingPage = () => ; + export default ExitFirstLandingPage; From 619b5496646546a467d70a3fad593907ff137716 Mon Sep 17 00:00:00 2001 From: Filipa Date: Tue, 18 Aug 2026 15:49:52 -0300 Subject: [PATCH 10/34] Migrate /lp/affordable to LandingPage shell; drop fabricated claim MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Convert AffordableLandingPage from a hand-rolled 193-line page to a LandingPageConfig. Fixed a FIL-843 hit: the fourth feature card claimed "Recurring integrity checks... every stored object is verified approximately every 24 hours" — the same fabricated verification cadence as Genomics and Exit-First. Replaced with a real, non-duplicate claim: flat per-TB pricing that doesn't change with scale. Part of FIL-690. Co-Authored-By: Claude Sonnet 5 --- src/pages/AffordableLandingPage.tsx | 302 ++++++++++++---------------- 1 file changed, 124 insertions(+), 178 deletions(-) diff --git a/src/pages/AffordableLandingPage.tsx b/src/pages/AffordableLandingPage.tsx index ae50f62..0f98d68 100644 --- a/src/pages/AffordableLandingPage.tsx +++ b/src/pages/AffordableLandingPage.tsx @@ -1,192 +1,138 @@ -import { ArrowsOut, ChartLine, Plug, ShieldCheck } from "@phosphor-icons/react"; -import PlatformNavbar from "@/components/PlatformNavbar"; -import Footer from "@/components/Footer"; -import { useInView } from "@/hooks/useInView"; -import { useSeo } from "@/hooks/useSeo"; -import { GRID_SVG, SectionLabel, SectionHeading, SectionSub } from '@/components/LandingPrimitives'; -import { PRICE_DISPLAY, PRICE_PER_TB_SHORT, PRICE_PER_TB_MONTH } from "@/lib/pricing"; +import { ArrowsOut, ChartLine, Plug, Database } from "@phosphor-icons/react"; +import LandingPage, { type LandingPageConfig } from "@/components/LandingPage"; +import { PRICE_DISPLAY, PRICE_PER_TB_SHORT } from "@/lib/pricing"; +const SIGNUP_URL = "https://app.fil.one/login?screen_hint=signup"; +const SALES_URL = "/contact-sales"; + +const TAGLINE = "No credit card required · No egress fees · Connects in minutes"; // What you actually pay on each provider for a simple 10 TB workload, light reads. // 10 TB stored, 2 TB read/month, 100K GET operations. -// AWS: 10,240×$0.023=$235.52 + 2,048×$0.09=$184.32 + 100K×$0.0004/1K=$0.04 ≈ $420 -// Google: 10,240×$0.020=$204.80 + 2,048×$0.12=$245.76 ≈ $451 -// Wasabi: 10TB×$6.99=$69.90 (90-day min billing) -// Backblaze B2: 10TB×$6=$60 -// Fil One: 10TB×$4.99=$49.90, $0 egress -const COMPARE_ROWS = [ - { provider: "AWS S3 Standard", storage: "$236", egress: "$184", api: "$0.04", total: "$420", isFilOne: false }, - { provider: "Google Cloud", storage: "$205", egress: "$246", api: "$0.05", total: "$451", isFilOne: false }, - { provider: "Wasabi", storage: "$70", egress: "$0", api: "$0", total: "$70", isFilOne: false }, - { provider: "Backblaze B2", storage: "$60", egress: "$0", api: "$0", total: "$60", isFilOne: false }, - { provider: "Fil One", storage: "$50", egress: "$0", api: "$0", total: "$50", isFilOne: true }, -]; - -const FEATURES = [ - { icon: ChartLine, title: "One number on the invoice", desc: `Storage volume times ${PRICE_DISPLAY}. No egress column, no request column, no retrieval tier. The invoice has one line.` }, - { icon: ArrowsOut, title: "No egress fees", desc: "Reads are included in flat storage. Download your own data as many times as you need — $0 in egress." }, - { icon: Plug, title: "S3-compatible, zero migration cost", desc: "Existing SDKs, tools, and scripts connect with an endpoint change. No rewrite, no new library, no operational overhead." }, - { icon: ShieldCheck,title: "Recurring integrity checks", desc: "Every stored object is verified approximately every 24 hours. Low-cost storage that also proves your data is intact." }, -]; - -const AffordableLandingPage = () => { - useSeo({ +// AWS: 10,240x$0.023=$235.52 storage + 2,048x$0.09=$184.32 egress + 100Kx$0.0004/1K=$0.04 api ~ $420. +// Google: 10,240x$0.020=$204.80 storage + 2,048x$0.12=$245.76 egress ~ $451. +// Wasabi: 10TBx$6.99=$69.90 (90-day min billing), $0 egress. Backblaze B2: 10TBx$6=$60, $0 egress. +// Fil One: 10TBx$4.99=$49.90, $0 egress, $0 api. +const config: LandingPageConfig = { + seo: { title: "Fil One · Make storage your lowest line item", - description: - `S3-compatible object storage at ${PRICE_PER_TB_SHORT} flat. No egress fees, no per-request charges, no confusing billing. One number. Start in minutes.`, + description: `S3-compatible object storage at ${PRICE_PER_TB_SHORT} flat. No egress fees, no per-request charges, no confusing billing. One number. Start in minutes.`, canonical: "https://www.fil.one/lp/affordable", - }); - - const { ref: problemRef, inView: problemInView } = useInView({ threshold: 0.05 }); - const { ref: tableRef, inView: tableInView } = useInView({ threshold: 0.05 }); - const { ref: featuresRef, inView: featuresInView } = useInView({ threshold: 0.05 }); - const { ref: ctaRef, inView: ctaInView } = useInView({ threshold: 0.05 }); + }, - return ( -
- -
+ hero: { + badge: "Simple, affordable S3-compatible storage", + titleMaxWidth: 800, + descriptionMaxWidth: 580, + title: ( + <> + Make storage your lowest line item +
+ and the last thing you worry about. + + ), + description: `${PRICE_PER_TB_SHORT} flat. No egress fees, no per-request charges, no confusing billing tiers. Buckets and retrieval work exactly as you expect.`, + ctas: [ + { label: "Start for free", href: SIGNUP_URL, variant: "primary" }, + { label: "Talk to an expert", href: SALES_URL, variant: "secondary" }, + ], + tagline: TAGLINE, + }, - {/* Hero */} -
-
+ problem: { + label: "The billing problem", + heading: "Object storage should be simple to price. It rarely is.", + sub: "Hyperscaler storage bills have a storage line, an egress line, a request line, and a retrieval tier line. Predicting next month's invoice requires a spreadsheet, not a multiplication.", + items: [ + { + label: "Four line items", + tone: "warning", + catch: "Storage is just one of the charges.", + body: "AWS S3 Standard charges for storage, egress out to the internet, PUT operations, GET operations, and retrieval (if using Glacier tiers). Each line item has its own rate card. The total requires a calculator, not a guess.", + }, + { + label: "Egress surprise", + tone: "danger", + catch: "The biggest line comes from reading your data.", + body: "At $0.09/GB, downloading 2 TB from AWS costs $184 — 78% of the $236 storage charge for that 10 TB dataset. The bill for 'storing' data is smaller than the bill for using it.", + }, + { + label: "The switch friction", + tone: "brand", + catch: "Migration looks hard. It isn't.", + body: "Teams stay on expensive storage because switching seems like a project. Fil One implements the same S3 API — any tool that writes S3 today connects with a one-line config change.", + }, + ], + }, - {/* Problem */} -
-
-
- The billing problem - Object storage should be simple to price. It rarely is. - Hyperscaler storage bills have a storage line, an egress line, a request line, and a retrieval tier line. Predicting next month's invoice requires a spreadsheet, not a multiplication. -
-
- {[ - { label: "Four line items", catch: "Storage is just one of the charges.", body: "AWS S3 Standard charges for storage, egress out to the internet, PUT operations, GET operations, and retrieval (if using Glacier tiers). Each line item has its own rate card. The total requires a calculator, not a guess." }, - { label: "Egress surprise", catch: "The biggest line comes from reading your data.", body: "At $0.09/GB, downloading 2 TB from AWS costs $184 — 78% of the $236 storage charge for that 10 TB dataset. The bill for 'storing' data is smaller than the bill for using it." }, - { label: "The switch friction","catch": "Migration looks hard. It isn't.", body: "Teams stay on expensive storage because switching seems like a project. Fil One implements the same S3 API — any tool that writes S3 today connects with a one-line config change." }, - ].map(({ label, body, catch: c }) => ( -
-
- {label} -

{c}

-

{body}

-
-
- ))} -
-
-
+ comparison: { + label: "Side by side", + heading: ( + <> + 10 TB stored, 2 TB read per month. + + ), + sub: "A modest workload, five providers. The egress column is where hyperscaler bills diverge from the others.", + subMaxWidth: 620, + caption: "Monthly cost for 10 TB stored, 2 TB read, by provider", + columns: [ + { key: "storage", header: "Storage" }, + { key: "egress", header: "Egress", colorByValue: true }, + { key: "api", header: "API / ops", colorByValue: true }, + { key: "total", header: "Total / month", total: true }, + ], + rows: [ + { provider: "AWS S3 Standard", values: { storage: "$236", egress: "$184", api: "$0.04", total: "$420" } }, + { provider: "Google Cloud", values: { storage: "$205", egress: "$246", api: "$0.05", total: "$451" } }, + { provider: "Wasabi", values: { storage: "$70", egress: "$0", api: "$0", total: "$70" } }, + { provider: "Backblaze B2", values: { storage: "$60", egress: "$0", api: "$0", total: "$60" } }, + { provider: "Fil One", isFilOne: true, values: { storage: "$50", egress: "$0", api: "$0", total: "$50" } }, + ], + footnote: + "Public US rate cards Q2 2026. AWS: 10,240 GB × $0.023 = $235.52 storage + 2,048 GB × $0.09 = $184.32 egress. Google: 10,240 × $0.020 = $204.80 + 2,048 × $0.12 = $245.76. Wasabi $6.99/TB, no egress. Backblaze B2 $6/TB, no egress. Fil One $4.99/TB, no egress, no per-request fees.", + }, - {/* Comparison */} -
-
-
- Side by side - 10 TB stored, 2 TB read per month. - A modest workload, five providers. The egress column is where hyperscaler bills diverge from the others. -
-
- - - - {["Provider", "Storage", "Egress", "API / ops", "Total / month"].map(h => ( - - ))} - - - - {COMPARE_ROWS.map(r => ( - - - - - - - - ))} - -
{h}
- {r.provider}{r.isFilOne && You} - {r.storage}{r.egress}{r.api}{r.total}
-
-

Public US rate cards Q2 2026. AWS: 10,240 GB × $0.023 = $235.52 storage + 2,048 GB × $0.09 = $184.32 egress. Google: 10,240 × $0.020 = $204.80 + 2,048 × $0.12 = $245.76. Wasabi $6.99/TB, no egress. Backblaze B2 $6/TB, no egress. Fil One $4.99/TB, no egress, no per-request fees.

-
-
+ features: { + label: "Why it's simple", + heading: ( + <> + Storage that works like it says on the tin. + + ), + sub: "One rate, no metered lines underneath it.", + items: [ + { + icon: ChartLine, + title: "One number on the invoice", + desc: `Storage volume times ${PRICE_DISPLAY}. No egress column, no request column, no retrieval tier. The invoice has one line.`, + }, + { + icon: ArrowsOut, + title: "No egress fees", + desc: "Reads are included in flat storage. Download your own data as many times as you need — $0 in egress.", + }, + { + icon: Plug, + title: "S3-compatible, zero migration cost", + desc: "Existing SDKs, tools, and scripts connect with an endpoint change. No rewrite, no new library, no operational overhead.", + }, + { + icon: Database, + title: "Flat at any scale", + desc: `${PRICE_PER_TB_SHORT} whether you store 1 TB or 100 TB. The rate per TB does not change as you grow.`, + }, + ], + }, - {/* Features */} -
-
-
- Why it's simple - Storage that works like it says on the tin. -
-
- {FEATURES.map(({ icon: Icon, title, desc }) => ( -
-
-

{title}

-

{desc}

-
- ))} -
-
-
- - {/* Pricing */} -
-
-
- Pricing - One rate. {PRICE_PER_TB_MONTH}. - Storage. That is the whole bill. No egress, no requests, no tiers. Multiply your TB by {PRICE_DISPLAY} and that is the invoice. -
- -

No credit card required · No egress fees · Connects in minutes

-
-
- - {/* Dark CTA */} -
-
-
- -
-
-
-
-
- ); + cta: { + heading: "One number. No surprises.", + subhead: "Free 1 TB evaluation. Swap the endpoint in your S3 config and check the invoice at the end of the trial.", + cta: { label: "Start for free", href: SIGNUP_URL }, + secondaryCta: { label: "Talk to an expert", href: SALES_URL }, + note: TAGLINE, + }, }; +const AffordableLandingPage = () => ; + export default AffordableLandingPage; From 0977e029b7e67589a53bd27646b56f9333438602 Mon Sep 17 00:00:00 2001 From: Filipa Date: Tue, 18 Aug 2026 15:51:46 -0300 Subject: [PATCH 11/34] Migrate /lp/data-control to LandingPage shell; drop verification claim MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Convert DataControlLandingPage from a hand-rolled 169-line page to a LandingPageConfig. This page's entire premise was built on the fabricated "~24-hour integrity verification" claim — it appeared in the hero, a problem card, a whole dedicated "trust" section, the first feature card, and the closing CTA heading ("Verifiable integrity"). None of it is backed by the console source-of-truth doc (no CID/proof/verification exists on any object). Repositioned "control" around what's actually real: an EU region endpoint (eu-west-1, GA), $0 exit egress, and standard S3 tooling. Dropped the dedicated "trust" section (its EU-endpoint and exit-cost cards moved into features; the fabricated verification card became a real encryption-at-rest/in-transit claim, worded to avoid implying customer-held keys per the source-of-truth doc). Kept the `{{NEEDS PROOF: operator-pinning capability}}` placeholder as-is — this is one of the pages tracked by FIL-1046, not something to fabricate an answer for. Fixed the matching routeMeta.mjs description. Part of FIL-690. Co-Authored-By: Claude Sonnet 5 --- scripts/routeMeta.mjs | 2 +- src/pages/DataControlLandingPage.tsx | 248 ++++++++++----------------- 2 files changed, 94 insertions(+), 156 deletions(-) diff --git a/scripts/routeMeta.mjs b/scripts/routeMeta.mjs index e709653..fe767d1 100644 --- a/scripts/routeMeta.mjs +++ b/scripts/routeMeta.mjs @@ -466,7 +466,7 @@ export const ROUTE_META = { "/lp/data-control": { title: "Fil One · Your data, under your control", description: - `S3-compatible storage with EU region endpoint, recurring integrity verification, $0 exit egress, and no vendor lock-in. Flat ${PRICE_PER_TB_SHORT}.`, + `S3-compatible storage with an EU region endpoint, $0 exit egress, and no vendor lock-in. Flat ${PRICE_PER_TB_SHORT}.`, }, "/lp/ml-training": { title: "Fil One · Build around the clock", diff --git a/src/pages/DataControlLandingPage.tsx b/src/pages/DataControlLandingPage.tsx index 71b6692..8a7a10d 100644 --- a/src/pages/DataControlLandingPage.tsx +++ b/src/pages/DataControlLandingPage.tsx @@ -1,168 +1,106 @@ import { ShieldCheck, ArrowsOut, ChartLine, Plug } from "@phosphor-icons/react"; -import PlatformNavbar from "@/components/PlatformNavbar"; -import Footer from "@/components/Footer"; -import { useInView } from "@/hooks/useInView"; -import { useSeo } from "@/hooks/useSeo"; -import { GRID_SVG, SectionLabel, SectionHeading, SectionSub } from '@/components/LandingPrimitives'; -import { PRICE_PER_TB_SHORT, PRICE_PER_TB_MONTH } from "@/lib/pricing"; +import LandingPage, { type LandingPageConfig } from "@/components/LandingPage"; +import { PRICE_PER_TB_SHORT } from "@/lib/pricing"; +const SIGNUP_URL = "https://app.fil.one/login?screen_hint=signup"; +const SALES_URL = "/contact-sales"; -const FEATURES = [ - { icon: ShieldCheck, title: "Integrity verification, ~24 h", desc: "Every stored object is verified approximately every 24 hours. Data cannot silently change without detection — observable integrity, not a vendor assurance.", placeholder: false }, - { icon: ArrowsOut, title: "No exit egress", desc: "$0 to move data out. Portability is not penalised. You can leave without an exit bill — which means staying is a choice, not a lock-in.", placeholder: false }, - { icon: Plug, title: "S3-compatible tooling", desc: "Standard S3 API — your existing SDKs, CLIs, and audit tooling work without custom adapters. Control does not require a new stack.", placeholder: false }, - { icon: ChartLine, title: "Operator-level placement", desc: "{{NEEDS PROOF: specific region and operator-pinning capability — which operators/regions can be selected, and how this is configured}}", placeholder: true }, -]; +const TAGLINE = "No credit card required · No egress fees · Connects in minutes"; -const DataControlLandingPage = () => { - useSeo({ +const config: LandingPageConfig = { + seo: { title: "Fil One · Your data, under your control", - description: - `S3-compatible storage with EU region endpoint, recurring integrity verification, $0 exit egress, and no vendor lock-in. Flat ${PRICE_PER_TB_SHORT}.`, + description: `S3-compatible storage with an EU region endpoint, $0 exit egress, and no vendor lock-in. Flat ${PRICE_PER_TB_SHORT}.`, canonical: "https://www.fil.one/lp/data-control", - }); + }, - const { ref: problemRef, inView: problemInView } = useInView({ threshold: 0.05 }); - const { ref: trustRef, inView: trustInView } = useInView({ threshold: 0.05 }); - const { ref: featuresRef, inView: featuresInView } = useInView({ threshold: 0.05 }); - const { ref: ctaRef, inView: ctaInView } = useInView({ threshold: 0.05 }); + hero: { + badge: "For EU teams with data residency and control requirements", + titleMaxWidth: 760, + descriptionMaxWidth: 580, + title: ( + <> + Your data, +
+ under your control. + + ), + description: "S3-compatible storage with an EU region endpoint and $0 exit egress. Control means your data stays in the region you chose, and leaving doesn't cost you anything.", + ctas: [ + { label: "Start for free", href: SIGNUP_URL, variant: "primary" }, + { label: "Talk to an expert", href: SALES_URL, variant: "secondary" }, + ], + tagline: TAGLINE, + }, - return ( -
- -
+ problem: { + label: "The control gap", + heading: "Hyperscalers offer regions. They don't offer an easy way out.", + sub: "Selecting an EU region on AWS or Google Cloud controls where data is written by default. It gives you a contractual assurance, but leaving on your own terms still comes with a metered exit bill.", + subMaxWidth: 620, + items: [ + { + label: "The region illusion", + tone: "warning", + catch: "A region setting is not the whole story.", + body: "Cloud providers replicate, migrate, and process data across infrastructure according to their own operational needs. An EU region bucket stays in EU storage — but the operational boundary is defined by the vendor, not you.", + }, + { + label: "The exit penalty", + tone: "danger", + catch: "Portability costs money on metered storage.", + body: "Moving data out of a hyperscaler costs $0.09/GB. At any meaningful scale, that exit bill is the mechanism that makes 'control' feel theoretical. Real control requires the ability to leave without a financial penalty.", + }, + { + label: "The audit assumption", + tone: "brand", + catch: "Compliance asks where data lives, not just where you say it does.", + body: "Audit and regulatory frameworks increasingly ask for a specific, documented region and a workable exit path — not a vendor SLA promise. An EU endpoint with $0 exit egress gives you both to point to.", + }, + ], + }, - {/* Hero */} -
-
+ features: { + label: "Capabilities", + heading: ( + <> + Control that is structural, not contractual. + + ), + sub: "An EU endpoint, a free exit, and standard S3 tooling — the concrete pieces that make control real.", + items: [ + { + icon: ShieldCheck, + title: "Encryption at rest and in transit", + desc: "TLS protects data moving to and from the endpoint, and objects are encrypted at rest by the storage gateway — always on, no configuration required.", + }, + { + icon: ArrowsOut, + title: "No exit egress", + desc: "$0 to move data out. Portability is not penalised. You can leave without an exit bill — which means staying is a choice, not a lock-in.", + }, + { + icon: Plug, + title: "S3-compatible tooling", + desc: "Standard S3 API — your existing SDKs, CLIs, and audit tooling work without custom adapters. Control does not require a new stack.", + }, + { + icon: ChartLine, + title: "Operator-level placement", + desc: "{{NEEDS PROOF: specific region and operator-pinning capability — which operators/regions can be selected, and how this is configured}}", + }, + ], + }, - {/* Problem */} -
-
-
- The control gap - Hyperscalers offer regions. They don't offer proof. - - Selecting an EU region on AWS or Google Cloud controls where data is written by default. It does not give you a verifiable record that the data hasn't changed, moved, or been silently accessed — it gives you a contractual assurance. - -
-
- {[ - { label: "The region illusion", catch: "A region setting is not data control.", body: "Cloud providers replicate, migrate, and process data across infrastructure according to their own operational needs. An EU region bucket stays in EU storage — but the operational boundary is defined by the vendor, not you." }, - { label: "The exit penalty", catch: "Portability costs money on metered storage.", body: "Moving data out of a hyperscaler costs $0.09/GB. At any meaningful scale, that exit bill is the mechanism that makes 'control' feel theoretical. Real control requires the ability to leave without a financial penalty." }, - { label: "The audit assumption", catch: "Compliance asks for evidence, not assurances.", body: "Audit and regulatory frameworks are increasingly asking for verifiable data provenance — not vendor SLA documents. Integrity verification that runs automatically provides a record, not a promise." }, - ].map(({ label, body, catch: c }) => ( -
-
- {label} -

{c}

-

{body}

-
-
- ))} -
-
-
- - {/* Trust / integrity section */} -
-
-
- What control looks like - Verified integrity. Zero exit cost. EU endpoint. - - Three things that make control concrete: data you can prove hasn't changed, data you can move without a bill, and data that stays in EU infrastructure. - -
-
- {[ - { heading: "~24-hour integrity verification", sub: "Every stored object is verified on a recurring basis — approximately every 24 hours. Data cannot silently corrupt or change without detection. This is built into the storage layer, not a monitoring add-on." }, - { heading: "EU endpoint at eu-west-1", sub: "Data written to https://eu-west-1.s3.fil.one stays in EU-hosted infrastructure. Standard S3 tools connect with the endpoint change — no re-architecture." }, - { heading: "$0 exit egress", sub: "Moving your data to another provider costs nothing in egress. Portability is structural, not contractual. The exit is $0 from day one." }, - ].map(({ heading, sub }) => ( -
-

{heading}

-

{sub}

-
- ))} -
-
-
- - {/* Features */} -
-
-
- Capabilities - Control that is observable, not promised. -
-
- {FEATURES.map(({ icon: Icon, title, desc, placeholder }) => ( -
-
-

{title}

-

{desc}

-
- ))} -
-
-
- - {/* Pricing */} -
-
-
- Pricing - One rate. {PRICE_PER_TB_MONTH}. - Storage. No egress, no per-request fees. EU data residency does not carry a premium over the standard rate. -
- -

No credit card required · No egress fees · Connects in minutes

-
-
- - {/* Dark CTA */} -
-
-
- -
-
-
-
-
- ); + cta: { + heading: "Your data. Your region. No exit bill.", + subhead: "Free 1 TB on the EU endpoint. Point your existing S3 tools and confirm your data stays in eu-west-1.", + cta: { label: "Start for free", href: SIGNUP_URL }, + secondaryCta: { label: "Talk to an expert", href: SALES_URL }, + note: TAGLINE, + }, }; +const DataControlLandingPage = () => ; + export default DataControlLandingPage; From 092e70adbc94df071773fa0020b9a2b1694f2ba5 Mon Sep 17 00:00:00 2001 From: Filipa Date: Tue, 18 Aug 2026 16:42:10 -0300 Subject: [PATCH 12/34] Migrate /lp/migrate-from-s3 to design tokens + shared components MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Convert MigrateFromS3LandingPage from a hand-rolled 633-line page to shared components (Hero, LandingPrimitives, CodeBlock, PriceComparisonTable, FeatureCard, CtaBanner, TextLink). Kept it hand-composed rather than the LandingPage config shell, same as Agents — the before/after code-diff section doesn't map onto the shell's problem/comparison/workloads/features/metrics skeleton. Reused CodeBlock's existing tabs for the two before/after snippets (Python, Node.js) instead of hand-rolled
 blocks.

Fixed a FIL-843 hit: the fourth feature card claimed "Recurring
integrity verification... every object is verified approximately
every 24 hours" — the same fabricated claim found on Genomics,
Exit-First, Affordable, and Data-Control. Replaced with a real,
non-duplicate claim about flat pricing at any scale.

Left one claim untouched: routeMeta.mjs's "Fully S3-compatible" is a
separately tracked issue (FIL-890, "5 locations" sitewide) with its
own scope, not part of this pass.

Part of FIL-690.

Co-Authored-By: Claude Sonnet 5 
---
 src/pages/MigrateFromS3LandingPage.tsx | 649 +++++--------------------
 1 file changed, 128 insertions(+), 521 deletions(-)

diff --git a/src/pages/MigrateFromS3LandingPage.tsx b/src/pages/MigrateFromS3LandingPage.tsx
index 3b059d6..a165f1a 100644
--- a/src/pages/MigrateFromS3LandingPage.tsx
+++ b/src/pages/MigrateFromS3LandingPage.tsx
@@ -1,37 +1,39 @@
-import { ArrowsOut, ChartLine, Plug, ShieldCheck } from "@phosphor-icons/react";
+import { ArrowsOut, ChartLine, Plug, Database } from "@phosphor-icons/react";
 import PlatformNavbar from "@/components/PlatformNavbar";
 import Footer from "@/components/Footer";
 import { useInView } from "@/hooks/useInView";
 import { useSeo } from "@/hooks/useSeo";
-import { GRID_SVG, SectionLabel, SectionHeading, SectionSub } from '@/components/LandingPrimitives';
-import { PRICE_PER_TB_SHORT, PRICE_PER_TB_MONTH } from "@/lib/pricing";
-
-
-// Price delta scenario: 10 TB stored + 10 TB reads + 1M GET operations
-// AWS S3 Standard us-east-1 Q2 2026:
-//   Storage: 10,240 GB × $0.023 = $235.52
-//   Egress: 10,240 GB × $0.09 = $921.60
-//   GETs: 1,000,000 / 1,000 × $0.0004 = $0.40
-//   Total: ~$1,157.52
-// Fil One: 10 TB × $4.99 = $49.90
+import { SectionLabel, SectionHeading, SectionSub } from "@/components/LandingPrimitives";
+import Hero from "@/components/Hero";
+import FeatureCard from "@/components/FeatureCard";
+import CtaBanner from "@/components/CtaBanner";
+import CodeBlock from "@/components/CodeBlock";
+import PriceComparisonTable, {
+  type PriceComparisonColumn,
+  type PriceComparisonRow,
+} from "@/components/PriceComparisonTable";
+import TextLink from "@/components/TextLink";
+import { PRICE_PER_TB_SHORT } from "@/lib/pricing";
+
+const SIGNUP_URL = "https://app.fil.one/login?screen_hint=signup";
+const SALES_URL = "/contact-sales";
+
+const TAGLINE = "No credit card required · No egress fees · Connects in minutes";
+
+// 10 TB stored, 10 TB read/month, 1M GET operations.
+// AWS S3 Standard us-east-1 Q2 2026: storage 10,240 GB x $0.023 = $235.52,
+// egress 10,240 GB x $0.09 = $921.60, ops 1,000,000 / 1,000 x $0.0004 = $0.40.
+// Fil One: 10 TB x $4.99 = $49.90, egress $0, ops $0.
+const PRICING_COLUMNS: PriceComparisonColumn[] = [
+  { key: "storage", header: "Storage" },
+  { key: "egress", header: "Egress", colorByValue: true },
+  { key: "api", header: "API / ops", colorByValue: true },
+  { key: "total", header: "Total / month", total: true },
+];
 
-const COMPARISON_ROWS = [
-  {
-    provider: "AWS S3 Standard",
-    storage: "$236",
-    egress: "$922",
-    api: "$0.40",
-    total: "$1,158",
-    isFilOne: false,
-  },
-  {
-    provider: "Fil One",
-    storage: "$50",
-    egress: "$0",
-    api: "$0",
-    total: "$50",
-    isFilOne: true,
-  },
+const PRICING_ROWS: PriceComparisonRow[] = [
+  { provider: "AWS S3 Standard", values: { storage: "$236", egress: "$922", api: "$0.40", total: "$1,158" } },
+  { provider: "Fil One", isFilOne: true, values: { storage: "$50", egress: "$0", api: "$0", total: "$50" } },
 ];
 
 const FEATURES = [
@@ -51,32 +53,19 @@ const FEATURES = [
     desc: `Storage at ${PRICE_PER_TB_SHORT}. No egress, no per-request fees, no storage tier waterfall. The line item you plan for is the line item that ships.`,
   },
   {
-    icon: ShieldCheck,
-    title: "Recurring integrity verification",
-    desc: "Every object is verified approximately every 24 hours. Data does not silently corrupt or disappear without detection — no extra configuration required.",
+    icon: Database,
+    title: "Flat cost at any scale",
+    desc: `${PRICE_PER_TB_SHORT} whether you migrate 1 TB or 1 PB. The rate per TB does not change as the dataset grows.`,
   },
 ];
 
-const MigrateFromS3LandingPage = () => {
-  useSeo({
-    title: "Fil One · Leaving S3 is a config change, not a rewrite",
-    description:
-      `Same SDK. New endpoint. Lower bill. Point your existing S3 tools at Fil One and cut storage costs to ${PRICE_PER_TB_SHORT} flat with $0 egress.`,
-    canonical: "https://www.fil.one/lp/migrate-from-s3",
-  });
-
-  const { ref: codeRef, inView: codeInView } = useInView({ threshold: 0.05 });
-  const { ref: tableRef, inView: tableInView } = useInView({ threshold: 0.05 });
-  const { ref: featuresRef, inView: featuresInView } = useInView({ threshold: 0.05 });
-  const { ref: ctaRef, inView: ctaInView } = useInView({ threshold: 0.05 });
-
-  const BOTO3_BEFORE = `# Before — AWS S3
+const BOTO3_CODE = `# Before — AWS S3
 s3 = boto3.client(
     "s3",
     region_name="us-east-1",
-)`;
+)
 
-  const BOTO3_AFTER = `# After · Fil One (no other changes)
+# After · Fil One (no other changes)
 s3 = boto3.client(
     "s3",
     endpoint_url="https://eu-west-1.s3.fil.one",
@@ -85,10 +74,10 @@ s3 = boto3.client(
     region_name="eu-west-1",
 )`;
 
-  const NODE_BEFORE = `// Before — AWS S3
-const s3 = new S3Client({ region: "us-east-1" });`;
+const NODE_CODE = `// Before — AWS S3
+const s3 = new S3Client({ region: "us-east-1" });
 
-  const NODE_AFTER = `// After · Fil One
+// After · Fil One
 const s3 = new S3Client({
   endpoint: "https://eu-west-1.s3.fil.one",
   region: "eu-west-1",
@@ -98,125 +87,64 @@ const s3 = new S3Client({
   },
 });`;
 
+const MigrateFromS3LandingPage = () => {
+  useSeo({
+    title: "Fil One · Leaving S3 is a config change, not a rewrite",
+    description: `Same SDK. New endpoint. Lower bill. Point your existing S3 tools at Fil One and cut storage costs to ${PRICE_PER_TB_SHORT} flat with $0 egress.`,
+    canonical: "https://www.fil.one/lp/migrate-from-s3",
+  });
+
+  const { ref: codeRef, inView: codeInView } = useInView({ threshold: 0.05 });
+  const { ref: tableRef, inView: tableInView } = useInView({ threshold: 0.05 });
+  const { ref: featuresRef, inView: featuresInView } = useInView({ threshold: 0.05 });
+
   return (
-    
+
- {/* Hero */} -
-
- - {/* Code block — the endpoint swap */} -
+ } + title={ + <> + Leaving S3 is a config change, +
+ not a rewrite. + + } + description={ + <>Point your existing S3 tools at Fil One. {PRICE_PER_TB_SHORT} flat, no egress. Same SDK, same API, lower bill. + } + ctas={[ + { label: "Start for free", href: SIGNUP_URL, variant: "primary" }, + { label: "Talk to an expert", href: SALES_URL, variant: "secondary" }, + ]} + tagline={TAGLINE} + /> + + {/* ── Code block — the endpoint swap ──────────────────────────────── */} +
The migration - Change the endpoint. Nothing else. + Change the endpoint. Nothing else. Fil One implements the S3 API. The code that works on AWS works here — PutObject, GetObject, ListObjectsV2, multipart upload, presigned URLs. @@ -224,404 +152,83 @@ const s3 = new S3Client({
- {/* Python */} -
-

- Python (boto3) -

-
-
-                    {BOTO3_BEFORE + "\n\n" + BOTO3_AFTER}
-                  
-
-
- - {/* Node */} -
-

- Node.js (@aws-sdk/client-s3) -

-
-
-                    {NODE_BEFORE + "\n\n" + NODE_AFTER}
-                  
-
-
+ +
-
-

- What is compatible -

-

+

+

What is compatible

+

PutObject, GetObject, DeleteObject, HeadObject, CopyObject, ListObjectsV2, CreateBucket, DeleteBucket, multipart upload, presigned URLs. Standard Auth v4 signing. For a full compatibility list, see{" "} - + docs.fil.one - . + + .

- {/* Price comparison */} -
+ {/* ── Price comparison ─────────────────────────────────────────────── */} +
The delta - 10 TB stored, 10 TB read/month. What changes. + 10 TB stored, 10 TB read/month. What changes.
-
- - - - {["Provider", "Storage", "Egress", "API / ops", "Total / month"].map((h) => ( - - ))} - - - - {COMPARISON_ROWS.map((row) => ( - - - {[row.storage, row.egress, row.api, row.total].map((v, i) => ( - - ))} - - ))} - -
- {h} -
- {row.provider} - {row.isFilOne && ( - - You - - )} - - {v} -
-
-

- AWS S3 Standard us-east-1 Q2 2026: $0.023/GB storage, $0.09/GB internet egress, $0.0004/1K GET. Computed from stated inputs — 10,240 GB × $0.023 = $235.52 storage; 10,240 GB × $0.09 = $921.60 egress; 1M × $0.0004/1K = $0.40 ops. Fil One: 10 TB × $4.99 = $49.90, egress $0, ops $0. -

+
- {/* Features */} -
-
-
+ {/* ── Features ─────────────────────────────────────────────────────── */} +
+
+
What carries over - S3 parity. Lower bill. + S3 parity. Lower bill. The same tools, the same APIs, the same integration patterns. The line items that dominated the invoice do not exist here.
- -
- {FEATURES.map(({ icon: Icon, title, desc }) => ( -
+ {FEATURES.map(({ icon, title, desc }) => ( + -
- -
-

- {title} -

-

- {desc} -

-
+ icon={icon} + title={title} + description={desc} + className={`reveal${featuresInView ? " in-view" : ""}`} + /> ))}
- {/* Pricing */} -
-
-
- Pricing - - One rate. {PRICE_PER_TB_MONTH}. - - - Storage. That is the whole bill. No egress fees, no per-request charges. The S3 code carries over; the invoice does not. - -
- -

- No credit card required · No egress fees · Connects in minutes -

-
-
- - {/* Dark CTA */} -
-
-
- -
-
+ {/* ── CTA Banner ────────────────────────────────────────────────────── */} +