diff --git a/README.md b/README.md index 28aad9c..e41faf1 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,7 @@ The Inference Cooperative runs a self-hosted stack on [Cloudron](https://cloudro | **Open WebUI** | Member-facing chat interface (with web search) | chat.inference.coop | | **LiteLLM** | AI gateway — keys, metering, model routing | gateway.inference.coop | | **Member Portal** | Membership middleware — onboarding, key provisioning, Loomio sync | portal.inference.coop | +| **Member Dashboard** | Member-facing usage view + API key management | dashboard.inference.coop | | **SearXNG** | Self-hosted web search (feeds the chat's search tool) | search.inference.coop | | **Gitea** | Git hosting (code + docs) | git.inference.coop | | **Loomio** | Member governance | forum.inference.coop | @@ -88,7 +89,7 @@ By creating your account, you agree to these terms. ## Planning -- [API access, member dashboard & admin dashboard](implementation-plan-api-dashboards.md) — the plan for API access, key management, and dashboards (not yet implemented). +- [API access, member dashboard & admin dashboard](implementation-plan-api-dashboards.md) — the plan for API access, key management, and dashboards (Steps 1–4 complete; admin dashboard pending). --- diff --git a/implementation-plan-api-dashboards.md b/implementation-plan-api-dashboards.md index a1acf25..5145cd4 100644 --- a/implementation-plan-api-dashboards.md +++ b/implementation-plan-api-dashboards.md @@ -163,8 +163,15 @@ Member (browser) ──SSO──▶ Member Dashboard (new Cloudron app, "members ### Step 4 — Member dashboard (Phase 3) -- New Cloudron app in the "members" group (SSO-gated). Read-only (spend/keys/usage) + broker calls for create/revoke. -- **Gate:** a member logs in, sees only their own data, creates and revokes a key end-to-end, and the app holds no master key (verify via env inspection). +**COMPLETED (2026-09-14).** New Cloudron app `code/member-dashboard`, deployed at `dashboard.inference.coop`. + +- **App**: FastAPI, `proxyAuth` SSO (identity via `X-Forwarded-User` header), holds NO privileged credentials. +- **Access**: restricted to the `members` group via `POST /apps/:id/configure/access_restriction` (same model as Loomio). +- **Calls the portal broker** (`GET/POST/DELETE /broker/*`) with `BROKER_SECRET`, scoped to the logged-in member's email. +- **UI**: brand-matched Monitor surface — balance vs. spend bar, API key list (create/revoke), self-contained (no external requests). +- **Verified**: `/api/usage` and create→list→revoke all work end-to-end against Dan's real team (balance $15, spend $0). + +**Note:** proxyAuth header name (`X-Forwarded-User`) confirmed via Cloudron forum + source; verified empirically by exec'ing into the app. The app also accepts `X-Remote-User`/`X-Auth-Request-Email` fallbacks. ### Step 5 — Admin dashboard (Phase 4)