UPID:pve-01:0032F1A2 · exitstatus:OK · UPID:pve-01:0032F1A2 · exitstatus:OK · UPID:pve-01:0032F1A2 · exitstatus:OK · UPID:pve-01:0032F1A2 · exitstatus:OK · UPID:pve-01:0032F1A2 · exitstatus:OK · UPID:pve-01:0032F1A2 · exitstatus:OK ·

The Problem

Most tools guess.
MTools confirms.

beforeStart/stop shown as done instantly — even mid-failure
MToolsPolls Proxmox's own task status until it truly resolves

Same principle, elsewhere: the WOL widget row stays "sending" for a real window — never an instant fake done.

10.0.20.5 · HTTPS · NUT · SSH:22 · AdGuard:80 · 10.0.20.5 · HTTPS · NUT · SSH:22 · AdGuard:80 · 10.0.20.5 · HTTPS · NUT · SSH:22 · AdGuard:80 · 10.0.20.5 · HTTPS · NUT ·

Architecture

One Flutter app.
Four real protocols.

MTools
Proxmox APIHTTPS · REST
NUTUPS telemetry
AdGuard HomeHTTP API
SSHdartssh2 2.9.0

flutter_background_service runs a separate isolate, polling every 30000ms. State reaches 4 native widgets through the home_widget bridge.

cpuHigh ramHigh swapHigh diskTemp diskUsage containerStopped containerStarted vmStopped vmStarted nodeOffline nodeOnline upsOnBattery upsOnline upsBatteryLow upsLoadHigh upsOffline upsUnreachable upsTempHigh adguardUnreachable connectivityLost networkChanged terminalConnectionFailed

Notifications

22 triggers.
Each with its own memory.

diskUsage30m
cpuHigh10m
upsLoadHigh10m
nodeOffline5m
upsOnBattery5m
connectivityLost5m
containerStoppedinstant
nodeOnlineinstant
diskUsage30m
cpuHigh10m
upsLoadHigh10m
nodeOffline5m
upsOnBattery5m
connectivityLost5m
containerStoppedinstant
nodeOnlineinstant
0m
5m
10m
30m

real cooldown defaults

Trigger order is append-only — inserting one mid-list would silently remap every saved rule to the wrong alert.

udp:fire-and-forget · ssh:timeout(10000ms) · api:fallback · udp:fire-and-forget · ssh:timeout(10000ms) · api:fallback · udp:fire-and-forget · ssh:timeout(10000ms) · api:fallback ·

Wake-on-LAN

Three paths.
One honest result.

1UDP magic packet — same subnet
0ms wait — fire-and-forget, no delivery confirmation
2SSH relay — dartssh2 · etherwake
up to 10000ms — SSHSocket.connect timeout
3Proxmox API — last resort

The widget button locks for 4000ms after sending — long enough to know whether the packet actually left the device.

POST /status/start · GET /tasks/{upid}/status · exitstatus:OK · POST /status/start · GET /tasks/{upid}/status · exitstatus:OK · POST /status/start · GET /tasks/{upid}/status ·

Proxmox

Started or failed —
never "maybe".

POST /nodes/pve-01/lxc/105/status/start
→ UPID:pve-01:0032F1A2:...
GET /nodes/pve-01/tasks/{upid}/status
→ exitstatus: OK

request timeline — polled until resolved

POSTpoll #1poll #2OK
lock_scope_settings lock_scope_power_ops lock_scope_terminal quick_auth_kill_switch lock_scope_settings lock_scope_power_ops lock_scope_terminal quick_auth_kill_switch

App Lock

Lock only what
actually matters.

Settingslock_scope_settings
Power operationslock_scope_power_ops
Terminallock_scope_terminal
touch → Start VM 205
check lock_scope_power_ops
PIN required → unlock

A dedicated kill-switch bypasses the lock entirely if biometrics fail — a broken sensor can't lock you out of your own servers.

pct status 118 · qm start 205 · ssh [email protected] · pct status 118 · qm start 205 · ssh [email protected] · pct status 118 · qm start 205 ·

Terminal

Credentials never
leave the device.

nas-01 — [email protected] · dartssh2 2.9.0
Connected — session established
$ pct status 118
status: running
$ qm start 205
aa636cc2e4b14263ac887568c312cfd2df72cc6beb9b1417699639c22cbc754f · aa636cc2e4b14263ac887568c312cfd2df72cc6beb9b1417699639c22cbc754f · aa636cc2e4b14263ac887568c312cfd2df72cc6beb9b1417699639c22cbc754f ·

Open Source

Every release is
signed, not just tagged.

1
Build release APK
flutter build apk --release
2
Hash it
SHA-256 → aa636cc2…c754f
3
Sign the manifest
Ed25519 → +k98A4Q8…U2yc=
4
Publish to GitHub
mertbskrt/mtools-releases
✓
App verifies before install
fail-closed on mismatch

MIT licensed. Source and release pipeline are both public.

proxmox_provider.dart notification_rule.dart wol_screen.dart quick_auth_gate.dart signature_verifier.dart proxmox_provider.dart notification_rule.dart wol_screen.dart quick_auth_gate.dart signature_verifier.dart

MTools

github.com/mertbskrt/mtools
v3.3.2MIT LicenseFlutter · Android