diff --git a/scripts/routeMeta.mjs b/scripts/routeMeta.mjs index 96cf38e..7775317 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", @@ -154,7 +154,7 @@ export const ROUTE_META = { "/lp/rag-storage": { title: "Object Storage for RAG Pipelines · Fil One", description: - `Store and retrieve RAG corpora, embeddings, and vector indexes at ${PRICE_PER_TB_SHORT}. S3-compatible, no egress fees, verifiable integrity — built for LLM pipelines.`, + `Store and retrieve RAG corpora, embeddings, and vector indexes at ${PRICE_PER_TB_SHORT}. S3-compatible, no egress fees — built for LLM pipelines.`, jsonLd: [ { "@context": "https://schema.org", @@ -199,7 +199,7 @@ export const ROUTE_META = { "/lp/ml-checkpoints": { title: "ML Checkpoint Storage · Save Model Weights Cheaply | Fil One", description: - `Store ML checkpoints and model artifacts at ${PRICE_PER_TB_SHORT} with no egress fees. S3-compatible, durable, and verifiable — ideal for training runs on any cloud.`, + `Store ML checkpoints and model artifacts at ${PRICE_PER_TB_SHORT} with no egress fees. S3-compatible — ideal for training runs on any cloud.`, jsonLd: [ { "@context": "https://schema.org", @@ -254,22 +254,22 @@ export const ROUTE_META = { "/lp/log-retention": { title: `Cheap Log Retention Storage · ${PRICE_PER_TB_SHORT} | Fil One`, description: - `Store logs long-term at ${PRICE_PER_TB_SHORT} with no egress fees. S3-compatible, verifiable, and far cheaper than CloudWatch or Datadog for long-term retention.`, + `Store logs long-term at ${PRICE_PER_TB_SHORT} with no egress fees. S3-compatible, and far cheaper than CloudWatch or Datadog for long-term retention.`, }, "/lp/web-scraping": { title: "Storage for Web Scraping & Data Collection · Fil One", description: - `Store scraped datasets, crawl archives, and raw HTML at ${PRICE_PER_TB_SHORT}. No egress fees when feeding data into pipelines. S3-compatible and verifiable.`, + `Store scraped datasets, crawl archives, and raw HTML at ${PRICE_PER_TB_SHORT}. No egress fees when feeding data into pipelines. S3-compatible.`, }, "/lp/multi-cloud": { title: "Multi-Cloud Object Storage · S3-Compatible | Fil One", description: - `Add a cost-effective, verifiable storage tier to your multi-cloud stack. ${PRICE_PER_TB_SHORT}, no egress, S3-compatible — works alongside AWS, GCP, and Azure.`, + `Add a cost-effective storage tier to your multi-cloud stack. ${PRICE_PER_TB_SHORT}, no egress, S3-compatible — works alongside AWS, GCP, and Azure.`, }, "/lp/data-sovereignty": { - title: "Data Sovereignty Storage · Verifiable, Decentralized | Fil One", + title: "EU Data Residency Storage · S3-Compatible | Fil One", description: - `Own your data with cryptographic proof. Fil One's Filecoin-backed storage gives you verifiable custody, no vendor lock-in, and S3-compatible access at ${PRICE_PER_TB_SHORT}.`, + `S3-compatible object storage with an EU region endpoint. No egress fees, no vendor lock-in, at ${PRICE_PER_TB_SHORT} flat.`, }, "/lp/migrate-from-s3": { title: "Migrate from AWS S3 to Fil One · Drop-In S3 Replacement", @@ -317,24 +317,24 @@ export const ROUTE_META = { ], }, "/lp/compliance": { - title: "Compliant Object Storage with Verifiable Integrity · Fil One", + title: "Compliance-Ready Object Storage · Fil One", description: - `Meet compliance requirements with cryptographically verifiable storage. Integrity proven daily, 11 nines durability, S3-compatible at ${PRICE_PER_TB_SHORT}.`, + `S3-compatible storage with Object Lock retention, full version history, and encryption at rest and in transit, at ${PRICE_PER_TB_SHORT} flat.`, }, "/lp/archival": { - title: "Archival Object Storage · Cheap, Durable & Verifiable | Fil One", + title: "Archival Object Storage · Flat-Rate, No Retrieval Fees | Fil One", description: - `Archive cold data at ${PRICE_PER_TB_SHORT} with 11 nines durability and integrity proven daily. No egress fees when you need to restore. S3-compatible.`, + `Archive cold data at ${PRICE_PER_TB_SHORT} flat. No egress fees or retrieval delay when you need to restore. S3-compatible.`, }, "/lp/versioning": { title: "Object Storage with Versioning · Fil One", description: - `S3-compatible versioning on Filecoin. Keep every version of every object at ${PRICE_PER_TB_SHORT} with no egress fees and cryptographic integrity guarantees.`, + `S3-compatible versioning, built on Filecoin infrastructure. Keep every version of every object and download any of them at ${PRICE_PER_TB_SHORT} with no egress fees.`, }, "/lp/regional-cloud": { title: "Regional Cloud Storage Alternative · Fil One", description: - `A globally distributed, cost-effective alternative to regional cloud storage. ${PRICE_PER_TB_SHORT}, no egress, S3-compatible, and verifiably durable.`, + `A cost-effective alternative to building your own regional cloud storage. ${PRICE_PER_TB_SHORT}, no egress, S3-compatible.`, }, "/lp/media": { title: "Media & Asset Storage · S3-Compatible, No Egress | Fil One", @@ -344,27 +344,27 @@ 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", 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", + title: "Web3 & Fintech Data Storage · S3-Compatible | Fil One", description: - `Verifiable, decentralized storage for Web3 and fintech workloads. Integrity proven daily, ${PRICE_PER_TB_SHORT}, no egress, built on Filecoin.`, + `S3-compatible storage for Web3 and fintech workloads, built on Filecoin infrastructure. ${PRICE_PER_TB_SHORT} flat, no egress, no lock-in.`, }, "/lp/web3-pivot": { - title: "Decentralized Storage for Web3 Projects · Fil One", + title: "S3-Compatible Storage for Web3 Projects · Fil One", description: - `Transition to decentralized storage without rebuilding your stack. Fil One is S3-compatible, Filecoin-backed, and ${PRICE_PER_TB_SHORT} with no egress fees.`, + `Point your Web3 product's storage at Filecoin infrastructure without rebuilding your stack. S3-compatible, no egress fees, no lock-in, at ${PRICE_PER_TB_SHORT} flat.`, }, "/lp/web3-native": { - title: "Native Web3 Object Storage · Filecoin-Backed | Fil One", + title: "Native Web3 Object Storage · Built on Filecoin | Fil One", description: - `Purpose-built for Web3-native apps. S3-compatible, cryptographically verifiable storage on Filecoin at ${PRICE_PER_TB_SHORT}, integrity proven daily.`, + `Purpose-built for Web3-native apps. S3-compatible object storage built on Filecoin infrastructure at ${PRICE_PER_TB_SHORT}, no egress, no lock-in.`, }, "/lp/barcelona": { title: `Fil One for Barcelona: European Storage, ${PRICE_PER_TB_SHORT}, No Egress Fees`, @@ -436,17 +436,17 @@ export const ROUTE_META = { "/lp/grant-funded": { title: "Fil One · Storage that outlives the grant cycle", description: - `Flat ${PRICE_PER_TB_SHORT} research data storage with no exit fees and integrity verification every ~24 hours. Predictable for multi-year grants, S3-compatible.`, + `Flat ${PRICE_PER_TB_SHORT} research data storage with no exit fees. Predictable for multi-year grants, S3-compatible.`, }, "/lp/collections-access": { title: "Fil One · Open the collection. Skip the egress bill.", description: - `Serve digital collections and IIIF imagery with $0 egress. Flat ${PRICE_PER_TB_SHORT} storage, S3-compatible for IIIF image servers, 11 nines durability.`, + `Serve digital collections and IIIF imagery with $0 egress. Flat ${PRICE_PER_TB_SHORT} storage, S3-compatible for IIIF image servers.`, }, "/lp/digital-preservation": { - title: "Fil One · Preservation you can verify, not just trust", + title: "Fil One · Preservation you can afford to check", description: - `Flat ${PRICE_PER_TB_SHORT} digital preservation storage with integrity verification every ~24 hours. No retrieval fees, no egress. 11 nines durability, S3-compatible.`, + `Flat ${PRICE_PER_TB_SHORT} digital preservation storage. No retrieval fees, no egress — run fixity checks as often as your program requires. S3-compatible.`, }, "/lp/affordable": { title: "Fil One · Make storage your lowest line item", @@ -456,17 +456,17 @@ export const ROUTE_META = { "/lp/go-global": { title: "Fil One · Go global. Skip the multi-year build.", description: - `Embed S3-compatible object storage into your product. Global network, SLA-backed, ${PRICE_PER_TB_SHORT} flat. No capex, no infrastructure build — contact for enterprise and embedding terms.`, + `Embed S3-compatible object storage into your product. US and EU regions, SLA-backed, ${PRICE_PER_TB_SHORT} flat. No capex, no infrastructure build — contact for enterprise and embedding terms.`, }, "/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", 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/components/FeatureCard.tsx b/src/components/FeatureCard.tsx index bcaac38..417ec32 100644 --- a/src/components/FeatureCard.tsx +++ b/src/components/FeatureCard.tsx @@ -1,11 +1,17 @@ import type { Icon as PhosphorIcon } from "@phosphor-icons/react"; import IconTile from "@/components/IconTile"; +import Pill from "@/components/Pill"; +import TextLink from "@/components/TextLink"; interface FeatureCardProps { /** A Phosphor icon component, rendered inside the shared IconTile. */ icon: PhosphorIcon; title: string; description: string; + /** Optional status tag next to the icon, e.g. "Coming soon". */ + badge?: string; + /** Optional trailing link, e.g. a waitlist signup for a not-yet-live feature. */ + cta?: { label: string; href: string }; /** Extra classes on the card root (e.g. reveal-animation state). */ className?: string; } @@ -14,18 +20,28 @@ interface FeatureCardProps { * Icon feature card: a brand-tinted IconTile over a title and short * description. Shared by the pricing landing page Features grid and the * Enterprise "What's included" grid so the two stay visually identical. + * The optional badge/cta cover not-yet-live features that need a status tag + * and a waitlist link (e.g. the agent-knowledge-layer LP). */ -const FeatureCard = ({ icon, title, description, className = "" }: FeatureCardProps) => ( +const FeatureCard = ({ icon, title, description, badge, cta, className = "" }: FeatureCardProps) => (
- -
+
+ + {badge && {badge}} +
+

{title}

{description}

