URLs: /assemblies/ (index), /assemblies/[slug]/ (detail)
Files: src/pages/assemblies/index.astro, src/pages/assemblies/[slug].astro
The /assemblies/ index page is a product explanation page followed by assembly listings. It explains what Assemblies are, why they exist, and how they work — then lists active and completed assemblies.
The index page has these sections in order:
| Section | Component | Content type |
|---|---|---|
| Hero | Hero |
Static — "Ask a Question. Get the Industry's Answer." headline and body |
| Upcoming Assemblies | Inline <section id="active"> |
Dynamic — from assemblies.json (only shown if active assemblies exist) |
| What Harmony Does | FeatureGrid (3 cols, bordered) |
Static — 3 accountability features |
| What is an Assembly | TextWithImage |
Static — explanation + image |
| Assembly Types | FeatureGrid (3 cols, cards) |
Static — Private / Public / Open (Open has CTA to enquiry form) |
| How It Works | VerticalPipeline |
Static — 6-step Harmony process |
| The Problem | FeatureGrid (3 cols, cards) |
Static — 3 barriers to consensus |
| Who Gets Access | FeatureGrid (2 cols, cards) |
Static — 4 access tiers |
| Completed Assemblies | Inline <section> |
Dynamic — from assemblies.json (only shown if completed exist) |
| FAQ | Inline <section> with <details> accordion |
Static — 10 questions |
| CTA Banner | CTABanner |
Static — links to /membership/ |
All assembly data comes from src/data/assemblies.json, fetched from the Notion Assemblies database. See Notion doc for database properties.
The fetch script also extracts the Notion page body content: anything below a "Details" heading is converted to HTML and stored in the detailsHtml field. Supported block types are paragraphs, headings, bulleted/numbered lists, to-dos, dividers, and images. Images embedded in the page body are downloaded and rehosted to public/assets/assembly-images/ (Notion's own file URLs expire after about an hour, so they can't be linked to directly) — see Notion doc for details. Unsupported block types (video, embed, callout, table, etc.) are silently dropped.
Assembly status is a Notion "status" type property (not "select"). The exact values and their effects:
| Status | Visible on site? | Where shown | Application form? |
|---|---|---|---|
Apply now |
Yes | "Upcoming assemblies" | Yes — full application form |
Register interest |
Yes | "Upcoming assemblies" | Yes — interest registration form |
Upcoming |
Yes | "Upcoming assemblies" | Yes — interest registration form |
In Progress |
Yes | "Upcoming assemblies" | No |
Pending |
Yes | "Upcoming assemblies", badged "Waitlist" | Yes — framed as joining a waitlist (used once the application deadline has passed but the assembly still wants to capture interest) |
Done |
Yes | "Completed assemblies" | No — shows report link if available |
Backlog |
Hidden | Not shown | — |
The fetch script sorts assemblies by status priority: Apply now (0) → Register interest (1) → In Progress (2) → Upcoming (3) → Done (4) → Pending (5) → Backlog (6), then alphabetical by name.
- Visible: all assemblies except
Backlog - Active section: statuses
Apply now,Register interest,Upcoming,In Progress,Pending, sorted alphabetically by name (overriding the status-priority order inassemblies.json) - Completed section: status
Done, sorted by end date (most recent first) - Seat counts are not shown on the index cards (only on the detail page's metadata grid)
Only visible assemblies (not Backlog) generate detail pages.
Each assembly has an optional Visibility field:
| Visibility | Badge colour | Meaning |
|---|---|---|
Public |
Green (accent) | Open to anyone |
GSF Members Only |
Teal (primary) | Members-only |
Invite Only |
Dark teal (primary-darker) | By invitation |
The "See active assemblies" CTA button only appears if there are active assemblies, to avoid a dead anchor link. The "Propose an Assembly" CTA always links to /membership/enquire/.
Inline <section> using native <details>/<summary> HTML for zero-JS accordion behaviour. 10 questions covering Harmony's role, human accountability, consensus model, energy use, and participation. Content is static — update it directly in the page file.
The form appears on detail pages (not the index) when status is Apply now, Register interest, Upcoming, or Pending.
When status is Pending, the same form is shown but reframed as joining a waitlist rather than applying — used when an assembly's application deadline has passed but it's still worth capturing interest (e.g. for a future run, or in case a seat opens up):
- Status badge reads "Waitlist" instead of the raw "Pending" value
- Hero CTA and submit button read "Join the waitlist"
- Form heading/copy explain that applications have closed but people can still join the waitlist
- Success state reads "You're on the waitlist"
- On the index page, the "Apply by" deadline line reads "Applications closed [date]" instead
*About you (required marked with ):
- Full name *
- Work email *
- Organisation *
- Job title
- LinkedIn profile URL
- GitHub username
- Sector/Industry (dropdown: Cloud & Infrastructure, AI & ML, Financial Services, Energy & Utilities, Government, Healthcare, Manufacturing, Telecommunications, Consulting, Academia & Research, Non-profit/NGO, Other)
- Timezone
- Years of experience (dropdown: 0–2, 3–5, 5–10, 10–15, 15+)
Your contribution:
- Relevant expertise * (textarea)
- Motivation * (textarea)
- Previous GSF involvement (textarea)
- How did you hear about this assembly?
Confirmations:
- Attendance commitment checkbox *
- Stay informed checkbox (optional)
- Privacy policy consent checkbox *
- Method: Netlify Forms (
data-netlify="true") - Action: posts to the assembly's own URL
- Hidden fields:
form-name,assembly-name,assembly-id - Spam protection: honeypot field (
bot-field) - Client-side handling: JavaScript intercepts submission, shows success/error state, tracks
assembly_applicationGA4 event withassembly_nameparameter
- For
Apply now: "Application submitted" message - For
Register interest/Upcoming: "Interest registered" message
When status is Done:
- Hero uses a light grey background (instead of dark teal)
- "Completed" badge shown
- If
reportUrlis set, a "Read the report" CTA button appears - If no
reportUrl, shows "Report incoming — check back soon" - Date range and participant count shown on the card
The detail page displays available metadata in a compact grid:
- Deliverable, Purpose, Stage, Facilitator
- Start Date, End Date, Applications Open, Application Deadline
- Seats, Participants (average attendees)
If the assembly has a workingGroup relation (resolved from Notion PWCIs), a "Governing Body" section appears with the working group name and optional directory link.
| Change | Where |
|---|---|
| Create new assembly | Add to Notion Assemblies DB |
| Open/close applications | Change Status in Notion |
| Add details content | Add content directly to the Notion page body |
| Set report URL | Set Report URL field in Notion |
| Change visibility | Set Visibility field in Notion |
| Update FAQ answers | Edit the inline array in src/pages/assemblies/index.astro section 9 |
| Update static section text (harmony, what is, types, problem, access) | Edit the component props directly in src/pages/assemblies/index.astro |
See Notion doc for the full list of Assemblies DB properties.