Monitor, diagnose, and automate your entire Windows fleet from a single dashboard. 40+ built-in tools. Recurring tasks. Proactive watchdog. Interactive AI chat. MCP Server for Claude Desktop. Self-hosted on your own server.
Install once on each host. Then drive it from wherever you work — tray icon, web dashboard, CLI, Claude Desktop via MCP, or your own automation via the REST API.
WinForms tray app (.NET 9). Polls server for tasks. Runs the 40+ tools. Auto-updates via heartbeat. Adaptive polling.
ASP.NET Core API. SQLite / SQL Server / PostgreSQL / MySQL. Multi-tenant. Hosts the web dashboard, REST API, and heartbeat endpoints.
Web UI for fleet operators. See all clients, dispatch tasks, view alerts, compare config snapshots, run playbooks.
Console app with 18 commands. Create tasks, schedule cron jobs, run playbooks, chat with AI — all from the terminal.
Talk to your fleet from Claude Desktop. 40+ MCP tools exposed. STDIO + HTTP dual transport. AI workflows on top of operations.
Captured from a live PWA Server with synthetic ACME data. Same UI you get on day one.
One click takes you from the fleet grid into a full picture of any client: tasks (queued, in-flight, history), open alerts, configuration snapshots, agent metadata, tags. Everything in one tabbed view — no jumping between tools.
Severity counters at the top, the live alert table below. Filter by severity, type, or client. Mark resolved manually, or let the watchdog auto-remediate the ones with a known fix (the counter is right there).
Ask in plain language: "which hosts have critical alerts?", "show me yesterday's failed tasks", "restart the print spooler on the RDP server". The chat has the full toolkit at its disposal and tells you exactly which tool it called before acting.
Package the steps your team always runs at 8am — disk check, service inventory, SQL health, top processes — into a named playbook. Trigger across all hosts or a tag with one click. Every step has its own log, so you can audit and re-run individual steps without restarting the whole sequence.
The dashboard is responsive — open it from your phone, triage alerts on the train, send a task to a host while you're at lunch. Same PIN, same operations, same audit trail.
Every tool is callable from the dashboard, CLI, or AI. Each runs as a structured task and returns a verifiable result.
System Info
CPU Info
Memory Info
Disk Space
.NET Check
Version Check
Installed Software
Find App
File Check
Directory List
File Search
File Copy
Process List
Top Processes
Windows Services
Scheduled Tasks
Collect Logs
Event Log
Analyze Logs (AI)
Capture Screen
Network Info
Ping
Port Check
RDP Sessions
SQL Server Info
SQL Server Health
PostgreSQL Health
ODBC Drivers
Temp Cleaner
PowerShell
Memory Optimizer
Registry Read
Plus FTP, VNC remote access, agent auto-update, install-as-service, refresh config — and your own custom tools via the IAgentTool plugin pattern.
PWA isn't just a remote terminal — it's a scheduler, a watchdog, and a workflow runner. Every action you take manually can become a recurring job.
Full cron expressions via NCrontab. Daily snapshots, weekly cleanups, hourly health checks — all visible and editable from the dashboard.
Background services that flag offline agents, correlate related incidents, gate alerts during snooze windows, and dedupe by (host, rule) so flapping conditions don't flood inboxes.
Predefined task sequences. "Morning health check", "Pre-update audit", "Incident snapshot" — chain tools into reusable workflows.
Dispatch a task to one host, many hosts by tag, or your entire fleet at once. Track progress per-host in real time.
Capture host configuration every 6h or on-demand. Compare snapshots between dates or between hosts to spot drift instantly.
Threshold + change-based alerts. Daily summary email. Telegram channel push. Per-client cooldowns to avoid spam.
Agent polls every 30s when active, then backs off to 60s / 2m / 5m / 10m when idle. Saves bandwidth without sacrificing responsiveness.
Each heartbeat carries the agent's version. If the server has a newer binary, the agent pulls and self-updates — no manual rollout.
PWA isn't a black-box AI product — it's a fleet of structured tools that any LLM can drive. Bring your own AI provider, talk to your hosts in natural language, or expose everything to Claude Desktop via MCP.
Ask "why is CLIENT-23 slow?" — the chat pulls live context (CPU, memory, top processes, disk),
reasons over it, and either gives you the answer or dispatches a diagnostic task.
Available in the CLI (pwa chat) and the dashboard.
40+ PWA tools exposed via the Model Context Protocol. Open Claude Desktop, ask "check disk space on all production servers", and Claude dispatches the task across your fleet, then synthesizes the answer.
ModelContextProtocol v1.0+[McpServerTool] attributesPWERP.EXE consuming 71% combined. Free memory: 412 MB. Suggest killing the orphan copies — the guardian will respawn them if they're legitimate.erp_guardian in cleanup mode. Result pending. ETA 15s.Each host is a client identified by its own key. Group them by tag, customer, environment, or region. PWA scales from one machine to hundreds.
Organize clients by environment (prod/staging), customer, region, or any custom dimension. Dispatch tasks per tag in one click.
Every agent pings the server. The dashboard shows online/offline, last-seen, version, and surface vitals at a glance.
Need to actually see what's happening? Start an on-demand TightVNC session from the dashboard. No pre-installation required.
Email destination, tags, snooze windows, location, support flags — configured per client and stored alongside the rest of the fleet state.
Server runs on SQLite (zero-config), SQL Server, PostgreSQL, or MySQL. Bring your existing infrastructure.
Replace the brand, the colors, the product name. Run PWA under your own identity for your own customers.
No per-tool fees. No per-task limits. Pricing is based on the number of hosts you manage.
Single host, kick the tires.
Teams running real fleets.
Custom deployments, your brand.
Get a guided demo with the full platform — dashboard, CLI, MCP, AI chat, the whole thing. See how PWA fits your operations in 30 minutes.
WinForms tray app — your eyes and hands on each host
A single-binary .NET 9 WinForms app (PeopleWorksAgent.exe) that runs on every host you want to monitor. Installs in seconds, no IIS, no SQL Server, no .NET Framework, no Java. Self-contained.
The agent polls /api/{tenant}/tareas/pendientes on a schedule. Adaptive polling ("Modo Receso") slows the cadence when the host is idle to save bandwidth:
active → 30s
quiet 1m → 60s
quiet 5m → 2m
quiet 15m → 5m
quiet 1h → 10m
A single command from the dashboard wakes the agent back up to 30s immediately.
Every heartbeat carries the agent's version. If the server's latest.json says a newer build is available, the agent downloads it, swaps the binary, and restarts — no manual rollout across the fleet.
publish-all.cmd to produce the single-file portable agent. Drop it on a USB or share, point it at your server with --apikey TENANT_ID, and it's live.ASP.NET Core API — the brain of the fleet
ASP.NET Core 9. Single binary, runs on Kestrel standalone, IIS, behind nginx, or in Docker. Your call.
EF Core with provider-of-your-choice. SQLite for zero-config / single-host setups, SQL Server / PostgreSQL / MySQL for production. Same schema, same migrations, no code changes.
GET/POST /api/{tenant}/tareas — task managementGET /api/{tenant}/tareas/pendientes — polled by the agentGET/POST /api/clientes — clients (heartbeat, tags, bulk-task)GET/POST /api/{tenant}/configuracion — config snapshots, diffGET/POST /api/alertas — alerts CRUD, stats, daily summaryGET/POST /api/playbooks — playbook managementPOST /api/chat — interactive AI chatEvery endpoint is scoped by a client ID (in PWA's reference deployment that's the RNC, but the field is just an opaque string for white-label use). Data is logically separated by client — tasks, snapshots, alerts, and metrics all carry the client foreign key. The server enforces rate limits and security headers globally via middleware.
The server also serves the web dashboard from wwwroot/. Auth via PIN middleware for operators; agent endpoints whitelisted via API key.
Web UI for fleet operators
One view of every host. Online/offline status, last-seen timestamp, agent version, surface vitals (CPU/RAM/disk), pending tasks, recent alerts. Sort, filter, group by tag.
Pick a host (or many), pick a tool, fill in parameters, hit go. Track progress in real time. Drill into results with structured viewers — log files in a code reader, processes in a sortable table, registry trees in a navigator.
For any host, see its config across time: pick two snapshots and the diff tool highlights every change — new processes, removed software, version bumps, disk-space deltas. Catches drift instantly.
Threshold + change-based alerts. Acknowledge, snooze, or escalate. Daily summary email rolls up the day's signals so you don't have to live in the dashboard.
Command palette (Ctrl+Shift+K) for fast actions. Mobile-friendly responsive design. Real-time updates without polling — the dashboard subscribes to heartbeat events server-side.
Scriptable, pipeable, automatable
Everything the dashboard does, from your terminal. Perfect for scripting, CI/CD pipelines, ad-hoc ops:
pwa create <type> --rnc XXX --params '{...}' — dispatch a taskpwa list / view / cancel — task lifecyclepwa schedule "0 6 * * *" --tipo SystemInfo --rnc XXX — cron-recurringpwa bulk --tag prod --tipo DiskSpace — fleet-widepwa playbook morning-check --rnc XXX — run a sequencepwa chat --rnc XXX — interactive AI sessionpwa diff <snap1> <snap2> — compare snapshotspwa alerts / summary / clients / tag$ pwa create DiskSpace --rnc CLIENT-001 --priority Alta
Task #1834 queued. ETA: 30s.
$ pwa view 1834
Status: completed
Result: C: 412 GB / 500 GB (82%) — warning threshold 85%
$ pwa schedule "0 */6 * * *" --tipo ConfigSnapshot --rnc CLIENT-001
Scheduled: every 6h. Next run: 2026-05-30 00:00:00.
Output is structured (JSON or table). Pipe into jq, ship to CI, render to whatever. The CLI is a thin client over the REST API — no special privileges, just an API key.
Drive your fleet from Claude Desktop
The Model Context Protocol is Anthropic's open standard for connecting AI assistants to external systems. With PWA's MCP Server, Claude Desktop (or any MCP-compatible client) can read your fleet state and execute operations.
The most-used PWA capabilities are wrapped as MCP tools spread across nine modules (Tareas, Alertas, Clientes, Diagnostico, Playbooks, RemoteControl, Database, FTP, Chat). Each tool is typed with JSON Schema so the LLM knows exactly what it can do.
claude_desktop_config.json./mcp.Tools are registered with the [McpServerTool] attribute and discovered automatically via .WithToolsFromAssembly(). Add a new tool by adding a method — no config to touch.
{
"mcpServers": {
"peopleworks-agent": {
"command": "PeopleWorksAgent.MCP.exe",
"args": ["--stdio"],
"env": {
"PWA_SERVER": "https://agent.acme.com",
"PWA_API_KEY": "..."
}
}
}
}
Cron-based scheduling, fleet-wide
Powered by NCrontab. The same 5-field syntax you already know: minute hour day month weekday. Schedule any tool to run on any host, on any cadence.
# Daily system snapshot at 6am
0 6 * * * → SystemInfo → CLIENT-001
# Every 15 minutes, disk check on prod tag
*/15 * * * * → DiskSpace → tag:prod
# Weekly playbook every Monday at 5am
0 5 * * 1 → playbook:weekly-audit → all
Every recurring task shows up in the dashboard with its next-run timestamp, history, and pass/fail rate. Edit the cron expression or pause the schedule without redeploying anything.
If the agent was offline when a job was due, the server can either replay it on reconnect or skip the missed window — configurable per schedule.
A recurring task is just a regular task on a timer. Same execution path, same logs, same audit. Nothing exotic to debug.
Proactive monitoring with auto-remediation
PWA ships with a set of background watchdog services that continuously evaluate fleet state and fire alerts (and, where safe, remediations) without operator intervention:
Specific monitoring services target known patterns we operate against in production — for example, an NCF Sequencer watchdog tracks ranges of electronic invoice number sequences across the ERP fleet and alerts when a client is approaching exhaustion.
The agent's tools can be invoked directly from alerts (or from chat, or from playbooks) — TempCleaner, MemoryOptimizer, ErpGuardian, restart-service via PowerShell — so the "fix-on-trigger" pattern is feasible by chaining alert → playbook. Full configurable threshold→action rules are on the roadmap.
Every mutating action — taken by an operator, by chat AI, or by a service — is logged with the trigger, the action, the result, and the actor. Forensics are first-class, not bolted on.
Reusable workflows built from tools
A playbook is an ordered sequence of tool invocations. Each step can pass data to the next, branch on the previous result, or short-circuit on failure. Think CI pipeline, but for ops on Windows hosts.
Playbooks are JSON. Author them in the dashboard's visual editor or check them into your repo and POST them via the API. Either way, they live with the rest of your tenant config.
Same playbook works from the dashboard ("Run on this host"), the CLI (pwa playbook morning-check --rnc XXX), the watchdog (as a remediation), or the AI chat ("run morning check on prod").
Track every host's state, spot drift instantly
A snapshot is a structured JSON document with everything that matters about the host's state:
FileSystemWatcher on critical binaries triggers an immediate snapshot when they're swappedpwa create RefreshConfigSnapshotPick any two snapshots — from one host across time, or from two hosts at the same time — and see structured differences highlighted. New software in green, removed in red, version bumps in amber. Spot a misconfigured workstation in seconds.
Talk to your fleet in natural language
The dashboard's chat uses an OpenAI-compatible chat-completions endpoint configured at the server level (model + base URL + auth token, all in appsettings.json). Swap providers by changing the config — the rest of the pipeline doesn't care whether you're pointed at OpenAI, Azure OpenAI, an internal endpoint, or a self-hosted model.
When you start a chat scoped to a host, the AI receives the host's recent snapshot, recent alerts, recent task results, and tags as system context. You don't have to paste anything — the AI already knows the situation.
The AI doesn't just chat. It can dispatch tools live. Ask "why is CLIENT-23 slow this morning?" and it'll pull CPU, memory, top processes, then reason over fresh data. Mutating tools (create task, resolve alerts, rename client) are audited in a dedicated table so every action the model takes leaves a trace.
pwa chat --rnc CLIENT-001, full-terminal session, scriptableChats are persisted server-side. Pick up where you left off, share threads with teammates, or audit what was discussed and what tools were invoked via the ChatAuditoria table.
PWA fits your infrastructure, not the other way around
EF Core abstracts the differences. The migrations apply automatically on startup. Switching backends is a connection-string change.
White-label customers and on-prem deployments rarely look like one another. Letting them pick the DB they already operate removes a procurement battle. PWA shows up, fits in.
# SQLite (default)
"Data Source=pwa.db"
# SQL Server
"Server=.;Database=PWA;Trusted_Connection=True;TrustServerCertificate=True"
# PostgreSQL
"Host=db.local;Database=pwa;Username=pwa;Password=..."
# MySQL
"Server=db.local;Database=pwa;Uid=pwa;Pwd=..."
Run PWA under your own brand for your own customers
Need a domain-specific tool to ship with your build? Implement IAgentTool in a class library, register it in DI, and it shows up everywhere — dashboard, CLI, MCP. No fork required, no protocol to learn.
White-label customers typically run their own PWA Server instance — on-prem, in their cloud account, or in a managed environment. That means each operator gets their own database, their own SMTP endpoint, their own Telegram bot, their own AI provider configuration. Full data path control without per-tenant gymnastics in the product.
A few things often associated with "white-label" are not built into PWA itself: per-brand email templates with localized strings, programmatic theme switching at runtime, and operator-vs-end-customer surface separation within the same instance. White-label deployments handle these by running their own server, not by configuration toggles.
One command, many hosts, one screen of results
--tag prod hits every host carrying that tag--rnc CLIENT-001,CLIENT-007 picks an explicit list--all dispatches to every connected agentThe dashboard shows a live grid: each host as a tile, each tile lighting up as the task starts, runs, and completes. Click any tile to drill into its result without leaving the bulk view.
One host failing doesn't block the rest. The grid surfaces failures with the error message, and you can retry just the failed ones with one click — no need to re-dispatch the whole batch.
SqlServerHealth, InstalledSoftware)TempCleaner across all workstations)# Disk-space check across all production hosts
pwa bulk --tag prod --tipo DiskSpace
# Refresh config snapshot on a specific customer's hosts
pwa bulk --tag customer:acme --tipo RefreshConfigSnapshot
# Emergency cleanup, fleet-wide
pwa bulk --all --tipo TempCleaner --priority Alta
Signal, not noise — multi-channel delivery
Every (host, rule) pair has a cooldown window. A flapping disk-usage condition won't dump 200 alerts in your inbox overnight — it fires once, then stays quiet until the cooldown clears.
One email per day per operator with everything that fired in the last 24h, grouped by severity and by host. Skip the noise during the day, get the full picture at 8am.
Alerts have lifecycle: fired → acknowledged → resolved. Snooze for N hours, escalate to another operator, or attach a remediation note. Full audit trail per alert.
Fast when busy, quiet when idle
A 30-second poll feels snappy for the operator, but it's wasteful when nothing's happening. A 5-minute poll saves bandwidth but feels sluggish when you actually want a task to run. You shouldn't have to pick.
The agent starts at 30 seconds. After each empty poll (no pending tasks), it steps down the ladder:
active → 30s
quiet 1 min → 60s
quiet 5 min → 2m
quiet 15 min → 5m
quiet 1 hour → 10m
Any incoming task — dispatched manually, by playbook, or by watchdog — wakes the agent back up to 30s instantly.
An idle host on fixed 30s polling sends ~120 empty pings per hour. On adaptive polling, the same host sends ~6. For a fleet of 1000 hosts, that's the difference between ~50 MB/hour and ~2 MB/hour of backend traffic.
The default cadence is sensible, but every step is configurable per tenant. Some customers want 15s/30s/60s for super-responsive ops; others want 60s/5m/30m for low-bandwidth sites.
Roll out a new agent across the fleet — automatically
Every heartbeat carries the agent's version. The server compares it against latest.json. If a newer build is available and the host's tags match the rollout policy, the agent pulls the new binary, swaps itself out, and restarts.
You don't have to update everyone at once. Tag a few canary hosts as canary, point the rollout policy at that tag, watch it bake for 24h. If nothing breaks, widen to prod. Standard blue/green logic — but for agents.
Before swapping, the agent keeps a copy of the previous binary. If the new one fails to start within N seconds, it rolls back automatically. The dashboard surfaces failed updates so you can investigate without losing the host.
publish-all.cmdupdates/ folderlatest.jsonThe dashboard shows version distribution across the fleet at a glance. Stragglers (offline at rollout time) update the moment they reconnect — no manual chasing.
Lightweight signal, full situational awareness
A small JSON payload every 60 seconds:
The server flags a host offline after 3 missed heartbeats (~3 min by default). Dashboard turns the indicator red, watchdog can fire an alert, recovery is automatic when the heartbeat resumes.
Heartbeats aren't just data — they're triggers. The server can use them to fire alerts on "host came online unexpectedly", "version regression detected", "vitals crossed threshold", or anything you can express as a rule against the heartbeat stream.
Polling tells you "the agent is alive enough to ask for work". Heartbeats tell you "and here's what's happening on the host right now" — without the operator needing to dispatch a task. Two different signals, both cheap.
Eyes on the host when logs aren't enough
You don't pre-install VNC on every host. The first time you need to see what's happening on a workstation, click "Start Remote View" in the dashboard. The agent fetches a portable TightVNC build, starts it on a randomized port, and the server tunnels you in. When you close, it stops and uninstalls — no leftover surface.
Every session has a configurable lifetime (default 30 minutes). When it expires, the VNC server stops, the port closes, the dashboard logs the session end. No "I'll just leave this open" risk.
Every VNC session is logged with operator identity, host, start time, end time, and reason (optional free-text). If your compliance regime asks "who looked at CLIENT-007's screen on Tuesday?", the answer is in the audit log.
The end user on the host sees a clear notification when a session starts, with the operator's name. There's no covert viewing — this is meant for support engagements, not for watching people work.
If you just need a screenshot, not a live session, use the capture_screen tool. It returns a PNG of the current desktop without opening a remote channel — much lighter touch.
Each host carries its own settings, alongside the rest of the fleet
Each agent authenticates to the server with its client key (the RNC in PWA's reference deployment). The server validates the key against the registered clients table on every request — keys are scoped per-client, leaking one doesn't open the rest of the fleet.
Two layers of access: agents authenticate by client key on the public API, operators authenticate to the dashboard via PIN behind a middleware that whitelists agent endpoints.
Things like the SMTP server, the Telegram bot, and the AI Copilot endpoint are configured once at the server level and shared across the fleet. White-label deployments typically run their own server instance, so each operator gets their own set of these regardless.