From 00fa74d57078177159fd3ddb758974a5f59bdae7 Mon Sep 17 00:00:00 2001
From: jhislop-design
Date: Fri, 15 May 2026 15:15:42 -0600
Subject: [PATCH 1/5] feat(partners): add dedicated Railway Gold partner
landing page
Replaces the generic `partners.$partner` template for Railway with a
purpose-built landing route at `/partners/railway`, in line with the
Gold-tier sponsorship agreement.
The page is built almost entirely from existing tanstack.com primitives
to stay visually and behaviorally consistent with the rest of the site:
- `CodeBlock` (Shiki) for the config and terminal snippets (replaces a
hand-rolled `
` which inherited the global `text-black` rule and
rendered invisible on dark backgrounds)
- `Card` for feature, step, library-fit, pricing and testimonial panels
- `Button` (`as="a"`) for every CTA, with brand-tinted overrides on the
hero and dark CTA section
- `Collapsible` / `CollapsibleTrigger` / `CollapsibleContent` for the
FAQ accordion, controlled by a parent `openFaq` state so only one
answer expands at a time
- `seo()` for title/description/OG/Twitter Card meta
- Existing `PartnerImage` and `railway-{black,white}.svg` brand marks
for the hero
SEO additions:
- Page-specific title + description targeting "deploy tanstack to
railway" and related queries
- Two `application/ld+json` blocks in SSR: the existing partner
`WebPage` schema plus a new `FAQPage` schema generated from the
on-page FAQ for Google rich results + AI search agents
Analytics:
- Fires `partner_viewed` on mount with `placement: 'detail'`
- Fires `partner_clicked` with `destination_host: 'railway.com'` on
every outbound Railway CTA, matching the existing taxonomy in
`analytics/events.ts`
All outbound Railway links carry
`utm_medium=sponsor&utm_source=tanstack&utm_campaign=partner-page`.
The static `/partners/railway` route takes file-routing precedence
over the parametric `/partners/$partner` template, so the legacy
template is preserved untouched for every other partner.
Co-Authored-By: Claude Opus 4.7 (1M context)
---
src/routeTree.gen.ts | 21 +
src/routes/partners.railway.tsx | 728 ++++++++++++++++++++++++++++++++
2 files changed, 749 insertions(+)
create mode 100644 src/routes/partners.railway.tsx
diff --git a/src/routeTree.gen.ts b/src/routeTree.gen.ts
index ca6a34ad..2b028628 100644
--- a/src/routeTree.gen.ts
+++ b/src/routeTree.gen.ts
@@ -53,6 +53,7 @@ import { Route as ShowcaseSubmitRouteImport } from './routes/showcase/submit'
import { Route as ShowcaseIdRouteImport } from './routes/showcase/$id'
import { Route as ShopSearchRouteImport } from './routes/shop.search'
import { Route as ShopCartRouteImport } from './routes/shop.cart'
+import { Route as PartnersRailwayRouteImport } from './routes/partners.railway'
import { Route as PartnersPartnerRouteImport } from './routes/partners.$partner'
import { Route as OauthTokenRouteImport } from './routes/oauth/token'
import { Route as OauthRegisterRouteImport } from './routes/oauth/register'
@@ -373,6 +374,11 @@ const ShopCartRoute = ShopCartRouteImport.update({
path: '/cart',
getParentRoute: () => ShopRoute,
} as any)
+const PartnersRailwayRoute = PartnersRailwayRouteImport.update({
+ id: '/railway',
+ path: '/railway',
+ getParentRoute: () => PartnersRoute,
+} as any)
const PartnersPartnerRoute = PartnersPartnerRouteImport.update({
id: '/$partner',
path: '/$partner',
@@ -949,6 +955,7 @@ export interface FileRoutesByFullPath {
'/oauth/register': typeof OauthRegisterRoute
'/oauth/token': typeof OauthTokenRoute
'/partners/$partner': typeof PartnersPartnerRoute
+ '/partners/railway': typeof PartnersRailwayRoute
'/shop/cart': typeof ShopCartRoute
'/shop/search': typeof ShopSearchRoute
'/showcase/$id': typeof ShowcaseIdRoute
@@ -1086,6 +1093,7 @@ export interface FileRoutesByTo {
'/oauth/register': typeof OauthRegisterRoute
'/oauth/token': typeof OauthTokenRoute
'/partners/$partner': typeof PartnersPartnerRoute
+ '/partners/railway': typeof PartnersRailwayRoute
'/shop/cart': typeof ShopCartRoute
'/shop/search': typeof ShopSearchRoute
'/showcase/$id': typeof ShowcaseIdRoute
@@ -1230,6 +1238,7 @@ export interface FileRoutesById {
'/oauth/register': typeof OauthRegisterRoute
'/oauth/token': typeof OauthTokenRoute
'/partners/$partner': typeof PartnersPartnerRoute
+ '/partners/railway': typeof PartnersRailwayRoute
'/shop/cart': typeof ShopCartRoute
'/shop/search': typeof ShopSearchRoute
'/showcase/$id': typeof ShowcaseIdRoute
@@ -1377,6 +1386,7 @@ export interface FileRouteTypes {
| '/oauth/register'
| '/oauth/token'
| '/partners/$partner'
+ | '/partners/railway'
| '/shop/cart'
| '/shop/search'
| '/showcase/$id'
@@ -1514,6 +1524,7 @@ export interface FileRouteTypes {
| '/oauth/register'
| '/oauth/token'
| '/partners/$partner'
+ | '/partners/railway'
| '/shop/cart'
| '/shop/search'
| '/showcase/$id'
@@ -1657,6 +1668,7 @@ export interface FileRouteTypes {
| '/oauth/register'
| '/oauth/token'
| '/partners/$partner'
+ | '/partners/railway'
| '/shop/cart'
| '/shop/search'
| '/showcase/$id'
@@ -2150,6 +2162,13 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof ShopCartRouteImport
parentRoute: typeof ShopRoute
}
+ '/partners/railway': {
+ id: '/partners/railway'
+ path: '/railway'
+ fullPath: '/partners/railway'
+ preLoaderRoute: typeof PartnersRailwayRouteImport
+ parentRoute: typeof PartnersRoute
+ }
'/partners/$partner': {
id: '/partners/$partner'
path: '/$partner'
@@ -3011,11 +3030,13 @@ const BuilderRouteWithChildren =
interface PartnersRouteChildren {
PartnersPartnerRoute: typeof PartnersPartnerRoute
+ PartnersRailwayRoute: typeof PartnersRailwayRoute
PartnersIndexRoute: typeof PartnersIndexRoute
}
const PartnersRouteChildren: PartnersRouteChildren = {
PartnersPartnerRoute: PartnersPartnerRoute,
+ PartnersRailwayRoute: PartnersRailwayRoute,
PartnersIndexRoute: PartnersIndexRoute,
}
diff --git a/src/routes/partners.railway.tsx b/src/routes/partners.railway.tsx
new file mode 100644
index 00000000..d994be07
--- /dev/null
+++ b/src/routes/partners.railway.tsx
@@ -0,0 +1,728 @@
+import * as React from 'react'
+import { Link, createFileRoute } from '@tanstack/react-router'
+import { ArrowUpRight, Check, Plus } from 'lucide-react'
+import { twMerge } from 'tailwind-merge'
+import { Footer } from '~/components/Footer'
+import { Card } from '~/components/Card'
+import { Button } from '~/ui'
+import {
+ Collapsible,
+ CollapsibleContent,
+ CollapsibleTrigger,
+} from '~/components/Collapsible'
+import { CodeBlock } from '~/components/markdown/CodeBlock'
+import { seo } from '~/utils/seo'
+import { getPartnerById, PartnerImage } from '~/utils/partners'
+import { getPartnerJsonLd } from '~/utils/partner-pages'
+import { trackEvent } from '~/utils/analytics'
+
+const RAILWAY_HREF =
+ 'https://railway.com/new?utm_medium=sponsor&utm_source=tanstack&utm_campaign=partner-page'
+const RAILWAY_DOCS_HREF =
+ 'https://docs.railway.com/?utm_medium=sponsor&utm_source=tanstack&utm_campaign=partner-page'
+const RAILWAY_HOME_HREF =
+ 'https://railway.com/?utm_medium=sponsor&utm_source=tanstack&utm_campaign=partner-page'
+
+const CONFIG_SNIPPET = `import { defineConfig } from '@tanstack/start/config'
+
+export default defineConfig({
+ server: {
+ preset: 'railway', // one line
+ },
+})
+`
+
+const DEPLOY_SNIPPET = `# Deploy in 3 commands
+git init && git add . && git commit -m "init"
+railway login
+railway up
+`
+
+const features: Array<{ icon: string; title: string; desc: string }> = [
+ {
+ icon: 'π',
+ title: 'Auto-detected config',
+ desc: 'Railway reads your TanStack code and sets the right build and run settings automatically. No YAML required.',
+ },
+ {
+ icon: 'π',
+ title: 'PR preview environments',
+ desc: 'Every pull request gets its own live preview environment automatically. No surprises after merging.',
+ },
+ {
+ icon: 'π',
+ title: 'Logs, metrics & alerts',
+ desc: 'Full observability from day one. Custom alerts via Slack, Discord, or email. No third-party tools needed.',
+ },
+ {
+ icon: 'π',
+ title: '100 Gbps private networking',
+ desc: 'Services connect over private IPs at 100 Gbps. HTTP, TCP, gRPC, and WebSockets handled automatically.',
+ },
+ {
+ icon: 'β‘',
+ title: 'One-click rollbacks',
+ desc: 'Every deploy is versioned. Roll back to any previous deployment instantly when something breaks.',
+ },
+ {
+ icon: 'π°',
+ title: 'Hard spending limits',
+ desc: 'The only cloud provider that lets you set hard spend caps. No surprise bills β ever. Pay by the second.',
+ },
+ {
+ icon: 'π',
+ title: 'Global regions',
+ desc: 'Run your TanStack app closer to your users. Deploy to concurrent global regions on Pro and above.',
+ },
+ {
+ icon: 'βΎοΈ',
+ title: 'Unlimited environments',
+ desc: 'Every developer on your team ships simultaneously. Unlimited environments, no conflicts.',
+ },
+]
+
+const steps: Array<{ num: string; title: string; code: string }> = [
+ {
+ num: '01',
+ title: 'Create your TanStack app',
+ code: 'npx create-tsrouter-app my-app',
+ },
+ { num: '02', title: 'Add the Railway preset', code: "preset: 'railway'" },
+ { num: '03', title: 'Deploy', code: 'railway up' },
+]
+
+const pricing: Array<{
+ plan: string
+ price: string
+ note: string
+ features: Array
+ highlight?: boolean
+}> = [
+ {
+ plan: 'Free',
+ price: '$0',
+ note: '30-day trial with $5 credits',
+ features: [
+ 'Up to 1 vCPU / 0.5 GB RAM',
+ '0.5 GB volume storage',
+ 'Community support',
+ 'No credit card required',
+ ],
+ },
+ {
+ plan: 'Hobby',
+ price: '$5',
+ note: 'min/month Β· includes $5 credits',
+ features: [
+ 'Up to 48 vCPU / 48 GB RAM',
+ 'Up to 5 GB storage',
+ '7-day log history',
+ 'Global regions',
+ ],
+ },
+ {
+ plan: 'Pro',
+ price: '$20',
+ note: 'min/month Β· includes $20 credits',
+ features: [
+ 'Up to 1,000 vCPU / 1 TB RAM',
+ 'Up to 1 TB storage',
+ '30-day log history',
+ 'Unlimited workspace seats',
+ 'Concurrent global regions',
+ ],
+ highlight: true,
+ },
+ {
+ plan: 'Enterprise',
+ price: 'Custom',
+ note: 'for teams at scale',
+ features: [
+ 'Up to 2,400 vCPU / 2.4 TB RAM',
+ '90-day log history',
+ 'SSO + RBAC + HIPAA BAA',
+ 'Dedicated VMs',
+ 'Bring your own cloud',
+ ],
+ },
+]
+
+const meteredPricing: Array<[string, string]> = [
+ ['Memory', '$0.000004 / GBΒ·sec'],
+ ['CPU', '$0.000008 / vCPUΒ·sec'],
+ ['Egress', '$0.05 / GB'],
+]
+
+const testimonials: Array<{ quote: string; author: string; role: string }> = [
+ {
+ quote: 'We cut our hosting costs by 75% migrating from Heroku to Railway.',
+ author: 'Dillon Chen',
+ role: 'Founder at Common',
+ },
+ {
+ quote:
+ "I've moved $4.5k/month from AWS and $1k/month from Heroku. My Railway bill is about $300/month.",
+ author: 'John Nunemaker',
+ role: 'Founder at BoxOutSports',
+ },
+ {
+ quote: 'We went from a $1,600 Heroku bill to a $300 Railway bill.',
+ author: 'Brandon Gell',
+ role: 'Head of Consulting at Every',
+ },
+]
+
+const libraries = [
+ 'Start',
+ 'Router',
+ 'Query',
+ 'Table',
+ 'Form',
+ 'DB',
+ 'AI',
+ 'Virtual',
+ 'Pacer',
+ 'Store',
+ 'Devtools',
+ 'CLI',
+]
+
+const libDetails: Array<{ label: string; desc: string }> = [
+ {
+ label: 'TanStack Start',
+ desc: 'Full SSR and streaming support with the Railway preset. Auto-configured Node runtime, zero extra config.',
+ },
+ {
+ label: 'TanStack Router',
+ desc: 'File-based routing apps deploy in SSR and SPA modes. PR previews mean every route change gets a live test environment.',
+ },
+ {
+ label: 'TanStack Query',
+ desc: "Pair with Railway-managed Postgres or Redis. Private networking keeps your server queries inside Railway's infrastructure.",
+ },
+ {
+ label: 'TanStack DB',
+ desc: "Railway's managed databases integrate with TanStack DB's sync engine via 100 Gbps private networking.",
+ },
+]
+
+const faqs: Array<{ q: string; a: string }> = [
+ {
+ q: 'Does Railway support TanStack Start SSR and streaming?',
+ a: "Yes β Railway supports server-side rendering and React streaming out of the box. TanStack Start's SSR and streaming modes work without any special configuration when using the Railway preset.",
+ },
+ {
+ q: 'Can I run a database alongside my TanStack app?',
+ a: "Absolutely. Railway lets you provision Postgres, MySQL, Redis, or MongoDB in the same project as your app. They communicate over Railway's 100 Gbps private network β no VPC setup needed.",
+ },
+ {
+ q: 'How does Railway pricing actually work?',
+ a: 'Railway charges by the second based on actual CPU and memory usage β not provisioned box sizes. The Hobby plan starts at $5/month (which includes $5 of credits). Most hobby TanStack projects run for free or under $5/month.',
+ },
+ {
+ q: 'What makes Railway different from Vercel or Render?',
+ a: 'Railway is a full-stack cloud β not just a frontend host. You can run your TanStack app server, managed databases, background workers, cron jobs, and private networking all in one project. Railway also has hard spending limits, which no other major cloud provider offers.',
+ },
+ {
+ q: 'Does Railway have PR preview environments?',
+ a: 'Yes β every pull request automatically gets its own live preview environment. For TanStack teams, this means you can test routing changes, data fetching behavior, and server logic before merging.',
+ },
+ {
+ q: 'Can I migrate an existing TanStack app to Railway?',
+ a: 'Yes β if your app runs in Node or Docker, Railway deploys it directly from GitHub with no changes required. Railway V3 is faster and cheaper than previous versions, so now is a great time to switch.',
+ },
+]
+
+const PAGE_TITLE = 'Deploy TanStack to Railway β Official Gold Partner'
+const PAGE_DESCRIPTION =
+ 'Deploy TanStack Start, Router, Query, and DB apps to Railway in minutes. One-line Railway preset, PR preview environments, managed databases, 100 Gbps private networking, and hard spending limits. Railway is a TanStack Gold sponsor.'
+
+function getFaqJsonLd() {
+ return {
+ '@context': 'https://schema.org',
+ '@type': 'FAQPage',
+ mainEntity: faqs.map((faq) => ({
+ '@type': 'Question',
+ name: faq.q,
+ acceptedAnswer: {
+ '@type': 'Answer',
+ text: faq.a,
+ },
+ })),
+ }
+}
+
+export const Route = createFileRoute('/partners/railway')({
+ head: () => {
+ const partner = getPartnerById('railway')
+
+ return {
+ meta: seo({
+ title: PAGE_TITLE,
+ description: PAGE_DESCRIPTION,
+ keywords:
+ 'deploy tanstack to railway, tanstack start railway, tanstack router railway, railway hosting, tanstack deployment, railway gold sponsor',
+ image: 'https://tanstack.com/og.png',
+ }),
+ scripts: [
+ ...(partner
+ ? [
+ {
+ type: 'application/ld+json',
+ children: JSON.stringify(getPartnerJsonLd(partner)),
+ },
+ ]
+ : []),
+ {
+ type: 'application/ld+json',
+ children: JSON.stringify(getFaqJsonLd()),
+ },
+ ],
+ }
+ },
+ component: RailwayPartnerPage,
+})
+
+function CheckBadge() {
+ return (
+
+
+
+ )
+}
+
+function trackRailwayClick() {
+ trackEvent('partner_clicked', {
+ partner_id: 'railway',
+ placement: 'detail',
+ destination: 'external',
+ destination_host: 'railway.com',
+ })
+}
+
+function RailwayCodeExample({
+ code,
+ lang,
+ title,
+}: {
+ code: string
+ lang: string
+ title: string
+}) {
+ return (
+
+ {code}
+
+ )
+}
+
+function RailwayPartnerPage() {
+ const [openFaq, setOpenFaq] = React.useState(null)
+
+ React.useEffect(() => {
+ trackEvent('partner_viewed', {
+ partner_id: 'railway',
+ placement: 'detail',
+ })
+ }, [])
+
+ const partner = getPartnerById('railway')
+
+ return (
+
+
+
+
+ {/* Hero */}
+
+
+ {partner ? (
+
+
+
+ ) : null}
+
+
+ Gold Sponsor Β· Deployment & Hosting
+
+
+
+
+ Railway V3 β faster and cheaper
+
+
+
+
+
+
+ Ship TanStack apps
+
+ peacefully with Railway
+
+
+
+ Railway is the all-in-one intelligent cloud platform trusted by 2M+
+ developers. Deploy your TanStack Start, Router, and Query apps with
+ zero infrastructure complexity β and pay only for what you actually
+ use.
+
+
+
+ "Services that took 1 week to configure elsewhere take 1 day to
+ spin up in Railway." β Daniel Lobaton, CTO at G2X
+
+
+
+
+
+
+
+
+ {/* Stats */}
+
+ {[
+ ['2M+', 'Developers on Railway'],
+ ['< 2 min', 'Time to first deploy'],
+ ['100 Gbps', 'Private networking'],
+ ['$0', 'To get started'],
+ ].map(([value, label]) => (
+
+
{value}
+
+ {label}
+
+
+ ))}
+
+
+ {/* Features */}
+
+
+ Why TanStack teams choose Railway
+
+
+ Railway eliminates infrastructure complexity so your team ships
+ faster. Here's what makes it the right fit for TanStack developers.
+
+
+ {features.map(({ icon, title, desc }) => (
+
+
{icon}
+
{title}
+
+ {desc}
+
+
+ ))}
+
+
+
+ {/* How it works */}
+
+
+ From zero to deployed in 3 steps
+
+
+ Railway has first-class support for TanStack Start. One config line
+ is all it takes.
+
+
+
+ {steps.map(({ num, title, code }) => (
+
+
+ {num}
+
+
+
{title}
+
+ {code}
+
+
+
+ ))}
+
+
+
+
+
+
+
+
+ {/* Library fit */}
+
+
+ Works with every TanStack library
+
+
+ From full-stack apps with TanStack Start to lightweight React apps
+ using Router and Query β Railway deploys them all.
+
+
+
+ {libraries.map((lib) => (
+
+ {lib}
+
+ ))}
+
+
+
+ {libDetails.map(({ label, desc }) => (
+
+
+
+ {label}
+
+
+ {desc}
+
+
+ ))}
+
+
+
+ {/* Pricing */}
+
+
+ Pricing that scales with you
+
+
+ Railway charges by the second based on actual usage β not
+ provisioned box sizes. Most TanStack hobby projects run free or
+ under $5/month.
+
- "Services that took 1 week to configure elsewhere take 1 day to
- spin up in Railway." β Daniel Lobaton, CTO at G2X
+ "Services that took 1 week to configure elsewhere take 1 day to spin
+ up in Railway." β Daniel Lobaton, CTO at G2X
@@ -547,8 +542,7 @@ function RailwayPartnerPage() {
key={plan}
className={twMerge(
'relative p-5 shadow-none',
- highlight &&
- 'border-2 border-blue-500 dark:border-blue-400',
+ highlight && 'border-2 border-blue-500 dark:border-blue-400',
)}
>
{highlight ? (
From c5ffd094a7b710e5999c6a46683be654479d3c62 Mon Sep 17 00:00:00 2001
From: jhislop-design
Date: Mon, 18 May 2026 09:17:59 -0600
Subject: [PATCH 3/5] feat(partners/railway): polish copy + add mid-page CTAs
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Voice + conversion pass before shipping. The hero, feature cards, and
section headings now match TanStack's restrained, pragmatic tone instead
of echoing Railway's own marketing site.
Copy changes:
- Hero paragraph rewritten using the same framing as
`partnerGuidance.railway` in `partner-pages.ts` (drop "all-in-one
intelligent cloud platform trusted by 2M+ developers" β that's
Railway's tagline, not TanStack's voice)
- Feature card descriptions tightened to be outcome-focused
("No YAML to maintain.", "Test routing, data, and server logic
before merging.")
- Replace emoji feature icons with Lucide icons (Rocket,
GitPullRequest, LineChart, Network, Undo2, ShieldCheck, Globe,
Infinity) to match the site's icon language
- Testimonial section heading "Teams are saving big on infrastructure"
β "What teams say after switching" + a neutral framing line
CTAs:
The page previously had only the hero CTA + final CTA section, leaving
~6 content sections between them with no out-link. Added three mid-page
CTA blocks and varied the labels so no two CTAs read the same:
- Hero primary: "Deploy free in 2 minutes" (+ "No credit card Β· $5 in
trial credits on signup" microcopy)
- After how-it-works code blocks: "Try the Railway preset" + "Read the
deployment guide"
- After pricing tiers: "Start with $5 in credits" + "Estimate your
costs" (new link to railway.com/pricing)
- After testimonials: "Move your app to Railway" + per-second-billing
microcopy
- Final CTA: "Deploy your TanStack app" + "Open the docs"
Outbound railway.com links: 4 β 9, all distinct labels, all carrying
the partner-page UTM.
Co-Authored-By: Claude Opus 4.7 (1M context)
---
src/routes/partners.railway.tsx | 156 +++++++++++++++++++++++++-------
1 file changed, 123 insertions(+), 33 deletions(-)
diff --git a/src/routes/partners.railway.tsx b/src/routes/partners.railway.tsx
index bc62920a..0954c3f2 100644
--- a/src/routes/partners.railway.tsx
+++ b/src/routes/partners.railway.tsx
@@ -1,6 +1,19 @@
import * as React from 'react'
import { Link, createFileRoute } from '@tanstack/react-router'
-import { ArrowUpRight, Check, Plus } from 'lucide-react'
+import {
+ ArrowUpRight,
+ Check,
+ DollarSign,
+ GitPullRequest,
+ Globe,
+ Infinity as InfinityIcon,
+ LineChart,
+ Network,
+ Plus,
+ Rocket,
+ ShieldCheck,
+ Undo2,
+} from 'lucide-react'
import { twMerge } from 'tailwind-merge'
import { Footer } from '~/components/Footer'
import { Card } from '~/components/Card'
@@ -22,6 +35,8 @@ const RAILWAY_DOCS_HREF =
'https://docs.railway.com/?utm_medium=sponsor&utm_source=tanstack&utm_campaign=partner-page'
const RAILWAY_HOME_HREF =
'https://railway.com/?utm_medium=sponsor&utm_source=tanstack&utm_campaign=partner-page'
+const RAILWAY_PRICING_HREF =
+ 'https://railway.com/pricing?utm_medium=sponsor&utm_source=tanstack&utm_campaign=partner-page'
const CONFIG_SNIPPET = `import { defineConfig } from '@tanstack/start/config'
@@ -38,46 +53,48 @@ railway login
railway up
`
-const features: Array<{ icon: string; title: string; desc: string }> = [
+type FeatureIcon = React.ComponentType<{ className?: string }>
+
+const features: Array<{ Icon: FeatureIcon; title: string; desc: string }> = [
{
- icon: 'π',
+ Icon: Rocket,
title: 'Auto-detected config',
- desc: 'Railway reads your TanStack code and sets the right build and run settings automatically. No YAML required.',
+ desc: 'Railway reads your TanStack code and picks the right build and run settings. No YAML to maintain.',
},
{
- icon: 'π',
- title: 'PR preview environments',
- desc: 'Every pull request gets its own live preview environment automatically. No surprises after merging.',
+ Icon: GitPullRequest,
+ title: 'Live PR previews',
+ desc: 'Every pull request spins up its own environment. Test routing, data, and server logic before merging.',
},
{
- icon: 'π',
- title: 'Logs, metrics & alerts',
- desc: 'Full observability from day one. Custom alerts via Slack, Discord, or email. No third-party tools needed.',
+ Icon: LineChart,
+ title: 'Logs, metrics, and alerts',
+ desc: 'Observability is built in. Pipe custom alerts to Slack, Discord, or email without a third-party agent.',
},
{
- icon: 'π',
+ Icon: Network,
title: '100 Gbps private networking',
- desc: 'Services connect over private IPs at 100 Gbps. HTTP, TCP, gRPC, and WebSockets handled automatically.',
+ desc: 'Services in a project talk over private IPs at 100 Gbps. HTTP, TCP, gRPC, and WebSockets handled for you.',
},
{
- icon: 'β‘',
+ Icon: Undo2,
title: 'One-click rollbacks',
- desc: 'Every deploy is versioned. Roll back to any previous deployment instantly when something breaks.',
+ desc: 'Every deploy is versioned. Roll back to a previous deployment instantly when something breaks.',
},
{
- icon: 'π°',
+ Icon: ShieldCheck,
title: 'Hard spending limits',
- desc: 'The only cloud provider that lets you set hard spend caps. No surprise bills β ever. Pay by the second.',
+ desc: 'Set a hard cap on what a project can spend. Billing is per-second, so you only pay for actual compute.',
},
{
- icon: 'π',
+ Icon: Globe,
title: 'Global regions',
- desc: 'Run your TanStack app closer to your users. Deploy to concurrent global regions on Pro and above.',
+ desc: 'Run your app close to your users. Pro and above can deploy to multiple regions concurrently.',
},
{
- icon: 'βΎοΈ',
+ Icon: InfinityIcon,
title: 'Unlimited environments',
- desc: 'Every developer on your team ships simultaneously. Unlimited environments, no conflicts.',
+ desc: 'Spin up as many staging, preview, or branch environments as your team needs. No per-env fees.',
},
]
@@ -235,7 +252,7 @@ const faqs: Array<{ q: string; a: string }> = [
const PAGE_TITLE = 'Deploy TanStack to Railway β Official Gold Partner'
const PAGE_DESCRIPTION =
- 'Deploy TanStack Start, Router, Query, and DB apps to Railway in minutes. One-line Railway preset, PR preview environments, managed databases, 100 Gbps private networking, and hard spending limits. Railway is a TanStack Gold sponsor.'
+ 'Railway gives TanStack teams a single place to run app services, databases, and supporting infrastructure. One-line Railway preset for TanStack Start, live PR previews, 100 Gbps private networking, and hard spending limits. Pay per second for the compute you actually use.'
function getFaqJsonLd() {
return {
@@ -374,15 +391,15 @@ function RailwayPartnerPage() {
- Railway is the all-in-one intelligent cloud platform trusted by 2M+
- developers. Deploy your TanStack Start, Router, and Query apps with
- zero infrastructure complexity β and pay only for what you actually
- use.
+ Railway gives TanStack teams a single place to run app services,
+ databases, and supporting infrastructure. Deploy a TanStack Start
+ app from GitHub or the CLI β and only pay per-second for the
+ compute you actually use.
- "Services that took 1 week to configure elsewhere take 1 day to spin
- up in Railway." β Daniel Lobaton, CTO at G2X
+ "Services that took 1 week to configure elsewhere take 1 day to
+ spin up in Railway." β Daniel Lobaton, CTO at G2X
@@ -395,13 +412,16 @@ function RailwayPartnerPage() {
size="lg"
className="bg-gray-950 text-white border-gray-950 hover:bg-gray-800 dark:bg-white dark:text-gray-950 dark:border-white dark:hover:bg-gray-200"
>
- Start deploying free
+ Deploy free in 2 minutes
See how it works
+
+ No credit card required. $5 in trial credits on signup.
+
{/* Stats */}
@@ -431,9 +451,9 @@ function RailwayPartnerPage() {
faster. Here's what makes it the right fit for TanStack developers.
{desc}
@@ -487,6 +507,30 @@ function RailwayPartnerPage() {
title="terminal"
/>
+
+
+
+ Try the Railway preset
+
+
+
+ Read the deployment guide
+
+
{/* Library fit */}
@@ -587,13 +631,41 @@ function RailwayPartnerPage() {
))}
+
+
+
+ Start with $5 in credits
+
+
+
+ Estimate your costs
+
+
{/* Testimonials */}
- Teams are saving big on infrastructure
+ What teams say after switching
+
+ Real teams, real bills. These are quotes from founders and
+ engineers who moved their production workloads onto Railway.
+
{testimonials.map(({ quote, author, role }) => (
@@ -609,6 +681,24 @@ function RailwayPartnerPage() {
))}
+
+
+
+ Move your app to Railway
+
+
+
+
+ Per-second billing Β· no credit card required
+
+
{/* FAQ */}
@@ -678,7 +768,7 @@ function RailwayPartnerPage() {
size="lg"
className="bg-white text-gray-950 border-white hover:bg-gray-100"
>
- Start deploying free
+ Deploy your TanStack app
- Read the deployment guide
+ Open the docs
From 9c3e517386cd8c32fe3cde2f7b2edb1c58e6af8b Mon Sep 17 00:00:00 2001
From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com>
Date: Mon, 18 May 2026 15:19:06 +0000
Subject: [PATCH 4/5] ci: apply automated fixes
---
src/routes/partners.railway.tsx | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/src/routes/partners.railway.tsx b/src/routes/partners.railway.tsx
index 0954c3f2..8946a4b6 100644
--- a/src/routes/partners.railway.tsx
+++ b/src/routes/partners.railway.tsx
@@ -393,13 +393,13 @@ function RailwayPartnerPage() {
Railway gives TanStack teams a single place to run app services,
databases, and supporting infrastructure. Deploy a TanStack Start
- app from GitHub or the CLI β and only pay per-second for the
- compute you actually use.
+ app from GitHub or the CLI β and only pay per-second for the compute
+ you actually use.
- "Services that took 1 week to configure elsewhere take 1 day to
- spin up in Railway." β Daniel Lobaton, CTO at G2X
+ "Services that took 1 week to configure elsewhere take 1 day to spin
+ up in Railway." β Daniel Lobaton, CTO at G2X
@@ -663,8 +663,8 @@ function RailwayPartnerPage() {
What teams say after switching
- Real teams, real bills. These are quotes from founders and
- engineers who moved their production workloads onto Railway.
+ Real teams, real bills. These are quotes from founders and engineers
+ who moved their production workloads onto Railway.
{testimonials.map(({ quote, author, role }) => (
From dd34eaecada76e1522578bec9db7ff992710e874 Mon Sep 17 00:00:00 2001
From: jhislop-design
Date: Mon, 18 May 2026 10:20:31 -0600
Subject: [PATCH 5/5] fix(partners/railway): use the canonical @tanstack/cli
scaffolder
Step 01 was `npx create-tsrouter-app my-app`, which is the older
router-only scaffolder. The TanStack Start docs recommend the unified
CLI for new apps, so match the official getting-started instructions.
Co-Authored-By: Claude Opus 4.7 (1M context)
---
src/routes/partners.railway.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/routes/partners.railway.tsx b/src/routes/partners.railway.tsx
index 8946a4b6..eb47b83d 100644
--- a/src/routes/partners.railway.tsx
+++ b/src/routes/partners.railway.tsx
@@ -102,7 +102,7 @@ const steps: Array<{ num: string; title: string; code: string }> = [
{
num: '01',
title: 'Create your TanStack app',
- code: 'npx create-tsrouter-app my-app',
+ code: 'npx @tanstack/cli@latest create',
},
{ num: '02', title: 'Add the Railway preset', code: "preset: 'railway'" },
{ num: '03', title: 'Deploy', code: 'railway up' },