Repository navigation
Complete conversion to Nuxt #5777
Description
The site is served by two generators: Eleventy renders most pages from src/, Nuxt renders the rest, and nuxt/server/middleware/legacy.ts proxies between them in dev. This is the last stretch of that migration: every remaining page moves to Nuxt, then Eleventy comes out.
Status: Eleventy is gone from main. 1-18 and 21 have merged. What is left is under "Still to do", split into what an open PR covers and what has no PR yet.
Still to do
Covered by an open PR
- Prepare the Nuxt app to move from nuxt/ to the repository root #5871 prepares moving the Nuxt app from
nuxt/to the repository root, so the move itself is a pure rename - Remove files orphaned by the 11ty retirement #5872 removes files the teardown left without references: unused images, nav icons, components and stylesheets. It shares
package.json,package-lock.json,nuxt/assets/css/style.cssand.claude/CLAUDE.mdwith 5871, so whichever merges second needs a small rebase. - Render every FAQ through one Faq component #5859 renders every FAQ through one
Faqcomponent. Part of consolidating the CTA components, below. - Track inline links to CTA destinations #5860 adds
CtaLink, one component for inline CTA links, so they fire the same events as the CTA buttons. Part of consolidating the CTA components, below. - Unified CTA tracking partials, matching Nuxt's PostHog data #5749 unified CTA tracking partials. It conflicts, since it edits
.eleventy.jsandsrc/templates that 18 deleted: close it, or cut it down to its Nuxt part. - customer-stories: link the FlowFuse product icon to /product/ directly #5874 links the FlowFuse product icon on customer story pages to
/product/directly, instead of/platform/features/, which only 301s there
Not covered by a PR yet
- Move
nuxt/to the repository root. The rename itself, once 5871 has merged. - Image optimisation. Production builds with
SKIP_IMAGES, so pages serve images as committed, where Eleventy generated resized, lazy-loaded variants. The plan from closing 20: optimise at deploy time on Netlify, replace<img>with<NuxtImg>, and removeSKIP_IMAGESand the Calibre workflow. - Unreferenced images 5872 leaves in place, in the
/images/root and/whitepaper/images/. They could be linked from emails or other sites, so they need checking by hand before removing. - Links into
src/from other repos. https://github.com/FlowFuse/admin/blob/main/.github/ISSUE_TEMPLATE/onboarding.md linkssrc/_data/team, which is nownuxt/data/team.
Content decisions deferred from review
Raised while reviewing the ports and left out of them on purpose, since they change content rather than move it. None has a PR, apart from the CTA consolidation.
/vs/pages are to be rewritten from scratch (raised on 6). They are live as ported.- Merge
/webinars/into/events/, as its own change with redirects (raised on 8). /partners/referral-sign-up/needs a content review by the owner of its form (raised on 7)./pricing/request-quote/: does any journey lead there, or should it go (raised on 12, unanswered). It is live.- Consolidate the CTA components, including one for inline links in prose (raised on 17 and on Remove leftover 11ty tags from Nuxt-rendered content #5857). Partly covered by 5859 and 5860.
- Blueprint descriptions come from READMEs in
FlowFuse/blueprint-libraryand render withv-html, the only such call site whose content is authored outside this repo. Decide whether that repo's review is enough of a trust boundary (raised on 7 and 17).
Order
1-17 were independent, targeted main and merged top to bottom, each rebased on the one before because they all touch the same two registry files (legacy.ts, nuxt.config.ts).
- 11ty: drop templates already superseded by Nuxt pages #5778 drops Eleventy templates already superseded by Nuxt pages
- webinars: serve /webinars/ from Nuxt #5779
/webinars/ - use-cases: serve /use-cases/ from Nuxt #5780
/use-cases/ - industries: serve /industries/ from Nuxt #5781
/industries/ - platform: serve /platform/ from Nuxt #5782
/platform/ - vs: serve /vs/ from Nuxt #5783
/vs/ - partners: serve /partners/ from Nuxt #5784
/partners/ - events: serve /events/ from Nuxt #5785
/events/ - landing: serve /landing/ from Nuxt #5786
/landing/ - free-consultation: serve /free-consultation/ from Nuxt #5787
/free-consultation/ - community: serve /community/newsletter/ from Nuxt #5788
/community/newsletter/ - pricing: serve /pricing/request-quote/ from Nuxt #5789
/pricing/request-quote/ - careers: redirect /careers/ to the job board #5790
/careers/redirects to the job board - about: serve /about/ from Nuxt #5791
/about/ - homepage: serve / from Nuxt #5792 the homepage
- node-red: serve /node-red/ from Nuxt #5793
/node-red/ - blueprints: serve /blueprints/ from Nuxt #5794
/blueprints/ - 11ty: retire the second generator #5795 the teardown: retires Eleventy and moves what was left in
src/undernuxt/ docs: rewrite the codebase guide for a Nuxt-only site #5796the codebase guide rewrite, folded into 18ci: compress images under nuxt/ again #5869compress images undernuxt/again; closed, since it slows the build down a lot. Image optimisation moves to Netlify at deploy time instead, under "Still to do".- sitemap: fail the build when a section or its dates go missing #5870 fails the build when the sitemap loses a section or its dates
18 was rebuilt on current main before it merged. It carries the teardown, the codebase guide rewrite that was 19, and fixes from verifying the full build: the nav icons in their own folder, merge-aware sitemap lastmod, and a test that fails if anything is left in src/.
Related PRs
Moved off Eleventy before this issue:
- Make the Application Guide part of the documentation #5745 makes the Application Guide part of
/docs/ - Make the Node-RED library part of the documentation, and convert it to Nuxt #5750 moves the Node-RED library into
/docs/and converts it to Nuxt
Alongside 1-18:
- Pull blueprints at build time; drop the live branch deploy path #5694 pulls blueprints at build time and drops the
livebranch deploy path. It overlapped 17 (its ownnuxt/lib/blueprints-sync.mjs, the same workflow), so it landed first and 17 was rebased onto it. - https://github.com/FlowFuse/blueprint-library/pull/182 drops a dead link from a blueprint heading, for 17
- fix(build_website): resolve the link-check sources tree rather than naming src/ github-actions-workflows#232 resolves the link-check sources tree instead of naming
src/, for 18 - dev proxy: register the migrated sections so local dev serves them from Nuxt #5815 registers the migrated sections in the dev proxy; closed, since each route PR registers its own section instead
- icons: standardize on <UIcon>, drop stray <Icon> usages #5803 standardises on
<UIcon>where 7 and 15 used a bare<Icon> - Restore the retired industry pages #5822 restores the
/industries/sector pages that 4 retired, after that decision was reversed - Serve /platform/device-agent/ from Nuxt with the new layout #5852 rebuilds
/platform/device-agent/, ported in 5, with the new layout - Remove leftover 11ty tags from Nuxt-rendered content #5857 replaces Eleventy tags left in Nuxt-rendered markdown with
site:andcta:links resolved at build time. Its revert, Revert "Remove leftover 11ty tags from Nuxt-rendered content" #5858, was closed without merging.
Notes
- Every route was checked against the published page before this was raised.
- https://github.com/FlowFuse/blueprint-library/pull/182 went with 17: a blueprint whose markdown heading is a link nests an
<a>inside the anchor@nuxt/contentwraps headings in, which HTML cannot represent, so the blueprint page logs a hydration mismatch. 11ty tolerated it. It was the only linked heading of the 19 blueprints, and the link was dead anyway. - fix(build_website): resolve the link-check sources tree rather than naming src/ github-actions-workflows#232 went with 18: the shared
Check linksstep passed--sources website/src, and hyperlink 0.3.2 exits non-zero on a path that is not there, after finding broken links but before printing them. Deletingsrc/would therefore have turned the link report into a missing-directory error. It resolves the tree at run time instead, so it merged before 18. Merging it releasedbuild_website/v1straight away.
Activity
dimitrieh commentedon Sep 11, 2026
@Yndira-E @KristopherLeads FYI. To complete the efforts for the Nuxt migration so there is no longer needing to deal with two architectures at the same time.
dimitrieh commentedon Sep 14, 2026
All eleven open PRs (3-9, 13-17) are rebased on current
main, so none is conflicting any more, and the two red builds are green.Why 8 and 9 were failing. Both call
useScrollToAnchor(), andnuxt/composables/useScrollToAnchor.tsonly existed on the/use-cases/branch. A Nuxt auto-import has no import line to break, so it compiles and then throws a 500 at prerender, on exactly the pages that call it. Each branch now carries a byte-identical copy, so they merge cleanly whatever the order.What to expect when merging in order. The registry files each PR touches have grown from two to four, so budget a rebase after each merge on:
nuxt/server/middleware/legacy.ts(NUXT_PREFIXES)nuxt/nuxt.config.ts(nitro.prerender.routes)nuxt/nuxt.config.ts(sitemap.urls— new: the[slug].vuesections are invisible to both sitemap sources, so each adds its own line)nuxt/content.config.ts(collection definitions)Three collisions are not textual and need a decision rather than a resolution:
collectSlugRoutes+readEntriespair tonuxt.config.ts. The second one merged should drop its copy, not keep both.nuxt/components/use-case/Card.vue. 4's version is a superset (it adds alookprop for the industry footer link); take that one.nuxt/utils/navIcons.tsandnuxt/utils/siteArt.tsare additive from several branches, so they concatenate cleanly, but check for duplicate keys after each.Verified. The eleven branches merged together build clean:
npm run build:nuxtcompletes with no prerender errors, and the previously-missing routes appear insitemap.xml. Every branch's unit tests pass; the 8 failures visible locally are@nuxt/contentresolution and fail identically onmain.Still open. 17 needs rebasing onto #5694 once that lands. 18 and 19 stay on
nuxt/eleventy-teardown-baseuntil 3-17 have merged.dimitrieh commentedon Sep 14, 2026
@ZJvandeWeg @Yndira-E FYI: I've updated the remaining PRs to fix failures/conflicts/etc
dimitrieh commentedon Sep 24, 2026
@Yndira-E after the following PRs are merged we can make the cleanup PRs ready to merge:
dimitrieh commentedon Sep 25, 2026
All of 1-17 have merged, so the cleanup is down to one PR.
mainand now targets it. It also carries the codebase guide rewrite from docs: rewrite the codebase guide for a Nuxt-only site #5796, which only made sense after the teardown. GitHub shows 5796 as merged because its commit reached its base branch; nothing has reachedmainyet.5795's CI currently fails at
integrations enumeration returned 0 nodes:https://ff-integrations.flowfuse.cloud/api/nodesreturns an empty catalogue, which stops any build of the site,mainincluded. It needs a re-run once that API returns data again.dimitrieh commentedon Sep 28, 2026
@Yndira-E @ZJvandeWeg I've reopened this issue as there are a few open PRs and there are some items mentioned in the "Still to do" section in this issue that need a quick review.