+ {cta && ( + + {cta.label} + + )}
); 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..419e7a1 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. */ @@ -35,8 +36,12 @@ export interface LandingMetric { export interface LandingPageConfig { seo: { title: string; description: string; canonical: string; ogImage?: string }; hero: { - /** Sentence-length audience line above the heading. */ - badge?: string; + /** + * Sentence-length audience line above the heading, wrapped in a Pill + * automatically. Pass a ReactNode instead (e.g. AnnouncementBadge) for a + * custom badge, such as a "Coming soon" feature announcement. + */ + badge?: ReactNode; title: ReactNode; description: ReactNode; titleSize?: string; @@ -56,6 +61,19 @@ 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; + /** Status tag for a not-yet-live feature, e.g. "Coming soon". */ + badge?: string; + /** Trailing link, e.g. a waitlist signup for a not-yet-live feature. */ + cta?: { label: string; href: 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 +115,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 +137,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. @@ -132,7 +152,13 @@ const LandingPage = ({ config }: { config: LandingPageConfig }) => { {hero.badge} : undefined} + badge={ + hero.badge == null + ? undefined + : typeof hero.badge === "string" + ? {hero.badge} + : hero.badge + } titleSize={hero.titleSize ?? "text-[30px] sm:text-[38px] md:text-[54px]"} titleMaxWidth={hero.titleMaxWidth} descriptionMaxWidth={hero.descriptionMaxWidth} @@ -196,6 +222,25 @@ const LandingPage = ({ config }: { config: LandingPageConfig }) => { )} + {/* ── Features ─────────────────────────────────────────────────────── */} + {features && ( +
+
+ +
+ {features.items.map(({ icon, title, desc, badge, cta }) => ( + + ))} +
+
+
+ )} + {/* ── Metrics ──────────────────────────────────────────────────────── */} {metrics && (
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/AffordableLandingPage.tsx b/src/pages/AffordableLandingPage.tsx index c8678e5..c74ae4a 100644 --- a/src/pages/AffordableLandingPage.tsx +++ b/src/pages/AffordableLandingPage.tsx @@ -1,193 +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"; import { signupUrl } from "@/lib/console-url"; +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: signupUrl(), 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: signupUrl() }, + secondaryCta: { label: "Talk to an expert", href: SALES_URL }, + note: TAGLINE, + }, }; +const AffordableLandingPage = () => ; + export default AffordableLandingPage; diff --git a/src/pages/AgentKnowledgeLandingPage.tsx b/src/pages/AgentKnowledgeLandingPage.tsx index 6af5e16..58df837 100644 --- a/src/pages/AgentKnowledgeLandingPage.tsx +++ b/src/pages/AgentKnowledgeLandingPage.tsx @@ -1,233 +1,119 @@ -import { Database, ArrowsOut, ChartLine, Plug, ArrowRight } 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 { Database, ArrowsOut, ChartLine, Plug } from "@phosphor-icons/react"; +import LandingPage, { type LandingPageConfig } from "@/components/LandingPage"; +import AnnouncementBadge from "@/components/AnnouncementBadge"; import { PRICE_PER_TB_SHORT, PRICE_PER_TB_MONTH } from "@/lib/pricing"; import { signupUrl } from "@/lib/console-url"; +const SALES_URL = "/contact-sales"; -const FEATURES = [ - { - icon: Database, - title: "Agent memory & state", - desc: "Persist conversation history, task queues, episodic memory, and checkpoint files across agent restarts. Standard PutObject/GetObject — the agent writes, the agent reads.", - comingSoon: false, - waitlistHref: null, - }, - { - icon: ChartLine, - title: "Flat cost for loop traffic", - desc: `Agents write frequently and read back their own outputs. Per-request billing makes loops expensive. ${PRICE_PER_TB_SHORT} flat — no PUT fees, no GET fees, no egress.`, - comingSoon: false, - waitlistHref: null, - }, - { - icon: ArrowsOut, - title: "RAG corpus storage", - desc: "Store raw documents, chunked text, and embeddings backing a retrieval pipeline. Reads are included in flat storage — no per-retrieval egress counter.", - comingSoon: true, - waitlistHref: "/waitlist/bucket-intelligence", - }, - { - icon: Plug, - title: "AI toolkit integrations", - desc: "LangChain, LlamaIndex, and Haystack connectors for direct corpus management, plus agent memory integrations.", - comingSoon: true, - waitlistHref: "/waitlist/ai-agent-toolkit", - }, -]; +const TAGLINE = "No credit card required · No per-request fees · Connects in minutes"; -const AgentKnowledgeLandingPage = () => { - useSeo({ +const config: LandingPageConfig = { + seo: { title: "Fil One · Turn Object Storage Into an Agent Knowledge Layer", - description: - `S3-compatible storage purpose-built for AI agents: agent memory, RAG corpus, model artifacts, and inference I/O. ${PRICE_PER_TB_SHORT} flat, no per-request fees.`, + description: `S3-compatible storage purpose-built for AI agents: agent memory, RAG corpus, model artifacts, and inference I/O. ${PRICE_PER_TB_SHORT} flat, no per-request fees.`, canonical: "https://www.fil.one/lp/agent-knowledge-layer", - }); - - 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 - -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", -) - -# Agent memory — persist across restarts -s3.put_object( - Bucket="agent-store", - Key=f"memory/{agent_id}/session-{session_id}.json", - Body=json.dumps(memory_state), -) - -# RAG corpus — store chunked documents -s3.put_object( - Bucket="agent-store", - Key=f"corpus/{namespace}/doc-{doc_id}.txt", - Body=chunk_text.encode(), -) - -# Retrieve for augmentation — $0 egress -obj = s3.get_object( - Bucket="agent-store", - Key=f"corpus/{namespace}/doc-{doc_id}.txt", -) - -# Inference outputs — archive completions for eval -s3.put_object( - Bucket="agent-store", - Key=f"traces/{run_id}/{step}.json", - Body=json.dumps(trace), -)`; - - return ( -
- -
- - {/* Hero */} -
-
+ }, - {/* Problem */} -
-
-
- The cost structure problem - You don't just pay to store your data.
You pay for every step that makes it usable.
- - Building a knowledge base on standard object storage providers means stitching together multiple services, each billed separately. Then your agents start running, and every query, memory read, and retrieval call adds to the tab. The stack is expensive to build and even more expensive to run. - -
-
- {[ - { label: "The architecture cost", catch: null, highlight: false, body: "A typical RAG-enabled agent requires several services duct-taped together. A vector database, a retrieval layer, a compute service, and an object store, each with its own integration, its own failure point, and its own bill. You're paying for complexity before your agents run a single query." }, - { label: "The usage cost", catch: null, highlight: false, body: "A single agent task triggers dozens of retrieval calls: context lookups, memory reads, state writes. Multiply that across thousands of tasks per hour and the meter runs constantly. Every action your agents take is a billable event." }, - { label: "A different model", catch: "Fil One collapses the stack and the bill", highlight: true, body: "One platform for agent memory, RAG corpus, and retrieval. No glue code required. You pay for storage, not for what your agents do with it." }, - ].map(({ label, body, catch: c, highlight }) => ( -
-
- {c ? ( - <> - {label} -

{c}

- - ) : ( -

{label}

- )} -

{body}

-
-
- ))} -
-
-
+ hero: { + badge: RAG Pipeline & Agent Toolkit, + titleMaxWidth: 820, + descriptionMaxWidth: 480, + title: ( + <> + Turn object storage into +
+ an agent knowledge layer. + + ), + description: "S3 object storage with a built-in RAG pipeline. No stitching required, no per-query fees.", + ctas: [ + { label: "Start storing for free", href: signupUrl(), variant: "primary" }, + { label: "Talk to an expert", href: SALES_URL, variant: "secondary" }, + ], + tagline: TAGLINE, + }, - {/* Proof — code block */} -
-
-
- One bucket - Memory. Corpus. Traces. One endpoint. - - Standard S3 PutObject and GetObject cover every agent storage pattern. No new SDK, no per-query pricing. Flat storage for the full knowledge layer. - -
-
-
agent_storage.py
-
{AGENT_CODE}
-
-
-
+ problem: { + label: "The cost structure problem", + heading: ( + <> + You don't just pay to store your data. +
+ You pay for every step that makes it usable. + + ), + sub: "Building a knowledge base on standard object storage providers means stitching together multiple services, each billed separately. Then your agents start running, and every query, memory read, and retrieval call adds to the tab. The stack is expensive to build and even more expensive to run.", + subMaxWidth: 620, + items: [ + { + label: "The architecture cost", + tone: "warning", + catch: "Multiple services, each separately billed.", + body: "A typical RAG-enabled agent requires several services duct-taped together. A vector database, a retrieval layer, a compute service, and an object store, each with its own integration, its own failure point, and its own bill. You're paying for complexity before your agents run a single query.", + }, + { + label: "The usage cost", + tone: "danger", + catch: "Every action your agents take is a billable event.", + body: "A single agent task triggers dozens of retrieval calls: context lookups, memory reads, state writes. Multiply that across thousands of tasks per hour and the meter runs constantly.", + }, + { + label: "A different model", + tone: "brand", + catch: "Fil One collapses the stack and the bill.", + body: "One platform for agent memory, RAG corpus, and retrieval. No glue code required. You pay for storage, not for what your agents do with it.", + }, + ], + }, - {/* Features */} -
-
-
- What's live and what's coming - Storage that works the way agents do. - S3-compatible storage built for agents is live today. Be the first to try native RAG pipeline and AI agents integrations. -
-
- {FEATURES.map(({ icon: Icon, title, desc, comingSoon, waitlistHref }) => ( -
-
-
-

{title}

- {comingSoon && Coming soon} -
-

- {desc} -

- {comingSoon && waitlistHref && ( - - Join the waitlist - - - )} -
- ))} -
-
-
+ features: { + label: "What's live and what's coming", + heading: ( + <> + Storage that works the way agents do. + + ), + sub: "S3-compatible storage built for agents is live today. Be the first to try native RAG pipeline and AI agents integrations.", + subMaxWidth: 560, + items: [ + { + icon: Database, + title: "Agent memory & state", + desc: "Persist conversation history, task queues, episodic memory, and checkpoint files across agent restarts. Standard PutObject/GetObject — the agent writes, the agent reads.", + }, + { + icon: ChartLine, + title: "Flat cost for loop traffic", + desc: `Agents write frequently and read back their own outputs. Per-request billing makes loops expensive. ${PRICE_PER_TB_SHORT} flat — no PUT fees, no GET fees, no egress.`, + }, + { + icon: ArrowsOut, + title: "RAG corpus storage", + desc: "Store raw documents, chunked text, and embeddings backing a retrieval pipeline. Reads are included in flat storage — no per-retrieval egress counter.", + badge: "Coming soon", + cta: { label: "Join the waitlist", href: "/waitlist/bucket-intelligence" }, + }, + { + icon: Plug, + title: "AI toolkit integrations", + desc: "LangChain, LlamaIndex, and Haystack connectors for direct corpus management, plus agent memory integrations.", + badge: "Coming soon", + cta: { label: "Join the waitlist", href: "/waitlist/ai-agent-toolkit" }, + }, + ], + }, - {/* Dark CTA */} -
-
-
- -
-
-
-
-
- ); + cta: { + heading: `One rate. ${PRICE_PER_TB_MONTH}.`, + headingMaxWidth: 560, + subhead: "Storage only — no PUT fees, no GET fees, no egress. Try it free with 1 TB: one place to store your data, retrieve it, and put it to work.", + cta: { label: "Start for free", href: signupUrl() }, + secondaryCta: { label: "Talk to an expert", href: SALES_URL }, + note: TAGLINE, + }, }; +const AgentKnowledgeLandingPage = () => ; + export default AgentKnowledgeLandingPage; diff --git a/src/pages/AgentLoopsLandingPage.tsx b/src/pages/AgentLoopsLandingPage.tsx index 34e1743..94fa712 100644 --- a/src/pages/AgentLoopsLandingPage.tsx +++ b/src/pages/AgentLoopsLandingPage.tsx @@ -1,267 +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"; import { signupUrl } from "@/lib/console-url"; -// 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 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: signupUrl(), 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: signupUrl() }, + secondaryCta: { label: "Talk to an expert", href: SALES_URL }, + note: TAGLINE, + }, }; +const AgentLoopsLandingPage = () => ; + export default AgentLoopsLandingPage; diff --git a/src/pages/AgentReadableLandingPage.tsx b/src/pages/AgentReadableLandingPage.tsx index 23ea338..0488755 100644 --- a/src/pages/AgentReadableLandingPage.tsx +++ b/src/pages/AgentReadableLandingPage.tsx @@ -3,10 +3,18 @@ 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 { 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 ProblemCards from "@/components/ProblemCards"; import { PRICE_PER_TB_SHORT, PRICE_PER_TB_MONTH } from "@/lib/pricing"; import { signupUrl } from "@/lib/console-url"; +const SALES_URL = "/contact-sales"; +const TAGLINE = "No credit card required · No egress fees · Connects in minutes"; + const FEATURES = [ { icon: FileText, title: "Machine-readable llms.txt", desc: "Pricing, endpoint, and S3 compatibility are published in a structured llms.txt at a stable URL. An agent fetches one file and has the full picture." }, { icon: ChartLine, title: "One rate, no tiers", desc: `${PRICE_PER_TB_MONTH}. No per-GB-vs-per-TB ambiguity, no tiered egress table, no request classes to reconcile. A single number an agent can compute against.` }, @@ -14,6 +22,27 @@ const FEATURES = [ { icon: MagnifyingGlass, title: "No gated pricing", desc: "The price is on the page and in llms.txt — not behind a 'contact sales' form. An agent evaluating vendors never hits a wall where the number should be." }, ]; +const PROBLEM_ITEMS = [ + { + label: "Gated behind a form", + tone: "warning" as const, + catch: "The price is a sales motion, not a fact.", + body: "'Contact sales for pricing' is a dead end for an agent. It cannot fill a lead form or wait for a callback, so the vendor is silently dropped from the shortlist — not on merit, but on legibility.", + }, + { + label: "Ambiguous units", + tone: "danger" as const, + catch: "Per-GB, tiered egress, request classes.", + body: "A price expressed across storage tiers, egress brackets, and PUT/GET request classes can't be reduced to a comparable monthly total without assumptions. An agent either guesses or skips.", + }, + { + label: "Specs in PDFs", + tone: "brand" as const, + catch: "S3 compatibility scattered across docs.", + body: "When the compatibility matrix lives in a PDF and three doc pages, an agent can't confirm parity in one fetch. The integration risk stays unresolved through the evaluation.", + }, +]; + const LLMS_TXT = `$ curl -s https://www.fil.one/llms.txt ## Pricing @@ -29,121 +58,118 @@ const LLMS_TXT = `$ curl -s https://www.fil.one/llms.txt const AgentReadableLandingPage = () => { useSeo({ title: "Fil One · Priced so plainly your agent can read it", - description: - `Flat ${PRICE_PER_TB_SHORT} pricing published in machine-readable llms.txt, with full S3 parity. No gated quotes — an AI coding agent can evaluate Fil One in one pass.`, + description: `Flat ${PRICE_PER_TB_SHORT} pricing published in machine-readable llms.txt, with full S3 parity. No gated quotes — an AI coding agent can evaluate Fil One in one pass.`, canonical: "https://www.fil.one/lp/agent-readable", }); 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 }); return ( -
+
-
- {/* Hero */} -
-
+ } + title={ + <> + Priced so plainly +
+ your agent can read it. + + } + description={ + <>Flat {PRICE_PER_TB_SHORT}, published in machine-readable llms.txt with full S3 parity. No gated quotes, no "contact sales" for a number — an agent parses the price and the API in one pass. + } + ctas={[ + { label: "Start for free", href: signupUrl(), variant: "primary" }, + { label: "Talk to an expert", href: SALES_URL, variant: "secondary" }, + ]} + tagline={TAGLINE} + /> - {/* Problem */} -
-
+ {/* ── Problem ──────────────────────────────────────────────────────── */} +
+
The legibility problem Most pricing pages are built for humans to negotiate, not agents to parse. When an AI coding agent shortlists a storage vendor, it needs a number and an API surface it can read in one pass. Most pages give it a form and a maze instead.
-
- {[ - { label: "Gated behind a form", catch: "The price is a sales motion, not a fact.", body: "'Contact sales for pricing' is a dead end for an agent. It cannot fill a lead form or wait for a callback, so the vendor is silently dropped from the shortlist — not on merit, but on legibility." }, - { label: "Ambiguous units", catch: "Per-GB, tiered egress, request classes.", body: "A price expressed across storage tiers, egress brackets, and PUT/GET request classes can't be reduced to a comparable monthly total without assumptions. An agent either guesses or skips." }, - { label: "Specs in PDFs", catch: "S3 compatibility scattered across docs.", body: "When the compatibility matrix lives in a PDF and three doc pages, an agent can't confirm parity in one fetch. The integration risk stays unresolved through the evaluation." }, - ].map(({ label, body, catch: c }) => ( -
-
- {label} -

{c}

-

{body}

-
-
- ))} -
+
- {/* Proof — llms.txt code block */} -
-
+ {/* ── Proof — llms.txt ─────────────────────────────────────────────── */} +
+
What your agent reads - One fetch. The whole answer. + One fetch. The whole answer. The price, the endpoint, and the compatibility statement are published in a structured file at a stable URL. An agent gets a comparable monthly total and an integration path in a single request.
-
-
terminal
-
{LLMS_TXT}
+
+
- {/* Features */} -
-
-
+ {/* ── Features ─────────────────────────────────────────────────────── */} +
+
+
Why an agent picks it - Legible by design, not by accident. + Legible by design, not by accident.
-
- {FEATURES.map(({ icon: Icon, title, desc }) => ( -
-
-

{title}

-

{desc}

-
+
+ {FEATURES.map(({ icon, title, desc }) => ( + ))}
- {/* Dark CTA */} -
-
-
- -
-
+ {/* ── CTA Banner ────────────────────────────────────────────────────── */} +
+
); diff --git a/src/pages/AgentsLandingPage.tsx b/src/pages/AgentsLandingPage.tsx index 597f7ec..e15bc3a 100644 --- a/src/pages/AgentsLandingPage.tsx +++ b/src/pages/AgentsLandingPage.tsx @@ -1,197 +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"; +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"; import { signupUrl } from "@/lib/console-url"; -// ─── 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 - -
-
-); +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( @@ -210,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"; @@ -239,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 ( @@ -284,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 ──────────────────────────────────────────────────────────── @@ -317,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 = () => { @@ -350,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 */}
@@ -530,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. @@ -544,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 @@ -729,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}

))} @@ -896,13 +406,10 @@ const AgentsLandingPage = () => {
{/* ── Use cases ────────────────────────────────────────────────────── */} -
+
Use cases @@ -913,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}

))}
diff --git a/src/pages/ArchivalLandingPage.tsx b/src/pages/ArchivalLandingPage.tsx index 4cee32b..bf550ca 100644 --- a/src/pages/ArchivalLandingPage.tsx +++ b/src/pages/ArchivalLandingPage.tsx @@ -1,482 +1,136 @@ 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 LandingPage, { type LandingPageConfig } from "@/components/LandingPage"; +import { PRICE_PER_TB_SHORT } from "@/lib/pricing"; import { signupUrl } from "@/lib/console-url"; +const SALES_URL = "/contact-sales"; -// Archive comparison scenario: 100 TB stored, one 10 TB restore per year (≈ 853 GB/month). -// AWS S3 Standard: $0.023/GB storage = $2,304/month (tiered); egress $0.09/GB = $76.77/month restore cost. -// Total monthly: $2,381. -// AWS Glacier Instant: $0.023/GB storage; retrieval $0.03/GB + egress $0.09/GB per restore. -// Storage: 102,400 × $0.023 = $2,355.20/month. -// Restore monthly equivalent: 853 GB × ($0.03 + $0.09) = $102.40. -// Total: $2,457.60/month. -// AWS Glacier Deep Archive: $0.00099/GB storage = $101.38/month. -// Restore monthly equivalent: 853 GB × ($0.02 + $0.09) = $93.83. -// Total: $195.21/month. -// Wasabi: $6.99/TB = $699/month. No retrieval or egress. -// Fil One: $4.99/TB = $499/month. No retrieval or egress. Integrity ~24h. -const ARCHIVE_ROWS = [ - { - provider: "AWS S3 Standard", - storage100tb: "$2,304", - retrievalRate: "$0.09/GB egress", - restoreCost10tb: "$922", - integrityCheck: "No", - isFilOne: false, - }, - { - provider: "AWS Glacier Instant", - storage100tb: "$2,355", - retrievalRate: "$0.03 + $0.09/GB", - restoreCost10tb: "$1,229", - integrityCheck: "No", - isFilOne: false, - }, - { - provider: "AWS Glacier Deep Archive", - storage100tb: "$101", - retrievalRate: "$0.02 + $0.09/GB", - restoreCost10tb: "$1,126", - integrityCheck: "No", - isFilOne: false, - }, - { - provider: "Wasabi", - storage100tb: "$699", - retrievalRate: "$0", - restoreCost10tb: "$0", - integrityCheck: "No", - isFilOne: false, - }, - { - provider: "Fil One", - storage100tb: "$499", - retrievalRate: "$0", - restoreCost10tb: "$0", - integrityCheck: "~24 h", - isFilOne: true, - }, -]; +const TAGLINE = "No credit card required · No retrieval fees · Connects in minutes"; -const FEATURES = [ - { - icon: ShieldCheck, - title: "Integrity verification, ~24 h", - desc: "Every archived object is verified approximately every 24 hours. Data cannot silently corrupt or disappear between writes and reads.", - }, - { - icon: ArrowsOut, - title: "No retrieval tax", - desc: "$0 to read back the archive. Restore testing, partial recovery, and audit reads are included in flat storage pricing.", - }, - { - icon: ChartLine, - title: "11 nines durability", - desc: "Designed for 11 nines of durability. The storage architecture makes loss a detectable and recoverable event.", - }, - { - icon: Database, - title: "S3-compatible restore", - desc: "Standard GetObject and multipart download. Any tool that reads S3 restores from Fil One without modification.", - }, -]; - -const ArchivalLandingPage = () => { - useSeo({ - title: "Fil One · Know your archive is intact before you need it", - description: - `Flat ${PRICE_PER_TB_SHORT} archival storage with recurring integrity verification every ~24 hours. No retrieval fees, no egress. 11 nines durability.`, +// Archive comparison scenario: 100 TB stored, one 10 TB restore per year (~853 GB/month). +// AWS S3 Standard: $0.023/GB storage = $2,304/month (tiered); 10 TB restore = 10,240 GB x $0.09 = $922. +// AWS Glacier Instant: storage 102,400 x $0.023 = $2,355; 10 TB restore = 10,240 x ($0.03+$0.09) = $1,229. +// AWS Glacier Deep Archive: storage 102,400 x $0.00099 = $101; 10 TB restore = 10,240 x ($0.02+$0.09) = $1,126. +// Wasabi: $6.99/TB = $699/month, $0 retrieval. Fil One: $4.99/TB = $499/month, $0 retrieval. +const config: LandingPageConfig = { + seo: { + title: "Fil One · Know your archive works before you need it", + description: `Flat ${PRICE_PER_TB_SHORT} archival storage with no retrieval fees or egress. Test a restore any time — the bill doesn't change.`, canonical: "https://www.fil.one/lp/archival", - }); - - 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 */} -
-
- - {/* Problem */} -
-
-
- Two problems - Archives are assumed intact. The retrieval bill is assumed fine. - - Standard archive storage gives you low write cost and no guarantee the data is still intact. It also charges a retrieval fee every time you confirm it is. Neither assumption holds in a serious long-retention scenario. - -
- -
- {[ - { - label: "The silent archive", - catch: "Most storage does not tell you if data changed.", - body: "Standard object storage replicates data but does not continuously verify the content of each object. An archive can silently corrupt over months or years — undetectable until a restore attempt fails.", - }, - { - label: "The retrieval penalty", - catch: "Testing your archive costs money.", - body: "Glacier-tier storage charges per-GB retrieval plus egress on every restore. A single annual test of 10 TB costs over $1,000 on AWS. Teams stop testing their archives — not because they do not need to, but because the bill makes them.", - }, - { - label: "The day-you-need-it cost", - catch: "Disaster recovery events are expensive on metered tiers.", - body: "A large restore event — the one you actually need the archive for — is a large retrieval and egress event. The cost arrives at the worst possible time. A flat-rate archive has no such moment.", - }, - ].map(({ label, body, catch: catchLine }) => ( -
-
- - {label} - -

- {catchLine} -

-

- {body} -

-
-
- ))} -
-
-
- - {/* Comparison table */} -
-
-
- The comparison - - 100 TB archive. One 10 TB restore per year. - - - Same archive workload, five providers. Monthly storage cost, per-restore cost, and whether integrity is verified. - -
- -
- - - - {["Provider", "100 TB/mo", "Retrieval + egress", "Restore 10 TB", "Integrity verification"].map((h) => ( - - ))} - - - - {ARCHIVE_ROWS.map((row) => ( - - - - - - - - ))} - -
- {h} -
- {row.provider} - {row.isFilOne && ( - - You - - )} - {row.storage100tb}{row.retrievalRate}{row.restoreCost10tb}{row.integrityCheck}
-
-

- AWS S3 Standard and Glacier rates from public US rate card Q2 2026. S3 Standard storage: tiered $0.023/$0.022/GB; Glacier Instant $0.023/GB; Glacier Deep Archive $0.00099/GB. Retrieval: Deep Archive $0.02/GB + $0.09/GB egress. Restore cost computed: 10,240 GB × stated rates. Wasabi $6.99/TB. Fil One $4.99/TB, $0 retrieval, $0 egress. -

-
-
+ }, - {/* Features */} -
-
-
- An archive that proves itself - - Verification built in. Retrieval included. - -
+ hero: { + badge: "For long-retention archive owners", + titleMaxWidth: 800, + descriptionMaxWidth: 580, + title: ( + <> + Know your archive works +
+ before you need it. + + ), + description: `Flat ${PRICE_PER_TB_SHORT}. No egress, no retrieval tax — so testing a restore doesn't cost you anything extra.`, + ctas: [ + { label: "Start for free", href: signupUrl(), variant: "primary" }, + { label: "Talk to an expert", href: SALES_URL, variant: "secondary" }, + ], + tagline: TAGLINE, + }, -
- {FEATURES.map(({ icon: Icon, title, desc }) => ( -
-
- -
-

{title}

-

{desc}

-
- ))} -
-
-
+ problem: { + label: "Two problems", + heading: "Archives go untested, and the retrieval bill is a surprise.", + sub: "Standard archive storage gives you low write cost and a retrieval fee every time you check on it. Neither makes for a serious long-retention plan.", + items: [ + { + label: "The untested archive", + tone: "warning", + catch: "Nobody tests a restore that costs money.", + body: "Retrieval fees turn a routine restore drill into a budget request. Most archives are never actually restored until the day they're needed — by then, a broken export script or a misconfigured lifecycle rule is a crisis, not a fire drill.", + }, + { + label: "The retrieval penalty", + tone: "danger", + catch: "Testing your archive costs money.", + body: "Glacier-tier storage charges per-GB retrieval plus egress on every restore. A single annual test of 10 TB costs over $1,000 on AWS. Teams stop testing their archives — not because they do not need to, but because the bill makes them.", + }, + { + label: "The day-you-need-it cost", + tone: "brand", + catch: "Disaster recovery events are expensive on metered tiers.", + body: "A large restore event — the one you actually need the archive for — is a large retrieval and egress event. The cost arrives at the worst possible time. A flat-rate archive has no such moment.", + }, + ], + }, - {/* Pricing */} -
-
-
- Pricing - One rate. {PRICE_PER_TB_MONTH}. - Storage. That is the whole bill. Integrity verification, 11 nines durability, and free restores are included. -
- -

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

-
-
+ comparison: { + label: "The comparison", + heading: ( + <> + 100 TB archive. One 10 TB restore per year. + + ), + sub: "Same archive workload, five providers. Monthly storage cost and the cost of one annual 10 TB restore.", + subMaxWidth: 620, + caption: "Monthly storage and annual 10 TB restore cost, by provider", + columns: [ + { key: "storage", header: "100 TB / mo" }, + { key: "rate", header: "Retrieval + egress", colorByValue: true }, + { key: "restore", header: "Restore 10 TB", total: true }, + ], + rows: [ + { provider: "AWS S3 Standard", values: { storage: "$2,304", rate: "$0.09/GB egress", restore: "$922" } }, + { provider: "AWS Glacier Instant", values: { storage: "$2,355", rate: "$0.03 + $0.09/GB", restore: "$1,229" } }, + { provider: "AWS Glacier Deep Archive", values: { storage: "$101", rate: "$0.02 + $0.09/GB", restore: "$1,126" } }, + { provider: "Wasabi", values: { storage: "$699", rate: "$0", restore: "$0" } }, + { provider: "Fil One", isFilOne: true, values: { storage: "$499", rate: "$0", restore: "$0" } }, + ], + footnote: + "AWS S3 Standard and Glacier rates from public US rate card Q2 2026. S3 Standard storage: tiered $0.023/$0.022/GB; Glacier Instant $0.023/GB; Glacier Deep Archive $0.00099/GB. Retrieval: Deep Archive $0.02/GB + $0.09/GB egress. Restore cost computed: 10,240 GB × stated rates. Wasabi $6.99/TB. Fil One $4.99/TB, $0 retrieval, $0 egress.", + }, - {/* Dark CTA */} -
-
-
- -
-
-
+ features: { + label: "An archive you can afford to test", + heading: ( + <> + Always restorable. Retrieval included. + + ), + sub: "No archive tier, no retrieval bill, no wait to get your data back.", + items: [ + { + icon: ShieldCheck, + title: "No archive-tier wait", + desc: "Objects are readable the instant you request them — no rehydration delay like Glacier's retrieval tiers. A restore starts immediately.", + }, + { + icon: ArrowsOut, + title: "No retrieval tax", + desc: "$0 to read back the archive. Restore testing, partial recovery, and audit reads are included in flat storage pricing.", + }, + { + icon: Database, + title: "Object Lock for compliance", + desc: "Configure retention from 1 day to 100 years at the bucket level, for records that must not be altered or deleted early.", + }, + { + icon: ChartLine, + title: "S3-compatible restore", + desc: "Standard GetObject and multipart download. Any tool that reads S3 restores from Fil One without modification.", + }, + ], + }, -
-
- ); + cta: { + heading: "An archive you can actually test.", + subhead: "Free 1 TB evaluation. Write your archive and restore it — at zero retrieval cost.", + cta: { label: "Start for free", href: signupUrl() }, + secondaryCta: { label: "Talk to an expert", href: SALES_URL }, + note: TAGLINE, + }, }; +const ArchivalLandingPage = () => ; + export default ArchivalLandingPage; diff --git a/src/pages/CheckpointsLandingPage.tsx b/src/pages/CheckpointsLandingPage.tsx index 7d52f74..7f1da9b 100644 --- a/src/pages/CheckpointsLandingPage.tsx +++ b/src/pages/CheckpointsLandingPage.tsx @@ -1,599 +1,132 @@ 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"; import { signupUrl } from "@/lib/console-url"; +const SALES_URL = "/contact-sales"; -const FEATURES = [ - { - icon: ArrowsOut, - title: "No egress on eval runs", - desc: "Load any checkpoint, any number of times. Evaluation loops do not add to the bill. Run as many evals as your team needs.", - }, - { - icon: Database, - title: "Keep every run", - desc: "10 TB of checkpoints costs $49.90/month. 100 TB costs $499. The rate stays flat. Deleting early runs to save money stops being a decision.", - }, - { - icon: ChartLine, - title: "Predictable cost", - desc: `One flat rate per TB. No request fees, no retrieval tiers. The storage line is storage volume times ${PRICE_DISPLAY}.`, - }, - { - icon: Plug, - title: "S3-compatible", - desc: "boto3, HuggingFace Hub, PyTorch Lightning checkpointing — any S3-compatible tool connects with an endpoint swap and no SDK changes.", - }, -]; +const TAGLINE = "No credit card required · No egress fees · Connects in minutes"; -const CheckpointsLandingPage = () => { - useSeo({ +// 10 TB checkpoints stored, 5 TB eval reads/month. +// AWS S3 Standard us-east-1 Q2 2026: storage 10,240 GB x $0.023 = $235.52, +// egress 5,120 GB x $0.09 = $460.80. Total $680/mo (rounded). +// Fil One: 10 TB x $4.99 = $49.90, egress $0. +const config: LandingPageConfig = { + seo: { title: "Fil One · Stop deleting checkpoints you'll want back", - description: - `S3-compatible storage at ${PRICE_PER_TB_SHORT} flat. Keep every checkpoint, eval set, and training artifact without per-GB guilt. No egress fees on eval runs.`, + description: `S3-compatible storage at ${PRICE_PER_TB_SHORT} flat. Keep every checkpoint, eval set, and training artifact without per-GB guilt. No egress fees on eval runs.`, canonical: "https://www.fil.one/lp/ml-checkpoints", - }); - - 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 CHECKPOINT_CODE = `import boto3, os - -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", -) - -# Save after each epoch — same call as AWS -s3.upload_file( - f"checkpoint_epoch_{epoch}.pt", - "ml-artifacts", - f"runs/{run_id}/epoch_{epoch}.pt", -) - -# Load for evaluation — no egress charge -obj = s3.get_object( - Bucket="ml-artifacts", - Key=f"runs/{run_id}/epoch_{epoch}.pt", -) -state = torch.load(obj["Body"])`; - - return ( -
- - -
- {/* Hero */} -
-
- - {/* Problem */} -
-
-
- The trap - The bill decides which runs survive. - - A checkpoint is 2–10 GB. A training run has dozens of them. At hyperscaler pricing, keeping the full history of an experiment — plus reading it back for evaluation — costs more than the training compute. - -
- -
- {[ - { - label: "The deletion decision", - catch: "Storage pressure picks which runs survive.", - body: "A checkpoint file runs 2–10 GB. Keep 100 runs with 10 checkpoints each and you are holding 2–10 TB. On AWS S3 that is $46–$230/month in storage alone — before a single eval read.", - }, - { - label: "The eval bill", - catch: "Every eval run is an egress event.", - body: "Loading checkpoints to run a benchmark reads them from storage back to compute. At $0.09/GB egress, reading 5 TB of checkpoints for a single eval pass costs $450. Teams learn to run fewer evals.", - }, - { - label: "The lost run", - catch: "The one you deleted was the one you needed.", - body: "Six weeks later an ablation shows that the deleted run outperformed the saved checkpoint on the metric you did not track. The run is gone. The experiment restarts from zero.", - }, - ].map(({ label, body, catch: catchLine }) => ( -
-
- - {label} - -

- {catchLine} -

-

- {body} -

-
-
- ))} -
-
-
- - {/* Proof — code block + cost comparison */} -
-
-
- The connection - - Same boto3. Checkpoints that cost what they weigh. - - - Point your existing checkpointing code at the Fil One endpoint. Eval reads are included in flat storage — no egress line. - -
- -
- {/* Code block */} -
-
- checkpoint.py -
-
-                  {CHECKPOINT_CODE}
-                
-
- - {/* Cost comparison */} -
- Monthly cost, 10 TB stored + 5 TB eval reads -
- {[ - { - name: "AWS S3 Standard", - breakdown: "$230 storage + $450 egress", - total: "$680/mo", - win: false, - you: false, - }, - { - name: "Fil One", - breakdown: "10 TB × $4.99 — egress $0", - total: "$49.90/mo", - win: true, - you: true, - }, - ].map((r) => ( -
- - {r.name} - - - {r.breakdown} - - - {r.total} - -
- ))} -
-

- AWS S3 Standard us-east-1 Q2 2026: $0.023/GB storage, $0.09/GB egress. Computed from stated inputs — 10,240 GB × $0.023 = $235.52 storage; 5,120 GB × $0.09 = $460.80 egress. Fil One: 10 TB × $4.99 = $49.90, egress $0. -

