H1, subtitle, FAQ, endpoint: all in JSON or MDX. A template that carries a sentence carries a bug waiting to diverge.
A page is a contract, not a canvas
10 live templates and 2 dormant ones. Each one fixes its data source, the order of its sections, what every section requires, and the checks a page must pass before it ships. Two pages of the same directory read as one template, or the site reads as several.
The first body section is a split, a lead or a scene. Features in first position render as FeatureLead.
A missing asset or href produces a degraded variant without an error. Compare a page with the directory reference before touching CSS.
Signed band, FAQ, offer strip, CTA. The reader lands on the same decision at the end of every chapter.
What BaseLayout posts once
Every template starts here. None of these is ever redrawn in a page or a component.
SEOtitle, description, canonical, OG, Twitter, JSON-LDNavnavbar + mega-menu from config/site.ts (NAV, PRODUCT_FAMILIES, CTA).page-railsthe two vertical rules, aligned on .container<main id="main">the only landmark; skip link targetFooterfrom config/site.ts (FOOTER, EXTERNAL); privacy and opt-out linksTracking loaderonly when PUBLIC_TRACKING_ENABLED, guarded by BaseLayout
Home
The one page with bespoke sections: every home component reads home.json itself, and the offer band reads pricing.ts.
- 01
HeroTopBorder + HomeHero + HeroBottomBorderhome.json hero- h1
- subtitle
- primaryCta
Framed hero with the lifetime-offer banner (.hero-offer)
- 02LogoBandconfig/logos
- 03
- 04OfferBandconfig/pricing.ts
variant="band": 5 → 50 requests per second, CTA to /pricing
- 05
AllInOneSolutionkind: usecaseshome.json sections[0] - 06
StartBuildingkind: featureshome.json sections[1] - 07
InfraPillarskind: splithome.json sections[2]100 % driven by JSON: pillars, chips, proof
- 08
RawDataIntelligencekind: showcasehome.json sections[3] - 09
DataWorkflowskind: featureshome.json sections[4]Dark matrix, one cell per workflow
- 10Testimonialsconfig/testimonials.ts
Hidden in production while QUOTES_ARE_PLACEHOLDERS is true
- 11
Product
One API, one page. Two openings exist: split + showcase (CodeSplit then ProductTabs) or a FeatureLead opening followed by the rail and the steps.
- 01
Breadcrumbsfamily label + seo.titleBreadcrumbList JSON-LD
- 02ProductHerohero
- h1
- subtitle
- primaryCta
- secondaryCta
secondaryCta = the deep link to the API reference page
- 03TrustedBandconfig/logos
Product variant: text cell + client marquee
- 04
- 05
- title
- items (text bullets)
- asset
Opening A. The button falls back to docsUrl
- 06
- 07FeatureLeadkind: features
- items[] with title, text, asset
Opening B, only when features is the FIRST section. Later features render as GrayCards
- 08UseCaseRailkind: usecases
- items[] with title, text, href
- 09
- items[] with title, text
Subtitle carries the endpoint: « One endpoint, POST /v2/…, … »
- 10
- 11GrayCards (links)relatedProducts[] or same family
« Related APIs », 3 cards. relatedProducts: [] removes the band
- 12SignatureBandFAMILY_BANDS[family] + docsUrl
- 13FaqSectionfaq[]
Native <details>, FAQPage JSON-LD emitted automatically
- 14OfferBandconfig/pricing.ts
variant="strip", links to /pricing
- 15CtaSectionconfig/site.ts
JSON · the T2 contract, opening A
{
"family": "search",
"endpoint": "POST /v2/search/companies",
"seo": { "title": "… | …", "description": "140 to 160 characters" },
"hero": {
"tag": "…", "h1": "…", "subtitle": "…",
"primaryCta": { "label": "Get 1,000 credits free", "href": "https://app.blitz-api.ai" },
"secondaryCta": { "label": "API Docs", "href": "https://docs.blitz-api.ai/api-reference/…" }
},
"sections": [
{ "kind": "split", "title": "…", "subtitle": "…", "asset": "search-query", "items": [{ "text": "…" }, { "title": "API Docs", "href": "https://docs.blitz-api.ai/…" }] },
{ "kind": "showcase", "title": "…", "items": [{ "title": "…", "text": "…", "asset": "filter-set" }] },
{ "kind": "features", "title": "…", "items": [{ "title": "…", "text": "…", "asset": "dataset" }] },
{ "kind": "usecases", "title": "…", "items": [{ "title": "…", "text": "…", "href": "/use-cases/build-tam" }] }
],
"faq": [{ "q": "…", "a": "…" }],
"docsUrl": "https://docs.blitz-api.ai/api-reference/…",
"relatedProducts": ["/products/people-search", "/products/tam-by-people"]
}Use case
A playbook page: framed hero with its MotionScene, one proof frame per editorial block, a capability map, the endpoints that execute it.
- 01
BreadcrumbsUC_META crumb - 02UseCaseHerohero + scene
- h1
- subtitle
- primaryCta
- a spec in motion/specs/use-cases/
Without a scene the hero is a centered text block
- 03TrustedBandconfig/logos
Use case variant: centered hook + marquee
- 04
- 05UseCaseSplit « points »kind: split
- asset
- items[] text bullets
Text on the left rail, proof frame on the right
- 06WorkflowStepskind: steps
- items[] title + text
- 07
- 08UseCaseSplit « cta »kind: split
- asset
- exactly one item {title, href}
Proof on the left, text + button on the right. Without the href item it silently falls back to « points »
- 09RelatedApiskind: apis
- asset
- items[] with href; bullets separated by \n
The P1 frame shows UC_META.endpoint
- 10SignatureBandUSECASE_BANDS[slug] + docsUrl
proof is cut when the page already shows that signature
- 11FaqSectionfaq[]
Native <details>, FAQPage JSON-LD emitted automatically
- 12OfferBandconfig/pricing.ts
variant="strip", links to /pricing
- 13CtaSectionconfig/site.ts
Team (persona)
A persona page. The template derives its sections structurally: the pains split, the untitled features, the founder split (one titled + texted item) and the « Plug BlitzAPI » split.
- 01
Breadcrumbshero accent - 02PersonaHerohero
- h1 (« … for <persona> » or **accent**)
- primaryCta
- 03
- 04
- 05PainsSectionkind: split + features (untitled)
- pains split: title, subtitle, items[] (lead + bullets)
- features WITHOUT title: 3 cells
- scene in motion/specs/teams/
A features section WITH a title leaves PainsSection and becomes GrayCards
- 06
(usecases)kind: usecasesNot rendered in the September build (PlaybooksGrid left with the Learn module). Kept in the JSON for October
- 07WorkplaceSectionkind: split (founder) + split (Plug BlitzAPI)
- founder split: ONE item with title « Name, Role » and text
- stack split: title starting with « Plug BlitzAPI »
- 08
- 09
- 10SignatureBandTEAM_BANDS[slug] + docsUrl
- 11FaqSectionfaq[]
Native <details>, FAQPage JSON-LD emitted automatically
- 12OfferBandconfig/pricing.ts
variant="strip", links to /pricing
- 13CtaSectionconfig/site.ts
Hub (Developers, Integrations)
Two single pages reached from the same menu, so they share one contract: framed hero with a scene, editorial split, one showcase, one code or connector block, one « Where to go next » matrix.
- 01
Breadcrumbs - 02UseCaseHerohero + scene
- a spec in motion/specs/hubs/
- 03
- 04
- 05FeatureLeadkind: features
- 3 items
- 06
- href only on what is really documented
- 07
- endpoint
- responseFields
- items[] with lang, code and a verbatim `source` URL
Developers only. A snippet without source is an invented snippet
- 08WorkflowStepskind: steps
- 09HubSplitkind: split
- asset
- proof.head
- proof.foot
- 10
- 11PlaybookGridrelatedProducts[] + relatedCourses[]
- 6 cells (full grid)
ONE « Where to go next » matrix, never two consecutive card bands
- 12SignatureBandHUB_BANDS[slug] + docsUrl
- 13FaqSectionfaq[]
Native <details>, FAQPage JSON-LD emitted automatically
- 14OfferBandconfig/pricing.ts
variant="strip", links to /pricing
- 15CtaSectionconfig/site.ts
Pricing
The page that decides the conversion rate. No component carries a figure: everything reads pricing.ts, including the JSON-LD offers.
- 01
Breadcrumbs - 02PageHeroCOPY.hero
align="center" compact
- 03
variant="strip": the deadline and the lifetime terms
- 04
PlanCardsPLANS- three plans, same decision at the same height
- 05
QualityStripQuality reassurance without a figure (no accuracy figure in the September build)
- 06
PlanComparePLAN_COMPAREThree groups, a decision row in <tfoot>
- 07
EmbeddedBandEMBEDDED - 08FaqSectionPRICING_FAQ
- 09
About
The company page: manifesto, counters, principles, the dark workflow grid. Copy and the four portraits are frozen.
- 01
Breadcrumbs - 02
Inline hero (Tag + h1 + Button)about.json hero - 03
- 04
Manifestoabout.json- html
- name
- role
- 05
CountersBandabout.json countersvariant="about", authorized KPIs only
- 06
ValuesGridabout.json tabsPrinciples, all unfolded
- 07DarkWorkflowGridabout.json
- 08
- 09
- 10
Contact
A form page: PageHero, the form (Field + Checkbox, three states), the logo band, the steps, the FAQ.
- 01
Breadcrumbs - 02
align="left": the left variant carries the section envelope geometry
- 03
Form (Field, Checkbox, Button)CONTACT_FORM endpoint (n8n webhook)- three states: sending, sent, error
- 04
- 05WorkflowStepskind: steps
- 06
- 07
Legal
A reading column for markdown: header (heading, version) then the prose, with anchors that land under the sticky bar (scroll-padding-top).
- 01
Breadcrumbs - 02
Legal headerfrontmatter heading- title
- description
- heading
- path
- 03
Markdown body<page>.mdNever indent the markdown: 16 leading spaces once published most of the terms as code blocks
Utility pages
Self-contained pages on the shared skeleton: the 404 (Nav, copy, Button, Footer) and the CCPA opt-out form (verbatim brief, request_id generated on the site).
- 01
Nav + FooterBaseLayout - 02
Page bodyJSON copyOpt-out: [hidden]{display:none!important} scoped rule, because state frames set display:flex
Blog article
A 740px reading column (about 67 characters): category, date and reading time, KeyTakeaways under the title, prose with the 12 shared content blocks, FAQ, then « Keep reading » cards.
- 01
Article headerfrontmatter- title
- description
- category
- publishedAt
- takeaways (3 to 5)
- 02
KeyTakeawaystakeaways[]Also emitted as structured data
- 03
Prose + content blocksMDX bodycomponents/content/* (Definition, Callout, Steps, Compare, Stats…)
- 04
Figurescene specVisual mounted on the Visual Generator, caption required
- 05FaqSectionfaq[]
- 06
BlogCard × 3latest posts« Keep reading »
Course and lesson
An LMS without login: course catalog (CourseCard with a generative cover), course landing (CurriculumList, VideoIntro, LeadMagnet), lesson page (LessonChrome, LessonSidebar, prose, the 7 lesson blocks, progress in localStorage).
- 01
CourseCardcourses collectionGenerative 16:9 cover, platform tag, level badge, lessons and minutes
- 02
CurriculumList + VideoIntro + LeadMagnetcourse JSONCourse landing
- 03
LessonChrome + LessonSidebarlesson headings + progressReading bar, remaining time, keyboard arrows, resume
- 04
Lesson arclesson MDX- Objective first
- Recap last
Objective → prose + shared blocks → Payload → TryIt → Troubleshoot → Quiz · Checkpoint → Recap