Health
| Machine | Customer | OS | Pending updates | Health | Last check-in |
|---|
Monitoring & alerts
| Severity | Condition | Machine | Customer | Observed | Since |
|---|
Fleet
| Device | Customer | Location | Health | Status | OS | Updates | Action | Last seen |
|---|
Customers
| Customer | Machines |
|---|
Script library
Application installers
Schedules
| Schedule | Script | Targets | Frequency | Last run | Next run |
|---|
Device groups
| Group | Matches | Criteria | |
|---|---|---|---|
| Loading… | |||
Automation tasks
| Status | Task | When | Action | Target | Matches now | Next run | Last run |
|---|
Update policy
The server checks every 30 seconds and queues installs for updates that match the rules below. Everything else still waits for manual approval.
Blocks the Windows Update controls for users, changes Windows automatic installation to notify-only, and enforces denied patches as hidden updates. The Windows Update service remains enabled.
A short delay (e.g. 3 days) lets Microsoft pull bad patches before your fleet installs them. Defender definitions ignore the delay.
When off, machines skip Preview cumulative updates entirely — they won't appear as pending. Turn on only where you want early/optional updates.
How each category is handled fleet-wide. Auto follows the severity rules above. Manual waits for a technician's approval. Report only is informational — never installed by policy. Security and cumulative updates always follow the severity rules.
Comma-separated. Matching KBs, update IDs, or title fragments are never auto-approved.
| Update | Machine | Customer | Denied by | When |
|---|
Job history
| Machine | Job | Type | Status | Created | Finished |
|---|
Security
Detections pushed in real time from Bitdefender GravityZone. Archive handled events to keep the active queue focused; permanent deletion is audited.
| When | Machine | Customer | Module | Threat | File / URL | Action |
|---|
Software inventory
Every program installed across the fleet. Search to find who has what (e.g. old Java, a specific Chrome version). Collected on each check-in.
| Program | Version | Publisher | Machine |
|---|
Support requests
Submitted by users from the system-tray “Request support” form. Emailed to your support address (Settings → Integrations → Email) and posted to Discord.
| When | From | Subject | Device | Customer | Contact |
|---|
Help / FAQ
Reference for troubleshooting the Outpost client on Windows endpoints. Run the elevated commands in an Administrator PowerShell on the endpoint (via the Console tab, ScreenConnect, or in person). Click any command to copy it.
Where the Outpost client lives (folder layout)
The client is split across two folders by design: program files (code, locked down) and program data (config, logs, working files).
C:\Program Files\Outpost — program code
Locked to SYSTEM + Administrators. Contains the scripts the scheduled tasks run.
| agent.ps1 | The main agent. Runs as SYSTEM: inventory, updates, jobs/commands, self-update, tray upkeep. |
| tray.ps1 | The user-facing system-tray app (Request support / screenshot). Runs in the logged-in user's session. |
| tray.ico | Tray icon. |
C:\ProgramData\Outpost — config, logs, working data
Also locked to SYSTEM + Administrators (only tray.json is user-readable, so the tray can read its config).
| config.json | Server URL, agent ID, and the agent token. Secret — never share. |
| agent.log | Rolling log of every check-in, job, self-update, and tray action. First place to look. |
| tray.json | Non-secret tray config (server URL, agent ID, brand). The only user-readable file here. |
| heartbeat.txt | Timestamp the live-mode loop updates each poll — proof the persistent agent is alive. |
| tray_active_version.txt | Tray version the agent last activated (drives the no-logoff live swap). |
| staging\ | Where job scripts and downloads are written before running (kept out of C:\Windows\Temp on purpose). |
| denied.json / include_preview.flag / monitor_report.json | Cached policy state the agent syncs from the server each cycle. |
Scheduled tasks the client uses
The client is driven by two scheduled tasks. Nothing runs as a Windows service.
| Outpost RMM Agent | Runs agent.ps1 as SYSTEM. Repeats every 1 minute (interval mode); in Live mode it runs as one persistent process and the 1-minute trigger just acts as a watchdog/restart. |
| Outpost Tray | Runs tray.ps1 in the user session at logon, windowless via conhost --headless. |
Inspect them
Or with PowerShell:
Start / stop / restart the agent
"Restarting" the agent = running its task on demand. It normally runs itself every minute, so you rarely need this — but it forces an immediate check-in.
Force an immediate run (check-in now)
Stop a running agent (e.g. a stuck live-mode process)
Restart the tray for the current user
Kill a tray that's misbehaving (agent will relaunch it within a cycle)
Enable / disable the client (without uninstalling)
Disabling stops the tasks from firing but leaves everything installed — useful for pausing a machine during maintenance.
Disable (pause) both tasks
Re-enable
A disabled agent stops checking in and will show Offline in the dashboard after 15 minutes.
Read the logs & check status
Tail the agent log (most recent activity)
Watch the log live
What agent / tray version is installed?
Is the agent enrolled? (server URL + agent ID; no secrets shown)
Live mode (instant commands) & troubleshooting it
In Live mode the agent holds a connection open to the server so commands run in ~1–2s. Toggle it per-machine on the machine's Console tab. Machines not in live mode use the 1-minute check-in.
Is this machine actually live right now?
Check the heartbeat is recent (updates every ~25s while live):
And look for this line in the log:
Commands are slow / not returning
Confirm the machine is on a recent agent (BOM fix + live mode need 1.12.0+), then force a check-in and re-test. If it's a Bitdefender machine, see the AV section below — task/command operations may be blocked by ATC.
Bitdefender / antivirus blocking the client (ATC)
The client is unsigned PowerShell running as SYSTEM, which behavioral engines (Bitdefender ATC especially) may flag. Symptoms: Access is denied on task operations in the log, quarantined files, or a missing tray.
In GravityZone, exclude the client folders (tick On-access + ATC/IDS):
| Folder | C:\Program Files\Outpost\ |
| Folder | C:\ProgramData\Outpost\ |
Folder exclusions don't cover ATC's behavioral block on powershell.exe itself (it lives in System32). For that, add a Process exclusion for C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe (On-access + ATC/IDS) — or, tighter, use GravityZone's Add exclusion → To profiles from the Blocked Applications report. The permanent fix is code-signing the agent (one certificate-hash exclusion).
Note: the v1.0 folder is a legacy name — that is Windows PowerShell 5.1, the current engine, not "PowerShell v1."
Reinstall / repair / uninstall the client
Reinstall or repair (safe to re-run over an existing install)
Grab the machine's install one-liner from Fleet → Add device (it includes the enroll key). It re-creates the tasks and refreshes files.
Uninstall completely (removes tasks + both folders)
Replace YOUR-SERVER with your RMM URL. Run elevated. After uninstall the machine goes Offline and can be removed from the Fleet list.
Manual cleanup (if a task got orphaned)
"Running scripts is disabled" when installing
Windows' execution policy blocks unsigned scripts. The install one-liner from the dashboard already prepends a process-scoped bypass, but if you're running a script by hand, set it for that window only (nothing permanent):
Recover devices after a failed agent release
A server rollback does not automatically repair endpoints when the broken agent fails before check-in. Use the dedicated Recovery page for pinned tools and the full incident procedure.
Correct recovery order
- Make the server serve the last known-good agent.
- Run Stable Agent Recovery on each affected endpoint.
- Repair the scheduled task only when it is missing or malformed.
- Collect diagnostics from devices that remain offline.
Never delete C:\ProgramData\Outpost\config.json during a normal rollback. It contains the device identity and token. Deleting it turns recovery into re-enrollment and can create duplicate or mismatched records.
Backups
Macrium / Veeam status read from each device's Windows event logs (refreshed about every 30 minutes by the agent). A device is stale when it has no successful backup within its customer's threshold, failing when the newest event is a failure, and none detected when no backup product events exist at all.
| Device | Customer | Detected software | Last successful backup | Last failure | State |
|---|---|---|---|---|---|
| Loading… | |||||
Patching
Endpoint Recovery Center
Current safety state
PrimeNetCore is serving the known-good agent 1.12.6. The 1.15.0 Windows Update enforcement agent remains suspended and is not included in this release. Do not retry fleet-wide enforcement until a corrected agent passes a lab and pilot rollout.
Critical identity rule
Do not delete C:\ProgramData\Outpost\config.json during a normal rollback or task repair. Recovery tools preserve the existing AgentId and token. Re-enrollment should be the last resort, not the first response to an offline device.
What we learned
- A broken agent cannot download its own rollback when it fails before check-in.
- The active agent and the pinned recovery agent must be separate server files.
- Server rollback and endpoint recovery are two different actions.
- Use C:\Windows\Temp\PrimeNetCore, not %TEMP%, for technician recovery commands.
- Task health and agent-file health must be verified independently.
- Every endpoint-changing release needs a lab test and a small pilot before fleet rollout.
Emergency fleet procedure
- Stop the rollout and pin the last known-good agent on the server.
- Verify both the local server file and public download report the expected version.
- Use ScreenConnect to run Stable Agent Recovery on affected endpoints.
- Confirm the task runs as SYSTEM and the log shows a successful check-in.
- Run Diagnostics Collector on endpoints that remain offline.
- Do not delete or re-enroll devices unless the identity file is actually missing or invalid.
Which recovery tool should I use?
| Task runs, device remains offline after a release | Stable Agent Recovery |
| Task is missing, disabled, malformed, or cannot start | Scheduled Task Repair |
| Cause is unclear or recovery still fails | Diagnostics Collector |
| No reliable download access from the endpoint | Offline Recovery Bundle |
Windows Update management — how the new system works (agent 1.13.0+)
From agent 1.13.0, every device carries an isolated Windows Update worker. The main agent only checks in and runs jobs — it never talks to Windows Update itself. A separate worker process scans, hides denied updates, and installs approved ones on its own scheduled tasks with hard timeouts. A slow or stuck Windows Update can therefore never take a device offline: worst case the device shows a degraded update status while staying fully online and manageable.
The one switch that matters
Policy → Manage Windows Update with PrimeNetCore. OFF = observe mode: the device reports its update inventory and nothing else — users keep their normal Windows Update controls. ON = managed mode: user update controls are blocked, Windows is set to notify-only, denied updates are hidden from Windows itself, and installs happen only through PrimeNetCore (manual approval or policy). The global default applies to every customer that hasn't been given an override in the Per-customer tab. Devices converge within about 15 minutes of a policy change — no reinstall, fully reversible.
Update categories
Policy → Update categories controls what auto-approval may touch: Auto follows the severity + delay rules; Manual approval shows the update as pending until a technician approves it; Report only is informational — policy never installs it (a deliberate manual approval still works). Defaults: Drivers and Firmware report-only, Feature and Preview/Optional manual. Security and cumulative updates always follow the severity rules.
Daily workflow for technicians
Approve on a device page or in Patching queues the install; the isolated worker installs it and posts the result. Deny hides the update from Windows on that device (verified — the row shows the enforcement state). Un-deny restores it. Denied updates stay listed with a strike-through; they are never silently deleted. Each device page has Recent update activity inside the Windows Update card — the worker's run history (scans, hides, unhides, installs, errors).
What end users see
In managed mode: Windows Update settings are read-only for the user, "Check for updates" and Pause are blocked, and denied updates simply do not appear. Windows still shows its own seeker offers (e.g. the monthly preview banner) — those cannot be installed by standard users and are a known Windows-side display quirk, not a gap in enforcement.
Quick health checks on an endpoint
Expect agent 1.13.0+, the scan task present and Last Result 0 (75 just means a scan yielded to a running install — normal), and a recent worker report with worker_status: ok.
Good to know
New devices enrolled with the usual Fleet → Add device one-liner get all of this automatically — the agent provisions its own worker files and tasks on the first check-in. Devices that were offline during a server upgrade self-update whenever they next check in. If a device shows "awaiting capable agent" on the Policy page, it simply hasn't picked up agent 1.13.0 yet.
How do I confirm recovery succeeded?
Look for a current run time, Last Result: 0, the expected stable agent version, and a recent successful check-in.
System health & recovery
Database backups
Consistent SQLite backups are created with the online backup API.
Recovery & diagnostics
Download a diagnostic ZIP before troubleshooting server-side issues.
Backup & retention settings
Settings
🔐 Two-factor authentication
Protect your login with an authenticator app (Google Authenticator, Authy, 1Password…). Strongly recommended — this dashboard has SYSTEM-level control of every managed machine.
📋 Audit log
Who did what, from where.
| When | User | Action | Target | Detail | IP |
|---|
🖥️ ScreenConnect remote access
Adds one-click Remote buttons to Fleet and device pages. PrimeNetCore automatically reads the ScreenConnect session GUID from the installed Windows client. Technicians authenticate directly with ScreenConnect when the session opens.
🛡️ Bitdefender GravityZone
Where to get these values: log in to GravityZone Control Center → click your username (top-right) → My Account → scroll to API keys → Add. When creating the key, tick Companies API, Network API, Packages API and Event Push Service API. The Access URL is shown in the same API keys section (for most accounts it's the default below).
Real-time detections (Event Push)
GravityZone will POST detections straight to this server. Click the button and we register the receiver below via the API — no manual setup in the Control Center needed. Events then appear on the Security page and in Discord alerts.
Customer ↔ Company mapping
Link each RMM customer to its GravityZone company (or push it to GravityZone with Create, like NinjaOne does). Once linked, Sync devices matches endpoints by hostname so every machine shows whether Bitdefender is installed. Devices re-sync automatically every 6 hours.
| Customer | GravityZone company | Protected |
|---|
🤖 AI provider
Powers Analyze with AI on failed jobs and the optional AI-written morning digest. Connect Anthropic, Google Gemini, or an OpenAI-compatible service such as OpenAI, OpenRouter, Ollama, LM Studio, vLLM, LocalAI, or Azure OpenAI.
✉️ Email (SMTP) — support requests
Where the system-tray support form sends its emails. Use your mail provider's SMTP relay (e.g. Microsoft 365: smtp.office365.com port 587, Google Workspace: smtp.gmail.com port 587 with an app password). Leave the password blank to keep the saved one.
Change my password
Add a technician
| User | Role | Last login |
|---|
Discord alerts
- In Discord, open the channel you want alerts in
- Click the ⚙️ (Edit Channel) → Integrations → Webhooks
- Click New Webhook, name it "PrimeNet-Core", pick the channel
- Click Copy Webhook URL and paste it below
Support requests use this dedicated webhook when saved, so user tickets do not get buried under device alerts. Leave blank to keep the saved support webhook; if none is saved, support falls back to the main alerts channel.