All pages

Marketing sections

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 />
}

Features

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.

Email

you@example.com

or

Billing that stacks

One-time purchases and subscriptions, unlocked the moment they are paid.

Pro

$169.00 once

  1. Checkout paid
  2. Webhook received
  3. Purchase recorded
  4. Entitlement granted
  5. GitHub invite sent

Docs and a blog in every language

Write in Markdown, publish in English and Danish.

/docs/setup/install

Language

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 />
}

HowItWorks

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

Your agentReading SETUP.md
Neonsub-agent
  1. neon link --no-env-pull
  2. Postgres linked, database URL written
Clerksub-agent
  1. clerk link --app app_31sBqM
  2. Clerk keys written to both apps
Stripesub-agent
  1. stripe login
  2. Stripe account verified
  3. stripe listen --forward-to localhost:5001/stripe/webhook
  4. Webhooks forwarding to the api
~/my-productmain agent
  1. pnpm db:migrate
  2. Migrations applied
  3. pnpm dev
  4. 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 />
}

IconFeatures

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 />
}

Pricing

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

Last updated Sep 4, 2026

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

Last updated Sep 4, 2026

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} />
}

FAQ

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.

What do I get with this boilerplate?
Permanent read access to this repository. It is a pnpm workspace holding a TanStack Start web app, an Express 5 api, and a shared package with the wire contract and the Drizzle schema, with Clerk for identity, Stripe for billing, Postgres for storage and Resend for mail already wired together. The site you are reading is that repo, running.
How do I start a project with this boilerplate?
Clone it, point the origin at your own repo, and follow SETUP.md. It is a guide an agent can execute rather than a checklist that gates the build: every step reports rather than enforces, so you reach a running app before you have configured Stripe.
Is there a subscription, or does it expire?
Neither. It is one payment, and repository access is never revoked. Updates to the boilerplate land in the same repo, so they arrive as a pull rather than as a new download.
Can I sell one-time purchases and subscriptions at the same time?
Yes, and that is why billing is hand-rolled on Stripe rather than delegated to a billing product. Offers stack instead of replacing each other, and what someone is entitled to is derived from the price they actually paid. There is no field anywhere that says what a user bought.
What happens when a Stripe webhook is delivered twice?
The handler re-fetches the Stripe object and upserts its current state, so a replay does not create another payment row. Missed events and concurrent refreshes can still leave state stale until another refresh.
Can I use my own database, auth provider or email service?
Yes. Each one is behind a seam the docs name, and the Extending section walks the swap. Database and email changes stay in the api. Replacing Clerk also requires updating the web sign-in flow and session checks.

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 />
}

CTA

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 />
}

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/.

Updated