Your network's first employee.
Quickstart | Screenshots | Documentation | What This Repo Ships | API Surface
Steward is a self-hosted IT operations control plane for small networks: a local-first system with discovery, persistent state, graph-backed inventory, chat over live infrastructure context, policy-gated remediation, secure credential storage, device onboarding, widgets, automations, and operator access control.
The current repo also includes a first-class autonomy layer:
missionsfor durable goals Steward owns over timesubagentsfor domain-specific operational ownershipinvestigationsfor persistent follow-up instead of one-shot alertspacksfor installable operational knowledge- a Telegram-first
gatewayfor briefings, approvals, and operator presence - mission-thread chat sessions that bind Telegram threads, chat history, and mission ownership together
Current release highlights:
- DB-backed configuration with no product env-var drift
- durable job control plane for monitoring, remediation, and notifications
- graph projections with temporal node and edge history
- time-series persistence for latency and assurance evidence
- section-based live state streaming instead of full-state SSE snapshots
- A Next.js 16 + React 19 application with both operator UI and JSON APIs
- A persistent
discover -> understand -> act -> learnagent loop with manual and scheduled execution - SQLite-backed state, audit history, settings history, graph projections, protocol sessions, widget state, dashboard layout state, and device adoption records
- An encrypted vault for device credentials, provider secrets, OAuth tokens, and web research API keys using OS-native key protection plus AES-256-GCM
- Device discovery across passive ARP, mDNS, SSDP, multicast discovery, active nmap sweeps, reverse DNS, packet capture hints, browser observation, and service fingerprinting
- Device classification heuristics that infer type, vendor, OS family, management protocols, and confidence scores
- A graph-backed topology model linking devices, services, workloads, assurances, access methods, profiles, and site/subnet membership
- Incidents, recommendations, approvals, playbook runs, daily digests, and action logs
- A policy engine with autonomy tiers, action classes, maintenance windows, quantitative risk scoring, TTL-based approvals, escalation, rollback hooks, and quarantine on repeated failure
- A broker-first execution layer for SSH, HTTP, WebSocket, MQTT, WinRM, PowerShell over SSH, WMI, SMB, RDP, VNC-backed remote desktop, and local-tool operations
- Device-scoped chat with live context, graph queries, onboarding flows, browser-backed web sessions, remote terminal access, and widget generation
- Adapter management with file-backed and managed adapter packages, manifests, tool skills, runtime config, and adapter-contributed playbooks
- A mission-control layer with DB-backed missions, subagents, investigations, briefings, Telegram gateway bindings, and pack inventory
- Device widgets, widget controls, per-device automations, and dashboard widget pages
- RBAC, local auth bootstrap, session auth, API token auth, OIDC SSO, and LDAP login
- DB-backed runtime, system, auth-token, and auth settings with mutation history and as-of reads
Steward combines passive and active discovery so it can do more than ping a subnet. The current implementation uses ARP data, mDNS, SSDP, multicast discovery, nmap scans, reverse DNS, packet intel via tshark, browser-based observation of web consoles, TLS and HTTP inspection, SSH banner capture, SNMP and DNS probing, WinRM endpoint checks, MQTT broker checks, SMB negotiation, and NetBIOS hints.
Each device record carries services, protocols, evidence, metadata, timestamps, adoption state, and graph relationships. Discovery is not a one-shot import; it is part of the recurring agent loop.
The app already exposes real operator surfaces for:
- Dashboard
- Missions
- Subagents
- Packs
- Gateway
- Digest
- Devices
- Discovery
- Topology
- Incidents
- Activity
- Approvals
- Policies
- Chat
- Adapters
- Access control
- Settings
Per-device pages go beyond inventory. They include access methods, stored credentials, adapter/profile binding, workloads, assurances, findings, chat, widgets, automations, remote desktop, and remote terminal access.
Steward now separates long-lived agency from one-shot chat turns.
Workloadsandassurancesremain the concrete device-scoped contracts and checks.Missionssit above them and represent durable goals such as availability watch, certificate watch, backup hygiene, storage health, WAN guardian, and daily briefing.Subagentsnow carry typed scope and autonomy policy: domain, allowed mission kinds, approval mode, channel voice, escalation windows, and autonomy budgets.Subagentsalso persist mission-run memory, standing orders, cross-mission delegations, and mission plans so ownership survives across turns and across days.Investigationspersist follow-up across restarts and across days, with stage-based state (detect -> correlate -> hypothesize -> probe -> decide -> act -> verify -> explain), evidence, recommended actions, unresolved questions, and step history.Briefingsare stored artifacts, not transient UI strings, and are compiled separately from durable channel delivery jobs.MissionssupportshadowModeso a domain can stage ownership and briefing behavior before operator-facing delivery or action.- Chat sessions can now be formally bound to
missionId,subagentId, andgatewayThreadId, so Telegram threads and in-app conversations share the same durable mission context.
This cutover is DB-backed and additive. It does not move product behavior into environment variables.
Steward does not jump straight from detection to mutation. The repo has a real approval and execution pipeline with policy evaluation, risk scoring, approval TTLs, escalation, safety gates, execution lanes, idempotency keys, verification steps, rollback sequences, and failure quarantine.
Built-in playbooks currently cover:
- systemd, Docker, and Windows service recovery
- TLS certificate renewal
- rsync backup retry
- NAS snapshot verification
- disk cleanup
- configuration backup over SSH or HTTP
The conversational layer runs against live local state, not a static prompt. It can answer from devices, incidents, graph structure, recent changes, and device-scoped context, then route into first-party operations.
The current codebase also includes:
- Browser-backed web sessions for recurring appliance UIs
- In-app remote desktop sessions for RDP and VNC via
guacd - A per-device remote terminal that selects SSH, WinRM, or PowerShell-over-SSH based on observed access
- Generated device widgets with first-class controls backed by the operation runtime
- Per-device automations that can run widget controls on manual, interval, or daily schedules
Steward is already designed to be extended in-repo. Adapters can contribute discovery, enrichment, capability mapping, deterministic profile matching, tool skills, and playbooks. The app includes adapter package CRUD, config editing, tool-skill configuration, and built-in starter adapters for HTTP surfaces, Docker operations, and SNMP-derived network intelligence.
The new pack system broadens that model. Packs can now carry:
- subagents
- mission templates
- workload and assurance templates
- finding templates
- investigation heuristics
- playbooks
- report templates
- briefing templates
- gateway templates
- adapters and tools
- lab fixtures
Managed pack lifecycle is now a first-class API surface:
- manifest validation
- Steward compatibility checks
- signer registry and Ed25519 signature verification for verified packs
- materialized pack resources
- install and upgrade history
- enable / disable / remove flows without touching product env vars
The repo supports multiple model backends and local endpoints. Current provider support includes:
- OpenAI
- Anthropic
- Mistral
- Groq
- xAI
- Cohere
- DeepSeek
- Perplexity
- Fireworks
- Together AI
- OpenRouter
- Ollama
- LM Studio
- Custom OpenAI-compatible endpoints
Web research is also configurable through DB-backed settings and can use Brave scraping, DuckDuckGo scraping, Brave API, Serper, or SerpAPI.
npm install
npm run devOpen http://localhost:3010.
First-time flow:
- Visit
/accessand bootstrap the first account. - Configure at least one LLM provider.
- Run the agent loop from the UI or call
POST /api/agent/run. - Review discovered devices.
- Add credentials only where Steward should actually manage a device.
- Tune runtime and system settings from the UI.
- Configure a Telegram gateway binding if you want chat-native briefings and approvals.
docker compose up --buildThis stack includes:
- Steward on port
3010 guacdfor in-app remote desktop sessions- Persistent local state mounted at
./.steward
macOS / Linux / WSL:
chmod +x ./scripts/install-prod.sh
chmod +x ./scripts/run-prod.sh
./scripts/install-prod.sh
./scripts/run-prod.shWindows PowerShell:
./scripts/run-prod.ps1Before merging or cutting a build, run:
npm run lint
npm run test
npm run buildThe repository now includes a GitHub Actions workflow that runs the same lint -> test -> build sequence on pushes and pull requests.
Autonomy-specific validation now includes:
- pack signer and verified-pack API coverage
- Telegram gateway threading and inbound dedupe coverage
- mission replay fixtures for WAN, backup, and certificate guardians
- schema migration coverage for chat-thread and pack-signing cutover
- restore-drill coverage for the autonomy schema backup path
The repo expects real network tooling. The install scripts and postinstall hooks ensure or attempt to install:
nmaptshark- SNMP tools
- Playwright browser runtime
- PowerShell
guacdor Docker-basedguacdfor remote desktop features
Steward stores local data under .steward/:
steward_state.dbsteward_audit.dbvault.enc.jsonvault.key
Runtime and product settings are persisted in SQLite. Provider metadata is DB-backed, while provider secrets and device credentials are stored in the encrypted vault. API access can be gated by a DB-backed auth token, and operator access can be managed through local users, OIDC, or LDAP.
The current public-beta outbound notification surface is intentionally narrow:
- Telegram
- Generic outgoing webhooks
Email, Slack, Teams, SMS, and push delivery are deliberately deferred until after the first public-beta release.
Telegram is now more than a notification sink. Steward includes a Telegram-first gateway with:
- DB-backed gateway bindings
- inbound webhook processing
- inbound update dedupe
- durable thread-to-chat-session binding
- mission, subagent, investigation, and status commands
- natural-language prompts such as "what are you watching", "show open missions", and "why was slow"
- briefing compilation plus durable
channel.deliveryjobs - durable
approval.followupreminders when approvals are aging in the queue - approval and deny commands for pending playbook actions
The dashboard and device contract surface are now mission-aware as well:
/surfaces active missions, active investigations, pending approvals, and recent briefings before lower-level widgets- device contract pages show mission ownership over committed workloads and assurances
/api/autonomy/metricsand the home dashboard surface queue lag, worker health, mission latency, briefing latency, and channel delivery latency
Core endpoints:
GET /api/healthGET /api/statePOST /api/agent/runPOST /api/chat
Settings:
GET/POST /api/settings/runtimeGET/POST /api/settings/systemGET/POST /api/settings/auth-tokenGET /api/settings/history?domain=runtime|system|auth
Inventory and operations:
GET/POST /api/devicesGET /api/devices/:id/adoptionGET/POST /api/devices/:id/credentialsGET/POST /api/devices/:id/widgetsGET/POST /api/devices/:id/automationsGET/PATCH /api/incidentsGET /api/approvalsPOST /api/approvals/:idGET/POST /api/playbooks/runsGET /api/audit-eventsGET/POST /api/digest
Autonomy:
GET /api/autonomy/metricsGET/POST /api/missionsGET/PATCH /api/missions/:idGET /api/missions/:id/delegationsGET /api/missions/:id/planPOST /api/missions/:id/runGET /api/subagentsGET/PATCH /api/subagents/:idGET/POST /api/subagents/:id/ordersGET /api/investigationsGET/PATCH /api/investigations/:idGET/POST /api/packsGET/POST /api/packs/signersGET/PATCH/DELETE /api/packs/signers/:idGET/PATCH/DELETE /api/packs/:idPOST /api/packs/:id/toggleGET /api/devices/:id/autonomyGET/POST /api/gateway/bindingsGET/PATCH/DELETE /api/gateway/bindings/:idPOST /api/gateway/telegram/:bindingId/webhookGET/POST /api/briefings
Identity and providers:
GET /api/auth/mePOST /api/auth/bootstrapPOST /api/auth/loginPOST /api/auth/logoutGET/POST/PATCH/DELETE /api/auth/usersGET/POST /api/providersGET /api/providers/modelsGET/POST /api/vault
Remote access:
GET/POST /api/remote-desktop/sessionsPOST /api/remote-desktop/sessions/:id/viewer-bootstrapGET/POST /api/devices/:id/remote-terminal
If you are contributing:
- Keep runtime and product configuration DB-backed
- Prefer deterministic execution paths and auditable state transitions
- Update public docs when product behavior changes
Steward is available under the MIT License.



