← all releases

v0.14.0

pre-release on GitHub

Not the newest. v1.5.1 is out →

Release notes

Added

  • sudo runwisp takeover retires cron in one command — imports your crontabs, installs RunWisp as a service, and disables cron, with --dry-run and --yes available. See Retiring cron.
  • First run on a root Linux box can now do the full cron cutover in one prompt. See Retiring cron.
  • [daemon] include_cron turns your existing crontabs into live RunWisp tasks — with captured output, history, and notifications, nothing rewritten. See include_cron.
  • First run now detects an existing crontab and offers to import it, alongside the existing docker-compose detection. See Take over from cron.
  • sudo runwisp service install now flags a still-running cron and points you to takeover. See Retiring cron.
  • [compose.<alias>.defaults]: a reserved sub-table whose policy keys (restart, start_retries, exit_codes, notify_on_*, …) apply to every imported compose service, with per-service overrides still winning — set a whole worker pool’s restart = "always" in one line. See Block defaults.
  • runwisp import now reports every job in the crontab — mapped cleanly, changed, needs a fix, or already yours — with --dry-run to preview first. See Converting crontabs.
  • runwisp import --write keeps imported jobs in their own file, separate from your hand-written config. See Converting crontabs.
  • runwisp promote moves an imported or crontab-sourced task into your own runwisp.toml. See CLI.
  • Official Docker images on Docker Hub: runwisp/runwisp (Alpine + Debian, amd64/arm64). See Docker.
  • scripts/install.sh, the script behind curl -fsSL https://get.runwisp.com | sh: detects your OS/arch, verifies the download, and installs the binary. See Quick start.
  • New sendmail notifier sends email through the machine’s own mail server — no relay host or credentials needed. See Email (local MTA).
  • Tasks now show where they came from — your own TOML, an import, or a crontab — in runwisp list, status --json, the API, dashboard, and TUI.
  • Config warnings now show up live in runwisp reload, status, /api/info, and the TUI, not just at boot. See Reload.
  • compose_mode: run a task’s command inside an already-running Compose service, or start a fresh one. See compose_mode.
  • RUNWISP_CONFIG, RUNWISP_DATA, RUNWISP_HOST, RUNWISP_PORT, RUNWISP_TLS environment variables for the matching CLI flags and TOML settings. See [daemon].
  • env_base = "clean" starts a task with a minimal environment instead of inheriting your shell’s. See Tasks.
  • working_dir = "~" resolves to the home directory of whoever runs the task. See Tasks.
  • Running as root now defaults to system paths (/etc/runwisp/runwisp.toml, /var/lib/runwisp). See CLI.

Changed

  • Jobs already running under a live system cron are now held, not double-scheduled, until cron is retired — visible in status, validate, the TUI, and the dashboard. See Held jobs.
  • Multi-line run scripts now stop at their first failing command instead of finishing and reporting success anyway. Opt out with set +e. See Fail-fast.
  • New “runbook” visual design across the web UI and docs: monospace headings, hairline borders, teal accent, flat dark mode. No behavior changes.
  • Redesigned login screen, with the RunWisp brand, a cleaner password field, and a “Where’s my password?” popover.
  • runwisp service install now installs system-wide by default; use --local for a per-user install. See Autostart.
  • The daemon and web UI are now licensed GPL-3.0-or-later (previously Apache-2.0); shared libraries stay Apache-2.0. See LICENSE.
  • Removed most hover/focus/state animations — the UI now responds instantly. Motion stays only where it’s meaningful (spinners, live-run pulse, progress bars).
  • Geist Mono now ships embedded in the binary, so identifiers (task names, run IDs, exit codes) render in the same monospace font everywhere.
  • run can now be combined with compose_file, running inside the service’s existing container. See compose_mode.
  • runwisp import cron now scopes a crontab’s settings to that crontab’s own tasks, instead of applying them globally. See How cron maps to TOML.
  • Imported jobs skip catch-up runs, like cron did — a missed run is still recorded, just not re-fired. See How cron maps to TOML.
  • runwisp import --quiet now only silences clean imports — jobs that need a fix are still listed. See CLI.
  • [daemon] tls now defaults to "off". A non-loopback bind used to self-sign a certificate and serve HTTPS automatically; it now serves plain HTTP unless you opt in with tls = "auto" (self-signed HTTPS) or supply tls_cert/tls_key. See [daemon].

Fixed

  • runwisp exec no longer reports success for a run that failed within milliseconds. See CLI.
  • A cron day-of-week of 7 (Sunday) is now accepted, fixing skipped weekly jobs on stock Debian/Ubuntu boxes. See How cron maps to TOML.
  • runwisp status and the TUI header now show the live task set, not the one from when the daemon started.
  • runwisp service install --dry-run now runs its checks before reporting success. See Autostart.
  • runwisp service commands now respect --config/--data and their environment-variable equivalents. See Autostart.

Security

  • Compose task secrets are now passed via environment variables, never on the command line. See Compose.
  • A control-plane peer can no longer override a task’s environment unless [daemon] allow_cloud_dispatch is on, and can’t overwrite a task defined in runwisp.toml.
  • /api/instance no longer responds to requests via a reverse proxy, keeping local paths private. See Reverse proxies.
All releases