diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md
index 39d1f9a..ee48d52 100644
--- a/.claude/CLAUDE.md
+++ b/.claude/CLAUDE.md
@@ -23,6 +23,26 @@ Claude Code runs inside a nono sandbox (`nono run --profile claude-openspec -- c
- **Hosting**: Self-hosted VPS behind Cloudflare (orange cloud, Full strict TLS)
- **Git**: Gitea at gitea.qumo.io
+## Visual reference
+
+The **staging Webflow site at `https://qumo-pmj.webflow.io/`** is the visual reference for this rebuild — NOT the live production site at qumo.io. The staging site has updated content, layout, and pages compared to production.
+
+## Migration plan
+
+The file `website-rebuild-migration-steps.md` in the project root contains the full sequential list of migration steps for this rebuild, numbered 001–028. Each step is designed to be run as an OpenSpec change via `/opsx:explore`. Always consult this document to understand what the current step should accomplish and what comes next.
+
+## Site structure (from the staging site)
+
+| Route (EN) | Route (NL) | Page |
+|---|---|---|
+| `/` | `/nl` | Homepage — hero, services (AI Launchpad / Data & BI / Embedded Expertise), approach text, cloud logos, mission, delivered solutions, stats ticker, CTA |
+| `/about` | `/nl/about` | About — hero, mission, 3 founders with bios, CTA |
+| `/ai-launchpad` | `/nl/ai-launchpad` | AI Launchpad — hero, pain points, solutions, 4-step process, practical details, CTA |
+| `/contact` | `/nl/contact` | Contact — form, "still not sure" section |
+| `/privacy` | `/nl/privacy` | Privacy policy (new — not on staging yet) |
+
+Navigation across all pages: **Services** (`/#services`), **AI Launchpad** (`/ai-launchpad`), **About** (`/about`), **Connect** CTA button (`/contact`).
+
## Brand guidelines (must follow)
- **Colors**: Midnight #102022 (primary dark), Snow #F3F3F3 (light bg), Gradient #5257E4 → #F71E3E (accent only, never as flat standalone colors)
@@ -46,7 +66,7 @@ Claude Code runs inside a nono sandbox (`nono run --profile claude-openspec -- c
- Never mention team size, company size, or founding date
- Never name clients in public content (use descriptive labels: "a shipping company")
-- The team section shows 5 co-founders: Luigi, Matthijs, Jelle, Jorn, Stijn
+- The founders section shows 3 co-founders: Luigi, Jelle, Matthijs (with bios and role titles)
- Engagement models should not be listed as a menu — mention naturally
- Proof points are for calls/follow-ups, not the website
@@ -62,8 +82,4 @@ Claude Code runs inside a nono sandbox (`nono run --profile claude-openspec -- c
- `cd website && npm run build` must succeed (catches broken links, missing imports)
- Check the built output in `website/dist/` for correct HTML structure
-- Validate JSON-LD with Google Rich Results Test after deployment
-
-## Current reference
-
-The live Webflow site at https://www.qumo.io is the visual reference. Match the design, layout, and content — but improve the code quality, performance, and SEO.
\ No newline at end of file
+- Validate JSON-LD with Google Rich Results Test after deployment
\ No newline at end of file
diff --git a/openspec/changes/setup-base-layout/.openspec.yaml b/openspec/changes/setup-base-layout/.openspec.yaml
new file mode 100644
index 0000000..e49efd1
--- /dev/null
+++ b/openspec/changes/setup-base-layout/.openspec.yaml
@@ -0,0 +1,2 @@
+schema: spec-driven
+created: 2026-04-10
diff --git a/openspec/config.yaml b/openspec/config.yaml
index ea8e105..3d5cfb0 100644
--- a/openspec/config.yaml
+++ b/openspec/config.yaml
@@ -11,7 +11,13 @@ context: |
Form: Go backend, honeypot + JS timestamp + rate limiting. SMTP via Resend or Brevo.
Git: Gitea (self-hosted). No CI/CD pipeline yet — manual docker compose build + up.
AI tooling: Claude Code with Astro Docs MCP server.
- Visual reference: https://www.qumo.io (live Webflow site, match design but improve code)
+
+ Visual reference: https://qumo-pmj.webflow.io/ (staging Webflow site — this is what we are rebuilding, NOT the live site at qumo.io)
+ Migration plan: website-rebuild-migration-steps.md in the project root — sequential list of all migration steps (001–028), each designed to be run as an OpenSpec change
+
+ Pages: Homepage (/), About (/about), AI Launchpad (/ai-launchpad), Contact (/contact), Privacy (/privacy) — each with /nl/ locale variant
+ Nav: Services (/#services), AI Launchpad (/ai-launchpad), About (/about), Connect CTA (/contact)
+ Founders: 3 (Luigi, Jelle, Matthijs) — shown on /about with bios and role titles
Constraints:
- Zero JavaScript shipped by default (Astro islands only where needed)
@@ -22,7 +28,7 @@ context: |
rules:
proposal:
- - Reference the visual design at qumo.io when describing UI changes
+ - Reference the visual design at https://qumo-pmj.webflow.io/ when describing UI changes
- Note which content strings (en.json / nl.json) are affected
- Identify if the change affects SEO (structured data, meta tags, sitemap)
specs:
diff --git a/website-rebuild-migration-steps.md b/website-rebuild-migration-steps.md
new file mode 100644
index 0000000..bc559ba
--- /dev/null
+++ b/website-rebuild-migration-steps.md
@@ -0,0 +1,800 @@
+# qumo.io Website Rebuild — Migration Steps
+
+_An ordered list of migration steps for rebuilding qumo.io from Webflow to Astro. Each step is designed to be run as an OpenSpec change with `/opsx:explore`, which will evaluate whether additional intermediate steps are needed before implementation._
+
+_Reference site: `https://qumo-pmj.webflow.io/` (staging — this is the version we are rebuilding, NOT the live production site at qumo.io)_
+
+_Run each step as: `/opsx:explore See step NNN —
`_
+
+---
+
+## How to use this document
+
+1. Work through the steps **in order** — each one builds on the previous.
+2. For every step, run `/opsx:explore` with the step description. Explore will decide if intermediate steps are needed before implementation.
+3. **Before starting each step**: open `https://qumo-pmj.webflow.io/` (and the relevant subpage) in your browser. Study the layout, spacing, colors, typography, animations, and interactions you need to replicate. Take note of anything that isn't captured in the text description below.
+4. **After completing each step**: run `npm run build` inside `website/`, then `npm run dev` and compare the result side-by-side with the staging Webflow site. Note discrepancies for the next iteration.
+5. The staging site is always the visual source of truth. This document describes *what* to build; the staging site shows *how it should look*.
+
+### Site map of the staging site
+
+| Route (EN) | Route (NL) | Page |
+|---|---|---|
+| `/` | `/nl` | Homepage |
+| `/about` | `/nl/about` | About — mission, founders |
+| `/ai-launchpad` | `/nl/ai-launchpad` | AI Launchpad product page |
+| `/contact` | `/nl/contact` | Contact form |
+| `/privacy` | `/nl/privacy` | Privacy policy (new — no content on staging yet) |
+
+Navigation links across all pages: **Services** (anchor to `/#services`), **AI Launchpad** (`/ai-launchpad`), **About** (`/about`), plus the **Connect** CTA button.
+
+---
+
+## Phase 1 — Foundation
+
+These steps establish the project skeleton. Nothing will look like the real site yet — the goal is a working Astro project with the correct brand tokens, fonts, and base layout shell.
+
+---
+
+### Step 001 — Project scaffolding and Tailwind brand tokens
+
+**Goal:** A working Astro project with Tailwind configured using the exact Qumo brand palette and Archia font. No pages with real content yet — just a smoke-test index page that displays all brand colors and font weights to confirm everything is wired correctly.
+
+**What to build:**
+- `astro.config.mjs` with Tailwind and sitemap integrations
+- `tailwind.config.mjs` with custom theme:
+ - Colors: `midnight` (#102022), `snow` (#F3F3F3), `brand-blue` (#5257E4), `brand-red` (#F71E3E)
+ - Font family: `archia` with system fallbacks (geometric sans-serif)
+ - Any brand-specific spacing, border-radius, or breakpoint overrides
+- `src/styles/global.css` with Tailwind directives and `@font-face` declarations for all Archia weights (Thin, Light, Regular, Medium, SemiBold, Bold) using woff2 files from `src/assets/fonts/archia/`
+- A temporary `src/pages/index.astro` that renders: a color swatch grid showing Midnight, Snow, Blue, Red, and the gradient; sample text in each Archia weight; a gradient bar to verify the CSS gradient renders correctly
+- `tsconfig.json` with strict mode
+- `package.json` with all required dependencies
+
+**Verification:**
+- `npm run build` succeeds
+- `npm run dev` shows the brand palette and all font weights rendering correctly
+- Compare the gradient against the staging site's gradient elements (hero accent, CTA sections)
+
+**Note on fonts:** The Archia woff2 files need to be manually copied from SharePoint (Branding > Brand Fonts) into `src/assets/fonts/archia/` before or during this step. If the font files are not yet available, use the system fallback and leave a TODO — the font-face declarations should still be in place.
+
+---
+
+### Step 002 — Base layout shell (HTML head, meta tags, empty nav/footer slots)
+
+**Goal:** A `BaseLayout.astro` component that provides the HTML document shell for every page: correct `` with charset, viewport, favicon, Archia font preloads, and slots for page-specific meta tags (title, description, OG, hreflang, JSON-LD). The body has placeholder slots for navigation and footer but no content yet.
+
+**What to build:**
+- `src/layouts/BaseLayout.astro` with:
+ - Props for `title`, `description`, `locale` (default `en`), `alternateLocale`, `canonicalUrl`, `ogImage`
+ - ``: charset, viewport, favicon (`/favicon.svg`), preconnect for fonts, Archia font preloading, canonical link, hreflang alternate links (en ↔ nl), OG tags, Twitter card tags
+ - `` with Midnight background, Snow text defaults, font-archia applied
+ - Named slots or component placeholders for `` and ``
+ - A `` for page content
+ - A slot or prop for injecting page-specific JSON-LD structured data
+- Update `src/pages/index.astro` to use the BaseLayout
+- `src/content/en.json` and `src/content/nl.json` — initial structure with just the global meta fields (site name, default description, default OG image path)
+- A `src/content/i18n.ts` helper function that loads the correct JSON based on locale
+
+**Verification:**
+- `npm run build` succeeds
+- View page source in browser: check that `` contains all required meta tags, hreflang links, OG tags
+- Verify the body has the correct background color (Midnight) and default text color (Snow)
+
+---
+
+### Step 003 — Navigation bar (desktop + mobile)
+
+**Goal:** A fully functional navigation bar matching the staging site's layout and behavior. The nav is consistent across all pages.
+
+**Before starting:** Open `https://qumo-pmj.webflow.io/` and study the navigation carefully:
+- Logo on the left (Qumo wordmark + Q icon, full-color logo on Midnight backgrounds)
+- Three navigation links: **Services** (links to `/#services`), **AI Launchpad** (links to `/ai-launchpad`), **About** (links to `/about`)
+- Language switcher (EN/NL dropdown) on the right
+- "Connect" CTA button with arrow icon on the right
+- Transparent/overlay background that becomes solid on scroll (observe the scroll behavior)
+- Mobile hamburger menu behavior (resize your browser to see it)
+- The nav links and CTA are the same across all pages (homepage, about, ai-launchpad, contact)
+
+**What to build:**
+- `src/components/Nav.astro` — responsive navigation matching the staging site
+- `src/components/LanguageSwitcher.astro` — EN/NL toggle that swaps between locale routes
+- Navigation links from `en.json` / `nl.json` (NL nav: "Diensten", "AI Launchpad", "Over Ons"; NL CTA: "Verbind")
+- Mobile hamburger menu with slide-in behavior
+- The "Connect" button styled with the arrow icon (replicate the custom arrow SVG from the staging site)
+- Scroll behavior: transparent → solid background on scroll (minimal vanilla JS in a `