Skip to content

03 — Expansion Pack Systeem

“Je kiest geen template. Je kiest wie je bent.”

Geïnspireerd door De Sims (expansion packs als zelfstandige werelden), World of Warcraft (archetypes, talent trees, synergies), en Pokémon TCG (verzamelen, ontdekken, combineren).


  1. Filosofie
  2. Beam Core — Het Platform
  3. De Lagenstructuur
  4. Het Addon Manifest
  5. Addon Capabilities
  6. Specialisaties (Talent Trees)
  7. Synergieën
  8. De Beam Codex
  9. Booster Packs & Set Releases
  10. Vertical Packs
  11. Database Schema
  12. Lifecycle Management
  13. Distributie
  14. Implementatie Roadmap

Beam is een volwaardige pagebuilder. Elke gebruiker kan zonder enig uitbreidingspakket een professionele website bouwen. Addons voegen nieuwe use cases toe — niet ontbrekende basisfunctionaliteit.

Uitbreidingspakketten zijn Werelden, geen Features

Section titled “Uitbreidingspakketten zijn Werelden, geen Features”

Een Blog addon is niet “de mogelijkheid om posts te schrijven.” Het is een compleet ecosysteem: content structuur, archiefpagina’s, RSS feeds, categorie-navigatie, auteurspagina’s, en de blocks die alles verbinden. Net als een Sims expansion pack dat een hele levensstijl toevoegt.

De gemiddelde klant denkt niet in “ik heb een blog addon nodig.” Ze denkt: “Ik ben yoga docent en ik wil een website.” Het archetype-systeem (zie 06-guild-taxonomy.md) vertaalt identiteit naar functionaliteit.

Blocks zijn kaarten, addons zijn sets, je site is je deck, de Beam Codex is je Pokédex. Het gaat niet om alles hebben — het gaat om de juiste combinatie voor jouw verhaal.


Voordat een addon wordt geladen, levert het platform deze fundamenten:

FeatureBeschrijving
SchedulingPubliceer content op een toekomstig moment (published_at)
VersioningRevision history — elke opslag is een versie, terugdraaien mogelijk
Approval WorkflowsDraft → Review → Published (configureerbaar per team rol)
Multi-languageContent vertalen op item-niveau, taalswitch op de public site

Tags en categorieën zijn platform-niveau — geen addon-feature:

Core Taxonomy Engine
├── Gedeelde tag/categorie pool per site
├── Elke entiteit kan taxonomieën koppelen (pages, items, media)
├── Hierarchische categorieën (parent/child)
├── Automatische slug generatie
└── Cross-content filtering (toon alles met tag "zomer")
Core: page_view, click, form_submit, item_view, search
Addon: blog → "populairste posts", shop → "conversie funnel"
Core: owner, admin, editor, viewer
Addon: + author (blog), + instructor (bookings), + shop-manager (shop)

Bij sign-up kiest de gebruiker een archetype. Het platform zet een complete site op:

