Repository navigation
opsdeck 0.3.0
The agent works like a coding harness — web access, subagents, hooks, background tasks,
canary rollouts and headless runs — and the workbench manages domains and DNS at
Cloudflare and ArvanCloud and TLS certificates from Let's Encrypt; FortiGate and AnyConnect
VPNs that ask for one-time codes or a group now connect.
Agent
- Web access —
web_search(DuckDuckGo without a key, or SearXNG, Brave, Tavily),
web_fetch(pages as Markdown, in parts; GitHub files as raw) andsoftware_lookup
(end-of-life dates from endoflife.date, known vulnerabilities from OSV.dev, GitHub releases).
Only public addresses are reached — every redirect and resolved IP is checked, so a page
cannot point the agent at opsdeck, this computer, the local network or cloud metadata.
Sites outside the allowed list (documentation sites built in, plus your own) ask once;
pages are marked untrusted and the next change after web content asks, in every mode; a
query that names a workspace address asks first. App settings → Web access sets the
default, the search backend and a proxy; a workspace can lower it or route the web through
one of its VPNs, and a workspace that allows only local models has it off. - Workspace APIs, metrics and logs —
http_requestcalls the API of a panel (Grafana,
Alertmanager, Harbor, Proxmox, an admin API…) through its VPN or jump host with its vault
login or token; writes ask like other changes. New resource kinds Prometheus, Loki
and Elasticsearch/OpenSearch withmetrics_query(PromQL, ranges drawn as a chart,
alerts, targets) andlogs_query(LogQL or a query string, lines coloured by level). dnstool — the agent reads and changes the DNS records of the workspace's domains
through the connected Cloudflare or ArvanCloud account (it never sees the token):zones,
records,set(create or change one record; the approval card shows the zone-file line
before and after, values left out are kept) anddelete(destructive; needs an unambiguous
record). Offered only when the workspace has aDomain; results come with a records table.certificatetool — the agent lists the workspace's certificates (issued, expiry,
due), shows one, issues or renews it (the ACME flow with its log as the result) and deploys
chain and key to a host from the vault without seeing the key, then reloads withexec.- Subagents —
delegatehands work to aninvestigator(read-only; several run in
parallel), adeployer(changes with the usual approvals) or the workspace's own
agents/*.md, each with its own context and optionally a cheaper model. Their steps,
calls and approvals show inside the call. - Hooks — commands before and after tool calls and at the end of a turn, with the event
as JSON on stdin: block a call (exit 2), make it ask, keep an audit log, post to a chat.
In App settings and per workspace; workspace hooks run only after you trust them here. - Background tasks —
execandlocal_execcan run a command in the background; the
session is told when it ends or prints a matching line, and an idle session picks it up by
itself.taskslists, reads, waits for and stops them; so does the session header. - Canary rollouts — a change over several hosts can run on one host first; a second card
then asks to continue on the rest or stop. - Waiting, asking, planning —
wait_for(port, URL, command output, Kubernetes rollout)
instead of sleep loops;ask_userasks a multiple-choice question in the chat;todokeeps
a live checklist above the message box. - Sessions — fork a session (or from one of your messages, to edit and resend it), export
it as a report, runbook or skill,!command(or!@host command) to run something
yourself, and slash commands: the built-in ones and the workspace's own prompt templates in
commands/*.md. - Headless runs —
opsdeck run -p "…" --ws acmefor cron and CI, with text, JSON or
streamed JSON output; anything that would ask is denied. - Model policy — a workspace can limit its sessions to some models (e.g.
ollama/*). - Faster, leaner loop — the reads of one step run in parallel; a long output is kept in
full and read in parts withread_outputinstead of being cut; tools are offered only
when the workspace has what they work on. - The chat — tool results come with views: charts, log lines, search results, the page
read, HTTP status, end-of-life tables and vulnerabilities, with the text the agent got one
click away.
Workbench
- Domains and DNS — Connectors → DNS & CDN connects a Cloudflare or ArvanCloud
account with an API token (checked against the provider, stored in the vault; an API URL
and a proxy under Advanced for networks where the provider is not reachable directly).
A new Domains page per workspace: add a zone by picking it from the account (aDomain
resource that holds only the zone and, optionally, the connector), see its status, plan,
name servers (and whether the registrar still points elsewhere), and its records in one
shape whatever the provider — type, name relative to the zone, content, TTL, priority,
proxied through the CDN, comment — with filters, an editor with hints per type, and
deletion that asks (the full name must be typed on a protected environment). ArvanCloud's
balanced A records and lowercase types, Cloudflare's SRV/CAA data and automatic TTL are
handled. Every record change is in the activity journal — see docs/dns.md. - TLS certificates — a new Certificates page and
Certificateresource: domains
(wildcards included), the CA (Let's Encrypt, its staging, Buypass, or any ACME directory),
contact email, key type, when to renew. Issue runs the dns-01 challenge through the DNS
connectors (TXT records created, checked on the zone's name servers, removed afterwards)
with a live log, and stores the chain and key in the vault (vault://<ws>/cert-<name>,
with readable expiry and fingerprint fields). The page shows what is valid, due or expired
and why; Deploy writes the files to a host over SFTP (key 0600; nginx, Apache and HAProxy
layouts) and can reload the service; Renew automatically renews due certificates while
opsdeck runs unlocked. All audited — see docs/certificates.md. - One-time VPN codes by SMS or email — FortiGate VPNs (OpenConnect or openfortivpn)
that send a code for every login now connect: opsdeck logs in itself and, when the gateway
asks for the code, shows a prompt on any page (and on the VPN page) with the gateway's
message; Persian digits are fine. A TOTP secret on the login answers it by itself, and so
can your phone: forward the gateway's SMS to an ntfy topic (App settings → One-time VPN
codes, with a test) or let a local command print the code. A tunnel that drops connects
again with the same session, without a new code, while the gateway keeps it. The agent
asks you for the code instead of failing. Untrusted FortiGate certificates now show the
pin to set before anything else runs. - AnyConnect groups and second factors — Cisco ASA/FTD gateways (and the other
openconnect gateways) that ask for a GROUP or a code after the password now connect,
also those with the old/+webvpn+/login: opsdeck answers openconnect's questions itself.
The group comes from the profile, or you pick it from the gateway's list in the same prompt
as codes; a second password or challenge (Answer:, Response:) gets the login's TOTP
code, or the code you enter or forward from your phone, and is asked for again when wrong.
The TOTP secret is no longer on openconnect's command line (nor in the VPN log).
Install
| System | Download |
|---|---|
| Windows 10/11 (x64) | opsdeck-0.3.0-windows-x64-setup.exe (or the portable .exe) |
| macOS 12+ (Apple silicon and Intel) | opsdeck-0.3.0-macos-universal.dmg |
| Debian / Ubuntu (x86_64) | opsdeck_0.3.0_amd64.deb |
| Fedora / RHEL / openSUSE (x86_64) | opsdeck-0.3.0-1.x86_64.rpm |
CLI only (opsdeck serve, opens in the browser) |
opsdeck-cli-0.3.0-<os>-<arch> |
Or run the install script — see Install.
Already installed? opsdeck shows the update in its sidebar and installs it for you.