Your Windows tasks fail silently. Nobody tells you.
The whole cron/DMS cohort speaks Linux. Windows admins are the
unserved half. Tasks die on 0x41306 ("currently running" — really a
dead action), 0x41303 ("has not yet run"), or a stored-credential
drift after a password change, and the built-in email alert has been deprecated
since Windows 8. A Heartbeat wrapper makes the failure impossible to miss: the
job pings on success, so a dead task simply stops pinging and pages you. No SDK,
no agent, no account.
- Create a monitor. One web form at /new or
one self-serve call from PowerShell:
$r = Invoke-RestMethod -Uri "https://golemreach.com/heartbeat/api/monitors/self-serve" -Method Post ` -ContentType 'application/json' ` -Body (@{ name='nightly-backup'; period=86400; kind='push' } | ConvertTo-Json) $r.ping_url # https://golemreach.com/heartbeat/ping/<key>You get aping_urland a publichttps://golemreach.com/heartbeat/status/<name>page. - Wrap one task. Replace the task's action with a one-liner that runs
your command and pings on the exit code:
powershell -NoProfile -Command "$e=(& 'C:inackup.exe' --full); if($LASTEXITCODE -eq 0){Invoke-RestMethod 'https://golemreach.com/heartbeat/ping/KEY'}else{Invoke-RestMethod 'https://golemreach.com/heartbeat/fail/KEY'}"A non-zero exit now pings/failand pages immediately — the exact silent-failure class (credential drift, 0x41306) that Task Scheduler swallows. - Bulk-arm every enabled task. One script: it creates a monitor per
enabled task via the self-serve API and prints a ready-to-paste wrapper that
runs the task's real action then pings it. This mirrors the "self-creating
monitor" onboarding the best Linux tools use — applied to Windows, which none of
the agent-native cohort ships a recipe for:
$base = "https://golemreach.com/heartbeat" Get-ScheduledTask | Where-Object { $_.State -eq 'Ready' } | ForEach-Object { $t = $_ $nm = ($t.TaskName -replace '[^\w-]','_') $r = Invoke-RestMethod -Uri "$base/api/monitors/self-serve" -Method Post ` -ContentType 'application/json' ` -Body (@{ name="win-$nm"; period=86400; kind="push" } | ConvertTo-Json) $a = $t.Actions | Select-Object -First 1 "# --- $($t.TaskName) ---" "cmd /c ""`"$($a.Execute)`" $($a.Arguments) && curl -sS $($r.ping_url) >nul`"" }Paste the emittedcmd /clines as the new action for each task (or into a wrapper.batit calls). Each task now owns a dead-man switch.
LastTaskResult cheat-sheet
These are the codes operators actually see. A healthy ping means
the action ran and exited 0; anything else in this table is a task that your
Heartbeat should have caught by going quiet or sending /fail.
| Code | Meaning | Heartbeat sees |
|---|---|---|
| 0x0 | Success | a ping — green |
| 0x41303 | Task has not yet run | silence → page |
| 0x41306 | "Currently running" — usually a dead/stuck action | silence → page |
| 0x41301 | Task is disabled | silence (expected) |
| 0x41300 | Not scheduled to run again | silence (expected) |
| 0x41304 | No more runs queued | silence (expected) |
| credential drift | Stored password changed; action never starts | silence → page |
Why a wrapper, not a built-in alert
Task Scheduler's native email action was removed in Windows 8, and its event-log "on failure" trigger still requires you to notice the log. A ping is a positive signal: the job announces life every run. If the pings stop — for any of the reasons above — you get a webhook, a Nostr DM, or a public status flip. Pair it with our run-gate to halt dependent loops from the outside too.
Honest posture
Heartbeat is a dead-man switch, not a Windows admin suite. It tells you one thing: the pings stopped. It does not read the event log or manage credentials for you. Free while in beta; a $5 USDC pass lifts the rate limits — see pricing. Back to all integrations.