history
Every run, every detail
Exit code, duration, stdout, stderr, timestamps: captured for every firing, browsable in the UI, queryable over REST. No silent failures.
binary
One binary, zero deps
Static Go binary. No Python, no Node, no external database. Embedded SQLite, embedded dashboard. Runs on a Raspberry Pi.
toml
TOML is the source of truth
Schedules, retries, services, notifiers, all in runwisp.toml. The dashboard reads and triggers; it never edits your config.
on_overlap
Never let runs stack up
Per-task on_overlap: skip, queue, or terminate. Per-service instance counts. Restart backoff that resets on stability.
catch_up
Reboots don't drop runs
Boot the machine, start RunWisp, and missed firings replay, bounded by max_catch_up_runs. No quiet gaps in your history.
notify
Notify the way you want
Slack, Telegram, Discord, email, webhook, or an in-app bell. Per-task overrides. Flapping coalesces into one alert, not a storm.
ui
Web + terminal UI
A Svelte dashboard ships inside the binary. A Bubbletea TUI for SSH sessions. Same data, two surfaces, no extra installs.
logs
Live log streaming
Watch a task's output as it happens, in the browser or over SSH. Tail historic logs without grepping through files.
offline
Works without internet
Everything runs with the network unplugged. No phone-home, no account, no dependency on anyone's servers to fire a job.