-
-
-
-
+ }, - {/* Features */} -
-
-
- Why it works - - Storage that scales with experiment count, not bill. - - - The only change is the endpoint. The decision of which checkpoints to keep stops being a cost decision. - -
+ hero: { + badge: "For ML engineers and research teams", + titleMaxWidth: 760, + descriptionMaxWidth: 580, + title: ( + <> + Stop deleting checkpoints +
+ you'll want back. + + ), + description: `S3-compatible storage at ${PRICE_PER_TB_SHORT} flat. Keep every checkpoint, eval set, and training artifact without rationing by cost.`, + ctas: [ + { label: "Start for free", href: signupUrl(), variant: "primary" }, + { label: "Talk to an expert", href: SALES_URL, variant: "secondary" }, + ], + tagline: TAGLINE, + }, -
- {FEATURES.map(({ icon: Icon, title, desc }) => ( -
-
- -
-

- {title} -

-

- {desc} -

-
- ))} -
-
-
+ problem: { + label: "The trap", + heading: "The bill decides which runs survive.", + sub: "A checkpoint is 2–10 GB. A training run has dozens of them. At hyperscaler pricing, keeping the full history of an experiment — plus reading it back for evaluation — costs more than the training compute.", + items: [ + { + label: "The deletion decision", + tone: "warning", + catch: "Storage pressure picks which runs survive.", + body: "A checkpoint file runs 2–10 GB. Keep 100 runs with 10 checkpoints each and you are holding 2–10 TB. On AWS S3 that is $46–$230/month in storage alone — before a single eval read.", + }, + { + label: "The eval bill", + tone: "danger", + catch: "Every eval run is an egress event.", + body: "Loading checkpoints to run a benchmark reads them from storage back to compute. At $0.09/GB egress, reading 5 TB of checkpoints for a single eval pass costs $450. Teams learn to run fewer evals.", + }, + { + label: "The lost run", + tone: "brand", + catch: "The one you deleted was the one you needed.", + body: "Six weeks later an ablation shows that the deleted run outperformed the saved checkpoint on the metric you did not track. The run is gone. The experiment restarts from zero.", + }, + ], + }, - {/* Pricing */} -
-
-
- Pricing - - One rate. {PRICE_PER_TB_MONTH}. - - - Storage. That is the whole bill. No egress fees, no request charges, no retrieval tier. Keep every checkpoint, load it as often as you need to. - -
- -

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

-
-
+ comparison: { + label: "The connection", + heading: ( + <> + Same boto3. Checkpoints that cost what they weigh. + + ), + sub: "Point your existing checkpointing code at the Fil One endpoint. Eval reads are included in flat storage — no egress line.", + subMaxWidth: 620, + caption: "Monthly cost for 10 TB stored, 5 TB eval reads, AWS S3 Standard vs Fil One", + columns: [ + { key: "breakdown", header: "Breakdown", note: true }, + { key: "total", header: "Total / month", total: true }, + ], + rows: [ + { provider: "AWS S3 Standard", values: { breakdown: "$230 storage + $450 egress", total: "$680/mo" } }, + { provider: "Fil One", isFilOne: true, values: { breakdown: "10 TB × $4.99 — egress $0", total: "$49.90/mo" } }, + ], + footnote: + "AWS S3 Standard us-east-1 Q2 2026: $0.023/GB storage, $0.09/GB egress. Computed from stated inputs — 10,240 GB × $0.023 = $235.52 storage; 5,120 GB × $0.09 = $460.80 egress. Fil One: 10 TB × $4.99 = $49.90, egress $0.", + }, - {/* Dark CTA */} -
-
-
- -
-
-
+ features: { + label: "Why it works", + heading: ( + <> + Storage that scales with experiment count, not bill. + + ), + sub: "The only change is the endpoint. The decision of which checkpoints to keep stops being a cost decision.", + subMaxWidth: 560, + items: [ + { + icon: ArrowsOut, + title: "No egress on eval runs", + desc: "Load any checkpoint, any number of times. Evaluation loops do not add to the bill. Run as many evals as your team needs.", + }, + { + icon: Database, + title: "Keep every run", + desc: "10 TB of checkpoints costs $49.90/month. 100 TB costs $499. The rate stays flat. Deleting early runs to save money stops being a decision.", + }, + { + icon: ChartLine, + title: "Predictable cost", + desc: `One flat rate per TB. No request fees, no retrieval tiers. The storage line is storage volume times ${PRICE_DISPLAY}.`, + }, + { + icon: Plug, + title: "S3-compatible", + desc: "boto3, HuggingFace Hub, PyTorch Lightning checkpointing — any S3-compatible tool connects with an endpoint swap and no SDK changes.", + }, + ], + }, -
-
- ); + cta: { + heading: "Keep every checkpoint.", + subhead: "Free 1 TB evaluation. Point your existing checkpoint code at the endpoint and stop rationing runs.", + cta: { label: "Start for free", href: signupUrl() }, + secondaryCta: { label: "Talk to an expert", href: SALES_URL }, + note: TAGLINE, + }, }; +const CheckpointsLandingPage = () => ; + export default CheckpointsLandingPage; diff --git a/src/pages/CollectionsAccessLandingPage.tsx b/src/pages/CollectionsAccessLandingPage.tsx index ac8d039..cd248c8 100644 --- a/src/pages/CollectionsAccessLandingPage.tsx +++ b/src/pages/CollectionsAccessLandingPage.tsx @@ -1,456 +1,130 @@ -import { ArrowsOut, CurrencyDollar, Plug, ChartLine } 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, CurrencyDollar, Plug, Lock } from "@phosphor-icons/react"; +import LandingPage, { type LandingPageConfig } from "@/components/LandingPage"; +import { PRICE_DISPLAY, PRICE_PER_TB_SHORT } from "@/lib/pricing"; import { signupUrl } from "@/lib/console-url"; +const SALES_URL = "/contact-sales"; -// Access comparison scenario: 10 TB stored, 5 TB/month delivered to viewers (IIIF image tiles, downloads). -// 10 TB = 10,240 GB stored; 5 TB = 5,120 GB egress/month. -// AWS S3 Standard: storage 10,240 GB × $0.023/GB ≈ $236/mo. -// Egress: 5,120 GB × $0.09/GB ≈ $461/mo. All-in ≈ $697/mo. -// Wasabi: $6.99/TB = $70/mo. Egress free within fair-use policy. -// Fil One: $4.99/TB = $50/mo. No egress fees, ever. -const ACCESS_ROWS = [ - { - provider: "AWS S3 Standard", - storage: "$236", - egress: "$461", - allIn: "$697", - isFilOne: false, - }, - { - provider: "Wasabi", - storage: "$70", - egress: "$0", - allIn: "$70", - isFilOne: false, - }, - { - provider: "Fil One", - storage: "$50", - egress: "$0", - allIn: "$50", - isFilOne: true, - }, -]; - -const FEATURES = [ - { - icon: ArrowsOut, - title: "$0 egress, always", - desc: "Every IIIF tile request, every full-resolution download, every researcher who opens the collection reads at zero egress cost. Access volume never changes the bill.", - }, - { - icon: CurrencyDollar, - title: `Flat ${PRICE_PER_TB_SHORT}`, - desc: `One rate for storage, nothing for delivery. The bill is your stored TBs times ${PRICE_DISPLAY} — predictable enough to put in a budget line that holds for years.`, - }, - { - icon: Plug, - title: "IIIF server compatible", - desc: "Serve directly from the standard S3 API that IIIF image servers like Cantaloupe and IIPImage already read. Point the tile source at Fil One — no re-architecture.", - }, - { - icon: ChartLine, - title: "11 nines durability", - desc: "Distributed, redundant architecture designed for 11 nines of durability. The master files behind every derivative and tile are held to an archival standard, not just a delivery cache.", - }, -]; +const TAGLINE = "No credit card required · No egress fees · Connects in minutes"; -const CollectionsAccessLandingPage = () => { - useSeo({ +// Access comparison scenario: 10 TB stored, 5 TB/month delivered (IIIF tiles, downloads). +// AWS S3 Standard: storage 10,240 GB x $0.023/GB ~= $236/mo. Egress: 5,120 GB x $0.09/GB +// ~= $461/mo. All-in ~= $697/mo. +// Wasabi: $6.99/TB = $70/mo, egress free within fair-use policy. +// Fil One: $4.99/TB = $50/mo, no egress fees, ever. +const config: LandingPageConfig = { + seo: { title: "Fil One · Open the collection. Close the tab.", - description: - `Serve digital collections and IIIF imagery with $0 egress. Flat ${PRICE_PER_TB_SHORT} storage, S3-compatible for IIIF image servers, 11 nines durability.`, + description: `Serve digital collections and IIIF imagery with $0 egress. Flat ${PRICE_PER_TB_SHORT} storage, S3-compatible for IIIF image servers.`, canonical: "https://www.fil.one/lp/collections-access", - }); - - 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 */} -
-
- - {/* Problem */} -
-
-
- The access penalty - You digitized it to be seen. Then access became the expensive part. - - On metered storage, every view of a high-resolution image is an egress charge. The more your collection is used, the more it costs — so open access starts to feel like a budget liability. - -
- -
- {[ - { - label: "Popularity is a penalty", - catch: "Every view adds to your invoice.", - body: "IIIF deep-zoom delivers 50–200 tiles per image. A single popular exhibition or a class assignment can move terabytes in a month. On per-GB egress, the most-loved part of the collection generates the biggest invoice.", - }, - { - label: "The unpredictable invoice", - catch: "You cannot budget a number you cannot predict.", - body: "Egress depends on traffic you do not control — a viral object, a linked syllabus, a scraper. A storage line that should be flat becomes a variable you reconcile every month and cannot forecast for the year.", - }, - { - label: "Access controls as cost control", - catch: "Rationing access to manage a bill.", - body: "Teams throttle resolution, gate downloads, or cache aggressively — not to support preservation, but to keep egress down. The mission is open access; the pricing model quietly works against it.", - }, - ].map(({ label, body, catch: catchLine }) => ( -
-
- - {label} - -

- {catchLine} -

-

- {body} -

-
-
- ))} -
-
-
- - {/* Comparison table */} -
-
-
- The comparison - - 10 TB stored. 5 TB delivered a month. - - - Same collection, same monthly IIIF and download traffic, three providers. Storage, the egress charged to serve it, and the all-in monthly cost. - -
- -
- - - - {["Provider", "Storage 10 TB/mo", "Egress 5 TB/mo", "All-in /mo"].map((h) => ( - - ))} - - - - {ACCESS_ROWS.map((row) => ( - - - - - - - ))} - -
- {h} -
- {row.provider} - {row.isFilOne && ( - - You - - )} - {row.storage}{row.egress}{row.allIn}
-
-

- Scenario: 10 TB stored with 5 TB/month delivered to viewers (IIIF tiles, derivatives, downloads). AWS S3 Standard: ≈$236/mo storage ($0.023/GB) + 5 TB egress (5,120 GB × $0.09/GB) ≈ $461/mo ≈ $697/mo all-in. Wasabi: $6.99/TB = $70/mo, egress-free within fair-use limits; traffic-heavy collections may incur charges. Fil One: $4.99/TB = $50/mo, $0 egress. AWS and Wasabi rates from public US price cards, Q2 2026; figures indicative and rounded. -

-
-
+ }, - {/* Features */} -
-
-
- Access without the meter - - Open access far and wide. The bill does not move. - -
+ hero: { + badge: "For digital collections & IIIF publishing", + titleMaxWidth: 820, + descriptionMaxWidth: 580, + title: ( + <> + Open the collection. +
+ Close the tab. + + ), + description: `Flat ${PRICE_PER_TB_SHORT}. Serve IIIF imagery and downloads at $0 egress, no matter how many people open it.`, + ctas: [ + { label: "Start for free", href: signupUrl(), variant: "primary" }, + { label: "Talk to an expert", href: SALES_URL, variant: "secondary" }, + ], + tagline: TAGLINE, + }, -
- {FEATURES.map(({ icon: Icon, title, desc }) => ( -
-
- -
-

{title}

-

{desc}

-
- ))} -
-
-
+ problem: { + label: "The access penalty", + heading: "You digitized it to be seen. Then access became the expensive part.", + sub: "On metered storage, every view of a high-resolution image is an egress charge. The more your collection is used, the more it costs — so open access starts to feel like a budget liability.", + items: [ + { + label: "Popularity is a penalty", + tone: "warning", + catch: "Every view adds to your invoice.", + body: "IIIF deep-zoom delivers 50–200 tiles per image. A single popular exhibition or a class assignment can move terabytes in a month. On per-GB egress, the most-loved part of the collection generates the biggest invoice.", + }, + { + label: "The unpredictable invoice", + tone: "danger", + catch: "You cannot budget a number you cannot predict.", + body: "Egress depends on traffic you do not control — a viral object, a linked syllabus, a scraper. A storage line that should be flat becomes a variable you reconcile every month and cannot forecast for the year.", + }, + { + label: "Access controls as cost control", + tone: "brand", + catch: "Rationing access to manage a bill.", + body: "Teams throttle resolution, gate downloads, or cache aggressively — not to support preservation, but to keep egress down. The mission is open access; the pricing model quietly works against it.", + }, + ], + }, - {/* Pricing */} -
-
-
- Pricing - One rate. {PRICE_PER_TB_MONTH}. - Storage. That is the whole bill. Egress is free, so a busy month and a quiet one cost exactly the same. -
- -

No credit card required · 1 TB free · $0 egress

