Doki is a local-first workspace for running operational workflows, managing Docker-backed tools, and composing internal utilities in one place.
It combines:
- a web UI for commands, templates, targets, secrets, users, and audit history
- an app system with built-in apps plus runtime-installed apps
- App Studio for building new apps inside Doki
- an optional stealth login flow for hiding the normal login page
- a local Docker target and Go orchestrator for app execution
Out of the box, Doki gives you:
Appsfor browsing and launching installed toolsWorkflowsfor reusable commands, templates, and run historyApp Studiofor authoring and previewing apps- AI controls for administration and App Studio
Configurationfor targets, environments, and encrypted secretsAdministrationfor users, groups, module visibility, audit logs, and source management
Built-in apps currently live in app/apps:
playwright runnerimage-compresstext-diff
Runtime-installed app code lives in app/data/installed-apps, and per-app runtime state lives in app/data/apps.
You need:
- Docker with
docker compose
From the repo root:
./setup.sh
./start.shThen open:
http://localhost:8099
On first setup, Doki will:
- create runtime folders and keys
- seed the built-in
localDocker target - print a stealth key
- send you into the onboarding flow
During onboarding, you:
- create the first
super-admin - choose whether stealth login stays enabled
- choose which top-level modules are visible
If stealth stays enabled, the normal login page is hidden. You will first see a fake not-found page, and you type the stealth key there to unlock login.
Bootstrap and health:
./setup.sh
./setup.sh --check
./setup.sh --verboseRuntime control:
./start.sh
./stop.shFresh-install reset:
./reset.sh --dry-run
./reset.sh --forcereset.sh removes runtime state, generated keys, local databases, sessions, installed app code, app runtime data, Playwright output, and other generated files, while keeping bundled app code in app/apps.
setup.shruns the CLI bootstrap inapp/scripts/setup.php- setup prepares runtime state and verifies the local Docker target through
app/includes/OnboardingManager.php start.shandstop.shcontrol the Doki stack throughapp/scripts/runtime-control.php- the web app routes fresh installs to onboarding from
app/index.php
app: main PHP applicationapp/apps: bundled app codeapp/data: runtime state, SQLite DB, sessions, keys, installed apps, and app datatemplates: command template definitionsorchestrator-go: Go control-plane/orchestration servicedocker-compose.yml: local stack definitionDockerfile: PHP/Apache runtime image
Doki is currently designed for a trusted local or self-hosted environment.
The local stack currently uses:
- Docker socket access
- privileged containers
- a read-only host root mount inside the main app container
That is powerful and convenient for local orchestration, but it also means you should treat a Doki install as highly trusted infrastructure, not as a locked-down multi-tenant service.
- The app listens on
http://localhost:8099 - The orchestrator host port is auto-selected and persisted, defaulting to
8098when available - The host-side setup flow uses your local PHP CLI, so missing PHP extensions on the host will block
./setup.sh
Doki is under active development. The core onboarding, runtime control, local target seeding, module visibility controls, and recovery flow are in place, but the project is still evolving quickly.
Doki is available under the MIT License.
Contributions are welcome. If you want to improve Doki, fix a bug, tighten the UX, or add a useful app or workflow, pull requests are appreciated.