Appdmin is a self-hosted operations console for independent software products. It builds a truthful, source-aware view from App Store Connect, inference providers, OpenTelemetry, and installable adapters without baking an organization's products or infrastructure into the core.
- Truthful metrics: zero, unavailable, stale, partial, and no source remain distinct.
- Adapter-owned catalog: products come from source systems and retain provenance.
- Inference accounting: bundled OpenAI, Anthropic, Gemini, OpenRouter, and generic compatible providers; official provider totals stay authoritative.
- Apple reporting: App Store Connect discovers the live app catalog and, when a vendor number is configured, parses Apple's daily Summary Sales Report into currency-preserving units and proceeds.
- Permissioned extensions: every adapter runs in a capability-scoped Deno subprocess.
- Safe administration: mandatory two-factor sign-in, step-up for writes, idempotency, and an append-only audit trail.
- One polished surface: responsive, capability-aware dashboard and resumable GUI onboarding.
- Two equal deployment paths: Docker Compose and hardened native systemd.
Appdmin is licensed under AGPL-3.0-or-later.
Requirements: Docker Engine with Compose v2.
cp .env.example .env
openssl rand -base64 32
# Edit .env: set APPDMIN_SECRET_KEY and strong database credentials.
docker compose up -d --build
docker compose exec appdmin appdmin admin createOpen http://localhost:8787, sign in, and follow the five onboarding steps. The first dashboard is
intentionally empty until an adapter discovers products or observations.
Requirements: Deno 2 and PostgreSQL 16 or newer.
cp .env.example .env
set -a
. ./.env
set +a
deno task cli migrate
deno task cli admin create
deno task devThen open http://localhost:8787.
Install the checkout as a local executable:
deno install --global --force --name appdmin \
--allow-env --allow-net --allow-read --allow-write --allow-run --allow-sys ./src/cli.tsCommon commands:
appdmin migrate
appdmin admin create
appdmin adapter list
appdmin adapter add openai --accept-permissions
appdmin adapter doctor openai
appdmin doctor
appdmin install --target docker --output ./generated
appdmin install --target systemd --output ./generated
appdmin backup --output ./backups/appdmin.dump
The trusted core owns encrypted configuration, products, observations, policy, and audit. An adapter
declares capabilities and exact permissions in appdmin.adapter.json, then communicates with core
over JSON-RPC on stdin/stdout. Bundled integrations use the same contract as community integrations.
Remote package references must be pinned to a semantic JSR/npm version or a full Git commit. Any manifest digest change disables the adapter until the owner reviews and accepts its permissions.
See adapter authoring and architecture.
Only bootstrap settings are environment variables:
| Variable | Purpose |
|---|---|
DATABASE_URL |
Appdmin PostgreSQL connection |
APPDMIN_SECRET_KEY |
Base64-encoded 32-byte AES key for encrypted settings |
APPDMIN_ORIGIN |
Exact public origin used for CSRF and WebAuthn |
APPDMIN_HOST / APPDMIN_PORT |
Bind address, defaults to 127.0.0.1:8787 |
APPDMIN_BASE_PATH |
Optional reverse-proxy path, defaults to / |
APPDMIN_SOURCE_URL |
Source archive/repository link shown in the GUI |
Provider credentials, workspace settings, pricing, adapter schedules, and branding are managed in the GUI/CLI and encrypted in PostgreSQL.
deno task verify
docker compose config --quiet
deno task cli install --target systemd --output /tmp/appdmin-systemd --dry-runProvider contract tests use synthetic fixtures and never production data. Host-dependent container and systemd checks are documented separately in installation.