Members Portal & Marketplace¶
start.mdapi.ch is the human front door to the platform: a portal where members
see their services and a marketplace where they can request new ones. It is the
piece that turns a homelab into a small multi-tenant service provider.
flowchart LR
member["Member"] --> portal["Portal UI\nstart.mdapi.ch"]
portal --> resolve["Windmill f/portal\nresolve board / entitlements / health"]
portal --> req["Marketplace requests\nf/marketplace"]
req -->|"approval (Pushover tap-links)"| owner["Operator"]
req --> prov["Provisioning flows\nmailbox · SFTP · subdomain · website · access"]
prov --> estate["LDAP · mail · DNS · web · storage"]
Portal¶
The portal renders a per-member board: which services they have, their health,
and entry links. It is backed by typed Windmill scripts (f/portal/* —
resolve_board, resolve_entitlement, resolve_health) called through scoped
tokens; the paths are frozen as a public API surface for the portal frontend.
Tiles are entitlement-driven — a member only sees what they hold.
Marketplace¶
Requests (a mailbox, an SFTP area, a subdomain, a website, access to an
existing service) flow through f/marketplace/* scripts:
- Each request type has a provisioning flow that performs the real work end-to-end — LDAP identity, mailbox + autoconfig, DNS record, web vhost, storage quota — as one transaction.
- Sensitive request types carry an approval gate: the operator receives a Pushover message with tap-to-approve/deny links (the platform's standard human-in-the-loop pattern), and the flow resumes on the answer.
- Everything lands in the same estate planes documented elsewhere: mail, DNS, auth/LDAP.
Why it exists¶
Family-and-friends tenancy with real self-service: the operator approves intents, not tickets — and the provisioning itself is code-reviewed, versioned, and identical every time.