Custom app stores
Companion Hub can hold more than one app store, and Settings β App Stores lists the ones you have. What you can do there is narrower than it looks, so this page starts with the part that decides whether the rest is useful to you.
You cannot add an app store from the dashboard. The Add App Store
button opens a dialog whose submit button is disabled, above the text
βFeature coming soon β Custom app store setup is under maintenance. Your Hub
uses the CI Marketplace automatically; no manual store URL is needed.β The
cihub CLI has no app-store command either. This is the current state of the
shipped product, not a configuration problem at your end.
What your Hub actually has
Every Hub registers one store for itself: CI Marketplace, slug ci-marketplace. It is not a Git
repository β it is an API-backed store (type: ci_cloud_api) pointed at CI Cloud, registered
automatically at startup and kept in sync from there. You do not add it and should not try to remove
it.
Git-repository stores β a repo with an apps/ directory, one folder per app, cloned into
<ROOT_FOLDER_HOST>/repos/ β are still supported by the sync code, which refers to them as legacy
git stores. They are how stores worked before CI Marketplace. Nothing in the dashboard creates one.
The two store types the sync code knows about, and how each reaches the App Store view:
flowchart TD
CC["CI Cloud"] -->|"type: ci_cloud_api<br/>registered at startup, kept in sync"| M["CI Marketplace<br/>slug ci-marketplace"]
G["Repository with an apps/ directory<br/>one folder per app"] -->|"cloned into<br/>ROOT_FOLDER_HOST/repos/"| L["Legacy store"]
M --> V["App Store view"]
L -.->|"still synced if present;<br/>nothing in the dashboard creates one"| VWhat you can still do in Settings β App Stores
| Action | Works today | Notes |
|---|---|---|
| See every store and whether it is enabled | β | The table is the full list |
| Refresh | β | Re-syncs enabled stores and invalidates the catalog cache |
| Edit a store β rename, enable/disable | β | The name is capped at 16 characters |
| Delete a store | Conditionally | Refused while the store has installed apps, or when it is the last store |
| Add a store | No | Dialog disabled β see the callout above |
Deleting is refused more often than you would expect
Two rules are enforced by the server, and both return an error rather than doing anything partial:
- βThere are installed apps that belong to this appstore. Please uninstall them firstβ β a store with any installed app cannot be deleted. Uninstall its apps first.
- βYou cannot delete the last appstoreβ β your Hub must always have at least one.
Disabling a store is the lighter option: its apps drop out of the App Store view without touching anything you have already installed.
Both rules the server enforces before a store is removed, and the lighter alternative:
flowchart TD
accTitle: Deleting a store: both checks must pass, or disable it instead
D["Delete a store"] --> Q1{"Installed apps<br/>from this store?"}
Q1 -->|"yes"| E1["Refused: uninstall them first"]
Q1 -->|"no"| Q2{"Last store<br/>on this Hub?"}
Q2 -->|"yes"| E2["Refused: you cannot delete<br/>the last appstore"]
Q2 -->|"no"| OK["Store deleted"]
D -.->|"lighter option"| X["Disable instead: apps leave the<br/>store view, installed apps untouched"]The API still exists
The Hub backend still serves POST /api/marketplace/create (session-authenticated, same as the rest
of the marketplace routes), so the capability was not removed from the server β only the way in from
the dashboard was. It is undocumented here on purpose: it is not a supported user-facing path, its
request shape is not guaranteed, and nothing in the UI helps you if a store created that way
misbehaves.
Apps from any store run on your machine with the same access as any other app.
A docker-compose.json can mount host paths and read your data β which is why
the Settings page carries its own βMake sure you trust the appstores you
add!β warning.
If you were trying to test an app before submitting it
That is the usual reason people come looking for this page, and the custom-store route is not available for it. Publish your first app covers what to do instead.
Ready to publish to the community store? Submit at ci.computer/store-submitΒ β see Submitting an app to the Store for the required files and review process.