Support

Everything you need to get a server connected, and what to do when one won't.

On this page

Adding your first server

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.

Every platform at a glance

PlatformCredentialWhat only it can tell you
Proxmox VEAPI tokenA guest set to start on boot that isn't running; cluster quorum; failed backup and migration jobs
Proxmox Backup ServerAPI tokenA backup job that quietly stopped running
TrueNAS SCALEAPI keyLive ZFS vdev state and error counters, not just the last self-test
UnraidAPI keyArray and parity state, container and VM health
PortainerAccess tokenA container stuck in a restart loop
UniFiAPI keyAn access point that has dropped off the network
OPNsenseAPI key and secretA WAN that is up and losing packets
Pi-holeApp passwordBlocking switched off and forgotten
AdGuard HomeWeb sign-inFiltering switched off and forgotten
Uptime KumaAPI keyWhether the things you care about are answering, and expiring certificates
Home AssistantLong-lived tokenAdd-ons — start, stop, restart, and one set to start on boot that is not running
  1. Create an API token on the server — the sections below give the exact commands per platform.
  2. In the app, tap Add Server, pick the platform, and enter the address, port and token.
  3. If the server uses a self-signed certificate, the app shows you its fingerprint. Compare it against the one your server's own web UI displays, then trust it.
No servers to hand? Tap Explore with sample data on the empty state. It fills the app with a fabricated homelab — including a server that's having a bad day — and makes no network connections at all. Every demo address ends in .invalid, so a demo build can't be pointed at a real machine by accident.

HTTP or HTTPS?

Homelab software is inconsistent about TLS, so the scheme is a per-server choice rather than something the app assumes:

PlatformDefault
Proxmox VEHTTPS only, port 8006
TrueNAS SCALEEither — HTTP on 80 unless you've configured TLS
UnraidHTTP on port 80 unless you've configured TLS
Over HTTP your API token crosses the network unencrypted. That's a reasonable trade on a network you trust, and a bad one otherwise. The app says so at the point you choose, rather than letting it pass silently.

Proxmox VE

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.

Everything, including console access

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

Read-only dashboard

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

Adding the edit privileges to a role you already made

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.

Already made a token that isn't working?

Grant the role directly to the existing token instead of rebuilding it.

pveum acl modify / --tokens 'root@pam!yourtoken' --roles HomelabDeck

The console needs a password as well as a privilege

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.

What each privilege buys

PrivilegeUnlocksRequired
Sys.AuditNode status, CPU, memory, uptime, and the disk list with SMART healthYes
VM.AuditThe VM and container list with state and live metricsYes
Datastore.AuditStorage pools with capacity and healthYes
VM.PowerMgmtStart, shut down, restart and force stopOnly for control
VM.Config.OptionsThe start-on-boot toggle on a guest's pageOnly for editing
VM.Config.CPUChanging a guest's CPU coresOnly for editing
VM.Config.MemoryChanging a guest's memoryOnly for editing
VM.Config.NetworkChanging a guest's bridge or VLAN tagOnly for editing
VM.ConsoleA terminal on a VM or containerOnly for the console
Sys.ConsoleA root shell on the Proxmox host itselfOnly for the node shell

What the Proxmox VE credential needs

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.

GrantsPrivileges
Node status, CPU, memory, uptime, and the disk list with SMART healthSys.AuditRequired
The VM and container list with their state and live metricsVM.AuditRequired
Storage pools with capacity and healthDatastore.AuditRequired
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 oddlyVM.PowerMgmtOptional
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 elseVM.Config.Options, VM.Config.CPU, VM.Config.Memory, VM.Config.NetworkOptional
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 nothingVM.ConsoleOptional
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 privilegeSys.ConsoleOptional

Everything, including console access

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

Read-only dashboard

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

Lost the secret? Regenerate it

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

Adding the edit privileges to a role you already made

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

Already made a token that isn't working?

Grant the role directly to the existing token instead of rebuilding it.

pveum acl modify / --tokens 'root@pam!yourtoken' --roles HomelabDeck

Proxmox Backup Server

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.

Roles and privileges are not the same thing

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/datastoreDatastore.Audit
Audit/systemSys.Audit (and the other read-only audit privileges)

So acl update /datastore DatastoreAudit is correct, and acl update /datastore Datastore.Audit is not.

What the app calls, and what each call needs

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.

EndpointNeeds
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.Audit
on /system
GET /nodes/{node}/status
CPU, memory, uptime, root filesystem
Sys.Audit
on /system
GET /nodes/{node}/disks/list
Disk inventory and SMART health
Sys.Audit
on /system
GET /nodes/{node}/tasks
Failed backup, verify, prune and garbage-collection jobs from the last 48 hours
Sys.Audit
on /system
GET /status/datastore-usage
Capacity per datastore
Datastore.Audit
on /datastore
GET /admin/datastore/{store}/groups
How long since each thing was last backed up — the check this platform exists for
Datastore.Audit
on 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.

What the Proxmox Backup Server credential needs

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.