-
-
+ comparison: { + label: "The comparison", + heading: ( + <> + 10 TB stored. 5 TB delivered a month. + + ), + sub: "Same collection, same monthly IIIF and download traffic, three providers. Storage, the egress charged to serve it, and the all-in monthly cost.", + subMaxWidth: 640, + caption: "Monthly cost for 10 TB stored, 5 TB delivered, by provider", + columns: [ + { key: "storage", header: "Storage 10 TB/mo" }, + { key: "egress", header: "Egress 5 TB/mo", colorByValue: true }, + { key: "allIn", header: "All-in / mo", total: true }, + ], + rows: [ + { provider: "AWS S3 Standard", values: { storage: "$236", egress: "$461", allIn: "$697" } }, + { provider: "Wasabi", values: { storage: "$70", egress: "$0", allIn: "$70" } }, + { provider: "Fil One", isFilOne: true, values: { storage: "$50", egress: "$0", allIn: "$50" } }, + ], + footnote: + "Scenario: 10 TB stored with 5 TB/month delivered to viewers (IIIF tiles, derivatives, downloads). AWS S3 Standard: ≈$236/mo storage ($0.023/GB) + 5 TB egress (5,120 GB × $0.09/GB) ≈ $461/mo ≈ $697/mo all-in. Wasabi: $6.99/TB = $70/mo, egress-free within fair-use limits; traffic-heavy collections may incur charges. Fil One: $4.99/TB = $50/mo, $0 egress. AWS and Wasabi rates from public US price cards, Q2 2026; figures indicative and rounded.", + }, - {/* Dark CTA */} -
-
-
- -
-
-
+ features: { + label: "Access without the meter", + heading: <>Open access far and wide. The bill does not move., + sub: "$0 egress, IIIF compatibility, and immutable masters — access without a per-view tax.", + items: [ + { + icon: ArrowsOut, + title: "$0 egress, always", + desc: "Every IIIF tile request, every full-resolution download, every researcher who opens the collection reads at zero egress cost. Access volume never changes the bill.", + }, + { + icon: CurrencyDollar, + title: `Flat ${PRICE_PER_TB_SHORT}`, + desc: `One rate for storage, nothing for delivery. The bill is your stored TBs times ${PRICE_DISPLAY} — predictable enough to put in a budget line that holds for years.`, + }, + { + icon: Plug, + title: "IIIF server compatible", + desc: "Serve directly from the standard S3 API that IIIF image servers like Cantaloupe and IIPImage already read. Point the tile source at Fil One — no re-architecture.", + }, + { + icon: Lock, + title: "Object Lock for preservation", + desc: "Configure retention from 1 day to 100 years at the bucket level, so master files behind every derivative and tile can't be altered or deleted early.", + }, + ], + }, -
-
- ); + cta: { + heading: "Open access, flat bill.", + subhead: "Start for free with 1 TB. Point your IIIF server at Fil One and serve the collection — at zero egress cost.", + cta: { label: "Start for free", href: signupUrl() }, + secondaryCta: { label: "Talk to an expert", href: SALES_URL }, + note: TAGLINE, + }, }; +const CollectionsAccessLandingPage = () => ; + export default CollectionsAccessLandingPage; diff --git a/src/pages/ComplianceLandingPage.tsx b/src/pages/ComplianceLandingPage.tsx index 0d95b2f..6a50235 100644 --- a/src/pages/ComplianceLandingPage.tsx +++ b/src/pages/ComplianceLandingPage.tsx @@ -1,495 +1,105 @@ -import { ShieldCheck, Database, 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 { Lock, Database, ShieldCheck, Plug } from "@phosphor-icons/react"; +import LandingPage, { type LandingPageConfig } from "@/components/LandingPage"; +import { PRICE_PER_TB_SHORT } from "@/lib/pricing"; import { signupUrl } from "@/lib/console-url"; +const SALES_URL = "/contact-sales"; -const FEATURES = [ - { - icon: ShieldCheck, - title: "Recurring integrity verification", - desc: "Every stored object is verified approximately every 24 hours. Data cannot silently corrupt or disappear — detection is built in, not bolted on.", - }, - { - icon: Database, - title: "Version history", - desc: "Object versioning stores every prior state. Prior versions are retrievable for audit, reconstruction, or evidence retention.", - }, - { - icon: ChartLine, - title: "11 nines durability", - desc: "Designed for 11 nines of durability. The storage architecture makes data loss a detectable and recoverable event.", - }, - { - icon: Plug, - title: "S3-compatible audit tooling", - desc: "Standard S3 API means audit tools, SIEM integrations, and object-level access logging work without custom adapters.", - }, -]; +const TAGLINE = "No credit card required · No egress fees · Connects in minutes"; -const ComplianceLandingPage = () => { - useSeo({ - title: "Fil One · Audit-ready storage with recurring integrity verification", - description: - `S3-compatible storage with recurring integrity verification every ~24 hours and full version history. ${PRICE_PER_TB_SHORT} flat. No egress fees.`, +const config: LandingPageConfig = { + seo: { + title: "Fil One · Storage controls you can actually point to", + description: `S3-compatible storage with Object Lock retention, full version history, and encryption at rest and in transit. ${PRICE_PER_TB_SHORT} flat. No egress fees.`, canonical: "https://www.fil.one/lp/compliance", - }); - - 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 }); - - return ( -
- - -
- {/* Hero */} -
-
- - {/* Problem */} -
-
-
- The audit gap - Standard object storage asks you to trust that data is intact. - - Most object storage provides durability by replication but gives the customer no independent way to verify the data has not silently changed since it was written. Regulated teams need a trail — not an assumption. - -
- -
- {[ - { - label: "Silent corruption", - catch: "Bit rot is undetected without active verification.", - body: "Standard S3-compatible storage relies on replication for durability but does not continuously verify each object's content. Data can change silently — not detectable until a read or an audit.", - }, - { - label: "Version accountability", - catch: "Who changed what, and when, is not always clear.", - body: "Evidence retention for SOC 2, ISO 27001, or HIPAA requires being able to retrieve a specific prior state of a record. Without version history, that state is gone once overwritten.", - }, - { - label: "The vendor trust assumption", - catch: "Compliance reviews ask for verification, not assurances.", - body: "Telling an auditor that the vendor guarantees durability is not the same as showing a verifiable record. Procurement and audit teams are looking for observable integrity, not contractual language.", - }, - ].map(({ label, body, catch: catchLine }) => ( -
-
- - {label} - -

- {catchLine} -

-

- {body} -

-
-
- ))} -
-
-
- - {/* Trust / integrity section */} -
-
-
- How integrity works - - Verified approximately every 24 hours. - - - Every object stored on Fil One receives an integrity fingerprint verified on a recurring basis — approximately every 24 hours. Data cannot silently change or disappear without detection. This is not a monitoring add-on; it is how the storage layer operates. - -
- -
- {[ - { - heading: "~24-hour cadence", - sub: "Integrity verification runs automatically on every stored object. No configuration, no scheduled jobs.", - }, - { - heading: "11 nines durability", - sub: "Designed for 11 nines of durability. Data loss is a detectable and recoverable event, not a silent failure.", - }, - { - heading: "Certified infrastructure", - sub: "Our services are delivered through top-tier data centers that are certified to ISO 27001, SOC 2, and PCI DSS standards.", - }, - ].map(({ heading, sub }) => ( -
-

- {heading} -

-

- {sub} -

-
- ))} -
-
-
- - {/* Features */} -
-
-
- Compliance features - - Audit-ready storage, by default. - -
+ }, -
- {FEATURES.map(({ icon: Icon, title, desc }) => ( -
-
- -
-

- {title} -

-

- {desc} -

-
- ))} -
-
-
+ hero: { + badge: "For fintech, health, and regulated teams", + titleMaxWidth: 800, + descriptionMaxWidth: 580, + title: ( + <> + Storage controls you can +
+ actually point to. + + ), + description: `S3-compatible storage with Object Lock retention, full version history, and encryption at rest and in transit. ${PRICE_PER_TB_SHORT} flat.`, + ctas: [ + { label: "Start for free", href: signupUrl(), variant: "primary" }, + { label: "Talk to an expert", href: SALES_URL, variant: "secondary" }, + ], + tagline: TAGLINE, + }, - {/* Pricing */} -
-
-
- Pricing - - One rate. {PRICE_PER_TB_MONTH}. - - - Storage. That is the whole bill. Integrity verification, version history, and 11 nines durability are included — not add-ons. - -
- -

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

-
-
+ problem: { + label: "The audit gap", + heading: "Standard object storage asks you to trust that data hasn't been overwritten.", + sub: "Most object storage lets any write silently replace the previous object, with nothing kept and nothing locked. Regulated teams need controls they can show an auditor — not an assumption.", + items: [ + { + label: "Untracked changes", + tone: "warning", + catch: "Overwrites erase the evidence.", + body: "Standard S3-compatible storage lets any write silently replace the previous object. Without version history or Object Lock, there's no record of what a file looked like before the last write — and nothing stopping it from being overwritten again.", + }, + { + label: "Version accountability", + tone: "danger", + catch: "Who changed what, and when, is not always clear.", + body: "Evidence retention for SOC 2, ISO 27001, or HIPAA requires being able to retrieve a specific prior state of a record. Without version history, that state is gone once overwritten.", + }, + { + label: "The paper-trail gap", + tone: "brand", + catch: "An SLA is not an audit trail.", + body: "Telling an auditor the vendor guarantees durability is not the same as showing version history and locked retention on the record in question. Procurement and audit teams increasingly want to see the controls, not just read about them.", + }, + ], + }, - {/* Dark CTA */} -
-
-
- -
-
-
+ features: { + label: "Compliance features", + heading: ( + <> + Controls, not just claims. + + ), + sub: "Object Lock, version history, and encryption — the concrete pieces an audit actually asks for.", + items: [ + { + icon: Lock, + title: "Object Lock (WORM) retention", + desc: "Configure retention from 1 day to 100 years in Governance or Compliance mode. Once locked, an object can't be deleted or overwritten before its retention period ends — not even by an admin key.", + }, + { + icon: Database, + title: "Version history", + desc: "Object versioning stores every prior state. Prior versions are downloadable for audit, reconstruction, or evidence retention.", + }, + { + icon: Plug, + 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: ShieldCheck, + title: "Certified infrastructure", + desc: "Our services are delivered through top-tier data centers that are certified to ISO 27001, SOC 2, and PCI DSS standards.", + }, + ], + }, -
-
- ); + cta: { + heading: "Compliance controls, not just claims.", + subhead: "Free 1 TB evaluation. Bring your existing S3 audit tooling and configure Object Lock and versioning on a real bucket.", + cta: { label: "Start for free", href: signupUrl() }, + secondaryCta: { label: "Talk to an expert", href: SALES_URL }, + note: TAGLINE, + }, }; +const ComplianceLandingPage = () => ; + export default ComplianceLandingPage; diff --git a/src/pages/CostTickerLandingPage.tsx b/src/pages/CostTickerLandingPage.tsx index b1391f7..c2f0446 100644 --- a/src/pages/CostTickerLandingPage.tsx +++ b/src/pages/CostTickerLandingPage.tsx @@ -1,172 +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"; import { signupUrl } from "@/lib/console-url"; -// 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 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: signupUrl(), 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: signupUrl() }, + secondaryCta: { label: "Talk to an expert", href: SALES_URL }, + note: TAGLINE, + }, }; +const CostTickerLandingPage = () => ; + export default CostTickerLandingPage; diff --git a/src/pages/DataControlLandingPage.tsx b/src/pages/DataControlLandingPage.tsx index aae6004..e34014f 100644 --- a/src/pages/DataControlLandingPage.tsx +++ b/src/pages/DataControlLandingPage.tsx @@ -1,169 +1,102 @@ -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 { ShieldCheck, ArrowsOut, Plug } from "@phosphor-icons/react"; +import LandingPage, { type LandingPageConfig } from "@/components/LandingPage"; +import { PRICE_PER_TB_SHORT } from "@/lib/pricing"; import { signupUrl } from "@/lib/console-url"; +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: signupUrl(), 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.", + columns: 3, + 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.", + }, + ], + }, - {/* 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: signupUrl() }, + secondaryCta: { label: "Talk to an expert", href: SALES_URL }, + note: TAGLINE, + }, }; +const DataControlLandingPage = () => ; + export default DataControlLandingPage; diff --git a/src/pages/DataSovereigntyLandingPage.tsx b/src/pages/DataSovereigntyLandingPage.tsx index e272abe..c3a56bb 100644 --- a/src/pages/DataSovereigntyLandingPage.tsx +++ b/src/pages/DataSovereigntyLandingPage.tsx @@ -1,493 +1,101 @@ -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, Plug, ShieldCheck } from "@phosphor-icons/react"; +import LandingPage, { type LandingPageConfig } from "@/components/LandingPage"; +import { PRICE_PER_TB_SHORT } from "@/lib/pricing"; import { signupUrl } from "@/lib/console-url"; +const SALES_URL = "/contact-sales"; -const FEATURES = [ - { - icon: ShieldCheck, - title: "EU-hosted endpoint", - desc: "Data written to the eu-west-1 endpoint stays in EU infrastructure. S3-compatible — no changes to your existing tools.", - placeholder: null, - }, - { - icon: Plug, - title: "S3-compatible tools", - desc: "Your existing SDKs, Terraform, rclone, or any S3-compatible toolchain points at the EU endpoint. No re-architecture required.", - placeholder: null, - }, - { - icon: ArrowsOut, - title: "No egress on portability", - desc: "Move data in and out of the EU endpoint without egress fees. Portability is not penalised — the exit cost is $0.", - placeholder: null, - }, - { - icon: ChartLine, - title: "Operator-level placement", - desc: "{{NEEDS PROOF: specific region and operator-pinning capability — which operators and regions can be pinned, and how}}", - placeholder: "NEEDS PROOF", - }, -]; +const TAGLINE = "No credit card required · No egress fees · Connects in minutes"; -const DataSovereigntyLandingPage = () => { - useSeo({ +const config: LandingPageConfig = { + seo: { title: "Fil One · EU data residency with S3-compatible tools", - description: - `S3-compatible object storage with EU region endpoint. Store data in EU infrastructure at ${PRICE_PER_TB_SHORT} flat. No egress fees.`, + description: `S3-compatible object storage with EU region endpoint. Store data in EU infrastructure at ${PRICE_PER_TB_SHORT} flat. No egress fees.`, canonical: "https://www.fil.one/lp/data-sovereignty", - }); - - 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 }); - - return ( -
- - -
- {/* Hero */} -
-
- - {/* Problem */} -
-
-
- The constraint - Residency and convenience have been a tradeoff. They do not have to be. - - Regulated EU teams often face a choice between hyperscaler convenience — with opaque data placement — and purpose-built EU storage that requires different tooling. S3 compatibility removes the tooling part of that tradeoff. - -
- -
- {[ - { - label: "The placement question", - catch: "EU-hosted is not the same as EU-only.", - body: "Hyperscalers offer EU regions, but data movement between regions for replication, processing, and backup is governed by their internal architecture — not by the customer's configuration. Audit trails for residency require documentation the platform does not make simple.", - }, - { - label: "The tooling cost", - catch: "Sovereign-only products break the existing stack.", - body: "Purpose-built EU storage often requires SDKs, APIs, and operational tooling that do not match what teams already run. The migration becomes a re-architecture. S3-compatible storage eliminates this — the tooling does not change.", - }, - { - label: "The egress penalty", - catch: "Moving EU data across borders costs extra.", - body: "Even when data starts in the EU, cross-region egress to process or distribute it adds cost. Teams that need to work with EU data from multiple locations pay again for the portability of their own dataset.", - }, - ].map(({ label, body, catch: catchLine }) => ( -
-
- - {label} - -

- {catchLine} -

-

- {body} -

-
-
- ))} -
-
-
- - {/* Trust / region section */} -
-
-
- EU endpoint - - Same connection. EU-hosted infrastructure. - - - Point your existing S3 client at the EU endpoint. Data written there stays in EU-hosted infrastructure. - -
- -
-
- eu-config.py -
-
{`import boto3, os
-
-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",  # EU-hosted infrastructure
-)
-
-# Data written here stays in EU
-s3.upload_file("dataset.parquet", "eu-data", "uploads/dataset.parquet")`}
-
-
-
- - {/* Features */} -
-
-
- Capabilities - - EU storage that works with existing tools. - -
+ }, -
- {FEATURES.map(({ icon: Icon, title, desc, placeholder }) => ( -
-
- -
-

- {title} -

-

- {desc} -

-
- ))} -
-
-
+ hero: { + badge: "For EU teams with data residency requirements", + titleMaxWidth: 800, + descriptionMaxWidth: 580, + title: ( + <> + Decide where your data lives. +
+ Keep your S3 tools. + + ), + description: `S3-compatible storage with EU region endpoint. Flat ${PRICE_PER_TB_SHORT}. No egress, no re-architecture.`, + ctas: [ + { label: "Start for free", href: signupUrl(), variant: "primary" }, + { label: "Talk to an expert", href: SALES_URL, variant: "secondary" }, + ], + tagline: TAGLINE, + }, - {/* Pricing */} -
-
-
- Pricing - - One rate. {PRICE_PER_TB_MONTH}. - - - Storage. That is the whole bill. No egress fees, no per-request charges. EU residency does not carry a premium. - -
- -

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

