# Cloudron app inventory The co-op's Cloudron server carries **19 apps**. Before 2026-11-02 it carried 16; the three added since the migration are the docs site, the CI server and the CI agent (marked **NEW** below). **Source of truth:** read it from the running apps, not from memory or a sibling deploy. `GET https://my.inference.coop/api/v1/apps` returns every app with its `id`, `fqdn`, install state and — inside `manifest` — `dockerImage`. The app record's own top-level `image` field is **null**; the CLI's `list` output does not carry the image at all. The registry paths are **per-app and not uniform** (there are three different namespaces in use — see below), and a path copied from a remembered deploy of a *different* app points the update at a repository that does not hold it. *Verified against the live API 2026-11-04.* ## The 19 apps | FQDN | App id | Label | Image (pin) | Install | |---|---|---|---|---| | `inference.coop` | `55f5f904-3233-44de-ad7b-5dc7c8533b75` | — | `cloudron/io.cloudron.surfer:202611021342220000` | store (Surfer — marketing site) | | `chat.inference.coop` | `4023ccbf-d57a-4500-97df-14de9cf3516e` | AI Chat | `registry.inference.coop/co-op/librechat-custom:20261031-2a98892` | **custom** (LibreChat overlay) | | `chat-legacy.inference.coop` | `50ae6c97-e851-4d17-b013-51ca7a4e5be0` | Legacy AI Chat | `cloudron/com.openwebui.cloudronapp:202611030420300000` | store (Open WebUI) | | `portal.inference.coop` | `d4f05e4b-75c6-492e-9faf-7afb0712fc94` | — | `registry.inference.coop/code/member-portal:20261104-d076729` | **custom** | | `dashboard.inference.coop` | `daf8750e-2683-4104-83ea-f77d1b4601e8` | Dashboard | `registry.inference.coop/code/member-dashboard:20261103-3453131` | **custom** | | `panel.inference.coop` | `ae187071-7a43-4a6e-8a02-986609a66a1a` | Admin Panel | `local/coop.inference.admin-panel:0.1.0-1793634279942` | **custom** | | `gateway.inference.coop` | `adababd4-2427-4bdd-9bf7-6bdad0302610` | LiteLLM | `registry.inference.coop/local/ai.coop.litellm:1.0.0-20261103-d6cfe78` | **custom** | | `matrix.inference.coop` | `aa6f4597-6206-4509-b32e-c89750b2c1d8` | Matrix Chat | `cloudron/org.matrix.synapse:202611030719520000` | store (Synapse) | | `git.inference.coop` | `c91c13aa-30ed-4af9-9599-7a87ab4f221d` | Code | `cloudron/io.gitea.cloudronapp:202611011719500000` | store (Gitea) | | `registry.inference.coop` | `c257ba3c-6737-4375-ad51-ea19586bf3f0` | — | `cloudron/io.cloudron.container-registry:202610221511140000` | store (container registry) | | `vault.inference.coop` | `cb838bcf-f2e2-4670-b117-dca04b0ee957` | — | `cloudron/com.github.bitwardenrs:202611020820270000` | store (Vaultwarden) | | `forum.inference.coop` | `8b1a972c-08af-4e92-852c-d573c37b01ad` | Forum | `cloudron/org.loomio.cloudronapp:202611010321240000` | store (Loomio) | | `newsletter.inference.coop` | `eed2217c-b165-430e-bc29-7ccfef9b11e4` | — | `cloudron/app.listmonk.cloudronapp:202610220221130000` | store (Listmonk) | | `search.inference.coop` | `d7c73fff-ee42-4db0-98c0-4ce7a8ab35cc` | — | `cloudron/io.github.ascimoo.searx:202611012319290000` | store (SearXNG) | | `cloud.inference.coop` | `fd261d67-b790-424f-9e82-f74883ee8585` | — | `cloudron/com.nextcloud.cloudronapp:202610211606270000` | store (Nextcloud) | | `email.inference.coop` | `fbb256b9-ead3-41d8-bee0-d5ea87149436` | — | `cloudron/io.cloudron.mail:202610261602550000` | store (Cloudron mail UI) | | `docs.inference.coop` | `85b7ce06-e2af-49a4-bd4f-a9c2e692e3ab` | Docs | `cloudron/io.cloudron.surfer:202611021342220000` | store (Surfer) — **NEW 2026-11-03** | | `ci.inference.coop` | `4984f95e-0c0a-4af3-9ce1-4ca4f3e8483d` | Woodpecker | `cloudron/org.woodpecker_ci.cloudronapp:202610300219490000` | store (Woodpecker server) — **NEW 2026-11-03** | | `ci-agent.inference.coop` | `5ac63873-cf2c-4ad9-acd6-81dc0e016c83` | — | `registry.inference.coop/co-op/woodpecker-agent:20261104-e070275` | **custom** (Woodpecker agent) — **NEW 2026-11-03** | (`my.inference.coop` is the Cloudron dashboard hostname — the platform itself, not an app object — so it does not appear here.) ## Registry namespaces — they are NOT uniform Five custom apps pull from four different namespaces. Deriving one path from another app's pattern deploys the wrong (or a missing) image: | App | Registry path | |---|---| | chat (LibreChat overlay) | `registry.inference.coop/co-op/librechat-custom` | | CI agent | `registry.inference.coop/co-op/woodpecker-agent` | | member portal | `registry.inference.coop/code/member-portal` | | member dashboard | `registry.inference.coop/code/member-dashboard` | | gateway (LiteLLM) | `registry.inference.coop/local/ai.coop.litellm` | | admin panel | `local/coop.inference.admin-panel` | **Correcting a stale memory:** the portal is `code/member-portal` (not `co-op/member-portal`), and the admin panel is `local/coop.inference.admin-panel` (not `code/admin-panel`). Both were cited wrongly in earlier notes; the values above are read from the running apps. ## Store vs custom, and what that decides Six apps are **custom** installs (packaged by us, `appStoreId == ""`): chat, CI agent, portal, dashboard, panel, gateway. Custom apps get **no automatic update** (Cloudron says "not available for custom apps") — their protection is the `manifest.dockerImage` pin, which an update deploys, so a custom app must never be pinned to a floating tag. The rest carry a real `appStoreId` and update through the store. ## Notes that are easy to get wrong - **`enableAutomaticUpdate` exists on every app object and means nothing for a custom one.** Judge update behaviour by the install SOURCE (`appStoreId`), not by that flag. - **Public collectives reach `co-op/*` and `code/*` repos; the only private repos are `ops/inferencebot` and `ops/security`.** - **`info@inference.coop` is the co-op's gateway team account** (`member:info@inference.coop`, budget $135/30d) and also the owner account of several provider keys — see the token runbook.