Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
d94627a
chore: upgrade @vercel/geistdocs to 1.17.1
christopherkindl Jul 28, 2026
dbe94ff
refactor: use default navbarOssProducts list instead of a custom over…
christopherkindl Jul 28, 2026
66a21c4
fix: use bg-background-200 for docs surfaces to match the template
christopherkindl Jul 28, 2026
8de1a0c
style: adopt package text-heading-* utilities for homepage headings
christopherkindl Jul 28, 2026
8ebd3ee
style: adopt package text-heading-* utilities for worlds headings
christopherkindl Jul 28, 2026
37490ce
style: remove the bordered grid framing from the homepage
christopherkindl Jul 28, 2026
d670ed1
style: remove vertical column dividers from homepage sections
christopherkindl Jul 28, 2026
4f21aea
style: make the homepage "Get started" CTA button rounded-full
christopherkindl Jul 28, 2026
bf849f7
style: use text-heading-* for the feature-grid paragraph text
christopherkindl Jul 28, 2026
fdf172e
style: fade out the run-anywhere provider logos at the left/right edges
christopherkindl Jul 29, 2026
fef3030
style: widen the right-edge fade on the Vercel dashboard viz
christopherkindl Jul 29, 2026
455aa31
style: add spacing between the Vercel, use-cases, and templates sections
christopherkindl Jul 29, 2026
1630458
style: widen the homepage layout from 1080px to 1200px
christopherkindl Jul 29, 2026
5e96623
style: align use-cases code block and templates cards with the Vercel…
christopherkindl Jul 29, 2026
eda111e
style: extend use-cases/templates content to the right layout edge
christopherkindl Jul 29, 2026
fe23d4e
style: remove the divider between the two feature cards
christopherkindl Jul 29, 2026
656d73b
refactor: position homepage sections on a shared 12-col grid
christopherkindl Jul 30, 2026
44dbd00
style: align homepage width with the navbar content
christopherkindl Jul 30, 2026
37c505b
refactor: handle homepage horizontal padding at the root container
christopherkindl Jul 30, 2026
b01e289
style: left-align content sections on mobile + fix run-anywhere/o11y viz
christopherkindl Jul 30, 2026
6be7016
style: anchor run-anywhere provider cards to overlap the code block
christopherkindl Jul 30, 2026
77f14d9
style: make the reliability-as-code example fill its column to the ri…
christopherkindl Jul 30, 2026
2c40468
style: split feature-card copy into a title + description
christopherkindl Jul 30, 2026
c5ce0a3
update
christopherkindl Jul 30, 2026
3c33a57
update
christopherkindl Jul 30, 2026
e303db0
style: give the tweet cards a bg-background-100 surface
christopherkindl Jul 30, 2026
4092606
Merge branch 'main' into chore/upgrade-geistdocs-1.17.1
christopherkindl Jul 31, 2026
d85d2f9
fix(swc-playground): pin monaco-editor to 0.55.1
christopherkindl Jul 31, 2026
b1d42f4
update
christopherkindl Jul 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions docs/app/[lang]/(home)/components/cta.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ import { Button } from '@vercel/geistdocs/components/button';
import Link from 'next/link';

export const CTA = () => (
<section className="px-8 sm:px-12 py-10 flex flex-col md:flex-row md:items-center md:justify-between gap-4">
<h2 className="font-semibold text-xl tracking-tight sm:text-2xl md:text-3xl lg:text-[40px]">
<section className="py-10 flex flex-col md:flex-row md:items-center md:justify-between gap-4">
<h2 className="text-heading-20 sm:text-heading-24 md:text-heading-32 lg:text-heading-40">
Create your first workflow today.
</h2>
<Button asChild size="lg" className="w-fit h-10">
<Button asChild size="lg" className="w-fit h-10 rounded-full">
<Link href="/docs/getting-started">Get started</Link>
</Button>
</section>
Expand Down
6 changes: 2 additions & 4 deletions docs/app/[lang]/(home)/components/features.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,10 @@ const data = [
];

export const Features = () => (
<div className="px-4 py-8 sm:py-12 sm:px-12 grid md:grid-cols-3 gap-8">
<div className="py-8 sm:py-12 grid md:grid-cols-3 gap-8">
{data.map((item) => (
<div key={item.title}>
<h3 className="mb-2 font-semibold text-lg tracking-tight">
{item.title}
</h3>
<h3 className="mb-2 text-heading-20">{item.title}</h3>
<p className="text-muted-foreground">{item.description}</p>
</div>
))}
Expand Down
6 changes: 3 additions & 3 deletions docs/app/[lang]/(home)/components/frameworks.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -719,16 +719,16 @@ export const Next = (props: ComponentProps<'svg'>) => (

export const Frameworks = () => {
return (
<div className="flex flex-col items-center gap-8 px-4 py-12 sm:py-16 sm:px-12 text-center">
<div className="flex flex-col items-start sm:items-center gap-8 py-12 sm:py-16 text-left sm:text-center">
<div className="flex flex-col gap-3 max-w-xl">
<h2 className="font-semibold text-xl tracking-tight sm:text-2xl md:text-3xl">
<h2 className="text-heading-20 sm:text-heading-24 md:text-heading-32 lg:text-heading-40">
Universally Compatible
</h2>
<p className="text-muted-foreground sm:text-lg">
Works with the frameworks you already use with more coming soon.
</p>
</div>
<div className="flex flex-wrap justify-center gap-6 items-center max-w-xl">
<div className="flex flex-wrap justify-start sm:justify-center gap-6 items-center max-w-xl">
<Link
href="/docs/getting-started/next"
className="hover:opacity-70 transition-opacity duration-200"
Expand Down
6 changes: 3 additions & 3 deletions docs/app/[lang]/(home)/components/hero.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,12 @@ type HeroProps = {

export const Hero = ({ title, description }: HeroProps) => {
return (
<section className="mt-[var(--fd-nav-height)] space-y-6 px-4 pt-24 sm:pt-32 pb-32 text-center">
<section className="mt-[var(--fd-nav-height)] space-y-6 pt-24 sm:pt-32 pb-32 text-center">
<div className="mx-auto w-full max-w-4xl space-y-5">
<h1 className="text-center font-semibold text-4xl leading-[1.1] tracking-tight lg:font-semibold sm:text-5xl! xl:text-6xl! text-balance">
<h1 className="text-center text-balance text-heading-40 sm:text-heading-48 xl:text-heading-64">
{title}
</h1>
<p className="text-balance max-w-3xl mx-auto text-muted-foreground sm:text-xl leading-relaxed">
<p className="text-balance max-w-3xl mx-auto text-muted-foreground text-copy-18 leading-relaxed">
<span className="font-mono text-base bg-accent inline-block px-2 py-0 rounded-sm border border-border">
use workflow
</span>{' '}
Expand Down
10 changes: 5 additions & 5 deletions docs/app/[lang]/(home)/components/implementation.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ export async function userSignup(email) {
},
{
code: `import { Resend } from 'resend';
import { FatalError } from 'workflow';
import { FatalError } from 'workflow';

export async function sendWelcomeEmail(email) {
"use step"
Expand All @@ -52,22 +52,22 @@ export async function sendWelcomeEmail(email) {
];

export const Implementation = () => (
<div className="px-4 py-8 sm:py-12 sm:px-12 grid gap-12">
<div className="py-8 sm:py-12 grid gap-12">
<div className="max-w-3xl text-balance grid gap-2">
<h2 className="font-semibold text-xl tracking-tight sm:text-2xl md:text-3xl lg:text-[40px]">
<h2 className="text-heading-20 sm:text-heading-24 md:text-heading-32 lg:text-heading-40">
Effortless setup
</h2>
<p className="text-balance text-lg text-muted-foreground">
With a simple declarative API to define and use your workflows.
</p>
</div>
<div className="grid md:grid-cols-2 gap-8">
<div className="grid md:grid-cols-2 gap-6 md:gap-24">
{data.map((item) => (
<div
key={item.caption}
className="h-full flex flex-col [&_figure]:flex-1 [&_.fd-scroll-container]:h-full gap-4"
>
<h3 className="text-lg sm:text-xl md:text-2xl font-semibold tracking-tight">
<h3 className="text-heading-16 sm:text-heading-20 md:text-heading-24">
{item.caption}
</h3>
<CodeBlock
Expand Down
8 changes: 4 additions & 4 deletions docs/app/[lang]/(home)/components/intro/intro.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -144,17 +144,17 @@ export const Intro = async () => {
);

return (
<div className="grid grid-cols-1 lg:grid-cols-[330px_1fr] gap-12 px-4 py-8 sm:py-12 sm:px-12">
<div className=" flex flex-col gap-2">
<h2 className="font-semibold text-xl tracking-tight sm:text-2xl md:text-3xl lg:text-[40px]">
<div className="grid grid-cols-12 gap-y-12 md:gap-x-8 py-8 sm:py-12">
<div className="col-span-12 md:col-span-5 flex flex-col gap-2">
<h2 className="text-heading-20 sm:text-heading-24 md:text-heading-32 lg:text-heading-40">
Reliability-as-code
</h2>
<p className="text-lg text-muted-foreground md:mt-4">
Move from hand-rolled queues and custom retries to durable, resumable
code with simple directives.
</p>
</div>
<div className="flex items-center justify-center">
<div className="col-span-12 md:col-span-7">
<IntroTabs
withWorkflow={
<WorkflowExample
Expand Down
2 changes: 1 addition & 1 deletion docs/app/[lang]/(home)/components/intro/non-workflow.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ export const NonWorkflowExample = ({
};

return (
<div className="relative isolate max-w-3xl mx-auto">
<div className="relative isolate w-full">
<div className="bg-background border rounded-md overflow-x-auto pb-[52px]">
<div className="relative">
<div className="flex absolute z-10 flex-col left-[18px] top-[69px] pointer-events-none select-none">
Expand Down
2 changes: 1 addition & 1 deletion docs/app/[lang]/(home)/components/intro/workflow.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ export const WorkflowExample = ({
};

return (
<div className="relative isolate max-w-3xl mx-auto">
<div className="relative isolate w-full">
<div className="bg-background border rounded-md overflow-x-auto pb-[52px]">
<div className="relative">
<div className="flex absolute z-10 flex-col left-[18px] top-[69px] pointer-events-none select-none">
Expand Down
2 changes: 1 addition & 1 deletion docs/app/[lang]/(home)/components/observability.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ const rows = [
];

export const Observability = () => (
<div className="grid grid-rows-[auto_1fr] gap-12 px-4 py-8 sm:py-12 sm:px-12">
<div className="grid grid-rows-[auto_1fr] gap-12 py-8 sm:py-12">
<h2 className="font-medium text-xl tracking-tight sm:text-2xl text-muted-foreground">
<span className="text-foreground">Observability</span>. Inspect every run
end‑to‑end. Pause, replay, and time‑travel through steps with traces,
Expand Down
12 changes: 6 additions & 6 deletions docs/app/[lang]/(home)/components/run-anywhere.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -116,18 +116,18 @@ const code = `export async function welcome(userId: string) {
}`;

export const RunAnywhere = () => (
<div className="px-4 py-8 sm:py-12 sm:px-12 grid gap-10 items-center overflow-hidden">
<div className="py-8 sm:py-12 grid gap-10 items-center overflow-hidden">
<div className="space-y-4">
<div className="grid gap-4 max-w-lg text-center mx-auto">
<h2 className="font-semibold text-xl tracking-tight sm:text-2xl md:text-3xl lg:text-[40px]">
<div className="grid gap-4 max-w-lg text-left sm:text-center sm:mx-auto">
<h2 className="text-heading-20 sm:text-heading-24 md:text-heading-32 lg:text-heading-40">
Run anywhere, no lock‑in
</h2>
<p className="text-lg text-muted-foreground">
Run locally, self-host, or swap every component — Workflow SDK is
fully portable. For zero-config, secure, and scalable workflows,
deploy on Vercel.
</p>
<div className="flex flex-col sm:flex-row items-center justify-center gap-3 mt-2">
<div className="flex flex-col sm:flex-row items-start sm:items-center sm:justify-center gap-3 mt-2">
<Button asChild className="rounded-full h-10">
<Link href="https://vercel.com/workflows" target="_blank">
Workflows on Vercel
Expand All @@ -141,7 +141,7 @@ export const RunAnywhere = () => (
</div>
</div>
<div className="relative isolate">
<div className="absolute -left-32 top-1/2 -translate-y-1/2 hidden md:flex items-center gap-2">
<div className="absolute right-[calc(50%+140px)] top-1/2 -translate-y-1/2 hidden md:flex items-center gap-2 [mask-image:linear-gradient(to_right,transparent,black)]">
{[DigitalOcean, AWS].map((Logo, index) => (
<div
className={cn(
Expand All @@ -166,7 +166,7 @@ export const RunAnywhere = () => (
}}
/>
</div>
<div className="absolute -right-32 top-1/2 -translate-y-1/2 hidden md:flex items-center gap-2">
<div className="absolute left-[calc(50%+140px)] top-1/2 -translate-y-1/2 hidden md:flex items-center gap-2 [mask-image:linear-gradient(to_left,transparent,black)]">
{[Docker, Vercel].map((Logo, index) => (
<div
className={cn(
Expand Down
10 changes: 5 additions & 5 deletions docs/app/[lang]/(home)/components/templates/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -38,19 +38,19 @@ const data = [
];

export const Templates = () => (
<div className="grid md:grid-cols-[1fr_2fr] md:divide-x">
<div className="grid gap-4 content-start px-4 py-8 sm:py-12 sm:px-12">
<h2 className="font-semibold text-xl tracking-tight sm:text-2xl md:text-3xl lg:text-[40px]">
<div className="grid grid-cols-12 gap-y-12 md:gap-x-8 py-8 sm:py-12">
<div className="col-span-12 md:col-span-5 grid gap-4 content-start">
<h2 className="text-heading-20 sm:text-heading-24 md:text-heading-32 lg:text-heading-40 lg:text-heading-40">
Get started
</h2>
<p className="text-lg text-muted-foreground">
<p className="text-lg text-muted-foreground text-balance sm:max-w-md">
See Workflow SDK in action with one of the example templates.
</p>
<Button asChild size="lg" className="rounded-full h-10 px-6 w-fit mt-2">
<Link href={examplesRepositoryUrl}>All examples</Link>
</Button>
</div>
<div className="grid sm:grid-cols-2 gap-8 px-4 py-8 sm:py-12 sm:px-12">
<div className="col-span-12 md:col-span-7 grid sm:grid-cols-2 gap-8">
{data.map((item) => (
<a
key={item.title}
Expand Down
8 changes: 4 additions & 4 deletions docs/app/[lang]/(home)/components/tweet-wall.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@ function TweetCard({ url, name, username, image, tweet }: Tweet) {
href={url}
target="_blank"
rel="noopener noreferrer"
className="flex flex-col gap-3 rounded-lg border p-4 md:p-5 hover:border-foreground/20 transition-colors"
className="flex flex-col gap-3 rounded-lg border bg-background-100 p-4 md:p-5 hover:border-foreground/20 transition-colors"
>
<div className="flex items-center gap-2.5">
<Avatar className="size-9">
Expand All @@ -236,11 +236,11 @@ function TweetCard({ url, name, username, image, tweet }: Tweet) {
}

export const TweetWall = () => (
<div className="p-8 sm:p-12 px-4 py-8 sm:py-12 sm:px-12 grid gap-8">
<h2 className="font-semibold text-xl tracking-tight sm:text-2xl md:text-3xl lg:text-[40px] text-center text-balance">
<div className="py-8 sm:py-12 grid gap-8">
<h2 className="text-heading-20 sm:text-heading-24 md:text-heading-32 lg:text-heading-40 sm:text-center sm:text-balance">
What builders say about Workflow SDK
</h2>
<div className="columns-1 gap-4 space-y-4 md:columns-2 lg:columns-3">
<div className="columns-1 gap-4 space-y-4 md:columns-2 lg:columns-3 mt-6">
{TWEETS.map((tweet) => (
<div key={tweet.username} className="break-inside-avoid">
<TweetCard {...tweet} />
Expand Down
10 changes: 5 additions & 5 deletions docs/app/[lang]/(home)/components/use-cases-client.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,12 @@ export const UseCasesClient = ({ useCases }: { useCases: UseCase[] }) => {
};

return (
<div className="grid sm:grid-cols-3 sm:divide-x px-4 py-8 sm:p-0 gap-12 sm:gap-0">
<div className="text-balance flex flex-col gap-2 sm:p-12">
<h2 className="font-semibold text-xl tracking-tight sm:text-2xl md:text-3xl flex flex-wrap sm:block items-center gap-x-2">
<div className="grid grid-cols-12 gap-y-12 md:gap-x-8 py-8 sm:py-12">
<div className="col-span-12 md:col-span-5 text-balance flex flex-col gap-2">
<h2 className="text-heading-20 sm:text-heading-24 md:text-heading-32 lg:text-heading-40 flex flex-wrap sm:block items-center gap-x-2">
Build anything with
<Select value={selectedCase} onValueChange={handleCaseChange}>
<SelectTrigger className="font-semibold bg-background text-xl tracking-tight sm:text-2xl md:text-3xl data-[size=default]:h-auto py-1.5 w-auto sm:mt-1.5 sm:-ml-3">
<SelectTrigger className="text-heading-20 sm:text-heading-24 md:text-heading-32 lg:text-heading-40 bg-background data-[size=default]:h-auto py-1.5 w-auto sm:mt-1.5 sm:-ml-3">
<SelectValue />
</SelectTrigger>
<SelectContent>
Expand All @@ -49,7 +49,7 @@ export const UseCasesClient = ({ useCases }: { useCases: UseCase[] }) => {
persistence, and observability built in.
</p>
</div>
<div className="col-span-2 sm:p-12">{currentCase.codeBlock}</div>
<div className="col-span-12 md:col-span-7">{currentCase.codeBlock}</div>
</div>
);
};
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import { Button } from '@vercel/geistdocs/components/button';
import Link from 'next/link';
import type { JSX, ReactNode } from 'react';
import { AgentsVisual } from './agents-visual';
import { AiSdkVisual } from './ai-sdk-visual';
Expand All @@ -13,19 +11,19 @@ interface Feature {

const features: Feature[] = [
{
title: 'Deep integration with AI SDK.',
title: 'Deep integration with AI SDK',
description:
'Use familiar AI SDK patterns, plus durability, observability, and retries so agents stay reliable in production.',
visual: <AiSdkVisual />,
},
{
title: 'Durable agents by default.',
title: 'Durable agents by default',
description:
'High-performance streaming, persistence, and resumable runs work out of the box. No infrastructure setup required.',
visual: <AgentsVisual />,
},
{
title: 'Inspect every run end\u2011to\u2011end.',
title: 'Inspect every run end\u2011to\u2011end',
description:
'Observability is built into the SDK and works anywhere you run it. When using workflow on Vercel, observability is built into the Vercel dashboard with no configuration or storage.',
visual: <O11yVisual />,
Expand All @@ -34,11 +32,15 @@ const features: Feature[] = [

function FeatureCard({ title, description, visual }: Feature): JSX.Element {
return (
<div className="flex flex-col items-stretch justify-between gap-6 md:gap-10 px-4 py-8 sm:py-12 sm:px-12">
<p className="text-[20px] leading-[26px] tracking-[-0.4px] font-medium text-gray-900 lg:text-[24px] lg:leading-[32px] lg:tracking-[-0.96px]">
<strong className="font-semibold text-gray-1000">{title}</strong>{' '}
{description}
</p>
<div className="flex flex-col items-stretch justify-between gap-6 md:gap-10 py-8 sm:py-12">
<div className="flex flex-col gap-2">
<h3 className="text-heading-20 sm:text-heading-24 lg:text-heading-32">
{title}
</h3>
<p className="text-lg text-muted-foreground sm:max-w-lg">
{description}
</p>
</div>
<div className="@container flex items-center justify-center overflow-hidden">
{visual}
</div>
Expand All @@ -48,23 +50,25 @@ function FeatureCard({ title, description, visual }: Feature): JSX.Element {

function FeatureCardWide({ title, description, visual }: Feature): JSX.Element {
return (
<div className="flex flex-col items-center gap-8 md:gap-12 px-4 py-8 sm:py-12 sm:px-12">
<div className="flex flex-col items-center max-w-[800px] text-center mx-auto">
<h3 className="font-semibold text-xl tracking-tight sm:text-2xl md:text-3xl lg:text-[40px]">
<div className="flex flex-col items-start sm:items-center gap-8 md:gap-12">
<div className="flex flex-col items-start sm:items-center max-w-[800px] text-left sm:text-center sm:mx-auto">
<h3 className="text-heading-20 sm:text-heading-24 md:text-heading-32 lg:text-heading-40">
{title}
</h3>
<p className="text-balance text-lg text-muted-foreground mt-4">
<p className="text-lg text-muted-foreground mt-4 sm:text-balance">
{description}
</p>
</div>
<div className="@container w-full overflow-hidden">{visual}</div>
<div className="@container w-full max-w-[1200px] px-px overflow-hidden">
{visual}
</div>
</div>
);
}

export function FeatureGrid(): JSX.Element {
return (
<div className="grid lg:grid-cols-2 divide-y lg:divide-y-0 lg:divide-x">
<div className="grid lg:grid-cols-2">
{features.slice(0, 2).map((feature) => (
<FeatureCard key={feature.title} {...feature} />
))}
Expand All @@ -76,7 +80,7 @@ export function FeatureGridExtended(): JSX.Element {
return (
<>
{/* AI SDK + Agents — 2 col */}
<div className="grid lg:grid-cols-2 divide-y lg:divide-y-0 lg:divide-x">
<div className="grid lg:grid-cols-2 gap-6 md:gap-24">
{features.slice(0, 2).map((feature) => (
<FeatureCard key={feature.title} {...feature} />
))}
Expand Down
Loading
Loading