Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
208 changes: 103 additions & 105 deletions .claude/CLAUDE.md

Large diffs are not rendered by default.

7 changes: 0 additions & 7 deletions .claude/launch.json
Original file line number Diff line number Diff line change
@@ -1,13 +1,6 @@
{
"version": "0.0.1",
"configurations": [
{
"name": "eleventy",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev:eleventy"],
"port": 8080,
"autoPort": true
},
{
"name": "nuxt",
"runtimeExecutable": "npm",
Expand Down
871 changes: 0 additions & 871 deletions .eleventy.js

This file was deleted.

15 changes: 0 additions & 15 deletions .eleventyignore

This file was deleted.

14 changes: 6 additions & 8 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,21 +1,19 @@
.DS_Store
_site
node_modules
src/handbook/media
nuxt/content/docs/
# Synced from FlowFuse/blueprint-library by nuxt/modules/blueprints-source.ts. The
# Build Site workflow force-adds this tree to the `live` branch that Netlify deploys,
# because the library is private and cannot be cloned from a build.
# Synced from FlowFuse/blueprint-library by nuxt/modules/blueprints-source.ts.
nuxt/content/blueprints/

# Left in existing checkouts by the retired Eleventy build: its output and its
# eleventy-fetch cache. Nothing writes these any more.
_site
.cache

# Local development config
.vscode/

.env

# Cache for assets
.cache

# Local Netlify folder
.netlify

Expand Down
24 changes: 12 additions & 12 deletions CODEOWNERS
Original file line number Diff line number Diff line change
@@ -1,26 +1,26 @@
# Please note the _last matching rule_ is used

# Start with a catch all for the handbook
/src/handbook/ @ZJvandeWeg
/src/handbook/design @Yndira-E
/src/handbook/development @knolleary
/src/handbook/marketing @FlowFuse/marketing
/src/handbook/sales @MichaelBDavis
/nuxt/content/handbook/ @ZJvandeWeg
/nuxt/content/handbook/design @Yndira-E
/nuxt/content/handbook/development @knolleary
/nuxt/content/handbook/marketing @FlowFuse/marketing
/nuxt/content/handbook/sales @MichaelBDavis

# Customer department
/src/handbook/customer-success.md @Esmewieringa
/nuxt/content/handbook/customer-success.md @Esmewieringa

# Security Polices
/src/handbook/company/security/information-security.md @ZJvandeWeg
/src/handbook/company/security/access-control.md @knolleary
/src/handbook/company/security/data-management.md @ZJvandeWeg
/src/handbook/company/security/secure-development.md @knolleary
/nuxt/content/handbook/company/security/information-security.md @ZJvandeWeg
/nuxt/content/handbook/company/security/access-control.md @knolleary
/nuxt/content/handbook/company/security/data-management.md @ZJvandeWeg
/nuxt/content/handbook/company/security/secure-development.md @knolleary

# Change in values need sign off from both the CEO and CTO
/src/handbook/company/values.md @knolleary @ZJvandeWeg
/nuxt/content/handbook/company/values.md @knolleary @ZJvandeWeg

# Package-lock.json (engineering team)
/package-lock.json @FlowFuse/engineering @Yndira-E

# Changelog posts (tech writer required, product as backup)
/handbook/engineering/releases/writing-changelog @FlowFuse/marketing @FlowFuse/product @FlowFuse/engineering
/nuxt/content/handbook/engineering/releases/writing-changelog.md @FlowFuse/marketing @FlowFuse/product @FlowFuse/engineering
61 changes: 28 additions & 33 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,23 @@ schedule to pick up blueprint-library changes — either way it just calls a Net

## Repository structure

This repository is an **npm workspace** containing two projects:
This repository is an **npm workspace**. The whole site is one [Nuxt 4](https://nuxt.com/) application in `nuxt/`:

| Directory | Purpose |
|-----------|---------|
| *(root)* | Legacy [Eleventy](https://www.11ty.dev/) site — all existing content lives here |
| `nuxt/` | New [Nuxt 3](https://nuxt.com/) frontend — pages are migrated here incrementally |

### Nuxt migration

The site is being migrated from Eleventy (11ty) to Nuxt 3 using the [Strangler Fig pattern](https://martinfowler.com/bliki/StranglerFigApplication.html). Nuxt acts as the front door on port 3000: pages that have been migrated are served directly by Nuxt; all other routes are transparently proxied to the legacy 11ty server on port 8080.
| `nuxt/pages`, `nuxt/components` | Routes and the components they render |
| `nuxt/content` | Markdown and YAML content, read through [`@nuxt/content`](https://content.nuxt.com/) |
| `nuxt/public` | Everything served as a file: images, downloads, favicons |
| `nuxt/data` | JSON and YAML that components import directly (the nav, the team, site config) |
| `nuxt/assets` | Stylesheets, the two icon sets (`icons/` for `<UIcon>`, `nav-icons/` for `<NavIcon>`), the cookie-consent source |
| `nuxt/lib`, `nuxt/server/lib` | Plain-JS helpers with `node --test` unit tests |
| `scripts/` | Build-time syncs for the two external content sources, and the Algolia indexer |
| *(root)* | The workspace: npm scripts, Tailwind and PostCSS config, Netlify config |

The site was previously generated by [Eleventy](https://www.11ty.dev/) and was migrated to Nuxt
page group by page group, using the [Strangler Fig pattern](https://martinfowler.com/bliki/StranglerFigApplication.html).
That migration is complete and Eleventy is gone; a `.njk` file or a `src/` path in a comment
is a reference to what a page used to be.

## Prerequisites

Expand Down Expand Up @@ -54,40 +61,29 @@ Clone the repository, then install all dependencies (workspace packages are incl
npm install
```

### Start both servers (recommended)
### Start the dev server

```bash
npm run dev
```

This starts three watchers concurrently:

| Process | URL | Description |
|---------|-----|-------------|
| Nuxt dev server | http://localhost:3000 | Front door — serves migrated pages and proxies everything else |
| 11ty dev server | http://localhost:8080 | Legacy site (proxied through Nuxt) |
| PostCSS watcher | — | Compiles Tailwind CSS for the legacy site |
The site is then on **http://localhost:3000**. That one command starts everything:

**Use http://localhost:3000** as your development URL. The legacy 11ty server on port 8080 is also accessible directly if needed.
| Process | Description |
|---------|-------------|
| Nuxt dev server | The site, on port 3000 |
| PostCSS watcher | Compiles Tailwind CSS into `nuxt/public/css` |
| Docs watcher | Re-syncs a product-docs page as it changes (see below) |
| Blueprints watcher | Re-syncs the Blueprint Library when the sibling checkout changes |

**Note**: the first time running this, 11ty may take a little while to process all images in the `/docs` and `/handbook` folders.
`npm run dev:nuxt` runs the Nuxt server on its own, without the watchers.

**Note**: if you have previously run `npm run build:nuxt`, clean the generated directories before starting dev or you will get a `spawn EBADF` error:

```bash
npm run clean:nuxt
```

### Legacy-only mode

To run just the legacy 11ty stack (equivalent to the old `npm start`):

```bash
npm start
```

This starts the full legacy stack on http://localhost:8080 including docs, blueprints, and PostCSS.

### Running FlowFuse Documentation

The documentation for FlowFuse is maintained in the core [FlowFuse repo](https://github.com/FlowFuse/flowfuse). To run a local version of the documentation, clone that repository alongside this one:
Expand All @@ -98,7 +94,7 @@ The documentation for FlowFuse is maintained in the core [FlowFuse repo](https:/
/flowfuse
```

The `npm run dev` (and `npm start`) commands will retrieve the documentation from that folder and inject them into the site automatically. The docs will be available at http://localhost:3000/docs.
`npm run dev` will retrieve the documentation from that folder and inject it into the site automatically. The docs will be available at http://localhost:3000/docs.

Nothing needs configuring for that to happen. Every build resolves the docs in this order, and logs which one it used:

Expand All @@ -110,7 +106,7 @@ Nothing needs configuring for that to happen. Every build resolves the docs in t

`npm run docs` runs that resolution on its own, without a full build, writing `nuxt/content/docs` and `nuxt/public/docs`. Both are generated, and neither is committed on `main`.

`npm run dev` and `npm start` also watch the resolved docs and re-sync each file as it changes, so an edit appears without restarting. `npm run dev:nuxt` on its own does not include that watcher; run `npm run dev:docs` beside it if you want one.
`npm run dev` also watches the resolved docs and re-syncs each file as it changes, so an edit appears without restarting. `npm run dev:nuxt` on its own does not include that watcher; run `npm run dev:docs` beside it if you want one.

### Running Blueprints

Expand All @@ -126,18 +122,18 @@ Every build resolves blueprints in this order, and logs which one it used:

| Order | Source | Used when |
|-------|--------|-----------|
| 1 | `BLUEPRINTS_LOCAL=/path/to/blueprint-library` | The env var is set. A path that does not exist is an error, not a fallback. |
| 1 | `FLOWFUSE_BLUEPRINTS_LOCAL=/path/to/blueprint-library` | The env var is set. A path that does not exist is an error, not a fallback. |
| 2 | A sibling checkout: `../blueprint-library` | It exists. This is what local development relies on. |
| 3 | A clone, authenticated with a minted GitHub App installation token (`GH_BOT_APP_ID`/`GH_BOT_APP_KEY`) | Nothing above applied, and those env vars are set. This is what Netlify production deploys use — `blueprint-library` is private, so this can't clone anonymously the way docs does. |
| 4 | Skipped | Nothing above applied. Matches the previous behaviour for contributors without access to the private repo. |

`npm run blueprints` runs that resolution on its own, writing `src/blueprints`, which is gitignored. `npm start` re-runs it whenever the resolved source changes (`scripts/watch_blueprints.js`), but only when it found a source to watch in the first place — no sibling checkout means no watching.
`npm run blueprints` runs that resolution on its own, writing `nuxt/content/blueprints` and `nuxt/public/blueprints`, both gitignored. `npm run dev` re-runs it whenever the resolved source changes (`scripts/watch_blueprints.js`), but only when it found a source to watch in the first place — no sibling checkout means no watching.

## llms.txt

`/llms.txt` (and `/llms-full.txt`) are generated by the [`nuxt-llms`](https://github.com/nuxtlabs/nuxt-llms) module, configured in `nuxt/nuxt.config.ts` under the `llms` key. Sections are built from `@nuxt/content` collections (`docs`, `blog`, `changelog`, `ebooks`, `whitepapers`) plus a small hardcoded list of standalone Nuxt routes (pricing, integrations, etc.) that aren't backed by a collection.

The `handbook` collection is deliberately excluded — it's internal company documentation, not product content, so it has no `contentCollection` section here. Content still served by the legacy Eleventy site (customer-stories, use-cases, platform, etc.) is invisible to `@nuxt/content` and so is also absent from `llms.txt` until those pages are migrated to Nuxt.
The `handbook` collection is deliberately excluded: it's internal company documentation, not product content, so it has no `contentCollection` section here.

## How to add blog posts

Expand All @@ -162,5 +158,4 @@ triggers a website rebuild once it lands. A rebuild can also be started by hand

This setup was inspired by:

- [Eleventy Base Blog starter repository](https://github.com/11ty/eleventy-base-blog)
- [Oxide.Computer's website setup](https://github.com/oxidecomputer/website)
Loading
Loading