SentinelOpsby Korthveil
Help center

How every page and setting works.

The same help as the ? button in the console, grouped like the console’s menu.

156 topics

Overview

Operations dashboard

The at-a-glance state of the organization you have selected (or the whole fleet when no tenant is picked). It exists so an operator opens one screen and immediately sees what is enrolled, what is online, what is being attacked, what is out of compliance and what needs patching — instead of hunting through modules. For the tenant it is their live operations picture: a tenant-scoped account sees only its own organization, and every tile and panel links straight to the view that resolves it, so nothing is a dead end.

KPI tiles
Seven live counters, each clickable to the view behind it: Total Endpoints (with "↑ N this week" → Devices), Online Agents (% of total → Devices), Critical Alerts (N open total → Alerts), Patch Compliance (%, with critical·security counts → Patch Management), Active Packages (of N total → Agent Deploy), Scheduled Jobs (enabled of defined → Scheduled Jobs) and Services Up (up/enabled monitors → App Monitoring).
Security & attacks
Brute-force IPs blocked at the host firewall (total and last-24h), active attacks (IDS / brute-force detections), and open critical and warning alerts. The status pill and each metric deep-link to Threat Blocks or Alerts focused on exactly what it counts; a top-origins line summarises where the blocked attackers came from (RDAP country lookup).
Patch status
Compliance percentage plus Critical / Security / Available / Need-reboot / Non-compliant / Unknown counts, and the next scheduled patch run. Each number opens Patch Management pre-filtered to that set. Shown once scan data exists.
Vulnerabilities
Exploited-in-the-wild (CISA KEV), critical and high CVE counts across endpoints from the offline OSV/KEV scanner, with affected and scanned device counts. Each tile opens those findings. Appears once something has been scanned or the offline CVE database is synced.
Domain controllers
One card per detected DC with dcdiag / replication / DNS failure counts and an aggregate healthy/unhealthy pill; click a controller for its diagnostics. Appears only when the tenant actually has a domain controller.
System Performance
CPU, memory and disk charts for the fleet (or one machine, via the selector), drawn from live heartbeat telemetry across reporting endpoints. The chart type is selectable; "Devices →" opens per-machine performance.
Endpoint Distribution
A chart per platform family (and its SNMP/hardware detail), with selectable chart style and columns-per-row — an honest split of the managed fleet by OS.
Application & Service Health
A grid of per-system mini-dashboards (resources + services + alerts), driven live by the app/deep-DB monitors. Controls: trend chart style, how many systems to show (Auto/4/6/8/12/16/24), a "Systems…" picker, and Priority / Issues / All filters. "Monitors →" manages the checks. Thresholds and the auto-high-risk service list are set in Settings.
Log monitoring
Critical and total OS-log alert matches in the last 24h plus active alert and suppression rule counts; each metric opens Log Monitoring. Requires alert.read.
SentinelOps platform health
The platform’s own services — API, database, message queue, alerts, workers, HA and email — with live status; "Open →" goes to High Availability.
Hypervisor hosts
XCP-ng / Proxmox / vSphere / Hyper-V hosts monitored agentlessly, with live CPU / memory / disk / temperature. Appears when hosts are configured.
Backup health
Failed / Overdue / Unprotected / Not-reporting / Protected counts across managed endpoints, with an at-risk headline; "Open →" goes to Backups. Tenant-scoped.
Profile & service backups
Recent profile/service captures with running/captured/failed counts; shown when you hold file.backup and a tenant is selected.
Device Inventory
The first 10 endpoints with OS, status, CPU/RAM/storage bars, last check-in and open-alert count; click a row for the device drawer, "All devices →" for the full grid. device.token.revoke shows an inline Remove.
Alerts rail
The most-severe-then-oldest open incidents; click one to jump to the affected device, "View all" opens Alerts.
Microsoft 365 & Sign-in activity
When configured for the tenant: a Microsoft 365 panel (users, licences, Secure Score, groups, Entra devices) and a Sign-in activity panel (a 24-hour bar graph and recent sign-ins to servers tagged monitor-logons).
SNMP monitoring
A rollup for SNMP-enabled machines; if endpoints are eligible but have not reported yet it says so and why (older agent build), rather than rendering blank.
Configure
The ⚙ Configure button (top right) shows or hides the standard panels for this dashboard (operator.manage; applies to everyone viewing it) and, under "Your custom KPI panels", lets you build your own panels from live metrics and choose which appear here — personal to you, available to any operator. Custom panels sit at the top of the dashboard and update live; "Reset layout" returns every panel to its default position.
Monitoring

Turns the telemetry each endpoint already reports into threshold and service checks that raise alerts through the same deduplicated, audited pipeline as everything else. It exists so a busy fleet is watched automatically — a sustained CPU/disk spike or a stopped service pages you instead of being noticed only when something breaks. For the tenant it means their machines are proactively monitored on their own thresholds, scoped to just the devices that matter, with no extra tooling to run.

Fleet utilisation
A live table of every endpoint’s CPU, memory and disk (as meters), load average, uptime, status and last-seen — straight from each heartbeat. The summary shows how many endpoints are reporting metrics, active breaches, and the fleet average CPU / memory / disk. Click a row to open that device; device.token.revoke shows an inline Remove.
Checks
Add check (needs rule-manage) opens a rule: a threshold check (e.g. CPU above 80% held for a number of seconds) or a "service stopped" check. A rule can be scoped to a device role, group and/or tags so a Windows-only or server-only check targets just those devices; leave the scope empty for tenant-wide. Only a sustained breach — not a momentary spike — raises an alert. Each rule row shows its condition, scope and for-seconds, and can be disabled or deleted.
Active breaches
Open incidents raised by these checks are listed at the top with their summary and age, so a current problem is visible before you scroll the rule list.
Watched services
A matrix of the last state each endpoint reported for every watched service. "—" means that endpoint has not reported it yet (the agent picks up the watch list on its next heartbeat; very old agents never will) — deliberately not shown as an error. To remediate a stopped service, open the device and use the Service action (start/stop/restart), which is allowlisted on the agent and second-operator approved.
Certificate expiry
TLS endpoints you name with "Watch endpoint" are handshaked every 6 hours and listed soonest-expiry first. Because an agent fails closed on TLS, an expired certificate takes endpoints offline — this warns you first, distinguishing "expired", "days left" and "unreachable" from "not checked yet". "Check now" runs one immediately; Delete stops watching it.
Health

A per-device and whole-tenant health score, worst-first, with the concrete reasons each device lost points. It exists to turn scattered signals — patches, disk, reboots, backups, connectivity — into one ranked worklist so you fix the machines dragging the organization down first. The score is 100 minus weighted deductions, and a device is never penalised for a dimension it was never assessed on, so the tenant number stays honest and defensible for the customer.

Tenant score and bands
The summary shows the overall tenant score and how devices split into healthy (85 or above), attention (60–84) and at risk (below 60). Watch the at-risk band — those are the machines pulling the tenant number down.
What moves the score
Points are deducted for outstanding critical patches, disk pressure, a pending reboot, a failed or missing backup, and being offline. Each is weighted, so a device with a failed backup and critical patches scores well below one with a single minor issue.
Reasons per device
Every device row lists its specific deductions with their point penalties, so you know exactly what to fix — not just that a machine "looks unhealthy". A device with nothing outstanding is shown as healthy rather than given a vague pass.
Drill into a device
Click any row to open that device’s drawer and act on the reasons — apply the patch, clear the reboot, re-run the backup. Fix the highest-penalty items first to lift both the device and the tenant score fastest.
Agent Health

Connectivity and version currency across the managed fleet in one view — how many agents are online, how many are stale, and how many are running an older build than the current one. It exists because an endpoint is only as manageable as its agent: a dead or outdated agent silently stops reporting and stops accepting jobs. For the tenant it is the one screen that proves their machines are actually being managed and lets you repair the ones that are not. Version currency is judged per platform, so a Windows agent is only "behind" a newer Windows build, not a newer Linux one.

Read the KPIs
The tiles show total Agents, Online, Offline/stale (offline + degraded + connecting), Up to date and Behind. The current build for each platform is printed below the tiles — anything on an older build for its platform counts as Behind.
Fix one machine
Click any row to open its details and a one-click fix (force an update or repair). An offline machine’s fix is queued and applies when it reconnects; an online one applies now.
Fix all at once
When machines need attention a "Fix all N needing attention" button appears (needs device.manage). It requests a fix on every flagged agent and, where possible, wakes offline ones — updates then apply now if online or on reconnect if offline.
Stale vs offline
Status is heartbeat-age based. A machine that stops sending heartbeats reads as offline/stale even if it is technically powered on — check the row detail before assuming the box is down.

Devices & Access

Devices — the programmable grid

The central inventory of every managed endpoint, built as a queryable projection rather than a fixed table — you choose the columns, filter with an expression, sort, and save the result as a reusable view. It exists so one screen serves every job, from a quick status glance to a defensible CSV export, and so a single row opens into the full device drawer where every remote action lives. For the tenant it is the single source of truth for their machines, and the launch point for operating any one of them.

Role tabs
All / Servers / Workstations / Mobile filter by the device role, derived from OS and inventory and overridable per device. "Unmanaged" opens network Discovery.
Filter expression
A text query, e.g. "os:linux AND cpu_load_pct > 90" or "NOT tag:decommissioned". Durations like 30d compare age on time columns; versions compare numerically. Press Enter to apply.
Manage columns
Opens the drawer: search 29 columns across Identity, Telemetry, Network, Agent and Security, toggle them on or off, and reorder the shown ones. The same projection backs the API and the CSV export.
Saved views
Save the current columns, filter, sort and density as a private or tenant-wide view. Selecting a view applies all of it.
Sorting & density
Click a header to sort; shift-click to add a secondary sort. The density button cycles comfortable / standard / compact row heights.
Export
Writes the current projection to CSV with a header block recording the filter, count and timestamp, so the file stays defensible evidence.
A device row
Click any row to open the detail drawer: telemetry, jobs, live preview, remote access, files and annotations — and the Quick actions grid below.
Device drawer — Quick actions
The drawer’s action grid is where you operate the machine, each button permission-gated (a limited role sees fewer): Live screen, System info, Update now (force a re-report), Processes, Event log, Local accounts, DNS, Message user, Files, Command, Terminal, Run script, Deploy software, Mount media, Services, Security & activity, Audit & Access, Activity audit, Timeline, System report, Isolate host, Drives, Applications, SNMP, Maintenance lock, Operational status, Wake-on-LAN, Patch this device, Hypervisor power, Scan this segment / Find host & siblings, Wireless scan, Bluetooth (on / off / check, plus “Keep Bluetooth on”, which switches it back on every 2 minutes if it goes off — on macOS the agent needs a one-time approval in Privacy & Security → Bluetooth), Travelling (GeoIP exemption), Local admin (vaulted LAPS), SSH tunnel, Sessions, Reboot, Shut down, Remote session, Restart agent, Back up profile, Move to tenant, Decommission, Remove device, and a per-device Patch policy selector (All updates / Security only / Excluded).
Terminal, Command & Run script
Command runs a single allowlisted command and returns its output. Terminal (needs remote.control; labelled "Terminal (PowerShell / CMD)" on Windows) opens a full interactive xterm.js window with Ctrl-C, a control-key sender, detach-into-its-own-window (⧉) and End session — open several at once (they cascade), and drag-and-drop a file onto it to upload to the shell’s working directory. Run script runs an allowlisted interpreter, second-operator approved. SSH tunnel reaches the endpoint’s own SSH/TCP port through the agent with no open port.
Sessions → working behind the signed-in user
The drawer’s Sessions panel shows who is signed in and lets you work without interrupting them: Backstage tools (terminal, services, files that run without their screen), Run in the user’s profile, and a Second interactive session over the audited tunnel. On client Windows a second desktop logon disconnects the user (an OS limit); on Windows Server it runs alongside them.
Sessions → Concurrent desktop (macOS)
On a Mac (Apple silicon, macOS 14+) Enable & connect turns on Screen Sharing and gives you a vnc:// link. Connect from a Mac’s Screen Sharing app and choose "Log in to a virtual display" to get your OWN desktop while the signed-in user keeps working; any other VNC client shadows their screen instead. Needs remote.control and a Mac admin credential vaulted for the device. Turn Screen Sharing off when done.
Retiring a machine (Shut down → Decommission → Remove)
These live in the drawer and are permission-gated, so a limited role may not see them. Shut down (needs command.execute) powers the box off now or on a schedule — it keeps running SentinelOps. Decommission (needs device.status.change) marks the device decommissioned: alerts, patching and automation pause, and a removal-protected agent is allowed to deregister — it STAYS in inventory; you confirm by typing the device name. Remove device (red, needs device.token.revoke) deletes it from inventory, revokes its agent token AND deletes everything tied to it — GeoIP / log-alert / monitoring rules aimed only at it (shared rules just drop it), its vaulted LAPS and Mac admin passwords, scans, patch state, metrics, blocked-IP records, firewall grants and IP allocations. Retained on purpose: the audit trail, activity evidence, session recordings, tickets and asset records; BMC and hypervisor entries are kept but unlinked. Irreversible, and refused while a legal hold covers the tenant. SentinelOps also sweeps hourly for anything a machine removed some other way left behind. Typical order: shut down if you want it off, decommission to retire it cleanly (keeps everything), then Remove device to delete the record and its related data.
All Devices

Every device seen on the organization’s networks in one list, grouped by type: agent-managed machines, cameras, switches, firewalls, access points, unmanaged endpoints and other/unknown hosts. It exists so you see the whole estate — not just what has an agent — and can act on each kind in place. The server classifies the devices (so the web console, Android and iOS group them identically), giving the tenant one complete picture of what is on their wire and what is still unmanaged.

Type buckets
Enrolled (agent-managed) devices are combined with hosts found by discovery. Each bucket is a collapsible section with its count (agents and cameras open by default); columns Name, Address, Type and Status are click-to-sort.
Location column
Agent-managed machines show their geo location (public IP or GPS); discovered hosts show the switch port or access point they were last seen on, when known.
Per-device actions
Each row’s actions depend on its type: an agent-managed row has Manage ▸ (opens the device drawer); a camera has Live (view), Web and Forget; a discovered host has Deploy agent (when it is a candidate — jumps to Discovery pre-filled), Web, and Forget. "Forget" removes a discovered host from the list.
Finding more
Group-level buttons help you fill the picture: "Scan for cameras" on the Cameras group, and "Discover more" (opens Discovery) on unmanaged / switches / access points. Empty switch/firewall/AP groups hint to run a Wireless scan or add an SNMP switch.
Device Map

Plots every geolocated device on a world map, from its public IP address (or a mobile device’s GPS). It exists to answer "where are these machines?" at a glance — useful for spotting an endpoint in an unexpected country or confirming a site’s footprint. For the tenant it is a quick geographic view of their estate; the map ships inside the console, so no external map tiles are fetched and no device coordinates leave the server.

Summary
Three counters head the view: Located (devices with coordinates), Sites (distinct locations after nearby devices are clustered), and No geo (devices with neither a public-IP lookup nor a GPS fix — these are not plotted).
Pins
Each pin is one location with the devices seen there (a numbered dot when several cluster). Click a pin to see the machines at that place; the site table below lists Site, Devices, ISP and Coordinates — click a table row to zoom the map to it.
Navigation
Drag to pan, use the mouse wheel or the +/− buttons to zoom, and Fit to re-centre. Refresh re-reads device locations.
Accuracy
IP geolocation is city-level at best and shows where the internet connection egresses, not the building. The ISP/org is shown where known. Approximate locations are flagged.
Groups

Device groups inside an organization — the Tenant → Group → System tree — and who can access them. Groups exist so policy, deployments, access and overrides apply to a set of machines at once instead of one by one, and so engineers’ reach can be ring-fenced to just the groups they manage. For the tenant, a group is the "group" scope used by Self-Healing overrides and maintenance windows, deployments, locks and access grants. Every group belongs to exactly one organization (never global); a sub-group must sit under a parent in the same organization, and a machine can only join a group in its own organization. (User groups — which grant roles to people — are under Administration → Users & Identity → User Groups.)

The tree
Each organization expands to its groups and sub-groups, every node showing its total system count; a running/stopped dot marks each system online/offline. An "Ungrouped" node holds machines in no group. The view scopes to the organization picked in the top bar.
Create / rename / delete
"+ New group" (or a tenant’s own "+ Group") creates a top-level group; "+ Subgroup" nests one under a parent; Rename and Delete manage existing ones. Deleting a group moves its systems to Ungrouped, moves any sub-groups up one level, and removes its rights and its Self-Healing overrides and maintenance window. (All need operator.manage.)
Assign systems
Assign systems chooses which of the organization’s machines belong to the group; a machine is in at most one group.
Locks
The 🔒 Locks button sets a live policy on the group that applies to every current AND future member: Lock commands (no commands, scripts or service actions run on members) and Disable installs (no software installs or patch applies). Reads, screen and inventory are never affected.
Rights
Rights grants or revokes operator access scoped to this group — the ref-counted access control that lets an engineer manage only their groups.
Device DNS

Every machine that has an agent, grouped by server — each group holds all of that device’s DNS: the records the DNS system returns for it, its domain’s records, and the resolver configuration its agent reported. It exists so DNS problems (a stale record, a wrong resolver, a missing PTR) can be diagnosed per machine without leaving the console. For the tenant it is a consolidated, on-demand DNS picture of their whole agent fleet. Mobile and decommissioned devices are excluded.

One group per server
The view lists each agent machine; click one to expand and lazily resolve its DNS (only on first open, so the page stays fast). Its records are resolved live by the server — no agent round-trip for the lookups — and an expanded group’s ↻ button re-resolves just that one. Expanded groups survive the daily refresh and tenant switches.
This host’s records
Forward A/AAAA for the hostname and FQDN, reverse PTR for every known IP, and CNAME — what DNS actually returns for the machine.
Domain records
NS, MX, TXT and SOA for the device’s domain (derived from its FQDN), so you can see the zone it belongs to.
Resolver configuration
The nameservers the machine queries, its search/suffix domains, and its hosts-file overrides — reported by the agent and refreshed when it checks in. Requires a recent agent (0.5.16+).
Also in the device drawer
The same DNS view is available per device from its Quick actions → DNS button.
Mobile Devices

The enrolled phones and tablets running the SentinelOps app — their status, OS and last check-in, with a live screen view. It exists so mobile endpoints are managed and viewable alongside servers and workstations rather than in a separate silo. For the tenant it brings their phones and tablets into the same fleet; a live screen session is always locally consented, indicated and audited, honouring each platform’s limits.

Summary & devices
Two counters (mobile devices, online) head the list; every enrolled mobile endpoint shows its status, platform/OS version and last-seen. Enrol a device from Mobile Apps → Create enrolment code and it appears here.
Details
Opens the device’s full drawer alongside your servers and workstations, so the same inventory, jobs and (where supported) actions apply.
View screen
Opens a live, locally-consented and audited screen session for Android endpoints (needs the device online and remote.control). iOS/iPadOS devices are shown but "View screen" is disabled — the OS forbids screen capture by a management app, and the button says why.
Connections

The live agent connections calling home — which device identity maps to which management session, over what transport, from what source, and when it was last heard from. It exists as the low-level connectivity view behind the fleet: a device that stops appearing here has gone offline. For the tenant it is the plumbing-level proof that their endpoints are connected and reachable.

Agent sessions
One row per connected agent, showing the endpoint, session status, transport (the agent’s long-poll/outbound channel), agent version, source IP, last heartbeat and when it connected. The source address is recorded for troubleshooting only — devices are addressed by device ID, not by IP.
Open a device
Click any row to jump to that device in the Devices view and open its drawer. When nothing is listed, no enrolled endpoint has called home yet.
Remote access

Authorized interactive sessions — live screen view and control, keyboard/mouse and two-way audio, plus terminals — created by a named operator, with a visible local indicator on the endpoint, an immediate local disconnect, and a full audit trail. It exists to let operators actually fix a machine, not just watch it, while keeping consent and accountability non-negotiable: there is no hidden-session mode. For the tenant it means hands-on support with their consent preserved and every action recorded.

Open terminal
The "Open terminal" button (top right) starts an interactive shell session on a chosen endpoint — a full xterm.js window with Ctrl-C, a control-key sender, detach-to-its-own-window and End session; several can run at once.
Summary & session tables
Three counters (Active or pending, Unattended-enabled, Recent sessions) head the view. An "Active & pending" table lists sessions in progress or awaiting consent, and a "Recent sessions" table shows the last 25; both show Endpoint, Status, Mode, Operator, Reason, Consent and Requested time.
Consent & unattended
A session requires explicit local consent unless the device is enrolled for unattended access (the right setting for a headless server). The endpoint always retains a local disconnect and shows the indicator throughout. If a session is denied because unattended access is off, an "Enable unattended access" button is offered inline (confirmation required).
Live view & control
An active session has a Live view / "Full screen & control" button (and an inline live-screen preview). Inside, Take control drives mouse and keyboard, Hold to talk sends your voice to the endpoint, and Listen plays the endpoint microphone — all under the same consent, indicator and audit. End closes a session (active or pending) at any time. Keyboard and mouse control exist only inside the active session; no keystroke history is retained.
Sizing the live screen
Expand fills the browser window, ⛶ goes full screen, and the bottom-right corner drags to any size. Zoom (− + Fit, or Ctrl/Shift+wheel) magnifies the picture you already have; the resolution selector changes what the endpoint actually captures — raise it for fine text, lower it on a slow link. A monitor selector picks which display to view, and "☀ Wake screen" wakes a black/locked display.
Logins

Who is signed in across your fleet right now. The agent reports each machine’s interactive sessions — the user, whether the session is active or disconnected, whether it is a local console or an RDP sign-in, and the source it came from — along with live CPU and memory. It exists to give accountable presence at a glance and to flag a new sign-in on a sensitive server; it reads who is logged on (never keystrokes). For the tenant it is a privacy-respecting record of who is using which machine.

Summary & signed-in users
Three counters (Users signed in, Machines in use, Login-alerting) head the view. Each row is a machine that currently has at least one interactive session — a machine with no one logged in does not appear. The user list shows active vs disconnected and console vs RDP, with the remote source for RDP, plus the machine’s live CPU and memory meters.
Login alert
The per-row "Login alert" toggle (needs enrollment.manage) pages you whenever a NEW interactive or RDP sign-in appears on that machine — it sets the machine’s monitor-logons tag. Use it on sensitive servers so a fresh sign-in is never missed, without flooding a busy fleet.
Coming with the next agent build
Session duration (how long each user has been on) and the current foreground app are reported by a newer agent; until a machine is on that build those columns are blank while the user/source/CPU/memory show today.
Storage / Printers / Logs

Endpoint operational intelligence rolled up across the tenant: disk and RAID/ZFS health, installed printers, and recent errors and warnings from the system logs. It exists to surface the everyday operational problems that do not raise a formal alert but still cause outages — a filling disk, a degrading array, a machine suddenly logging errors. Reported hourly with inventory (so it reflects the last check-in, not this instant), it gives the tenant an early-warning operational sweep of their whole fleet.

Summary KPIs
Four counters head the view: Reporting (machines that have sent this data), Storage issues (machines currently flagged), Printers (fleet total) and Log errors (1h) — a fast read on where trouble is building.
Storage health
The Storage column flags near-full filesystems and unhealthy RAID/ZFS/disk arrays; a healthy endpoint shows "ok", a problem shows a red pill with the detail on hover — a way to spot the server whose array is degraded before it fails outright.
Printers
Each row shows how many printers the endpoint has installed. Useful when a print-server change is suspected, or to confirm which machines still have a decommissioned printer mapped.
Log errors and warnings
Recent error and warning counts from the endpoint’s system logs. A spike in errors on one machine is an early sign of trouble worth opening its device drawer over.
Not reported
A machine that has not sent this data yet shows "Not reported" — it will populate on the next hourly inventory once its agent is current. Everything here is read-only reporting; act through the device drawer or the relevant module.

Alerts & Threats

Alerts

Durable incidents raised by monitors, offline detection, sign-in monitoring and other rules — deduplicated, tenant-scoped, and routed through the notification pipeline — plus the rules and destinations that drive them. It exists so problems are captured once and chased to closure instead of scrolling past in a log, and so the right people are notified on the right channel. For the tenant it is their incident queue and their own alert rules and delivery targets.

Summary
Three counters head the view: Open incidents, Managed rules, and Delivery failures (incidents whose notification did not get through). A "🔔 Notification settings" button (top) opens your personal notification preferences.
Alert rules
Tenant-scoped rules, each a trigger event (e.g. device.offline, job.failed, file_transfer.failed, agent_token.revoke, agent_certificate.revoke, agent.version_change) with a cooldown that stops immediate reopening. "Add rule" creates one, Delete removes it (existing incidents are kept), and "Send test alert" raises a test sign-in incident so you can confirm the badge, dashboard and your channel.
Incidents
Each open incident stays deduplicated until acknowledged (resolving closes it); both are audited. Per row you can Acknowledge (stops re-notification), Retry delivery (re-runs the bounded webhook attempt) on a failed one, Isolate host (contain the machine the alert is about), and Hide/Unhide a noisy one. "Hide resolved" is on by default and remembered per browser; hidden incidents are never lost.
Notification destinations
Where alerts are pushed: phone push (ntfy), Slack/Teams, Discord, or a custom endpoint — each formatted for its channel with a minimum-severity floor. "Add destination" creates one; Test sends a sample, Delete stops delivery there. This is on top of the server’s configured signed webhook and any operators who turned on their own email alerts.
Critical Issues Digest

A once-a-day email summarising every machine with critical issues — pulled from the logs and from Alerts & Threats — with a suggested fix for each, so you start the day with a prioritised worklist instead of hunting through the console. It exists so nothing critical is missed across a busy fleet and so each item arrives already actionable. For the tenant it is a daily, de-duplicated health briefing for their estate. It is off by default and needs SMTP configured (Settings → SMTP) to email; it can always be previewed. Configuring it needs alert.manage.

Preview & Send now
"Preview" shows the exact digest that would be sent right now; "Send now" (when SMTP is configured and you hold alert.manage) generates and emails it immediately to the configured recipients.
Daily digest toggle & schedule
Tick "Email a daily critical-issues digest" to enable it, and set "Send at" (an hour in UTC). The status pill shows ON/OFF.
What it scans
Choose the log level (Critical only, or Error + Critical) and tick which sources to include: critical log events, critical Alerts & Threats incidents, and suggested resolution steps (remediation guidance from a built-in knowledge base). "Live-scan online machines" scans endpoints live for critical logs (more thorough, slower).
Recipients
Comma-separated addresses; leave blank to fall back to your alert recipients. The page shows the recipients that would resolve right now, and warns if there are none.
Always send
Tick "Send even when there is nothing critical" for a daily all-clear; otherwise the digest is only sent when there is something to report. Routine, benign noise (e.g. the agent’s own service restart) is filtered out so the digest stays meaningful.
Right now & Save
A "Right now" panel shows how many machines and critical items a digest would contain this moment, and the last run’s result. "Save settings" persists the configuration.
Logs

One place to work with endpoint logs: browse the actual logs from any selected Windows, Linux or macOS machine live, set up alerts and suppressions on log entries, and schedule or export log reports. It exists so you can investigate and watch OS logs without opening a shell on each box, and turn a one-off investigation into standing monitoring. For the tenant it is centralised, read-only access to their machines’ logs with an explain-and-act workflow.

Browse logs
Pick a machine, then a log source — any Windows Event Log channel, Linux journald / a service unit / kernel (dmesg) / a /var/log file, or the macOS unified log (the ↻ button re-scans sources live). Filter by Level (All / Warning+ / Error+ / Critical), a keyword Search, a Since window (hours, default 24), a Max row cap (200/500/1000) and, on Windows, a specific Event ID. Query loads results live from the agent, highlighting matched text.
Explain & act on an entry
Each row has an "Explain" button that opens a plain-language explanation of that log line (what it means, likely cause, what to do) from a built-in knowledge base, with a web-search link. Public IPs in a line show their block status, and a not-yet-blocked attacker IP can be blocked at that host’s firewall in one click.
Export the view
Export the entries you are currently viewing to CSV or plain text with one click — for tickets, evidence, or offline analysis.
Create an alert / save a report from a filter
Once a filter shows what you care about, "Create alert from filter" (needs alert.manage) opens a pre-filled rule so the platform watches for it going forward, and "Save as report" (needs reports.view) turns the same query into a scheduled report.
Alerts & rules tab
Manage alert rules (raise an incident on matching entries) and suppression rules (mute known noise). Recent matches are listed at the top; "Test" evaluates a rule against a live device immediately.
Reports tab
Save a log query as a daily or weekly report that emails a per-device summary, or use "Run now" to generate it on demand. Reports reuse the same read-only query as browsing.
App Updates

Scheduled, editable application updates on managed Linux/BSD servers — Nextcloud, WordPress, OS packages, Docker images or a custom script — that either auto-apply on a schedule or detect-and-hold for confirmation, with an email report of what changed after every run. It exists so the app-level patching that OS patching misses still happens on a cadence, safely and auditably. For the tenant it keeps their server applications current without someone remembering to log in and run the updater.

Add a scheduled update
Pick a Machine (Linux/BSD devices), an Application (Nextcloud core + apps, Linux OS packages, WordPress core+plugins+themes, Docker images, or a custom script), a Name, a Schedule (Every 6 hours / Daily / Every 3 days / Weekly (default) / Every 2 weeks / Monthly), a Mode (Detect + wait for confirmation — the safe default, or Auto-apply on schedule) and whether it is Enabled, then "Create scheduled update". Nextcloud auto-detects the install and updates core + all apps; the script is editable afterwards.
Scheduled updates table
Each job shows Task (and app), Machine, Schedule (with its mode), On/off, Last run (status + time) and Next run. "Run now" executes immediately (confirmed), "Edit" opens the job, "Report" shows the last run’s output, and ✕ deletes it.
Edit & the update script
Editing a job lets you change its name, schedule, mode and enabled state, and edit the actual update script — which runs on the machine as the agent, so edit carefully.
Auto-apply vs confirm
Auto-apply runs the update on schedule; confirm mode only detects and reports what would change, waiting for you to approve.
Reports
After every run an email summary of what was updated (or what failed) is sent to the configured recipients; the last report is also viewable from the table.
GeoIP Access

Restrict which countries can reach your internet-facing machines — allow-only (e.g. USA) or block specific countries — per machine, per group or globally. SentinelOps has it because a huge share of attack traffic comes from regions a given client never does business with, and dropping it at the host removes that noise and attack surface outright. For the tenant it is a country-level firewall applied as nftables on internet-facing Linux hosts, with hard safety rails: your LAN, the SentinelOps server, established sessions and your allowlisted admin IPs are always allowed, and a failed country-data download aborts rather than loading a partial list — so a policy cannot lock you out.

