38 KiB
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 — <title>
How to use this document
- Work through the steps in order — each one builds on the previous.
- For every step, run
/opsx:explorewith the step description. Explore will decide if intermediate steps are needed before implementation. - 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. - After completing each step: run
npm run buildinsidewebsite/, thennpm run devand compare the result side-by-side with the staging Webflow site. Note discrepancies for the next iteration. - 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.mjswith Tailwind and sitemap integrationstailwind.config.mjswith custom theme:- Colors:
midnight(#102022),snow(#F3F3F3),brand-blue(#5257E4),brand-red(#F71E3E) - Font family:
archiawith system fallbacks (geometric sans-serif) - Any brand-specific spacing, border-radius, or breakpoint overrides
- Colors:
src/styles/global.csswith Tailwind directives and@font-facedeclarations for all Archia weights (Thin, Light, Regular, Medium, SemiBold, Bold) using woff2 files fromsrc/assets/fonts/archia/- A temporary
src/pages/index.astrothat 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.jsonwith strict modepackage.jsonwith all required dependencies
Verification:
npm run buildsucceedsnpm run devshows 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 <head> 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.astrowith:- Props for
title,description,locale(defaulten),alternateLocale,canonicalUrl,ogImage <head>: charset, viewport, favicon (/favicon.svg), preconnect for fonts, Archia font preloading, canonical link, hreflang alternate links (en ↔ nl), OG tags, Twitter card tags<body>with Midnight background, Snow text defaults, font-archia applied- Named slots or component placeholders for
<Nav />and<Footer /> - A
<slot />for page content - A slot or prop for injecting page-specific JSON-LD structured data
- Props for
- Update
src/pages/index.astroto use the BaseLayout src/content/en.jsonandsrc/content/nl.json— initial structure with just the global meta fields (site name, default description, default OG image path)- A
src/content/i18n.tshelper function that loads the correct JSON based on locale
Verification:
npm run buildsucceeds- View page source in browser: check that
<head>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 sitesrc/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
<script>tag) - Add nav content strings to
en.jsonandnl.json
Verification:
npm run dev— compare nav side-by-side withhttps://qumo-pmj.webflow.io/- Test responsive behavior: resize browser from desktop to mobile
- Test language switcher: links should point to
/nl/...variants (pages don't need to exist yet — just verify the URLs are correct) - Test scroll behavior: background should transition on scroll
Step 004 — Footer
Goal: A footer matching the staging site's layout, with all links, contact info, and the booking CTA.
Before starting: Scroll to the bottom of https://qumo-pmj.webflow.io/ and study the footer:
- Qumo logo
- Four columns: Company (About us, Our Mission, The Team), Services (Insights, Automation, Solutions), Approach (Discovery, Development, Integration), Contact (email, phone, LinkedIn)
- "Schedule a meeting" CTA button linking to the Outlook booking page
- Copyright line (© 2026), Privacy Policy link, Terms of Service link, KvK number (95514953)
- Terms and Conditions PDF link
- "Get a Demo" label above the schedule button
- Overall dark styling on Midnight background
Note: The footer on the staging site still references the old nav structure (Services: Insights/Automation/Solutions, Approach: Discovery/Development/Integration). Build it as-is — we can update the footer link labels in a later step if the team decides to align them with the new nav.
What to build:
src/components/Footer.astro— full footer matching the staging layout- All footer content strings in
en.json/nl.json(NL footer: Bedrijf, Diensten, Aanpak, Contact columns; "Plan een gesprek" CTA) - Links should use proper locale-aware paths
- External links (email
mailto:info@qumo.io?subject=Website%20Lead, phonetel:, LinkedIn, booking URLhttps://outlook.office365.com/book/QumoMeeting@qumo.io/, Terms PDF) should open in new tabs where appropriate - Integrate the footer into
BaseLayout.astro
Verification:
npm run dev— compare footer side-by-side with the staging site- Verify all links point to correct destinations
- Test responsive layout (footer columns should stack on mobile)
Phase 2 — Homepage (section by section)
Now we build the homepage incrementally, one section at a time. After each step, the homepage becomes progressively more complete. No animations yet — just structure, layout, and content.
Step 005 — Homepage hero section
Goal: The hero section of the homepage, matching the staging site's layout.
Before starting: Open https://qumo-pmj.webflow.io/ and focus on the hero area:
- Small label text above the main heading: "We build the AI & data solutions that make it happen."
- Large heading with a line break: "Faster answers, lower costs" / "Smarter decisions" (the line break placement matters for the visual rhythm)
- No explicit CTA button in the hero (unlike the old site) — the heading itself is the hook
- Background styling — note any gradient elements, patterns, or the Q-corner brand motif
- How it sits relative to the transparent nav overlay
- Spacing and padding on desktop vs mobile
NL version: "Wij bouwen de data- en AI-oplossingen die dat mogelijk maken." / "Sneller inzicht, lagere kosten" / "betere beslissingen"
What to build:
src/components/Hero.astro- Wire it into
src/pages/index.astrousingBaseLayout - Add all hero content to
en.jsonandnl.json - Create the NL homepage at
src/pages/nl/index.astrousing the same component with NL strings
Verification:
- Compare hero side-by-side with the staging site at
https://qumo-pmj.webflow.io/ - Check typography: heading should be Archia Bold, uppercase (per brand guidelines)
- Check the gradient or accent elements match
- Check NL version at
/nlhas the Dutch content - Test mobile responsiveness — the heading line breaks may change on smaller screens
Step 006 — Homepage services section (three service cards)
Goal: The services section with three cards: AI Launchpad, Data & Business Intelligence, Embedded Expertise.
Before starting: Scroll to the services section on https://qumo-pmj.webflow.io/:
- Section heading: "What we do"
- Subheading: "Three areas of expertise, one team. Combine what you need."
- Three cards, each with:
- A tag label (Innovation / Analytics / Expertise)
- A title (AI Launchpad / Data & Business Intelligence / Embedded Expertise)
- Body text (longer descriptions, quite different from the old site)
- A numbered circle illustration (1, 2, 3)
- The first card has a "Learn More" link to
/ai-launchpad; the other two link to#how-we-work
- Note the card layout — observe styling, whether they alternate, background treatments
NL version: "Wat we doen" / "Drie expertises, één team. Combineer wat nodig is." / card content fully translated
What to build:
src/components/ServiceCard.astro— reusable card component- Services section in the homepage with proper
id="services"anchor - All three cards with correct content from
en.json/nl.json - Numbered circle illustration SVGs (replicate from the staging site)
- "Learn More" / "Meer info" links
Verification:
- Compare the services section side-by-side with the staging site
- Check card layout, spacing, and typography
- Check that the
#servicesanchor works from the nav link - Mobile: verify cards stack properly
Step 007 — Homepage "Our approach" text section and cloud provider logos
Goal: The approach description text block and the cloud provider logo strip.
Before starting: Study this section on https://qumo-pmj.webflow.io/:
- "Our approach" section: A text block (no heading tag visible, but the text starts with "We always start small.") followed by a paragraph about starting with one conversation, biggest-impact project, first result. Then a second paragraph about what comes next.
- Cloud provider logos: Below that, a section with "any cloud platform — including EU-based providers" label, followed by two rows of logos:
- Row 1: Microsoft Azure, Amazon Web Services, Google Cloud
- Row 2: EU flag + "European providers" label, then Hostinger, Hetzner, "and more" (three dots icon)
- The logos are SVGs with specific styling (likely monochrome/brand-appropriate)
NL version: "Onze werkwijze" text fully translated, "Elk cloudplatform — inclusief Europese providers" label
What to build:
- "Our approach" text section with an
idanchor (the nav doesn't link here directly, but the service cards link to#how-we-work) - Cloud provider logo strip with SVG logos
- All content from
en.json/nl.json - The SVG logos should be inlined or stored in
src/assets/icons/— source from the staging site's CDN or recreate
Verification:
- Compare layout with the staging site
- Logo strip should display correctly across breakpoints
#how-we-workanchor from service card links should land here
Step 008 — Homepage mission section with founders CTA
Goal: The "About Qumo" mission paragraph with the "Our founders" CTA link.
Before starting: Study this section on https://qumo-pmj.webflow.io/:
- Label: "About Qumo"
- Heading: "Our mission is to empower organizations to unlock the full potential of their data"
- Body text: paragraph about subjective perspectives, extracting actionable insights, Qumo's support
- "Our founders" CTA button with arrow, linking to
/about#founders - Two small gradient accent images flanking the section
- Note the background treatment and spacing
NL version: "Over Qumo" label, fully translated heading and body, "Onze oprichters" CTA linking to /about#founders
What to build:
- Mission section component
- Content from
en.json/nl.json - Gradient accent elements (small decorative gradient blobs from the staging site)
- CTA link to
/about#founders
Verification:
- Compare with the staging site
- CTA link should point to the About page's founders section
Step 009 — Homepage "Delivered Solutions" stats and industry stats ticker
Goal: The two-layer stats section: project-specific "Delivered Solutions" stats on top, and the scrolling industry stats ticker below.
Before starting: Study this section carefully on https://qumo-pmj.webflow.io/:
- "Delivered Solutions" row (static, not scrolling):
- Label: "Our Expertise" + heading: "Delivered Solutions"
- Four stat cards: "Data Platform" (75% cloud cost reduction), "Fast Dashboards" (1w kickoff to working dashboard), "AI Agent" (85% reduction in research time), "Computer Vision" (0 manual review)
- Each card has: a label, large stat, description, decorative icon
- These are NOT the same generic industry stats from the old site — they're project-specific achievements
- Industry stats ticker (scrolling):
- Horizontal infinite scroll with cards: Action 61%, Revenue 8%, Efficiency 10%, Insight 66%, Operating Margin 60%, Critical 90%, Real-time 30%, Growth 84x, ROI 1300%, etc.
- Each card has: label, stat, description, icon, source info icon linking to the citation URL
- The ticker duplicates its cards for seamless looping
NL version: Delivered Solutions stats are translated ("Data Platform" → "Data Platform", "Snelle Dashboards", "AI Agent", "Computer Vision" with NL descriptions). The industry ticker stats appear to stay in English on the NL page (verify visually).
What to build:
src/components/DeliveredSolutions.astro— the static four-card stats sectionsrc/components/StatsTicker.astro— the infinite horizontal scroll- CSS-only animation for the ticker (
@keyframes+animation: scroll linear infinite) — no JavaScript - All stat data in
en.json/nl.json(label, stat, description for delivered solutions; label, stat, description, source URL for ticker stats)
Verification:
- Delivered Solutions cards match the staging site's content and layout
- The ticker should scroll smoothly and loop infinitely without visible jumps
- Compare speed and direction with the staging site
- Mobile: verify both sections are readable
Step 010 — Homepage final CTA section
Goal: The bottom CTA section before the footer ("Quantify More with Qumo").
Before starting: Study the very bottom of https://qumo-pmj.webflow.io/ (above the footer):
- "Turn complex data into insights" label text
- "Quantify More with Qumo" heading
- "Contact Us" CTA button with arrow, linking to
/contact - Background treatment — likely gradient or accent pattern
NL version: "Zet complexe gegevens om in inzichten" / "Meer innovatie met Qumo" (note: the NL staging site currently has a rendering glitch "Meer innovatieantifyre withmet Qumo" — use the correct translation) / "Neem contact op" CTA
What to build:
- CTA section component
- Content from
en.json/nl.json - CTA button linking to
/contact
Verification:
- Compare with the staging site's bottom CTA
- The homepage should now be complete in structure (no animations yet)
- Navigate through the full homepage from hero to footer and compare the flow with the staging site
Phase 3 — About page
Step 011 — About page hero and mission section
Goal: The About page hero and mission statement.
Before starting: Open https://qumo-pmj.webflow.io/about and study:
- Hero: Q-corner pattern SVG in background, label "Building sustainable partnerships", main heading "Our mission is to empower organizations to unlock the full potential of their data", "Discover Qumo" scroll button
- Below the hero: subheading "Our data solutions integrate seamlessly into your organization for long-term sustainability." with decorative icon
- Mission section (
#mission): "Our Mission" heading, two paragraphs of mission text, "Work with us" CTA button linking to/contact - The nav links remain consistent (Services, AI Launchpad, About)
What to build:
src/pages/about.astroandsrc/pages/nl/about.astro- About hero with Q-corner pattern background (SVG from the staging site)
- Mission section with
id="mission"anchor - All content in
en.json/nl.json
Verification:
- Compare with
https://qumo-pmj.webflow.io/about - Check the hero background pattern matches
- Verify
#missionanchor works
Step 012 — About page founders section
Goal: The "Our Founders" section with three team members (simplified from the old site's five).
Before starting: Study the founders section on https://qumo-pmj.webflow.io/about:
- Section heading: "Our Founders" (NOT "Meet The Team" — this changed)
- Three founders (not five):
- Luigi Maiorano — "Co-founder · Head of AI & Engineering" — bio about CV to LLM agents, aerospace background, satellite systems and GIS
- Jelle Duives — "Co-founder · Head of Strategy & Growth" — bio about client conversations, management consulting, enterprise software, analytics leadership
- Matthijs Torsij — "Co-founder · Head of Data Analytics & Platforms" — bio about data foundation, pipelines, dashboards, aerospace background, "and shoe sales"
- Each card: photo, role label, name, "Email Me" link, "LinkedIn" link, bio paragraph
- The card layout is different from the old site — larger cards with bios visible, not just name + links
- Photo styling: note any specific cropping, filters, or backgrounds
- Note that Luigi's "Email Me" link appears to be missing the mailto: href on the staging site (just shows text) — fix this in the rebuild
Note: Jorn van Beek and Stijn van Selling are no longer in the founders section on the staging site. Only Luigi, Jelle, Matthijs appear.
What to build:
src/components/FounderCard.astro(renamed from TeamMember to match the new framing)- Founder data in
en.json/nl.json(names, roles, bios, email addresses, LinkedIn URLs) - Photos in
src/assets/images/founders/(source from staging site CDN or SharePoint) - Section with
id="founders"anchor (the homepage CTA links to/about#founders) - Email links with
?subject=Website%20Leadquery parameter - Fix Luigi's missing mailto: link
Verification:
- Compare founder cards with the staging site
- Verify three founders appear with correct names, roles, and bios
#foundersanchor works from homepage "Our founders" link- All email and LinkedIn links work correctly
Step 013 — About page CTA
Goal: The "Ready to get started with Qumo?" CTA at the bottom of the About page.
Before starting: Check the bottom of https://qumo-pmj.webflow.io/about:
- "Let's Connect" label
- "Ready to get started with Qumo?" heading
- "Contact us" CTA button linking to
/contact
What to build:
- Reuse or adapt the homepage CTA component
- Content from
en.json/nl.json
Verification:
- The About page should now be structurally complete
- Compare the full page flow with the staging site
Phase 4 — AI Launchpad page
This is a new page that doesn't exist on the current production site. It's a product page for Qumo's AI offering.
Step 014 — AI Launchpad hero and "Sound familiar?" section
Goal: The AI Launchpad page hero and the pain-points section.
Before starting: Open https://qumo-pmj.webflow.io/ai-launchpad and study:
- Hero: "AI Launchpad" label, heading "Integrated AI solution within 2 to 4 weeks", subtext "From assessment to working application, embedded in your daily work. Not a report — something that actually works."
- "Sound familiar?" section: Five pain-point items, each with an exclamation mark icon and a description:
- Contracts/invoices processed manually
- Customer service answering same 20 questions
- Operational data scattered
- Quotes assembled manually
- Technicians spending hours on inspection
- The layout of these items (list? cards? grid?)
NL version: Fully translated hero and pain points
What to build:
src/pages/ai-launchpad.astroandsrc/pages/nl/ai-launchpad.astro- AI Launchpad hero section
- "Sound familiar?" pain-points section
- All content in
en.json/nl.json
Verification:
- Compare with
https://qumo-pmj.webflow.io/ai-launchpad - Hero and pain points should match layout and content
Step 015 — AI Launchpad "What we build" and process steps
Goal: The solutions list and the four-step process.
Before starting: Study the middle sections of the AI Launchpad page:
- "What we build" section: Five solution items, each with a checkmark and description:
- Document processing pipeline
- AI agent trained on documentation
- Dashboard with automated pipeline
- Semantic search tool
- Computer vision model
- "How it works" section: "From assessment to working application" heading, four numbered steps:
- Mapping opportunities — bullet points, deliverable label ("Value stream mapping, ROI overview"), environment label ("Qumo Environment")
- Prioritize & concept — bullets, deliverable, environment label ("Client Environment")
- Implementation — bullets, deliverable
- Training & adoption — bullets, deliverable
- Note the visual treatment: numbered steps with connecting flow, environment tags, deliverable callouts
What to build:
- "What we build" solutions list component
- Process steps component (four steps with numbered indicators, deliverables, environment tags)
- All content in
en.json/nl.json
Verification:
- Compare solutions and process steps with the staging site
- Check the numbered flow layout
- Environment tags and deliverable labels should be visible
Step 016 — AI Launchpad practical details and CTA
Goal: The "Fits your environment" section and the final CTA.
Before starting: Study the bottom of the AI Launchpad page:
- "Practical details" / "Fits your environment": Two checkmark items about building on existing environments and alternatives for sensitive data
- A callout block with a rocket icon: "Built by engineers from aerospace and mathematics. Accustomed to systems where failure isn't an option — the same standard, now applied to your business."
- CTA section: "Let's Connect" label, "Interested how AI can help your organization?" heading, "Contact us" button
What to build:
- Practical details section with checkmark items
- Callout block with rocket icon (Phosphor Icons rocket-launch)
- CTA section (reuse/adapt from other pages)
- All content in
en.json/nl.json
Verification:
- Compare with the staging site's bottom sections
- The AI Launchpad page should now be structurally complete
- Navigate through the full page and compare
Phase 5 — Contact page and remaining pages
Step 017 — Contact page (form frontend only)
Goal: The contact page with the form UI. The form doesn't actually submit yet — that comes in a later step with the Go backend.
Before starting: Open https://qumo-pmj.webflow.io/contact and study:
- Hero: "Connect with Qumo" label, heading "Ready to level up your data? Let's start a conversation."
- The form: inspect in DevTools — look for field names, types, hidden fields
- Form styling: input borders, focus states, the "Let's Connect" submit button with arrow
- Success message: "Thank you! Your submission has been received!"
- Error message: "Oops! Something went wrong while submitting the form."
- Background image on the right side
- Below the form: "Still not sure yet? Discover more" section with "About Qumo" link
What to build:
src/pages/contact.astroandsrc/pages/nl/contact.astrosrc/components/ContactForm.astro— the form UI with:- Fields matching the staging site (inspect to find exact fields)
- Honeypot hidden field (for spam protection)
- JavaScript timestamp token (set on page load, validated server-side)
- Client-side validation (required fields, email format)
- Submit handler that POSTs to
/api/contact(will fail until backend exists — that's fine) - Success and error state display
- "Still not sure" section below the form
- Content in
en.json/nl.json
Verification:
- Compare form layout with the staging site
- Test form validation (try submitting empty, try invalid email)
- The form will fail on submit (no backend yet) — verify it shows the error state
- Check mobile layout
Step 018 — Privacy policy page
Goal: A privacy policy page. The staging site has a placeholder link (#) — this is new content.
What to build:
src/pages/privacy.astroandsrc/pages/nl/privacy.astro- Privacy policy content in
en.json/nl.json— cover: what data is collected via the contact form, how it's used, who processes it (SMTP relay provider), data retention, user rights under GDPR, contact info for data requests - Simple text-heavy page using BaseLayout
- Link the footer's "Privacy Policy" link to this page
Verification:
- The page renders with clean typography
- Footer privacy link works
- Both EN and NL versions are available
Step 019 — 404 page
Goal: A custom 404 page.
What to build:
src/pages/404.astro— a clean 404 page with:- "Page not found" message
- Link back to homepage
- Consistent with the site's design (Midnight background, Archia font, maybe a subtle brand element)
- Content in
en.json/nl.json(404 page defaults to EN since Astro can't detect locale from a missing URL)
Verification:
- Visit a non-existent URL in dev mode — the 404 page should render
- Check it looks on-brand
Phase 6 — Animations and polish
Now we add the visual polish that makes the site feel alive. Go back to the staging site and study every animation and transition carefully.
Step 020 — Scroll-triggered animations (fade-in, slide-up)
Goal: Add the scroll-triggered entrance animations that the Webflow site uses.
Before starting: Open https://qumo-pmj.webflow.io/ in a fresh browser window and scroll slowly through the entire page. Note:
- Which elements animate in (headings, cards, sections, images)
- What type of animation (fade-in, slide-up, slide-in-from-left/right, scale)
- Timing: how fast, any stagger between elements in a group (e.g., service cards appearing one after another)
- Do the same for
/about,/ai-launchpad, and/contact
What to build:
- CSS
@keyframesfor: fade-in, slide-up, slide-in-left, slide-in-right (and any others observed) - A small
<script>usingIntersectionObserverthat adds an.in-viewclass when elements enter the viewport - Apply the appropriate animation classes to elements across all pages
- Stagger support for card groups (e.g.,
animation-delay: 0.1s, 0.2s, 0.3s)
Verification:
- Scroll through each page and compare animation behavior with the staging site
- Animations should feel smooth and match the timing of the Webflow originals
- Elements should only animate once (not re-trigger on scroll up)
- Test on mobile
Step 021 — Navigation scroll effects and page transitions
Goal: Polish the nav scroll behavior and add Astro View Transitions.
Before starting: On the staging site, pay attention to:
- How the nav background transitions from transparent to solid as you scroll
- Any blur/backdrop effect on the solid state
- Page transition animations when clicking between pages (if any)
What to build:
- Refine the nav scroll effect: smooth transition (not a hard toggle), correct opacity/blur values
- Astro View Transitions (
transition:animate) between pages for smooth navigation - Ensure the mobile menu has smooth open/close animation
Verification:
- Nav scroll transition should be smooth and match the staging site
- Clicking between pages should have a smooth transition
- Mobile menu opens and closes smoothly
Step 022 — Hover effects and micro-interactions
Goal: Add all the small interaction details: button hovers, card hovers, link underlines, CTA arrow animations.
Before starting: On the staging site, hover over:
- The "Connect" and CTA buttons (arrow animation? color change?)
- Service cards (elevation, border, scale?)
- Founder cards (overlay, zoom?)
- Footer links
- The language switcher
- Nav links
- The "Learn More" links on service cards
What to build:
- Button hover states (the arrow icons likely animate on hover)
- Card hover effects
- Link hover underline animations
- Focus states for keyboard navigation (accessibility)
- Transition timing matching the staging site
Verification:
- Hover over every interactive element and compare with the staging site
- Test keyboard focus states (Tab through the page)
- Check that transitions are smooth
Phase 7 — SEO, structured data, and forms backend
Step 023 — JSON-LD structured data for all pages
Goal: Add schema.org structured data to every page.
What to build:
- Homepage:
ProfessionalServiceschema (org info, services, contact),BreadcrumbList - About:
Organizationschema,Personschema for each founder,BreadcrumbList - AI Launchpad:
ServiceorProductschema,BreadcrumbList - Contact:
ContactPageschema,BreadcrumbList - Privacy:
BreadcrumbList - Inject via the BaseLayout's JSON-LD slot/prop
Verification:
- View page source and check the
<script type="application/ld+json">blocks - Validate with schema.org validator
- Ensure no errors or warnings
Step 024 — Sitemap, robots.txt, and SEO final pass
Goal: Finalize all SEO elements.
What to build:
- Configure
@astrojs/sitemapinastro.config.mjswith all EN and NL URLs (including/ai-launchpadand/nl/ai-launchpad) public/robots.txt— allow all crawlers including AI bots- Audit every page for: unique
<title>, meta description, canonical URL, hreflang alternates, OG tags, Twitter card tags - Verify all images have
alttext - Verify heading hierarchy (single
h1per page, logical nesting) - OG image in
public/og-image.png
Verification:
npm run build— check that sitemap is generated with all URLs- Check
dist/robots.txtis correct - View source on each page and audit the
<head>section
Step 025 — Contact form Go backend
Goal: The Go form handler that receives contact form submissions and sends email.
What to build:
form-handler/main.go:- HTTP server listening on
:8080 POST /api/contactendpoint- JSON body parsing (fields matching the contact form)
- Validation: required fields, email format
- Honeypot check: if hidden field has a value, silently accept but don't send
- Timestamp check: reject if < 3 seconds after page load
- Rate limiting: in-memory counter, max 5 per IP per hour
- Send email via SMTP relay (Resend or Brevo)
- JSON response
- CORS headers
- HTTP server listening on
form-handler/go.mod,go.sum,Dockerfile- Update
.env.examplewith SMTP config variables
Verification:
- Build and test with curl
- Test honeypot rejection, rate limiting
- Integration test with the contact page
Phase 8 — Docker and deployment
Step 026 — Dockerfiles and docker-compose.yml
Goal: Production-ready containerization.
What to build:
website/Dockerfile: multi-stage Node → nginx:stable-alpine-slimwebsite/nginx.conf: static file serving, SPA fallback to 404.html, gzipform-handler/Dockerfile: multi-stage Go → Alpine- Root
docker-compose.ymlwith both services onqumo_services_proxy_network .env.exampledocumentedREADME.mdwith build and deploy instructions
Verification:
docker compose buildsucceedsdocker compose up -dstarts both containers- Both containers respond correctly
docker compose downstops cleanly
Step 027 — Caddyfile block and deployment documentation
Goal: The Caddy configuration for serving qumo.io in production.
What to build:
- Caddyfile block: security headers, caching rules,
/api/contactroute, www→apex redirect, noimport authentik(public site) - Complete deployment guide in
README.md - Document the DNS cutover procedure
Verification:
- Caddyfile block matches the rebuild plan
- README is self-contained
Phase 9 — Final QA
Step 028 — Full visual QA pass
Goal: Thorough side-by-side comparison of every page against the staging site.
Before starting: Open dev server and https://qumo-pmj.webflow.io/ side-by-side. Go through every page at every breakpoint.
What to check:
- Typography: sizes, weights, line heights, letter spacing
- Spacing: padding, margins, gaps
- Colors: gradients, Midnight shades
- Images: are placeholders replaced?
- Responsive: 375px, 768px, 1024px, 1440px
- Animations: timing and easing
- Forms: field layout and styling
- All links work (footer, nav, CTAs, anchors)
- Language switcher works on every page
- Accessibility: Tab navigation, focus states, heading structure, alt text
Verification:
- Every page matches the staging site (or is an intentional improvement)
npm run buildsucceeds- Lighthouse score ≥ 90 on Performance, Accessibility, Best Practices, SEO
Step summary table
| # | Step name | Phase | Depends on |
|---|---|---|---|
| 001 | Project scaffolding and Tailwind tokens | Foundation | — |
| 002 | Base layout shell | Foundation | 001 |
| 003 | Navigation bar | Foundation | 002 |
| 004 | Footer | Foundation | 002 |
| 005 | Homepage hero section | Homepage | 003, 004 |
| 006 | Homepage services section | Homepage | 005 |
| 007 | Homepage approach text + cloud logos | Homepage | 006 |
| 008 | Homepage mission section + founders CTA | Homepage | 007 |
| 009 | Homepage delivered solutions + stats ticker | Homepage | 008 |
| 010 | Homepage final CTA | Homepage | 009 |
| 011 | About page hero + mission | About | 004 |
| 012 | About page founders section | About | 011 |
| 013 | About page CTA | About | 012 |
| 014 | AI Launchpad hero + pain points | AI Launchpad | 004 |
| 015 | AI Launchpad solutions + process steps | AI Launchpad | 014 |
| 016 | AI Launchpad practical details + CTA | AI Launchpad | 015 |
| 017 | Contact page (form frontend) | Contact | 004 |
| 018 | Privacy policy page | Other pages | 002 |
| 019 | 404 page | Other pages | 002 |
| 020 | Scroll-triggered animations | Animations | 010, 013, 016 |
| 021 | Nav scroll effects + page transitions | Animations | 020 |
| 022 | Hover effects + micro-interactions | Animations | 021 |
| 023 | JSON-LD structured data | SEO | 016, 017 |
| 024 | Sitemap, robots.txt, SEO final pass | SEO | 023 |
| 025 | Contact form Go backend | Backend | 017 |
| 026 | Dockerfiles and docker-compose.yml | Deployment | 024, 025 |
| 027 | Caddyfile block + deploy docs | Deployment | 026 |
| 028 | Full visual QA pass | QA | 027 |