Skip to content

Commit 7e074f0

Browse files
authored
Merge branch 'main' into PabloFilomeno83-patch-13
2 parents 8a39971 + 6d870e3 commit 7e074f0

135 files changed

Lines changed: 17548 additions & 4994 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.claude/CLAUDE.md

Lines changed: 212 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,212 @@
1+
# FlowFuse Website — Codebase Guide
2+
3+
## Stack
4+
5+
- **SSG**: Eleventy (11ty) v3, source in `src/`, output to `_site/`
6+
- **CSS**: Tailwind v3 via PostCSS → `_site/css/style.css`
7+
- **Templates**: Nunjucks (`.njk`) + Markdown
8+
- **Search**: Algolia (`scripts/index-algolia.js`)
9+
- **Hosting**: Netlify; publish dir = `_site`
10+
- **Nuxt migration**: parallel Nuxt 3 project lives in `nuxt/` (see [nuxt/CLAUDE.md](nuxt/CLAUDE.md))
11+
12+
## Dev commands
13+
14+
```bash
15+
npm start # all watchers in parallel (11ty + nuxt + postcss + docs + blueprints)
16+
npm run dev # eleventy + postcss + nuxt only
17+
npm run dev:eleventy # 11ty only, port 8080
18+
npm run dev:nuxt # Nuxt only, port 3000/3001
19+
npm run docs # sync docs from external source once
20+
npm run build # production build
21+
```
22+
23+
## Directory layout
24+
25+
```
26+
src/
27+
├── _data/ # Global data files (authors, tags, site config, etc.)
28+
├── _includes/
29+
│ ├── layouts/ # Nunjucks layout templates
30+
│ └── components/ # Reusable partials
31+
├── blog/ # Blog posts → /blog/YYYY/MM/slug/
32+
├── changelog/ # Changelog entries → /changelog/YYYY/MM/slug/
33+
├── customer-stories/ # Case studies → /customer-stories/slug/
34+
├── docs/ # Product docs → /docs/section/slug/ (synced from external)
35+
├── handbook/ # Employee handbook → /handbook/section/slug/
36+
├── css/ # Tailwind + custom CSS
37+
├── images/ # Static images
38+
└── public/ # Pass-through static files
39+
scripts/ # Build-time scripts (copy_docs.js, copy_blueprints.js, etc.)
40+
lib/ # Shared helpers used by .eleventy.js and scripts
41+
.eleventy.js # Main Eleventy config (1100+ lines)
42+
```
43+
44+
---
45+
46+
## Content types
47+
48+
### Blog posts
49+
50+
**Source:** `src/blog/YYYY/MM/{slug}.md`
51+
**URL:** `/blog/YYYY/MM/{slug}/`
52+
**Layout:** `layouts/post.njk`
53+
54+
```yaml
55+
---
56+
title: "Post title"
57+
subtitle: "Optional subtitle"
58+
description: "SEO meta description"
59+
date: 2026-04-09
60+
authors: ["username"] # must match an entry in src/_data/team/ or guests/
61+
image: /blog/YYYY/MM/images/hero.png
62+
video: "youtube_id" # optional
63+
tags:
64+
- flowfuse
65+
- releases
66+
keywords: "kw1, kw2" # optional
67+
release: "2.29" # for release posts
68+
features: # optional release feature list
69+
- id: feature-slug
70+
heading: "Feature Name"
71+
cta: # optional call-to-action block
72+
type: sign-up # or: contact
73+
title: "CTA Title"
74+
description: "CTA body"
75+
---
76+
```
77+
78+
Tag options are defined in `src/_data/blogTags.json`. Future-dated posts are excluded from collections until their date arrives.
79+
80+
---
81+
82+
### Changelog entries
83+
84+
**Source:** `src/changelog/YYYY/MM/{slug}.md`
85+
**URL:** `/changelog/YYYY/MM/{slug}/`
86+
**Layout:** `layouts/post-changelog.njk`
87+
88+
```yaml
89+
---
90+
title: "Feature Name"
91+
description: "One-line summary of what changed"
92+
date: 2026-04-07 12:00:00
93+
authors: ['username']
94+
tags:
95+
- changelog
96+
issues: # optional GitHub issue links
97+
- https://github.com/FlowFuse/flowfuse/issues/1234
98+
---
99+
```
100+
101+
Each year has a `src/changelog/YYYY/YYYY.json` that tags the collection.
102+
103+
---
104+
105+
### Handbook pages
106+
107+
**Source:** `src/handbook/{department}/{slug}.md`
108+
**URL:** `/handbook/{department}/{slug}/`
109+
**Layout:** `layouts/documentation.njk` (shared with docs)
110+
111+
```yaml
112+
---
113+
navTitle: "Title shown in sidebar nav"
114+
navGroup: "Optional group heading"
115+
---
116+
```
117+
118+
Department folders: `company/`, `design/`, `engineering/`, `marketing/`, `operations/`, `peopleops/`, `sales/`
119+
Collection config: `src/handbook/handbook.json`
120+
121+
---
122+
123+
### Product docs
124+
125+
**Source:** `src/docs/{section}/{slug}.md`**do not edit directly**; synced via `node scripts/copy_docs.js` from the external `flowfuse/flowfuse` monorepo.
126+
**URL:** `/docs/{section}/{slug}/`
127+
**Layout:** `layouts/documentation.njk`
128+
129+
```yaml
130+
---
131+
navTitle: "Page title for sidebar"
132+
navGroup: "Section heading"
133+
navOrder: 3
134+
meta:
135+
description: "Page description"
136+
# optional redirect:
137+
redirect:
138+
to: https://example.com
139+
layout: redirect
140+
---
141+
```
142+
143+
Collection config: `src/docs/docs.json`
144+
145+
---
146+
147+
### Customer stories
148+
149+
**Source:** `src/customer-stories/{slug}.md`
150+
**URL:** `/customer-stories/{slug}/`
151+
**Layout:** `layouts/story.njk`
152+
153+
```yaml
154+
---
155+
title: "Story title"
156+
description: "SEO meta description"
157+
image: /images/stories/hero.jpeg
158+
date: 2025-09-29
159+
logo: /images/stories/logos/company-logo.png
160+
hubspot:
161+
formId: "uuid"
162+
story:
163+
brand: "Company Name"
164+
url: "https://company.com"
165+
logo: /images/stories/logos/company-logo.png
166+
quote: "Customer quote"
167+
challenge: "Problem statement"
168+
solution: "How FlowFuse solved it"
169+
products:
170+
- Node-RED
171+
- FlowFuse
172+
results:
173+
- Measurable outcome 1
174+
---
175+
```
176+
177+
Collection config: `src/customer-stories/customer-stories.json`
178+
179+
---
180+
181+
## Global data (`src/_data/`)
182+
183+
| File | Purpose |
184+
|------|---------|
185+
| `site.json` | Global site config (URL, name, etc.) |
186+
| `blogTags.json` | Valid blog tag values |
187+
| `team/` | Staff author profiles |
188+
| `guests/` | Guest author profiles |
189+
| `companies/` | Customer company records |
190+
| `testimonials.json` | Pull-quote testimonials |
191+
| `events.yaml` | Event calendar |
192+
| `features.json` | Product feature catalog |
193+
| `integrations.js` | Integration listings |
194+
| `eleventyComputed.js` | Dynamic computed properties |
195+
196+
## Layouts
197+
198+
| Layout | Used by |
199+
|--------|---------|
200+
| `layouts/base.njk` | HTML shell |
201+
| `layouts/post.njk` | Blog posts |
202+
| `layouts/post-changelog.njk` | Changelog entries |
203+
| `layouts/documentation.njk` | Docs + handbook (with sidebar nav) |
204+
| `layouts/story.njk` | Customer stories |
205+
| `layouts/nohero.njk` | General pages without hero |
206+
207+
## Naming conventions
208+
209+
- All slugs: **kebab-case**
210+
- Blog/changelog: folder path mirrors publish date (`YYYY/MM/`)
211+
- Images for a post live alongside it: `src/blog/YYYY/MM/images/`
212+
- Author usernames must match a file in `src/_data/team/` or `src/_data/guests/`