Read before enabling
The amber banner at the top is the safety brief: allow-only mode drops every country except those you list; before enabling, make sure your own admin IP is on the Blocked-IPs never-block allowlist, and start with the “SSH/RDP/WinRM” port scope (not “all”) on any server that also serves public web or mail.
Create a policy — field by field
Name it. Mode: “Allow only these countries” or “Block these countries”. Countries: ISO codes, comma-separated (e.g. US, CA). Applies to: All external machines (global), A group, or A single machine (the machine dropdown lists Linux hosts only). Enforce on: SSH/RDP/WinRM (admin — the safe default), + web (80/443), or All inbound ports. “Enforce now on save” applies it immediately (you are asked to confirm). Create policy saves it.
Policies table
Each row shows the policy name with its mode and country list, its scope, the enforced ports, state (enforced / off), and the last-apply status (a red detail line surfaces the machine’s own error). Apply now re-applies to its machines on demand, Edit changes mode / countries / ports / enforced, and ✕ deletes the policy and removes its firewall rules from the hosts.
How “applied” is counted
“applied to N host(s)” means the firewall is live on N machines. “0 host(s)” with no error means nothing in scope qualified — offline, internal-only, not Linux, or a hypervisor host (which is never firewalled). A red GEO_ERROR shows the machine’s own error, and a failed refresh never removes rules already in force.
Apply cadence and Windows
Policies re-apply every 12 hours to pick up fresh country ranges and survive reboots; Apply now forces it. GeoIP is NOT enforced on Windows yet — it uses the Linux firewall — so protect Windows hosts with the per-IP auto-block (Blocked IPs) and your edge firewall.
Log Forwarding (syslog)

Forward endpoint system logs to a syslog server, with each organization pointing at its own target and forwarding toggled on/off per machine or in bulk. SentinelOps has it because centralised logs are the backbone of both troubleshooting and compliance, and most clients either run a SIEM or need one stood up. For the tenant it either feeds an existing SIEM or turns one of their own Linux boxes into a working collector — no external service required — with the collected logs searchable from the console (Log Search). The target is scoped to the tenant selected in the top bar, or the global default when none is selected.

Syslog target
Where this organization’s endpoints send their logs. Set the Syslog host, Port (default 514) and Transport (UDP is simplest; TCP is reliable and uses a disk-backed retry queue on Linux; macOS forwards over UDP only). Tick “Auto-forward every newly enrolled machine in this scope” to enroll new machines automatically. Save target writes it; Remove target clears it (machines already forwarding keep doing so until you turn them off).
Collector — receive logs on your own box
Turn a managed Linux endpoint into a working syslog server: it collects the fleet’s forwarded logs into /var/log/remote/<host>/ (rsyslog auto-installed if missing, listens UDP + TCP, firewall opened, rotated weekly). Pick the Linux endpoint and a listen port (default 514), optionally tick “Also point this organization’s forwarding target at it” so the target is set to its LAN IP, then “Make this the collector”. A live collector shows a Stop collector control. For endpoints that reach it across the internet, set the target to the collector’s public host/IP and ensure the port is reachable.
Turn forwarding on / off
Applies each OS’s native forwarder — Linux rsyslog, Windows a SYSTEM scheduled-task forwarder, macOS syslogd — pointed at the saved target. Choose a Scope: All my devices, A tenant/organization, A device group, or Specific device IDs; then Turn ON or Turn OFF. The result line reports how many devices were queued.
Per-machine status
A table of every device with its forwarding state and a per-row Turn on / Turn off button, plus a header count of how many of the fleet are forwarding. Hardware without an agent (a firewall, switch or PDU) is pointed at the syslog server through its own settings — this view covers agent-managed endpoints.
Log Search

Search the syslog collector’s aggregated logs — every forwarded host in one place — from inside the console, behind your login, RBAC and audit. SentinelOps has it so operators can investigate across the whole fleet’s logs without SSHing into a collector or exposing it publicly. For the tenant it is a private, searchable window over the logs their endpoints forward, reachable only through the authenticated console. The collector may live in a different tenant than the fleet it collects, so it is found across all visible devices.

Prerequisite — a collector
Log Forwarding must be set up with a collector first. If none is configured the view says so and points you to Log Forwarding → Collector: make a Linux endpoint the collector, then turn machines ON so their forwarded logs land under /var/log/remote/<host>/ and become searchable here.
Query
Enter search text (case-insensitive substring; blank returns the most recent lines across every host), optionally pick one Host from the dropdown (populated live from the collector’s /var/log/remote directory), and choose Max lines (200 / 500 default / 1000 / 2000). The search runs on the collector through its agent — nothing is exposed publicly. Enter or the Search button runs it.
Results
Matching lines are shown in a table with their source Host, Program, and Message, newest at the bottom, capped at the Max-lines you chose. Narrow the query or pick a host to reach detail beyond the cap.
Rogue Devices

Unmanaged devices that discovery has seen on the client’s networks, flagged with the signals that make them look suspicious, so you can review and account for each one. It exists to answer "what is on this network that we do not manage?" — the first step in catching an unauthorised host or simply bringing a forgotten device under management. For the tenant it is a running list of unaccounted-for hosts on their wire. Select a tenant to review its networks.

What counts as rogue
These are hosts seen on the wire that SentinelOps does not manage. Each row shows IP, hostname, MAC, vendor/classification and "signals" chips explaining why it was flagged.
Acknowledge the known ones
With device.manage, Acknowledge marks a device as reviewed so it drops out of the active list — use it for the printers, personal phones and appliances you expect to be there.
Keep it current
The counts split unmanaged/rogue from acknowledged. When the active list is empty, every device seen on the networks is either managed or acknowledged — re-run Discovery to refresh what is on the wire.
Enrollment Approvals

When a tenant (or the site-wide default in Settings → Features) requires approval, a newly enrolled device is held here — its alerts, patching and automation paused — until an operator approves it. It exists to put a human gate on self-service enrollment, so an unexpected or unauthorised machine cannot quietly join and start being managed. For the tenant it is the review queue that keeps their fleet to machines someone deliberately admitted.

Pending enrollments
Each device that enrolled while approval was required, with its hostname, OS, reported IP(s), tenant and enrollment time. The count also drives the navigation badge.
Approve
Clears the hold: the device becomes a normal managed endpoint and its first patch scan runs immediately. Requires device.status.change.
Reject
Refuses the machine: it is decommissioned (excluded from the fleet and the offline sweep) and its agent-firewall grant is revoked. Requires device.status.change.
Turning it on
Enable "Require operator approval for new enrollments" in Settings → Features for the whole platform, or set it per tenant on the tenant record.
Agent Watchdog

A designated on-LAN agent watches its neighbouring managed machines. When a neighbour stops heartbeating but is still reachable on its subnet, an online peer agent restarts that machine’s agent over WinRM (Windows) or SSH (Linux) with a vaulted credential — and alerts if it can’t. It exists to close the gap where a machine is up but its agent is dead and nothing notices. For the tenant it is self-healing management: a crashed agent on their site is recovered automatically from a neighbour, keeping the machine manageable. It is configured per tenant, so select a tenant first.

Enable & threshold
Tick "Enable watchdog" for this tenant (needs tenant.manage) and set the Offline threshold — how long a machine may be silent before it acts (seconds, 120–86400, default 900). It only acts on machines that were managed and are still reachable via an online same-subnet peer.
Auto-restart vs alert-only
With "Auto-restart" on it runs the restart over WinRM/SSH through the peer using the credential you select; off means it only raises an alert so an operator decides. Restarting recovers a stopped/crashed agent — a fully uninstalled agent needs a redeploy.
Credentials
Pick the Windows (WinRM) and/or Linux (SSH) credential the peer uses to log in and restart the neighbour’s agent, then Save. Without a matching credential the watchdog can only alert for that platform.
Run now & recent actions
"Run now" (needs command.execute) triggers an immediate sweep. The actions table shows each result — restart attempted, alert only, no reachable peer, no credential, or unsupported OS — with the device, the peer used, a detail note and when it happened.

Security

Security Dashboard

One rollup of everything SentinelOps blocks, monitors and reports across every machine — endpoints and hypervisors alike. SentinelOps has it so an operator opens a single screen and immediately knows where a tenant stands on each security area and where to go next. For the tenant it is the security home page: six live cards that link straight into the detail view that owns each area, plus quick jumps to configure the rules behind them. Scoped to the tenant selected in the top bar, or the whole fleet when none is selected.

The six cards
Blocked IPs (SSH & brute-force) — active blocks, how many would-block candidates, and whether blocking is enforcing or monitor-only. Open vulnerabilities — total CVEs with critical / high / exploited detail. Security posture — the count of attention items. Endpoint security — endpoints at risk on encryption / firewall / AV. Identity security — risky accounts. Hypervisor security — hosts passing of those scanned. A card turns red when its area is non-zero, and clicking any card opens its full view.
Honest when a source is down
Each card is loaded independently; if one source fails it degrades gracefully (shows “—” / “not run”) while the rest still render — the dashboard never blanks because one area is unavailable.
Define what’s monitored & blocked
A row of buttons jumps you to the screens that configure each area: IP blocking & SSH, Hypervisor security, Vulnerability management, Config baselines, File integrity, TLS scanner, DNS monitoring, and Monitor rules & alerts. Use it as the launcher for setting the rules behind the cards.
Blocked IPs / SSH

Brute-force and SSH attack sources dropped at the attacked host’s own firewall, the controls that govern that blocking, and the agent-port firewall allowlist. SentinelOps has it because internet-facing machines are hammered constantly, and the fastest place to stop an attacker is on the endpoint being attacked. For the tenant it means brute-force sources are shed automatically — while your LAN, neighbours, discovered and trusted IPs and the SentinelOps server are always spared — with a console allowlist that can never lock you out. Changing policy needs tenant.manage; blocking/allowing needs command.execute.

Console allowlist — auto-follow a DNS / DDNS name
The console (ports 443/8480) is firewalled to an allowlist. Add a dynamic-DNS name (e.g. your home/office home.example.com) and SentinelOps re-resolves it every 60 seconds and keeps its live IP allowed, so an ISP IP rotation never locks you out. Connecting over the WireGuard VPN bypasses this entirely. Only a global operator can manage this list.
Automatic brute-force blocking
Toggle “Auto-block brute-force sources (incl. SSH)” to enable enforcement. “Monitor only (report, don’t block)” records what WOULD be blocked without pushing any firewall rule — use it to validate before enforcing. Threshold (failed logons) is the trip point, default 10. When a public IP passes it, the attacked machine’s firewall drops it; a private / same-subnet / ARP-neighbour / discovered / trusted IP or the SentinelOps server is never blocked. Save applies the settings live.
Expiry fields
Auto-block expiry (days, 0 = never) lifts an AUTOMATIC block after that many days and removes the host firewall rule too. Candidate expiry (days) drops monitor-only “would block” records after that many days (blank/0 = default 30). Manual blocks never expire.
Allowlist and disabled networks
The never-block allowlist (one IP or CIDR per line) is always spared — put your trusted/admin networks here. “Networks where auto-block is disabled” is only for sparing a specific PUBLIC subnet; internal/private LANs are already exempt automatically because only internet-facing machines are ever auto-blocked.
Manually block / unblock
With command.execute, “Manually block an IP on a device” takes an IP plus a target machine (online, non-mobile) and blocks it on the spot. Every active block in the table has an Unblock button. In monitor-only mode a “would block” candidate also offers “Block now” to promote it to a real block.
Would block / Active blocks tables
The Would-block (monitor-only) table lists candidates that crossed the threshold but had no rule pushed. The Active blocks table lists each enforced block with its source (auto vs manual), the device enforcing it, the reason, the attacker’s origin (flag + city, geolocated in the background), and when it was blocked. Click any IP to trace it — ownership (RDAP), origin, the full cross-fleet attack trail, and to report it to its abuse desk.
Allowed through the agent firewall
The agent port (8480) is locked to an allowlist; this panel lists the IPs SentinelOps let through — a new machine that port-knocked with a valid deployment token, or a cloud VM we provisioned. A “seed” grant is a hand-configured IP and is never auto-pruned; other grants are reaped when their device is decommissioned or the cloud IP is abandoned. With command.execute you can manually Allow an IP (IPv4 or IPv6), Revoke a grant, or tick “never” to pin an IP open permanently (no reaper, device-removal or auto-block ever strips a pinned IP).
Abuse Reporting

Automatically reports the attacker IPs SentinelOps blocks — both agent brute-force auto-blocks and server-side IDS auto-blocks — to the owning network’s abuse contact, looked up live over RDAP. SentinelOps has it because bouncing an attacker off your firewall only moves them along; reporting the evidence to their upstream provider is the one legitimate lever that gets the source actually shut down. For the tenant it means repeat offenders are actioned at origin, with a complete, defensible paper trail of what was reported and whether it was delivered. Off by default; a reporter identity is required before it can be enabled, and SMTP must be configured on the server to send. Changing settings needs tenant.manage.

Settings — identity and mode
Enable automated abuse reporting turns the feature on. Auto-send (no manual review) reports every attack automatically and emails you a digest of what went out; leave it off to hold each draft for review. Reporter organization and From / Reply-To email are your sending identity (required). Escalation address is used when the IP publishes no abuse contact. “Also Cc the registrar / upstream abuse contact” widens delivery. “Write reports in the recipient country’s language” leads the report in the attacker country’s language (for a set of translated languages) with English below; uncheck for English only. Save settings to apply.
Pending review and report cards
When Auto-send is off, a draft card appears whenever an attacker is auto-blocked. Each card shows the attacker IP, org/country, an escalation badge (first notice vs ESCALATION #n for repeat offenders), the To: abuse contact, attempt count, service and target device, and the full drafted subject/body. “Review & Send” emails it (disabled until a recipient is resolved and SMTP is configured), “Edit” lets you change recipients/subject/body before sending, and “Dismiss” drops it.
Reported IPs — delivery status
A scannable table of every IP actually attempted, with honest delivery state: “Delivered” means the abuse desk’s mail server accepted the message (the furthest point observable), “failed” means the send errored and did NOT reach the destination, and “held — no contact” means there was no abuse address to send to. Tiles count each state.
Toolbar actions
Email me a summary sends your account a summary of every report sent with each attacker IP. Report all recorded attacks drafts (and, if Auto-send is on, sends) a report for every currently-blocked attacker IP. Re-report webmail contacts re-files reports to a provider (Google, Microsoft…) where a network published a personal webmail as its abuse contact. Resend sent reports re-sends earlier reports to their real abuse desks (some older ones bounced on mail format, since fixed; personal-webmail contacts are skipped). All four are confirmed before running and require SMTP.
Responses — the abuse auto-responder
Reports go out from the abuse mailbox (e.g. abuse@yourdomain) as From and Reply-To, so abuse desks answer there. SentinelOps checks that mailbox over IMAP every few minutes, matches each reply to its report (by our message ID, the AR- reference, their ticket number or the IP), sorts it — acknowledged, asked for information, resolved, declined, bounced — and records their ticket number on the report. It then answers automatically: the full evidence when they ask for more (for refused mail it explains there are no message headers because the connection was refused before any message was sent), a one-time confirmation when they open a ticket, thanks when they act. With the AI assistant on, each answer is written for what they actually asked, in their language, from the report’s evidence only; anything hostile, legal or not about our report waits for a person. Every automatic reply says it is automatic, replies are capped per report, and no-reply/mailer-daemon addresses are never answered. Mail older than the retention period (30 days by default) is deleted from the mailbox. Click a row to read it, reply by hand or mark it handled. Mailbox settings also choose how much email you get: one summary a day, none, or one per batch.
Who is never reported
The operator’s own home/office addresses and internal-LAN sources are exempt everywhere — only genuine external attackers are ever reported. The per-IP trace (click any blocked IP) shows a “Protected address” banner for an exempt IP.
Vulnerabilities

Fleet CVE exposure from TWO sources: CVEs the OS updater attaches to patches you have not applied, and an offline scan that matches each machine’s installed packages against a locally-synced OSV + CISA-KEV database (so it finds CVEs even when no patch is on offer). SentinelOps has it because knowing you are behind on patches is not the same as knowing which of those gaps attackers are actually exploiting. For the tenant it is a prioritised remediation queue — exploited-in-the-wild issues first — with a one-click fix on each finding. Works across the fleet, or scoped to the selected tenant.

The exposure KPIs — click to drill in
Four tiles: Unique CVEs, Exploited in wild (CISA Known Exploited), Critical, and Affected devices; the exploited and critical tiles warn when non-zero. Clicking a tile filters a highlighted panel to the matching findings from the offline scanner (exploited / critical / high / all), or, for Affected devices, the endpoints with findings — each row opens the device. A “clear ✕” link removes the filter.
From missing patches
The first table is CVEs the OS updater ties to updates you have not applied, with severity, an “exploited” pill, the affected-device count (the blast radius) and the products affected. Each CVE links to its NVD detail page. Empty here means no CVE-tagged missing patches — run a patch scan to refresh.
Offline CVE-database scan
The second panel matches installed packages against the synced OSV + CISA-KEV database and rolls findings up by CVE across machines (exploited and highest-severity first). Linux distro packages are matched today; Windows third-party apps need the NVD/CPE follow-up. The panel header shows the database size, how many are known-exploited, and when it was last synced.
Scan now / Sync CVE database
Header and panel buttons: “Scan now” (needs device.read) re-scans installed packages against the database and reloads the view; “Sync CVE database” (needs operator.manage) re-downloads the offline OSV + KEV database (a few minutes) — run Scan after it finishes. If the panel says the database is not synced yet, Sync first, then Scan.
Fix a finding
Every finding has a “Fix ▸” button that opens remediation: the severity, package → fixed version, a summary, step-by-step “How to fix”, reference links, and where available a generated fix script you can Copy. With command.execute you can “Run fix on <device>” (it then nudges a fresh inventory and auto re-scans so the finding clears on its own), “Repair install (clean reinstall)” when a broken updater can’t advance the app, and on Windows “View install log” to read the endpoint’s SentinelOps install/update log without visiting the machine.
Hypervisor Security

Agentless security checks for the hypervisors that cannot run the SentinelOps agent — XCP-ng, Proxmox and ESXi. SentinelOps has it because the hypervisor is the highest-value host in a client estate yet is exactly the box you can’t install an agent on, so its exposure is easy to overlook. For the tenant it closes that blind spot: each registered hypervisor is probed over the network for exposed management ports, weak TLS on its management UI/API, and a reported version matched against known-vulnerable ranges. Scoped to the selected tenant, or the whole fleet when none is selected.

Findings table
One row per registered hypervisor: host name / address and kind, an at-risk vs ok status pill, the open management ports seen, the TLS state on the management UI, the specific findings (severity-coloured pills), and when it was last scanned. “never” means it has not been scanned yet.
Run scan now
With device.read, “Run scan now” probes all in-scope hosts immediately; results fill in as hosts respond (the view reloads itself shortly after). Otherwise hosts are re-scanned on a schedule.
Adding hosts
Hosts are not added here — they come from Infrastructure → Hypervisors (or as a device / BMC). Register an XCP-ng / Proxmox / ESXi host there and it appears in this scan. With no hosts, the view explains where to add them.
What it is and isn’t
This is an external, agentless posture check — exposed ports, weak TLS, vulnerable versions — not an in-guest agent. It complements the agent-based Endpoint Security view, which covers machines that can run the agent.
Security Posture

A live, aggregated security overview for the selected tenant, assembled from the underlying security modules. SentinelOps has it so an operator can triage a tenant’s whole security picture from one screen instead of visiting eight views. For the tenant every number is computed from real state — nothing assessed yet is shown as such rather than assumed safe — and each card is a one-click launcher into the view that owns the fix. Pick a tenant first.

Attention items
The pill at the top counts what actually needs you now: open critical + high risks, expired security exceptions, critical patches, and live privilege elevations. Green (“0 attention items”) means nothing is outstanding.
The posture cards
Each card is a live rollup: Open risks (by severity), Security exceptions (active / expired), Critical patches (with security + reboot-pending detail), Live elevations (active JIT / break-glass grants), Poor-health devices (of total, with offline count), Firmware updates available, Hardware changes (board/serial/RAM swaps), and Endpoint security gaps (unencrypted / no-firewall / no-AV, or “no agent reports yet”). A card turns its number red when that area is non-zero.
Cards are clickable
Most cards jump straight to the view that owns the detail — Open risks and Exceptions → Risk & Exceptions (governance), Critical patches → Patching, Live elevations → JIT Access, Poor-health → Health, Firmware → Firmware, Endpoint security gaps → Endpoint Security. Use them as a triage launcher. (Hardware changes is informational and does not link.)
Compliance and worst offenders
The Compliance coverage strip shows each assessed framework’s score with its assessed/total count (click to assess controls). Below, Active privilege elevations lists who currently holds elevated access (subject, JIT vs break-glass, permissions, expiry), and Lowest-health devices lists the machines dragging the tenant down with their score and top reason — both panels link to their full views.
Endpoint Security

Fleet-wide endpoint security posture as reported by the agent: disk encryption, Secure Boot, TPM, host firewall and antivirus/EDR. SentinelOps collects it so nobody has to log into each machine to confirm a laptop is encrypted or a server has its firewall up. For the tenant it is the single screen that answers “which of our machines are exposed, and how?” and turns it into a click-to-filter remediation list. Pick a tenant first. Posture arrives with the hourly inventory, so a freshly enrolled or just-updated endpoint shows “Not reported” until its next check-in.

The dimension tiles
The top row summarises each dimension across the tenant — Encryption shown as on / off / partial / unknown, then Secure Boot (on/off/unknown), TPM (yes/no/unknown), Firewall and AV/EDR. Two leading tiles, “Reporting” vs “Not reported”, tell you how much of the fleet has sent posture at all; a device that predates this feature counts as not reported until its agent is updated.
Risk tiles — click to filter
The second row counts machines at risk on each dimension: Unencrypted (encryption off), Secure Boot off, No TPM, Firewall off, No AV/EDR (no product and not on). A tile turns warning-coloured when non-zero. Click any tile to filter the table to just those machines (the tile outlines to show it is active); a “✕ Clear filter” tile appears to return. Example: click “Unencrypted” to get the exact list of laptops to remediate before they leave the office.
Per-device table
One row per endpoint with each dimension as a coloured pill, plus the tool that reported it where known — e.g. BitLocker or LUKS under Encryption, the TPM version, the firewall tool, and the AV product name next to its state. “unknown” means the agent could not determine that dimension, which is treated differently from a confirmed “off”. A device too old to report shows “Not reported — agent update required”.
Getting posture to report
If everything shows “Not reported” and nothing is reporting, the view says “Awaiting agent data” — update the agents and posture appears on the next hourly inventory, not instantly. This view is read-only reporting; act on findings through the device drawer or the relevant module (disk encryption, firewall, AV).
Self-Healing

SentinelOps watches the apps you care about on every managed endpoint and puts one back if it goes missing — so a removal (a bad uninstall, a failed patch, a CVE remediation that removed a broken app) does not leave a machine without it. It only ever restores an app the device actually had before, and the reinstall it runs is verify-or-rollback: if the fresh install fails it restores the previous copy, so a machine is never left with nothing.

Enable self-healing
When on, every managed endpoint’s installed-software inventory is checked on a schedule against the watched-apps list. If a watched app that was previously present disappears, a Self-healing alert is raised and (if Auto-restore is on) a reinstall is dispatched. Apps the device never had are never installed.
Auto-restore
Automatically reinstall a missing watched app when SentinelOps has a clean-reinstall recipe for it (Google Chrome today). The reinstall is verify-or-rollback: it downloads and size-checks the installer first, tries an in-place upgrade before any removal, backs up the existing install, and if a removal+reinstall ever fails it restores the backup — the endpoint is never left without the app. Watched apps with no recipe raise an alert to redeploy from the Software Library instead.
Watched apps
Comma-separated name patterns matched against installed-software names (e.g. “google chrome”). Default watchlist covers apps with an auto-restore recipe. Add your own to get missing-app alerts for them even without an automatic reinstall.
Recent self-heal activity
A log of what the guardian did: Missing (a watched app vanished), Auto-restore dispatched (a reinstall was queued), Recovered (the app came back), Blocked (could not auto-restore — e.g. installs are locked on the device, the device is offline, or no recipe exists). Blocked reasons tell you exactly what to fix.
When a device needs hands-on help
If an endpoint’s Windows Installer subsystem is itself damaged (msiexec runs but installs nothing), auto-restore is blocked and the reason is logged — that box needs a servicing-stack repair (DISM/SFC, msiexec re-register, or a reboot) before any install, SentinelOps or otherwise, can succeed.
Opt one machine out (stop the alerts for it)
If a machine legitimately has a watched app come and go — for example Chrome that updates itself on a box whose installer can’t be repaired — the daily “managed app is missing” alert is just noise for that one machine. Open its device drawer and set App self-healing to “opt out” (this adds the no-selfheal tag). That machine is then skipped entirely by the guardian — no missing-app alerts and no auto-reinstalls — while the rest of the fleet keeps healing. Turn it back on from the same place any time. This is separate from Auto-heal (the log-driven rules engine, the no-autoheal tag) right above it in the drawer.
Self-Healing Rules

Log-driven auto-remediation. SentinelOps reads each online endpoint’s recent logs and, when a vetted rule matches a known problem, runs a safe, pre-approved fix through the ordinary job system and then verifies it worked — so recurring faults heal themselves instead of waiting for a human. Safety is the whole point: only vetted built-in rules auto-apply, and only genuinely safe, idempotent, reversible fixes; anything with outage potential ships monitor-only. The AI only suggests fixes for errors no rule covers — it never runs them. Every machine can opt out with a tag, a tenant on legal hold is frozen, and every single decision is recorded and auditable. This is a separate engine from App Self-Healing, which restores removed applications.

The safety model (read this first)
Four layers protect you. (1) Only vetted BUILT-IN rules auto-apply, and the catalog is deliberately conservative — a fix that could cause an outage or touch data ships monitor-only until you deliberately enable it. (2) The AI never acts: it only proposes a rule for your approval. (3) Any machine tagged no-autoheal is skipped entirely (set it from the device drawer). (4) A tenant on legal hold has all auto-changes frozen for preservation. On top of that, every rule has a cooldown and a daily attempt cap so a flapping fault can never loop.
Global controls
Enabled is the master switch — off means nothing is detected, suggested, applied or emailed. Monitor-only mode makes the WHOLE engine detect-and-email but change nothing, which is the safe way to watch what would happen before letting fixes run. AI suggestions lets the assistant propose fixes for unknown recurring errors (they queue for approval, never run). Email reports sends a batched digest of activity and pending suggestions to your alert recipients (needs SMTP configured). These four are platform-wide, not per-organization, and only a platform-wide operator can change them.
Schedule & email (platform-wide)
Under the engine switches, “Schedule & email” sets: how often machines are checked (default every 10 minutes, 5–1440) and how many machines per check (default 60 — raise it for large fleets); how often the digest is sent (default hourly) or sooner once N events queue (default 25); extra digest recipients, optionally REPLACING the alert recipients instead of adding to them; and which no-action observations get emailed — critical only (default), warning and above, everything, or never. Fixes applied, verified or failed are always emailed regardless. Leave a number blank for the default. Changes take effect on the next check with no restart.
Where each setting applies — organization, group, device
Pick an organization in the top bar, then choose the scope under “Per-rule overrides apply to”: the whole organization, one device group, or a single device. For that scope you can turn each rule off, make it observe-only, and set its cooldown and daily cap (blank = inherit — the greyed number shows what it inherits and from where). The most specific setting wins in both directions: device beats group beats organization beats the global rule, so a device can turn back ON a rule its group turned off, or use a shorter cooldown. Deleting a device, group or organization removes its overrides too.
Maintenance windows
Next to the scope picker, “Set window” restricts WHEN fixes may run for that organization, group or device — for example weekdays 22:00–06:00 in America/Los_Angeles (an end earlier than the start is an overnight window; the days are the days it starts). Outside the window a matched problem is recorded as “deferred” and fixed on the first check inside the window if it is still being logged; detection, observe-only and email carry on at any time. The most specific window wins, and “Fix any time” lets a device or group opt out of a broader window. Remove a window to follow the broader scope again.
Email per organization
With an organization selected, “Self-Healing email for …” sends that organization its own digest covering only its machines. A platform-wide operator can also take the organization out of the platform-wide digest (it then goes only to its own recipients) and give it its own severity threshold. Customer-scoped operators can manage their organization’s recipients but not those two settings.
Rules
Each rule watches a log regex on a chosen OS/role scope and, when it matches enough times in its window, runs its fix. Toggle Enabled and Monitor-only right in the list. Built-in rules carry a badge and are maintained by SentinelOps — a platform-wide operator can tune their toggles, severity, cooldown and daily cap (Tune), and they cannot be deleted (disable instead). Severity decides whether the rule’s no-action observations reach the email digest. Your own rules get a full editor and a delete. Use + Rule to add one: name it, give a regex pattern, scope it by OS/role, set the trigger count/window, choose the action (restart a named service, or run a script/command, or just suppress a benign alert), add a verify step, and set the guardrails. The action editor warns you that it runs on real machines — leave a new rule monitor-only until you have watched it behave.
AI suggestions
When AI suggestions is on, the assistant looks for a recurring error that no rule covers and proposes ONE safe fix, with the sample log lines and its rationale. It never runs anything. Approve turns the suggestion into an operator-owned rule that starts monitor-only — so it records what it WOULD do without acting — and you turn monitor-only off once the activity log convinces you it is safe. Dismiss discards it.
Activity log
Every decision, newest first: detected (matched, nothing done yet), monitor-only (would have acted but monitor-only is on), applied (fix dispatched as a job), verified (fix confirmed to have worked), failed (job or verification failed), suppressed (a benign/known-noise match, no alert, no action), deferred (a fix is waiting for the machine’s maintenance window), recurring (the same fix was needed on this machine at least the recurring threshold — default 3 — times in 24 hours: it works each time but the cause keeps coming back, so investigate). When a fix is verified, Self-Healing also closes the matching log alerts on that machine and, unless turned off under Schedule & email, emails a “Resolved by Self-Healing” notice right away. The trigger column shows the matched log line with secrets redacted.
Per-machine opt-out
On any device’s drawer there is an Auto-heal control. Opt a machine out and it gets the no-autoheal tag — the engine then skips it entirely (no detection, no fixes) while still healing the rest of the fleet. Turn it back on to remove the tag. This needs enrollment.manage (the same permission that sets device tags).
Identity Security

An account-hygiene review of the selected tenant’s SentinelOps operator accounts — it flags only the accounts that need attention (missing MFA, dormant, locked, never signed in, stale passwords) and leaves clean ones off the list. SentinelOps has it because the accounts that manage the fleet are themselves a prime target, and a privileged login with no second factor is the shortest path to a breach. For the tenant it is a standing checklist that keeps operator access tight. This view is per-tenant — pick a tenant first.

Read the KPI strip first
Tiles count Accounts, Privileged, No MFA, Priv. w/o MFA, Dormant, Locked, Never signed in and Stale passwords. A tile turns warning-coloured when its count is non-zero, so a red “Priv. w/o MFA” tile is your highest-priority fix — a privileged account with no second factor.
Work the “needs attention” table
Rows are sorted highest-risk first and show the account (with privileged / disabled pills), role, MFA state, flag chips (dormant / locked / never signed in / stale pw) and last sign-in (with failed-login count where any). Clean accounts are omitted by design, so an empty table means every operator has MFA and is active.
Know how the flags are defined
Dormant = no activity in the configured window (90 days by default); stale password = unchanged in the configured window (365 days by default). Both thresholds are printed under the KPI strip so you can read a flag correctly.
It reports, you remediate
This view surfaces the risk; fix it in the tenant’s Users / Identity screens — enable MFA, disable or remove dormant accounts, unlock or reset as appropriate. Requires permission to read identity data; a 403 shows “Not permitted”.
File Integrity

Defines the critical file paths each endpoint should watch for changes. SentinelOps has it because a quiet edit to a config file, an account file or a web root is a classic sign of compromise or an unapproved change — and you want it recorded, not discovered later. For the tenant it is a lightweight file-integrity monitor: changes under a watched path are captured in the agent’s tamper-evident, hash-chained file-audit log, giving a defensible record of what changed and when. Pick a tenant first. Editing the watch list needs system.manage.

Set the watched paths
Enter one path per line — files or directories — in the text box, then “Save watched paths”. Examples: /etc/ssh/sshd_config, /etc/passwd, /var/www, C:\inetpub\wwwroot. The list is tenant-wide; each endpoint watches these paths once File & Activity Audit is enabled for that device. The footer confirms how many paths are currently watched.
Enable the audit per device
Watching only produces records where File & Activity Audit is turned on for the endpoint — the watch list names the paths, the per-device audit does the capturing. Without the per-device audit enabled, a path can be listed but nothing is recorded for it.
Where changes show up
This screen only defines what to watch; it does not display events. Review actual changes under Endpoint Activity / File Audit for the device, or in the audit log. The hash-chained log makes tampering with the record itself detectable.
What it is good for
Catch edits to security-sensitive files: an unexpected change to sshd_config, a new entry in passwd, or a file dropped into a web root. Read-only here; without system.manage the box is disabled and shows “system.manage required to edit”.
Config Baselines

CIS-style hardening checks scored live against each managed device from the telemetry the agent already reports — there is no separate scan to schedule or push. SentinelOps has it so a tenant can prove, at any moment, which security controls (encryption, Secure Boot, firewall, AV and more) are actually in force across the fleet rather than assumed. For the tenant it turns “are we hardened?” into a concrete, per-device worklist. Pick a tenant first.

The KPI tiles
Three tiles summarise the tenant: Devices failing (warning-coloured when non-zero), Devices checked, and the number of Checks evaluated. Read them first to size how weak or strong the tenant is before drilling in.
Checks — fleet rollup
The first table lists every check with its category and, per check, how many devices Pass, Fail and are N/A. This is the control-centric view: one row per hardening control so you can see which single setting is weak across the whole tenant.
Devices with failing checks
The second table is the device-centric view: devices with at least one failing check, worst (most failures) first, capped at the top 40. Each row names the specific failing checks with any detail string, so you go straight to the machine and the exact setting to fix.
Why “n/a” is never a pass
A check reads “n/a” when the device has not reported the data it needs yet — for example endpoint-security posture that requires the latest agent. An un-reported check is never scored as a pass, so the rollup stays honest rather than flattering coverage. Update the agent and the next hourly inventory fills it in.
TLS Scanner

Grades the TLS posture of hosts you add as targets. SentinelOps has it because a weak cipher, a deprecated protocol still accepted, or a certificate about to expire is both common and easy to miss until something breaks or is exploited. For the tenant it is a standing watch on its TLS endpoints — an at-a-glance A–F grade per host and an early warning before a certificate lapses or a protocol weakness is found. The server performs a read-only handshake; nothing is changed on the endpoint. Pick a tenant first; adding targets needs tenant.manage.

Add a target
With tenant.manage, “+ Target” prompts for a host and a port (default 443). It is scanned immediately on add, and a letter grade (A–F) summarises protocol, cipher, certificate and certificate expiry.
Read the grade card
Each target card shows the negotiated protocol and cipher, the certificate subject and issuer (with a self-signed flag), the first few SAN / DNS names, and days to expiry — coloured red when expired, amber under 30 days, green beyond.
Weak-protocol warning
If the host still accepts deprecated protocols (e.g. TLS 1.0 / 1.1), a red “weak” badge lists them next to the protocol — a clear signal to disable old protocols on the endpoint.
Rescan and remove
Rescan re-runs the handshake on demand — use it after renewing a certificate or disabling old protocols to confirm the fix. Remove drops the target. A target that fails to connect is graded F with the connection error shown on the card.
DNS Monitoring

Two things in one view: the live DNS for every agent-managed machine (grouped per server), and optional domain monitors that re-resolve a tenant’s domains hourly and flag any record change. SentinelOps watches DNS because a hijacked MX, a fat-fingered edit or an expired record is both easy to miss and expensive — mail stops, a site goes dark, or traffic is silently redirected. For the tenant it is an audit trail of what DNS said and when it changed, so a bad change surfaces fast and a legitimate one is provable. Pick a tenant first for domain monitors; adding or removing one needs tenant.manage.

Per-machine DNS (top section)
One group per agent-managed server, shown whether or not a tenant is selected. For each machine the server resolves — live, no agent round-trip — the host’s forward A/AAAA (hostname and FQDN), reverse PTR for its known IPs, and CNAME; its domain’s NS/MX/TXT/SOA; and the resolver configuration the agent reported (nameservers queried, search/suffix domains, hosts-file overrides — needs agent 0.5.16+). Refresh re-resolves one group. The same view is available per device from Quick actions → DNS.
Add a domain monitor
Use “+ Monitor domain” (tenant.manage). Enter a domain (e.g. example.com). For record types, leave it BLANK to watch ALL records — A, AAAA, CNAME, MX, NS, SOA, TXT, SPF, DMARC, CAA, SRV, PTR — or type a comma-separated subset. Example: watch just MX and TXT on the primary domain to catch mail-routing or SPF/DKIM tampering.
Reading a monitor card
Each card lists the current values per record type, when it was last checked, and how many changes have been logged. A record type that failed to resolve shows an “error” pill carrying the resolver message (on hover) rather than a silent blank.
Recent changes
When a record moves, the card shows a Recent changes log (last 8, newest first) — old values in red, new values in green, with a relative timestamp — so you see exactly what changed and roughly when. This is the evidence you hand to whoever confirms the change was intended.
Check now, and the hourly pass
Monitors re-check automatically every hour; “Check now” forces an immediate re-resolve and tells you at once whether anything changed (it toasts the number of changed record types). Use it right after a legitimate DNS edit to re-baseline, so the next scheduled pass does not alarm on your own change. Remove deletes a monitor after a confirmation.

Patching & Software

Software Catalog

Every installed application seen across the fleet, with how many machines carry each title and which versions are present — built from the software each endpoint reports in its inventory. SentinelOps has it to answer "what is actually installed out there, and at which versions?" without touching each machine. For the tenant it is the software census behind licence, patch and standardisation decisions: it shows version sprawl and unexpected installs at a glance. It is read-only reporting, scoped to the selected tenant.

Titles and reporting devices
Two KPIs: how many distinct software titles are known, and how many devices have reported software at all. A device that has not sent an inventory yet is not represented — so read the reporting-devices count as the coverage of this picture.
Filter to find a title
The filter box narrows the list by name (case-insensitive substring) — e.g. "chrome" to see every Chrome variant and its version spread. The list caps at 400 rows, so filtering is the way to reach anything beyond that.
Read the version spread
The Versions column shows every version in the field for that title. A title running many differing versions is a good patch/standardisation candidate — pair it with Software Policies to require a version or prohibit an app, and with Software Library to push the wanted build.
Patch Management

The operational patch view: what is missing, critical, failed, or needs a reboot across the fleet, built from the structured scans agents report rather than scraped text. SentinelOps has it so patch exposure is a single honest number instead of a per-machine guess — offline or never-scanned devices show as offline/unknown, never falsely compliant. For the tenant it is the live read of how exposed their fleet is to known-bad updates and the one place to scan, schedule and push fixes; with a tenant selected everything is scoped to that organization, with none selected it spans the whole fleet.

KPIs & compliance (click to filter)
Nine cards across the top: Compliance %, Available, Critical, Security, Failed, Reboot required, Non-compliant, Offline and Unknown. Critical, Failed, Reboot, Non-compliant and Unknown turn warning-coloured when non-zero. Click any card to filter the device table to just those machines (the card outlines to show it is active); arriving from a Dashboard patch card pre-selects the matching filter.
Automated patch deployment banner
A banner reads "scheduled" (green) or "not configured" (amber) with a note — it answers "why was this not patched automatically?" and points you at Auto-Patch Policy to set the per-tenant rules.
Patches by operating system
A per-OS strip (Windows / Linux / macOS …) where each chip shows device count, available count, and crit / sec / upgrade / reboot pills plus a compliance %. Click a platform to highlight it and show only its patches in both the critical list and the device table; click it again, or "All platforms", to clear. "Upgrade" counts big feature/version jumps, not routine patches.
Severity & Compliance panels
Severity lists each class (critical, high, …) with its patch count and affected-device count. The Compliance bar splits the fleet into compliant / at risk / non-compliant / offline / unknown, and the legend defines them: Compliant = up to date, At risk = security updates pending with no critical, Non-compliant = critical or failed updates, Unknown = never scanned.
Compliance by tenant
When the view spans more than one tenant, a table breaks compliance %, critical, security, non-compliant and reboot counts down per tenant so you can see which organization is furthest behind.
Critical patches requiring action
One row per patch with its affected-device count, known-exploited (KEV) first so the most dangerous are at the top. "Compliance report" opens a printable per-fleet compliance summary.
Recent deployments
Visible with patch.deploy or patch.global_view: scoped patch rollouts (from "New deployment"), each row clickable for per-machine status.
Devices needing attention
Worst-first table: device, tenant, OS, compliance pill with its reason, available / critical / security / failed counts, a reboot pill (click to reboot the machine now when you have command.execute), the live apply status, and last-scan age. Honours the KPI and OS filters above.
Scan fleet
With patch.scan, queues a read-only patch scan on every online endpoint; the dashboard populates as agents report. Nothing is changed on the endpoints.
New deployment
With patch.deploy, roll patches out to a device, group, site, tenant or dynamic query — with a preview of who is targeted and an optional schedule — rather than applying to everything at once.
Apply patches
With command.execute, downloads and installs available updates on online endpoints using each one’s native updater — Windows Update on Windows; apt/dnf/zypper/pacman/apk on Linux. If an OS family is highlighted it applies to just that platform. It runs in the background and progress (applying → completed, with a reboot flag when pending) shows per device in the Apply column. Applying changes endpoints, so by policy it may require a second approver (administrators and engineers are exempt).
Auto-Patch Policy

A per-organization policy that auto-schedules critical/security patches on any OS, force-applies them once a deadline passes, and controls what happens when a reboot is needed. SentinelOps has it because patches that wait on a human tend to sit unpatched — this guarantees a qualifying fix is applied within a fixed window of being detected. For the tenant it turns patching into a standing SLA ("critical fixes land within N days") instead of ad-hoc effort; it is disabled by default and you must pick an organization to configure it.

Enable automatic patching
The master switch (checkbox) for this tenant. While off, nothing is ever force-applied — you can still patch by hand from Patch Management.
What to auto-schedule
Three checkboxes choose which update classes are picked up automatically: Critical updates (highest-severity fixes), Security updates (security-classified patches), and ALL available updates (aggressive — everything the scanner finds, not just critical/security). Tick only what you want forced.
Force-apply deadline
A number field (1–365 days, default 5) — the grace window after a qualifying patch is first detected before it is pushed. The countdown starts the moment the patch is seen; until the deadline the device shows an "action due in N days" status.
When a reboot is required
A dropdown with four behaviours: Alert the operator (do not auto-reboot) — the default; Reboot automatically if required; Always reboot after patching; Never reboot (and do not alert). Choose per how disruptive a restart is for that fleet.
Save policy
Writes the policy for the tenant. The deadline is clamped to 1–365 days on save.
Pending & scheduled table
A live per-device countdown: machines that currently have qualifying pending patches, with their Critical and Security counts, whether a reboot is pending, and an auto-apply status — "due in N days (date)" or "forcing now / overdue". This is where you confirm what the policy will actually do before it does it.
What is never auto-patched
Mobile devices and pinned (no-auto-update) devices are always excluded. A maintenance window can be attached via the API (the window field) so forced patches land only inside an agreed window.
Patching

Lists and applies OS and third-party updates through each endpoint’s own update tooling, both as a fleet job across a group/tag selection and per-endpoint. SentinelOps has it so you can report and remediate updates centrally without logging into each machine, while keeping a human approval on anything that actually changes a box. For the tenant it is the hands-on patching console — read-only reporting is free, applying is approval-gated so an update is never pushed to their servers unreviewed.

Fleet patch — selectors
Target a selection, not everything: Device group (a dropdown of the groups in use, or "Any group") and Tags (comma-separated, all must match). A live counter shows how many endpoints match before you queue anything.
Fleet patch — operation
The Operation dropdown chooses List available updates (patch.list, read-only — no changes) or Apply updates (patch.apply). "Specific packages" (comma-separated, enabled only for Apply) limits the apply to named packages; leave it blank to apply all available updates. "Queue patch job" fans the job out to the matching endpoints — an Apply gets an approval-gated job per endpoint that a second operator must approve.
Per-endpoint actions
The Per-endpoint panel lists every enrolled machine with two buttons: "List updates" queues a read-only report (results appear on the device once the agent reports back), and "Apply…" prompts for optional package names and queues an approval-gated apply on just that machine.
Maintenance window
Devices outside their maintenance window are skipped automatically, and the toast tells you how many — so a server fleet can be gated to a window while workstations patch immediately.
Last rollout
After a fleet dispatch, a rollout panel lists each endpoint’s job and status; "Refresh status" re-polls the jobs so you can watch them move from awaiting-approval to succeeded/failed without leaving the page.
Firmware / BIOS

Current versus target firmware/BIOS across managed devices, with a warning when a device is behind its target. SentinelOps has it because firmware is the most-ignored patch surface — real BIOS versions come from SMBIOS/dmidecode/WMI and the "Scan" action runs the vendor tool to discover available updates, so the picture is grounded, not assumed. For the tenant it surfaces which machines carry outdated or exploitable firmware and lets you drive the vendor update remotely. Scoped to the selected tenant; editing targets and dispatching updates needs firmware.manage.

Reading the table
Each device shows its model (with manufacturer, service tag, the vendor tool in use and, for whitebox builds, the motherboard make/model), current BIOS, the target you have set, and a status pill: "up to date", "update available" (with its severity and an "N update(s)" badge listing current → available per component), "no target set", or "virtual BIOS" for a VM. The panel heading counts how many devices are behind target.
Set a target
"Set target" opens a form — Device model, Target BIOS version, and Severity if behind (Medium default, or High / Critical / Low). It records the expected BIOS for a model, and every device of that model running older firmware is then flagged update-available. Example: set OptiPlex 7090 to 1.24.0 at High.
Scan for updates
On update-capable physical devices, "Scan" dispatches a firmware.scan job that runs the vendor tool (Dell Command Update, fwupd) to discover available firmware; results appear here when it finishes and the status then lists the specific updates with current → available versions and severity.
Update… (the guarded flash)
On a device that supports it, "Update…" opens a workflow that shows current vs newest-available BIOS, lets you pick the source (the vendor’s own pending update or an uploaded firmware file), and plan safeguards (back up first, notify the client) — then a separate explicit confirm with a "do not power off" acknowledgement actually dispatches the flash. Nothing flashes until that last step, and every action is audited.
What cannot be flashed
Virtual machines show a virtual BIOS — it belongs to the hypervisor and is not flashable. Monitors and direct-attach cables cannot be flashed remotely either, so no Scan/Update buttons appear for them.

Automation & Jobs

Scripts (fleet)

Dispatch one script across a group/tag selection of endpoints at once, with each job gated by approval, and keep a reusable library of scripts. SentinelOps has it so ad-hoc remediation scales to many machines without losing the two-person control and audit on executing code. For the tenant it is how a fix or check is rolled out fleet-wide safely; the selector is scoped to the current organization and the script is staged to a private temporary file on each endpoint, never inside a managed root.

At a glance
The summary tiles count Endpoints, how many are Online, and how many Groups exist — the pool you can target.
Dispatch a script — selectors
Device group (a dropdown of groups, or "Any group") and Tags (comma-separated, all must match) choose the targets. A live counter under the body shows how many endpoints match the selector, and Dispatch is disabled until at least one matches.
Dispatch a script — interpreter & lifetime
Interpreter is sh, bash, powershell or python3 (only interpreters an endpoint’s administrator allowlisted will actually run). Job lifetime is 1 hour, 6 hours or 24 hours — after which an unrun/unapproved job expires. The Script body is the code to run.
Approval model
If you are an administrator or engineer, the script.run jobs dispatch immediately under your authority and are audited under your name. Otherwise each job requires a second operator to approve it before it executes. Devices outside their maintenance window are skipped, and the toast says how many.
Script library
The built-in catalogue plus your own saved scripts, searchable. "Use" loads a script into the dispatcher above (and sets the matching interpreter); "Edit" changes the saved script; "New script" creates one. This is the same library shared with Automation.
Last rollout
After a dispatch, a panel lists each endpoint’s job and status; "Refresh status" re-polls them so you can watch the rollout move from awaiting-approval through succeeded/failed.
Automation

A library of vetted script templates you can run on an endpoint now or on a schedule, carrying an approval lifecycle so impactful scripts are reviewed before they execute. SentinelOps has it to turn routine operator work into reusable, governed building blocks rather than copy-pasted one-offs. For the tenant it is a curated, auditable catalog of what can be run against their machines, with an optional second-operator gate on every run. Templates and settings are per-tenant.

At a glance
The summary tiles count Templates, how many Categories they span, and whether Change approval is On or Off for this tenant. "Seed built-in catalog" adds the built-in templates to this tenant (existing ones are left untouched).
Change management
A checkbox — "Require approval for automation runs on this tenant". When on, every automation run needs a second operator to approve it before it dispatches; the setting saves immediately.
Template library
Platform tabs (All, Linux, Windows, macOS, Android, Cross-platform) each with a count — a specific-OS tab also surfaces cross-platform templates, and "All" groups each script under its OS then by category. Each template shows its name, OS, interpreter, description and an approval badge (approved / in review / rejected / draft).
Review a template
With automation.manage a "Review…" button moves a template through the Draft → Submit for review → Approve / Reject lifecycle with an optional note. An author cannot approve their own script; an unapproved script cannot be run without the execute-unapproved permission, so review is the gate that makes a template runnable by everyone.
Run a template
"Run…" opens a dialog: pick the Endpoint (the list is filtered to OS-matching devices), fill any template parameters, and optionally set a Schedule (leave blank to run now). The run is dispatched, scheduled, or queued for approval depending on the per-tenant setting, and is audited. "Edit" changes the saved template (shared with the Scripts library).
Job Dashboard

Every job dispatched across the fleet in one place — its type, target device, status and any error — so you can see at a glance what ran, what is queued and what failed. SentinelOps has it because actions (patches, scripts, restarts, scans) all run through one job system, and this is the single pane that proves they landed. For the tenant it is the after-action record: scope it to their organization to confirm a rollout reached their machines, or leave the tenant blank to watch the whole fleet.

Filter with the status tiles
A total tile plus one tile per state that has jobs — queued, pending_approval, running, completed, failed, error, rejected, expired. The tiles are clickable: click one to filter the table to that status, and a ✕ "clear" tile appears to drop the filter. Failed and error tiles turn warning-coloured when non-zero.
Read the results column
Each row shows the job type, the device, a status pill (green for completed, red for failed/error/rejected/expired), when it was created and by whom, and the error text in red for anything that failed — enough to triage without opening the device.
Scope by tenant
With a tenant selected the list is scoped to that organization; with no tenant it spans the whole fleet. Use it right after a bulk action or rollout to confirm the jobs landed and none rejected or expired.
Scheduled Reports

Set up recurring emailed fleet summaries and watch the network-topology trend that SentinelOps snapshots over time. SentinelOps has it so stakeholders get a regular pulse without logging in, and so topology growth/shrinkage is tracked as history rather than a single live view. For the tenant it is the standing reporting and change-over-time record — the topology trend is scoped to the selected tenant.

Schedule an emailed report
With reports.view, "+ Scheduled report" asks for a report Name and a Recipient email and creates a recurring (weekly) fleet-summary email. Reports go out via the server’s SMTP relay, so SMTP must be configured for delivery to work.
Manage the schedule
The table lists each report’s name, cadence, recipient and when it last sent; the ✕ removes one. "Last sent" showing "not yet" means it has not reached its first send.
Topology trend
The network map is snapshotted every 12 hours; this panel shows the latest device, online and discovered counts plus how many snapshots exist, so you can see the network growing or shrinking over time. The first snapshot is taken within 12 hours of setup.
Bulk Actions

Run one maintenance, tenancy or lifecycle action across many machines at once, instead of opening each device drawer. SentinelOps has it so routine fleet work — scan, patch, restart, retire — scales without dozens of clicks, while every selected device still goes through its own per-device guard, permission check and audit entry. For the tenant it is the fastest safe way to act on a whole set of their machines together. Mobile devices (Android / iOS) and already-decommissioned machines are excluded from the list.

Select and run
Tick devices (or "Select all"), choose an action from the dropdown — Scan for patches, Apply patches, Restart agent, Update agent now, Security audit scan, or Firmware scan — and click "Run on selected". You confirm before it queues, and the result line reports how many were queued; some actions may be held for approval depending on policy.
Move devices between tenants
With device.manage, tick devices and use "Move selected to tenant" to reassign them to the chosen organization. The devices then appear under the target tenant; their group / site / network assignments are cleared while tags follow the device. You confirm first, and the result reports how many moved and how many were skipped.
Decommission a device (per row)
The per-row "Decommission" (needs device.manage) marks that machine decommissioned — alerts, patching and automation pause — but it stays in inventory. It requires typing the device name to confirm, because it is a real state change, not a maintenance action.
Power & lifecycle on selected
Tick machines, then use the Power & lifecycle row to act on all of them at once: Reboot or Shut down (needs command.execute — Reboot shows a one-minute warning to signed-in users; Shut down powers the machine OFF and it will not restart on its own), Approve decommission (device.manage — authorizes each agent to deregister on uninstall for the next hour; it does NOT change device status), or Remove device (device.token.revoke — deletes them from inventory together with everything tied to each machine; irreversible). Each runs the same per-device endpoint with its own guards and audit; the result line reports how many succeeded and names any that failed.

Discovery & Network

Discovery

Finds unmanaged machines on the network an enrolled agent sits on, so you can bring them under management. Why it is here: you cannot protect what you cannot see, and this surfaces the gaps without touching the endpoints — the scan is on-demand and read-only, it fingerprints hosts and never logs into anything. Tenant benefit: it turns a customer’s unknown LAN into a triaged list of real agent candidates, with firewalls, printers and NAS shown but never targeted.

Scan a network
Runs a one-time, read-only TCP-connect scan from a chosen online agent across its own private network. It is bounded so it cannot flood the network or reach the internet. The KPI strip shows Discovered, Deployable (agent-port candidates), Wireless scan results and Already managed.
Deployment credentials
Admin/root credentials you store, encrypted at rest, used by an on-LAN agent to log in and install. They are never shown again after saving and never leave the server except to a proxy at deploy time. If you lack credential.manage the credential column and the Deploy action are hidden and only the manual token-installer handoff remains.
Discovered machines
Each host is classified by type. Only workstations and servers are offered for deployment — firewalls, access points, printers and NAS are shown but never targeted. Filters let you show only candidates, hide already-managed hosts, or show only wireless-scan finds.
Deploy
Authorises installing the agent on one candidate via an on-LAN proxy using a stored credential. Per-machine and audited; no default-password guessing and no automatic spreading. The server enforces job.execute on every dispatch.
Discovery Queue

A triage worklist of the hosts network discovery keeps finding that are neither managed nor ignored. Why it is here: repeated scans otherwise re-list the same hosts forever, so this is where you clear them down — approve a host to move it toward deployment, or ignore one you never intend to manage so it stops resurfacing. Tenant benefit: it keeps a customer’s “unmanaged” list down to genuine agent candidates instead of permanent noise from their printers and phones.

What lands here
Every discovered host that is not yet managed and has not been ignored. The counters show how many await triage and how many of those are deploy candidates — hosts where an agent port was seen, so an agent can plausibly be pushed.
Reading a row
IP, hostname, and the best guess at vendor / classification / role from the scan. The Deployable column reads “deploy candidate” when the host looks agent-installable, or “no agent port” when it does not — a switch, printer or appliance typically shows the latter.
Approve vs Ignore
Approve marks the host for deployment follow-through; Ignore drops it from the queue so repeated scans stop re-listing it. Example: Ignore the office printer and the guest-Wi-Fi phones so the queue only ever shows real candidates for agent rollout.
Keeping the queue clear
An empty queue means discovery has found nothing new to triage — run Discovery again to sweep for more. Ignoring is reversible through the discovered-hosts data if a host later needs managing.
Network Map

A live, scalable topology of the client network drawn from discovery and SNMP. Why it is here: a picture of how a site actually hangs together — what connects to which switch port, and what is down — is faster to reason about than a table. It stays smooth at 1,000+ devices: the canvas is larger than the screen and you pan and zoom rather than cramming everything in. Tenant benefit: it gives you (and a customer) an at-a-glance map of their estate, with every device typed from its SNMP signals (router, switch, firewall, AP, server, printer, UPS, camera, phone, hypervisor, NAS…).

Run discovery first
The map is built from discovered hosts, so it is empty until you run a network scan from Discovery. Once a scan exists, every device it found is plotted. (Admins can seed a 500-device demo topology with the “Mock 500” button to see it at scale.)
Pan, zoom and fit
Drag to pan; wheel, pinch or the +/− buttons to zoom; “Fit” frames the whole network. The minimap at the bottom-right shows where you are — click it to jump. Your zoom, position and layout are remembered per browser.
Zoom shows more detail
Zoomed out, devices group into collapsible subnet bubbles showing a device count and overall health — click a bubble to expand it, or use “Collapse” to collapse/expand all. Zoom in and you get icons with hostnames, then full detail (IP, type, status). This keeps labels readable at every level instead of overlapping into clutter.
Device types and status
Every device shows a type icon (unknown devices show “?” with their sysDescr in the tooltip) and a coloured status ring — green up, amber warning, red down — plus a red badge for its open alert count. Classification is data-driven; if a device is mis-typed, open it and set a manual type override (auto, or any of the known types).
Links
Links are drawn from real LLDP / switch-FDB data where available (a device to the switch port it is learned on, and switch-to-switch uplinks); devices with no learned switch location fall back to their segment gateway, which links up to the internet. A down link is dashed red.
Toolbar — search, filter, layout, export
Search by hostname/IP (it centres and highlights the match once you type 2+ characters), filter by device type or by status (up / down / warning / unmanaged), and switch between Clustered and Tiered layouts. Export the current map to PNG or SVG. Click a device to open the side panel (identity, vendor/model, status, sysName/sysDescr, type confidence and source, plus the type-override).
Site Dashboard

Fleet health rolled up by physical location, so you can see at a glance which site is healthy and which needs attention. Why it is here: for a customer with several offices, a per-location roll-up tells you where to send effort before you open a single device. Tenant benefit: it turns the tenant’s scattered devices into a per-office scorecard, so a site-wide outage stands out immediately.

One card per site
Each site shows total Devices, how many are Online, how many Offline, and Open alerts. The Offline and Open-alerts tiles turn to a warning colour when the count is non-zero, so a struggling site is obvious.
Sites come from Sites & Networks
A site only appears here once you have created it under Sites & Networks and assigned devices to it. An empty dashboard means no sites are defined yet — add them there first, then come back.
Use it for multi-location triage
For a client with several offices, scan the Offline and Open-alert counts to decide which location to work first — e.g. a branch showing 8 offline of 10 devices likely has a site-wide outage (link or power), not eight separate faults.
Credential Coverage

Answers one question for every machine: can SentinelOps log into it later without a domain controller? Why it is here: after a rebuild, a password change or on a workgroup box with no DC to fall back on, you can be locked out of your own endpoint — this surfaces that risk before it bites. It also keeps a read-only census of the accounts and credential slots each machine has (names only — never the passwords). Tenant benefit: it proves a customer’s fleet has a known-good way back in, and closes gaps with a rotated, vaulted credential SentinelOps owns.

Fleet coverage & KPIs
The tiles count Machines, how many Have a managed credential, and Coverage gaps (gaps shown in red). The table lists machines with no SentinelOps-owned credential first — those are the ones you could be locked out of. Columns: Machine (with OS), Status (online/offline), Coverage (Covered / No credential, plus how: “managed admin” and/or “N vaulted”), and a Census summary (accounts · Credential-Manager entries · service logons).
Census all online / per-machine Census
“Census all online” queues a credential-surface scan on every online machine (offline ones are skipped and reported). The per-row “Census” does one machine. It collects account names, Credential Manager entry names and service logon accounts only — it never harvests existing passwords (extracting them would be credential dumping; Windows stores hashes).
Manage → Enroll a managed admin
Open a machine with Manage. Set the managed-admin username (default sentineladmin) and a rotation period in days (default 30, 0 = manual), then Enroll/Update — SentinelOps sets, vaults and rotates that local admin’s password on the endpoint, giving you a reliable login into a workgroup box with no DC. “Reveal password” shows the current one on demand (audited).
Manage → Vault a known credential
For a login you are authorized to use on the machine, enter username, password, scope (machine-local / domain / other) and an optional note, then Vault credential. It is sealed at rest and revealed only on demand (audited). Vaulted entries can be revealed or deleted from the same panel.
Credential census (per machine)
Shows the collected surface with its collection time: Local accounts (name, enabled/disabled, admin), Credential Manager entries (names only), and Service logon accounts (service → runs-as). “Census now” refreshes it. Account and slot names only — never secrets.

Management

Deploy agent

Generates the installers that enrol a new endpoint, plus the tools to push the agent onto a machine you can reach. Each installer already knows this management server and carries a single-use, expiring, revocable enrolment token, so a customer’s device joins the right tenant the moment it runs with nothing to configure by hand. Why it is here: enrolment is the front door to everything SentinelOps does, so it is deliberately least-privilege and revocable. Tenant benefit: one reusable, tenant-stamped installer per customer means every machine lands under the correct organization automatically.

Endpoint agents panel
Lists the agent binaries this server serves, per platform, with size, build time and a build fingerprint so you can confirm exactly which build endpoints receive. “Force update all” pushes every endpoint on an older build to the current one now instead of waiting for its self-update timer; “Rebuild agents” recompiles them where a build toolchain is present (otherwise it reports that agents ship with the package). A red “stale” warning means a deployment updated the server and left older agent artifacts behind — fix it before generating installers so endpoints are not handed an out-of-date agent.
Deployment package
Defines what a new device inherits: the OS, the filesystem roots the agent may manage, the group and tags, and how many times the token may be redeemed. Create one, then generate its installer. Treat the resulting URL as a credential and revoke the package after a rollout.
Installer
A one-line command (shell or PowerShell) or, on Windows, a bundled .exe with the token embedded. Hand out the downloaded file, not the URL — the URL embeds the enrolment credential.
This tenant’s agent installer
The one stable installer for the tenant selected in the top bar (no selection = the default tenant; the panel names the tenant it actually stamps). Every device it installs enrols into that tenant. It is reusable and never expires (auto-renewed), so you can keep one .exe per customer. Pick Windows / Linux / macOS: Windows gives a click-to-run .exe plus a PowerShell command; Linux and macOS give a shell command. The link embeds an enrolment credential — hand out the downloaded file, not the URL. To retire it, revoke the “Tenant installer” row under Deployment packages; the next visit mints a fresh one. Needs enrollment.manage.
Windows .exe and Defender
The .exe sets a Windows Defender exclusion for the agent before it installs, so Windows 11 does not quarantine it mid-install. It is not code-signed yet, so SmartScreen shows “Windows protected your PC” — choose More info → Run anyway, as administrator. It installs to C:\Program Files\SentinelOps, registers the SentinelOps Agent service and enrols.
Self-enrollment port-knock (the banner)
A green “Self-enrollment is on” banner means the installers include a port-knock: a machine on a brand-new IP (a cloud VM, a remote site) presents its deployment token, authorizes itself on the agent firewall and enrols with no manual firewall change. If the banner says it is not active, a machine on an IP the agent firewall does not already allow is blocked until its IP is authorized (a cloud VM SentinelOps provisions is authorized automatically). The site-wide toggle lives in Settings → Features.
Agent Launcher / Deploy to a host by IP (the buttons)
With command.execute you get two actions in the header. Agent Launcher takes one or more targets (IP, DNS name, range or CIDR), probes each to auto-detect the OS and transport, then deploys and opens the firewall automatically. “Deploy to a host by IP” installs from an online agent on the host’s LAN using a stored credential — no installer run by hand. The OS picker does not follow your browser, so choose Windows explicitly to get the PowerShell command and the Download .exe button.
“Binary only” is not an installer
The per-agent “Binary only” button downloads the agent program on its own — it does not register a service or enrol the machine, because it carries no server address and no token. Use it for imaging or a manual install where you supply those yourself. To actually enrol an endpoint, create a deployment package and run the installer it generates.
Pinned SSH host keys
The first time SentinelOps connects to a machine over SSH (agent install over SSH, HA node deploy, database provisioning) it remembers that machine’s SSH host key. Every later connection must present the same key, or it is refused before any password or key is sent, which protects vaulted credentials from a spoofed or hijacked address. If a machine was really reinstalled (new keys), click Forget on its row and retry; the next connection pins the new key. A refusal names both fingerprints and is recorded in the audit log. Needs credential.manage.
Never deploy to
A list of IPs and CIDRs (one per line) SentinelOps must never install an agent on — use it for your own workstation and any other machine that must stay unmanaged. Listed machines are never offered as deploy candidates in discovery, and every deploy path refuses them server-side: direct SSH, direct WinRM, proxy-assisted deploy, auto-deploy on discovery, scheduled Agent Deployments and the Agent Launcher. Saving also clears the candidate flag on hosts already discovered. The same list is editable here, in Agent Deployment and inside the Agent Launcher. Invalid lines are rejected with the offending entry named. Needs credential.manage.
Agent Deployment

Install the SentinelOps agent on any reachable host by IP, straight from the server — no on-LAN proxy and no prior discovery. Linux uses SSH (the SentinelOps deploy key or a stored SSH credential); Windows uses WinRM with a stored Windows credential. Why it is here: it lets you onboard servers and cloud VMs you can route to but cannot walk up to, and run it once, at a set time, or on a recurring schedule. Tenant benefit: every host you deploy enrols into the tenant selected in the top bar, and each target’s progress is tracked live so a customer’s fleet comes under management without hand-running an installer on each box.

New deployment — the fields
Name labels the job. Method is Linux — SSH or Windows — WinRM. Target IPs takes one or many (one per line or comma-separated). Login user (SSH) defaults to root. Credential picks the stored SSH or Windows credential to log in with (SSH can instead use the SentinelOps deploy key). “Fresh install (new host)” is ticked by default — untick it to replace the binary on an existing agent rather than do a clean install. WinRM port defaults to 5985. A banner confirms which organization the hosts enrol into.
Deploy key
The server’s own SSH key, reusable across hosts. Authorize its public key once on each Linux host’s authorized_keys and SentinelOps can deploy there without a password. The key is shown in the New deployment form.
When — Now / At / Recurring
Runs immediately (Now), at a set date-time (At), or repeatedly (Recurring with an hourly / daily / weekly cadence). The list auto-refreshes in place and each host shows pending → running → installed / failed with the reason; “Run now” re-runs on demand. Needs credential.manage.
Never deploy to
IPs/CIDRs listed here (one per line) are never deploy candidates and every deploy path refuses them — a deployment targeting one fails for that host with “on the never-deploy list”. Use it for your own workstation. Same list as Deploy Agent → Never deploy to and the Agent Launcher.
Software Library

Install common apps straight from a built-in catalog, or upload your own installer once and push either to a device, group or whole tenant with a button. SentinelOps has it so software roll-out is a central, repeatable, audited action instead of RDP-and-click on every machine. For the tenant it means apps arrive consistently and silently across their fleet; deploying changes endpoints, so it needs software.manage and may require a second approver by policy.

At a glance
The summary counts catalog apps, uploaded packages, how many packages are ready to deploy, and total deployments — so you can see what is available to push and what has been pushed.
Software catalog
A browsable, grouped-by-category list of common apps installable with no upload — driven by each machine’s own package manager (winget on Windows, the native package manager on any Linux distro, Homebrew on macOS). Incompatible machines are skipped automatically. "Install" on a card (or "Install from catalog") opens the deploy picker; "install any app by name" handles anything not listed.
Uploaded packages
"Upload installer" adds your own MSI / EXE / PKG / DEB / RPM / script, stored server-side and SHA-256 verified. Each row shows platform, size and status (ready / uploading % / failed, plus an "internal" badge for internally-owned packages). Deploy (enabled only when ready) pushes the file to each target and runs it silently, tolerating reboot-required exit codes; Edit changes its metadata; Delete removes it from the library (existing deployments are unaffected).
Scheduled deployments
Queue a rollout for later or on a cadence — Once, Hourly, Daily or Weekly — showing next run and enabled/paused state. Pause/Resume toggles it; Delete stops future runs (past deployments are unaffected). A schedule always fires for the package’s current version.
Recent deployments
Per-target status chips update automatically; click a row for the per-machine detail. The ✕ removes only the history record — it does not uninstall anything from any machine.
Deploy scope & approval
Deploying targets a device, a group or a tenant. Because it changes endpoints it requires software.manage and, by policy, may need a second approver before it runs.
Scheduled Jobs

Server-side maintenance that runs on a timetable instead of when you press a button — for example a nightly “Rebuild endpoint agents” job. Why it is here: recurring housekeeping should happen on its own and stay visible, so a job that has been failing quietly is caught. Tenant benefit: jobs are created against the tenant in context, and the last-run status keeps that organization’s routine upkeep honest and auditable rather than depending on someone remembering to run it.

The job table
Each row shows the Job name and its task type, how often it runs (Every), its State (enabled / off) and the Last run — status pill (ok / error / never run), any detail line, and the timestamp. “Rebuild endpoint agents” recompiles agents where a build toolchain is present; otherwise it records that agents ship with the SentinelOps package.
New scheduled job
Enter a Name, choose a Task from the server-provided task types, and a Runs cadence (hourly / daily / weekly). Leave “Enabled” ticked to have it start running on schedule, then click Create job. It is created against the current tenant.
Run now, Enable/Disable, Delete
“Run now” executes a job immediately and reports its status and detail. Enable/Disable turns the timetable on or off without deleting the job. Delete removes it (confirmed first) so it no longer runs.
Time Sync (NTP)

Keeps every endpoint’s clock correct and shows each organization’s true local time across the console. Accurate time is a prerequisite for Kerberos/AD auth, TLS, correlating logs across machines and trustworthy audit trails, so SentinelOps both deploys an NTP policy to endpoints and tracks per-tenant time zones. For a tenant this means its servers and workstations stay synced (new machines auto-apply the policy on enrollment) and schedules, reports and the header clock read in the client’s own local time.

Organization time zones & clocks
A live, to-the-second clock per organization. Pick each organization’s IANA time zone from its dropdown (DST is handled automatically) so its real local time shows in the header clock, schedules and reports. Choosing “— set time zone —” (blank) clears it; the row then reads “time zone not set”.
Deploy now — field by field
Push a time-server config to running endpoints immediately. NTP servers: the list to apply. Scope: All my devices / a tenant / a device group / Domain controllers (authoritative — sets the DC as a reliable w32time source) / specific Device IDs — selecting one reveals its tenant/group/device-ID input. Linux NTP client: Auto (distro default), systemd-timesyncd, chrony, or classic ntpd — which daemon to configure on Linux. “Also save as the policy for this scope” (on by default): persists the setting so future enrollments auto-apply it, not just a one-off push. Click Deploy time servers; a per-device result table shows each machine queued or skipped.
What it configures (and what it can’t)
It configures the OS time service so the clock stays synced going forward — Windows w32time, Linux systemd-timesyncd/chrony/ntpd, macOS. Agent-managed endpoints and virtual hosts are covered here; hardware with no agent (a firewall, switch, WAP or PDU) must be pointed at an NTP server through its own management channel.
Firewall Certificates

Puts the trust a Korthveil firewall needs onto the machines behind it. TLS inspection only decrypts traffic from devices that trust the firewall’s inspection CA; NAC (802.1X Enterprise Wi-Fi) only admits devices that trust the NAC CA and hold their own certificate from the firewall. One profile per CA, deployed to Windows, macOS and Linux with or without the agent.

Certificate profiles
Add certificate profile: paste or pick the CA file Korthveil gives you (Security › TLS inspection › Download CA certificate, or the download icon on the nac-ca row in System › Certificates). Only the public certificate is stored; anything with a private key is refused. Compare the SHA-256 shown with the one on Korthveil’s install page. “Install on every new machine” adds the CA to each machine that enrolls later. A NAC profile also needs the Wi-Fi name and the RADIUS server name from the nac-radius certificate.
Machines with the agent
Install, Check or Remove on every machine, an organization, a group, or ticked machines. Windows: Trusted Root (machine) and Firefox enterprise roots. macOS: the System keychain; when macOS insists on local approval, the user gets a profile to approve and the result says “Waiting for the user”. Linux: the distro trust store, Chrome/Chromium NSS databases and a Firefox policy; missing tools are installed automatically.
NAC device certificates
Pick every device’s .p12 at once. Files are matched to machines by name (laptop-1.p12 → laptop-1), and you enter each one-time password. Each file and password goes only to that machine’s agent as a sealed secret over stdin; neither is stored, logged or shown again. The agent installs the certificate, the CA and the Enterprise Wi-Fi profile (Windows machine authentication, Linux NetworkManager, macOS profile the user approves). Needs agent 0.5.38 or newer.
Issue device certificates from the firewall
Easiest for NAC (Korthveil 1.1.53+). Edit a NAC profile and choose the firewall and its CA name (usually nac-ca). On the firewall, give SentinelOps commit authority (System › SentinelOps RMM) and allow that CA under system.certificates.remoteIssue. Then “Issue device certificates from the firewall” gives each chosen machine its own certificate (named sops-<machine ID>, common name = the machine’s DNS name). The key travels only as a sealed secret to that machine’s agent, which installs it with the CA and the Wi-Fi profile. Running it again renews. “Revoke device certificates”, or removing the machine from SentinelOps, revokes it on the firewall and NAC refuses the machine at once. “Give every new machine its own certificate” does this on enrollment.
Windows domain (Group Policy)
For domain PCs without the agent: the agent on a domain controller creates the “Korthveil certificate - <profile>” Group Policy at the domain root. Its startup script adds the CA, so PCs trust it after their next restart. “Remove from domain PCs” turns the script into a removal; delete the Group Policy afterwards.
Machines without an agent (SSH / WinRM)
An online agent on the same network logs in with a stored credential (Agent Deployment › Credentials) and runs the same install, check or removal. One line per machine: address and os (windows, linux or macos). Only private addresses. NAC device keys are never sent this way.
Results
One row per machine, updated every 5 seconds: Installed, Waiting for the user, Not installed, Removed, Queued or Failed, with what the machine reported.

Infrastructure

BMC / iDRAC

Out-of-band server management over Redfish: control power and reach the console of a physical server through its baseboard management controller (iDRAC / iLO / generic Redfish), which works even when the operating system is hung, crashed or powered off. SentinelOps keeps this because recovering a down server otherwise means a site visit. For a tenant it means a dead or unresponsive server can be power-cycled, reinstalled or driven to its console remotely, with every action audited.

Add BMC endpoint — field by field
Name (e.g. dc1-idrac-01); Address (IP or host:443); Vendor (Auto-detect, iDRAC, iLO or Redfish); Link to device (optional — ties the controller to an enrolled machine); Username and Password for the controller. Tick “Accept the BMC’s self-signed certificate” for the typical lab/appliance cert. The password is sealed in the vault (AES-256-GCM) and never returned. Adding requires credential.manage.
Endpoints list
Each registered controller shows its name, address, vendor and linked device. Status reads live power state and hardware health from the BMC on demand. Delete removes the endpoint and its sealed credential.
Power
Power… opens a Redfish reset: Power on, Graceful shutdown, Force off, Restart, Force restart, Power cycle — each affects the physical power state and asks for confirmation. It also has “Boot to PXE next (once) & reboot”, a one-time network boot that reverts afterward; arm a PXE boot server targeting the machine’s MAC first (see PXE Netboot). Power actions require command.execute and are audited.
Serial console & KVM
Serial console… reports whether Serial-over-LAN is enabled and gives the attach command; KVM… reports whether the graphical console is available and launches the HTML5 KVM viewer — so you can watch POST/boot and operate the machine with no OS.
Virtual media
Virtual media… mounts an ISO to the server over Redfish so you can boot an installer or recovery image remotely, the OOB equivalent of walking a USB stick to the rack.
Hypervisors

Register the virtualization hosts your tenants run (XCP-ng/XenServer, VMware vSphere, Proxmox, Hyper-V, VirtualBox). Why it is here: the hypervisor is the rung above the guest OS agent, so SentinelOps can monitor host health and force power actions on a VM even when its guest is hung or off. Tenant benefit: a customer’s virtual estate gets agentless host monitoring plus last-resort power control and guest-agent deployment, all audited.

Hosts
Each hypervisor/manager you have registered. Credentials are sealed in the vault; Test verifies reachability. Network hosts (XCP-ng/vSphere/Proxmox) are reached by API; Hyper-V and VirtualBox run through the SentinelOps agent enrolled on the host.
Host monitoring (live health)
Every registered host is polled every 2 minutes and its CPU / memory / storage / temperature stored — so a host shows on the Dashboard’s “Hypervisor hosts” panel and inline here as “● Up · CPU x% · Mem y% · Disk z%” (or “● Unreachable”), with an alert raised if it goes unreachable or storage hits ≥90%. “Metrics…” opens the full live view. Collection per type: XCP-ng via XenAPI + the RRD feed (CPU/memory/storage; temperature where the hardware exposes a sensor — many mini/consumer hosts do not, shown blank honestly); Proxmox via the node status API; Hyper-V/VirtualBox from the host’s own agent; vSphere lists hosts + connection/power state via REST and live CPU/memory via the SOAP quickStats. No agent is installed on dom0/ESXi — this is agentless.
ISO storage — create, increase, add ISOs
XCP-ng hosts: “ISO storage…” on the host (also linked from Create VM → Boot ISO) lists every ISO library with its size, used space and ISO count. Create ISO storage carves a FIXED-size library (e.g. 100 GB) out of a local LVM or EXT disk on the host: it is formatted, mounted at every boot and registered as an ISO SR, so it appears in Create VM → Boot ISO and in each VM’s CD drive. “Increase size…” grows a SentinelOps-created library online (no downtime); a plain-folder library already uses the free space of the disk it lives on, so it has no size to grow. “Add ISO from URL…” makes the host download an .iso straight into the library in the background. Requirements: changes need root on the host, so they run through the host’s dom0 SentinelOps agent (Edit… → dom0 agent) and need command.execute; every change first proves that agent is really on THIS host and aborts without touching anything if it is linked to the wrong machine.
Deploy an agent to a node (guest VM)
To manage a *guest* fully (patching, shell, files, native metrics), install the SentinelOps agent inside it: on the host’s VMs… list use Deploy agent, or go to Deploy Agent and target the guest’s IP. Linux guests get a fully-static (musl) build that runs on any glibc — including older ones (Debian 11/12, RHEL/Rocky, and XCP-ng dom0 itself), which a glibc-linked build cannot. Requirements: the guest must reach the server on 8480 (a first enrolment from a new IP is allowed automatically, or add it under Agent allowlist), and outbound 443 for the self-heal tunnel. Agents self-update from the server, so a version bump reaches the fleet on its own. Example: XOA (Xen Orchestra) is a Debian guest — it runs the agent and is monitored like any endpoint.
Detected VMs
Guests the agents report as virtual. Map one to a host to enable “Force reset via hypervisor” on its device drawer. For XCP-ng the VM UUID matches the guest system UUID, so it maps automatically.
Power
Force reset / power on / off / graceful shutdown, straight to the hypervisor. Every action is audited. Requires command.execute.
VM console & boot log
On an XCP-ng host’s VM list: Console opens the live noVNC screen (see it boot); Boot log shows the text side — power state, start time, uptime from the pool master (works with no guest agent, e.g. mid-install) plus this VM’s action history. Both refresh live.
Azure VMs

Create, monitor and operate Azure virtual machines for a tenant directly from SentinelOps, using an app registration (service principal) that authenticates app-to-app — no interactive login, no MFA prompt. Why it is here: it lets you stand up and run cloud compute for a customer without leaving the console. Tenant benefit: each tenant carries its own Azure subscription and sealed credential, so a customer’s Azure estate is managed in isolation. Pick a tenant first.

1 · Register an app in Azure (one-time)
Azure portal → Microsoft Entra ID → App registrations → New registration. Name it (e.g. "SentinelOps"), Register. Copy the Application (client) ID and Directory (tenant) ID. Then Certificates & secrets → New client secret → copy the secret VALUE (not the Secret ID). The same app and secret can serve both Microsoft 365 (Graph) and Azure (ARM) — SentinelOps requests the right scope per token.
2 · Grant it the Contributor role
Portal → Subscriptions → your subscription → Access control (IAM) → Add role assignment → Contributor → assign to the app you registered. Without this the credential authenticates but cannot create or manage VMs.
3 · Connect it here
Paste Subscription ID, Directory (tenant) ID, App (client) ID and the client secret VALUE, then Save & connect. If you already stored the secret for this tenant’s Graph app, tick "Reuse the secret already stored" and leave the secret blank. SentinelOps seals the secret in its vault — the plaintext is never shown again.
4 · Create a VM
Click + Create VM. Choose a name, OS (Linux/Windows), size, location and a resource group. Provide an SSH public key (Linux) or admin password (Windows) — it passes straight to Azure and is never stored. SentinelOps provisions in order: resource group → network security group (SSH 22 / RDP 3389) → virtual network + subnet → public IP → NIC → the VM, waiting for each to succeed. The VM appears in the list within a few minutes.
5 · Monitor & operate
Load / refresh VMs shows each VM’s power state, size/OS and its public + private IPs. Start, Restart and Stop (deallocate) act through the Resource Manager API and are audited. Stop = deallocate, which stops Azure compute billing for that VM.
⚠ Before you create a VM — read this
Creating an Azure VM on a new subscription is frequently blocked by Microsoft-side account limits, NOT by SentinelOps. Expect this and plan for it: (1) a brand-new subscription is a free trial and must be upgraded to Pay-As-You-Go before ANY VM or quota increase (it stays free — credit kept, free-tier VM activated); (2) every VM family starts at 0 vCPU quota, so the first create fails until you raise the family quota; (3) small quota increases can take minutes to hours, and some subscriptions require a support ticket that Microsoft reviews; (4) requesting quota too many times in a short window gets the quota API throttled by Azure for up to 24 hours. So: raise the quota you need ONCE, then wait — do not retry in a loop. The free-tier size is currently Standard_B2ts_v2 (Microsoft replaced B1s and did not announce it).
Capacity / quota note
New subscriptions often have a per-VM-family vCPU quota of 0, so Azure refuses every size and reports it as "SkuNotAvailable / Capacity Restrictions" (misleading — it usually means quota, not real capacity). Use Diagnostics & Azure restrictions → Check quota to see the real numbers, request an increase with POST /v1/azure/quota (once), or file a portal support ticket. A quota error like "exceeding approved standardBsv2Family quota" means the size HAS capacity and only needs its family quota raised.
If the quota request keeps failing — troubleshooting
Being on Pay-As-You-Go lets you REQUEST quota but does not bypass a 0 family cap — a VM still needs its family limit ≥ its vCPU count (the smallest available burstable, Standard_B2ts_v2, needs 2). Some subscriptions reject the self-service quota API outright: the request shows "Failed" in Diagnostics with no limit change, even for 1–2 vCPU. When that happens the reliable path is a PORTAL SUPPORT TICKET: Help + support → New support request → "Service and subscription limits (quotas)" → "Compute-VM (cores-vCPUs) subscription limit increases" → your region → the family (e.g. Standard Bsv2 Family) → the vCPU count. Free under Basic support, usually minutes–hours. Note there is often no 1-vCPU B-family available (only the v2 burstables, min 2 vCPU). To validate an agent on a cloud VM meanwhile, use a different connector (e.g. Linode): spin the smallest instance, it auto-enrols via cloud-init, confirm it, then delete — the SentinelOps agent is provider-agnostic.
Linode Cloud

Create, monitor and operate Linode instances (and LKE Kubernetes) for a tenant using a Linode Personal Access Token. Why it is here: it gives you token-gated cloud compute whose VMs enrol themselves — new VMs auto-install the SentinelOps agent on first boot and self-enroll through the agent firewall. Tenant benefit: the Linode token is stored per-tenant and sealed in the vault, and every VM you create lands in the tenant you choose and appears in Devices within minutes. Pick a tenant first (top pulldown or the tenant strip).

1 · Get a Linode API token (one-time)
Linode Cloud Manager → Profile → API Tokens → Create a Personal Access Token with Read/Write scope. Copy it. Example: create it under the account that owns the VMs you want SentinelOps to manage.
2 · Connect it here
Select the tenant (e.g. Linode SYS) → Infrastructure → Linode Cloud → paste the token → Verify & connect. SentinelOps checks it against Linode, then seals it in the vault (never shown again). Use "Edit token" later to replace or disconnect. The Tenant pulldown at the top of the page switches which tenant’s Linode account you manage — it works even under "All Tenants".
3 · Create an instance (auto-agent)
Click + Create instance. Choose: Enroll into tenant (where the agent lands — defaults to the current tenant); Region; Plan (each shows $/mo — Nanode is $5/mo); Image/OS (leave Ubuntu 24.04 — the agent needs glibc ≥ 2.38, so avoid Ubuntu 22.04 / Debian 12 / Rocky 9); Root password (leave blank to auto-generate a strong one, shown once and also saved to the tenant’s credential vault); keep "Auto-deploy the SentinelOps agent" checked. Click Create.
4 · Watch it come up
The instance list auto-refreshes (a "● live" marker). It progresses provisioning → booting → running, and the In SentinelOps column goes not enrolled → enrolling… → ✓ <tenant> in ~2 minutes. It then also appears in Devices under that tenant. No manual steps — the deploy uses a Linode StackScript, and SentinelOps authorises the new VM’s IP on the agent firewall automatically.
5 · Cost & tenant match
Each running instance shows its Cost/mo plus an estimated monthly total. The In SentinelOps column shows exactly which SentinelOps tenant each VM is enrolled in — matched by the Linode instance ID stamped on the device (falls back to IP/label). To move a machine to another tenant later: its device drawer → Move to tenant, or Bulk Actions → Move selected to tenant.
6 · LISH console & custom OS (FreeBSD)
Console on a row opens Weblish (serial shell) and Glish (graphical). Linode has no FreeBSD image — to install FreeBSD or a fully custom OS, create the instance, then use Glish + Rescue mode to install it by hand.
7 · Kubernetes (LKE)
+ Create cluster under LKE: label, region, Kubernetes version (1.36/1.35), node plan and count. Kubeconfig downloads once the cluster is ready. Bigger spend than a single VM (≈$12/mo per node + control plane).
If a VM does not enrol
Rare, but: click Deploy agent on the un-enrolled row for the exact one-line command, open the instance Console → Weblish, log in as root (the saved root password) and paste it. Make sure the OS is a modern release (Ubuntu 24.04+, Debian 13, Rocky/Alma 10, Fedora).
AWS EC2

Connect an AWS IAM access key per tenant, then list, launch, power and terminate EC2 instances — launched instances self-enroll the SentinelOps agent on first boot (cloud-init user-data). Why it is here: it brings a customer’s AWS compute under the same enrol-and-manage flow as every other cloud. Tenant benefit: the access key + secret are verified against AWS then sealed in the vault per-tenant (secret never shown again), so a customer’s EC2 estate is isolated and every launched VM enrols into their tenant. Pick a tenant first.

1 · Create an IAM access key (one-time)
AWS Console → IAM → Users → your user → Security credentials → Create access key (or create a dedicated IAM user with an EC2 policy such as AmazonEC2FullAccess). Copy the Access key ID and Secret access key. The secret is shown only once by AWS.
1b · Or use temporary SSO/STS credentials
Instead of a long-lived key you can paste temporary credentials from AWS SSO or an assumed role (access key ID starting ASIA…, secret, and a session token). Run "aws sts get-session-token" or copy them from the AWS access portal / "aws configure export-credentials", then paste all three (including the Session token) into the connect form. Temporary creds expire — typically ~12h — and the panel shows a "temporary" badge; when EC2 calls start failing with an auth error, reconnect with a fresh session token.
2 · Connect it here
Select the tenant → Infrastructure → AWS EC2 → paste the Access key ID + Secret access key + a default Region (e.g. us-east-1) → Verify & connect. SentinelOps validates it with DescribeRegions, then seals the secret in the vault. Requires tenant.manage. Use Disconnect later to remove it.
3 · Launch an instance (auto-agent)
Click Launch instance. Enter a Name, an AMI ID for your region (find it in the EC2 console → AMIs — e.g. an Ubuntu 24.04 or Amazon Linux image; the agent needs glibc ≥ 2.38 so avoid old images), pick an Instance type, optionally a Key pair name for SSH, and keep "Install the SentinelOps agent on first boot" checked. Click Launch — it self-enrolls in ~1–2 min via cloud-init.
4 · Watch it enroll
The instance list shows Status and the In SentinelOps column. A fresh instance has no public IP for a moment; refresh and it fills in, and once the agent phones home the row shows the tenant it enrolled into. The new instance also appears in Devices. SentinelOps authorizes the VM’s public IP on the agent firewall at create time.
5 · Power & terminate
Per-row Start / Stop / Reboot map to EC2 StartInstances / StopInstances / RebootInstances. Terminate calls TerminateInstances and then decommissions the matching SentinelOps device and revokes its firewall grant — it does not delete the device record (audit trail preserved).
If a VM does not enroll
Confirm the AMI is a modern Linux (glibc ≥ 2.38), that the instance got a public IP (or is reachable), and that outbound 8480 to the server is open in its security group. You can also SSH in with your key pair and run the one-line install command from the Downloads portal manually.
Cloud VMs

Connect DigitalOcean, Vultr or Hetzner Cloud with a single API token per tenant, then create VMs that install the SentinelOps agent on first boot and self-enroll through the agent firewall (port-knock). Why it is here: it extends the same token-gated, auto-enrolling cloud lifecycle as the Linode connector to three more providers, unified under one view. Tenant benefit: a customer’s VMs on any of these clouds come under management automatically, each matched back to the tenant it belongs to.

Pick a tenant first
Cloud connectors are per tenant — select a tenant in the top bar, then choose a provider tab. Each tab shows whether that provider is connected for this tenant.
Connect a token
Paste the provider’s API token (DigitalOcean personal access token, Vultr API key, or Hetzner Cloud project token). It is verified, then stored encrypted in the vault and never shown again. Requires tenant.manage.
Instances
Lists each VM with status, IPv4, estimated monthly cost, and which SentinelOps tenant it is enrolled in (matched by IP, then name). Reboot or delete with command.execute — deleting decommissions the device and revokes its firewall grant.
Create VM
Choose region, plan and image; leave agent install on to have the VM self-enroll. Its public IP is authorized on the agent firewall at create time and it also knocks on first boot.
Cloud Costs

A cross-cloud rollup of estimated monthly spend per tenant, summed from every connected cloud connector. Why it is here: once you create VMs for customers across clouds, someone has to see what it costs — in one place. Tenant benefit: each customer’s cloud spend is attributed to their tenant and totalled honestly; figures come from each provider’s published plan pricing, and providers billed by consumption that cannot be priced yet show "n/a" rather than a guessed number, so the total is never fabricated.

Estimated monthly total
A headline card: the summed monthly spend across every tenant you manage and every connected provider that can be priced, with the currency and the number of tenants it covers.
Per-tenant table
Each tenant with a connected cloud, the providers in play (each as a chip showing its own monthly estimate, or "n/a" with a reason when it cannot be priced), and the tenant’s total. Linode is priced from its plan pricing today; other connectors populate as they gain pricing support. An empty table means no connected cloud has billable instances yet.
Requires billing.view
Cost figures are gated behind the billing.view permission, like the Microsoft 365 / Services bill.
PXE Netboot

Network-install machines that have no BMC. You drive it from anywhere, but PXE is a local-network protocol: SentinelOps arms an online Linux endpoint on the SAME LAN segment as the targets and it serves the boot there — there is no netboot across the internet. For a tenant this means bare-metal or wiped machines can be (re)imaged at a site without a technician carrying install media, optionally fully unattended, and diverting only one target so a live network is safe.

One-time setup
Upload the iPXE firmware (undionly.kpxe for BIOS, ipxe.efi for UEFI, from ipxe.org) and your OS ISO into the ISO library — the Arm form reads both from there.
Arm boot server — field by field
Boot-server endpoint: an online Linux endpoint ON the target LAN segment. OS image: the install ISO from the library. BIOS firmware / UEFI firmware: select at least one iPXE firmware. Target machine MAC (optional): if set, ONLY that machine is diverted to the installer and everything else on the segment boots from local disk. Unattended install profile (optional): an answer file for a hands-off install. Armed window (minutes, default 30, 1–720): the session self-expires at the end. Segment note (optional): a label like “Branch office VLAN 40”. SentinelOps pushes the files to the endpoint and runs a time-boxed proxyDHCP + TFTP + HTTP boot server; proxyDHCP COEXISTS with the site’s DHCP and never assigns addresses.
Boot servers table
Armed sessions show the endpoint, image, status (arming → active → failed/expired) with the expiry time and any detail. Boot log opens the targeted machine’s live boot timeline — DHCP → firmware → kernel/initrd → answer-file fetches → installer steps, refreshing while open. Disarm stops a session early.
Unattended install profiles — field by field
New profile (or Edit): Name; OS family (ubuntu/debian/rhel/windows/generic); Kind (autoinstall/preseed/kickstart/cloud-init/unattend); the Answer file body; and optionally Kernel (vmlinuz) + Initrd chosen from the ISO library plus a Kernel-args override (`{base}` = the boot-server URL). With a kernel + initrd attached the install is fully hands-off; without them the machine boots the ISO and the installer must fetch the answer file itself (the table’s Kernel-boot column shows “yes” vs “sanboot only”).
Boot to PXE next & boot media
To make a machine PXE-boot once without touching it: BMC / iDRAC → Power → “Boot to PXE next”, or an enrolled Linux box’s device drawer → “Boot to PXE next” (UEFI BootNext + reboot); otherwise Wake-on-LAN a machine already set to netboot. For hardware/VMs with no PXE ROM, download ipxe.iso / ipxe.usb (uploaded to the ISO library) from the Boot media panel, burn/attach it, and it finds the armed boot server automatically.
Limits
One armed endpoint covers one segment; boot-server endpoints must be Linux; the ISO must be iPXE-sanboot-able; the window self-expires and Disarm stops it early.
Power / Out-of-Band

Recover a machine that is off, hung or wedged without anyone on site, by controlling a switched PDU’s outlets or reading a UPS over SNMP. SentinelOps keeps it as the bottom rung of the power hierarchy — for kit that has no BMC. For a tenant it means a frozen appliance can be hard power-cycled remotely and a site’s UPS health (battery, runtime, load) is visible before an outage, with every switching action audited.

PDUs
Add a switched PDU to turn individual outlets On / Off / Cycle. Each outlet shows its live state (on/off/unknown); Off and Cycle ask for confirmation because anything plugged in loses power immediately. The SNMP community/secret must have WRITE access to actually switch outlets.
UPS
Add a UPS (RFC-1628 UPS-MIB) and “Refresh status” reads battery status, charge %, minutes of runtime, load % and output source. Status only — a UPS has no outlets to switch here.
Add power device — field by field
Name (e.g. “Rack A PDU”); Address (IP/host) + Port (default 161); Type (PDU switched, or UPS); Profile (built-in APC rPDU, a Generic PDU, or UPS RFC-1628 — selecting UPS forces the RFC-1628 profile); SNMP version (v2c → Community with write access; or v3 → user, Auth proto SHA/MD5 + pass, Priv proto AES/DES + pass); Outlet count for a PDU (default 8). A Generic profile also asks for the Control OID base (the outlet index is appended) and the integer values it expects for On/Off/Cycle. Note is optional. An address is required; the community/v3 secret is sealed in the vault and never returned.
Refresh status & remove
Refresh status re-reads the device over SNMP. Remove takes the PDU/UPS out of SentinelOps only — the hardware itself is untouched. Every power action is audited (operator, device, outlet, result).
Which tool to reach for
Wake-on-LAN powers a machine on; a PDU hard-cycles a wedged one; a BMC does both plus bootable media (see BMC / iDRAC); PXE / BMC virtual media reinstall it. Wake-on-LAN policy classes (device drawer → Wake-on-LAN → Policy…) auto-enable WoL on the ticked device classes — Windows/Linux servers and workstations, macOS, hypervisors — or on devices carrying a listed tag.
SNMP

Brings devices that can’t run an agent — switches, firewalls, printers, UPS units, PDUs — into the same monitoring, rules and alerts as everything else, by polling them over SNMP. Enrolled machines report SNMP-equivalent MIB data through their agent automatically; agentless gear is added as a per-organization paid add-on. The benefit to a tenant is one health picture across managed and unmanaged network kit, with polling run from a collector on the customer’s own LAN so SNMP traffic never leaves it.

Managed machines
The top table lists every enrolled endpoint in scope — these report SNMP-equivalent MIB data through their agent with no target to configure. Click a row to highlight it, then “View SNMP →” (or press Enter) to open that machine’s live stats and readings.
SNMP targets table
Each agentless target shows its address:port, version, whether it is polled by the server or “via agent”, how many features/custom OIDs it collects, an on/off state, the last poll status (ok/error/never) with any error, and the latest values read. Values feed the same per-tenant monitor rules and alerts as agents do.
Add SNMP target — field by field
Organization: which tenant owns the target (SNMP must be enabled for it — see Add-on). Name: a label, e.g. “Core switch”. Address + Port (default 161): the device to poll. Version: v2c (enter a Community string) or v3 (authPriv — v3 user, Auth protocol SHA/MD5 + Auth password, Priv protocol AES/DES + Priv password). Secrets are sealed in the vault and never shown again. Features to collect: tick the metrics under each category (vendor/custom scopes noted). Advanced → custom OIDs: one `metric_key = OID` per line for anything not in the feature list. Interval (default 60s): how often to poll. Collector: “Server polls directly”, or pick an on-LAN agent so polling originates inside the customer network. Enabled: start polling immediately. You must give at least one feature or one custom OID. Click Add target.
Per-target actions
Features edits which metrics that target collects; Disk/Apps configures disk-space and running-application checks for it; Poll forces an immediate read and shows the result; Disable/Enable pauses or resumes polling; Delete stops polling and removes the target’s synthetic device.
MIB Workbench & Manage MIB features
MIB Workbench (top-right) is the power tool: probe a single OID live (GET or WALK, read-only), bulk-create MIB features by pasting `metric_key = OID` lines from a vendor MIB, assemble named MIB sets and deploy them across a tenant or the datacenter, and build a monitor rule aimed at specific machines. Manage MIB features edits the catalog of features the Add form offers.
Add-on gating
Agentless SNMP targets are a subscribed feature enabled per organization. If the chosen organization doesn’t have it, the Add form blocks with a notice; an operator with the right permission gets an “Enable SNMP add-on” button inline. Managed-machine SNMP (via the agent) is not gated.
Switch Ports

Maps what is plugged into which switch port — and which access point a Wi-Fi client is on — read read-only from a switch over SNMP (its MAC-address table plus LLDP) or from a UniFi controller, then correlated back to your known devices. SentinelOps keeps it so an operator can answer “where physically is this device?” and trace a cable without walking the rack. Each device’s switch+port (or AP) then also shows on its Discovery row. Nothing is ever written back to the switch.

Scan a switch (from the server)
Pick an SNMP target — a switch added under Infrastructure → SNMP — and click “Scan from server”. The server walks it over SNMP (this can take a moment) and builds the port map.
Scan from an agent
For a switch or AP the server can’t reach (a remote site), pick an on-LAN online agent, enter the switch/AP IP and a read-only SNMP community, and “Scan from agent” — the agent on that LAN walks it and reports back. A Wi-Fi client learned on an AP radio is located to that AP.
Wi-Fi controllers (UniFi)
Add a UniFi Network controller to locate Wi-Fi clients to their AP, SSID and signal. Fields: base URL (:443 for UniFi OS UDM/CloudKey, :8443 for self-hosted), username, password, site (default), and the “UniFi OS” checkbox. Test verifies the connection and reports client/AP counts; Add saves it (read-only — it only reads the client + device tables); Sync now refreshes; Remove deletes it and its client locations. Use a read-only/limited admin account.
Read the port map
Each port shows its name/alias, up/down status, any LLDP neighbour (and its port), and the connected device(s) matched from the MAC table. “+N unmatched MACs” means MACs seen on that port that don’t map to a known device; a device tagged “(discovered)” was seen on the network but isn’t an enrolled endpoint.
Rescan when things move
Each mapped switch’s header shows port/MAC/matched counts and when it was last scanned; Rescan refreshes it after re-cabling or moving equipment.
Cameras

IP security cameras detected on a tenant’s networks — wired and wireless — recognised by MAC vendor and RTSP/ONVIF ports. SentinelOps keeps it so the cameras on a client site are inventoried and viewable alongside everything else it manages, rather than being an unmanaged blind spot. For a tenant it surfaces every camera with its physical location and a one-click way to view it, snapshot it or reach its web UI.

Scan & summary
“Scan for cameras” re-runs detection through an on-site agent (a Wi-Fi machine finds wireless cameras; any agent finds wired ones). The summary tiles count cameras, distinct brands, wireless cameras and how many are managed; brand chips show the vendor spread.
Camera list
Each row shows the camera’s name/brand (with a “(likely)” note when confidence is lower), its IP / hostname / MAC, and its location from Switch Ports / UniFi mapping where known.
View actions
Live streams the camera via an on-LAN agent (ffmpeg → HLS); Snapshot grabs a still through an on-LAN agent; Web UI opens the camera’s own page; RTSP copies the vendor RTSP stream URL. RTSP URLs are vendor templates — some models use a different path, which you can override per camera.
Edit a camera
Edit sets the Name, a Location note, an RTSP path override, a Saved credential (a “Camera / NVR login” stored encrypted under Users & Identity → Deployment credentials, reused for snapshots and live view), free-form Notes, and a “Not a camera — hide from this list” checkbox to dismiss a false positive.
Network Inventory

VoIP phones and PBXes, the network services running on each host, and the software census across the fleet — in one read-only view. SentinelOps keeps it so an operator can see a tenant’s telephony estate, what each host is actually exposing, and which software is installed where, without a separate scanner. It is strictly read-only: SentinelOps detects and manages VoIP devices, services and metadata but never intercepts or records call audio. Use Refresh to reload; the data comes from network discovery and agent inventory.

VoIP tab
Three groups: IP phones (identified by vendor — Polycom, Yealink, Grandstream… — or SIP ports 5060/5061, with their IP, brand, SIP ports, location and managed/seen status); PBX / SIP servers (Asterisk, FreePBX, FreeSWITCH, 3CX); and Softphones found in installed-software inventory (Zoom, Teams, Zoiper, Bria, MicroSIP…) with how many devices carry each. Empty groups explain how to populate them — run a network scan from an on-LAN agent.
Services tab
One row per host with detected open services: hostname/IP, an identity guess (vendor · role), the open services as port pills, and any HTTP-server or SSH banner. Populated by running a network scan from an on-LAN agent (Discovery → scan).
Software tab
The installed-software census across managed endpoints — each product with how many devices carry it and the versions in the field, sorted by install count. Endpoints report this on heartbeat once the “Installed software” collector is enabled; full detail is also in the Software Catalog view.
Firewalls

A per-tenant inventory of client firewalls with live health — management-plane reachability and latency, and, when linked to an SNMP target, model, uptime, interface up/down counts and CPU. SentinelOps keeps it so a firewall that silently dies is caught before the client reports an outage. This is monitoring, not rule management; adding a firewall requires the credential.manage permission.

Reachability and latency
Each card shows an UP / DOWN / “not polled” pill and the management-plane latency in milliseconds, with when it was last polled — a quick health signal from the management interface answering, even without SNMP.
SNMP health
Link an SNMP target and the card fills in model, uptime, interfaces up/down and CPU percent. Without a linked target those tiles read “—” and the card notes that model/uptime/interface/CPU health needs an SNMP target.
Poll, scope and remove
Poll re-checks a firewall on demand rather than waiting for the automatic cycle. This view is monitoring only — deep, per-vendor rule management shows “integration required” and isn’t wired in. Remove takes the firewall out of SentinelOps but changes nothing on the device.
Application Monitoring

Synthetic uptime checks for the applications and services a tenant depends on — the server actively probes each target on a schedule and records whether it responded, with uptime history. SentinelOps keeps it so a dead web app, database port or mail service is caught by proactive probing rather than a user complaint. For a tenant it means a live up/down + latency picture of its key apps, and (where priced) a per-product monitoring cost that feeds its bill. Creating and editing monitors needs the alert.manage permission.

Monitor a machine (from the catalog)
Pick a system that has an agent installed, then “Manage applications →” to browse and toggle the applications to monitor on it — no typing. This is the easiest path: choose, for example, Microsoft SQL Server on a host and the probe type and port are filled in for you.
Add a standalone monitor — field by field
+ Monitor opens a form: Application (optional — pick from the catalog to pre-fill type/port/expected-status); Name; Type (http, https, tcp, sql, postgres, mysql, smtp, redis, ldap, rdp or ssh); Target (a URL for web checks, or host[:port] for a service check — a catalog pick completes a bare host with its default port); Expect HTTP status (0 = any 2xx/3xx); Interval in seconds (default 180); and “Body must contain” for an HTTP keyword check. HTTP/HTTPS issue a real GET; other types are a TCP connect to the port.
Read a card
Each monitor is a card: type and target, an OK / FAIL / “not checked” pill, when it last ran, any detail/error line, and tiles for status, latency, HTTP code (web checks) and uptime percent. Uptime is colour-coded — green at 99%+, amber down to 95%, red below — over the sample count shown.
Check on demand & drill in
Check runs that probe immediately instead of waiting for the next scheduled run — handy right after a fix. Opening a monitor shows its latency chart, up/down timeline and recent checks, plus “Inspect now” which asks the endpoint for live connection counts and (on a MySQL/MariaDB or Redis deep check) service stats.
Monitoring cost
With billing.view a cost panel sums enabled monitored products × their per-product monthly price, per tenant, and merges into each tenant’s Billing view. With billing.manage, “Edit prices” sets the currency, a default price and per-product prices.
Databases

Monitor a tenant’s database servers across the fleet and run READ-ONLY queries against them. Checks run on the endpoint via its agent and credentials are vaulted — the password is never placed on a command line. SentinelOps keeps it so DB liveness and key metrics sit alongside the rest of the fleet’s health and an operator can inspect data without a separate tool or a direct network path. It is deliberately read-only: nothing here can change a tenant’s data. Managing databases needs alert.manage; the query console needs database.query.

What it monitors
Full metrics (liveness, version, connections, size, uptime) and a read-only query console for the deep-supported engines: MySQL/MariaDB, PostgreSQL, SQL Server, Redis and MongoDB. Oracle, Db2, Elasticsearch/OpenSearch, InfluxDB, CouchDB, etcd, Neo4j, Firebird, SQLite, DuckDB and H2 are monitored for reachability and version (cards tagged “reachability”); deeper support comes later.
Status and metrics
Cards are grouped by engine family and show UP / DOWN / ERROR with latency, key metric chips (DBs, size, connections, uptime, keys) and trend graphs from the rolling check history. SentinelOps re-checks on the interval you set and raises an alert when a database stops responding.
Read-only query console
On a deep-supported engine, “Query” opens a console that runs only read statements (SELECT / SHOW / EXPLAIN / INFO …). Writes — INSERT/UPDATE/DELETE/DROP/FLUSHALL and the like — are refused, and every query is audited. Use a read-only database account for least privilege.
Per-card actions
Check queues an immediate re-check; Edit reopens the form (engine and machine are fixed after creation); ✕ removes the monitor after confirmation — the database itself is never touched.
Bandwidth

Caps how fast agents pull large transfers — agent self-updates and software downloads — so a fleet-wide rollout doesn’t saturate a thin or metered site link. The cap is a per-tenant policy pushed to every agent on its next heartbeat. SentinelOps keeps it so maintenance never knocks a client’s internet offline; the tenant benefit is that a rollout to a small-pipe site stays in the background instead of starving everything else. Changing it needs the tenant.manage permission.

Set the cap — the field
Download cap (KB/s, 0 = unlimited): enter a number and Save cap. The agent enforces it on large downloads only; heartbeats and job polls are never throttled. For reference 1024 ≈ 1 MB/s, 5120 ≈ 5 MB/s, and 256 suits a very thin link. The panel shows the current cap in human terms and when it was last updated.
How it applies
The saved cap is not instant everywhere — each agent picks it up on its next heartbeat, so allow a short delay before a rollout is actually rate-limited.
When to use it
Reach for a cap before pushing an agent update or a large software deployment to a site on a slow or metered connection, then set it back to 0 afterward if you want full speed for normal operation. Without tenant.manage the cap is read-only.
Peer Cache

Download once per site: designate a reliable always-on agent as a cache peer and its neighbours on the same LAN pull artifacts from it (hash-verified) instead of each fetching over the internet. SentinelOps keeps it so a rollout to a site with many machines doesn’t multiply its internet usage. For a tenant on a thin or metered link it means one download per site rather than one per machine. Designating a peer needs the tenant.manage permission.

Designate a peer — the field
With tenant.manage, pick a dependable always-on machine (a server is ideal) from the dropdown and click “Make cache peer”. Only eligible machines appear: an agent must report a private LAN IP, which needs the peer-cache-capable agent build — machines without one are listed as ineligible.
How members pull
Each peer serves co-located agents on its /24 subnet. Members download from the peer over the LAN, verify the hash, and fall back to the SentinelOps server automatically if the peer is missing the artifact or is offline.
Site cache peers table
Each peer shows its name, LAN IP, derived /24 subnet, port, online status and member count. Remove takes a machine out of the peer role.
What it covers today
The cache currently backs the agent self-update channel, with the same peer path extending to software deployments. End-to-end verification needs two agents on one LAN.
WireGuard Access

Gives SentinelOps a secure way into a client network by turning an on-site agent into a site gateway: it tunnels out to the SentinelOps hub and routes into the LAN subnet(s) it advertises. SentinelOps keeps this so an operator can reach devices that have no agent (printers, switches, appliances) behind a customer’s firewall without port-forwarding. It is strictly tenant-scoped — a gateway only ever exposes its own tenant’s subnets.

How a gateway works
You pick an online, non-mobile foothold agent on the client’s network. The agent generates its own keys (the private key never leaves it), installs WireGuard if needed, makes an outbound tunnel to the hub, and advertises the subnet(s) you named. Because the tunnel is outbound it works through NAT/firewalls with nothing to open inbound.
Site gateways table
Each gateway lists its device, overlay IP, the advertised LAN(s), and status: up / bringing up… / error / down. An error row shows the last error (hover for the full text) so you can diagnose a tunnel that won’t come up. The header also shows the hub endpoint the gateways connect to.
Remove & platform support
Remove tears the tunnel down after confirmation; the LAN is no longer reachable through that gateway. Linux gateways are verified; Windows (WireGuard service + NAT) and macOS (wg-quick + pf) are supported and being validated.
Tenant Mesh

One encrypted WireGuard overlay per organization. When enabled, every eligible agent in the tenant joins it and gets a stable overlay IP, so machines on different networks — different offices, home workers, cloud VMs — can reach each other directly by that IP. SentinelOps keeps it so a tenant’s fleet behaves like one flat private network regardless of where each machine physically sits, with keys generated on each agent and traffic hub-relayed so it works through any NAT. Configured per tenant; off by default.

Pick an organization first
The mesh is per tenant. Choose an organization in the header selector; without one the page just asks you to pick a tenant.
Enable / disable
The header toggle turns the mesh on or off for the tenant. Enabling enrolls every eligible (non-mobile, non-pinned) agent — a real network change, so it confirms first; agents join as they check in. Disabling tears every member’s tunnel down. The subheading shows the overlay subnet, how many members are up, and whether it is machines-only or site-to-site.
Site-to-site LAN routing
When enabled, the “Also route each machine’s LAN across the tenant” checkbox controls scope. Off (the default) = machines-only: each machine is reachable by its overlay IP. On = also advertise each member’s LAN subnet across the mesh; a subnet that overlaps another member’s is flagged “LAN conflict” and not advertised, though that machine is still reachable by its overlay IP.
Members table
One row per agent: machine, overlay IP, advertised LAN(s), status (up / bringing up… / error / down, with the last error on hover), and last handshake. Only non-mobile agents join, and any device you’ve pinned (no-auto-update) is skipped since bringing up a tunnel is a real change.

Governance

Legal Hold

A single on/off litigation-hold switch for the whole tenant that freezes destructive management actions so records are preserved. Why it is here: when a matter requires preservation, retention and clean-up must stop immediately and provably across the organization. Tenant benefit: while active, SentinelOps refuses to decommission devices, delete records or prune storage for that customer, so evidence cannot be quietly removed — and it is a management-plane lockdown only, so it never locks users out of their machines. (For case-by-case preservation with matters, holds, custodians and evidence, use Litigation Holds.)

Place a hold
Enter a required Reason (a case number / matter reference) and Place hold — confirmed first, and audited with who placed it and when. The summary then reads ACTIVE.
While a hold is active
Destructive management actions on this tenant’s devices — decommission, record deletion, storage pruning — are refused; removing a protected device is blocked until the hold lifts. Normal management and user activity continue.
Release hold
Release (confirmed first) lifts the lockdown and allows destructive management actions again. The release is audited.
Litigation Holds

Case-by-case evidence preservation: a Matter owns one or more preservation Holds, each Hold covers Resources (devices, mailboxes, users) and Custodians, and preservation is reference-counted so a resource stays preserved until the last hold covering it is released. Why it is here: real legal matters need scoped, custodian-aware preservation and a defensible chain of custody, not just a blanket freeze. Tenant benefit: a customer’s devices under an active hold are exempt from retention and cannot be decommissioned, and collected evidence is hashed and logged end to end. (For a simple whole-tenant freeze, use Legal Hold.)

Dashboard & matters list
The KPIs count Active matters, Active holds, Devices on hold, Evidence items and Pending overrides. The Matters table shows Ref, Name, Status, Type, Jurisdiction and Created — click a matter to manage it. Creating a matter needs legal.matter.manage.
New matter
Capture the Matter name, Type, Priority (Normal / High / Critical), Tenant (when managing several), Jurisdiction and Description. Every action on the matter is written to its own append-only trail.
Preservation holds
Inside a matter, create holds (legal.hold.manage), Activate or Release them, and add devices/resources to an active hold. While a resource is covered it is exempt from retention and cannot be decommissioned — removing such a device is blocked until the last hold lifts.
Custodians
Add the people responsible for the preserved data (legal.custodian.manage), each with name, email, department and job title, so the matter records who holds what.
Evidence & chain of custody
With legal.evidence.collect, “Collect evidence” snapshots endpoint activity and device inventory for every device under an active hold into sealed, hash-verified evidence (SHA-256). Each item shows an integrity-ok / INTEGRITY FAIL pill. Viewing evidence needs legal.evidence.view.
Timeline
With legal.audit.read, the matter shows a timeline of every action (what, who, when, result) so the chain of custody is auditable from open to release.
Audit trail

The attributable record of operator and agent activity — who connected, who ran what, files transferred, settings changed, and the result. Why it is here: auditability is a first-class goal, so every privileged action is recorded and tamper-evident (the underlying log is SHA-256 hash-chained; verify it under Data & Audit). Tenant benefit: it gives a customer and their provider a defensible, searchable history of everything done to their estate.

Filter
A single search box narrows the list by action, actor, device id, source IP or result; the header shows “X of Y events”. The newest events are shown first. Clear the box to see everything again.
Reading an event
Each row shows the action and timestamp, then the actor and — where relevant — the device id, source IP, and a red result when the action did not succeed.
Exporting as evidence
This view is read-and-filter only (there is no export button on this page). To export the trail as evidence, use Reporting (the “Audit export”, which needs the audit permission) or the tenant/system export under Data & Audit. The chain-integrity check also lives under Data & Audit.
Reporting

Generate reports from live fleet, activity and audit data, save them as reusable templates, schedule them and review past runs. Why it is here: customers and internal reviews need point-in-time exports built from what you can already see, scoped to the right tenant. Tenant benefit: every report is scoped to the tenant in context, so you hand a customer defensible figures (inventory, health, audit evidence) without hand-assembling them.

Generate a report
Pick a Report type and a Format (CSV or JSON). “Preview” renders it inline with a row count; “Download” saves the file; “Save as template” keeps the configuration for reuse. Reports are built from data you can already see, scoped to your tenant.
Report templates
Saved report definitions. The table shows Name, Report type, Format, Schedule and Last run. “Run” generates a run now; a template with a daily or weekly schedule generates runs automatically. Delete removes the template (its run history is kept).
Scheduling
When saving a template, type daily or weekly to schedule it, or leave it blank for on-demand only. Scheduled templates produce runs without anyone pressing a button.
Run history
The recent runs (Report, Format, Rows, By, When) so you can see what was generated, by whom and when. Exporting the audit trail specifically needs the audit permission.
QBR & Business Reviews

Assembles per-customer business reviews from real managed-device, patch, security, network and Microsoft 365 data, with honest scoring that never dresses up gaps as compliance. Why it is here: a quarterly/periodic review is how an MSP shows value and plans work, and it must be defensible rather than optimistic. Tenant benefit: it gives a customer a health score and narrative built only from devices SentinelOps actually manages, with offline/unassessed devices shown as coverage gaps — so “no issues” is never confused with “no data”.

Create a review
Pick a customer in the tenant selector (required), then “Create QBR”, choose a period (recent quarters) and a report type (Standard, Executive, Technical, Security or vCIO). It is created empty; generate it to assemble the data.
Honest scoring
Only devices SentinelOps actually manages are included, and offline or unassessed devices are shown as coverage gaps — never counted as compliant. Each metric carries a freshness/coverage chip (current / delayed / stale / no data / not configured), and when some sources are not connected the confidence is marked provisional rather than shown as “Excellent”.
Open a report
The list shows each review’s Period, report type, Status, overall health (score + band) and when it was Generated. Click a row to open the full report; regenerate it to pull current numbers.
Status lifecycle
Reviews carry a status (draft through published/presented, or cancelled). Use the list to track which periods are done and which still need generating and presenting. Creating and managing reviews needs qbr.manage.
Session Recordings

A compliance log of recorded remote sessions. Why it is here: a recorded remote session is sensitive, so SentinelOps keeps the audit trail of who recorded what — but the video itself lives on the operator’s machine or your configured cloud, never on this server. Tenant benefit: a customer gets a defensible record of every recorded session on their devices without the footage ever being centralised where it could leak.

What the log shows
Each row lists the device, operator, start time, length, file size and where the media is stored (“operator machine” or an “in cloud” link). A session still in progress shows a “recording…” pill. The log is scoped to the organization in context.
Where the video lives
The recording is saved to the operator’s machine or your cloud, so this server holds only the metadata. If a cloud URL is present you can open the media from the Location column.
Start a recording
Recordings are begun with the ⏺ Record control on a live remote session — there is no start button here. This view is purely for reviewing the resulting log.
Deleting a log entry
The ✕ removes only this audit record; it does not touch the actual video file on the operator machine or in the cloud. You are asked to confirm because it deletes the compliance trace, not the footage.

Organization

Sites & Networks

Where devices physically live inside an organization: sites (offices/locations) and the networks (subnets/VLANs) within them. Why it is here: location structure drives the Site Dashboard roll-up and powers per-network automation like auto-deploy, auto-join and network pivot. Tenant benefit: it lets you model a customer’s real estate and then have new machines on a given subnet enrol, domain-join and spread reach on their own — all placement is optional, so a device with no site still works.

Site cards
Each site shows its name, location, the owning organization (when viewing all tenants) and its device count, with a table of its networks (Network, CIDR, VLAN, Devices). A network with auto-deploy credentials assigned carries an “auto-deploy” badge. Edit or Delete a site (deleting removes its networks and unassigns devices).
Add site
Enter a Name (e.g. “HQ — Dallas”) and a Location. When no tenant is selected in the top bar you also pick the Organization. Click Add site; then use “Add network” on the card to add subnets.
Auto-install agent on this network
Tick one or more installable (Linux/Windows/macOS) deployment credentials and an on-segment agent that scans this network will automatically log into unmanaged machines it finds and install the agent — once per host, matched to the credential’s target type, every install audited. Leave all unchecked to keep deployment manual. The section is hidden if you lack credential.manage. (Credentials are added under Discovery → Deployment credentials.)
Auto-join Windows workstations
After the agent enrols on a Windows workstation here, join it automatically (servers are never auto-joined; each join runs once and is audited). Join to Active Directory needs a Domain + optional OU + a domain-join credential. Join to Entra ID / Microsoft 365 needs an uploaded provisioning package (.ppkg from the Entra admin center; upload it inline).
Auto-pivot: reach networks behind this one
Tick “Scan a device’s segment when it enrols here” so reach spreads hop by hop — a VM here finds its hypervisor host, and once that host enrols it finds the LAN behind it. Discovered machines auto-enrol only where a credential is assigned above; otherwise they appear in Discovery to deploy by hand. A new segment is only scanned once you opt it in here.
Plugins

Optional, sandboxed extensions that add third-party capability to the console without changing the core product: console panels, integrations (outbound event webhooks), automation packs and agent helpers. Why it is here: it lets you wire SentinelOps to your own tools (chat, SIEM, ticketing) safely — a plugin runs in a sandbox and cannot reach the console’s credentials or act outside its own panel. Tenant benefit: you can extend what operators see and where alerts flow without trusting arbitrary code with your data.

Install plugin
Click Install plugin and paste the plugin’s manifest (JSON). It installs disabled so you can review its requested permissions first, then Enable it. For an integration, a one-time signing secret is shown on install — save it; your receiver verifies the X-SentinelOps-Signature header with it. See docs/PLUGINS.md for the SDK and examples.
Reading a plugin card
Each card shows the name, an enabled/disabled pill, the type (Console panel / Integration / Automation pack / Agent helper), version, vendor and id, the description, and the exact permissions it requested. Integrations also show their subscribed events → webhook URL; console panels show their panel URL.
Per-plugin actions
“Open panel” (enabled console plugins) renders the plugin in a sandboxed iframe — allow-scripts and allow-forms only, no same-origin, so it cannot read the console’s session or storage. “Send test” (integrations) delivers a test event to confirm the webhook works. Enable/Disable toggles it live. Remove uninstalls it and deletes its configuration (confirmed first).
Sandbox guarantees
A console plugin is iframed with no allow-same-origin and referrerpolicy=no-referrer, and every plugin is confined to the permissions in its manifest — it cannot reach the console’s credentials or act outside its own panel.

Manage SentinelOps

Platform Health

The health of SentinelOps’ OWN services — not the managed fleet. It shows the API, the database (with a live probe), the event stream / message queue, the alert engine, the background workers, high availability and email, plus a database detail card. Use it to confirm the platform itself is healthy and, on a multi-node deployment, that each node is doing its job.

Service list
Each row is one internal service with a colour dot: green = OK, amber = Degraded, red = Down, grey = N/A (not applicable, e.g. HA on a single node). A standby honestly shows its Alert engine and Background workers as “Deferred” — they only run on the primary, so this is expected, not a fault.
Database card
Backend (file = single node, or the SQL engine), live connection health, the connection pool (open / in use / idle / max), the event fan-out mode, and the self-heal probe settings. On PostgreSQL the fan-out is push-based (LISTEN/NOTIFY); on a single file node it is in-process only.
Email / alert delivery
Shows whether SMTP is configured. This matters because the HA and database self-heal alerts are delivered through it — if it reads “Not configured”, self-heal events will only appear in the console, not your inbox. Configure it under Settings → SMTP.
Microsoft 365 / Services (our estate)

SentinelOps’ OWN Microsoft 365 estate — the MSP’s internal tenant — imported and kept in one place: directory ID, licence key, users, groups, licences, Secure Score, service health and devices. Why it is here: the provider needs to run and bill its own 365 the same way it does customers, without mixing it into any tenant view. This is engineer-only, and it powers the internal bill and the service-connection toggles. (This is the provider’s own estate; a customer’s 365 lives in their portal’s Microsoft 365 tab.)

Sync now / Re-sync
Imports the estate into SentinelOps and persists it, so every panel works off stored data. With a live Entra app configured it pulls real Graph values (users, groups, licences, Secure Score, service health, devices); otherwise it imports a clearly-labelled example estate you can replace later without the dashboard changing.
Directory ID & licence key
Once synced, the Directory (tenant) ID and Subscription licence key are shown with Copy buttons.
Connect a live Entra app
To replace example data with real values, configure the app’s client_id, directory (tenant) id and secret via the 365 Graph settings (the same app registration used for Azure works — the Graph scope is requested per token). Once configured, Sync pulls live values.
Microsoft services
A per-service table (Exchange, Teams, SharePoint, Intune, …) with a Connect/Disconnect toggle each, plus Connect all / Disconnect all. The header shows how many of the services are connected.
Bill & menu visibility
The internal bill panel renders from the synced estate. "Menu visibility" jumps to Settings to show or hide this engineer-only menu; it does not affect client-facing tenant views.
Settings

Server-wide configuration, stored in the database so an upgrade never loses it. Global-administrator only. Each panel has its own Save button — you can change one panel and save it without touching the others, and changes apply live with no restart unless a field says otherwise. Secrets (passwords, tokens, signing keys) are sealed in the vault: a saved secret shows as “· set” and the field stays blank; leave it blank to keep the existing value, or type a new one to replace it.

Email (SMTP) — what it is
The outbound mail relay SentinelOps uses for welcome emails to new operators and for every alert/notification email (auto-block alerts, incident digests, self-heal reports, scheduled reports). Until this is configured, nothing is emailed — alerts appear only in the console. The green “configured” pill means a host is saved.
Email (SMTP) — the fields
Host: your mail server hostname (e.g. smtp.example.com or mail.example.com). Port: 587 for STARTTLS (typical), 465 for implicit TLS, 25 unauthenticated. Username: the SMTP login, or blank for an unauthenticated relay. From address: the address alerts are sent as (e.g. ops@example.com) — make sure your relay is allowed to send as it. Password: the SMTP auth password (sealed; blank keeps the current one). Alert recipient emails: one address per line — these get EVERY alert email, on top of any operator who turned on their own email alerts in their profile.
Email (SMTP) — how to set it up
1) Fill Host and Port. 2) Add Username + Password if your relay requires auth. 3) Set the From address to something your relay will accept. 4) Add at least one Alert recipient. 5) Click “Save email settings”. 6) In the “Verify delivery” box below, type any address and click “Send test email” — a success line confirms the relay works; an error tells you exactly what failed (auth, TLS, connection). Always save before testing.
SMS gateway — what it is and how to set it
Sends 2FA codes and SMS alert notifications through an HTTP webhook (your own gateway or a provider). Webhook URL: the endpoint SentinelOps POSTs the message to (e.g. https://sms-gateway/send). Authorization header: the full header value your gateway expects, e.g. “Bearer abc123” (sealed; blank keeps it). How to: paste the URL, paste the Authorization header, click “Save SMS settings”. Leave both blank to disable SMS entirely.
Alert webhook — what it is and how to set it
A signed outbound webhook that POSTs a JSON event to your system (SIEM, chat, ticketing) for every alert. URL: your receiver (e.g. https://receiver/hook). Signing secret: a shared secret of at least 32 characters — SentinelOps signs each payload with it so your receiver can verify the call really came from SentinelOps (sealed; blank keeps it). How to: paste the URL, paste a ≥32-char secret, click “Save webhook”. Verify the signature on your side using that same secret.
SCIM provisioning — what it is and how to set it
Lets an identity provider (Okta, Entra ID, etc.) create, update and deactivate operator accounts and groups automatically via SCIM 2.0. Issuer: the IdP issuer URL. Tenant ID: the SentinelOps tenant these provisioned users belong to (ten_…). Group→role map (JSON): maps IdP group names to SentinelOps roles, e.g. {"Admins":"admin","Helpdesk":"helpdesk"}. Bearer token: the ≥32-char token your IdP presents on each SCIM call (sealed). How to: fill all four, click “Save SCIM”. Point your IdP’s SCIM connector at /scim/v2 on this server using that bearer token. The pill shows “active” once provisioning traffic is seen.
General — Public URL
The canonical address of this console (e.g. https://console.example.com). Used to build links in emails and enrollment one-liners, and as an allowed origin. Set it to the exact scheme+host+port users and agents reach — a wrong value breaks email links and some cross-origin calls. Save with “Save general”.
General — Session length
How many hours an operator sign-in stays valid before re-authentication (1–24, default 8). Lower it for tighter security on shared machines; raise it for convenience. Takes effect for sessions created after the change.
General — Self-enrollment token uses / lifetime
The budget baked into a cloud-VM auto-provision and the port-knock install one-liner. Uses (1–10000, default 5): how many times one enrollment token may be redeemed — one real enrollment needs a few (download + enroll + retries), so 5 covers a single machine; raise it for a fleet rollout from one link. Lifetime (seconds, 60–86400, default 3600): how long the token is valid after it is minted. Tighten both to lock enrollment down; loosen for a big rollout.
General — Extra console origins
Additional browser origins allowed to call the API cross-origin (comma separated, e.g. https://alt.example.com). Add an entry only if you serve the console from more than one hostname; otherwise leave blank. Save with “Save general”.
Profile & service backups — sizes and retention
Defaults applied to NEW endpoint-capture backups (Windows user profiles, Linux/BSD service configs). Max archive size (MB, 0 = default 20 GB): caps one archive; a capture that would exceed it fails rather than fill the disk. Archive retention (hours, 0 = default 168 = 7 days): how long finished archives are kept before automatic cleanup. Default download format: tar.gz / tar / zip for the download button.
Profile & service backups — capture behaviour
Four defaults for new captures (each can be overridden per capture): “Skip caches” omits Temp, browser caches and cloud placeholders (keeps archives small); “Use a VSS snapshot” captures in-use Windows files like registry hives (recommended on Windows); “Allow live fallback” lets a capture proceed without a snapshot when VSS is unavailable (files a user holds open may be missed); “Require a second approver” forces a scoped operator’s capture to be approved by another operator (engineers/administrators are always exempt). Cache-exclude directories: profile-relative folders to skip (one per line; blank = built-ins).
Profile & service backups — include/exclude paths
These apply only to captures that do NOT use a Backup selection. Always include: absolute paths added to every such capture (Windows e.g. C:\ProgramData\MyApp, or Linux /opt/app/config). Always exclude: absolute paths removed from every such capture (e.g. /var/cache, C:\Temp). WHAT a selection-based backup captures is chosen in Backups → Backup selections (per tenant/group/device); this panel only sets the no-selection defaults. Save with “Save backup settings”.
Features — optional console areas
Toggles that show or hide whole areas for everyone. “Microsoft 365 (SentinelOps)” shows the engineer-only internal 365 estate menu. “Self-service enrollment port-knock” lets a new agent on an unknown IP present its deployment token to auto-open the firewall and enroll (the pill shows whether the listener is actually running). “Require operator approval for new enrollments” holds every newly enrolled device (alerts/patching/automation paused) until approved under Enrollment Approvals — a tenant can override this on its own record. “Self-service download portal (/download)” gives any firewall-allowed browser an OS-detecting page to install/update its own agent (those enrollments join the default tenant). Tick what you want, click “Save features”; hidden areas disappear from the nav.
Port-Knock & Sequence
Defense-in-depth: require a secret port-knock sequence AND the token before enrollment. Enforce the port sequence: when ticked, a client must knock the sequence before its token is accepted — this applies live. Secret sequence ports: the ports to knock, in order, comma-separated (changing them takes effect on the NEXT restart, and you must open them in the host firewall). Knock listener port + Knock public URL: where the knock service listens and how clients reach it (restart to apply). If no sequence is active yet, set the ports first, open them in the firewall, then enable enforcement. Save with “Save knock config”.
Application & Service Health card
Controls the dashboard’s system-health grid. Systems shown (max charts): how many machines to chart at once (e.g. 8). Trend metric: which metric the sparklines track. High-resource thresholds: the CPU/memory/disk percentages above which a machine is flagged. Auto high-risk services: service names (comma/newline separated) that, when running, auto-rate a machine high-risk so it is watched and charted first. Save with “Save system-health settings”.
Operations Tuning

Engineer-only limits and cadences that keep the server fast as the fleet and its history grow. Every numeric field is optional: leave it blank (or 0) to use the environment variable or built-in default — the grey note under each field shows what is in force right now. One “Save operations settings” button saves the whole page, and changes apply live with no restart. To reset a field to its default, blank it out and save. Bootstrap/security-root settings (state path, listen address, TLS files, credential & session keys, admin/enrollment tokens, database URL) are deliberately NOT here — the server needs them to boot and they are the security root, so they stay environment-only.

State & job history — Max retained finished jobs
Caps how many completed jobs are kept in state so state.json cannot balloon and slow the global lock (the amplifier behind past operations lock-ups). Blank = the default, which scales with RAM (~250 per GB, clamped 500–5000). Lower it on a small box with a busy fleet; the grey note shows the value in force now.
State & job history — Log/job retention (hours)
Finished jobs and their logs older than this are pruned even if the count is under the cap. Blank/0 = keep by count only. Set e.g. 168 (7 days) to stop very old logs accumulating — truncating old logs is what keeps operations fast on a long-lived server.
State & job history — Stale job reap (hours)
A job still queued or running after this many hours is force-marked failed so it stops blocking its device (a device won’t take a new job while one is “running”). Default is conservative; lower it if stuck jobs are wedging devices, raise it if you legitimately run very long jobs.
Record retention — the four ages
An hourly sweep deletes finished records older than these ages. Closed alert incidents (days, default 30): acknowledged/resolved incidents. Finished records (days, default 90): ended remote sessions, finished patch/software deployments, join attempts, remote operations, remediation attempts. File-transfer grace (hours, default 24): a transfer and its stored file are removed this long after it expires. Access-session log (days, default 365): the “who connected when” audit of access sessions. Never removed regardless: open incidents, live sessions, and anything in a tenant/device/transfer under a legal or preservation hold. The main audit log and endpoint-activity evidence are not affected by this panel at all.
Fleet self-heal safety — Automatic agent updates
The master kill-switch for the fleet auto-updating itself. Leave it CHECKED for normal operation. UNCHECK it during an incident or right after shipping a build you’re unsure of — agents then stay on their current version until you re-check it. This is the first thing to toggle if a rollout misbehaves.
Fleet self-heal safety — the caps
Auto-update batch (per 10-min tick, default 25): the most agents queued to update each tick; the rest follow on later ticks, so an update rolls out in staggered waves instead of all at once. Peer-watchdog restarts per sweep (default 20): the most remote agent-restarts one watchdog sweep will issue per tenant — a circuit-breaker so a flapping condition can’t restart the whole fleet in a loop. Raise for large fleets, lower to be more cautious.
Background-loop cadences
How often the housekeeping loops run, in seconds. Longer = lighter server load; shorter = faster reaction. Alert reconcile (default 240, min 60): the auto-resolve sweep. Alert stale-expiry (default 86400, min 600): auto-close a one-off alert on a now-healthy device after this long. Patch rescan interval (default 180, min 60): how often flagged devices are re-scanned for patches. Auto-patch policy interval (default 3600, min 60): the auto-patch deadline sweep. Leave them blank unless you have a specific reason — the defaults are tuned.
Authentication limiter
Auth failures before block (default 30, range 1–10000): how many failed sign-ins from a single IP are tolerated before that IP is temporarily blocked. Applies live. Lower it to harden against brute force; raise it if a shared NAT’d office is tripping it. Known-good admin IPs should go in Settings → Trusted IPs so they’re never limited at all.
Remote live view — target FPS
Live screen target FPS while watching (default 15, max 30): the capture rate used ONLY while an operator is actively watching a screen; it drops to ~1 fps when nobody is, to save the endpoint. Higher = smoother but more endpoint CPU and bandwidth (matters most over a WAN) — dial it down for slow links. This applies fully to Windows (in-process capture); Linux and macOS are always capped at ~8 fps because they spawn a capture process per frame and higher rates bog the machine down.
Remote live view — Capture method
How frames are grabbed on Linux/macOS (Windows always captures in-process, so this is a no-op there). Downscale (default): resize each frame to the target width — smallest and fastest over a WAN. Downscale + cursor: same, but also draws the remote mouse pointer so your mouse moves are visible (the agent installs ffmpeg/maim if needed). Full resolution: the sharpest, legacy full-size grab — the heaviest to capture and upload. Applies on the next frame.
Fleet lifecycle — Auto-decommission
Auto-decommission offline systems after (days): a system with no heartbeat for longer than this is automatically labelled Decommissioned, so a long-dead box stops raising alerts and skewing counts. Blank/0 = off. Removal-protected devices (pinned servers/DCs) are never auto-decommissioned, and a system that heartbeats again auto-revives, so this is safe to enable.
Fleet lifecycle — Reconcile re-added machines
When CHECKED (default), a machine re-added under a new agent is matched to its previously-decommissioned record (by system UUID or hardware MAC, within the same tenant), reuses its old name, and the duplicate is removed instead of creating a second entry — so reinstalling an agent doesn’t clutter the fleet with twins. Uncheck only if you deliberately want every re-enrollment to be a brand-new record.
SMS Gateway

How SentinelOps sends text messages — operator two-factor sign-in codes and SMS alert notifications. Why it is here: SMS is a fallback channel that reaches an operator when email or the console cannot, so it is configured once, centrally. Pick one provider; every secret is sealed at rest and never shown again. Tenant benefit (platform-wide): operators who protect their account with SMS 2FA, or who want to be paged on alerts, get those texts through whichever gateway you configure here.

Status
A live readiness panel: Configured / Not configured, the effective provider, the gateway device (with online/offline) when you use a device-based gateway, and how many operators have SMS alerts enabled. Below it, a recent-sends log (When, To, Provider, Result) with per-row Delete and a “Clear log” button — deleting a still-queued message also cancels its send.
Provider & its fields
Choose one SMS provider (or “disabled — no SMS”). The form then shows just that provider’s fields with a setup/requirements guide: webhook (Webhook URL receiving POST {to,text}, optional sealed Authorization header), Twilio (Account SID + sealed Auth Token), Vonage (API key + sealed secret), AWS SNS (region, access key ID + sealed secret), or a self-hosted gateway device (pick an enrolled Android → SmsManager, or Linux+modem → gammu). A “From number / sender ID” is used where the provider needs one. A saved secret shows a “saved — leave blank to keep” placeholder.
Save & Send test
Save gateway stores the configuration (secrets sealed). Enter a destination number and Send test to confirm delivery before relying on it for sign-in codes; the attempt then appears in the Status log’s recent activity.
Where SMS is used
Two-factor sign-in (operators who enroll SMS 2FA get their login codes here) and alert notifications (operators with an SMS alert preference and a phone number on file are texted when alerts fire). Set an operator’s phone number under Users → the operator → Basic details, and enable SMS under their 2FA / alert preferences.
Mobile apps

Run the SentinelOps console from a phone or tablet, install the native operator apps, or enrol a handset as a managed device — all from one page. It exists so an operator can triage the fleet from anywhere and so a phone or tablet can be brought under management the same way a laptop is. For the tenant it is both the on-the-go operator experience and the path to enrolling Android handsets as endpoints.

Install the console (PWA)
The console is a progressive web app that installs to a home screen and caches only its shell, never fleet data. On a supported browser an Install button appears; on iPhone/iPad, Safari has no install button, so use Share → Add to Home Screen. Installing requires HTTPS — reach the console over its public URL, not a plain-HTTP address. Dashboard, devices, alerts, monitoring and audit reflow to one column; remote screen control works but is meant for a tablet or desktop.
Enrol a phone or tablet
Create enrolment code (needs enrollment.manage) generates a QR good for a batch of devices for a limited time. Scan it from the Android app (More → Manage this device → Scan enrolment QR) to enrol the handset and start its agent in one step — or type the shown enrolment link by hand if it cannot scan. Android only: iOS permits no management agent, so an iPhone or iPad runs the console app rather than being managed by it.
Native operator apps
Android (Kotlin / Jetpack Compose) and iOS (SwiftUI) operator apps, read-only by design — fleet health, devices and alerts only; scripts, remote sessions and file transfers stay in the full console where a confirmation step and a full-size screen exist. The operator token is held in the Android Keystore / iOS Keychain, excluded from backups. Android is sideloaded (Download APK, enable "Install unknown apps" for your browser); iOS comes from the App Store for this deployment where configured, otherwise install the console from Safari.
Managing phones as endpoints
Separate from the operator app: Android endpoints (a foreground service with scoped storage and per-session screen-capture consent) are planned but not implemented yet, and iPhone/iPad endpoints are not possible — iOS forbids background daemons and process execution, so managing them means Apple MDM, a separate protocol rather than this agent.

Customer Portal

My Organization

The customer-facing portal: a read-only overview of what your provider manages for you and your Microsoft 365 estate. Why it is here: a managed customer should be able to see their own posture at a glance without being able to change it. What it does for you (the tenant): it shows your managed devices and your Microsoft 365 summary as last synced — everything is read-only, so to change anything you contact your provider.

Tabs
Three tabs: Overview (this page), Managed devices, and Microsoft 365 / Services. The header names your organization and primary domain.
Overview KPIs
Managed Devices (with the servers / workstations split), Online Now (and how many are offline), Microsoft 365 Users (with licences assigned of total), and your Secure Score from Microsoft when 365 is connected.
Example data notice
On the shipped demo organization the Microsoft 365 section is populated with clearly-labelled sample data to show the layout; a real organization with no 365 connected shows an empty, clearly-not-connected section rather than anyone else’s data.
Managed Devices

The Managed devices tab of your portal: every machine your provider manages for you, grouped by what it is, with its current state and compliance. Why it is here: as a customer you can confirm your estate is covered and online. What it does for you (the tenant): a read-only, plain-language inventory — to make changes, your provider does it for you.

Grouped by kind
Devices are grouped the way you think about them — Servers, Workstations, Mobile devices, Network devices and Other managed devices — with a count on each group. Servers and workstations are shown first.
Each device
Shows the device name (and hostname if different), operating system and version, an online/offline status pill, a compliance pill (compliant / not compliant / not assessed), and when it was last seen.
Read-only
This is a view of your estate. Changes are made by your provider — contact them to enrol, retire or reconfigure a device.
Microsoft 365

The Microsoft 365 tab of your portal: your 365 estate as SentinelOps last synced it — subscriptions and seat usage, users, groups, access policies and registered devices. Why it is here: it puts your licence position and directory in front of you without a trip to the Microsoft admin center. What it does for you (the tenant): a read-only picture of your 365 tenant, with anything your Microsoft consent did not cover clearly marked rather than shown as empty.

Licences
Each subscription/SKU with seats Assigned, Total and Available, so you can see where you are over- or under-provisioned.
Users, Groups, Access policies, Entra devices
Users (name, sign-in name, enabled/disabled, licensed), Groups and teams (name, mail, whether it’s a Team), conditional-access policies (name, on / off / report-only, last updated) and Entra-registered devices (name, OS, compliant, last sign-in).
Service health
The current health of your Microsoft 365 services, when reported.
"Not shared"
A section marked "not shared" needs the matching Microsoft consent before SentinelOps can read it — it is named explicitly so an un-consented dataset is never mistaken for an empty tenant.
Security & Sign-in

Your own account security: your sign-in password and your second factor. Why it is here: protecting your own login is something only you can do, so the portal gives you a self-service place to do it. What it does for you (the tenant): you can turn on two-factor authentication and change your password yourself — your organization may require 2FA.

Two-factor authentication
Shows whether a second factor is registered on your account. "Set up two-factor" starts an authenticator (TOTP) enrolment; "Turn off" removes it. Strongly recommended, and your organization may require it.
Password
If you sign in with a password, "Change password" lets you change it. If your account is managed by an identity provider (SSO), the page says so and the password is managed there instead.
Get the App

Install the SentinelOps app on your phone or tablet, then sign in by scanning a code — no password typed on the device. Why it is here: the app gives you the same view of your managed estate and Microsoft 365 on the go, and code sign-in keeps your credentials off the handset. What it does for you (the tenant): a quick, secure way onto your own portal from a phone or tablet.

1 · Install — Android
If a Google Play link is published for your deployment, use "Get it on Google Play"; otherwise download the app directly and open it to install. Android asks permission the first time — when it says your browser isn’t allowed to install apps, open Settings, turn on "Allow from this source", then tap the download again. The app is signed by us, so Play Protect may ask you to confirm; that’s expected for an app installed outside the Play Store.
1 · Install — iPhone / iPad
If an App Store (or Mac App Store) link is published you can install it there. If the iOS app isn’t published on your deployment you cannot install it yourself — your IT provider installs it on a managed device, so ask them. Meanwhile you can add this page to your home screen (Safari → Share → Add to Home Screen) and it opens full-screen like an app.
2 · Sign in
Click "Show my code" to generate a sign-in code and scan it with the app. The code lasts 15 minutes and replaces any earlier one. Signing in shows you the same view you see here — what your provider manages for you and your Microsoft 365 details.

More references

Active Sessions

Shows who is currently signed in to the selected organization and lets you force an account off. Console sessions are stateless signed cookies rather than a server-side session table, so this lists the accounts that have been active in the recent window instead of individual sessions. It exists so an administrator can see live operator presence and immediately revoke access for a departing or compromised account — for the tenant it is the fast kill-switch when a login must be cut off now. Pick a tenant first.

Read the table
Each row is an account active in the last N minutes (the window is stated in the summary line): User (full name and username), Role, 2FA (an "on" pill, or a "none" warning pill where the account has no second factor), State (signed in vs idle) and Last activity. The bold count at the top is how many are signed in right now.
Sign out
The per-row Sign out button (shown only with manage permission) invalidates every session for that account immediately — the next request from any of its devices is rejected and the user must sign in again. You confirm first. Use it the moment an operator leaves or an account looks compromised.
Why no session list
Because sessions are stateless signed cookies there is no per-device session to revoke individually — signing an account out rotates what makes its cookies valid, so all of them stop at once. That is by design and keeps sign-out instant and complete rather than partial.
Admin Access

Controls which source addresses may reach the admin console and API, so management access is locked to the places you trust even as those addresses change. Why it is here: the management plane is the keys to every tenant, so it is gated to known admins and known IPs rather than left open. Tenant benefit: it keeps the platform that manages customers reachable only from trusted locations, while making sure a legitimate admin on a changing home IP is never locked out.

Dynamic hostnames (recommended)
Register an admin’s dynamic-DNS name (e.g. admin-home.dyndns.net). Its live IP is re-resolved every minute and kept allowed automatically — it follows the admin’s ISP changes, never expires, and that IP is also exempt from auto-block, abuse reports and auth alerts. Add a hostname with the field; Remove drops it (if an admin’s current access came only from that name, they lose it until they re-knock or it is re-added). Best for an admin with a stable dyndns name.
Authorized admin IPs (port-knock)
An admin authorizes their current IP by knocking with their operator token — the console and mobile app do this automatically. The table lists each IP with the admin, the source, when it was last seen, and when it auto-revokes (after the server’s configured idle period; a pinned entry never expires). To get back in from a new IP, just knock again — no help desk needed.
Revoke
Use Revoke on a port-knock IP to cut its management access immediately; the admin can re-authorize by knocking from that IP again. Pinned entries show as “pinned” and have no revoke button.
Never lock yourself out
The operator’s own home address is exempt everywhere and is never blocked. Review the list before tightening it, and keep at least one durable allow entry (a dynamic hostname) so you always have a way in.
Administrators

The Users list filtered to administrator accounts — the people who can change this organization. It is the same Users screen with a role filter applied, provided as a shortcut so you can review and manage privileged accounts without scanning the whole directory. For the tenant it answers "who holds the keys here" at a glance and lets you act on those accounts in place.

Same view as Users
Everything here is the Users screen with a role filter applied — the table, the Create user button and every per-account action (reset password, reset 2FA, edit permissions, disable, delete) behave identically. Only the rows shown are narrowed to administrator-type roles.
Why review this list
Administrators can change tenants, users and fleet configuration, so this is the list to keep short and current — remove accounts that no longer need that reach, and confirm each one has a second factor (the 2FA column) before relying on it.
AI Assistant

Connects the in-console AI assistant to an Anthropic provider so it can answer questions and help you work inside SentinelOps. It exists so operators get grounded, in-context help without leaving the console or pasting fleet data into an outside chat tool. For the tenant it is an opt-in org add-on: the assistant is scoped to this organization, the API key is sealed in the credential vault and never shown again after you save it, and configuring it requires the ai.manage permission.

Enable the add-on
The assistant runs as an org add-on. If it is off, the panel shows a notice; an operator with operator.manage can click Enable AI add-on, otherwise ask an administrator to turn it on. Nothing below works until the add-on is enabled.
Get and paste a key — field by field
Create a key at console.anthropic.com → API Keys, then fill the form: API key (the secret you paste — it is sealed on save and the field then shows only that a key is set); Model (e.g. claude-sonnet-5 — the exact model name the assistant calls); and optionally an API base URL (default https://api.anthropic.com, change it only for a proxy or gateway). Click Save to store them.
Test the connection
After a key is stored, Test connection sends a tiny prompt and shows the model’s reply (or the exact error). Use it to confirm the key, model name and base URL are all valid before relying on the assistant — a wrong model name or an expired key surfaces here rather than mid-conversation.
Rotate or remove the key
To change the key, type a new one and Save (leave the key field blank to keep the existing one while editing the model or base URL). Remove key clears the stored secret — the assistant stops working until a new key is set.
Authentication

The sign-in policy for this organization: passwords, two-factor, SSO, session length and account lockout. SentinelOps gives each tenant its own policy — stricter than the platform baseline but never looser — so a customer with tighter requirements can enforce them while the platform floor protects everyone. For the tenant it is the single screen that decides how hard it is to get into their console and mobile app, and what happens when someone fails.

Sign-in toggles — field by field
Checkboxes set the policy: Password sign-in enabled; Require two-factor for every user; SSO enabled; SSO required; Keep local emergency sign-in (so a provider outage cannot lock everyone out); Mobile app allowed; and Require two-factor on mobile. Any control the platform has pinned shows a "platform policy" badge and is read-only here — the server refuses to loosen it.
Sessions and lockout — field by field
Session timeout (minutes) ends an idle session — it cannot exceed the platform maximum shown beside it. Maximum failed sign-ins and Lockout (minutes) are enforced per account (not just per source IP), so a targeted account locks even from many addresses. A platform maximum is displayed where one applies.
Allowed second factors
Tick which methods accounts may register — totp, sms, webauthn. A method the platform baseline excludes is disabled here. Save policy writes the whole set; without manage rights the panel is read-only and says so.
Why stricter-not-looser
The platform baseline is the floor. A tenant can demand more (require 2FA, require SSO, shorter sessions) but every attempt to go below the baseline is both greyed out in the form and rejected by the server, so a customer policy can never weaken the platform’s guarantees.
Auto-Remediation

What this is: rules that automatically run an approved fix script when a specific alert fires, bounded by attempt ceilings, cooldowns and escalation. Why SentinelOps has it: the same alert (a stopped service, an offline box) often has the same known fix, and a person doing it by hand at 3am is slower and more error-prone — but an unbounded auto-fix could loop forever, so every rule is fenced. What it does for the tenant: faster recovery of common faults with hard guardrails, and a guarantee that a problem it cannot fix still reaches a human. Needs remediation.manage to edit.

Only approved scripts run
A remediation rule can only execute a script that has been approved in Automation → Review. Unapproved templates are shown but will not run unattended — approve the script first.
Create a rule — the fields
With remediation.manage, "+ Rule" asks for a Name, the alert event action that triggers it (for example service.down or device.offline), the remediation script Template, a Max-attempts ceiling and a Cooldown in minutes. New rules are created disabled.
Enable when ready
Rules start off; enable one only when you trust it. Each row shows its trigger, target script, status and limits, and Disable/Enable and ✕ let you toggle or remove it.
Limits and escalation
The cooldown stops a flapping alert from re-firing the fix back-to-back, and once a rule hits its attempt ceiling the incident is escalated to a person instead of looping. The "Recent attempts" panel logs each dispatch, skip or escalation with its reason and job id.
Automation Builder

Composes approved scripts and actions into guarded IF / THEN / WAIT workflows, driven manually, on a schedule, or by an alert. SentinelOps has it so routine, multi-step remediation runs the same way every time with conditions and approvals built in, rather than as ad-hoc scripts someone remembers to run. For the tenant it is safe fleet automation: only reviewed script templates can be used as actions, and every workflow is scoped to the selected tenant. Pick a tenant first; editing needs automation.manage.

The KPI tiles
Four counters head the view — Workflows (total), Enabled, Scheduled and Alert-driven — so you can see at a glance how much automation is live and how it is triggered.
Triggers
A workflow runs manually against a device you pick, on a schedule (hourly/daily/weekly across all live devices), or on an alert (against the incident’s device, optionally matched to a specific alert action such as device.offline).
Build the steps
In the editor set Name, an optional Description and the Enabled checkbox, pick the Trigger, then add steps with "Add step": IF (condition) that halts the run if it fails, THEN (action) that does the work — run an approved script template, set device status, or send a message — and WAIT (a delay in seconds). Steps are evaluated top to bottom; editing requires automation.manage.
Run and watch
Use Run… on a workflow to fire it against a named device (you pick from the list); the run history opens so you can watch progress. Runs shows past executions and their outcomes for any workflow.
Enable state and last run
The list shows each workflow’s trigger, step count, on/off state and its last run time and status. Only approved script templates are offered as actions, so a workflow can’t run an unreviewed script.
Backup selections

What this is: a reusable definition of exactly what a SentinelOps profile backup captures — which folders, whose data, and within what size budget. Why SentinelOps has it: a blind whole-profile grab either misses what matters or fills the endpoint’s disk, so there is no hidden default here — a new selection starts empty, you tick only what you want, and the agent measures the selection before copying anything so an over-size backup fails fast instead of mid-stream. What it does for the tenant: precise, per-OS control over what leaves each machine, assignable fleet-wide or per device, with every change audited. Reading needs device.read; creating, editing, deleting and assigning need enrollment.manage.

Areas per OS
Documents, Desktop, Downloads, Pictures, Music and Videos map to each user’s own folders: Windows known folders (following OneDrive/folder redirection when the user is signed in), macOS ~/Documents … ~/Movies, Linux XDG user dirs (xdg-user-dir / ~/.config/user-dirs.dirs). Email = Outlook data (OST/PST) + Thunderbird on Windows, ~/Library/Mail on macOS, Thunderbird/Evolution on Linux. Browsers = Chrome, Edge, Firefox, Brave (and Safari on macOS) profile folders. App settings = AppData\Roaming on Windows, ~/Library/Preferences + Application Support (minus iPhone backups in MobileSync) on macOS, ~/.config on Linux.
Phone areas
Phone photos, documents, downloads, music and movies are captured by the SentinelOps Android/iOS apps. A desktop ignores them; a selection with only phone areas and no include path does nothing on a computer (the job says so).
Whose data
All users on the machine, only the signed-in user, or named users (account names). macOS scheduled captures always use the signed-in user — the Mac agent can only read that user’s home.
Include and exclude
Include paths add folders on top of the areas: absolute (/srv/share, C:\Data) or ~/Projects for the same folder in each selected user’s home. Excludes can be a name (node_modules), a glob (*.iso), a relative path (Library/Caches) or a full path. Skip caches drops browser/app caches, Temp and Trash.
Size cap and preflight
Before staging anything the agent adds up the selected folders (respecting the excludes) and stops with “selection is N GB, over the cap of M GB” if it is over. 0 uses the server default (SENTINELOPS_MAX_PROFILE_BACKUP_BYTES / Settings → max archive size, 20 GB by default). Narrow the selection or raise its cap if a capture is refused.
Where a selection applies
Assign a selection as the tenant default, to a group, or to a single device. A device uses its own selection first, then its group’s (the nearest group up the tree), then the tenant default. A device with no selection keeps the legacy whole-profile capture. Deleting a selection clears its assignments; removing a device or group removes its assignment.
Manual backups
Back up profile in the device drawer (and New capture in Profile & Service Backups) lets you pick the device’s selection, any saved selection, or build a custom one in the same area editor — or run the legacy whole current-user capture.
API
GET/POST /v1/backup-selections, GET/PUT/DELETE /v1/backup-selections/{id}, PUT /v1/backup-selections/assign {scope, target_id, selection_id}, GET /v1/backup-selections/assignments, GET /v1/devices/{id}/backup-selection. The mobile apps use the same API.
Backup Verification

What this is: the record of which backups have actually been test-restored, kept separate from whether a backup job merely ran. Why SentinelOps has it: a backup that has never been restored is not a proven backup, and a green job status hides that gap — so this screen refuses to let an untested or failed-restore backup pass as safe. What it does for the tenant: an honest, defensible answer to "could we actually recover this machine?", with a stale clock so a once-proven restore does not stay trusted forever. Pick a tenant first.

Read the posture tiles
The tiles count Restore failed, Never verified, Stale (a verification older than the stale window, default 30 days), Verified, and Unprotected devices — those with no backup at all. Worst posture is listed first in the table.
Backup job vs restore verified
The Backup job column reflects what the device’s backup product reports (ok / warning / failed and when it last succeeded). The Restore verified column is separate — a green backup job only means a job ran, not that a restore works.
Record a verification — the fields
With device.status.change, click Record verify… on a row. You enter a Result (verified / failed / not_verified), a Method (test_restore / checksum / manual / automated) and optional Notes — this logs that a restore was actually proven (or failed) and resets the stale clock from now.
Unprotected devices
A device that reports no active backup shows as unprotected and needs a backup put in place before verification even applies. The muted line under the tiles calls out how many have no backup at all.
Backups

What this is: backup health across every managed endpoint in the tenant, worst posture first, built from what the agent and your backup products actually report. Why SentinelOps has it: a backup nobody is watching is the one that has quietly failed — so this screen never invents a green state, counting a silent device as "not reporting" rather than assuming it is protected, and turning failed/overdue backups into incidents through the alerting engine. What it does for the tenant: a single honest answer to "is every one of our machines actually being backed up, and current?" plus the knobs to enforce it. Pick a tenant first.

Read the posture tiles
Failed (the backup product reported a failure), Overdue (a protected device with no successful backup inside the tenant’s overdue window), Warning, Unprotected (no backup at all), Not reporting (no collector has reported), and Protected. The muted line summarises how many of the managed endpoints are at risk.
How status gets here
The native agent reports its backup product’s result on the heartbeat, and a script or integration can report via POST /v1/devices/{id}/backup-status (needs enrollment.manage). Mobile devices are excluded — they are consoles, not backup-protected endpoints.
Alert policy — the fields
With enrollment.manage you can set the Overdue-after window (1–2160 hours, i.e. up to 90 days) — a protected device with no successful backup inside it counts as Overdue — and toggle whether failed/overdue backups raise incidents. The setting is saved per tenant in the database; a background sweep re-checks every 30 minutes and re-raises at most every 12 hours so a persistent problem nags without spamming.
Backups vs Backup Verification
This screen tracks whether backups are running and current. Backup Verification is the separate proof that a backup can actually be restored — a green job here is not a proven restore.
Automatic capture — the fields
Capture every N hours queues a SentinelOps profile backup on each eligible online endpoint without a recent one (a failed one is retried after 2 hours). Devices tagged no-backup are never captured. WHAT is captured comes from the device’s backup selection; a device with no selection keeps the legacy whole-profile capture in the Scope chosen here (the Scope control picks what the legacy capture grabs). macOS always captures just the signed-in user.
Backup selections
The Backup selections panel is where you choose WHAT gets backed up: tick areas per OS (Documents, Desktop, Downloads, Pictures, Music, Videos, Email, Browsers, App settings — and Phone areas for the mobile apps), whose data, extra include/exclude paths, skip-caches and a size cap. Nothing is pre-selected. Assign a selection as the tenant default, to a group, or to one device; the device drawer shows which one applies. Press ? on the panel for details.
Backups & Recovery

What this is: the home for everything backup-related in one place — fleet backup posture, on-demand profile/service captures, and restore verification. Why SentinelOps has it: backup, capture and proof-of-restore are three different questions, and bouncing between screens to answer them loses the thread, so this landing page lines them up and links each to its own area. What it does for the tenant: one glance that answers "are our machines protected, can we capture what we need now, and can we actually restore it?" — the top-right button runs a one-click current-user backup across every online endpoint. Pick a tenant first.

The three layers
Backup Health tracks whether third-party backup jobs (Veeam, Windows Backup, restic…) are current. Profile & Service Backups is SentinelOps capturing Windows profiles or Linux/BSD service configs itself — encrypted, downloadable later with a passphrase. Restore Verification proves a backup can actually be restored, not just that a job ran. Each card jumps to its own area.
Recent captures
The table shows the latest profile/service captures with their type, status, capture mode (VSS snapshot vs live, or systemd) and size. Open Profile & Service Backups for the full list, to start a capture, or to download an archive.
Capacity Planning

Projects how many days until each device’s disk fills, built from real persisted utilisation history rather than a single snapshot. SentinelOps has it so a filling disk is caught weeks ahead — as a planned clean-up or expansion — instead of as a 2 a.m. out-of-space outage. For the tenant it turns raw disk usage into a ranked, days-to-full worklist of the machines that will run out first. No forecast is invented from thin data: a device needs enough hourly samples before any projection is shown. Pick a tenant first.

Read the projection
Each row shows disk used now, the daily trend (e.g. +0.4 %/day) and a projection. A projected device shows "~N days to full", colour-coded — red at 30 days or less, amber to 90, green beyond. A device whose usage is flat reads "stable".
Collecting vs projected
A device new to monitoring shows "collecting (x/N)" until it has accrued the minimum number of hourly samples. Until then no days-to-full figure is shown — the forecast waits for enough history rather than guessing, so the numbers you act on are real.
At-risk tile
The At risk tile counts devices projected to fill within 90 days, and those rows also carry an "at risk" flag. Use it to spot the disks that need clean-up or expansion before they fill and cause an outage, and act through each device’s drawer.
Change Management

What this is: a record of planned changes for a tenant, each carrying its type, risk, maintenance window, owner and rollback plan, moving through an approval lifecycle. Why SentinelOps has it: unplanned or unreviewed changes are a leading cause of self-inflicted outages, so the platform makes "what are we changing, when, and how do we undo it" an explicit, approved artifact before the work. What it does for the tenant: a disciplined change trail that proves changes were planned and authorised, and makes a bad change reversible. Creating and approving changes needs the change.manage permission. Pick a tenant first.

Log a change — the fields
Click + Change and capture the Title, Description, Type, Risk, Maintenance window and — importantly — a Rollback plan. A change with no rollback plan is flagged in amber, because "how do we undo this" is exactly what you want decided before, not during, the work.
Lifecycle and approval
Changes flow draft → submitted → approved → scheduled → implementing → completed (or rolled_back). Approve appears on a draft or submitted change. Emergency changes may be approved directly, while normal changes are expected to be approved before they are scheduled.
Type and risk at a glance
Type is emergency, normal or standard, and risk is high / medium / low, both shown as pills. The KPI tiles count changes by state (draft, submitted, approved, scheduled, completed, rolled back) so you can see where the pipeline is backed up.
Compliance

What this is: a per-tenant workspace to assess control frameworks and track coverage honestly. Why SentinelOps has it: a compliance score that assumes unassessed controls are fine flatters the picture and hides real gaps — so here an unassessed control counts against you rather than being treated as compliant. What it does for the tenant: a true, defensible reflection of assessed posture against each framework, with every assessment stamped to who made it. Assessing controls needs the tenant.manage permission. Pick a tenant first.

Pick a framework
The chips across the top are the available frameworks, each showing its current coverage score and how many of its controls are assessed (e.g. "12/60 assessed"). Click one to load its controls below.
Assess a control — the fields
Click Assess on a control and set its Status — compliant, partial, non_compliant, not_applicable or unassessed — with optional Notes and an Evidence reference (a manual pointer to where the proof lives). Your assessment is stamped with who made it and when.
How coverage is scored
Coverage never assumes compliance: an unassessed control is scored against you and a partial control scores half. That keeps the percentage a true reflection of assessed posture rather than an optimistic default.
Configuration Changes

What this is: a journal of configuration changes made through the console — what changed, by whom, when, and (where supported) how to undo it. Why SentinelOps has it: console settings get changed by different operators, and increasingly by the assistant on an operator’s behalf, so a tamper-aware trail with one-click revert turns "who broke this?" into a quick answer rather than an investigation. What it does for the tenant: accountability for every setting change on their estate and a safe, recorded way to roll one back. The most recent changes are kept with enough detail to undo them; secrets are never recorded.

History
Each change lists When, the Change (its summary, kind and any target id), By (a person, or an "assistant" pill when the assistant applied it on an operator’s behalf, with the actor identity), the Action, and an "undone" pill if it has since been reverted. Only the most recent N changes (shown in the header) are retained with full before/after detail.
Filter the journal — the controls
Two dropdowns narrow the list: All kinds (or a specific change kind) and Anyone / Assistant only / People only. Use them to answer, for example, "what has the assistant changed?" or to isolate one kind of setting.
Revert, Reapply, Detail
Where a kind is revertable and the change is not already undone, Revert puts the object back to how it was before (the revert is itself journaled, so it can be undone in turn); Reapply re-applies a change. Detail shows the before/after context. Revert and Reapply need revert permission and ask you to confirm first.
Secrets are never recorded
Before/after context never stores passwords or keys, so a restored object keeps whatever secret is configured now rather than resurrecting an old one — the revert fixes the setting, not the credential.
Contacts & Vendors

The customer contacts and third-party vendors for the selected tenant — the people you call and the suppliers who serve them. SentinelOps keeps them beside the fleet so the human and vendor context an incident needs (who approves, who to escalate to, the ISP account number) is one click away rather than in a separate CRM. For the tenant it is their service directory: the right person reached first and the right supplier reached with the right account in hand. Pick a tenant first. Editing needs tenant.manage; a vendor account identifier is sealed in the vault and only revealed on demand (credential.manage), with the reveal audited.

Contacts
Add a contact with + Contact — name, email, phone and a type (technical / billing / emergency / approver / general). The Esc. column is the escalation order, low to high, so you know who to reach first. These are the same contacts On-Call Escalation engages, so keep them current.
Vendors
Add third parties serving this tenant with + Vendor — ISP, VoIP, EHR, printer, security, software, hardware and so on — with a support phone, a portal URL and an optional account number or portal id. Example: the ISP account number for the site so anyone opening a circuit ticket has it to hand.
Sealed vendor accounts
A vendor account identifier you enter is stored encrypted, never shown in the table. When an operator with credential.manage needs it, "Reveal account" decrypts it for that moment and records the access in the audit log. Operators without that permission see only "sealed".
Removing entries
Remove on a contact or vendor deletes it after a confirmation. There is no soft-delete here, so remove only when the relationship has genuinely ended.
Cost Optimization

Surfaces money the tenant could stop spending — unused Microsoft 365 licenses, hardware marked retired but still consuming a management seat, and support/warranty renewals coming due. It exists so recurring waste is found and reclaimed as a routine review rather than discovered in an annual audit. For the tenant it is a concrete, per-item savings worklist drawn from its own data, and it is honest when a source is not connected — showing a note instead of a fabricated saving. Pick a tenant first.

Unused M365 licenses
For each SKU it shows assigned vs total seats, how many are unused, and the monthly waste where the SKU is priced. The tiles roll this into an estimated monthly and annual license spend you could reclaim — reassign or drop those seats.
Retired hardware still enrolled
Devices marked retired or decommissioned but still enrolled keep consuming a management seat. This list flags them so you can deprovision and reclaim the seat.
Warranty / support renewals
Devices with a support or warranty date within 90 days (or already expired) are listed with days remaining, vendor and asset cost, so you can decide renew, replace or retire before the date passes.
Honest when unconnected
If Microsoft 365 is not connected or asset warranty dates are not filled in, the panel says so rather than inventing opportunities — connect the source and populate the data to surface more. Nothing here is estimated into existence.
Data & Audit

What this is: the controls for how long SentinelOps keeps records and the proof that the audit log has not been tampered with. Why SentinelOps has it: a management platform must be able to both age out old data on a defensible schedule and demonstrate that its own trail is intact — otherwise retention claims and the audit log are just assertions. What it does for the tenant: enforceable retention windows (pruned automatically) and a cryptographically verifiable audit log, so a customer’s compliance and disaster-recovery story holds up. Editing retention needs the system.manage permission.

Data retention — the fields
Set how many days to keep Audit log entries and Finished jobs, then Save retention. 0 means keep indefinitely. The pruner runs hourly, so records past the window are removed automatically rather than by hand.
Audit-log integrity
Every audit entry is SHA-256 hash-chained to the one before it. The Chain status tile reads INTACT or BROKEN; Re-verify now re-walks the chain. If tampering is detected it names the exact entry where the chain breaks.
Backup & disaster recovery
Global operators get a DR panel: Download full backup takes an off-box snapshot of everything, and Export this tenant produces a single-tenant export for offboarding or migration. Sealed secrets stay encrypted in both.
DC Diagnostics

Reports Active Directory health for a tenant — domain and forest, the domain controllers, FSMO roles, object counts and replication/DNS status. SentinelOps has it because a broken DC or a silent replication failure degrades every logon and group policy in the organization, and it is the kind of fault that stays invisible until something breaks. For the tenant it is standing AD health monitoring: known DCs are re-checked automatically every 6 hours and failures raise alerts, so a problem surfaces on its own. Pick a tenant first.

Read the fleet health
The tiles count Domain controllers, Unhealthy DCs, Replication issues and DNS issues. The DC table shows per-controller failed tests, replication failures, DNS problems and when it was last checked, healthy first vs "issues".
Detect a new DC
Pick a Windows server under "Check a Windows server for DC role" and click Run diagnostics. This runs the health check plus a directory inventory; if the box is a DC it is detected and added to ongoing 6-hourly monitoring. Run now on an existing DC re-checks it on demand.
Drill into a DC
Details on a DC opens its full results — the individual tests, DNS tests, any replication failures (partner and detail), and the FSMO role holders — so you can see exactly which check failed rather than just a count.
Automatic alerting
Because known DCs are re-checked every 6 hours and failures open alerts, you do not have to sit on this screen — a new replication or DNS break surfaces as an alert. Come here to investigate and to onboard servers not yet detected as DCs.
Dependency Map

What this is: an operator-defined record of which devices depend on which — a workstation on its gateway, an application on its database. Why SentinelOps has it: when one upstream device fails, everything behind it alarms too, burying the real cause in noise — so the map lets alerting tell a root cause from its downstream fallout. What it does for the tenant: cleaner, correlated alerting that points at the one thing to fix, plus a clear picture of each device’s blast radius. Editing needs the device.status.change permission. Pick a tenant first.

Add a dependency — the fields
Click + Dependency to record that one device relies on another, choosing the Kind: network, power, service, application or storage. For example, mark a set of workstations as depending (network) on their site gateway, or an app server on its database.
Read the blast radius
Dependencies are grouped by the upstream (depended-upon) device, so each panel shows one upstream and everything that would be affected if it failed — the blast radius — with the dependent device, type and notes.
Alert correlation
The map feeds alert correlation: when an upstream device goes offline, alerts for its downstream dependents are suppressed as noise and attributed to the real root cause. A banner flags how many devices are currently impacted and how many downstream alerts are being suppressed.
Documentation

Living, per-tenant documentation — runbooks, network notes, contacts, procedures — organised into sections. SentinelOps has it so the knowledge an on-call operator needs at 2 a.m. lives beside the fleet it describes, not in scattered files or someone’s head. For the tenant it is a maintained, Markdown-based knowledge base that can be drafted automatically from live inventory and kept current as the network changes. Pick a tenant first. Editing needs tenant.manage.

Sections and pages
Pages are grouped under sections such as Overview, Networks, Firewalls, Servers, Applications, Backups, Procedures and Emergency Information. Add a page with + Page: choose a section, give it a title, and write the body in Markdown. Example: an "Emergency Information" page with after-hours contacts and the escalation path.
Auto-generate network doc
Auto-generate network doc drafts a Network page from the tenant’s sites, networks and discovered infrastructure, so you start from real inventory instead of a blank page. An auto-generated page carries an "auto" badge; edit it freely afterward to add the context inventory can’t know.
Editing and history
Edit reopens a page in the Markdown editor; each page shows when it was last updated. Keep procedures here rather than in scattered files so the on-call operator finds them in one place.
Removing a page
Remove deletes a page after a confirmation. Auto-generated pages can be removed and regenerated when the network changes — regenerating drafts fresh from current inventory.
Domains

Tracks a tenant’s internet-domain portfolio: registration expiry, registrar, nameservers, DNSSEC and basic DNS health, cross-referenced against the tenant’s Microsoft 365 verified domains. SentinelOps has it because a lapsed registration or a broken delegation takes a client’s mail and website down, yet renewal dates are exactly the thing nobody is watching. For the tenant it guarantees no client domain quietly expires or stops resolving unnoticed. Pick a tenant first. Adding or removing needs tenant.manage.

Track a domain
Add a domain or subdomain (e.g. acme.com or mail.acme.com) and SentinelOps queries registration data over RDAP: expiry date, registrar, nameservers and DNSSEC status. A subdomain is tagged with its apex domain since it has no registration of its own.
Expiry at a glance
The KPI tiles count domains expiring within 45 days and already expired, plus domains with DNS issues. Each row shows an expiry pill and the days left, so the ones about to lapse stand out. Example: a domain showing "expiring 12d" is your cue to confirm auto-renew with the registrar before it drops.
DNS resolution check
The DNS column shows whether the domain currently resolves ("resolves") or not ("no DNS"), and the row lists the first couple of nameservers. A domain that stops resolving is flagged so you catch a broken delegation early.
Microsoft 365 cross-reference
When the tenant’s Microsoft 365 (Entra) is connected, verified 365 domains are listed and any that are verified in 365 but not yet tracked here appear as one-click "add" pills — so a domain your client actually uses for mail doesn’t go unmonitored. Recheck on a row re-queries RDAP and DNS on demand; all domains re-check daily.
Engineers

The Users list filtered to engineering and operator accounts — the people who work on the fleet day to day. It is the same Users screen with a role filter applied, so you can manage the staff who run jobs, deploy agents and operate devices without wading through every account. For the tenant it is the roster of who can actually touch their machines.

Same view as Users
Everything here is the Users screen with a role filter applied — the table columns and every per-account action work exactly as they do under Users. Only the rows are narrowed to engineer/operator roles.
Capped engineers
An Engineer whose permissions were pinned below the full role reads as "engineer" but will not see everything the role implies. Open the account and use Edit permissions → "Use the role’s permissions" to restore full access, or leave it capped deliberately for a tenant-scoped engineer.
Feature Registry

The platform’s capability catalog and honest delivery tracker — every capability with its build status, its licence tier, and a platform-wide on/off switch. SentinelOps keeps it as the single source of truth for what the product actually does and does not do today, so a sales promise or a support answer is grounded in reality rather than a marketing list. It is platform-wide (not per-tenant): the status and toggles apply across the whole deployment, and toggling a capability needs system.manage.

Delivery status
Each capability carries an honest status: implemented, partial, planned (not built yet), or blocked (waiting on something external). The summary tiles total each state across the whole registry, so you can see real coverage at a glance rather than a marketing list.
Grouped by category
Capabilities are grouped by category and each row shows the feature name, its spec number where it has one, and a short description. Use this to answer "does the platform do X?" precisely — the status pill tells you whether it is shipped, partial or still planned.
Licence tier
The Licence column shows which tier a capability belongs to, so you can see what a given plan includes versus what an upgrade would add.
Enable / disable
With system.manage you can toggle a capability on or off platform-wide via its checkbox; without that permission you see a read-only on/off badge. A blocked capability can’t be toggled — it shows n/a until whatever it depends on is in place.
GPO Verification

Confirms which Group Policy Objects actually applied on each Windows endpoint — the reality on the machine, not what the domain intends. SentinelOps has it because a linked GPO does not guarantee an applied GPO: scoping, inheritance, WMI filters or an errored refresh can silently leave a policy off a machine, and "we linked it" is not the same as "it landed". For the tenant it is proof that a security or configuration policy reached every workstation. Pick a tenant first. Data is collected from the endpoint (gpresult), so a device shows "not collected" until a collection has run.

Fleet summary
The KPIs count Windows devices, how many have collected GPO data, and how many haven’t. Start here to see whether you have enough coverage to trust the picture before drilling into a specific policy.
Per-device results
Each row shows the device, whether it’s online, how many GPOs applied, when policy last applied, and any errors. An "err" badge means gpresult reported problems applying policy on that machine — worth investigating regardless of the count.
Verify a specific GPO
Type a GPO name (e.g. Default Domain Policy) and Check to see, per device, whether that exact policy is applied or missing, with tenant-wide "applied" and "missing it" counts. Example: after linking a new security GPO, confirm it actually reached every workstation rather than assuming it did.
Refresh a device
Refresh on a row triggers a fresh collection from that endpoint (a gpupdate-style refresh); results appear a few seconds later. Use it after a policy change so verification reflects the new state rather than the last cached run.
Identity & access

The federated (OIDC) identities provisioned for sign-in, mapped to a tenant and role, with immediate session revocation. SentinelOps keeps this central list so an external identity can be pre-authorized or cut off in one place, and so disabling an identity kills its live sessions at once rather than waiting for a token to expire. For the tenant it is the control that decides exactly which federated subjects may sign in, under which tenant, and with what role — the authorization side of the SSO you configure under SSO Providers / Per-tenant SSO.

OIDC memberships
Each row is a federated identity: its subject (the IdP’s sub/oid claim), the issuer, the tenant it belongs to, its granted roles, and a revision number. Only identities in scope for the tenant you are viewing are listed. A global operator also sees an SSO settings button to open provider configuration.
Add an identity — field by field
Add identity asks, in turn, for the OIDC subject (the sub claim from your provider, e.g. auth0|abc123), the Tenant it belongs to (e.g. ten_default), and a Role (administrator, operator, helpdesk, file-operator or auditor). This pre-provisions the person so they can sign in through SSO without waiting for just-in-time creation.
Enable / disable
The per-row toggle enables or disables an identity. Disabling it immediately revokes every existing session for that subject — the fast way to cut off a federated user — and re-enabling restores access. Every change bumps the revision and is audited.
Intune Delivery

Confirms that Intune apps and configuration actually reached your Windows devices — not just that Intune reports them assigned. SentinelOps has it because the two often disagree: a policy marked assigned in the portal can stall on the endpoint, and the only ground truth is the Intune Management Extension (IME) state read from the machine itself. For the tenant it proves delivery from the device end: per-device IME state is read from each agent now, and tenant-wide numbers fill in when Microsoft Graph is connected. Pick a tenant first.

Endpoint state vs. Graph
The banner shows whether Microsoft Graph is connected for tenant-wide reporting. Even without Graph, the per-device table works from what each agent collects locally from the IME — enrollment, AAD-join, last sync and app counts.
Read the KPI tiles
Windows devices, IME collected, enrolled and not-collected are counted at the top. A warning-coloured "Not collected" tile means those machines have not reported their Intune state yet — use Collect on each to pull it.
Collect on demand
The Collect button on a device row asks that agent to re-read its IME state; results appear a few seconds later (the view refreshes itself). Use it after you push an app or policy and want to confirm delivery.
Spot failed apps
The Apps column shows the installed count and, in red, any failed apps for that device — a quick way to find machines where a deployment did not land.
IP Address Management

Tracks a tenant’s subnets and IP allocations and reconciles them against what network discovery actually saw on the wire. SentinelOps has it so the record of "which address is what" stays truthful — duplicate assignments, drifted documentation and untracked hosts are caught by comparing the plan to reality rather than trusting a spreadsheet. For the tenant it is an accurate, self-checking address map of their network. Pick a tenant first; editing needs tenant.manage.

Subnets come from Sites & Networks
IPAM builds on the networks you record under Sites & Networks — add a network with a CIDR there and its subnet, utilisation bar and hosts appear here. With no networks recorded the view is empty by design.
Reconcile against discovery
Each allocation shows an "on wire" pill if discovery has seen that address, and every host discovery found but that you have not recorded is listed as "untracked". Click the + on an untracked row to record an allocation for it (IP, hostname, MAC prefilled).
Resolve conflicts
When one IP is allocated more than once a conflict banner lists the offending addresses and the rows are highlighted with a "dup" chip. The Conflicts KPI tile turns warning-coloured whenever any exist.
Add and remove allocations — field by field
With tenant.manage, "+ Allocation" prompts for IP, hostname, kind (static / dhcp / reserved / gateway / dynamic), MAC and a note; saving an already-allocated IP warns you it is a conflict. The ✕ on a row removes an allocation.
Orphan allocations
Recorded IPs that fall outside every known subnet are grouped separately as orphans — usually a wrong CIDR or a missing network. Fix the subnet or add the network so they slot back into place.
ISP / WAN Monitor

Watches the reachability and latency of a client’s public WAN endpoint as seen from the internet, with uptime history over time. SentinelOps has it so an ISP or circuit outage is caught from outside the building — the view a customer’s users actually get — and backed by an uptime record you can take to the carrier. For the tenant it is independent, external proof of whether their internet link is up and how it performs. Pick a tenant first; adding a target needs tenant.manage.

Add a WAN target — field by field
With tenant.manage, + WAN target takes the client’s public endpoint (IP or hostname) and a port — for example their firewall’s WAN IP on 443. It is probed on add and on a schedule thereafter.
Read the status tiles
Each target shows UP/DOWN, last latency in milliseconds, and uptime percentage over the collected samples (green ≥99%, amber ≥95%, red below). A probe error is shown inline when the connect fails.
Probe on demand
Use "Probe now" to force an immediate timed TCP connect — handy for confirming a link is back after an ISP outage without waiting for the next scheduled check.
What it does and doesn’t see
Probes originate from the server (internet-side), so they measure the WAN link’s external reachability. An on-site agent would additionally see the LAN-side path; this view is the outside view.
JIT Access

Just-in-time privilege elevation: an operator requests extra permissions for a specific task and an approver grants a window that auto-expires. SentinelOps has it so nobody carries standing high-risk rights — elevation exists only for the minutes it is needed and vanishes on its own, which is the audit answer to "who could do what, when, and why". For the tenant it means powerful actions on their fleet (run commands, manage files, reveal a local-admin password) are always tied to a named request, an approval and a reason, never to a permanently over-privileged account. Pick a tenant first.

Request access
Click Request access, tick the permissions you need (e.g. command.execute, file.manage, localadmin.reveal), and describe why. The request sits as "requested" until an approver acts. Choose only the permissions the task actually needs — the grant is least-privilege by design.
Approve, deny or revoke
An operator with approval rights sees Approve / Deny on a requested grant, and Revoke on anything active or pending. Approving prompts for a duration in minutes (default 60, max 480). Revoke ends an active elevation immediately.
Break-glass emergency access
The red Break-glass button (needs access.breakglass) self-activates elevation right away for a short window — max 60 minutes — for when no approver is reachable. A reason is required and every use is audited. Use it only as a genuine last resort.
Live expiry
An active grant shows the time left (e.g. "42m left" or "1.5h left") and flips to expired on its own — the countdown is recomputed in the browser so a just-expired grant reads correctly without a refresh.
Log Monitoring

Watches the OS logs on your endpoints — the Windows Event Log, Linux journald or /var/log files, and the macOS unified log — and raises an alert when matching entries appear. SentinelOps has it so a failing service, a disk error or a security event buried in the logs becomes a proactive alert instead of something found during a post-mortem. For the tenant it is fleet-wide log alerting with a companion suppression rule kind that mutes known-benign noise so it never alerts. Evaluation runs server-side by re-using the agent’s read-only log query — nothing new is installed on the endpoint.

Alert rules
An "alert" rule watches for log entries at a level (Warning/Error/Critical) and/or containing a keyword, on the devices its scope selects. When at least the minimum number of matches appear inside the window, it raises a deduplicated incident (routed through Alerts like any other).
Suppression rules
A "suppress" rule mutes matching entries so they never alert and never inflate the dashboard — the fix for recurring noise (e.g. postfix "aliases.db" spam). It needs a level or keyword; a rule with neither is ignored so it can never silence a whole fleet.
Scope & OS
Target all devices in the organization, a single device, or a group, and optionally restrict to one OS. Device-scoped rules follow that device’s organization.
Source selection
Windows rules can name any Event Log channel; Linux rules read journald (optionally one unit) or a /var/log file path. Leave the source blank to watch the whole journal / default log.
Test a rule
Use "Test" to evaluate a rule immediately against a matching online device and see how many entries match right now (and how many the suppressions removed) — before you rely on it.
Recent matches
The top panel lists the most recent matches with device, rule, level and a sample line; click a row to open that device. Evaluation runs server-side about every 10 minutes by re-using the agent’s read-only log query.
Build one from the log browser
In a device’s Quick actions → Logs, set your filters then click "Monitor this…" to open a pre-filled rule for exactly what you were looking at.
MDM — Intune / ABM

Manages mobile devices through Microsoft Intune (Endpoint Manager) — enrolled devices with compliance state and live device actions, driven through the tenant’s existing Microsoft 365 / Entra app registration — plus an Apple Business Manager credential connector. SentinelOps has it so phones and tablets are visible and actionable in the same console as the rest of the fleet, reusing the Graph connection you already set up rather than a second MDM tool. For the tenant it is a compliance-and-control view of their mobile estate. Pick a tenant first.

Where the Intune data comes from
Intune devices are read from the tenant’s Microsoft Graph app — the same connection that powers Microsoft 365 sync. If the banner says a scope is needed, grant DeviceManagementManagedDevices.Read.All on the Entra app registration and admin-consent it, then run a Microsoft 365 sync. The list reflects the last sync; there is no separate credential to set up.
Read the fleet
The KPI tiles count enrolled devices, noncompliant (highlighted), compliant, and company- vs personal-owned. The table lists each device’s OS, compliance state, owner/enrollment type, assigned user and last check-in — noncompliant devices sort to the top so they’re the first thing you see.
Device actions
With command.execute you get per-device actions that run live against Graph: Sync (force a check-in), Lock (remote lock), Reboot, Retire (remove management + company data), and Wipe (factory reset). Retire and Wipe ask for confirmation and additionally require the DeviceManagementManagedDevices.PrivilegedOperations.All scope consented — Graph returns a clear error if it is missing.
Apple Business Manager
ABM is a per-tenant credential connector: store the ABM API Client ID, Key ID and downloaded .p8 private key (sealed in the vault) to prepare Apple device inventory. This build does not run the live Apple orgDevices sync and never shows fabricated Apple devices — meanwhile SentinelOps manages macOS/iOS endpoints directly through its own agent. A full Apple MDM enrolment server is out of scope.
Microsoft 365 Security

Reports the identity-security posture of the tenant’s Microsoft 365 / Entra: Conditional Access policies, MFA registration coverage and Identity Protection risky users. SentinelOps has it because identity is where most 365 breaches begin — an admin without MFA or a report-only CA policy is a gap you want flagged, not buried in the Entra portal. For the tenant it is a single posture screen pulled from their own 365 estate, honest about what has not been assessed. Pick a tenant first.

Connect and sync first
The data comes from a connected, synced Microsoft 365 tenant — if 365 is not connected, or has never been synced, the view tells you so instead of showing stale numbers. Run a 365 sync to populate it.
Conditional Access enforcement
Policies are listed with their state; a "report-only" pill means the policy is evaluated but not enforcing. The "CA report-only" KPI turns warning-coloured so you can find policies to promote to enabled or retire.
MFA registration and admins
The MFA panel shows registration coverage percent, registered/total users and — most important — admins without MFA, which is called out as its own KPI and warning-coloured when any exist.
Risky users
Identity Protection risky users are listed highest-risk first with risk level and state. The high-risk count is a top-level KPI so a spike is visible immediately.
Admin-consent gaps
Some datasets need extra Graph admin consent; where a scope is missing the panel shows a "consent required" note and an "Admin consent needed" list of the exact scopes to grant, so you know why a section is blank.
Mobile Accounts

Enrolment of the SentinelOps mobile operator app, one record per person. The app lets administrators and engineers manage the fleet from a phone or tablet, so a mobile account is offered only to staff roles — a customer-portal account never gets one. SentinelOps separates it from the console login because a phone is enrolled with its own operator token and device limit, which must be issued, masked afterwards, and resettable when someone changes handset. For the tenant it is the controlled way their field staff carry management access without sharing console passwords.

The table
One row per person: User (and role), Username, Platform, Devices enrolled, Enrollment status ("pending" means nobody has enrolled a device against it yet), the operator Token (shown in full only when first issued, masked as ABCD-****-7F92 afterwards), assigned Profile and Policy, 2FA, SSO and Last seen. A banner warns if mobile access is switched off for the organization (and whether platform policy locked it that way).
Create a mobile account — field by field
Create mobile account opens a form: User (only users without a mobile account already), Platform (iPhone / iPad / Android, or decide at enrolment), an optional Mobile profile and an optional Security policy drawn from this tenant’s policies. It creates the account in "pending" until a device enrols against it.
Enrol a device
Open an account and use Generate enrollment QR or Create operator token (both need mobile.operator_tokens.create). The token and its scannable QR — carrying the server address and the token — are shown exactly once; the person scans it in the app or opens the enrollment URL. Copy the token then, because it is never recoverable afterwards.
Reset, disable and delete
Reset enrollment revokes every mobile token and returns the account to pending — do this when someone changes phone. Disable mobile access turns the app off and revokes its tokens; Enable turns it back on. Delete removes only the mobile account (the person keeps their console login) and revokes its tokens. The enrollment history panel logs every issue, reset and enrolment with who did it and when.
My Dashboards

Your own personal KPI dashboards, built from live fleet metrics — for the tenant selected in the top bar, or across all tenants when none is selected (global operators). SentinelOps lets each operator assemble the numbers they personally care about instead of being limited to the fixed dashboard. For the tenant it means an engineer can pin exactly the health signals that matter to their work and keep them one glance away. Only you see your own dashboards.

Create a dashboard
Click "+ New dashboard", name it, then click metrics in "Add a metric" — each card shows its current value, so you see what you are adding. Rename, reorder (↑ ↓) or remove widgets before saving. Up to 24 widgets.
Show on the main Dashboard
Tick "Show on Dashboard" (here in the builder, or in Dashboard → Configure → Your custom KPI panels) and the board appears at the top of the main Dashboard, updating live with it.
Widgets are live and clickable
Every widget shows the metric’s current value and refreshes with the page; click one to open the matching page (Devices, Alerts, Tickets, Backups…) already in context.
Edit or remove
Edit reopens the same builder with your widgets loaded; the ✕ deletes the dashboard. Changes affect only your own view.
My Devices

A read-only list of the devices assigned to you — the end-user’s view of their own enrolled machines and their current status. SentinelOps gives each person this so they can confirm their own hardware is enrolled and reachable without seeing (or being able to act on) the rest of the fleet. For the tenant it is the self-service "are my machines online?" view, with no management controls attached.

What you see
Each row shows the device name, platform/OS, online status and when it was last seen. This is your personal list only, not the full fleet, and there are no actions — it is purely informational.
Status and last seen
The status pill and "last seen" tell you whether a device is currently reachable; a machine that has not checked in recently shows as offline with an older last-seen time.
Nothing assigned
If the list is empty, no devices are assigned to your account yet — ask your IT team to enrol one for you.
My Organization

A customer’s own read-only window on their Microsoft 365 estate — user, group and device counts and their licence subscriptions — inside the tenant portal. SentinelOps surfaces it so a portal user can see what the MSP sees of their directory without being handed admin access to anything. For the tenant it is a self-service snapshot of their M365 footprint and licence usage. A global operator landing here is instead pointed to the Tenants view to pick a customer.

Object counts
Four tiles summarise the synced Microsoft 365 directory: Users, Groups, Devices and the number of licence SKUs. These come from the connected M365 tenant and are read-only.
Licence details
A table of each subscription with Purchased, Assigned and Available seats, so you can see where licences are over- or under-used. A line records when the licence data was last synced; if nothing is connected the panel says there is no Microsoft 365 data yet rather than inventing figures.
My Tenants

The organizations you personally are assigned to, each showing what needs attention — open alerts, offline devices and device count. SentinelOps gives engineers and platform staff this as a fast switcher and triage board across the customers they cover. For the operator it is the quickest way to see where the fires are and jump straight into the right tenant’s context; selecting one moves the whole console into that organization.

Your assignments
Only the tenants you are assigned to appear, and the server re-checks that on every request — this list is a convenience, not the access control itself. Each card shows the organization name, its primary domain or id, and pills for open alerts, offline devices and total devices.
Switch context
Click a card to switch the console to that tenant and open its dashboard. Every view then scopes to that organization until you change it.
On-Call Escalation

What this is: the policy for who gets engaged, and after how long, when an alert goes unacknowledged — plus a live view of which incidents are climbing the tiers right now. Why SentinelOps has it: an alert nobody acknowledges is as bad as no alert, so the platform needs a defined, time-based path that reaches progressively more senior people until someone responds. What it does for the tenant: a dependable guarantee that their incidents are chased up the right chain at the right hours, not left sitting. Pick a tenant first. Editing the policy needs alert.manage; contacts come from Contacts & Vendors.

Business hours — the fields
The policy has a Timezone, business Start/End hours and business Days. The KPIs tell you whether you are in business hours right now, which can change who is on the hook. Example: set 9–17 America/Los_Angeles, Mon–Fri, so after-hours incidents follow the on-call path rather than the daytime one.
Escalation tiers — the fields
Each tier fires after a set number of Minutes without acknowledgement and engages one or more Contacts (by contact id). Tier 1 might page the primary on-call after 15 minutes, Tier 2 the manager after 45. Edit policy walks you through enabling escalation and defining the tiers.
Live status
The lower panel lists unacknowledged incidents with their age, the tier they’ve reached, and who is being engaged right now — so during an event you can see the escalation actually progressing rather than hoping it is.
Root-cause analysis
Analyze on an incident runs an AI root-cause analysis to help the engaged responder orient quickly. It is an aid to triage, not a substitute for acknowledging and working the incident.
Operator Tokens

The bearer credentials issued for this organization — console API keys and mobile-app enrolment tokens — listed, auditable and revocable in one place. SentinelOps keeps them here because a long-lived credential is a standing risk: it must be masked after issue, expire, carry a device limit, and be killable the instant it leaks. For the tenant it is the ledger of every non-password way into their console and fleet, with full visibility of what each token is, who created it, when it was last used and how often.

The table
Each token shows the User it is tied to, a masked value (ABCD-****-7F92), Type (console or mobile), Platform, Status, Created and Expires dates, Last used, use count, Device limit and who created it. A token’s full value exists only in the response that created it — the list never shows it again.
Generate a token — field by field
Generate token opens a form: User (or "not tied to a user"), Type (Mobile enrolment or Console API), Platform (Any / iPhone / iPad / Android), Valid for (hours, default 720, max 8760) and Device limit (default 1; 0 = unlimited). The token inherits the chosen user’s permissions, capped at your own, and is displayed once — with a QR for a mobile enrolment, or to copy for a console key.
Regenerate and new QR
Regenerate revokes the current token and issues a replacement immediately (anything using the old one stops working). New QR likewise issues a fresh token with its QR — because an issued token is never recoverable, a new QR necessarily means a new token and revokes the old one. Both actions confirm first.
Revoke and activity
Revoke (needs the revoke permission) kills a token at its next request. Activity opens the audit entries that mention the token — the action, the actor, the source IP and the result — so a suspicious use can be traced before or after revoking.
Per-tenant SSO

Lets a customer sign in to their own tenant portal with their own identity provider (bring-your-own Entra ID / OIDC), scoped strictly to that one tenant. SentinelOps keeps customer SSO completely separate from operator SSO so a customer’s federated users land only in their read-only portal and can never reach the operator console or another tenant. The MSP sets it up on the customer’s behalf; for the customer it means their staff use their familiar corporate login and see only what you manage for them.

Pick the organization
Choose the customer organization from the dropdown; its current SSO configuration loads below. Each tenant’s SSO is independent — configuring one never touches another or the operator SSO.
Configure it — field by field
The form has: SSO enabled for this organization (a checkbox); a Provider preset (Entra / Google / Okta / Auth0 / Keycloak / Other OIDC) that pre-fills fields and shows provider-specific notes; Issuer (e.g. https://login.microsoftonline.com/<directory-id>/v2.0); Client ID; Client secret (stored write-only — blank on edit keeps the existing one); and Role claim (default "roles", which must carry a portal role such as tenant-portal). Save may return a warning worth reading.
Hand-off to the customer
The page prints a Redirect URI for the customer’s Entra admin to add to their app registration, and a customer Login link to share with their users — both with Copy buttons. These let the customer’s IdP admin complete their side without MSP access.
Authorize the users
No one auto-provisions. After the IdP side is set up, authorize each customer user on Federated Identities: subject = their Entra user object id (oid/sub), tenant = this organization, role = tenant-portal. Only explicitly authorized users can sign in, which is what keeps a tenant’s SSO isolated to that tenant.
Profile Backups

What this is: SentinelOps capturing all (or selected) user profiles off a LIVE Windows endpoint — plus Linux/BSD service configs and the macOS signed-in user’s home — for later recovery. Why SentinelOps has it: ordinary file copies skip in-use files (registry hives, mail stores) and hit access-denied on other users’ profiles, so it reads through a Volume Shadow Copy using SeBackupPrivilege to capture everything cleanly. What it does for the tenant: a recovery copy of a user’s data that SentinelOps takes itself, encrypted at rest and downloadable later under a passphrase, independent of any third-party backup product. Needs the file.backup permission. Pick a tenant first.

What to back up
Pick a saved backup selection (Backups → Backup selections) or Custom to tick areas now — the capture then takes exactly those areas on Windows, macOS or Linux, under the selection’s size cap (checked before anything is copied). Legacy uses the fields below instead: Windows profiles/folders, Linux/BSD service configs, or the macOS signed-in user’s home.
Start a backup — the fields
Choose a Windows endpoint, optionally name which profiles (blank = all) and which folders within each profile (blank = the whole profile), and whether to skip caches (Temp, browser cache, cloud placeholders — on by default to keep archives sane). Because it captures bulk PII, a scoped operator’s job waits for a second approver; engineers/administrators run it directly.
Where it goes
The archive is streamed to SentinelOps and stored encrypted at rest. You download it later choosing the container format (zip / tar / tar.gz) and a passphrase — the passphrase protects the archive that leaves SentinelOps and is never stored, so a lost one is unrecoverable.
Honest status
The Windows agent capture is rolling out. A job sent to an agent that does not yet support it reports that plainly — it never shows a fake success, and no data is read until the capture actually runs.
Backups vs Backup Verification vs this
Backups tracks whether third-party backup jobs are current; Backup Verification proves a backup can be restored; Profile Backups is SentinelOps capturing the profiles itself for recovery.
Configure defaults
Settings → Profile &amp; service backups sets the max archive size, retention, default format, the skip-caches / use-VSS / allow-live-fallback / require-approval defaults, and the cache-exclude directory list — applied to every new capture. All DB-backed and effective immediately.
Troubleshooting
Capture mode is shown per row: "snapshot" = a VSS shadow copy (in-use files included); "live" = VSS was unavailable so it copied live in backup mode (files held open by a signed-in user may be missing — allow this in Settings, or turn it off to fail instead). Common failures: "could not create a VSS snapshot" — the Volume Shadow Copy service is disabled or the SKU/build cannot snapshot (the live fallback covers this); "archive exceeds the maximum transfer size" — raise the max archive size in Settings; "at-rest encryption failed" — the server credential vault (SENTINELOPS_CREDENTIAL_KEY) is not configured. A job that reaches an agent too old to support capture reports plainly and never fakes success. Archives auto-expire per the retention setting.
Profiles & Policies

What this is: reusable per-organization configuration — maintenance windows, patch policy, alert thresholds and retention — that other subsystems read rather than you setting the same thing in a dozen places. Why SentinelOps has it: policy belongs to the organization, not to a single screen or device, so the subsystem that cares about patching or alerting looks up the tenant’s policy instead of carrying its own copy. What it does for the tenant: one authoritative place to define how their fleet is maintained, patched, alerted and retained, applied consistently and never shared across tenants.

New policy — the fields
Add one with + Policy: Organization (shown only when no tenant is selected — a policy always belongs to exactly one), Type (from the server’s list — maintenance_window, patch, alert, retention and any others offered), Name (e.g. "Weeknight maintenance"), a Config (JSON) body, and an Enabled checkbox (on by default). The Config box shows a per-type placeholder as a starting shape — e.g. maintenance_window takes days/start/end/timezone, patch takes auto_approve_critical/reboot/delay_days/exclusions, alert takes cpu/mem/disk thresholds, retention takes audit_days/metrics_days. Invalid JSON is refused with a warning.
Type
What the policy governs. Each subsystem reads only the type it cares about — the patch engine reads patch policies, the alert engine reads alert policies, and so on — so an unused type simply sits until something consumes it.
Scope
A policy belongs to one organization and is never shared across tenants. Switching tenant shows that tenant’s own policies; with no tenant selected the table also names each policy’s organization.
Manage a policy
The Policies table shows each policy’s name, type, on/off State and actions. Edit opens its Name and Config (JSON) for changes; Disable/Enable toggles whether the subsystem honours it without deleting it; Delete removes it after a confirmation (the organization then loses that policy).
Recommendations

What this is: a standing, prioritised feed of the next best actions for the selected tenant, every item derived live from real state. Why SentinelOps has it: findings scattered across security, patching, backup and health screens are easy to miss, so they are distilled into one ranked worklist — and because each item is computed from live signals, fixing the underlying condition makes it drop off on its own rather than lingering as a stale to-do. What it does for the tenant: a single, self-clearing answer to "what should we do next here, and in what order?"

Priority order
Items are grouped open-first then by severity (critical, high, medium, low), each with a category and a short explanation of what to do. The KPI strip counts them by severity so you can size the backlog at a glance.
Open the fix
Where a recommendation maps to a screen, "Open" jumps you straight to the relevant view (and the specific device when applicable) so you can act without hunting for it.
Acknowledge, dismiss, reopen
With tenant.manage you can Ack an item you are working, Dismiss one to hide it until the condition recurs, or Reopen a previously actioned item. Dismissed items dim but stay listed.
Self-clearing
Because items are recomputed from live signals (security posture, patches, backups and more), you do not close them by hand — resolve the real problem and the recommendation disappears; the header notes how many cleared since your last visit.
Registry Editor

A safe remote regedit for managed Windows endpoints — browse, search and edit registry values on a live machine without an RDP session. SentinelOps has it so a one-key fix or policy tweak can be applied (and audited) from the console instead of remoting into each box, with guardrails regedit itself has none of: a backup is taken before every write, boot- and security-critical hives are guarded, and every change is audited. For the tenant it is controlled, traceable registry change management across their Windows fleet.

Pick an endpoint and browse
Choose a Windows machine, a hive (HKLM, HKCU, HKCR, HKU, HKCC) and a key path, then Browse. Click subkeys and breadcrumbs to navigate; values show name, type and data. For example, open HKLM and SOFTWARE\Microsoft\Windows\CurrentVersion to inspect that key.
Edit safely
With registry.edit you can add, edit and delete values. Each write backs up the key first and is audited. REG_MULTI_SZ takes one entry per line and REG_BINARY takes hex; without edit permission you have read-only (registry.read) access.
Protected-path guard
Boot- and security-critical hives are guarded — changing them requires ticking the explicit "override protected-path guard" checkbox, so you cannot brick a machine by accident.
Search under a path
Search looks for a pattern across keys, value names and data beneath the current path (bounded). Narrow the key path first for a faster search on a big hive.
Apply to a group
With edit rights, "Apply to group" fans one value change out to every Windows endpoint in a tenant or device group — same guardrails as a single edit (per-machine backup and audit). Track the result on each device’s job list.
Risk & Exceptions

What this is: a per-tenant risk register and a log of documented security exceptions — what could go wrong, and where the tenant knowingly deviates from a security standard. Why SentinelOps has it: risks and signed-off deviations tend to live in one person’s head or a stray spreadsheet, where they are forgotten until they bite, so they are captured here with owners, severities and expiries. What it does for the tenant: a standing record that feeds the Quarterly Business Review, turning "known issues" into part of the client conversation rather than tribal knowledge. Pick a tenant first. Adding or removing needs tenant.manage.

Risk register — the fields
+ Risk records a risk with a Title, Severity (low/medium/high/critical), Owner and Mitigation, plus likelihood/impact and status. Rows sort highest-severity first. Example: "Legacy app requires SMBv1" at High, owner named, with the compensating control in the mitigation field.
Security exceptions — the fields
+ Exception documents an approved deviation — Title, Reason, Owner, Approver and an optional Expiry date. This is the paper trail for "we know this isn’t to standard, and here’s who signed off and why".
Expiry guarding
An exception past its expiry date is flagged EXPIRED and counted, so a temporary waiver can’t quietly outlive its justification. Review expired exceptions and either renew them with a fresh approval or remediate the underlying issue.
Feeds the QBR
Both registers surface in the tenant’s Quarterly Business Review, so risks and exceptions become part of the client conversation rather than living only in an operator’s head. Remove deletes an entry after a confirmation.
Roles

What each kind of account may do, expressed as a named set of permissions. Built-in roles are fixed and ship with the platform; you can also define custom roles for this organization. SentinelOps centralises this so access is granted by job function rather than by hand-picking permissions per person, and so a tenant can never create a role more powerful than the person who created it. For the tenant it is how "help desk" or "read-only auditor" becomes a reusable, least-privilege building block they assign to users and groups.

Built-in roles
Shown with their exact permission set: Engineer is the top operating role; Administrator runs tenants and fleets; Auditor is read-only. Each is tagged platform or tenant-scoped. These cannot be edited or deleted — they are the fixed baseline every custom role is measured against.
Create a custom role — field by field
Create role opens a form: Name, Description, and a checklist of Permissions. Only the permissions you hold yourself are listed, because the server caps a new role at the creator’s own authority on save. You must tick at least one permission. The role then applies to this organization and can be assigned to users directly or through a user group.
Delete a role
Delete removes a custom role, but the server refuses while any account still uses it — move those accounts to another role first. Built-in roles have no delete.
SLA Tracking

What this is: response and resolution compliance for the tenant, scored live against per-priority targets from imported service-desk tickets. Why SentinelOps has it: an MSP commits to response and resolution times, and a commitment nobody measures is just a promise — so this turns the ticket history into a measured, per-priority compliance number with a breach list. What it does for the tenant: proof of how well their SLAs are being met, and early sight of where they are slipping. Scoring is measured only over tickets that actually reached each stage, so the percentage is honest.

The compliance KPIs
First-response and resolution percentages are measured only over tickets that actually reached each stage, alongside a breach count and how many tickets were scored. Below 85% turns to a warning.
By-priority table
Each priority (critical / high / normal / low) lists its response and resolution targets and the compliance achieved. A "no tickets" dash means nothing at that priority has been measured yet.
Edit your targets — the fields
With tenant.manage, use "Edit targets" to set the first-response and resolution goal in minutes for each priority (0 = not tracked). Until customised, sensible default targets are used and marked as such.
No tickets imported
SLA is computed against imported tickets — if none are imported the screen says so. Import them via QBR → Tickets; the targets remain editable in the meantime.
Breach list
When there are breaches, the worst overrun is listed first with target versus actual time and the overage, so you can see exactly which tickets blew their SLA and by how much.
Software Policies

What this is: a declaration of which applications must be present, may be present, or must not be present on a tenant’s machines, scored live against each device’s reported software. Why SentinelOps has it: unmanaged or forbidden software (an unapproved remote-access tool, a missing required agent) is a real security and licensing risk, and spotting it by eye across a fleet does not scale. What it does for the tenant: an at-a-glance compliance read and a drift list naming exactly which machines break which rule, so you can act on the actual violations. Pick a tenant first; adding policies needs automation.manage.

Compliance KPIs
The tiles show total Policies, total Violations, Compliant devices, and how many have No software list — a quick read on both the rules and the fleet’s adherence before you drill in.
Dispositions
Each policy sets an app as required (must be installed), optional (allowed), or prohibited (must not be installed). The app name is matched as a case-insensitive substring of reported software — e.g. "TeamViewer" flags any TeamViewer build.
Add a policy — the fields
+ Policy (needs automation.manage) prompts for the Application name (the substring to match), the Disposition (required / optional / prohibited), the Scope (tenant / device / group), and — when the scope is device or group — the Device ID or Group ID, plus an optional Note. A tenant-scope policy applies to every machine; a narrower scope targets just that device or group.
Read the drift table
The Drift section lists devices out of compliance with the specific violations (e.g. a prohibited app present, or a required app missing). "No software list" means that device hasn’t reported its software yet, so it can’t be assessed. The ✕ on a policy removes it after a confirmation.
SSO

A read-only summary of the single sign-on posture for this organization: whether SSO is on, whether it is required, whether local emergency sign-in is kept, and how many users actually sign in through the provider. SentinelOps shows it here so an operator can confirm the SSO state of a tenant at a glance without touching provider secrets. For the tenant it is the assurance that staff sign-in is federated and that a provider outage cannot lock everyone out. The provider itself is configured on the platform’s SSO settings (SSO Providers); multiple staff providers are managed there.

Posture fields
Three read-only fields — SSO enabled, SSO required, and Local emergency sign-in — reflect the current Authentication policy, alongside a count of how many users of the total sign in through the provider.
Provider and secrets
The identity provider is configured on the platform’s SSO settings, which apply to every organization that uses it. Provider secrets are write-only: once saved they are never returned here or by the API. A global operator with sso.manage sees a Provider settings button that jumps to the Federated Identities / provider configuration.
Emergency access
Local sign-in is deliberately kept available so an SSO provider outage cannot lock everyone out. Keep at least one local emergency administrator until SSO is proven in production.
SSO Providers

Configure single sign-on for your MSP/operator staff — let the team sign in with your own identity providers (Entra ID / Azure AD, Google Workspace, Okta, Auth0, Keycloak or any OIDC) instead of local passwords. SentinelOps supports as many providers as you need, each with its own login link, because a mixed team may use different IdPs. For the tenant-running operator it means staff access follows your directory and offboarding in the IdP removes console access too. A staff role granted here confers full operator access, so treat the role claim as privileged. The single default SSO under Authentication → SSO keeps working alongside these.

Redirect URI
A single Redirect URI is shown at the top with a Copy button — register it in every provider’s app/client configuration. It is the callback every IdP must be told to return to.
Add / edit a provider — field by field
Add provider opens a form: Name (your label); a Provider preset (Entra / Google / Okta / Auth0 / Keycloak / Other OIDC) that pre-fills the issuer and role claim and shows setup notes; Issuer (the base that serves /.well-known/openid-configuration); Client ID; Client secret (stored write-only — leave blank on edit to keep the existing one); Role claim (the token claim carrying a staff role, e.g. administrator; defaults to "roles"); an optional Tenant claim; Auto-provision users from the role claim (JIT); and Enabled. Save validates and may return a warning you should read.
Reading a provider card
Each card shows the name, an enabled/disabled pill, the issuer, the role claim, whether auto-provision (JIT) is on, and the provider’s own Login link to share with the staff who use that IdP.
Delete
Delete removes a provider after confirmation — staff who signed in through that IdP can no longer do so. The built-in Keycloak setup guide (free, self-hosted) is linked on the page for a zero-licensing-cost option.
Scope
These are for SentinelOps staff/operators only. A customer bringing their own IdP for their tenant portal is configured separately under Per-tenant (Customer) SSO.
Tenants

Each customer is an isolated tenant — devices, views, credentials, jobs and audit are all scoped to one and never bleed across. SentinelOps is multi-tenant by design so an MSP can manage many customers from one console while keeping each one’s data walled off; MSP-level roles can see across tenants and every cross-tenant read is logged. For the customer it is the guarantee that their estate and secrets are theirs alone. Reached from the Dashboard → Tenants tab (global/MSP operators).

Tenant list
One row per visible tenant with its id and creation time. Each offers Manage (opens the tenant’s organization profile and Microsoft 365 view), View machines (jumps to Devices filtered to that tenant), Rename, and — for non-default tenants — Delete. Clicking the row itself opens Manage.
Add a tenant
Add tenant creates a new isolated organization from a name — from that point its devices, jobs, credentials and audit are kept separate from every other tenant.
Migrate resources
The Migrate resources action (top right) moves resources between tenants in a controlled way — used when reorganising customers or correcting where something was enrolled.
Removing a tenant
The red Delete removes a tenant (needs operator.manage). Deletion does NOT cascade and is refused while the tenant still owns any device, job, credential or audit record, or has an active legal hold — so first move or remove those (decommission then Remove its devices, disconnect its cloud connectors, clear its credentials). When the server refuses it returns the exact dependency breakdown so you can clear the blockers. The default tenant cannot be deleted.
Tickets

What this is: a native service desk for the tenant — track work through open → in progress → waiting → resolved → closed, with priorities, assignees and a comment thread. Why SentinelOps has it: issues surface from alerts, endpoints and the client, and routing every one to a separate PSA loses the link to the device and the audit trail, so SentinelOps keeps a first-class ticket of its own. What it does for the tenant: a single place to track their work with device-linked context, and the response/resolution timestamps that feed SLA scoring.

Filter by status
The chips across the top filter the list — Open combines open/in-progress/waiting, and each chip shows its live count. "All" shows everything regardless of status.
Create a ticket — the fields
With ticket.manage, + Ticket prompts for Subject, Priority (low/normal/high/critical), an optional Description and Assignee. New tickets land in the Open view.
Work a ticket
Click a row to open its detail: change status, priority and assignee, and add comments. Tick "internal note" for a comment the client shouldn’t see. First-response and resolved timestamps are captured for SLA scoring.
Device-linked tickets
A ticket tied to a device shows the machine name under the subject, and the row flags a comment count — handy when a ticket came out of an alert on a specific endpoint.
Two-Factor

Second-factor coverage across this organization and, specifically, the accounts still without one. It is a focused slice of the Authentication policy: a worklist rather than a settings page. SentinelOps surfaces it because an account with only a password is the weakest link, and the fastest way to close the gap is a list of exactly who to chase. For the tenant it turns "are we all on 2FA?" into a short, actionable roster.

Coverage
A one-line count of how many accounts out of the total have a second factor registered. When everyone is covered the view says so plainly instead of showing an empty table.
Accounts without 2FA
A table of the accounts still missing a second factor — name, role and last login — each with a Manage button that opens the account. Enrolment is always done by the person themselves (an administrator cannot scan a code into someone else’s authenticator), so from the account you set whether 2FA is required and they complete it at next sign-in.
Setting the requirement
Whether 2FA is required for everyone is set under Authentication → Require two-factor; per-account exceptions are set on the user. This view is the coverage report that tells you where to apply those settings.
User Groups

Collections of people, so a role, a mobile profile or a security policy is assigned once to the group instead of account by account. SentinelOps has it because access and configuration drift when they are set per person — a group keeps a team’s rights consistent and makes onboarding or offboarding one membership change. For the tenant it means "clinical staff" or "help desk" can be defined once and every member inherits the same grant. A group can only ever ADD permissions, never remove them, and membership takes effect immediately. (Device groups — which machines sit together — are under Devices & Access → Groups.)

Create a group — field by field
Create group opens a form: Name, Description, Grants role (only roles you could grant directly are listed — a group’s role is capped the same way as a direct grant), an optional Mobile profile and an optional Policy (security or compliance) drawn from this tenant. Role, profile and policy are all optional — a group can be purely organisational.
What membership grants
Members gain the group’s role permissions on top of their own; the group never takes anything away. The mobile profile and policy are applied to members’ mobile accounts that have none of their own, so a per-person setting always wins over the group default.
Manage members
Members opens a picker of every user in the organization with Add / Remove per person; each change saves immediately. The card shows the member count, the granted role and the first few member chips. Delete removes the grouping only — members keep their own roles.
Users

Every person with access to this organization — operators, engineers, administrators and customer-portal accounts — in one table scoped to the tenant selected in the top bar. SentinelOps keeps it here so access is granted, scoped and revoked from a single place rather than spread across the systems people use. For the tenant it is the definitive record of who can sign in, what they may do, which devices are theirs, and whether they are protected by a second factor. Creating a user issues a temporary password they must change at first sign-in, and every action is audited against this tenant.

The table, column by column
Each row shows Name/email, Username, Role (with account type), Status, Mobile account + Platform, 2FA (the registered methods, or "none"), SSO (linked or local), Devices assigned, Last login and Last seen. "Pending" status means the account has not yet signed in and changed its temporary password. Click a row, or Manage, to open the account.
Create a user — field by field
Create user opens a form: Full name, Username (required), Email, Phone and Role (only roles within your own authority are listed). "Add from a directory…" fills Name/username/email from an existing Microsoft 365 user instead of retyping. For a staff role a Mobile access section appears — tick it to create a mobile operator account, pick a device platform, and (with mobile.operator_tokens.create) generate the operator token + enrollment QR now, setting its valid-for hours and device limit. A temporary password is issued and shown once; the token and QR are shown once too. The mobile app is for staff, so the section is withdrawn entirely for a customer-portal role.
Manage an account
The detail panel shows role, status, 2FA, SSO, device count and last login, plus the assigned Devices (assign or unassign). Two-factor requirement can be set per account to follow the organization policy, be required, or be exempt — enrolment itself is always done by the person. Edit permissions pins permissions on the account (only permissions you hold yourself are offered, the same ceiling the server enforces). Tenant access (for a non-portal account) ticks additional tenants an engineer may work in.
Account actions
From the detail panel: Reset password (issues a one-time temporary password and signs them out), Unlock (clears a lockout after too many failed sign-ins), Reset 2FA (removes their second factors so they can sign in with a password until they re-enrol), Sign out everywhere (kills every session), Enable/Disable account, and Delete user (removes the account, deletes its mobile account, revokes its tokens and unassigns its devices — the audit trail is kept). Each is permission-gated and confirmed.
Warranty & Assets

What this is: warranty posture and asset records for every device in the tenant, sorted soonest-expiry first. Why SentinelOps has it: a lapsed warranty is only discovered when a machine dies and there is no cover, so the platform keeps the asset facts (serials, suppliers, costs, warranty dates) and counts down to each renewal. What it does for the tenant: renewals that never sneak up, an honest view of where asset data is missing (never assumed covered), and the figures that feed renew/replace/retire decisions. Sorted soonest-expiry first.

The posture summary
Header stats count devices in warranty, expiring within 90 days, expired, and unknown. A device with no warranty date is shown as "unknown" — it is never assumed covered.
Read the table
Each row shows the device model and serial, warranty status pill, warranty end date, days left, and support vendor. "expired" in the Left column means the coverage has already lapsed.
Edit an asset record — the fields
Click any row to open the asset editor — Asset tag, Serial, Supplier, PO number, Purchase date, Cost, Warranty start/end, Support vendor, Assigned user, Location and Notes. Filling in the warranty dates is what drives the status pill and the expiry counts.
Feeds cost decisions
Because unknown is never treated as covered, this view honestly shows where you lack data. Warranty renewals due also surface under Cost Optimization to help decide renew, replace or retire.