None of these sections takes its copy as a prop, so changing what the landing page says is an edit to the component rather than to the page that mounts it.
Hero
Clone the repo.Fast-forward to launch.
A web app and a separate API in one monorepo, with sign-in and payments already wired. Clone it, let your agent run the setup, and ship.
The first screen: a two-line headline, a sentence whose nouns are links into the docs, and the two calls to action.
src/lib/docs/showcase/hero.tsx
import { Hero } from '@/components/Hero/Hero'
export function HeroDemo() {
return <Hero />
}TechStack
The stack under the hero, one card per technology. Each card holds a small picture of the job that technology does in the repository, in its own Stage component beside TechStack.tsx, and each mark is an export from simple-icons, so a mistyped brand fails the type check instead of drawing a broken shape. Editing the stack means editing the STACK array and the stage each entry names.
Ten tools, one job each
Each piece of the stack does one job in this repository, and each card shows that job being done.
TanStack Start
File-based routing and server rendering
TypeScript
Strict from the database to the browser
Tailwind CSS
Utility classes over one token file
daisyUI
A component layer with a light and a dark theme
Express
The api that owns billing and access
Clerk
Email codes, Google and GitHub sign-in
Stripe
One-time purchases and subscriptions at once
Drizzle
Typed queries and generated migrations
PostgreSQL
Every purchase and entitlement in one place
Resend
Transactional email written as React
The stack under the hero, one card per technology, each with a small picture of the job it does here, which plays while the card is on screen.
src/lib/docs/showcase/tech-stack.tsx
import { TechStack } from '@/components/TechStack/TechStack'
export function TechStackDemo() {
return <TechStack />
}The backbone of every project
Four systems every product rebuilds from scratch, wired together so you don't have to.
One repo, two apps
Your site and your api, sharing one set of types.
fast-forward-dev
apps/webWhat people see
- TanStack StartRouting
- ReactInterface
- Tailwind CSSStyling
- daisyUIThemes
- ClerkSign-in
- TanStack QueryData
Sign-in without passwords
Email codes, Google and GitHub, ready on day one.
you@example.com
Billing that stacks
One-time purchases and subscriptions, unlocked the moment they are paid.
Pro
$169.00 once
- Checkout paid
- Webhook received
- Purchase recorded
- Entitlement granted
- GitHub invite sent
Docs and a blog in every language
Write in Markdown, publish in English and Danish.
/docs/setup/install
Install and run
Clone the repo, install with pnpm, and hand the in-repo setup to an agent through SETUP.md.
The four systems the boilerplate wires together, as cards. Each one holds a working miniature of the real thing: the monorepo, the sign-in, a purchase moving through the pipeline, and a docs page in both languages.
src/lib/docs/showcase/features.tsx
import { Features } from '@/components/Features/Features'
export function FeaturesDemo() {
return <Features />
}Get started in minutes
Paste one prompt into your coding agent. It clones the repo and sets up every service for you.
Clone github.com/fast-forward-dev/fast-forward-dev and follow SETUP.md
- neon link --no-env-pull
- Postgres linked, database URL written
- clerk link --app app_31sBqM
- Clerk keys written to both apps
- stripe login
- Stripe account verified
- stripe listen --forward-to localhost:5001/stripe/webhook
- Webhooks forwarding to the api
- pnpm db:migrate
- Migrations applied
- pnpm dev
- Web on localhost:3000, api on localhost:5001
One prompt to a coding agent, branching into three sub-agent terminals that run at once and joining where the app starts. It plays once when scrolled to, and again from the send button.
src/lib/docs/showcase/how-it-works.tsx
import { HowItWorks } from '@/components/HowItWorks/HowItWorks'
export function HowItWorksDemo() {
return <HowItWorks />
}The rest of the launch checklist
Dashboard
Access, billing and invites
Admin
User lookup and invite re-sends
Transactional email
Written in React, sent by Resend
Docs search
⌘K across every page
Light and dark
No flash on load
SEO
Sitemap, robots.txt and llms.txt
Analytics
PostHog, off until you add a key
Changelog
Dates the pricing card
Agent-ready
AGENTS.md, skills and a setup guide
The smaller things that ship, as small cards with a name and a short detail each, after the four systems have had their own cards.
src/lib/docs/showcase/icon-features.tsx
import { IconFeatures } from '@/components/IconFeatures/IconFeatures'
export function IconFeaturesDemo() {
return <IconFeatures />
}Ship the parts nobody wants to build twice
The site you are reading is the thing you get.
Pro
The boilerplate, and the storefront that sells it. One repo.
$169.00once
Pay once. Access is never revoked.
- Permanent read access to the repository
- Web app (TanStack Start)
- API (Express)
- Auth (Clerk)
- Billing (Stripe)
- Database (Postgres + Drizzle)
- Docs, blog, dashboard and admin
- Invite delivery with retries
- Lifetime updates
The pricing section renders one card per slug sold in the active Stripe environment. Amounts come from the catalog, and display copy follows the selected language.
src/lib/docs/showcase/pricing.tsx
import { Pricing } from '@/components/Pricing/Pricing'
export function PricingDemo() {
return <Pricing />
}OfferCard
The one entry here that is a component rather than a section. Pricing passes it one CardCopy per slug, and that record is exhaustive over the catalog: adding a slug is a type error until copy exists for it. The copy in the frame below is the demo's own, not the shipped card's.
Pro
The boilerplate, and the storefront that sells it. One repo.
$169.00once
Pay once. Access is never revoked.
- Permanent read access to the repository
- API (Express)
- Invite delivery with retries
- Lifetime updates
One offer, as a card. The amount and the cadence come off the catalog entry the api resolves the price from, so the number shown and the number charged cannot disagree.
src/lib/docs/showcase/offer-card.tsx
import { CATALOG } from '@ffd/shared'
import { OfferCard } from '@/components/OfferCard/OfferCard'
import type { CardCopy } from '@/lib/catalog/card-copy'
import { UPDATES } from '@/lib/updates'
// Illustrative copy, not the shipped card's. `Pricing` owns the real
// `Record<Slug, CardCopy>`, and the amount and cadence below come off the
// catalog either way.
const COPY: CardCopy = {
name: 'Pro',
tagline: 'The boilerplate, and the storefront that sells it. One repo.',
bullets: [
'Permanent read access to the repository',
'API (Express)',
'Invite delivery with retries',
'Lifetime updates',
],
cta: 'Get the boilerplate',
footnote: 'Pay once. Access is never revoked.',
// Read off the changelog rather than typed here, so the claim above it is a
// fact about the repo instead of a date that rots.
updatedOn: UPDATES[0]?.date,
}
export function OfferCardDemo() {
return <OfferCard slug="pro" entry={CATALOG.pro} copy={COPY} />
}Frequently asked questions
Here are some of the most frequently asked questions. If you have any other questions, feel free to reach out by email.
The FAQ uses daisyUI collapse rows over a focusable checkbox. Rows open from the keyboard before hydration; translations use the shared language provider.
src/lib/docs/showcase/faq.tsx
import { FAQ } from '@/components/FAQ/FAQ'
export function FaqDemo() {
return <FAQ />
}Stop wasting time on setting up login and payments
Buy once, clone it, and keep the repository.
The closing call to action band, in the one token pair that does not invert between the two themes.
src/lib/docs/showcase/cta.tsx
import { CTA } from '@/components/CTA/CTA'
export function CtaDemo() {
return <CTA />
}Shipped, but not mounted
WithOrWithout and MadeWith ship as components and are not on /. Each one is a whole section of the page you may want back: a before-and-after column pair and a social-proof grid. Mount one by adding a line to routes/index.tsx.
With or Without
Without Fast Forward Dev
- Spend days creating web layouts manually
- Pay for costly integrations or plugins
- Lose time debugging payment gateways
- Endless support requests for login issues
- Rebuild backend connections every time
With Fast Forward Dev
- Plug-and-play layouts for rapid development
- All-in-one solution, no extra costs
- Effortless Stripe integration for payments
- Seamless, prebuilt Google and email login
- Backend and frontend ready to go, no hassle
The before and after column pair, in the two semantic colours that pass as body text in both themes.
src/lib/docs/showcase/with-or-without.tsx
import { WithOrWithout } from '@/components/WithOrWithout/WithOrWithout'
export function WithOrWithoutDemo() {
return <WithOrWithout />
}Made with Fast Forward Dev
Fast Forward Dev (this website)
The boilerplate and the storefront that sells it, in one repo. TanStack Start, Express 5, Clerk, Stripe and Postgres, with the documentation shipping beside the code it documents.
Catch Up for Slack
Summarize your Slack messages with AI. Never miss important messages or deadlines again. Perfect for teams who want to stay on top of their communications without spending hours reading through channels.
Stocker
Collect your stocks in one place. A simple and efficient way to track and manage your stock portfolio. Built for investors who want a clean and straightforward way to monitor their investments.
Codle
Codle is just like Wordle, but for coders. Guess the word in 6 attempts or less to win.
Catch Up for Outlook
Summarize your Outlook emails with AI. Never miss important emails or deadlines again. Perfect for professionals who want to stay on top of their communications without spending hours reading through their inbox.
The social proof section. Replace the PROJECTS array with your own; the entries are external sites, so each is a plain anchor rather than a Link.
src/lib/docs/showcase/made-with.tsx
import { MadeWith } from '@/components/MadeWith/MadeWith'
export function MadeWithDemo() {
return <MadeWith />
}Not shown here
About and AboutShort also ship, and are not in this gallery. They are one person's autobiography, and About carries a YouTube embed, so they are page content you delete rather than components you reuse. Read them at src/components/About/.