-
-
+ problem: { + label: "The constraint", + heading: "Residency and convenience have been a tradeoff. They do not have to be.", + sub: "Regulated EU teams often face a choice between hyperscaler convenience — with opaque data placement — and purpose-built EU storage that requires different tooling. S3 compatibility removes the tooling part of that tradeoff.", + items: [ + { + label: "The placement question", + tone: "warning", + catch: "EU-hosted is not the same as EU-only.", + body: "Hyperscalers offer EU regions, but data movement between regions for replication, processing, and backup is governed by their internal architecture — not by the customer's configuration. Audit trails for residency require documentation the platform does not make simple.", + }, + { + label: "The tooling cost", + tone: "danger", + catch: "Sovereign-only products break the existing stack.", + body: "Purpose-built EU storage often requires SDKs, APIs, and operational tooling that do not match what teams already run. The migration becomes a re-architecture. S3-compatible storage eliminates this — the tooling does not change.", + }, + { + label: "The egress penalty", + tone: "brand", + catch: "Moving EU data across borders costs extra.", + body: "Even when data starts in the EU, cross-region egress to process or distribute it adds cost. Teams that need to work with EU data from multiple locations pay again for the portability of their own dataset.", + }, + ], + }, - {/* Dark CTA */} -
-
-
- -
-
-
+ features: { + label: "Capabilities", + heading: ( + <> + EU storage that works with existing tools. + + ), + sub: "An EU endpoint, standard S3 tooling, and a free exit — the concrete pieces of data residency.", + columns: 3, + items: [ + { + icon: ShieldCheck, + title: "EU-hosted endpoint", + desc: "Data written to the eu-west-1 endpoint stays in EU infrastructure. S3-compatible — no changes to your existing tools.", + }, + { + icon: Plug, + title: "S3-compatible tools", + desc: "Your existing SDKs, Terraform, rclone, or any S3-compatible toolchain points at the EU endpoint. No re-architecture required.", + }, + { + icon: ArrowsOut, + title: "No egress on portability", + desc: "Move data in and out of the EU endpoint without egress fees. Portability is not penalised — the exit cost is $0.", + }, + ], + }, -
-
- ); + cta: { + heading: "EU storage. S3 tools. No egress.", + subhead: "Free 1 TB evaluation on the EU endpoint. Point your existing S3 tools and run the same workload in EU infrastructure.", + cta: { label: "Start for free", href: signupUrl() }, + secondaryCta: { label: "Talk to an expert", href: SALES_URL }, + note: TAGLINE, + }, }; +const DataSovereigntyLandingPage = () => ; + export default DataSovereigntyLandingPage; diff --git a/src/pages/DigitalPreservationLandingPage.tsx b/src/pages/DigitalPreservationLandingPage.tsx index c760344..a07fc72 100644 --- a/src/pages/DigitalPreservationLandingPage.tsx +++ b/src/pages/DigitalPreservationLandingPage.tsx @@ -1,470 +1,133 @@ import { ShieldCheck, ChartLine, ArrowsOut, 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"; import { signupUrl } from "@/lib/console-url"; +const SALES_URL = "/contact-sales"; + +const TAGLINE = "No credit card required · No egress fees · Connects in minutes"; // Preservation comparison scenario: 10 TB collection, one full fixity review per year, amortized monthly. -// 10 TB = 10,240 GB. A fixity review reads the entire collection once a year to re-verify checksums. -// AWS S3 Standard: storage 10,240 GB × $0.023/GB ≈ $236/mo. -// Fixity read: 10 TB × $0.09/GB egress ≈ $900/yr ≈ $75/mo. All-in ≈ $311/mo. -// AWS Glacier Deep Archive: storage 10,240 GB × $0.00099/GB ≈ $10/mo. -// Fixity read: 10 TB × ($0.02 retrieval + $0.09 egress) ≈ $1,100/yr ≈ $92/mo. All-in ≈ $102/mo. -// Wasabi: $6.99/TB = $70/mo. No retrieval or egress fees. -// Fil One: $4.99/TB = $50/mo. No retrieval or egress fees. Integrity verified ~24 h. -const PRESERVATION_ROWS = [ - { - provider: "AWS S3 Standard", - storage: "$236", - egress: "~$75", - allIn: "$311", - integrity: "No", - isFilOne: false, - }, - { - provider: "AWS Glacier Deep Archive", - storage: "$10", - egress: "~$92", - allIn: "$102", - integrity: "No", - isFilOne: false, - }, - { - provider: "Wasabi", - storage: "$70", - egress: "$0", - allIn: "$70", - integrity: "No", - isFilOne: false, - }, - { - provider: "Fil One", - storage: "$50", - egress: "$0", - allIn: "$50", - integrity: "~24 h", - isFilOne: true, +// AWS S3 Standard: storage 10,240 GB x $0.023/GB ~= $236/mo. Fixity read: 10 TB x $0.09/GB egress +// ~= $900/yr ~= $75/mo. All-in ~= $311/mo. +// AWS Glacier Deep Archive: storage 10,240 GB x $0.00099/GB ~= $10/mo. Fixity read: 10 TB x +// ($0.02 retrieval + $0.09 egress) ~= $1,100/yr ~= $92/mo. All-in ~= $102/mo. +// Wasabi: $6.99/TB = $70/mo, no retrieval/egress. Fil One: $4.99/TB = $50/mo, no retrieval/egress. +const config: LandingPageConfig = { + seo: { + title: "Fil One · Preservation you can afford to check", + description: `Flat ${PRICE_PER_TB_SHORT} digital preservation storage. No retrieval fees, no egress — run fixity checks as often as your program requires. S3-compatible.`, + canonical: "https://www.fil.one/lp/digital-preservation", }, -]; -const FEATURES = [ - { - icon: ShieldCheck, - title: "Integrity verification, ~24 h", - desc: "Every preserved object is re-verified approximately every 24 hours. You do not wait a year to authenticate that a file is unchanged. Checks are continuous and built in to storage.", - }, - { - icon: ChartLine, - title: "11 nines durability", - desc: "Distributed, redundant architecture with no single point of failure. Designed to deliver 11 nines of durability, backed by continuous, audit-ready integrity records.", - }, - { - icon: ArrowsOut, - title: "$0 retrieval, $0 egress", - desc: "Reading the collection back — for an audit, a migration, or a patron request — costs nothing. Accessing your archive is no longer a line item you ration.", + hero: { + badge: "For libraries, archives & memory institutions", + titleMaxWidth: 820, + descriptionMaxWidth: 580, + title: ( + <> + Preservation you can +
+ afford to check. + + ), + description: `Run fixity checks as often as you want — reading the collection back costs $0, so verification isn't rationed to once a year. Built in at ${PRICE_PER_TB_SHORT} flat.`, + ctas: [ + { label: "Start for free", href: signupUrl(), variant: "primary" }, + { label: "Talk to an expert", href: SALES_URL, variant: "secondary" }, + ], + tagline: TAGLINE, }, - { - icon: Database, - title: "S3-compatible", - desc: "Standard GetObject, PutObject, and multipart transfer. Preservation tools, BagIt workflows, and repository software that speak S3 connect without modification.", - }, -]; - -const DigitalPreservationLandingPage = () => { - useSeo({ - title: "Fil One · Preservation you can verify", - description: - `Flat ${PRICE_PER_TB_SHORT} digital preservation storage with integrity verification every ~24 hours. No retrieval fees, no egress. 11 nines durability, S3-compatible.`, - canonical: "https://www.fil.one/lp/digital-preservation", - }); - - 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 */} -
-
- - {/* Problem */} -
-
-
- The preservation gap - A fixity report is a snapshot. Decay doesn’t wait for the next one. - - Preservation depends on knowing the files are unchanged. Most storage only tells you once a year — and charges you to find out. Neither the gap nor the bill belongs in a serious archival program. - -
- -
- {[ - { - label: "The annual blind spot", - catch: "A year is a long time to not know.", - body: "A once-a-year fixity review confirms integrity on the day it runs. For the other 364 days the collection is unverified. Silent corruption that lands in month two surfaces ten months later — if the review even catches it.", - }, - { - label: "The cost of checking", - catch: "Verifying your archive is a metered read.", - body: "On metered tiers, every fixity review is a full-collection read priced per GB in retrieval and egress. The more thoroughly you preserve, the more it costs to prove you did — so teams check less than they should.", - }, - { - label: "The format you cannot open", - catch: "Proprietary tiers complicate the future.", - body: "Preservation is measured in decades. Storage tiers with restore delays, retrieval classes, and per-request semantics add operational risk to a workload whose entire point is to be simple, readable, and intact far into the future.", - }, - ].map(({ label, body, catch: catchLine }) => ( -
-
- - {label} - -

- {catchLine} -

-

- {body} -

-
-
- ))} -
-
-
- - {/* Comparison table */} -
-
-
- The comparison - - 10 TB collection. One fixity review a year — or one every day. - - - Same preservation workload, four providers. Monthly storage, the cost of reading the collection back to verify it, and whether integrity is actually checked. - -
- -
- - - - {["Provider", "Storage 10 TB/mo", "Retrieval + egress", "All-in /mo", "Integrity verification"].map((h) => ( - - ))} - - - - {PRESERVATION_ROWS.map((row) => ( - - - - - - - - ))} - -
- {h} -
- {row.provider} - {row.isFilOne && ( - - You - - )} - {row.storage}{row.egress}{row.allIn}{row.integrity}
-
-

- Scenario: 10 TB collection with one full fixity read per year, amortized monthly. AWS S3 Standard: ≈$236/mo storage ($0.023/GB) + ≈$75/mo amortized fixity (10 TB × $0.09/GB egress per year) ≈ $311/mo. AWS Glacier Deep Archive: ≈$10/mo storage ($0.00099/GB) + ≈$92/mo amortized fixity (10 TB × ($0.02 retrieval + $0.09 egress)/GB per year) ≈ $102/mo. Wasabi: $6.99/TB = $70/mo, no egress. Fil One: $4.99/TB = $50/mo, $0 egress, integrity verified ~24 h. AWS and Wasabi rates from public US price cards, Q2 2026; figures indicative and rounded. -

-
-
- - {/* Features */} -
-
-
- Preservation that proves itself - - Verification built in. Reading included. - -
- -
- {FEATURES.map(({ icon: Icon, title, desc }) => ( -
-
- -
-

{title}

-

{desc}

-
- ))} -
-
-
+ problem: { + label: "The preservation gap", + heading: "A fixity report is a snapshot. Decay doesn't wait for the next one.", + sub: "Preservation depends on knowing the files are unchanged. Most storage makes checking expensive, so programs check once a year instead of continuously. Neither the gap nor the bill belongs in a serious archival program.", + subMaxWidth: 620, + items: [ + { + label: "The annual blind spot", + tone: "warning", + catch: "A year is a long time to not know.", + body: "A once-a-year fixity review confirms integrity on the day it runs. For the other 364 days the collection is unchecked. A problem that lands in month two surfaces ten months later — if the next review even catches it.", + }, + { + label: "The cost of checking", + tone: "danger", + catch: "Verifying your archive is a metered read.", + body: "On metered tiers, every fixity review is a full-collection read priced per GB in retrieval and egress. The more thoroughly you preserve, the more it costs to check it — so teams check less than they should.", + }, + { + label: "The format you cannot open", + tone: "brand", + catch: "Proprietary tiers complicate the future.", + body: "Preservation is measured in decades. Storage tiers with restore delays, retrieval classes, and per-request semantics add operational risk to a workload whose entire point is to be simple, readable, and intact far into the future.", + }, + ], + }, - {/* Pricing */} -
-
-
- Pricing - One rate. {PRICE_PER_TB_MONTH}. - Storage. That is the whole bill. Integrity verification, 11 nines durability, and free reads are included — verifying the collection never adds a cent. -
- -

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

-
-
+ comparison: { + label: "The comparison", + heading: ( + <> + 10 TB collection. One fixity review a year — or as often as you want. + + ), + sub: "Same preservation workload, four providers. Monthly storage plus the cost of reading the collection back to check it.", + subMaxWidth: 640, + caption: "Monthly storage and amortized annual fixity-read cost, by provider", + columns: [ + { key: "storage", header: "Storage 10 TB/mo" }, + { key: "egress", header: "Retrieval + egress", colorByValue: true }, + { key: "allIn", header: "All-in / mo", total: true }, + ], + rows: [ + { provider: "AWS S3 Standard", values: { storage: "$236", egress: "~$75", allIn: "$311" } }, + { provider: "AWS Glacier Deep Archive", values: { storage: "$10", egress: "~$92", allIn: "$102" } }, + { provider: "Wasabi", values: { storage: "$70", egress: "$0", allIn: "$70" } }, + { provider: "Fil One", isFilOne: true, values: { storage: "$50", egress: "$0", allIn: "$50" } }, + ], + footnote: + "Scenario: 10 TB collection with one full fixity read per year, amortized monthly. AWS S3 Standard: ≈$236/mo storage ($0.023/GB) + ≈$75/mo amortized fixity (10 TB × $0.09/GB egress per year) ≈ $311/mo. AWS Glacier Deep Archive: ≈$10/mo storage ($0.00099/GB) + ≈$92/mo amortized fixity (10 TB × ($0.02 retrieval + $0.09 egress)/GB per year) ≈ $102/mo. Wasabi: $6.99/TB = $70/mo, no egress. Fil One: $4.99/TB = $50/mo, $0 egress. AWS and Wasabi rates from public US price cards, Q2 2026; figures indicative and rounded.", + }, - {/* Dark CTA */} -
-
-
- -
-
-
+ features: { + label: "Preservation built for checking", + heading: <>Reading included. Checking costs nothing., + sub: "Free reads, no archive-tier wait, and standard S3 tooling — so fixity checks stop being an annual event.", + items: [ + { + icon: ShieldCheck, + title: "Free fixity checks, any time", + desc: "Reading the collection back to re-verify checksums costs $0 in egress. Run fixity reviews as often as your program requires, not once a year.", + }, + { + icon: ChartLine, + title: "No archive-tier wait", + desc: "Objects are readable the instant you request them — no rehydration delay before a fixity check or an access request can run.", + }, + { + icon: Database, + title: "S3-compatible", + desc: "Standard GetObject, PutObject, and multipart transfer. Preservation tools, BagIt workflows, and repository software that speak S3 connect without modification.", + }, + { + icon: ArrowsOut, + title: "Object Lock for compliance", + desc: "Configure retention from 1 day to 100 years at the bucket level, for collections that must not be altered or deleted early.", + }, + ], + }, -
-
- ); + cta: { + heading: "Preservation you can afford to check.", + subhead: "Free 1 TB evaluation. Write a collection and read it back to check it — at zero retrieval cost.", + cta: { label: "Start for free", href: signupUrl() }, + secondaryCta: { label: "Talk to an expert", href: SALES_URL }, + note: TAGLINE, + }, }; +const DigitalPreservationLandingPage = () => ; + export default DigitalPreservationLandingPage; diff --git a/src/pages/ExitFirstLandingPage.tsx b/src/pages/ExitFirstLandingPage.tsx index bacc136..7faa62e 100644 --- a/src/pages/ExitFirstLandingPage.tsx +++ b/src/pages/ExitFirstLandingPage.tsx @@ -1,175 +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"; import { signupUrl } from "@/lib/console-url"; -// 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 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: signupUrl(), 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: signupUrl() }, + secondaryCta: { label: "Talk to an expert", href: SALES_URL }, + note: TAGLINE, + }, }; +const ExitFirstLandingPage = () => ; + export default ExitFirstLandingPage; diff --git a/src/pages/GamingLandingPage.tsx b/src/pages/GamingLandingPage.tsx index fbb853b..c0e1ea2 100644 --- a/src/pages/GamingLandingPage.tsx +++ b/src/pages/GamingLandingPage.tsx @@ -1,195 +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"; import { signupUrl } from "@/lib/console-url"; +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: signupUrl(), 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: signupUrl() }, + secondaryCta: { label: "Talk to an expert", href: SALES_URL }, + note: TAGLINE, + }, }; +const GamingLandingPage = () => ; + export default GamingLandingPage; diff --git a/src/pages/GenomicsLandingPage.tsx b/src/pages/GenomicsLandingPage.tsx index ed25fa5..999335d 100644 --- a/src/pages/GenomicsLandingPage.tsx +++ b/src/pages/GenomicsLandingPage.tsx @@ -1,219 +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"; import { signupUrl } from "@/lib/console-url"; +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: signupUrl(), 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: signupUrl() }, + secondaryCta: { label: "Talk to an expert", href: SALES_URL }, + note: TAGLINE, + }, }; +const GenomicsLandingPage = () => ; + export default GenomicsLandingPage; diff --git a/src/pages/GoGlobalLandingPage.tsx b/src/pages/GoGlobalLandingPage.tsx index 5e3f46f..c5b3c2e 100644 --- a/src/pages/GoGlobalLandingPage.tsx +++ b/src/pages/GoGlobalLandingPage.tsx @@ -1,170 +1,133 @@ 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 LandingPage, { type LandingPageConfig } from "@/components/LandingPage"; import { PRICE_PER_TB_SHORT } from "@/lib/pricing"; import { signupUrl } from "@/lib/console-url"; +const SALES_URL = "/contact-sales"; -// Scale cost comparison: 1 PB stored -// AWS S3: $22,067/month (tiered) -// Fil One: $4,990/month -const SCALE_ROWS = [ - { scale: "10 TB", aws: "$236", filOne: "$50", }, - { scale: "100 TB", aws: "$2,304", filOne: "$499", }, - { scale: "500 TB", aws: "$11,315", filOne: "$2,495", }, - { scale: "1 PB", aws: "$22,067", filOne: "$4,990", }, -]; +const TAGLINE = "Enterprise and embedding terms available · Contact-led"; -const FEATURES = [ - { icon: Plug, title: "S3-compatible from day one", desc: "Your customers use the same SDKs, CLIs, and integrations they already run. No custom adapter, no lock-in to a proprietary API surface." }, - { icon: ArrowsOut, title: "No egress for your customers", desc: "Customers who read their own data at scale pay $0 in egress. A storage product that doesn't penalise usage is easier to sell." }, - { icon: ShieldCheck, title: "SLA-backed, enterprise terms", desc: "Capacity assurance and deployment SLAs available on 1, 3, and 5-year terms via the Business plan. Predictable infrastructure for a predictable product." }, - { icon: ChartLine, title: "Flat pricing that scales linearly", desc: `${PRICE_PER_TB_SHORT} regardless of volume. At 1 PB, that is $4,990/month — a number you can build a product margin on. No tier waterfall to model.` }, -]; - -const GoGlobalLandingPage = () => { - useSeo({ +// Scale cost comparison. AWS S3 Standard us-east-1 Q2 2026: tiered storage +// $0.023/GB first 50 TB, $0.022/GB next 450 TB, $0.021/GB over 500 TB. +// Fil One $4.99/TB flat. Storage only; egress additional on AWS, $0 on Fil One. +const config: LandingPageConfig = { + seo: { title: "Fil One · Go global. Skip the multi-year build.", - description: - `Embed S3-compatible object storage into your product. Global network, SLA-backed, ${PRICE_PER_TB_SHORT} flat. No capex, no infrastructure build — contact for enterprise and embedding terms.`, + description: `Embed S3-compatible object storage into your product. US and EU regions, SLA-backed, ${PRICE_PER_TB_SHORT} flat. No capex, no infrastructure build — contact for enterprise and embedding terms.`, canonical: "https://www.fil.one/lp/go-global", - }); - - const { ref: problemRef, inView: problemInView } = useInView({ threshold: 0.05 }); - const { ref: scaleRef, inView: scaleInView } = 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: "For data-heavy scale-ups offering storage as part of their product", + titleMaxWidth: 760, + descriptionMaxWidth: 600, + title: ( + <> + Go global. +
+ Skip the multi-year build. + + ), + description: `Embed S3-compatible object storage into your product. US and EU regions, SLA-backed, ${PRICE_PER_TB_SHORT} flat. Your customers get reliable storage — you skip the infrastructure capex.`, + ctas: [ + { label: "Talk to our team", href: SALES_URL, variant: "primary" }, + { label: "Evaluate the API", href: signupUrl(), variant: "secondary" }, + ], + tagline: TAGLINE, + }, - {/* Hero */} -
-
+ problem: { + label: "The build vs buy decision", + heading: "Building globally competitive storage infrastructure takes years and serious capex.", + sub: "Data-heavy scale-ups that want to offer storage as a first-class product feature face a choice: build the infrastructure themselves (3–5 years, significant capex) or stay regional. Embedding Fil One removes the infrastructure build from the roadmap.", + subMaxWidth: 620, + items: [ + { + label: "The build cost", + tone: "warning", + catch: "Durable S3-compatible storage at scale takes years.", + body: "Durability, S3 API parity, multi-region replication, and operational tooling at petabyte scale is a multi-year engineering programme. A product team that builds this is not building the product.", + }, + { + label: "The capex ceiling", + tone: "danger", + catch: "Hardware cycles don't match customer growth.", + body: "On-premise or co-lo storage infrastructure scales in discrete hardware increments. Teams overbuild capacity and carry unused cost, or underbuild and miss customer demand. A pay-per-use layer removes the commitment.", + }, + { + label: "The regional trap", + tone: "brand", + catch: "Staying single-region limits the addressable market.", + body: "A product that only serves one region competes against hyperscalers that serve many. Embedding a multi-region storage layer lets the product serve customers across the US and EU without the multi-year infrastructure investment.", + }, + ], + }, - {/* Problem */} -
-
-
- The build vs buy decision - Building globally competitive storage infrastructure takes years and serious capex. - - Data-heavy scale-ups that want to offer storage as a first-class product feature face a choice: build the infrastructure themselves (3–5 years, significant capex) or stay regional. Embedding Fil One removes the infrastructure build from the roadmap. - -
-
- {[ - { label: "The build cost", catch: "Durable S3-compatible storage at scale takes years.", body: "Durability, S3 API parity, multi-region replication, and operational tooling at petabyte scale is a multi-year engineering programme. A product team that builds this is not building the product." }, - { label: "The capex ceiling", catch: "Hardware cycles don't match customer growth.", body: "On-premise or co-lo storage infrastructure scales in discrete hardware increments. Teams overbuild capacity and carry unused cost, or underbuild and miss customer demand. A pay-per-use layer removes the commitment." }, - { label: "The regional trap", catch: "Staying regional limits the addressable market.", body: "A product that only serves one region competes against hyperscalers that serve every region. Embedding a global-network storage layer makes the product globally competitive without the multi-year infrastructure investment." }, - ].map(({ label, body, catch: c }) => ( -
-
- {label} -

{c}

-

{body}

-
-
- ))} -
-
-
+ comparison: { + label: "The cost model", + heading: ( + <> + Storage that scales linearly with your product. + + ), + sub: "Monthly storage cost at different scales. AWS S3 Standard (tiered) vs Fil One flat rate. The gap widens as the product grows.", + subMaxWidth: 620, + caption: "Monthly storage cost at increasing scale, AWS S3 Standard vs Fil One", + columns: [ + { key: "t10", header: "10 TB" }, + { key: "t100", header: "100 TB" }, + { key: "t500", header: "500 TB" }, + { key: "t1000", header: "1 PB", total: true }, + ], + rows: [ + { provider: "AWS S3 Standard", values: { t10: "$236", t100: "$2,304", t500: "$11,315", t1000: "$22,067" } }, + { provider: "Fil One", isFilOne: true, values: { t10: "$50", t100: "$499", t500: "$2,495", t1000: "$4,990" } }, + ], + footnote: + "AWS S3 Standard us-east-1 Q2 2026: tiered storage $0.023/GB first 50 TB, $0.022/GB next 450 TB, $0.021/GB over 500 TB. Fil One $4.99/TB flat. Storage only; egress additional on AWS, $0 on Fil One.", + }, - {/* Scale cost table */} -
-
-
- The cost model - Storage that scales linearly with your product. - Monthly storage cost at different scales. AWS S3 Standard (tiered) vs Fil One flat rate. The gap widens as the product grows. -
-
- - - - {["Scale", "AWS S3 Standard", "Fil One"].map(h => ( - - ))} - - - - {SCALE_ROWS.map(r => ( - - - - - - ))} - -
{h}
{r.scale}{r.aws}{r.filOne}
-
-