.eleventy.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ const pluginRSS = require("@11ty/eleventy-plugin-rss");
88
const syntaxHighlight = require("@11ty/eleventy-plugin-syntaxhighlight");
99
const pluginMermaid = require("@kevingimbel/eleventy-plugin-mermaid");
1010
const codeClipboard = require("eleventy-plugin-code-clipboard");
11-
const htmlmin = require("html-minifier");
11+
const htmlmin = require("html-minifier-terser");
1212
const markdownIt = require("markdown-it");
1313
const markdownItAnchor = require("markdown-it-anchor");
1414
const markdownItFootnote = require("markdown-it-footnote");
@@ -1434,9 +1434,9 @@ module.exports = function(eleventyConfig) {
14341434

14351435
if (!DEV_MODE) {
14361436
console.info(`[11ty] Output HTML will be minified, expect a short wait`)
1437-
eleventyConfig.addTransform("htmlmin", function (content) {
1437+
eleventyConfig.addTransform("htmlmin", async function (content) {
14381438
if (this.page.outputPath && this.page.outputPath.endsWith(".html")) {
1439-
let minified = htmlmin.minify(content, {
1439+
let minified = await htmlmin.minify(content, {
14401440
collapseBooleanAttributes: true,
14411441
collapseWhitespace: true,
14421442
conservativeCollapse: true,

.github/workflows/build.yml

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ jobs:
2424
path: 'flowfuse'
2525
- name: Generate a token
2626
id: generate_token
27-
uses: actions/create-github-app-token@f8d387b68d61c58ab83c6c016672934102569859 # v3.0.0
27+
uses: actions/create-github-app-token@1b10c78c7865c340bc4f6099eb2f838309f1e8c3 # v3.1.1
2828
with:
29-
app-id: ${{ secrets.GH_BOT_APP_ID }}
29+
client-id: ${{ secrets.GH_BOT_APP_ID }}
3030
private-key: ${{ secrets.GH_BOT_APP_KEY }}
3131
owner: ${{ github.repository_owner }}
3232
- name: Check out FlowFuse/blueprint-library repository (to access the blueprints)
@@ -38,7 +38,7 @@ jobs:
3838
token: ${{ steps.generate_token.outputs.token }}
3939
- name: Install jq
4040
run: sudo apt-get -qy install jq
41-
- uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
41+
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
4242
with:
4343
node-version: 24
4444
cache: 'npm'
@@ -62,8 +62,5 @@ jobs:
6262
git add src/blueprints/* -A -f
6363
git commit -a -m "Bot: update blueprints"
6464
- name: Push to 'live' branch
65-
uses: ad-m/github-push-action@77c5b412c50b723d2a4fbc6d71fb5723bcd439aa # v1.0.0
66-
with:
67-
directory: './website'
68-
branch: live
69-
force: true
65+
run: git push --force origin HEAD:live
66+
working-directory: './website'

.github/workflows/handbook-changes-notify.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ jobs:
4343
run: |
4444
./.github/scripts/generate_handbook_urls.sh
4545
- name: Send notification
46-
uses: slackapi/slack-github-action@af78098f536edbc4de71162a307590698245be95 # v3.0.1
46+
uses: slackapi/slack-github-action@03ea5433c137af7c0495bc0cad1af10403fc800c # v3.0.2
4747
with:
4848
method: chat.postMessage
4949
token: ${{ secrets.SLACK_GHBOT_TOKEN }}

.github/workflows/project-automation.yml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ on:
44
types:
55
- opened
66
jobs:
7-
add_to_product_board:
8-
uses: FlowFuse/.github/.github/workflows/project-automation.yml@main
7+
add_issue_to_relevant_boards:
8+
uses: flowfuse/github-actions-workflows/.github/workflows/project-automation.yaml@project-automation/v1
99
secrets:
10-
token: ${{ secrets.PROJECT_ACCESS_TOKEN }}
10+
app-client-id: ${{ secrets.GH_BOT_APP_ID }}
11+
app-private-key: ${{ secrets.GH_BOT_APP_KEY }}

.github/workflows/sast-scan.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,4 @@ concurrency:
1616
jobs:
1717
scan:
1818
name: SAST Scan
19-
uses : flowfuse/github-actions-workflows/.github/workflows/sast_scan.yaml@v0.65.0
19+
uses : flowfuse/github-actions-workflows/.github/workflows/sast_scan.yaml@v0.76.0

.github/workflows/test.yml

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,15 @@ jobs:
88
steps:
99
- name: Generate a token
1010
id: generate_token
11-
uses: actions/create-github-app-token@f8d387b68d61c58ab83c6c016672934102569859 # v3.0.0
11+
uses: actions/create-github-app-token@1b10c78c7865c340bc4f6099eb2f838309f1e8c3 # v3.1.1
1212
with:
13-
app-id: ${{ secrets.GH_BOT_APP_ID }}
14-
private-key: ${{ secrets.GH_BOT_APP_KEY }}
13+
client-id: ${{ secrets.GH_CI_READONLY_APP_ID }}
14+
private-key: ${{ secrets.GH_CI_READONLY_APP_KEY }}
1515
owner: ${{ github.repository_owner }}
16+
repositories: |
17+
website
18+
flowfuse
19+
blueprint-library
1620
- name: Check out website repository
1721
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
1822
with:
@@ -32,7 +36,7 @@ jobs:
3236
ref: main
3337
path: 'blueprint-library'
3438
token: ${{ steps.generate_token.outputs.token }}
35-
- uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
39+
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
3640
with:
3741
node-version: 24
3842
cache: 'npm'
@@ -50,4 +54,3 @@ jobs:
5054
- uses: untitaker/hyperlink@fb5bb9c5011a3d143a54b4b30aedc30ec5bc0f89 # 0.2.0
5155
with:
5256
args: website/_site/ --check-anchors --sources website/src
53-

0 commit comments

Comments
 (0)