Marketing site for FluentForward Limited's AI advisory and implementation practice.
- Next.js 14 (App Router), React 18, TypeScript
- Tailwind CSS v4, configured CSS-first via
@themeinsrc/styles/tailwind.css - Fonts loaded with
next/font/google: Instrument Sans (display), Inter (body), IBM Plex Mono (labels) - No CMS, no database. All copy lives in
src/content. - Optional analytics/marketing vendors load only after cookie consent (see
src/lib/vendors).
npm install
npm run devThe site runs at http://localhost:3000. Local development does not require vendor IDs.
Set these on the Production environment only (not Preview or Development). Scripts stay unloaded when an ID is empty or unset.
| Variable | Purpose |
|---|---|
NEXT_PUBLIC_GA4_MEASUREMENT_ID |
Google Analytics 4 (G-…) |
NEXT_PUBLIC_META_PIXEL_ID |
Meta Pixel (optional) |
NEXT_PUBLIC_LINKEDIN_PARTNER_ID |
LinkedIn Insight Tag (optional) |
NEXT_PUBLIC_LINKEDIN_WEBINAR_CONVERSION_ID |
LinkedIn conversion for webinar registration (optional) |
Demio event 1021063 (Tue 15 Dec 2026 · 11:00 GMT). The site defaults NEXT_PUBLIC_DEMIO_EVENT_ID to 1021063; override only if the event moves.
Registration wiring (pick one path on Production):
| Variable | Purpose |
|---|---|
DEMIO_API_KEY |
Demio API key (server only, for branded first-name + email form) |
DEMIO_API_SECRET |
Demio API secret (server only) |
NEXT_PUBLIC_DEMIO_DATE_ID |
Optional session date ID if auto-resolve fails |
NEXT_PUBLIC_DEMIO_EMBED_REF |
Ref token from Demio Share → Embed (unstyled inline embed) |
NEXT_PUBLIC_DEMIO_EMBED_SCRIPT_SRC |
Full embed script URL if Demio changes the path |
NEXT_PUBLIC_DEMIO_EMBED_SRC |
Optional iframe src instead of script embed |
Branded form uses Demio PUT /api/v1/event/register with event id 1021063, session date_id from NEXT_PUBLIC_DEMIO_DATE_ID when set, and Demio’s predefined gdpr field (yes / no from the optional marketing checkbox). Demio sends confirmation email, calendar invite and join link. Do not surface join URLs on /webinar or /webinar/thanks.
Demio room (Webinar ops, not this repo): Featured Action after the session points to Constraint review only. No Score Featured Action.
Test registration after deploy:
- Open the Vercel preview URL for the PR (or Production after merge).
- Ensure
DEMIO_API_KEY+DEMIO_API_SECRETorNEXT_PUBLIC_DEMIO_EMBED_REFis set on that environment. - Submit a test with a real inbox you control.
- Confirm the registrant appears in Demio event 1021063 and the Demio confirmation email arrives.
- Thank-you page:
/webinar/thanks(API path redirects here; for embed, set Demio post-registration redirect tohttps://www.fluentforward.com/webinar/thanksif desired).
Redeploy Production after changing public env vars so the client build picks them up.
src/
app/ routes, one thin page.tsx per route plus sitemap/robots/OG image
components/
layout/ site header, footer, wordmark
sections/ page sections, composed by routes
ui/ primitives: Button, Container, Section, Heading, Reveal, SpecRow
content/ all copy and configuration as typed TS exports
lib/ Cal.com embed loader
styles/ Tailwind theme and base layer
Every page's text is in src/content. Components take content as data rather than
containing it, so changing wording never means touching layout code.
/results renders an empty state until caseStudies in
src/content/results.ts has entries. Add objects matching
the CaseStudy type and the page switches over automatically.
Tokens are defined once in src/styles/tailwind.css.
The palette is deliberately monochrome — paper and ink surfaces with slate and
mist text. --color-steel is the single accent and is used sparingly, for
eyebrow rules, phase numerals, active navigation and focus rings. Primary
buttons are ink, never accent.
Scroll reveals use the Reveal component, which adds html.js before hiding
anything, so content stays visible without JavaScript and honours
prefers-reduced-motion.
The single call to action is a Cal.com (EU) booking. Configuration lives in
src/content/cal.ts; CalBookingInit in the root layout
powers popup triggers and CalInline renders the inline calendar on /contact.
There are no contact forms elsewhere; webinar registration uses /api/webinar/register → Demio event 1021063 when API keys or embed env vars are set (see README).
Standard Next.js build, deployed on Vercel.
npm run buildRoutes retired in the 2026 redesign (/blog, /pricing, /surfaceos,
/agentic-platform) are 301 redirected in next.config.mjs.