Status: vision-stage; landed 2026-05-27 alongside the owner Option C / Phase-2 / Phase-3 addendum.
This document captures the architecture of the public developer hub for the Mahmoud Consultancy B.V. portfolio. It complements README.md (the what / why) by documenting the how — the three structural layers and how they survive the Growth path spin-out at phase 3.
The portal is intentionally a thin composition of three layers, each independently swappable:
┌─────────────────────────────────────────────────────────────┐
│ 1. Docs layer (Redoc + per-product sections) │
│ — Public, read-only, static-rendered │
├─────────────────────────────────────────────────────────────┤
│ 2. Spec ingestion pipeline │
│ — Each product CI publishes OpenAPI; portal pulls │
│ on release and rebuilds the docs site │
├─────────────────────────────────────────────────────────────┤
│ 3. Auth + key-issuance layer (per product) │
│ — Sign-in, account, API keys; keys stored per-product │
│ so they migrate cleanly on phase-3 spin-out │
└─────────────────────────────────────────────────────────────┘
Each product owns its OpenAPI spec. The portal is downstream — it never edits specs, it pulls and renders.
Per-product CI contract:
openapi.json (Spring Boot already produces this via springdoc).develop push), CI publishes the spec to a known, versioned location:specs/ GitHub repo path.Why CI-driven, not git-submodule:
developer.<product>.com/specs/ instead of the workspace bucket."Versioning: the portal keeps the latest stable per product and links to older versions; deprecation timelines are documented per product. Migration guides live in each product's section, authored by that product's team.
This is the most consequential design choice for phase 3.
Why per-product storage:
The trade-off: signing in to the portal and minting a key are two round-trips (portal → product). Accepted — clean phase-3 ergonomics beat one fewer hop.
Owner-confirmed (addendum 2026-05-27): Option C. Phase-1 lives under a neutral developer hub; per-product paths are designed to redirect cleanly on phase-3 spin-out.
Phase 1 (today) — single neutral host:
developer.glorylabs.nl/ → landing (Option C neutral brand)
developer.glorylabs.nl/auditpic/* → auditPic section (docs, keys, try-it)
developer.glorylabs.nl/claimio/* → claimio section
developer.glorylabs.nl/europelogin/* → europeLogin section
developer.glorylabs.nl/interimplaza/* → mahmoud-consultancy / InterimPlaza section
developer.glorylabs.nl/valideerleeftijd/* → valideerleeftijd section
Phase 3 (per-product, on spin-out) — branded subdomain:
developer.glorylabs.nl/<product>/* → 301 redirect → developer.<product>.com/*
developer.<product>.com/* → the spun-out product's own portal
Why this URL shape:
developer.glorylabs.nl/<product>/... keep working through the redirect for as long as we want to maintain it.What is NOT in the URL plan:
glorylabs.nl at phase 1 (e.g. auditpic.developer.glorylabs.nl). The path-prefix form keeps the neutral Option C brand intact.developer.glorylabs.nl/<product> is the only artefact left behind.| Layer | Phase 1 | Phase 2 (positioning only) | Phase 3 (spin-out) |
|---|---|---|---|
| Docs renderer | Redoc on developer.glorylabs.nl/<product> | unchanged; section brand foregrounds "by GloryLabs" | Redoc re-hosted on developer.<product>.com; old URL 301s |
| Spec ingestion | portal pulls from workspace CI | unchanged | portal config switched to pull from spun-out product's CI; or the new product runs its own portal copy |
| Auth / keys | per-product issuance via portal sign-in | unchanged | per-product key store moves with the product; portal just stops offering that product in its switcher |
| Legal | Mahmoud Consultancy B.V. controller | unchanged | new sub becomes controller for its product; portal ToS scopes shrink to remaining products |
The point: phase 2 is a CSS/copy change; phase 3 is a config + redirect change. Neither needs a portal rewrite.
Reacties