X 000 · Y 000
Fig. 01 — Overview

Your scripts.
Organised.
One place.

zrun is a fast script manager and launcher written in Rust. Drop your .sh files in a directory, tag and describe them in-file, then pick and run them from a TUI or the CLI — with full run history tracked automatically.

zrun — tui picker
Scripts 6 found History
▶ backup-home backup ×12
deploy-site deploy ×4
clean-docker docker ×7
update-system system ×31
gen-keys crypto ×1
Preview: backup-home
#!/bin/bash
# Back up home directory to external drive
rsync -avz ~/ /mnt/backup/home/

Script management, done right.

Everything you need to keep your scripts organised and accessible — nothing you don't.

01

Directory-based

Drop .sh files anywhere — /etc/zrun-scripts, ~/.local/share/zrun, or any custom path. Multiple directories supported, highest-priority first.

02

Tags & categories

Tag scripts right in the file header with # @tags: backup, system. Filter by tag in the TUI or with zrun list --tag backup.

03

Run history

Every run is recorded — script name, path, timestamp, and total run count. View history in the TUI sidebar or with zrun history.

04

Preview before running

See the full source of any script before executing it — inline in the TUI, or with zrun show <name>. No surprises.

05

TUI picker

A fast ratatui-based interactive picker with fuzzy search, tag filtering, live preview, and run-count display. Just run zrun with no arguments.

06

CLI mode

Skip the TUI entirely — zrun run <name>, zrun list, zrun show, zrun history. Scriptable, composable, fast.

Metadata lives in the file.

No separate config file needed. Add a few comment lines to any .sh script and zrun picks them up automatically.

backup-home.sh
#!/bin/bash
# Back up home directory to external drive
# @tags: backup, system
# @info
# Rsyncs ~ to /mnt/backup/home.
# Skips .cache and tmp dirs.
# Safe to run while logged in.
rsync -avz \
--exclude='.cache' \
--exclude='/tmp' \
~/ /mnt/backup/home/
# First comment — used as the script description in the picker
# @tags: foo, bar — assigns tags for filtering and categorisation
# @info — starts a multi-line info block shown in the preview pane
# @info: text — single-line info variant