incus-app-launcher runs app installers from
community-scripts/ProxmoxVE
on Incus instead of Proxmox VE.
The launcher stays thin. It does not fork the upstream app catalog. Instead, it fetches:
ct/<app>.shinstall/<app>-install.sh- shared helper files
from the upstream repo at a chosen ref, then:
- Reads the upstream container defaults.
- Creates an Incus container with similar limits.
- Bootstraps a small base package set inside the guest.
- Pushes the upstream installer into the guest.
- Applies a small automation profile when the launcher knows how to answer upstream prompts.
This project is usable, but still early.
What exists today:
- generic create flow for upstream apps
- generic addon flow for upstream
tools/addon/*.shscripts inside existing containers - optional PocketBase metadata enrichment for discovery and script labeling
- prompt detection for upstream installers
- a small set of automation profiles for interactive apps
- dry-run and smoke-test commands
- real-world validation on an Incus VPS
What does not exist yet:
- broad compatibility guarantees across the full upstream app catalog
- complete translation of Proxmox-specific features
- a mature release process
- Any upstream app can be attempted.
- The local maintained list is only for launcher automation profiles, not for a master allowlist of compatible apps.
- Unprofiled apps use the generic flow and empty stdin unless prompt handling is added.
- If an app fails, the first preference is improving generic Incus behavior. App-specific profiles should stay small and focused.
adguardvaultwardennetbird
Validated on a real Incus 6.21 host:
adguarddockernetbirddockgeviaaddon install dockgeinside a Docker-capable target container
bashcurlawksedmktempincus
Optional for metadata search/enrichment:
jq
- The launcher uses the existing default Incus profile unless you change the code or environment around it.
- It does not modify host-wide Incus profiles, networks, or storage pools.
- Per-instance root disk sizing is done through instance device override, not by editing shared profiles.
--cleanup-on-failureonly removes a newly created instance when the launcher itself fails after creation. Successful runs leave the instance in place.
List the apps with launcher automation profiles:
./bin/incus-app list-supportedlist-profiled is an alias:
./bin/incus-app list-profiledShow the upstream defaults and launcher notes for an app:
./bin/incus-app show netbird --ref mainshow also scans the fetched installer for common prompt patterns and reports
whether upstream interactivity appears to be present.
Search script metadata from PocketBase:
./bin/incus-app search dockgeShow an unprofiled app and inspect prompt hints:
./bin/incus-app show pihole --ref mainCreate an app container:
./bin/incus-app create netbird --name netbird --ref mainRun upstream prompts interactively in your terminal:
./bin/incus-app create docker --name docker-test --prompt-mode interactiveRun an upstream addon script inside an existing container:
./bin/incus-app addon install dockge --target docker-host --prompt-mode interactiveRun an addon update flow inside an existing container:
./bin/incus-app addon update dockge --target docker-host --prompt-mode interactiveDelete the instance automatically if creation fails:
./bin/incus-app create netbird --name netbird --cleanup-on-failureRun a basic smoke test after creation:
./bin/incus-app smoke-test adguard --name adguard-smoke --cleanup-on-failurePin to a specific upstream commit:
./bin/incus-app create adguard \
--name adguard \
--ref 4a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8g9Print the Incus commands without executing them:
./bin/incus-app create vaultwarden --name vaultwarden --dry-runOverride the upstream raw base, useful for local development:
UPSTREAM_RAW_BASE="file:///home/jon/Dev/github/ProxmoxVE" \
./bin/incus-app show adguard- Upstream has two relevant models:
- app containers driven by
ct/<app>.shplusinstall/<app>-install.sh - addon scripts driven by
tools/addon/<name>.sh
- app containers driven by
- Addons are meant to run inside an existing target container, not through the normal app-creation path.
dockgeis the current example of an upstream addon-oriented workflow.- PocketBase metadata is used only to enrich discovery and classification. Execution still relies on the upstream scripts.
- PocketBase metadata can identify:
- script type (
lxc,vm,addon,pve) - development status (
ProxmoxVEDvsProxmoxVE) - disabled/deleted state
- script type (
- Public repo hardening includes CI for syntax and dry-run smoke coverage.
netbirdis interactive upstream. The launcher answers the prompts with: managed deployment and "skip connection for now".- Prompt modes:
profile: use launcher-provided answers when a profile existsempty: feed empty stdininteractive: attach upstream prompts to the current terminal
- Addon commands support
interactiveandemptyprompt modes. - Some upstream scripts still assume a Proxmox environment. Unprofiled apps are attempted with empty stdin and may still need manual fixes or more launcher automation.
- The launcher defaults to
mainif--refis not set, but using a pinned commit is recommended for repeatable builds. - The MVP uses your existing Incus default profile and network. Custom network selection is not automated yet.