The master-admin's directory of the portals they can manage — reached from the left menu of the FuzeFront shell. It is a launcher, not a switcher: there is no in-app context switch. Choosing a portal opens that portal's own host URL in a new browser tab, where management continues under the existing per-host tenant routing. Each portal is tagged by identity tier — soft (shares the root Authentik) or hard (its own Authentik instance). Scoped server-side to portals the caller may manage (Permit ReBAC).
4 portals · 3 active
Contract (real — adminPortals list). Rows come from
GET /api/v1/admin/portals (cursor-paginated; "Load more" advances the cursor). The
S1 extension adds identity_mode (soft | hard) → the tier
badge, and launchUrl → the absolute href of "Open portal". The launch
anchor is a plain <a target="_blank" rel="noopener noreferrer"> to the
portal's own host — never an in-app route, never a JS window.open that could
be popup-blocked, and never a same-tab navigation that unmounts the shell. launchUrl
is server-provided (the portal's primary domain, or the root host /p/{slug} path
route when it has no custom domain); the client never composes a host from client-held data.
A suspended portal renders no launch affordance (see states frame, d5). The list is
scoped by Permit ReBAC to portals the caller may manage — a caller with no manage authority
sees the permission-denied state (d6), never a launch button. Flag
fuzefront.platform.portals-directory (default OFF).