@cytsai/dtp-agent-web
v1.9.1
Published
[.
Prerequisites: OpenCode CLI installed, Node.js 20+.
Usage
dtp-agent # Start on port 3000
dtp-agent --port 8080 # Custom port
dtp-agent --ui-password secret # Password-protect UI
dtp-agent tunnel help # Tunnel lifecycle commands
dtp-agent tunnel providers # Show provider capabilities
dtp-agent tunnel profile add --provider cloudflare --mode managed-remote --name prod-main --hostname app.example.com --token <token>
dtp-agent tunnel start --profile prod-main
dtp-agent tunnel start --provider cloudflare --mode quick --qr
dtp-agent tunnel start --provider cloudflare --mode managed-local --config ~/.cloudflared/config.yml
dtp-agent tunnel status --all # Show tunnel state across instances
dtp-agent tunnel stop --port 3000 # Stop tunnel only (server stays running)
dtp-agent logs # Follow latest instance logs
OPENCODE_PORT=4096 OPENCODE_SKIP_START=true dtp-agent # Connect to external OpenCode server
OPENCODE_HOST=https://myhost:4096 OPENCODE_SKIP_START=true dtp-agent # Connect via custom host/HTTPS
dtp-agent stop # Stop server
dtp-agent update # Update to latest versionTunnel behavior notes
- One active tunnel per running DTP Agent instance (port).
- Starting a different tunnel mode/provider on the same instance replaces the active tunnel.
- Replacing or stopping a tunnel revokes existing connect links and invalidates remote tunnel sessions.
- Connect links are one-time tokens; generating a new link revokes the previous unused link.
OPENCODE_PORT=4096 OPENCODE_SKIP_START=true dtp-agent
OPENCODE_HOST=https://myhost:4096 OPENCODE_SKIP_START=true dtp-agent| Variable | Description |
|----------|-------------|
| OPENCODE_HOST | Full base URL of external server (overrides OPENCODE_PORT) |
| OPENCODE_PORT | Port of external server |
| OPENCODE_SKIP_START | Skip starting embedded OpenCode server |
| DTP_AGENT_OPENCODE_HOSTNAME | Bind hostname for managed OpenCode server (default: 127.0.0.1, use 0.0.0.0 for LAN/remote access — trusted networks only) |
DTP_AGENT_OPENCODE_HOSTNAME=0.0.0.0 dtp-agent --port 3000Security note: binding to 0.0.0.0 exposes the server on all network interfaces — use only on trusted networks and protect with firewall rules or --ui-password.
Optional env vars:
environment:
UI_PASSWORD: your_secure_password
DTP_AGENT_TUNNEL_MODE: quick # quick | managed-remote | managed-local
DTP_AGENT_TUNNEL_PROVIDER: cloudflareFor managed-remote mode, also set:
environment:
DTP_AGENT_TUNNEL_MODE: managed-remote
DTP_AGENT_TUNNEL_HOSTNAME: app.example.com
DTP_AGENT_TUNNEL_TOKEN: <token>For managed-local mode, you can set:
environment:
DTP_AGENT_TUNNEL_MODE: managed-local
DTP_AGENT_TUNNEL_CONFIG: /home/dtp-agent/.cloudflared/config.ymlManaged-local path note: DTP_AGENT_TUNNEL_CONFIG must use a container path under /home/dtp-agent/.... If the config file references credentials-file, ensure that JSON path is also mounted and reachable inside the container.
Data directory: mount data/ for persistent storage. Ensure permissions:
mkdir -p data/dtp-agent data/opencode/share data/opencode/config data/ssh
chown -R 1000:1000 data/dtp-agent # Runs in background by default
dtp-agent stop # Stop background serverUse --foreground to keep the CLI process alive so systemd (or any other process manager) can track and restart it. Combine with OPENCODE_HOST to connect to an OpenCode instance running as a separate service.
~/.config/systemd/user/opencode.service
[Unit]
Description=OpenCode Server
[Service]
Type=simple
ExecStart=opencode serve --port 4095
Environment="PATH=/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin:/home/YOU/.local/bin:/home/YOU/.npm-global/bin:/usr/local/bin:/usr/bin:/bin"
Environment=SSH_AUTH_SOCK=%t/ssh-agent.socket
Restart=on-failure
RestartSec=5
[Install]
WantedBy=default.targetWhy set
PATHandSSH_AUTH_SOCK? systemd user services start with a minimal environment — no shell profile is sourced. Without an explicitPATH, OpenCode won't find tools installed via Homebrew, npm, or~/.local/bin. WithoutSSH_AUTH_SOCK, git operations over SSH (push, pull, clone) will fail.%texpands to$XDG_RUNTIME_DIR(e.g./run/user/1000), where most SSH agents write their socket.
~/.config/systemd/user/dtp-agent.service
[Unit]
Description=DTP Agent Web Server
After=opencode.service
[Service]
Type=simple
ExecStart=dtp-agent serve --port 3000 --host 0.0.0.0 --ui-password your-password --foreground
Environment="OPENCODE_HOST=http://localhost:4095"
Environment="OPENCODE_SKIP_START=true"
Restart=on-failure
RestartSec=5
[Install]
WantedBy=default.targetsystemctl --user daemon-reload
systemctl --user enable --now opencode dtp-agent--host 0.0.0.0 is required to listen on all interfaces (the default is 127.0.0.1). Use --host <ip> or DTP_AGENT_HOST=<ip> to bind to a specific interface instead.
What makes the web version special
Remote access - Cloudflare tunnel with QR onboarding. Scan from your phone, start coding.
Mobile-first PWA - optimized chat controls, keyboard-safe layouts, drag-to-reorder projects
Background notifications - know when your agent finishes, even from another tab
Self-update - update and restart from the UI, server settings stay intact
Cross-tab tracking - session activity stays in sync across browser tabs
Cloudflare tunnel access with quick, managed-remote, and managed-local modes
One-scan onboarding with tunnel QR + password URL helpers
Mobile-first experience: optimized chat controls, keyboard-safe layouts, and attachment-friendly UI
Background notifications plus reliable cross-tab session activity tracking
Built-in self-update + restart flow that keeps your server settings intact
License
MIT
