Everything you need to get a server connected, and what to do when one won't.
You need three things: the address of the machine, whether it answers on HTTP or HTTPS, and a credential. Most platforms issue a scoped API token for this; two of them have no such thing and use an account instead, which is called out where it applies.
| Platform | Credential | What only it can tell you |
|---|---|---|
| Proxmox VE | API token | A guest set to start on boot that isn't running; cluster quorum; failed backup and migration jobs |
| Proxmox Backup Server | API token | A backup job that quietly stopped running |
| TrueNAS SCALE | API key | Live ZFS vdev state and error counters, not just the last self-test |
| Unraid | API key | Array and parity state, container and VM health |
| Portainer | Access token | A container stuck in a restart loop |
| UniFi | API key | An access point that has dropped off the network |
| OPNsense | API key and secret | A WAN that is up and losing packets |
| Pi-hole | App password | Blocking switched off and forgotten |
| AdGuard Home | Web sign-in | Filtering switched off and forgotten |
| Uptime Kuma | API key | Whether the things you care about are answering, and expiring certificates |
| Home Assistant | Long-lived token | Add-ons — start, stop, restart, and one set to start on boot that is not running |
.invalid, so a demo build can't be
pointed at a real machine by accident.
Homelab software is inconsistent about TLS, so the scheme is a per-server choice rather than something the app assumes:
| Platform | Default |
|---|---|
| Proxmox VE | HTTPS only, port 8006 |
| TrueNAS SCALE | Either — HTTP on 80 unless you've configured TLS |
| Unraid | HTTP on port 80 unless you've configured TLS |
Proxmox tokens are created with Privilege Separation ON,
which means the token holds no permissions of its own — even one belonging to
root@pam. The result is a server that connects and reports
"online" with every statistic blank. This is the single most common Proxmox
setup failure, and the app detects the shape and tells you.
Run once as root on any node. In a cluster the users and ACLs replicate to the rest.
pveum role add HomelabDeck --privs "Sys.Audit,Sys.Console,VM.Audit,VM.PowerMgmt,VM.Console,VM.Config.Options,VM.Config.CPU,VM.Config.Memory,VM.Config.Network,Datastore.Audit"
pveum user add homelabdeck@pve --comment "Homelab Deck"
pveum acl modify / --users homelabdeck@pve --roles HomelabDeck
pveum user token add homelabdeck@pve ios --privsep 0
No control, no console. Nothing in the app can change your infrastructure.
pveum role add HomelabDeckRO --privs "Sys.Audit,VM.Audit,Datastore.Audit"
pveum user add homelabdeck@pve --comment "Homelab Deck"
pveum acl modify / --users homelabdeck@pve --roles HomelabDeckRO
pveum user token add homelabdeck@pve ios --privsep 0
Editing a guest — start-on-boot, CPU, memory, network — needs privileges an
earlier role won't have. --append adds them without disturbing
what's already there.
pveum role modify HomelabDeck --privs "VM.Config.Options,VM.Config.CPU,VM.Config.Memory,VM.Config.Network" --append
Proxmox's own error for this lists every privilege the endpoint will
accept, including VM.Config.Disk. The app never edits disks and
doesn't need it — grant only the four above.
Grant the role directly to the existing token instead of rebuilding it.
pveum acl modify / --tokens 'root@pam!yourtoken' --roles HomelabDeck
Proxmox will not open a console for an API token. Every
console endpoint — termproxy, vncshell,
vncwebsocket — rejects token authentication outright; they need
a ticket session, which means an account with a password. Granting
VM.Console is necessary and not sufficient on its own.
So console access is opt-in and stored separately. On the server's screen
in the app, open Edit → Console access and add a username
(with its realm, like homelabdeck@pve) and password. It lives in
the iOS Keychain, is used for nothing but opening a console, and everything
else on the server keeps working if you never add one — the console controls
simply don't appear.
Prefer a dedicated account with only VM.Console — and
Sys.Console if you want a node shell — over root@pam.
An account with two-factor authentication enabled can't be used: Proxmox
returns only a partial ticket and the app has no way to complete the second
step.
A VM also needs a serial port. Proxmox adds none by
default, so termproxy answers "unable to find a serial
interface" on a stock VM. Add a Serial Port under the VM's
Hardware tab and configure the guest OS to use it — on Debian and
most Linux guests that means enabling a getty on ttyS0.
Containers and the node shell need none of this and work straight away.
Windows guests cannot use a serial console at all, with or without the port. There is no text console to attach to; a graphical console is the only option, and that is not in the app yet.
| Privilege | Unlocks | Required |
|---|---|---|
Sys.Audit | Node status, CPU, memory, uptime, and the disk list with SMART health | Yes |
VM.Audit | The VM and container list with state and live metrics | Yes |
Datastore.Audit | Storage pools with capacity and health | Yes |
VM.PowerMgmt | Start, shut down, restart and force stop | Only for control |
VM.Config.Options | The start-on-boot toggle on a guest's page | Only for editing |
VM.Config.CPU | Changing a guest's CPU cores | Only for editing |
VM.Config.Memory | Changing a guest's memory | Only for editing |
VM.Config.Network | Changing a guest's bridge or VLAN tag | Only for editing |
VM.Console | A terminal on a VM or container | Only for the console |
Sys.Console | A root shell on the Proxmox host itself | Only for the node shell |
homelabdeck@pve!ios.--privsep 0 lets the token inherit the user's role. With privilege separation on, the token needs an ACL entry of its own.pveum role modify and pveum user modify instead of add.Proxmox tokens start with Privilege Separation ON, which means the token holds no permissions of its own — even a token belonging to root@pam. That produces a server that connects and reports "online" with every statistic blank. Grant a role at path / and it works.
| Grants | Privileges | |
|---|---|---|
| Node status, CPU, memory, uptime, and the disk list with SMART health | Sys.Audit | Required |
| The VM and container list with their state and live metrics | VM.Audit | Required |
| Storage pools with capacity and health | Datastore.Audit | Required |
| Start, shut down, restart and force stop. Leave this off for a read-only dashboard — controls then return a clear 'missing privilege' message rather than failing oddly | VM.PowerMgmt | Optional |
| Editing a guest from its own page: start-on-boot, CPU cores, memory, and which bridge or VLAN a network interface uses. Each privilege covers only its own field, so granting just VM.Config.Options gets you the auto-start toggle and nothing else | VM.Config.Options, VM.Config.CPU, VM.Config.Memory, VM.Config.Network | Optional |
| A terminal on a VM or container. Proxmox will not open a console for an API token, so this also needs a username and password saved under Console access in the server's settings — the privilege is necessary but not sufficient on its own. A VM additionally needs a serial port in its Hardware tab; containers need nothing | VM.Console | Optional |
| A root shell on the Proxmox host itself. Powerful — grant it only if you want shell from your phone. Like the guest console, it needs a console sign-in as well as this privilege | Sys.Console | Optional |
Run once on any node. Creates a dedicated user rather than using root.
pveum role add HomelabDeck --privs "Sys.Audit,Sys.Console,VM.Audit,VM.PowerMgmt,VM.Console,VM.Config.Options,VM.Config.CPU,VM.Config.Memory,VM.Config.Network,Datastore.Audit"
pveum user add homelabdeck@pve --comment "Homelab Deck"
pveum acl modify / --users homelabdeck@pve --roles HomelabDeck
pveum user token add homelabdeck@pve ios --privsep 0
No control, no console. Nothing in the app can change your infrastructure.
pveum role add HomelabDeckRO --privs "Sys.Audit,VM.Audit,Datastore.Audit"
pveum user add homelabdeck@pve --comment "Homelab Deck"
pveum acl modify / --users homelabdeck@pve --roles HomelabDeckRO
pveum user token add homelabdeck@pve ios --privsep 0
The secret is shown once and cannot be retrieved — reinstalling the app, moving to a new phone or starting over all end here. Remove the token and add it back under the same name: the user, role and ACL are untouched, and the Token ID you type stays the same.
pveum user token remove homelabdeck@pve ios
pveum user token add homelabdeck@pve ios --privsep 0
Editing a guest needs privileges the earlier role didn't include. --append adds them without disturbing what's already there.
pveum role modify HomelabDeck --privs "VM.Config.Options,VM.Config.CPU,VM.Config.Memory,VM.Config.Network" --append
Grant the role directly to the existing token instead of rebuilding it.
pveum acl modify / --tokens 'root@pam!yourtoken' --roles HomelabDeck
Proxmox Backup Server is a separate product from Proxmox VE, with its own API on port 8007. If PBS runs on the same machine as PVE, add it as a second server here — the port is what tells them apart.
There are no VMs or containers to show, because PBS runs nothing. What it answers is whether your backups are actually working, and the check that matters most is one nothing else can see: a backup job that quietly stopped running. Nothing fails, the datastore has room, the guest is up — the only symptom is that the newest snapshot keeps getting older. The app flags anything not backed up for two days, and escalates it after six.
This trips people up, so it's worth being precise. PBS grants
roles to an auth ID at a path. A role is a
named bundle of privileges. You grant roles;
proxmox-backup-manager acl update will reject a privilege name.
| You grant this role… | …at this path | …which contains |
|---|---|---|
DatastoreAudit | /datastore | Datastore.Audit |
Audit | /system | Sys.Audit (and the other read-only audit privileges) |
So acl update /datastore DatastoreAudit is correct, and
acl update /datastore Datastore.Audit is not.
Every one of these is read-only. Nothing in the app can create, change,
prune or delete a backup. Paths are relative to
/api2/json.
| Endpoint | Needs |
|---|---|
GET /version
Confirms the token works when you add the server, and shows the release |
Any valid token |
GET /nodes
Finds the node name — PBS is one machine, but it still names itself |
Sys.Auditon /system |
GET /nodes/{node}/status
CPU, memory, uptime, root filesystem |
Sys.Auditon /system |
GET /nodes/{node}/disks/list
Disk inventory and SMART health |
Sys.Auditon /system |
GET /nodes/{node}/tasks
Failed backup, verify, prune and garbage-collection jobs from the last 48 hours |
Sys.Auditon /system |
GET /status/datastore-usage
Capacity per datastore |
Datastore.Auditon /datastore |
GET /admin/datastore/{store}/groups
How long since each thing was last backed up — the check this platform exists for |
Datastore.Auditon that store |
PBS returns only the datastores your token can audit, so a missing grant looks like an empty list rather than an error. The app treats that as something worth saying: if it can read the server but sees no datastores, or can't read a store's backup groups, it reports that with the privilege you need rather than showing a reassuring "no problems".
Scoping the path to a single datastore narrows what the app can warn you about as well as what it shows: backup freshness is only checked for stores the token can audit.
/datastore and
/system. A Proxmox VE-shaped grant at / silently
does nothing here.Proxmox Backup Server is a separate product from Proxmox VE, with its own API on port 8007. If PBS runs on the same machine as PVE, add it as a second server here — the port is what tells them apart. There are no VMs or containers to show: PBS runs nothing. What it answers is whether your backups are actually working.
| Grants | Privileges | |
|---|---|---|
| Datastore capacity, and how long it has been since each thing was last backed up — the check that catches a backup job which quietly stopped running | Datastore.Audit | Required |
| CPU, memory, uptime, the disk list, and failed backup, verify, prune and garbage-collection jobs | Sys.Audit | Required |
Run once on the PBS host. Creates a dedicated user rather than using root, then grants the two audit roles to the user and to the token — both, because a token can never see more than its user.
proxmox-backup-manager user create homelabdeck@pbs --comment "Homelab Deck"
proxmox-backup-manager user generate-token homelabdeck@pbs ios
proxmox-backup-manager acl update /datastore DatastoreAudit --auth-id homelabdeck@pbs
proxmox-backup-manager acl update /system Audit --auth-id homelabdeck@pbs
proxmox-backup-manager acl update /datastore DatastoreAudit --auth-id 'homelabdeck@pbs!ios'
proxmox-backup-manager acl update /system Audit --auth-id 'homelabdeck@pbs!ios'
Empty braces mean the grants did not take — almost always the user half is missing.
proxmox-backup-manager user permissions 'homelabdeck@pbs!ios'
The secret is shown once and cannot be retrieved — reinstalling the app, moving to a new phone or starting over all end here. Delete the token and generate it again under the same name, so the Token ID you type stays the same. Unlike Proxmox VE, deleting a PBS token also deletes the ACLs granted to it, so the two token grants have to go back — the user's own grants are untouched.
proxmox-backup-manager user delete-token homelabdeck@pbs ios
proxmox-backup-manager user generate-token homelabdeck@pbs ios
proxmox-backup-manager acl update /datastore DatastoreAudit --auth-id 'homelabdeck@pbs!ios'
proxmox-backup-manager acl update /system Audit --auth-id 'homelabdeck@pbs!ios'
Scope to a single store instead of all of them — again for the user and the token.
proxmox-backup-manager acl update /datastore/mystore DatastoreAudit --auth-id homelabdeck@pbs
proxmox-backup-manager acl update /datastore/mystore DatastoreAudit --auth-id 'homelabdeck@pbs!ios'
TrueNAS API keys inherit the permissions of the user that owns them, so the account matters more than the key. A non-privileged user is enough for the dashboard; starting and stopping needs an account that could do the same thing in the web UI.
/alert/list, so it inherits every check iXsystems
adds rather than chasing endpoints as they move. Alerts you've
dismissed in TrueNAS are skipped here too.TrueNAS API keys inherit the permissions of the user that owns them, so the account matters more than the key. A non-privileged user is enough for the dashboard; starting and stopping needs an account that can do the same thing in the web UI.
| Grants | Privileges | |
|---|---|---|
| System info, pools, disks and the app and VM lists | Any user account | Required |
| Starting and stopping VMs and applications | An account that can control VMs and apps | Optional |
Credentials → Local Users → your user → API Keys. On releases before 24.10 it's Settings → API Keys.
Copy the key when it is shown — it is not shown again.
TrueNAS removed the built-in SMART test scheduler, so no self-test runs unless you schedule one — and without a test, no SMART alert can ever fire. Add these under System → Advanced → Cron Jobs. Results arrive automatically as TrueNAS alerts; nothing else to install.
# Short test — weekly is plenty
midclt call disk.smart_test SHORT '[["*"]]'
# Long test — monthly
midclt call disk.smart_test LONG '[["*"]]'
Unraid 7 exposes a GraphQL API through unraid-api. The key
carries its own permissions, granted when you create it.
Settings → Management Access → API Keys, or from the console:
unraid-api apikey --create
If the app can't connect at all, confirm the service is up before suspecting the key.
unraid-api status
Unraid 7 exposes a GraphQL API through unraid-api. The key carries its own permissions, granted when you create it.
| Grants | Privileges | |
|---|---|---|
| Array status, disks and shares | Array and disk read access | Required |
| Starting and stopping containers and VMs | Docker and VM permissions | Optional |
Settings → Management Access → API Keys, or from the console:
unraid-api apikey --create
If the app cannot connect at all, confirm the service is up before suspecting the key.
unraid-api status
The app talks to Portainer, never to the Docker socket directly. The Docker socket has no authentication and no permission model — anything that can reach it is effectively root on the machine — so exposing it to a phone would be a bad trade. Portainer already has API keys and access control.
One Portainer server can front several Docker hosts. Its environments appear as this server's nodes, so a whole Docker fleet is one entry in the app.
In Portainer: your username (top right) → My account → Access tokens → Add access token. It is shown once.
restarting is in a crash
loop. The app treats that as critical rather than as running — which is how
it usually goes unnoticed.Portainer sits in front of one or more Docker hosts, so one Portainer server here can cover your whole Docker fleet — its environments appear as this server's nodes. The app never talks to the Docker socket directly. That socket has no authentication at all, and anything able to reach it is effectively root on the machine.
| Grants | Privileges | |
|---|---|---|
| Every container, its state and health, and the checks that catch a restart loop, a failing healthcheck, or a crash | An access token from your Portainer user | Required |
| Starting, stopping and restarting containers. A Read-only user works fine for the dashboard — controls then fail with a clear message rather than behaving oddly | Environment access: Operator or higher | Optional |
In Portainer: click your username (top right) → My account → Access tokens → Add access token. The token is shown once.
Portainer → My account → Access tokens → Add access token
Tokens inherit the permissions of the user that made them, so make a dedicated user rather than using an administrator.
Portainer → Users → Add user
Portainer → Environments → your environment → Access → assign the user
Uptime Kuma answers the one question a hypervisor cannot: are the things you actually care about responding?
The app reads Uptime Kuma's Prometheus /metrics endpoint rather
than its socket.io API. That endpoint is plain, documented, covers every
monitor, and needs only an API key.
Uptime Kuma answers the one question a hypervisor cannot: are the things you actually care about responding? The app reads its Prometheus `/metrics` endpoint rather than its socket.io API — that endpoint is plain, documented, covers every monitor, and needs only an API key.
| Grants | Privileges | |
|---|---|---|
| Every monitor's up/down state and response time, and a warning when a TLS certificate is close to expiring | An API key | Required |
In Uptime Kuma: your profile (top right) → Settings → API Keys → Add API Key. The key is shown once.
Uptime Kuma → Settings → API Keys → Add API Key
This integration is about the add-ons running inside Home Assistant — start, stop and restart them, and get told when one that is set to start on boot isn't running. That is the same check the app makes on a Proxmox guest, and it works the same way here.
It deliberately does not report entity counts, automation counts, or which entities are unavailable. A real install has hundreds of unavailable entities at any moment and almost all of them are expected — a number that is permanently alarming is a number people stop reading.
Entity states and availability were tried and removed: a battery
sensor can read -1 while it works itself out, and hundreds of
permanently unavailable entities is noise wearing the costume of a warning.
Two entity checks survive, because they earn their place — a
tripped smoke, leak or gas sensor, which is the one thing this app watches
that is wrong in the physical world rather than in a computer, and a battery
that has gone flat, because a dead sensor goes quiet rather than complaining.
/api/hassio/ proxy — even an owner's token — so the app talks
to the Supervisor the same way Home Assistant's own frontend does, and
falls back to the proxy only on releases where it still works. Nothing to
configure either way.unknown state are never treated as broken.
Plenty are legitimately unknown after a restart.This platform is about the **add-ons** running inside Home Assistant — start, stop and restart them, and be told when one set to start on boot isn't running. That is the same check the app makes on a Proxmox guest, and it works the same way here. It does not list your entities: a real install has hundreds that are unavailable at any moment and almost all of them are expected. Two entity checks survive because they earn it — a tripped smoke, leak or gas sensor, and a flat battery.
| Grants | Privileges | |
|---|---|---|
| Every add-on, whether it is running, whether one set to start on boot isn't — and start, stop and restart | A long-lived access token from an administrator | Required |
| A tripped smoke, leak or gas sensor, and a battery that has gone flat | The same token | Optional |
In Home Assistant: click your user name (bottom left) → Security → Long-lived access tokens → Create token. It is shown once and never expires until revoked. Create it while signed in as an **administrator** — Supervisor access is admin-only, so a limited user's token reads entities and shows no add-ons at all.
Home Assistant → your user → Security → Long-lived access tokens
The app uses UniFi's official Network Integration API, which needs Network 9.0 or newer. Older controllers only offer a session login with a username and password, which this app deliberately does not ask for.
/proxy/network/…
automatically, so a standalone-controller URL is not needed.The app uses UniFi's official Network Integration API, which needs Network 9.0 or newer. Older controllers only offer a session login with a username and password, which this app deliberately does not ask for. There is nothing to start or stop — a device is either reachable or it isn't — so UniFi is read-only here.
| Grants | Privileges | |
|---|---|---|
| Every adopted device and whether it is online, how many clients are connected, and which devices have firmware updates | An API key | Required |
In the UniFi Network application, open Integrations in the left-hand navigation and choose Create New API Key. The key is shown once. If there is no Integrations entry, this Network application is older than 9.0 — check Settings → System for its version, which is a different number from the console's firmware version and is usually lower.
UniFi Network → Integrations → Create New API Key
Where this lives has moved between releases and differs on a UniFi OS console. Only the Network application's own key works — a Site Manager cloud key is a different thing and is rejected.
UniFi OS console → Settings → Admins & Users → your admin → API Keys
Site Manager (unifi.ui.com) → a cloud key — NOT this
A firewall knows something nothing else in your homelab does: whether the internet is actually working. A WAN link that is down — or up and losing packets — leaves every server healthy and nothing usable.
pfSense is not supported. It ships no REST API in its base system; reaching one needs a third-party package that most installs don't have, with an entirely different shape. Saying so is better than claiming support that fails on a stock install.
In OPNsense: System → Access → Users → edit a user → API keys → +. A file downloads containing both halves; the secret is never shown again.
Prefer a dedicated user with only these privileges rather than issuing a key against an administrator:
Status: Gateways
Firmware
Diagnostics: System (optional — memory use on the firewall)
A firewall knows something nothing else in your homelab does: whether the internet is actually working. A WAN link that is down — or up and losing packets — leaves every server healthy and nothing usable. **pfSense is not supported.** It ships no REST API in its base system; reaching one needs a third-party package most installs don't have.
| Grants | Privileges | |
|---|---|---|
| Every gateway's state, latency and packet loss, plus whether an update is waiting or a reboot is pending | Status: Gateways, Firmware | Required |
| Memory use on the firewall itself. Optional — leave it off and everything else still works | Diagnostics: System | Optional |
In OPNsense: System → Access → Users → edit a user → API keys → +. A file downloads containing both halves; the secret is never shown again.
OPNsense → System → Access → Users → API keys
Create a user with only the privileges above, rather than issuing a key against an administrator.
OPNsense → System → Access → Groups → add a group with:
Status: Gateways
Firmware
Diagnostics: System (optional)
DNS is the one service whose failure takes a whole house offline while every other reading stays green — the hypervisor is fine, the NAS is fine, and nothing resolves.
But the check worth having isn't uptime. It's whether filtering is still switched on. People disable it to load one page and forget, and nothing about that is visible afterwards: DNS keeps answering, no metric moves, and every ad and tracker is let through for weeks.
Pi-hole 6 or newer. Version 6 replaced the API completely
— the old /admin/api.php endpoint is gone rather than deprecated,
so version 5 cannot be supported.
pihole -g runs weekly by default, so that means the schedule
has stopped rather than one run being missed.AdGuard Home is read-only in the app. Pi-hole's blocking switch is the one exception across both — it exists because seeing "blocking is disabled" and having no way to fix it names a problem and then hands it straight back.
DNS is the one service whose failure takes the whole house offline while every other reading stays green. The check worth having, though, isn't uptime — it's whether blocking is still on. People disable it to load one page and forget, and nothing about that is visible afterwards. **Pi-hole 6 or newer.** Version 6 replaced the API completely; the old one is gone rather than deprecated.
| Grants | Privileges | |
|---|---|---|
| Query volume, block rate, blocklist size and age, active clients, and whether blocking is switched on | An app password | Required |
In Pi-hole: Settings → Web interface / API → Configure app password. Use this rather than your admin password — it can be revoked on its own.
Pi-hole → Settings → Web interface / API → Configure app password
AdGuard Home's API *is* its web interface, so it uses the same username and password you sign in with. There is no separate key to create. As with Pi-hole, the check worth having isn't uptime — it's whether filtering is still switched on.
| Grants | Privileges | |
|---|---|---|
| Whether the resolver is running, whether filtering is on, query volume, block rate, and how stale the filter lists are | Your AdGuard Home web credentials | Required |
The ones you use to sign in to AdGuard Home. If you'd rather not reuse them, add a second user under Settings → General settings → Access.
AdGuard Home → Settings → General settings
Check that iOS has granted the app local network access: Settings → Homelab Deck → Local Network. When it's off, iOS blocks LAN connections silently, which looks exactly like every host being down.
You're almost certainly pointing HTTPS at a server that only speaks cleartext. Edit the server and set the connection to HTTP. Unraid in particular serves on port 80 by default.
Proxmox: the token has Privilege Separation on and holds no permissions
of its own. Grant it a role on path /, or recreate it with
--privsep 0. See the Proxmox section.
Other platforms: the account owning the key can't read those endpoints. The app records why each fetch failed and surfaces it as a concern, so check the concerns list for the specific message.
The certificate changed. That's a hard failure by design — a silently accepted new certificate is indistinguishable from someone intercepting the connection. Remove the server and add it again, comparing the new fingerprint against the one the server's web UI shows.
The token is read-only. On Proxmox, add VM.PowerMgmt to its
role. On TrueNAS and Unraid, the key needs to belong to an account that can
start and stop things in the web UI. This is deliberate — a read-only token
is a supported configuration, and the dashboard works fully without control.
Proxmox accepts a task and runs it asynchronously; the app polls for up to 25 seconds. Past that it says the task is still running rather than claiming success or failure, because it genuinely doesn't know yet. Refresh in a moment to see the outcome.
If no passcode is set, or biometrics are locked out after failed attempts, control drops to confirmation-only rather than becoming unreachable. That's intentional — being locked out of your own infrastructure because of a biometric hiccup is worse than a confirmation sheet.
Once you have authenticated, biometrics stay unlocked for five minutes. The window closes as soon as the app leaves the foreground.
On 25.10, disks in a pool report live ZFS status, so this shouldn't happen for pool members. For SMART-specific alerts, no self-test has ever run — schedule one with the cron commands above. An alert can't fire without a test behind it.
A full refresh makes a lot of calls: on Proxmox, a version check plus one config lookup per stopped guest (cached between refreshes); on TrueNAS, alerts, reporting, temperatures and pool topology — though on releases with the JSON-RPC API those now share one websocket connection instead of paying a round trip each. On a large fleet it still adds up; reducing it further is known work in progress.
And what it owes you once it has decided: every warning states the problem in plain words. Where the cause is configuration — a missing privilege, a token without a role — it carries the fix: why it happens, numbered steps, and the exact command, copyable. Where there is no fix, or the fix didn't help, a Diagnostics section holds the raw failure and an assembled report — app and platform versions, what was read, every warning — with a copy button and a one-tap email to support. The report never includes your credentials or your servers' addresses.
Most stopped guests are stopped on purpose, so a stopped guest raises
nothing by itself. The alert fires when the platform's own auto-start flag is
set and the guest isn't running — Proxmox onboot, TrueNAS
autostart, Unraid autoStart. It's deliberately not a
setting inside the app: it's your declaration, on your own server, so it can't
drift out of sync with reality.
Templates are excluded everywhere — they're permanently stopped by design. Where a platform doesn't report an auto-start flag at all (TrueNAS apps, Unraid VM domains), nothing is raised; unknown is never treated as a problem.
One known trade-off: onboot means "start when the host boots",
not "should be running right now". A guest stopped for maintenance will be
flagged until it comes back.
Concerns come in two weights. Warnings and above are things to act on — they colour the server badge and are what "N things need attention" counts. Advice appears in the list under a calmer heading but leaves a healthy server looking healthy.
The main advisory is ZFS fullness past 80%: write performance degrades as the allocator moves from first-fit to best-fit, before the pool is actually short of space and below TrueNAS's own 85% alert.
Long-press a concern you've looked at and decided to live with. It moves to a collapsed card at the bottom of the dashboard and stops counting toward the badge and the fleet header.
Two things break back through an acknowledgement:
Acknowledgements are per-server, and removing a server forgets them — so a re-added server doesn't arrive pre-silenced.
Every alert threshold is adjustable in Settings, and the defaults reproduce the app's behaviour exactly, so an untouched install is unchanged.
Everything above works with nothing but the phone. The agent is a small service you can run on your own hardware for the things a phone cannot do: keep polling while it is asleep, hold a year of history, and send notifications from hardware you own. It runs the app's own adapters, so it grades a problem exactly the way the phone does.
Installing it, pairing a phone with it, pairing again after a new or reset phone, and the certificate rules all have their own page: the agent.
Three platforms are supported today, and which one gets built next is decided by what people ask for. There's no tracker to sign up to and no account to create — it's an email, and it reaches the person who writes the app.
Running something that isn't in the list above — XCP-ng, Harvester, Technitium, a Synology, something else entirely? Say so. Adding a platform is a contained job, because every platform in the app is an adapter behind one shared interface.
Worth knowing: a Synology adapter is already written but isn't offered yet, because nobody has been able to run it against a real NAS. If you have one and would try it, that's the fastest way to get it switched on.
Missing something on a platform that's already supported — a metric, a control, a screen, a notification? Those are usually smaller and land sooner.
Both buttons open your mail app with a few prompts already filled in. Answer what you can and delete the rest — a one-line request is still worth sending. If the buttons don't work, mail [email protected] directly.
Email [email protected]. It's a small operation, so please include:
Never send an API token, a password, or a screenshot with one visible. Nothing about diagnosing a problem requires it.