Forty entries: 37 container apps and three built-in feature modules. Every column
is a field of the catalogue schema. The categories are in the order the
catalogue declares them; within a category, entries sort case-insensitively by name.
An entry is a recipe for a container the router runs: an image, a set of volumes, some
environment, and what the web UI does with the result — link to it, probe whether it
answers, and offer the configuration change that wires it into the router. Everything
here is what the catalogue says, not what the agent tests.
Each category has two tables. The first says what an entry is; the second says what
installing it does.
Column
Meaning
Ports
container[/protocol][→ host N], from the entry's ports. Documentation, not configuration — nothing stages a port mapping.
Volumes
source → destination, with (file) for a single-file bind mount and ro for read-only. Sources are defaults; the operator may override each one at install.
Environment
Variable names. A * marks one the entry declares required.
Integration
What the UI does: the app's own web UI, the health probe, dashboard where the entry sets it (the Overview does not list apps, so it changes nothing), and how many hints it offers.
Notes
Host networking, privilege, Linux capabilities, the router's cgroups, memory-backed (tmpfs) mounts, a memory limit, and any platform gap the entry says it closes.
What it isContainer management for everything running on the router.
Imagedocker.io/portainer/portainer-ce:latest
EntryHomepage
idhomepage
What it isA start page that links every service on the network.
Imageghcr.io/gethomepage/homepage:latest
EntryHomer
idhomer
What it isA static start page — one YAML file, no runtime.
Imagedocker.io/b4bz/homer:latest
Entryntfy
idntfy
What it isPush notifications from scripts, over HTTP.
Imagedocker.io/binwiederhier/ntfy:latest
EntryGotify
idgotify
What it isSelf-hosted push notifications with an Android client.
Imagedocker.io/gotify/server:latest
EntryWatchYourLAN
idwatchyourlan
What it isNotices when a device appears on the network that has not been seen before.
Imagedocker.io/aceberg/watchyourlan:latest
EntryDozzle
iddozzle
What it isLive container logs in a browser, no storage, no setup.
Imagedocker.io/amir20/dozzle:latest
EntryIT Tools
idit-tools
What it isA pile of offline network and encoding tools in one page.
Imageghcr.io/corentinth/it-tools:latest
EntryWiki.js
idwikijs
What it isSomewhere to write down why the config is the way it is.
Imageghcr.io/requarks/wiki:latest
EntryUniFi OS Server
idunifi-os-server
What it isUbiquiti's UniFi OS Server, for UniFi access points, switches and gateways. Packaged by UniHosted; neither Ubiquiti nor Wheelhouse publishes the image.
wireguard and suricata are kind: "builtin" entries over features of the router
itself, and upnp is a third, over the agent's own UPnP and NAT-PMP service. None is a
container: each gates a native page in the web UI, and "installing" one stages
nothing at all. The agent says so:
This is a built-in feature, not a container — installing it enables its page instantly
and stages nothing.
Each declares a config_path. If configuration exists under that path, the page stays
visible whether or not the feature is enabled — a page must never be hidden while the
configuration it edits is live on the router.
Three things have to be true before the router will commit a container: the image must
be on the router, every volume source must exist, and the configuration must be valid.
Installing is therefore four calls.
bash
# 1. What would be staged, and is the image here yet?
curl -sk -X POST "$R/api/apps/plan" -H "Authorization: Bearer $T" \
-H 'Content-Type: application/json' \
-d '{"app_id":"adguard","name":"adguard","address":"10.99.0.10"}'
# 2. Pull the image onto the router.
curl -sk -X POST "$R/api/apps/pull" -H "Authorization: Bearer $T" \
-H 'Content-Type: application/json' -d '{"app_id":"adguard"}'
# 3. Create the volume sources.
curl -sk -X POST "$R/api/apps/prepare" -H "Authorization: Bearer $T" \
-H 'Content-Type: application/json' \
-d '{"app_id":"adguard","name":"adguard"}'
# 4. Stage the operations from step 1, then commit them in the Commit Bar.
Stopping an app stages set container name <n> disable and starting it deletes that
node; the platform offers no operational verb for either. Restarting has both forms: the
router's own restart container <n>, which commits nothing and writes no revision, and
the two-commit bounce, where a failed second commit leaves the app down and the API says
so in those words.