Marketing pages render from typed configuration in src/config/marketing-pages.ts. Each page is a list of sections (hero, features, testimonials, pricing, FAQ, newsletter, contact, CTA, stats, mission) rendered by olwibaUI blocks.
Changing your pitch means editing config, not markup:
{
type: 'hero',
heading: 'Start from something solid',
description: '...',
primaryCta: { label: 'Explore the demo', href: '/sign-up' },
}Section components, layout, responsiveness, and dark mode are handled by the block layer. Your job is the words.
src/config/personas.ts defines audience-specific landing pages served at /for/:slug. Each persona carries its own meta tags, hero copy, features, use cases, FAQs, and keywords, and getPersonaMarketingPage assembles a full page from them.
Add a persona to the array and it automatically gets a route, an entry on /for, a phone mockup preview built from its own copy, and a sitemap entry. This is the message-match tool: paid traffic for a specific audience lands on a page written for exactly that audience.
Plans live in sharedPricingPlans and render on both the home page and /pricing. Monthly and annual price points, feature checklists, and the highlighted plan are all data.
Every page builds meta tags through buildSeoMeta: title, description, canonical path, and keywords flow into the document head. robots.txt, sitemap.xml, and the RSS feed are generated routes that pick up your pages automatically. Authenticated areas send noindex headers.
Public pages can be toggled per deployment with client env flags: VITE_ENABLE_BLOG_PAGE, VITE_ENABLE_PRICING_PAGE, and VITE_ENABLE_ABOUT_PAGE control whether those routes and their navigation entries appear.