# 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 `