tui-tools

tui-cron

Every scheduled job on one screen, systemd timers and cron together

v0.1.1schedulingMIT
Every scheduled job on one list: systemd timers and cron together, with the schedule as written and how the last run went
Every scheduled job on one list: systemd timers and cron together, with the schedule as written and how the last run went

A terminal UI for everything scheduled on a machine. systemd timers and cron are two schedulers with two syntaxes, two sets of commands and two ways of reporting what happened; tui-cron puts them on one list — the name, the schedule as written, the next run, the last run and how it went.

Next to every expression is what it means, in English. 17 3 * * 1 and *-*-01..07 12:00:00 are both precise and neither is readable, and the mistakes people make with them are mistakes of reading. The reading is generated by the tool's own describer for cron and for OnCalendar, and the detail screen adds the next five runs as systemd-analyze calendar computes them.

Changes are previewed. A timer's schedule goes to a drop-in — the unit file is never rewritten — checked with systemd-analyze calendar first. A crontab is replaced through crontab <file>, cron's own interface, with the diff on screen. A cron line can be converted into a timer, written but deliberately not enabled.

Run tui-cron --demo to drive a sample machine: every key works, every command is built and previewed for real, and nothing touches your system.

Keys

KeyAction
tab / 1-4Move between all jobs, timers, cron and the schedulers themselves
enterOpen the selected job: its unit or table, the next runs, and its log
eChange when the selected job runs, with a diff to confirm
aAdd a line to your own crontab
dRemove the selected cron line
cCreate a systemd timer and the service it runs
tWrite a timer for the selected cron line, not enabled
E / DEnable or disable the selected timer at boot
nRun the selected job now, off its schedule
/Filter the rows of the current screen
?Help
qQuit

Press ? inside the tool for the full help screen, which is generated from the same action table as the key map.

Compatibility

This tool is a face on the program below, so its version matters.Tested is not a claim: a version lands there only after the tool's own suite passed against it on a real machine in the lab, and the run is kept as evidence in the repository. At startup the tool probes the backend once and says what it found in its header — a version nobody has run against is shown as(untested) in the warning colour, one older than the minimum as (below minimum) in the error colour. Neither stops it: the backend still refuses what it cannot do, in its own words.

systemd

systemctl ≥ 245
Binary
systemctl
Minimum
245
Probed with
systemctl --version
Tested
255259261

Needs a version this new

  • timers-jsonsince 250

What changes on older versions

  • systemd <250

    systemctl list-timers --output=json does not exist, so the timers are enumerated from systemctl list-units --type=timer instead; nothing is lost, because every column shown is read from systemctl show either way

  • systemd >=245

    systemd-analyze calendar --iterations is what computes the next runs and validates a new OnCalendar. It arrived in 242, below this minimum, so it is not gated: on every version this tool supports it is simply there

  • systemd >=245

    a timer in your own manager is read through systemctl --user, which needs a user bus; over a serial console or a bare sudo -i shell there is none, and the tool says the user timers were not read rather than that there are none

cron

Binary
crontab
Tested
No recorded run yet. The tool still runs and reports the version it found as untested.

What changes on older versions

  • cron >=1

    cron declares no version command. cronie answers crontab -V with "cronie 1.7.2"; Debian's vixie cron has no such flag and no sibling program that prints one, so a version would appear on Fedora and be blank on Ubuntu. The header shows cron without a number

  • cron >=1

    there is no portable way to have cron check a table: cronie ships crontab -T, Debian's cron ships nothing equivalent. A line is therefore parsed by this tool before it is written, with the same check on every machine

  • cron >=1

    cron records that a command started, and cronie also that it returned; neither records an exit status anywhere. A cron job's last result is therefore "it ran" at best, and the screen says so rather than implying it worked

  • cron >=1

    a machine may have no cron at all — Omarchy Server is one — and that is a normal machine, not a failure: the timers are listed, and cron reports itself as absent with the reason

  • cron >=1

    a machine with no cron may still carry run-parts scripts: Omarchy Server ships /etc/cron.hourly/snapper and nothing that walks the directory. They are listed anyway, and each row says nothing runs it rather than showing a file that looks scheduled as active

Install

Once per machine, then every tool in the family is one pacman away.

Add the repository
$ curl -fsSL https://pkgs.tui.tools/install.sh | sh
Or run the same thing yourself, one command at a time

A family whose whole promise is preview before you run is not going to insist you pipe a script into a shell. These are the commands that script runs.

