← all releases

v1.7.0

on GitHub

Not the newest. v1.9.0 is out →

Release notes

Added

  • @runwisp/js for Node.js apps: an npm package that runs your node-cron tasks under RunWisp, so every run is recorded with its output and exit code and shown in the Web UI. Swap the import and keep your schedule() calls, or define tasks and services with every runwisp.toml key. See From node-cron.
  • @runwisp/js plugs into NestJS (replacing @nestjs/schedule), Nuxt and Next.js (running Nitro’s scheduledTasks and Vercel Cron jobs), and Astro.
  • Tasks and services take sdk = true to run inside an app that defines them through an SDK, and runwisp daemon --app reads its config from that app.
  • runwisp upgrade updates RunWisp the way you installed it (Homebrew, apt, dnf, npm/bun/pnpm/yarn, or the install script) and can restart the daemon now, once it is idle, or later.
  • .deb and .rpm packages for x64 and arm64. They add the RunWisp apt or dnf repository, so regular system updates keep RunWisp current.
  • Read-only access: RUNWISP_VIEWER_PASSWORD adds a second password that can view tasks, runs and logs but can’t trigger, start, stop, pause, delete or reload. The Web UI and TUI hide those controls for it, and runwisp password --viewer prints or generates it. See Authentication.
  • warn_after on a task sends one notification when a run is still going after that long, without stopping it. It goes wherever failure alerts go, or to any [[route]] that lists long_running.
  • Docker-friendly by default: [daemon] log_output (or RUNWISP_LOG_OUTPUT) prints task output to the daemon’s stdout as task | line, and the Docker image turns it on, so docker compose logs runwisp shows your job output. The image also runs RunWisp under tini to reap processes tasks leave behind.
  • A task with compose_service and run can leave out compose_file when RunWisp runs in the same compose project; it needs only the Docker socket.
  • runwisp next to a compose file offers a starter that schedules jobs in the running stack, then one that imports its services.
  • runwisp import ofelia converts Ofelia jobs, from an INI config or ofelia.* compose labels, into tasks.
  • Cron expressions accept L (last day of the month), LW, 15W (nearest weekday) and FRI#3 / FRI#L (nth or last weekday).
  • runwisp validate --explain describes each schedule in plain words and lists its next 3 firings in the scheduler’s zone, marking times a daylight saving change moves or skips.
  • runwisp validate and daemon startup suggest a jitter when three or more tasks would start at the same second.
  • The TUI run list shows each run’s CPU time and peak memory, colored by how it compares with the task’s usual run, so an unusually heavy run stands out.
  • The TUI task info (i) shows the task’s timeout, log limit, retention and usual CPU and memory, and opens with the first lines of its run command; press c for the whole command.
  • runwisp import cron names jobs that Bun’s Bun.cron() wrote into a crontab after their title.

Changed

  • The TUI, runwisp --help, CLI messages, the startup banner and log lines share the Web UI’s teal brand colors, readable on light and dark terminals.
  • A finished run’s header in the TUI reads CPU 0.3s · RAM 3.3 MB, and shows just the memory on a narrow terminal.
  • A scheduled compose_mode = "run" job leaves the service’s ports and network alias to the running stack, so it runs side by side with it.
  • When a compose_service container isn’t running, the run log names the compose project RunWisp searched and how to point it at the right one.
  • runwisp validate checks that each task’s compose_service exists in its compose_file.
  • Details in the Web UI writes long durations in days: keep_for = "120d" rather than "2880h".
  • The Star button on the TUI Home screen works from the keyboard: press ↑ from the top row, then Enter.
  • Builds from source skip the update check and runwisp upgrade.

Fixed

  • Tasks and services with compose_file run in the compose file’s own project, like docker compose up in that directory, so a scheduled job joins the stack’s network and named volumes and can reach db and its data. A [compose.<alias>] block does the same unless it sets project_name.
  • The TUI log search (/) shows its results consistently and, like the shutdown spinner, uses the TUI’s own colors.
  • RunWisp is published to npm again with this release.
  • @every takes whole seconds; an interval such as 1500ms is reported as a config error.
  • runwisp validate runs without creating a data directory.

Security

  • The login rate limit counts only wrong passwords: the first 5 are free, then the wait grows to at most 90 seconds, so signing in again, opening the Web UI from the TUI and remote CLI calls never get locked out.
  • RunWisp warns in its log and in the notification bell when requests arrive through a reverse proxy that isn’t in [daemon] trusted_proxies, with a link to the setup docs.
All releases