GrantsPrivileges
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 runningDatastore.AuditRequired
CPU, memory, uptime, the disk list, and failed backup, verify, prune and garbage-collection jobsSys.AuditRequired

A read-only account and token

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'

Check what the token can actually see

Empty braces mean the grants did not take — almost always the user half is missing.

proxmox-backup-manager user permissions 'homelabdeck@pbs!ios'

Lost the secret? Regenerate it

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'

Granting only one datastore

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 SCALE

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.

Things that surprise people

What the TrueNAS credential needs

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.

GrantsPrivileges
System info, pools, disks and the app and VM listsAny user accountRequired
Starting and stopping VMs and applicationsAn account that can control VMs and appsOptional

Create the key

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.

Schedule SMART tests (25.10 and newer)

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

Unraid 7 exposes a GraphQL API through unraid-api. The key carries its own permissions, granted when you create it.

Create the key

Settings → Management Access → API Keys, or from the console:

unraid-api apikey --create

Check the API is actually running

If the app can't connect at all, confirm the service is up before suspecting the key.

unraid-api status

What the Unraid credential needs

Unraid 7 exposes a GraphQL API through unraid-api. The key carries its own permissions, granted when you create it.

GrantsPrivileges
Array status, disks and sharesArray and disk read accessRequired
Starting and stopping containers and VMsDocker and VM permissionsOptional

Create the key

Settings → Management Access → API Keys, or from the console:

unraid-api apikey --create

Check the API is actually running

If the app cannot connect at all, confirm the service is up before suspecting the key.

unraid-api status

Docker via Portainer

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.

Creating an access token

In Portainer: your username (top right) → My account → Access tokens → Add access token. It is shown once.

What the Portainer credential needs

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.

GrantsPrivileges
Every container, its state and health, and the checks that catch a restart loop, a failing healthcheck, or a crashAn access token from your Portainer userRequired
Starting, stopping and restarting containers. A Read-only user works fine for the dashboard — controls then fail with a clear message rather than behaving oddlyEnvironment access: Operator or higherOptional

Creating an access token

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

Limiting what the token can reach

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

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.

What the Uptime Kuma credential needs

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.

GrantsPrivileges
Every monitor's up/down state and response time, and a warning when a TLS certificate is close to expiringAn API keyRequired

Creating an API key

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

Home Assistant

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.

What the Home Assistant credential needs

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.

GrantsPrivileges
Every add-on, whether it is running, whether one set to start on boot isn't — and start, stop and restartA long-lived access token from an administratorRequired
A tripped smoke, leak or gas sensor, and a battery that has gone flatThe same tokenOptional

Creating a long-lived access token

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

UniFi

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.

What the UniFi credential needs

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.

GrantsPrivileges
Every adopted device and whether it is online, how many clients are connected, and which devices have firmware updatesAn API keyRequired

Creating an API key

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

If your console puts it somewhere else

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

OPNsense

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.

Creating an API key and secret

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)

What the OPNsense credential needs

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.

GrantsPrivileges
Every gateway's state, latency and packet loss, plus whether an update is waiting or a reboot is pendingStatus: Gateways, FirmwareRequired
Memory use on the firewall itself. Optional — leave it off and everything else still worksDiagnostics: SystemOptional

Creating an API key and secret

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

A read-only user for the app

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)

Pi-hole and AdGuard Home

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

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.

AdGuard Home

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.

What the Pi-hole credential needs

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.

GrantsPrivileges
Query volume, block rate, blocklist size and age, active clients, and whether blocking is switched onAn app passwordRequired

Creating an app password

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

What the AdGuard Home credential needs

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.

GrantsPrivileges
Whether the resolver is running, whether filtering is on, query volume, block rate, and how stale the filter lists areYour AdGuard Home web credentialsRequired

Which credentials to use

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

Troubleshooting

Every server shows as unreachable, and nothing else is wrong

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.

"A TLS error caused the secure connection to fail"

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.

The server connects and says "online", but every number is blank

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 app refuses to connect after I reinstalled or upgraded the server

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.

A control action returns "missing privilege"

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.

An action reports "still running" instead of succeeding

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.

Face ID never prompts

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.

TrueNAS disks all read "Unknown"

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.

Refreshing is slow

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.

How the app decides something is wrong

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.

Stopped guests

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.

Advisory vs. attention

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.

Acknowledging a concern

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.

Thresholds

Every alert threshold is adjustable in Settings, and the defaults reproduce the app's behaviour exactly, so an untouched install is unchanged.

The agent (optional)

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.

Request a platform or feature

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.

Add a platform

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.

Request a platform

Add a feature

Missing something on a platform that's already supported — a metric, a control, a screen, a notification? Those are usually smaller and land sooner.

Request a feature

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.

What actually helps: for a platform, whether it exposes an API and a link to its documentation — that's the single thing that decides whether support is a weekend or impossible. For a feature, what you're trying to accomplish rather than the control you imagine doing it; the problem usually has a better answer than the one either of us thought of first.

Contact

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.