The one-time setup, by hand
$ curl -fsSL -o /tmp/tui-tools.asc https://pkgs.tui.tools/pubkey.asc
  sudo pacman-key --add /tmp/tui-tools.asc
  sudo pacman-key --lsign-key \
    "$(gpg --show-keys --with-colons /tmp/tui-tools.asc | awk -F: '/^fpr:/{print $10; exit}')"
  printf '[tui-tools]\nServer = https://pkgs.tui.tools/arch/$arch\n' \
    | sudo tee -a /etc/pacman.conf
  sudo pacman -Sy
Arch Linux · tui-cron
$ sudo pacman -S tui-cron

Upgrades then arrive with the rest of your system updates.

What it can do to your machine

  • Preview, then confirm

    Every change is shown as an exact command line and confirmed before it runs. The dialog and the runner receive the same value, so the preview cannot drift from what executes.

  • Escalates for actions

    Reading needs nothing: systemctl show, crontab -l for your own table and the journal all answer to any user. Every change escalates through sudo -n, which never prompts — installing a drop-in, replacing a crontab, enabling a timer or running one now.

  • No daemon, no state of its own

    Nothing keeps running after you quit, and nothing is installed to run later. The system is the source of truth; the tool re-reads it after every change.

  • No network access

    The tool opens no network connection of its own. No telemetry, no update check, no phone home.

  • Static binary

    Released statically linked, with no runtime dependencies to install.

  • Releases are not signed yet

    Releases carry SHA-256 checksums but no signature. Verify the checksum, and read this as the open item it is.

Reporting

Report a security issue privately, through GitHub's private vulnerability reporting on the repository's Security tab. The family-wide policy, and what counts as in scope, is on the security page.

Downloads

v0.1.1 · 2026-08-30
FileSizeSHA-256
checksums.txt776 B
tui-cron-0.1.1-1-aarch64.pkg.tar.zst1.7 MB87026be82ab4e503d6fddba8271acf3e1e388061b077513d86181f73f88d0bd6
tui-cron-0.1.1-1-x86_64.pkg.tar.zst1.9 MB714df13ed7eaf4f378e7abd7acb1ee1a20fc5ecaffe6514bac8c891280046af7
tui-cron-0.1.1-1.aarch64.rpm1.7 MBae6f5eb21169cbda2f3ec16cd70ad1391df7ba8cac77f932643babf32c22643f
tui-cron-0.1.1-1.x86_64.rpm1.9 MBdebfaeab84c16d6939a055cb91ce5d2376f28697ea5e0f82d222740d8c9d4e9f
tui-cron_0.1.1_amd64.deb1.9 MB45c0b92cf30286bf0d45b4739a0e1b9afdee3a69bafe6468a5b4d09810b36510
tui-cron_0.1.1_arm64.deb1.7 MB9746aab28b7a8f1b28b7302bfda0d44eb2112a122bc1f4935e74fe0776f6dbba
tui-cron_0.1.1_linux_amd64.tar.gz1.9 MB51411b340bce6f598d731557f83b6d8cec1de00aea6c44b2e3ab5bb44345a3c4
tui-cron_0.1.1_linux_arm64.tar.gz1.7 MB724e1d93a05c60679f06e67b7469083e7fc7c9bdb787c5c2998493d9297861e2

Every release ships a checksums.txt. Download it next to the archive and run sha256sum -c checksums.txt --ignore-missing. See verifying a download.

Releases

v0.1.1

2026-08-30
## Changelog
* 8f8d260c65d36b17df15a571ed686a9dfbb664df Add the kind counts up without bc, which two of three guests do not have
* 9bce42a82b4c661f6bd0b139bf072a8df3487681 Fit the run-parts note inside the manifest's 300-character impact limit
* 3f78a3d4dda18f12bcc9e48dbbf2a83d85c68c48 List run-parts scripts on a machine that has no cron
* ec9c7c62fb69ed104578382d247987e16dd5cda4 Packages are available from pkgs.tui.tools
* 954a57ceb98e76dd0e51f631e9a51fd76f097b2c Re-pin the kit at v0.2.3
* 35d6986e2939d5178f295451c0a9920094c2b12e Ship the tool as a .deb, an .rpm and a pacman package

v0.1.0

2026-08-30
## Changelog
* d2fe6a7b4daa05010b09d237b5774c1ce5b42c26 Build tui-cron: every scheduled job on one screen, in English
* 4d5768e7384a701e5d82d041dfe1bddf54862297 Initial commit