Archetype geselecteerd
Blueprint laden:
├── Pages aanmaken (Home, Over, Contact, ...)
├── Menu's vullen
├── Site settings (kleuren, fonts, favicon)
├── Addons activeren met juiste specialisatie
├── Starter content plaatsen
└── Asset pack laden (stockfoto's, iconen)

Laag 5 │ User Overrides
│ Eigen kleuren, fonts, aangepaste templates, content
│ Altijd de hoogste prioriteit — de gebruiker wint
Laag 4 │ Vertical Packs
│ Complete site blueprints per archetype
│ = gilde styling + class addons + niche templates + starter content
Laag 3 │ Style Packs (+ seasonal overrides)
│ Kleurpaletten, fonts, component styling
│ Per gilde: "Healer Calm", "Creator Bold", "Merchant Trust"
Laag 2 │ Functional Addons (met specialisaties + synergieën)
│ Blog, Shop, Bookings, Portfolio, Popups, Forms, Reviews, Events
Laag 1 │ Blocks + Kits
│ Atomaire bouwstenen, kleine block packs
│ Los te activeren, geen collection of routes nodig
────────┤
Core │ Beam Platform
│ Editor, pages, content lifecycle, taxonomies, analytics bus,
│ theming engine, permissions, cross-content referenties,
│ blueprints, onboarding, multi-language
TierSims EquivalentBeam EquivalentScopeVoorbeeld
KitKitBlock pack1–3 blocksPricing Table Kit, Stats Kit
Stuff PackStuff PackStyle packVisueel/cosmetisch”Healer Calm” stijl
Game PackGame PackFunctional addonNieuwe capabilityBlog, Shop, Bookings
ExpansionExpansion PackVertical packComplete ervaring”Yoga Studio”, “Creative Portfolio”

Elke addon declareert via een manifest wat het meebrengt:

interface AddonManifest {
// Identiteit
id: string // 'blog', 'shop', 'popups'
name: string
description: string
icon: string // Lucide icon
version: string
tier: 'kit' | 'stuff-pack' | 'game-pack' | 'expansion'
// Content & Rendering
blocks?: AddonBlockDefinition[] // Nieuwe block types
collections?: AddonCollection[] // Content collections
templates?: AddonTemplate[] // Pagina templates (archief, single)
routes?: AddonRoute[] // Programmatische URL routes
scripts?: AddonScript[] // Client-side JS
globalStyles?: AddonGlobalStyle[] // CSS variabelen, fonts
// Dashboard
settings?: AddonSettingsSchema
dashboardWidgets?: AddonWidget[]
menuItemTypes?: AddonMenuItemType[]
// Backend
crons?: AddonCron[] // Scheduled workers
publicApiRoutes?: AddonApiRoute[] // Public-facing endpoints
hooks?: AddonHookHandler[] // Event listeners
emailTemplates?: AddonEmailTemplate[]
// SEO & Rich Text
seoAssets?: AddonSeoAsset[] // RSS, sitemap, JSON-LD
inlineElements?: AddonInlineElement[] // Rich text extensies
entityExtensions?: AddonEntityExt[] // Extra velden op pages/items
permissions?: AddonPermission[]
// WoW-systemen
specializations?: AddonSpecialization[] // Talent tree paden
provides?: AddonCapability[] // Wat deze addon biedt aan anderen
enhancedBy?: AddonSynergy[] // Synergieën met andere addons
}
interface StylePack {
id: string // 'healer-calm', 'creator-bold'
name: string
gilde?: string // Optioneel: gekoppeld aan een gilde
colors: {
brand: string
primary: string
accent: string
surface: string
text: string
muted: string
[key: string]: string
}
fonts: {
heading: FontDefinition
body: FontDefinition
}
borderRadius: 'none' | 'small' | 'medium' | 'large'
spacing: 'compact' | 'comfortable' | 'spacious'
componentStyles?: Record<string, CSSProperties>
seasonal?: {
activeFrom: string // ISO date
activeTo: string
overrides: Partial<StylePack>
}
}
interface VerticalPack {
id: string // 'yoga-studio'
name: string
gilde: string // 'healer'
class: string // 'guide'
targetAudience: string
// Compositie — geen duplicatie
requires: string[] // Addon IDs: ['blog', 'bookings']
specializations: Record<string, string> // Per addon: welke spec actief
stylePack: string
// Niche-specifieke toevoegingen
blocks?: AddonBlockDefinition[]
templates?: AddonTemplate[]
// Complete site bij onboarding
blueprint: {
pages: BlueprintPage[]
menus: { header: MenuItem[], footer: MenuItem[] }
siteSettings: Partial<SiteSettings>
addonItems?: Record<string, BlueprintItem[]>
assetPack?: {
images: AssetDefinition[] // Opgeslagen in R2
icons?: AssetDefinition[]
}
}
// Vertical pack voortgangsstappen
milestones: Milestone[]
}
interface Milestone {
id: string
label: string // "Eerste les toegevoegd"
condition: string // 'collection:bookings:items >= 1'
link: string // Dashboard pad naar de juiste plek
}

Noot: Milestones (vertical pack voortgang) zijn onderdeel van de addon-context. De Journey hoofdstukken (persoonlijk verhaal van de gebruiker) zijn platform-breed en staan in 04-experience-community.md. Beide systemen lopen parallel maar zijn conceptueel gescheiden.


interface AddonBlockDefinition extends BlockDefinition {
addonId: string
category?: string // Groepering in block picker
}

De block picker toont addon blocks in eigen secties:

┌─────────────────────────────┐
│ Basis │
│ Hero · Features · CTA │
│ Text · FAQ · Columns │
│ │
│ Blog │ ← functional addon
│ Recente posts · Post card │
│ Categorie lijst │
│ │
│ Yoga Studio │ ← vertical pack
│ Lesrooster · Docent card │
│ Prijspakket │
└─────────────────────────────┘

Content collecties met eigen CRUD. Items gebruiken dezelfde Block[] als pages — de volledige editor is beschikbaar.

interface AddonCollection {
id: string // 'posts', 'products'
label: string
slug: string | null // URL prefix (null = geen publieke URL)
metadataSchema: ZodSchema
metadataForm: ComponentType
listingColumns: ColumnDef[]
}
interface AddonTemplate {
id: string
type: 'archive' | 'single'
defaultLayout: { blocks: Block[] } // Fallback als geen custom page exists
}
interface AddonRoute {
pattern: string // '/blog/categorie/:slug'
template: string
data: string // 'posts', 'posts:single'
}

Route resolution in Astro:

Route wordt bezocht
Bestaat er een custom archief page?
→ JA: render de custom page (block editor layout)
→ NEE: render template defaultLayout (automatisch)
In beide gevallen: collection data wordt als context geïnjecteerd
Dynamic blocks resolven naar echte data:
{{post-list}} → grid van items
{{post-content}} → blocks van huidig item
{{pagination}} → paginering
{{category-filter}} → actieve filters
{{breadcrumbs}} → navigatiepad
{{item-metadata}} → datum, auteur, tags
interface AddonScript {
id: string
location: 'head' | 'body-start' | 'body-end'
}
interface AddonGlobalStyle {
id: string
type: 'css' | 'font'
content?: string // Inline CSS
url?: string // Externe URL of R2 URL
}

5.5 Backend: Crons, Public API, Hooks, Email

Section titled “5.5 Backend: Crons, Public API, Hooks, Email”
interface AddonCron {
id: string
schedule: string // Cron expressie
handler: string
}
interface AddonApiRoute {
method: 'GET' | 'POST' | 'PUT' | 'DELETE'
pattern: string // '/api/cart'
handler: string
}
interface AddonHookHandler {
event: string // 'page:publish', 'item:create'
handler: string
}
interface AddonEmailTemplate {
id: string
label: string
subject: string
template: string // React Email component
}
interface AddonSeoAsset {
type: 'rss' | 'sitemap' | 'json-ld'
route: string // '/blog/feed.xml'
collection?: string
}
interface AddonEntityExt {
target: 'page' | 'addon-item'
fields: FieldDefinition[]
schema: ZodSchema
}
interface AddonPermission {
id: string // 'blog:author'
label: string
capabilities: string[]
}

Geïnspireerd door WoW’s talent systeem. Een Mage kan Fire, Frost of Arcane zijn — dezelfde class, totaal andere ervaring.

interface AddonSpecialization {
id: string
name: string
description: string
icon: string
enabledBlocks?: string[]
enabledTemplates?: string[]
metadataOverrides?: Partial<ZodSchema>
defaultSettings?: Record<string, unknown>
routeOverrides?: Partial<AddonRoute>[]
}
Blog ─┬─ Persoonlijk Blog
│ Chronologisch, auteur-centraal
│ Metadata: datum, mood, tags
├─ Magazine
│ Categorie-gedreven, meerdere auteurs, featured posts
│ Metadata: categorie, auteur, featured image, leestijd
└─ Kennisbank
Zoekbaar, gestructureerd, evergreen
Metadata: categorie, moeilijkheidsgraad, laatst bijgewerkt
Shop ─┬─ Fysieke Producten
│ Voorraad, verzending, varianten (maat/kleur)
├─ Digitale Producten
│ Downloads, licenties, directe levering
└─ Services
Pakketprijzen, intakes, offertes
Bookings ─┬─ 1-op-1 Sessies
│ Tijdslots, intake, betaling per sessie
├─ Groepslessen
│ Rooster, capaciteit, wachtlijst
└─ Workshops & Events
Losse data, ticket capaciteit
Portfolio ─┬─ Galerij
│ Beeldgericht, grid/masonry, lightbox
├─ Case Studies
│ Probleem → oplossing → resultaat
└─ Timeline
Chronologisch, carrière door de tijd

De specialisatie wordt gekozen bij activatie (of automatisch via vertical pack). Wisselen kan altijd zonder data verlies.


Geïnspireerd door WoW’s profession systeem. Addons zijn standalone, maar samen ontgrendelen ze nieuwe mogelijkheden.

interface AddonCapability {
type: string // 'content-feed', 'payment', 'scheduling'
description: string
}
interface AddonSynergy {
addonId: string
capability: string
unlocks: string
blocks?: AddonBlockDefinition[] // Synergie-specifieke blocks
templates?: AddonTemplate[]
}
Blog Shop Bookings Portfolio Forms Popups Reviews
Blog ─ Producten "Boek na Gerelateerd Comments op Lead magnet ─
in posts het lezen" werk in posts posts na artikel
Shop Content ─ Betaalde ─ Product Exit-intent Product
marketing workshops configurator korting reviews
Bookings Agenda in Betaalde ─ ─ Intake ─ Service
blog sidebar workshops formulier reviews
Portfolio Process ─ Portfolio ─ Offerte ─ Klant
blog posts review (zelf) aanvraag reviews
Forms ─ ─ Intake Offerte ─ Form in Review
aanvraag (zelf) popup formulier
Popups Lead capture Korting ─ ─ Form in ─ ─
na artikel popup popup (zelf)
Reviews ─ Social Testimonials Klant Review ─ ─
proof quotes formulier (zelf)
Gebruiker activeert Blog + Shop
Systeem detecteert: Blog.enhancedBy bevat { addonId: 'shop', unlocks: '...' }
Synergie ontgrendeld:
→ Nieuw block: "Gerelateerde producten" (in blog post editor)
→ Nieuw inline element: {{product-prijs}} in blog tekst
→ Dashboard hint: "Je kunt nu producten embedden in blog posts"

De gebruiker krijgt een melding: “Blog + Shop actief — je kunt nu producten in artikelen tonen.”


Geïnspireerd door de Pokédex en het Pokémon TCG album. Een visuele catalogus van alles wat beschikbaar is — en wat jij hebt ontdekt.

┌─────────────────────────┐
│ ✦ HERO │
│ ━━━━━━━━━━━━━━━━━━━━━ │
│ │
│ ┌───────────────────┐ │
│ │ [Preview van │ │
│ │ het block] │ │
│ └───────────────────┘ │
│ │
│ Basis · Alle gilden │
│ ───────────────────── │
│ Header sectie met │
│ titel, subtitel en │
│ call-to-action buttons │
│ │
│ ◆◆◇◇◇ │ ← Complexiteit (1-5)
│ │
│ CORE ✦ │ ← Rarity badge
└─────────────────────────┘
RarityPokémonBeamHoe te verkrijgen
CommonCommonCore blocksAltijd beschikbaar
UncommonUncommonKit blocksActiveer een Kit
RareRareAddon blocksActiveer een functional addon
HoloHolographicVertical pack blocksActiveer een vertical pack
SecretSecret RareSynergie blocks2+ addons combineren

Secret blocks zijn de meest bijzondere — ze bestaan alleen als je de juiste combinatie van addons hebt:

Blog + Shop actief → ✧ "Gerelateerde Producten" ontgrendeld
Blog + Bookings → ✧ "Boek Na Het Lezen" CTA ontgrendeld
Shop + Reviews → ✧ "Product Review Carousel" ontgrendeld

Zoals Pokémon kaarten types hebben, hebben blocks gilde-affiniteiten:

TypeKleurGildenVoorbeeld blocks
🌿 GrowthGroenHealers, HostsLesrooster, Menukaart, Booking CTA
🔥 ImpactRood/OranjeMerchants, BuildersPricing Table, Product Card, CTA
💧 FlowBlauwCreators, ScholarsPortfolio Grid, Kennisbank, Timeline
⚡ ConnectGeelAlleReviews, Contact Form, Social Proof
🌙 AtmospherePaarsHosts, CreatorsSfeerbeelden, Video Background, Galerij

Dit is puur informatief — een Merchant kan prima een 🌙 Atmosphere block gebruiken.

┌──────────────────────────────────────────────────────────┐
│ 📖 Beam Codex │
│ │
│ Jouw collectie: 34 van 87 blocks ontdekt │
│ ████████████████░░░░░░░░░░░ 39% │
│ │
│ Core Blocks (8/8) ✓ compleet │
│ ◇ Hero ◇ Features ◇ CTA ◇ Text │
│ │
│ Blog Blocks (3/3) ✓ compleet │
│ ★ Recente Posts ★ Post Card ★ Categorie Lijst │
│ │
│ Shop Blocks (0/5) 🔒 locked │
│ [?] [?] [?] [?] [?] │
│ │
│ Synergie Blocks (1/6) │
│ ✧ Gerelateerde Producten │
│ [?] [?] [?] [?] [?] │
│ │
│ Yoga Studio (4/4) ✓ compleet │
│ ✦ Lesrooster ✦ Docent Card │
│ ✦ Prijspakket ✦ Studio Sfeer │
└──────────────────────────────────────────────────────────┘

Onontdekte blocks tonen als [?] met een silhouet — je weet dat er iets is, maar niet wat.


Wanneer een gebruiker een addon of vertical pack activeert, geen droge “Addon geactiveerd” melding. In plaats daarvan een onthulling:

┌──────────────────────────────────────────────┐
│ │
│ ✦ YOGA STUDIO PACK ✦ │
│ │
│ ┌─────────┐ │
│ │ ✨ │ ← Kaart draait om │
│ │ LESROO │ "Lesrooster" │
│ │ STER │ Een weekoverzicht met │
│ │ ✦ │ al je lessen en tijdslots │
│ └─────────┘ │
│ │
│ Ontdekt: 1 van 4 │
│ [Volgende kaart onthullen →] │
└──────────────────────────────────────────────┘

Elke block card wordt één voor één onthuld: face-down → omdraaien → naam, preview en beschrijving + rarity badge.

Dit is geen frivoliteit — het is een bewust ontworpen moment dat de waarde van het pakket voelbaar maakt.

Geïnspireerd door Pokémon TCG sets. Beam brengt periodiek nieuwe block sets uit:

SeizoenSet NaamNieuwe Blocks
LenteFresh StartSpringtime Hero, Growth Timeline, Seed CTA
ZomerGolden HourSummer Gallery, Booking Calendar, Event Banner
HerfstHarvestYear Review, Testimonial Wall, Cozy Section
WinterNorthern LightHoliday Banner, Gift Card, Countdown

Seasonal blocks zijn permanent — geen FOMO, geen tijdsdruk.

In Pokémon TCG trade je kaarten. In Beam deel je patronen — custom block composities:

Anna maakt een lesrooster-patroon:
Lesrooster block + Pricing table + CTA
Ze deelt het met connectie Lisa:
[Patroon delen met Lisa →]
Lisa ontvangt:
"Anna heeft een patroon met je gedeeld: Lesrooster Compleet"
[Bekijken] [Toevoegen aan mijn patronen]

Geen marketplace met prijzen — genereus delen tussen collega’s.


"Yoga Studio" Vertical Pack
├── Archetype: Healer × Guide
├── Requires:
│ ├── Bookings (spec: groepslessen)
│ ├── Blog (spec: persoonlijk)
│ └── Reviews
├── Style Pack: "Healer Calm"
├── Niche Blocks:
│ ├── Lesrooster (weekoverzicht met tijdslots)
│ ├── Docent Card (foto, bio, specialisatie)
│ └── Prijspakket (strippenkaart, abonnement, losse les)
├── Blueprint (complete site):
│ ├── Home: hero + over + lesrooster + reviews + CTA
│ ├── Lessen: rooster + prijzen + inschrijven
│ ├── Over: verhaal + docenten grid + filosofie
│ ├── Blog: archief met yoga/mindfulness posts
│ └── Contact: formulier + locatie + openingstijden
├── Starter Content:
│ ├── 3 voorbeeld blog posts
│ └── 5 voorbeeldlessen
├── Asset Pack:
│ ├── 8 yoga stockfoto's (opgeslagen in R2)
│ ├── Icon set (lotus, mat, pose silhouettes)
│ └── Favicon + OG image template
└── Milestones:
├── "Pas je homepage aan"
├── "Voeg je eerste les toe"
├── "Schrijf je eerste blog post"
├── "Vraag je eerste review aan"
└── "Publiceer je site"

Zie 06-guild-taxonomy.md voor de volledige vertical pack catalogus per gilde.


Zie 08-brand-json-spec.md voor de complete SQL met alle RLS policies en indexes. Samenvatting:

-- Geactiveerde addons per site
CREATE TABLE addons (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
site_id UUID NOT NULL REFERENCES sites(id) ON DELETE CASCADE,
addon_type_id TEXT NOT NULL, -- 'blog', 'shop', 'bookings'
specialization TEXT,
config JSONB NOT NULL DEFAULT '{}',
enabled BOOLEAN NOT NULL DEFAULT true,
installed_via TEXT, -- 'manual' | 'vertical-pack:yoga-studio'
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now(),
UNIQUE(site_id, addon_type_id)
);
-- Geactiveerde vertical packs per site
CREATE TABLE vertical_packs (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
site_id UUID NOT NULL REFERENCES sites(id) ON DELETE CASCADE,
pack_type_id TEXT NOT NULL, -- 'yoga-studio', 'business-coach'
config JSONB NOT NULL DEFAULT '{}',
created_at TIMESTAMPTZ DEFAULT now(),
UNIQUE(site_id, pack_type_id)
);

  1. Record in addons tabel
  2. Specialisatie instellen (standaard of via vertical pack)
  3. Collections aanmaken
  4. Settings seeden vanuit manifest
  5. Blocks beschikbaar in picker
  6. Routes actief op public site
  7. Synergieën checken en ontgrendelen
  1. addons.enabled = false
  2. Blocks verdwijnen uit picker — bestaande blocks op pages blijven intact (renderen als placeholder)
  3. Routes niet meer bereikbaar (404)
  4. Data blijft behouden — niets wordt verwijderd
  1. Expliciete actie door gebruiker
  2. Waarschuwing: “Dit verwijdert X items permanent”
  3. Optie: exporteer als JSON voor verwijdering
  4. Cascade delete: addon → collections → items → taxonomies
  1. Geen data verlies
  2. Andere templates en blocks worden actief/inactief
  3. Velden die niet bij de nieuwe spec horen worden verborgen (niet verwijderd)

packages/addons/
├── _shared/ -- Gedeelde addon utilities
│ ├── types.ts -- AddonManifest, interfaces
│ └── utils.ts
├── blocks/ -- Kits (Laag 1)
│ ├── pricing-kit/
│ └── testimonial-kit/
├── functional/ -- Game Packs (Laag 2)
│ ├── blog/
│ │ ├── manifest.ts
│ │ ├── specializations/
│ │ ├── blocks/
│ │ ├── editor/
│ │ ├── public/
│ │ └── api/
│ ├── shop/
│ ├── bookings/
│ ├── portfolio/
│ ├── forms/
│ ├── popups/
│ ├── reviews/
│ └── events/
├── styles/ -- Stuff Packs (Laag 3)
│ ├── healer-calm/
│ ├── creator-bold/
│ ├── merchant-trust/
│ ├── scholar-authority/
│ ├── host-atmosphere/
│ └── builder-solid/
└── verticals/ -- Expansion Packs (Laag 4)
├── yoga-studio/
│ ├── manifest.ts
│ ├── blueprint/
│ ├── blocks/
│ ├── assets/ -- Stockfoto's, iconen → geladen in R2
│ └── milestones.ts
├── business-coach/
├── restaurant/
└── photographer/

Het manifest-systeem blijft identiek — alleen de distributie verandert:

Terminal window
pnpm add @beam/addon-blog @beam/vertical-yoga-studio

  1. Core types: AddonManifest, VerticalPack, StylePack in packages/shared
  2. Database migratie: addon tabellen + RLS + indexes
  3. Addon registry service (laden, activeren, deactiveren)
  4. API routes: addon CRUD
  5. Dashboard: addon overzicht + activatie UI
  1. Dynamische block registry (core + addon blocks)
  2. Block picker met addon secties
  3. Pricing Kit als eerste kit
  4. Testimonial Kit
  1. Collection CRUD (items, metadata, taxonomies)
  2. Dashboard: item listing + item editor
  3. Specialisatie-systeem
  4. Blog addon met 3 specialisaties
  5. Portfolio addon met 3 specialisaties
  1. Route resolution in Astro public site middleware
  2. Template engine met dynamic blocks
  3. Custom archief page override systeem
  4. Synergie detectie en ontgrendeling
  1. Theming engine (CSS variabelen cascade)
  2. Eerste style packs per gilde
  3. Seasonal override systeem
  1. Blueprint systeem
  2. Asset pack loading (R2)
  3. Milestone tracking
  4. Yoga Studio als eerste vertical pack
  5. Business Coach als tweede
  1. Shop, Bookings, Forms, Popups, Reviews
  2. Cross-addon synergieën voor alle combinaties
  1. Block card systeem
  2. Beam Codex interface
  3. Booster pack unboxing ervaring
  4. Patroon trading
  1. Seasonal set release pipeline
  2. Remaining vertical packs
  3. Voorbereiding npm distributie