AWS S3 Standard us-east-1 Q2 2026: tiered storage $0.023/GB first 50 TB, $0.022/GB next 450 TB, $0.021/GB over 500 TB. Fil One $4.99/TB flat. Storage only; egress additional on AWS, $0 on Fil One.

-
-
+ features: { + label: "For product teams", + heading: ( + <> + Storage that your customers already know how to use. + + ), + sub: "S3-compatible, no egress, and enterprise terms — built to embed.", + items: [ + { + icon: Plug, + title: "S3-compatible from day one", + desc: "Your customers use the same SDKs, CLIs, and integrations they already run. No custom adapter, no lock-in to a proprietary API surface.", + }, + { + icon: ArrowsOut, + title: "No egress for your customers", + desc: "Customers who read their own data at scale pay $0 in egress. A storage product that doesn't penalise usage is easier to sell.", + }, + { + icon: ShieldCheck, + title: "SLA-backed, enterprise terms", + desc: "Capacity assurance and deployment SLAs available on 1, 3, and 5-year terms via the Business plan. Predictable infrastructure for a predictable product.", + }, + { + icon: ChartLine, + title: "Flat pricing that scales linearly", + desc: `${PRICE_PER_TB_SHORT} regardless of volume. At 1 PB, that is $4,990/month — a number you can build a product margin on. No tier waterfall to model.`, + }, + ], + }, - {/* Features */} -
-
-
- For product teams - Global storage that your customers already know how to use. -
-
- {FEATURES.map(({ icon: Icon, title, desc }) => ( -
-
-

{title}

-

{desc}

-
- ))} -
-
-
- - {/* Dark CTA — contact-led */} -
-
-
- -
-
-
-
-
- ); + cta: { + heading: "Global reach in your product. None of the capex.", + subhead: "Talk to the Fil One team about embedding the storage layer in your product. Enterprise and multi-year terms available.", + cta: { label: "Talk to our team", href: SALES_URL }, + secondaryCta: { label: "Evaluate the API", href: signupUrl() }, + note: "Enterprise and embedding terms available · sales@fil.one", + }, }; +const GoGlobalLandingPage = () => ; + export default GoGlobalLandingPage; diff --git a/src/pages/GrantFundedLandingPage.tsx b/src/pages/GrantFundedLandingPage.tsx index f68ae70..e3050f6 100644 --- a/src/pages/GrantFundedLandingPage.tsx +++ b/src/pages/GrantFundedLandingPage.tsx @@ -1,465 +1,133 @@ -import { CurrencyDollar, Wallet, ShieldCheck, 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 { CurrencyDollar, Wallet, Clock, Database } from "@phosphor-icons/react"; +import LandingPage, { type LandingPageConfig } from "@/components/LandingPage"; import { PRICE_PER_TB_SHORT, PRICE_PER_TB_MONTH } from "@/lib/pricing"; import { signupUrl } from "@/lib/console-url"; +const SALES_URL = "/contact-sales"; -// Grant comparison scenario: 5 TB of research data, one annual integrity review, amortized monthly. -// 5 TB = 5,120 GB. The annual review reads the full dataset once a year to re-verify it. -// AWS S3 Standard: storage 5,120 GB × $0.023/GB ≈ $118/mo. -// Annual review: 5 TB × $0.09/GB egress ≈ $461/yr ≈ $38/mo. All-in ≈ $156/mo. -// AWS Glacier Deep Archive: storage 5,120 GB × $0.00099/GB ≈ $5/mo. -// Annual review: 5 TB × ($0.02 retrieval + $0.09 egress) ≈ $563/yr ≈ $47/mo. All-in ≈ $52/mo. -// Wasabi: $6.99/TB = $35/mo. No retrieval or egress fees. -// Fil One: $4.99/TB = $25/mo. No retrieval or egress fees, no exit fees. Integrity verified ~24 h. -const GRANT_ROWS = [ - { - provider: "AWS S3 Standard", - storage: "$118", - egress: "~$38/mo", - allIn: "$156", - isFilOne: false, - }, - { - provider: "AWS Glacier Deep Archive", - storage: "$5", - egress: "~$47/mo", - allIn: "$52", - isFilOne: false, - }, - { - provider: "Wasabi", - storage: "$35", - egress: "$0", - allIn: "$35", - isFilOne: false, - }, - { - provider: "Fil One", - storage: "$25", - egress: "$0", - allIn: "$25", - isFilOne: true, - }, -]; - -const FEATURES = [ - { - icon: CurrencyDollar, - title: "Predictable flat rate", - desc: `${PRICE_PER_TB_MONTH}, flat. A number you can write into a data management plan and a multi-year budget and trust to hold up.`, - }, - { - icon: Wallet, - title: "No exit fees", - desc: "Leaving costs nothing. When the grant ends or the data moves to an institutional repository, you read everything back at $0 — no invoice on the way out.", - }, - { - icon: ShieldCheck, - title: "Integrity verification, ~24 h", - desc: "Every object is verified approximately every 24 hours, satisfying the integrity expectations of funder data retention requirements without a manual process.", - }, - { - icon: Database, - title: "S3-compatible", - desc: "Standard S3 API. The tools, scripts, and repository software your project already uses connect without modification — and so will whoever inherits the data later.", - }, -]; +const TAGLINE = "No credit card required · No retrieval fees · Connects in minutes"; -const GrantFundedLandingPage = () => { - useSeo({ +// Grant comparison scenario: 5 TB of research data, one annual review, amortized monthly. +// AWS S3 Standard: storage 5,120 GB x $0.023/GB ~= $118/mo. Annual review: 5 TB x $0.09/GB +// egress ~= $461/yr ~= $38/mo. All-in ~= $156/mo. +// AWS Glacier Deep Archive: storage 5,120 GB x $0.00099/GB ~= $5/mo. Annual review: 5 TB x +// ($0.02 retrieval + $0.09 egress) ~= $563/yr ~= $47/mo. All-in ~= $52/mo. +// Wasabi: $6.99/TB = $35/mo, no retrieval/egress. Fil One: $4.99/TB = $25/mo, no retrieval/egress/exit fees. +const config: LandingPageConfig = { + seo: { title: "Fil One · Storage that outlives the grant cycle", - description: - `Flat ${PRICE_PER_TB_SHORT} research data storage with no exit fees and integrity verification every ~24 hours. Predictable for multi-year grants, S3-compatible.`, + description: `Flat ${PRICE_PER_TB_SHORT} research data storage with no exit fees. Predictable for multi-year grants, S3-compatible.`, canonical: "https://www.fil.one/lp/grant-funded", - }); - - 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 */} -
-
- - {/* Problem */} -
-
-
- The funding mismatch - The grant has an end date. The retention requirement does not. - - Funders want data kept and verifiable for years after the award closes. But the budget is fixed, the costs are variable, and the bill keeps arriving long after the grant period ends. - -
- -
- {[ - { - label: "The budget you cannot forecast", - catch: "Variable costs, fixed award.", - body: "A data-management plan needs a storage number that holds for the life of the grant. Metered tiers with egress and retrieval charges produce a bill that moves with usage — impossible to commit to in a proposal written years in advance.", - }, - { - label: "The cost after the money", - catch: "Retention outlasts the funding.", - body: "Funders increasingly require data kept and re-verifiable for five to ten years. The award covers a fraction of that. Whatever storage you choose has to stay cheap and intact long after the grant line is closed.", - }, - { - label: "The toll to leave", - catch: "Moving the data costs money.", - body: "When the project ends, and data migrates to an institutional or disciplinary repository, retrieval fees turn the handover into an unbudgeted expense — charged precisely when every dollar has been spoken for.", - }, - ].map(({ label, body, catch: catchLine }) => ( -
-
- - {label} - -

- {catchLine} -

-

- {body} -

-
-
- ))} -
-
-
- - {/* Comparison table */} -
-
-
- The comparison - - 5 TB of data. One review a year. - - - Same dataset, same annual integrity review, four providers. Monthly storage, the cost to read it back to verify it, and the all-in number you would put in the budget. - -
- -
- - - - {["Provider", "Storage 5 TB/mo", "Retrieval + egress", "All-in /mo"].map((h) => ( - - ))} - - - - {GRANT_ROWS.map((row) => ( - - - - - - - ))} - -
- {h} -
- {row.provider} - {row.isFilOne && ( - - You - - )} - {row.storage}{row.egress}{row.allIn}
-
-

- Scenario: 5 TB of research data with one annual integrity review, amortized monthly. AWS S3 Standard: ≈$118/mo storage ($0.023/GB) + ≈$38/mo amortized review (5 TB × $0.09/GB egress per year) ≈ $156/mo. AWS Glacier Deep Archive: ≈$5/mo storage ($0.00099/GB) + ≈$47/mo amortized review (5 TB × ($0.02 retrieval + $0.09 egress)/GB per year) ≈ $52/mo. Wasabi: $6.99/TB = $35/mo, no egress. Fil One: $4.99/TB = $25/mo, $0 egress, no exit fees, integrity verified ~24 h. AWS and Wasabi rates from public US price cards, Q2 2026; figures indicative and rounded. -

-
-
+ }, - {/* Features */} -
-
-
- Built for the long award - - One number for the budget. Intact for the duration. - -
+ hero: { + badge: "For grant-funded research & data management plans", + titleMaxWidth: 820, + descriptionMaxWidth: 580, + title: ( + <> + Storage that outlives +
+ the grant cycle. + + ), + description: `Flat ${PRICE_PER_TB_SHORT}. A cost you can write into a data management plan and trust to hold. No exit or retrieval fees.`, + ctas: [ + { label: "Start for free", href: signupUrl(), variant: "primary" }, + { label: "Talk to an expert", href: SALES_URL, variant: "secondary" }, + ], + tagline: TAGLINE, + }, -
- {FEATURES.map(({ icon: Icon, title, desc }) => ( -
-
- -
-

{title}

-

{desc}

-
- ))} -
-
-
+ problem: { + label: "The funding mismatch", + heading: "The grant has an end date. The retention requirement does not.", + sub: "Funders want data kept for years after the award closes. But the budget is fixed, the costs are variable, and the bill keeps arriving long after the grant period ends.", + subMaxWidth: 620, + items: [ + { + label: "The budget you cannot forecast", + tone: "warning", + catch: "Variable costs, fixed award.", + body: "A data-management plan needs a storage number that holds for the life of the grant. Metered tiers with egress and retrieval charges produce a bill that moves with usage — impossible to commit to in a proposal written years in advance.", + }, + { + label: "The cost after the money", + tone: "danger", + catch: "Retention outlasts the funding.", + body: "Funders increasingly require data kept for five to ten years after a grant closes. The award covers a fraction of that. Whatever storage you choose has to stay cheap and accessible long after the grant line is closed.", + }, + { + label: "The toll to leave", + tone: "brand", + catch: "Moving the data costs money.", + body: "When the project ends, and data migrates to an institutional or disciplinary repository, retrieval fees turn the handover into an unbudgeted expense — charged precisely when every dollar has been spoken for.", + }, + ], + }, - {/* Pricing */} -
-
-
- Pricing - One rate. {PRICE_PER_TB_MONTH}. - Storage. That is the whole bill. Integrity verification, 11 nines durability, free reads, and no exit fees are all included — the number you budget is the number you pay. -
- -

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

