MyLumo Website
MyLumo Website is the production marketing platform at mylumo.in - unifying technology consulting services and MyLumo Chat SaaS product pages in one static-export Next.js 16 site. Content lives in Git as typed TypeScript modules and MDX blog posts (no CMS). A build-time SEO pipeline generates sitemap, RSS, llms.txt, JSON-LD, and legacy 301 redirect maps. GitHub Actions runs lint, Vitest, Playwright + axe accessibility, Lighthouse CI, and security scans before syncing ~889 files to S3 with tiered cache headers and invalidating CloudFront. Contact forms route leads through Pipedream webhooks; PostHog tracks funnel events; product CTAs link to chat.mylumo.in.
Problem
MyLumo needed one live marketing surface for both technology consulting and a team-chat SaaS product - without CMS sprawl, server ops, or SEO drift between staging and production. Legacy domains and blog URL patterns from a prior rebrand still needed 301 coverage at the edge.
Before and After
Before
- Split branding and domains from prior product iteration
- CMS or manual deploy risk for copy and SEO metadata
- Server runtime cost for a mostly-static marketing site
- Legacy /blog/ paths without edge redirect coverage
- Form handling requiring always-on backend routes
After
- Single Next.js static export for consulting + product
- Git-based TS + MDX content reviewed in CI
- S3 + CloudFront with tiered cache and edge redirects
- Build-time sitemap, RSS, llms.txt, and JSON-LD
- Client-side Pipedream webhooks + PostHog analytics
How Content Reaches mylumo.in
Git-based TypeScript and MDX content flows through a Next.js static export, a build-time SEO pipeline, and GitHub Actions deploy to S3 plus CloudFront. Forms and analytics hit external services; product CTAs route to the live chat app. Pick any block to see the flow.
Authoring
Build
SEO
CI
Delivery
Edge
Client
Integrations
What I Built
Next.js static export architecture
- Next.js 16 App Router with output: export - ~889 pre-rendered files, zero server runtime.
- 18 routes across /services/* consulting pages and /(product)/* SaaS marketing pages.
- Dual CSS themes (consulting + product) sharing one design token system.
- React 19 + TypeScript 6 with next/font for Inter, Playfair Display, and JetBrains Mono.
Git-based content without a CMS
- Typed TypeScript content modules for services, pricing, and product copy.
- 38 MDX blog posts with gray-matter front matter and reading-time estimates.
- Content changes ship through the same PR review and CI gate as application code.
- .ai/ folder documents design, SEO, and copy guidelines for consistent delivery.
Build-time SEO and legacy migration
- NEXT_PUBLIC_SITE_URL drives canonicals, OG tags, sitemap.ts, and robots.ts at build.
- Post-build scripts emit feed.xml, llms.txt, 301 redirect HTML, and CloudFront viewer-request function.
- seo-audit.mjs validates the out/ tree before deploy is allowed.
- Legacy /blog/ and slug alias redirects handled at the CloudFront edge.
CI/CD, leads, and observability
- GitHub Actions: lint, Vitest, Knip, jscpd, madge, dependency-cruiser, build, Playwright + axe, Lighthouse CI.
- S3 sync with tiered cache headers and CloudFront /* invalidation on every main deploy.
- Multi-intent contact funnel (demo, waitlist, consulting, newsletter) via Pipedream webhooks with honeypot.
- PostHog pageviews and form_submitted events; optional GA4 when configured.
Engineering Decisions
- Static export over SSR - marketing pages are pre-renderable; CDN delivery beats server ops cost.
- No CMS - Git review beats WYSIWYG drift for B2B copy that must stay on-brand and auditable.
- Edge redirects over origin rewrites - legacy URL migration without runtime middleware.
- Client-side form POST to Pipedream - static export cannot host API routes; webhook keeps ops zero.
- Deploy gate includes Lighthouse + axe - performance and accessibility are release blockers, not afterthoughts.
- Marketing site decoupled from chat.mylumo.in - product signup stays in the live SaaS app.
By the Numbers
Live URL
mylumo.in
Route pages
18
MDX blog posts
38
Static output files
~889
Unit tests
27 Vitest
E2E + a11y tests
11 Playwright
Deploy target
S3 + CloudFront
Reliability and Ops
- Deploy only after quality, E2E, and Lighthouse CI jobs pass on the build artifact.
- HTML cache max-age=0 with must-revalidate; immutable 1-year cache for hashed _next/ assets.
- Gitleaks, Semgrep, and CodeQL security scans on push and weekly schedule.
- Husky + lint-staged pre-commit; Dependabot for dependency hygiene.
Testing
- Vitest across metadata, contact routing, content loaders, pricing calculator, and slug safety.
- Playwright E2E with axe-core WCAG 2.1 AA checks on 7 key routes.
- Lighthouse CI enforces per-page performance budgets before production deploy.
What I Did
- 01Architected a Next.js 16 static-export site unifying consulting services and SaaS product marketing into one deployable surface at mylumo.in.
- 02Built a Git-based content system with typed TS modules and 38 MDX blog posts - no CMS, all copy reviewed in CI.
- 03Shipped a build-time SEO pipeline: sitemap, robots, RSS, llms.txt, JSON-LD, seo-audit, and CloudFront edge redirect functions.
- 04Set up AWS S3 + CloudFront deployment with tiered cache headers and automated invalidation via GitHub Actions.
- 05Implemented multi-intent contact funnel (demo, waitlist, consulting, newsletter) via Pipedream webhooks with honeypot and PostHog tracking.
- 06Established CI quality gates: Vitest, Playwright + axe WCAG tests, Lighthouse budgets, Knip/jscpd/madge, and Gitleaks/Semgrep/CodeQL.