← Corpus / self-host-stack / decision
lossless.at path-based homebases + /<client>/<service>/api gateway
- Path
- decisions/lossless-at-path-based-homebase.md
- Tags
- Decision · lossless.at · Homebase · Gateway · MCP · Portal
lossless.at path-based homebases + /<client>/<service>/api
Context
Moving away from per-tool didi.sh subdomains (happenstance). Michael owns
lossless.at and wants client-dedicated homebases at lossless.at/<client>
that improve over time. Later refined to: lossless.at/<client-handle>/<service-handle>/api.
Decided
- Homebase page = a path route
lossless.at/<client>(portal). DONE in code (hub/refactored to/[client], verified locally, uncommitted). - DNS = move
lossless.atoff iwantmyname to a provider supporting the apex. Cloudflare rejected.at(Registrar TLD limit). Recommended: Vercel DNS (already runsdidi.sh, supports apex ALIAS +.at). Fallback:www.lossless.at+ apex redirect. - Per-client isolation = every tool is its own service in the client’s own Railway project. No shared/multi-tenant deploys, ever. (Includes Papermark.)
Open — the /<client>/<service>/api gateway
Two surfaces behave differently:
- API / MCP / connector endpoints — CAN live under the path via a reverse
proxy/gateway. This IS the Phase 2 “homebase-MCP” layer (see
ai-labs/id-didi-shparent spec, D7). Payoff: clean connector URLs likelossless.at/the-water-foundation/twenty/mcp. Hard bit: MCP OAuth advertises absolute URLs from Twenty’sSERVER_URL; the proxy +SERVER_URLmust be set to the proxied address. Prototype on Twenty first to de-risk subpath-OAuth. - Human web UIs (Twenty/Postiz/Outline dashboards) — resist living under a subpath (assume host root; Postiz especially). Default: they open on their own host, linked from the homebase page. Serving them under the path = separate, larger investigation.
Unresolved: whether Michael wants (1) only, or also (2). Proceeding on the assumption of (1) — gateway for API/connector surface, links-out for dashboards — and folding it into the homebase-MCP spec. Revisit if he wants dashboards under the path too.
Update 2026-08-06 — the two surfaces swapped difficulty
Reality inverted the assumption above.
- (2) Human dashboards — DONE, and it was the easy half. They don’t need to
serve under a subpath, only to be addressed by one. A 307 from
lossless.at/<client>/<handle>to the tool’s own host gives the legible URL without touching how the app is hosted. Shipped for crm/wiki/dataroom. - (1) API/MCP — blocked on the thing that looked easy. A redirect cannot carry a bearer token across origins (measured; see [[Normalize-Paths-Everywhere]]), so the connector surface needs a real proxy. Redirects buy nothing here.
Also decided: handles are role-based (crm, wiki, social, dataroom)
rather than tool-based, so the address outlives the vendor; the tool name
(/twenty, /outline) survives as a per-client alias that redirects to the
canonical role path.
Related
ai-labs/id-didi-sh— homebase-as-capability-plane parent spec (D7, JWKS identity)context-v/specs/Per-Client-Stack-Deployment-Spec-Twenty-First.md- Portal code:
self-host-stack/hub/