-
-
+ comparison: { + label: "The comparison", + heading: ( + <> + 5 TB of data. One review a year. + + ), + sub: "Same dataset, same annual read-back, four providers. Monthly storage, the cost to read it back, and the all-in number you would put in the budget.", + subMaxWidth: 640, + caption: "Monthly storage and amortized annual read-back cost, by provider", + columns: [ + { key: "storage", header: "Storage 5 TB/mo" }, + { key: "egress", header: "Retrieval + egress", colorByValue: true }, + { key: "allIn", header: "All-in / mo", total: true }, + ], + rows: [ + { provider: "AWS S3 Standard", values: { storage: "$118", egress: "~$38/mo", allIn: "$156" } }, + { provider: "AWS Glacier Deep Archive", values: { storage: "$5", egress: "~$47/mo", allIn: "$52" } }, + { provider: "Wasabi", values: { storage: "$35", egress: "$0", allIn: "$35" } }, + { provider: "Fil One", isFilOne: true, values: { storage: "$25", egress: "$0", allIn: "$25" } }, + ], + footnote: + "Scenario: 5 TB of research data with one annual read-back, amortized monthly. AWS S3 Standard: ≈$118/mo storage ($0.023/GB) + ≈$38/mo amortized read-back (5 TB × $0.09/GB egress per year) ≈ $156/mo. AWS Glacier Deep Archive: ≈$5/mo storage ($0.00099/GB) + ≈$47/mo amortized read-back (5 TB × ($0.02 retrieval + $0.09 egress)/GB per year) ≈ $52/mo. Wasabi: $6.99/TB = $35/mo, no egress. Fil One: $4.99/TB = $25/mo, $0 egress, no exit fees. AWS and Wasabi rates from public US price cards, Q2 2026; figures indicative and rounded.", + }, - {/* Dark CTA */} -
-
-
- -
-
-
+ features: { + label: "Built for the long award", + heading: <>One number for the budget. Accessible for the duration., + sub: "A flat rate, no exit fees, and no archive-tier wait — for data that has to outlast the grant that funded it.", + items: [ + { + icon: CurrencyDollar, + title: "Predictable flat rate", + desc: `${PRICE_PER_TB_MONTH}, flat. A number you can write into a data management plan and a multi-year budget and trust to hold up.`, + }, + { + icon: Wallet, + title: "No exit fees", + desc: "Leaving costs nothing. When the grant ends or the data moves to an institutional repository, you read everything back at $0 — no invoice on the way out.", + }, + { + icon: Clock, + title: "No archive-tier wait", + desc: "Objects are readable the instant they're requested — no rehydration delay for whoever inherits the data after the grant closes.", + }, + { + icon: Database, + title: "S3-compatible", + desc: "Standard S3 API. The tools, scripts, and repository software your project already uses connect without modification — and so will whoever inherits the data later.", + }, + ], + }, -
-
- ); + cta: { + heading: "A number that outlives the award.", + subhead: "Free 1 TB evaluation. Put a flat, predictable storage line in your next data management plan.", + cta: { label: "Start for free", href: signupUrl() }, + secondaryCta: { label: "Talk to an expert", href: SALES_URL }, + note: TAGLINE, + }, }; +const GrantFundedLandingPage = () => ; + export default GrantFundedLandingPage; diff --git a/src/pages/LogRetentionLandingPage.tsx b/src/pages/LogRetentionLandingPage.tsx index d79d814..0e9dcbf 100644 --- a/src/pages/LogRetentionLandingPage.tsx +++ b/src/pages/LogRetentionLandingPage.tsx @@ -1,582 +1,135 @@ import { Database, 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 LandingPage, { type LandingPageConfig } from "@/components/LandingPage"; +import { PRICE_PER_TB_SHORT } from "@/lib/pricing"; import { signupUrl } from "@/lib/console-url"; +const SALES_URL = "/contact-sales"; -const FEATURES = [ - { - icon: Database, - title: "No per-request fees", - desc: "PUT, GET, LIST, HEAD — all included. The line item that dominates a logging workload on AWS does not exist here.", - }, - { - icon: Plug, - title: "S3-compatible logging", - desc: "Vector, Fluent Bit, Logstash, OpenTelemetry collectors, Loki — all of them write S3. Point them at the Fil One endpoint and ship.", - }, - { - icon: ChartLine, - title: "Predictable bill", - desc: "Storage charges grow with what you keep, not with how loudly your services log. A noisy deploy stops being a billing event.", - }, - { - icon: ShieldCheck, - title: "Versioning and Object Lock", - desc: "Tamper-evident audit logs by default. Compliance-mode retention for SOC 2, ISO 27001, and HIPAA evidence retention periods.", - }, -]; +const TAGLINE = "No credit card required · No per-request fees · Connects in minutes"; -const LogRetentionLandingPage = () => { - useSeo({ +// Per-request math, 100M PUT/month. +// AWS S3: $0.005/1K = $500. Google Cloud: $0.05/10K Class A = $500. Azure: $0.055/10K = $550. +// Wasabi, Backblaze B2, Fil One: $0 per request. +const config: LandingPageConfig = { + seo: { title: "Fil One · Stop sampling your logs to save money", - description: - `S3-compatible log storage at ${PRICE_PER_TB_SHORT} flat. No per-request fees. Drop in as a Vector, Fluent Bit, or OTel sink and keep every event.`, + description: `S3-compatible log storage at ${PRICE_PER_TB_SHORT} flat. No per-request fees. Drop in as a Vector, Fluent Bit, or OTel sink and keep every event.`, canonical: "https://www.fil.one/lp/log-retention", - }); - - 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 VECTOR_CONFIG = `# vector.toml — write every event to Fil One -[sinks.fil_one_logs] -type = "aws_s3" -inputs = ["all_services"] -bucket = "prod-logs" -endpoint = "https://eu-west-1.s3.fil.one" -region = "eu-west-1" -compression = "gzip" - -[sinks.fil_one_logs.batch] -max_bytes = 10485760 # flush 10 MiB at a time -timeout_secs = 60 # one PUT per shard per minute - -[sinks.fil_one_logs.auth] -access_key_id = "\${FIL_ACCESS_KEY}" -secret_access_key = "\${FIL_SECRET_KEY}"`; - - return ( -
- - -
- {/* Hero */} -
-
- - {/* Problem */} -
-
-
- The trap - Logs are billed per write. Logs are written constantly. - - Hyperscaler object storage charges per PUT. A logging pipeline writes by definition. The cheapest way to make the bill smaller is to keep fewer logs — and the price paid for that decision is paid later, in the incident postmortem you cannot reconstruct. - -
- -
- {[ - { - label: "What you write", - body: "100 million PUTs per month is a modest production logging workload. On AWS S3 that is $500 in request charges alone, before a single byte of storage is billed.", - catch: "Each write is a metered event.", - }, - { - label: "What you store", - body: "10 TB of compressed log data per month is normal for a mid-size platform. Add storage at $0.023/GB and egress for any query that reads back — the bill closes in on $750 a month before you draw a single dashboard.", - catch: "Storage is the smaller line.", - }, - { - label: "What you give up", - body: "Engineering reacts by sampling. Trace volume gets capped. Debug logs get truncated. The dashboard you finally build only has the events that survived the budget meeting.", - catch: "The bill picks which events to keep.", - }, - ].map(({ label, body, catch: catchLine }) => ( -
-
- - {label} - -

- {catchLine} -

-

- {body} -

-
-
- ))} -
-
-
- - {/* Proof — code block + per-request comparison */} -
-
-
- How it lands - - A logging sink that doesn't bill per event. - - - Vector, Fluent Bit, Logstash, OpenTelemetry — anything that already writes S3 — gets a new endpoint. The PUT counter stops mattering. - -
- -
- {/* Code block */} -
-
- vector.toml -
-
-                  {VECTOR_CONFIG}
-                
-
- - {/* Per-request comparison */} -
- Per-request math, 100M PUT/month -
- {[ - { name: "AWS S3 Standard", rate: "$0.005 / 1K PUT", total: "$500.00", win: false }, - { name: "Google Cloud", rate: "$0.05 / 10K Class A", total: "$500.00", win: false }, - { name: "Azure Blob", rate: "$0.055 / 10K writes", total: "$550.00", win: false }, - { name: "Wasabi", rate: "$0 per request", total: "$0", win: true }, - { name: "Backblaze B2", rate: "$0 per request", total: "$0", win: true }, - { name: "Fil One", rate: "$0 per request", total: "$0", win: true, you: true }, - ].map((r) => ( -
- - {r.name} - - - {r.rate} - - - {r.total} - -
- ))} -
-

- Public US rate cards, Q2 2026. Storage and egress not included in this line — they are extra on the metered tiers, and zero on Fil One. -

-
-
-
-
+ }, - {/* Features */} -
-
-
- Why it works - - A sink that scales with retention, not write rate. - - - Same S3 API, same SDKs. The only thing that changes is the line item that used to dominate the bill. - -
+ hero: { + badge: "For platform & observability teams", + titleMaxWidth: 760, + descriptionMaxWidth: 580, + title: ( + <> + Stop sampling your logs +
+ to save money. + + ), + description: `S3-compatible storage at ${PRICE_PER_TB_SHORT} flat. No per-request fees, no egress. Keep every event, every span, every audit trail — without watching the PUT counter.`, + ctas: [ + { label: "Start for free", href: signupUrl(), variant: "primary" }, + { label: "Talk to an expert", href: SALES_URL, variant: "secondary" }, + ], + tagline: TAGLINE, + }, -
- {FEATURES.map(({ icon: Icon, title, desc }) => ( -
-
- -
-

- {title} -

-

- {desc} -

-
- ))} -
-
-
+ problem: { + label: "The trap", + heading: "Logs are billed per write. Logs are written constantly.", + sub: "Hyperscaler object storage charges per PUT. A logging pipeline writes by definition. The cheapest way to make the bill smaller is to keep fewer logs — and the price paid for that decision is paid later, in the incident postmortem you cannot reconstruct.", + items: [ + { + label: "What you write", + tone: "warning", + catch: "Each write is a metered event.", + body: "100 million PUTs per month is a modest production logging workload. On AWS S3 that is $500 in request charges alone, before a single byte of storage is billed.", + }, + { + label: "What you store", + tone: "danger", + catch: "Storage is the smaller line.", + body: "10 TB of compressed log data per month is normal for a mid-size platform. Add storage at $0.023/GB and egress for any query that reads back — the bill closes in on $750 a month before you draw a single dashboard.", + }, + { + label: "What you give up", + tone: "brand", + catch: "The bill picks which events to keep.", + body: "Engineering reacts by sampling. Trace volume gets capped. Debug logs get truncated. The dashboard you finally build only has the events that survived the budget meeting.", + }, + ], + }, - {/* Pricing */} -
-
-
- Pricing - - One rate. {PRICE_PER_TB_MONTH}. - - - Storage. That is the whole bill. No PUT charges. No egress. Logs cost what they should — the bytes you decide to keep. - -
- -

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

-
-
+ comparison: { + label: "How it lands", + heading: ( + <> + A logging sink that doesn't bill per event. + + ), + sub: "Vector, Fluent Bit, Logstash, OpenTelemetry — anything that already writes S3 — gets a new endpoint. The PUT counter stops mattering.", + subMaxWidth: 620, + caption: "Per-request cost at 100M PUTs/month, by provider", + columns: [ + { key: "rate", header: "Rate" }, + { key: "total", header: "Monthly (100M PUTs)", total: true }, + ], + rows: [ + { provider: "AWS S3 Standard", values: { rate: "$0.005 / 1K PUT", total: "$500.00" } }, + { provider: "Google Cloud", values: { rate: "$0.05 / 10K Class A", total: "$500.00" } }, + { provider: "Azure Blob", values: { rate: "$0.055 / 10K writes", total: "$550.00" } }, + { provider: "Wasabi", values: { rate: "$0 per request", total: "$0" } }, + { provider: "Backblaze B2", values: { rate: "$0 per request", total: "$0" } }, + { provider: "Fil One", isFilOne: true, values: { rate: "$0 per request", total: "$0" } }, + ], + footnote: + "Public US rate cards, Q2 2026. Storage and egress not included in this line — they are extra on the metered tiers, and zero on Fil One.", + }, - {/* Dark CTA */} -
-
-
- -
-
-
+ features: { + label: "Why it works", + heading: ( + <> + A sink that scales with retention, not write rate. + + ), + sub: "Same S3 API, same SDKs. The only thing that changes is the line item that used to dominate the bill.", + subMaxWidth: 560, + items: [ + { + icon: Database, + title: "No per-request fees", + desc: "PUT, GET, LIST, HEAD — all included. The line item that dominates a logging workload on AWS does not exist here.", + }, + { + icon: Plug, + title: "S3-compatible logging", + desc: "Vector, Fluent Bit, Logstash, OpenTelemetry collectors, Loki — all of them write S3. Point them at the Fil One endpoint and ship.", + }, + { + icon: ChartLine, + title: "Predictable bill", + desc: "Storage charges grow with what you keep, not with how loudly your services log. A noisy deploy stops being a billing event.", + }, + { + icon: ShieldCheck, + title: "Versioning and Object Lock", + desc: "Immutable audit logs by default. Compliance-mode retention for SOC 2, ISO 27001, and HIPAA evidence retention periods.", + }, + ], + }, -
-
- ); + cta: { + heading: "Keep every log.", + subhead: "Free 1 TB evaluation. Point your existing collector at the endpoint and watch the request line zero out.", + cta: { label: "Start for free", href: signupUrl() }, + secondaryCta: { label: "Talk to an expert", href: SALES_URL }, + note: TAGLINE, + }, }; +const LogRetentionLandingPage = () => ; + export default LogRetentionLandingPage; diff --git a/src/pages/MediaLandingPage.tsx b/src/pages/MediaLandingPage.tsx index 4c9198e..0aab438 100644 --- a/src/pages/MediaLandingPage.tsx +++ b/src/pages/MediaLandingPage.tsx @@ -1,220 +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"; +import LandingPage, { type LandingPageConfig } from "@/components/LandingPage"; +import { PRICE_DISPLAY, PRICE_PER_TB_SHORT } from "@/lib/pricing"; import { signupUrl } from "@/lib/console-url"; +const SALES_URL = "/contact-sales"; -// 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 TAGLINE = "No credit card required · No egress fees · Connects in minutes"; -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({ +// 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: signupUrl(), 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: signupUrl() }, + secondaryCta: { label: "Talk to an expert", href: SALES_URL }, + note: TAGLINE, + }, }; +const MediaLandingPage = () => ; + export default MediaLandingPage; diff --git a/src/pages/MetroLandingPage.tsx b/src/pages/MetroLandingPage.tsx index 741981a..adc2798 100644 --- a/src/pages/MetroLandingPage.tsx +++ b/src/pages/MetroLandingPage.tsx @@ -1,230 +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"; import { signupUrl } from "@/lib/console-url"; -// 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 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: signupUrl(), 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: signupUrl() }, + secondaryCta: { label: "Talk to an expert", href: SALES_URL }, + note: TAGLINE, + }, }; +const MetroLandingPage = () => ; + export default MetroLandingPage; diff --git a/src/pages/MigrateFromS3LandingPage.tsx b/src/pages/MigrateFromS3LandingPage.tsx index 3188fe6..81c3c9b 100644 --- a/src/pages/MigrateFromS3LandingPage.tsx +++ b/src/pages/MigrateFromS3LandingPage.tsx @@ -1,38 +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"; +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"; import { signupUrl } from "@/lib/console-url"; +const SALES_URL = "/contact-sales"; -// 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 +const TAGLINE = "No credit card required · No egress fees · Connects in minutes"; -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, - }, +// 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 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 = [ @@ -52,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", @@ -86,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", @@ -99,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: signupUrl(), 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. @@ -225,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 ────────────────────────────────────────────────────── */} +