TUI for running frequently used commands from markdown files
Find a file
2026-06-15 20:19:57 +02:00
examples Ghostty: run commands directly via base64 to avoid Gatekeeper prompts; translate README; anonymize examples 2026-06-15 12:47:51 +02:00
src Custom mode: focus between list and input, show section names, remove j/k 2026-06-15 20:19:57 +02:00
tests Ghostty: run commands directly via base64 to avoid Gatekeeper prompts; translate README; anonymize examples 2026-06-15 12:47:51 +02:00
.gitignore Initial commit 2026-06-15 10:46:15 +02:00
Cargo.lock Add history.log for tracking command executions 2026-06-15 13:39:10 +02:00
Cargo.toml Add history.log for tracking command executions 2026-06-15 13:39:10 +02:00
README.md Add custom command mode for running commands against selected lines 2026-06-15 19:55:37 +02:00

lines

A TUI app for quickly running frequently used commands — ideal for SSH scripts, updates, and anything you run regularly from the terminal.

Installation

brew tap janvete/tools
brew install lines

Usage

lines              # opens the TUI
lines --dir /path  # use a different data directory

Data structure

Data is stored as plain .md files in ~/.lines. Groups are subdirectories.

~/.lines
├── Servers
│   └── web.md
└── Scripts
    └── update.md

.md format

Each section starts with # Command name. Command lines follow the heading.

# Web server
ssh admin@web.example.com

# Database
ssh admin@db.example.com

A section without command lines means "run all commands in this file".

# Run all

# Docker update
ssh admin@host1.example.com /opt/app/update.sh
ssh admin@host2.example.com /opt/app/update.sh

Configuration

Create ~/.lines/config.toml:

terminal = "Ghostty"   # options: Terminal, Ghostty, iTerm
shell = "zsh"          # options: any shell name, default is taken from $SHELL

The default terminal is Terminal (macOS Terminal.app). The default shell is detected from the $SHELL environment variable.

Controls

Key Action
↑/↓ or j/k move
←/→ or h/l switch panel
Enter run selected command / all commands in the current terminal
o open selected command / all commands in a new terminal window
c open custom command mode for the current file
e open current .md file in $EDITOR
r reload data
q / Esc quit

Custom command mode

Press c on a selected file to run a custom command against specific lines from that file.

For a file containing:

# PVE1
ssh root@host1.example.com

# PVE2
ssh root@host2.example.com

# PVE3
ssh root@host3.example.com

Press c, select lines with Space, type lsblk, and press Enter. lines will run:

ssh root@host2.example.com lsblk
ssh root@host3.example.com lsblk

Use {} as a placeholder if your lines are just addresses:

ssh {} lsblk

History

Every command run through lines is appended to ~/.lines/history.log:

2026-06-15 08:30:15 [Servers/web.md] Main server: ssh admin@web.example.com
2026-06-15 08:31:02 [Scripts/update.md] Run all: ssh admin@host1.example.com /opt/app/update.sh; ssh admin@host2.example.com /opt/app/update.sh

Backup

The entire ~/.lines folder is plain text. Copy it to a disk, Git repo, or iCloud. On a new Mac, move it to the same location and lines works immediately.

License

MIT