Skip to content

/ai: rebuild on Nuxt, with a shared command block - #5681

Merged
KristopherLeads merged 13 commits into
mainfrom
ai/nuxt-rebuild
Aug 27, 2026
Merged

/ai: rebuild on Nuxt, with a shared command block#5681
KristopherLeads merged 13 commits into
mainfrom
ai/nuxt-rebuild

Conversation

@dimitrieh

@dimitrieh dimitrieh commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Description

Rebuilds /ai on Nuxt and deletes src/ai.njk, so one renderer owns the route. Same page, same copy, same classes.

Opened for discussion rather than to merge as-is. It overlaps #5670, which rebuilds the same page on 11ty and is where the content is being reviewed. Whichever approach we take, the other closes.

The part worth keeping either way is nuxt/components/content/FfCommand.vue. The copyable command block is currently markup plus a copy helper hand-pasted per page, and putting it in components/content/ means markdown can use it too. #5682 is stacked on this and does that for the changelog entry.

Related Issue(s)

FlowFuse/flowfuse#8192

Checklist

  • I have read the contribution guidelines
  • I have considered the performance impact of these changes
  • Suitable unit/system level tests have been added and they pass
  • Documentation has been updated
  • For blog PRs, an Art Request has been created (instructions)

Moves /ai from 11ty to Nuxt, following the strangler-fig migration the repo
guide describes, and deletes src/ai.njk so one renderer owns the route. Same
page, same copy, same classes: nuxt.config.ts already links /css/style.css
and layouts/default.vue already carries .ff-website, so all 223 gated rules
apply unchanged.

What the port buys:

- nuxt/components/content/FfCommand.vue replaces markup plus a per-page copy
  helper that was hand-pasted into src/platform/device-agent.njk and /ai.
  Living in components/content means markdown can use it too, so the
  changelog can carry the same block instead of restating the address.
- The agent tabs and the showcase rotation become reactive state rather than
  roughly 120 lines of querySelectorAll and setInterval in the page.
- FAQ structured data goes through useSchemaOrg. The 11ty partial
  interpolated answers into a JSON string, so markup in an answer landed in
  the schema.
- /ai moves from sitemap-legacy.xml into sitemap.xml.

Deliberate changes, not ports:

- Sign-up buttons are CtaSignUp, so the copy is the site's fixed "Try it
  out" and the event is cta-sign-up. The .njk had bespoke labels and reused
  cta-try-it-out.
- Governance and local-agent icons are UIcon lucide equivalents rather than
  inlined SVG includes.
@netlify

netlify Bot commented Aug 26, 2026

Copy link
Copy Markdown

Deploy Preview for flowforge-website ready!

Name Link
🔨 Latest commit 8b0323c
🔍 Latest deploy log https://app.netlify.com/projects/flowforge-website/deploys/6a8f46f5b3f4d200088fc757
😎 Deploy Preview https://deploy-preview-5681--flowforge-website.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
Lighthouse
Lighthouse
1 paths audited
Performance: 62 (🟢 up 8 from production)
Accessibility: 96 (no change from production)
Best Practices: 100 (no change from production)
SEO: 85 (no change from production)
PWA: -
View the detailed breakdown and full score reports

To edit notification comments on pull requests, go to your Netlify project configuration.

Deleting src/ai.njk took /ai out of the 11ty output, and the Nuxt page did
not replace it: the prerender crawler only follows links from Nuxt-rendered
pages, and every link to /ai lives in 11ty-generated HTML (nav, homepage).
So the route never reached nuxt/dist and the link checker reported a bad
/ai link from every page that links it.

Listed explicitly beside /pricing and /product, which are there for the
same reason.
Four of the six lucide names emitted no CSS rule at all, so those icons
rendered as empty spans on the preview: three of the four governance tiles
had no glyph, and neither did the Local and Custom Agents tab. Verified on
the deploy preview, where only circle-check and chevron-down had a
:where(.i-lucide\:...) rule with mask data. The build had warned about it
("failed to load icon lucide:shield-check") and I read that as pre-existing
noise, since the same warning fires for icons other pages use.

There is no local @iconify-json collection in the repo, so an icon name
nothing else already uses has nothing to resolve from.

Now inlines the same SVGs src/ai.njk pulled in with {% include %}, which is
the more faithful port anyway: no network fetch, and stroke="currentColor"
keeps the tab glyph turning white with its label when the tab is active.
@ZJvandeWeg

Copy link
Copy Markdown
Member

@KristopherLeads @dimitrieh Who would be reviewer here? I'd like to understand if I'm blocking the PR to be merged tomorrow during the release.

@dimitrieh

Copy link
Copy Markdown
Contributor Author

@ZJvandeWeg this is being worked on by @KristopherLeads https://flowfuse.slack.com/archives/C02TG4WH5PC/p1787757568826959 and has been discussed to be a deliverable for today in the product<>marketing sync and in an earlier meeting before that. I'd say, I am the reviewer alongside marketing after Kristopher is done adjusting the PR I initially setup. We can loop you in, if you'd like.

@dimitrieh

Copy link
Copy Markdown
Contributor Author

@dimitrieh

Copy link
Copy Markdown
Contributor Author

PS: If this merges, the nuxt component for this can then also be used for the other prs for updating docs/changelog/etc. Even can be considered to be put in the release blogpost if desired. Perhaps something to consider
CleanShot 2026-08-26 at 21 55 19@2x

@KristopherLeads

Copy link
Copy Markdown
Contributor

Note - once documentation is live, we need to swap the links.

@dimitrieh

dimitrieh commented Aug 27, 2026

Copy link
Copy Markdown
Contributor Author

Note - once documentation is live, we need to swap the links.

@KristopherLeads can you elaborate?

Just read, think https://flowfuse.slack.com/archives/C02TG4WH5PC/p1787774280052259?thread_ts=1787765665.727169&cid=C02TG4WH5PC is what you are referring to

@KristopherLeads
KristopherLeads merged commit 34230e2 into main Aug 27, 2026
7 checks passed
@KristopherLeads
KristopherLeads deleted the ai/nuxt-rebuild branch August 27, 2026 13:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants