Family and phone sharing
An adult signs in, creates the family and pairs a phone through the app. A child’s paired phone needs no account. Eligible paid keys are still required; downloading the APK does not make a paid key free.
Choose location and other sharing on each phone. Family views show only permitted information, with its age. Chat, map and SOS depend on connectivity and permissions; SOS is not an emergency-service connection. Family chat is stored on the service and is not end-to-end encrypted.
New source work adds shared daily screen-time totals, new-app counts and risk reasons, with revocation. These are summaries and bedtime reminders, not enforced time limits, app blocking or YouTube supervision. Real-phone checks remain required. Read every new check and its limits.
Three views of your connected devices
Personal brings together your phones, family sharing, alerts, reports and keys. Organisation adds fleet monitoring, servers, members, roles and audit records. Enterprise XDR brings incidents, timelines, hunting and supported server response together. Its findings depend on events your agents actually send; an empty dashboard is not proof of safety.
How the pieces fit
Everything reports to one hub: the service behind the web console at safeavio.com. Around it sit three kinds of reporter, each with its own credential, and none of them can act on behalf of another.
| Piece | What it is | How it proves who it is |
|---|---|---|
| Console | The web app where you see servers, devices, alerts and incidents, and where administrators act | Your account sign-in: an access token that lasts one hour by default, and a single-use refresh token |
| Server agent | A service on each server you monitor (ServerGuard) | An agent API key, generated at install |
| Phone | The Android app, linked to a console with a one-time code | A device token issued when the code is redeemed |
| Desktop | The Sentinel app for Windows and macOS (not released) | A device token kept in the operating system's key store |
An organisation (a tenant) owns servers, devices, alerts and members, and is isolated from every other organisation. Reporters send events in one shared shape; the hub maps each to MITRE ATT&CK techniques and groups related ones into incidents. Thresholds on server metrics raise alerts to the channels you choose.
The consumer and business sides are separated by design: a phone or desktop token authorises reporting only, never an administrative action. Privileged actions on servers exist only in the business console, at an administrator's instruction, and are audited.
Availability labels
A label only moves up when there is a rule, a real input and a test behind it. These docs describe only what is available or limited unless they say otherwise.
Install the server agent (Linux)
Run this on the server you want to monitor. You need root, systemd and Python 3 with its venv module; the hub must be able to reach the server on TCP 9876.
curl -sSL https://safeavio.com/install.sh | sudo bash -s -- \
--hub-url https://safeavio.com --name "My Server"Prefer to read it first? Download it, read it, then run it:
curl -sSLo install.sh https://safeavio.com/install.sh
less install.sh
sudo bash install.sh --hub-url https://safeavio.com --name "My Server"The installer creates a Python environment in /opt/serverguard-agent, writes its configuration and a generated API key to /etc/serverguard-agent, and starts the serverguard-agent systemd service on port 9876. Options: --hub-url, --hub-key, --port, --name, --uninstall.
sudo systemctl status serverguard-agent
sudo systemctl restart serverguard-agent
sudo journalctl -u serverguard-agent -f
# health check (no key needed)
curl http://localhost:9876/healthConnect a server to your console
- Create an account, sign in, and open Servers → Add server. The server will belong to the organisation you are working in.
- Pick the operating system; the wizard shows the install command for it. Run it on the server.
- Copy the API key the installer prints. It is also in
/etc/serverguard-agent/api_key. - Register the server: name, IP address, port
9876and the key. - The wizard waits for the first heartbeat. Use Test connection if it does not arrive.
- Allow port 9876 only from the hub (see network and keys).
Your plan sets how many servers you can add; a server over the limit is refused with a "plan limit reached" message.
Enrol an Android phone
The app works without enrolment. Enrol a phone when you want to see it in the console and lock, locate, sound or wipe it from there.
- In the console open Devices → Add device (personal accounts) or Add device and enrollment codes (organisations) and create a code. Codes are single-use and expire.
- On the phone, download the app and allow your browser to install it.
- Open the app, go through the short introduction and grant the permissions it explains.
- Open Settings → Add this device and enter the code.
The phone appears in the console with its posture score and the reasons behind it. No account is created on the phone. To remove it, retire the device in the console before uninstalling the app: switching off device administrator on a linked phone is treated as tampering and locks it.
Your first alert
- Open Alerts → Channels and add where alerts should go: email (your SMTP server), Slack, Discord, Telegram or a webhook. Press Test to send a test message. Channel secrets are encrypted at rest.
- Open Alerts → Rules. The essential preset creates the basic rules in one step, for example CPU above 90 % for two minutes, with a five-minute cooldown.
- Or write your own: a metric, a comparison, a threshold, how long it must hold, a severity and a cooldown.
- When a rule fires it appears in the alert history, where you can acknowledge or resolve it.
Metrics you can alert on: CPU, memory, disk and swap use; network in and out; load average; process count; container and service status; failed logins; file changes; uptime; security score. Creating rules and channels needs the alerts:configure permission (owner or admin).
One agent per platform
Each installer (install.sh, install-mac.sh, install.ps1) sets up a single-file agent that opens no port. It sends a heartbeat and polls for commands over HTTPS, so it works behind NAT, and it updates itself from signed manifests every five minutes. Served today: Linux 3.19, macOS 3.16, Windows 3.14.
| Item | Linux | macOS | Windows |
|---|---|---|---|
| Metrics, processes, services, logs | Yes | Yes | Yes |
| Signed self-updates (Ed25519) | Yes | Yes | Yes (verified on one Windows Server) |
| Malware scan (ClamAV), firewall control, reboot | Yes | Limited | Limited |
| Container security, web-attack and DDoS signals | Yes | Limited | Limited |
On servers, ransomware detection (detect only), the data-leak scan (redacted findings) and secure delete (with the SSD/NVMe limit stated) run in the Linux 3.19 and macOS 3.16 agents; the Windows 3.14 agent has them built but not yet verified on a real Windows host. The network scanner and optimiser are Linux only. Web protection, anti-tracker, privacy guard and safe banking are desktop features: not applicable to a server agent. Each server’s Security tab → Capabilities shows the exact status per platform.
Configuration
Settings live in /etc/serverguard-agent/config.json. Restart the service after changing them.
| Option | Meaning | Default |
|---|---|---|
server_name | Display name for this server | hostname |
hub_url | Hub base URL; use https | set by --hub-url |
api_key | Required on every request to the agent | none: the agent refuses all requests without one |
hub_ca_bundle | PEM of a private CA that issued the hub certificate | system trust store |
hub_ca_cert | Pinned self-signed hub certificate | — |
port, heartbeat_interval, hub_api_key | Installer agent only | 9876 / 30 s / none |
Agent endpoints
The hub reads the agent over these routes. Every one except /health needs the X-API-Key header, compared in constant time.
| Route | Method | Returns or does |
|---|---|---|
/health | GET | Liveness, no key |
/api/metrics/overview, /cpu, /memory, /disk | GET | Metrics |
/api/system/info | GET | System information |
/api/processes | GET | Process list |
/api/processes/{pid}/kill | POST | End a process |
/api/network/stats, /connections, /interfaces, /ports | GET | Network state |
/api/docker/containers, /images | GET | Containers and images |
/api/docker/containers/{id}/{action} | POST | Container action |
/api/services, /api/services/{name}/{action} | GET / POST | Services and service actions |
/api/logs, /api/logs/{type} | GET | Available logs and their contents |
Network and keys
- Keep port 9876 closed to the internet. The agent connects out to the hub over HTTPS (heartbeat and poll), so no inbound port is needed.
- Keep hub TLS verification on. Agents verify the hub's certificate by default.
HUB_ALLOW_INSECURE_TLS=1turns it off for lab installs only and logs a warning on every start; never set it in production. - Treat the API key as a password. Anyone with it can call the agent and send heartbeats as that server.
sudo ufw allow from HUB_IP to any port 9876To rotate the key: write a new random key to the agent's key file, restart the service, then update the key on the server in the console. Requests are refused until both sides match.
How updates work
The full Linux and macOS agents ask the hub for updates and accept only a manifest signed with Ed25519, checked against a public key built into the agent. They then check, in order: expiry, that the version is strictly newer, the payload's SHA-256 and size, and the product and platform. Any failed check refuses the update.
Releases move through 5, 25, 50 and 100 % rollout bands, and an operator can roll back with a recorded reason. Recorded deviations: the root key signs manifests directly and is held on the hub, not offline; legacy MD5-checked updates are accepted on the internal channel until 15 October 2026. Agents installed before 1 October 2026 pin no key and need one manual upgrade. Key fingerprints are on the download page.
The installer agents do not update themselves; re-run the installer. The Windows agent checks for updates but neither verifies nor applies them.
macOS and Windows agents
Both are less tested than the Linux agent; the Windows agent has not been verified in production. They are server-monitoring agents, not the Sentinel desktop app.
curl -sSL https://safeavio.com/install-mac.sh | bash
# uninstall
curl -sSL https://safeavio.com/install-mac.sh | bash -s -- --uninstallirm https://safeavio.com/install.ps1 | iex
# uninstall
irm https://safeavio.com/install.ps1 -OutFile install.ps1
powershell -ExecutionPolicy Bypass -File .\install.ps1 -UninstallmacOS installs to ~/.serverguard-agent with a launchd job; Windows installs to %ProgramData%\ServerGuard-Agent with a scheduled task running as SYSTEM and an inbound firewall rule for 9876.
Organisations and roles
Each organisation is a separate tenant. If you belong to several, switch between them from the header; removing someone from one does not affect the others. Owners and admins manage members; an organisation cannot lose its last owner.
| Role | Can |
|---|---|
owner | Everything in the organisation, including billing |
admin | Everything except buying or changing the plan |
analyst | Read everything, acknowledge alerts, triage incidents, tune detection rules |
operator | Read everything, run device and server commands, acknowledge alerts |
viewer | Read everything, including the audit trail; change nothing |
member | A personal account: its own devices, servers, policies and plan |
Optionally, an organisation can require a second person to approve reboot, shutdown and firewall-disable commands. The request waits, a different person with servers:act approves it within an hour, and every step is audited.
API overview
| Area | Routes | Credential |
|---|---|---|
| Public | GET /api/plans | None |
| Sign-in | POST /api/auth/login, /refresh, /logout; GET /api/auth/me/permissions | Password, then bearer token |
| Agents | POST /api/servers/agents/heartbeat, /update-check; POST /api/xdr/telemetry | Agent API key |
| Desktop devices | POST /api/desktop/enroll, /telemetry, /consent | One-time code, then X-Device-Token |
| XDR read | /api/xdr/timeline, /incidents, /hunt, /entity, /mitre/coverage | Bearer token, tenant-scoped |
| Alerts | /api/alerts/rules, /channels, /history | Bearer token, tenant-scoped |
| Audit and account | GET /api/audit; /api/account/export, /sessions, /delete-request | Bearer token |
Every authenticated request binds the caller's organisation; asking for another organisation's record by id returns not-found. Desktop telemetry accepts at most 500 events per request and answers 413 above that.
Event contract
Server agents, Android phones and the Sentinel desktop app all report into one stored shape, so the XDR timeline can show them side by side. Each producer keeps its richer model and maps into this on send; anything extra goes into metadata rather than being dropped.
| Field | Meaning |
|---|---|
id | Generated by the hub on ingest |
timestamp | When the producer saw it (ISO 8601) |
source | agent, android or desktop |
category | One value from the category list below |
severity | 1 info · 2 low · 3 medium · 4 high · 5 critical |
ip_address, user | Optional; for endpoints user is the device name |
description | One human-readable line |
metadata | All structured data, including entity_type (server, mobile, desktop), evidence and privacy_classification |
tenant_id | Set by the hub from the authenticated server or device, never from the client |
| schema 1.1 fields | Optional version, rule, policy, risk, correlation and provenance fields; empty on 1.0 events |
The hub adds the ATT&CK mapping (metadata.attack) itself; a producer may not set it. It never raises a severity above what the producer reported.
Categories and ATT&CK
| Category | Meaning | Techniques |
|---|---|---|
auth_failure | Failed login | T1110 |
brute_force | Repeated failures from one source | T1110.001 / .003 |
port_scan | One peer, many ports | T1046 / T1595 |
user_created / user_deleted | Local account change | T1136 / T1098 |
suspicious_process | Deleted binary, temp path, piped shell, inline base64 | T1055 / T1059 |
config_change | Firewall, SSH or audit config touched | T1562.001 |
log_gap | Logging stopped or cleared | T1070 / T1562.008 |
mobile_root_detected | Phone is rooted | T1406 / T1633 |
mobile_remote_access | Remote-support app holds accessibility control | T1219 / T1417.002 |
mobile_tamper | Device administrator revoked, app force-stopped | T1406 / T1624 |
desktop_suspicious_process | Rule fired on process lineage | T1059 / T1218 |
desktop_ransomware_behavior | Burst of file changes in watched folders | T1486 / T1490 |
desktop_link_verdict | A link check returned suspicious or malicious | T1566 / T1204.001 |
A sample, not the full list. Every category must have an ATT&CK mapping or the hub rejects it, so the timeline cannot fill with events that mean nothing. A category existing is not proof the event is collected today: the threat center says which attack families we actually detect.