Web admin UI for managing devcontainers on a server
Project description
devs-webadmin - Web Admin UI
A web-based admin interface for managing devcontainers on a server. Provides the same core functionality as the devs CLI but accessible from a browser -- useful for headless servers, remote machines, or when you want a visual overview of running containers.
Features
- Container Management: Start, stop, and clean up devcontainers from a web UI
- Repository-Based: Enter any GitHub
org/repoto start containers (uses RepoCache, no local checkout needed) - All Containers View: See all devs-managed containers across all projects at a glance
- VS Code Tunnels: Start, stop, and authenticate tunnels directly from the browser
- Tunnel Auth via Device Flow: GitHub device code flow for tunnel authentication without needing a terminal
Installation
# From the monorepo root
pip install -e packages/webadmin/
# Or when published
pip install devs-webadmin
Quick Start
# Start the web admin server
devs-webadmin serve
# Open http://localhost:8080 in your browser
Usage
Starting the Server
# Default: 0.0.0.0:8080
devs-webadmin serve
# Custom host/port
devs-webadmin serve --host 127.0.0.1 --port 3000
# Development mode with auto-reload
devs-webadmin serve --reload
Web UI
The UI has two main sections:
Start Container Form -- Enter a GitHub repository (e.g. ideonate/devs) and a dev name (e.g. sally), then click Start. The repo is cloned/updated via the shared repo cache at ~/.devs/repocache/.
Container List -- Shows all devs-managed containers with:
- Status (running/exited) with color indicators
- Project name, mode (copy/live), creation time
- Stop (preserves container state) and Clean (removes container + workspace) buttons
- Tunnel controls for running containers
Tunnel Controls
Each running container shows a tunnel panel:
- Start tunnel -- Launches a VS Code tunnel in the container. Once running, shows an "Open in browser" link to
vscode.dev. - Kill tunnel -- Stops a running tunnel.
- Auth -- Opens a modal with the GitHub device flow. A device code is displayed along with a link to
github.com/login/device. Complete the login in your browser and the modal updates automatically when authentication succeeds. Auth persists across container stop/restart cycles.
Configuration
Environment Variables
| Variable | Default | Description |
|---|---|---|
WEBADMIN_HOST |
0.0.0.0 |
Server bind address |
WEBADMIN_PORT |
8080 |
Server port |
DEVS_WORKSPACES_DIR |
~/.devs/workspaces |
Workspace directory |
DEVS_REPO_CACHE_DIR |
~/.devs/repocache |
Repository cache directory |
DEVS_CLAUDE_CONFIG_DIR |
~/.devs/claudeconfig |
Claude config directory |
DEVS_CODEX_CONFIG_DIR |
~/.devs/codexconfig |
Codex config directory |
GH_TOKEN / GITHUB_TOKEN |
(none) | GitHub token for private repos |
Shared Directories
The webadmin shares the same directories as the CLI and webhook:
~/.devs/repocache/-- Cached repository clones~/.devs/workspaces/-- Workspace copies for containers~/.devs/claudeconfig/-- Claude authentication
Architecture
Backend
- FastAPI + Uvicorn (same stack as the webhook package)
- Uses
devs-commonfor all container/workspace/repo operations - Synchronous common library calls wrapped with
asyncio.to_thread - Stop/clean operations work by Docker container name (no repo cloning needed)
Frontend
- Vue 3 loaded from CDN (no build step, no npm required)
- Single
index.htmlserved as a static file from the Python package - Self-contained -- ships inside the pip package with no external build process
API Endpoints
| Method | Path | Description |
|---|---|---|
GET |
/api/containers |
List all containers (optional ?repo=org/repo filter) |
POST |
/api/start |
Start container { repo, dev_name } |
POST |
/api/stop |
Stop container { container_name } |
POST |
/api/clean |
Remove container + workspace { container_name } |
GET |
/api/tunnel/status |
Tunnel status ?container_name=X |
POST |
/api/tunnel/start |
Start tunnel { container_name } |
POST |
/api/tunnel/kill |
Kill tunnel { container_name } |
POST |
/api/tunnel/auth |
Start device flow auth { container_name } |
GET |
/api/tunnel/auth/status |
Poll auth completion ?container_name=X |
Requirements
- Python 3.8+
- Docker running and accessible
- DevContainer CLI:
npm install -g @devcontainers/cli - devs-common package (installed automatically as a dependency)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file devs_webadmin-3.2.3.tar.gz.
File metadata
- Download URL: devs_webadmin-3.2.3.tar.gz
- Upload date:
- Size: 16.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b97ebd9ab8feb2f271da3c196c4e694844245549208b26509684ea9db3cbe823
|
|
| MD5 |
0e163495b340a2140b9f0ecc9a85ab1d
|
|
| BLAKE2b-256 |
f60578ae33c71158c3f4e564966b063e29e858945c3b76a628201847443dd969
|
Provenance
The following attestation bundles were made for devs_webadmin-3.2.3.tar.gz:
Publisher:
bump-and-publish.yml on ideonate/devs
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
devs_webadmin-3.2.3.tar.gz -
Subject digest:
b97ebd9ab8feb2f271da3c196c4e694844245549208b26509684ea9db3cbe823 - Sigstore transparency entry: 1090368151
- Sigstore integration time:
-
Permalink:
ideonate/devs@dccf8b47680717a2b7f27ade089cf48e297a3bf6 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/ideonate
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
bump-and-publish.yml@dccf8b47680717a2b7f27ade089cf48e297a3bf6 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file devs_webadmin-3.2.3-py3-none-any.whl.
File metadata
- Download URL: devs_webadmin-3.2.3-py3-none-any.whl
- Upload date:
- Size: 15.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6e7f4cde75d5fa1fd48987ba250d4a371a349506e805a55df194ba97392cce37
|
|
| MD5 |
a7638ab8dac6202e1d9732c08d018469
|
|
| BLAKE2b-256 |
0bf648e298a4a70e94606f11f14dc27c4b3dc746c6aead784b998b543a0cb5d0
|
Provenance
The following attestation bundles were made for devs_webadmin-3.2.3-py3-none-any.whl:
Publisher:
bump-and-publish.yml on ideonate/devs
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
devs_webadmin-3.2.3-py3-none-any.whl -
Subject digest:
6e7f4cde75d5fa1fd48987ba250d4a371a349506e805a55df194ba97392cce37 - Sigstore transparency entry: 1090368350
- Sigstore integration time:
-
Permalink:
ideonate/devs@dccf8b47680717a2b7f27ade089cf48e297a3bf6 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/ideonate
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
bump-and-publish.yml@dccf8b47680717a2b7f27ade089cf48e297a3bf6 -
Trigger Event:
workflow_dispatch
-
Statement type: