Releases: rileyhilliard/rr
v0.20.0
What's New
SSH ProxyCommand Support (#190)
rr can now connect to hosts that use ProxyCommand in ~/.ssh/config. This enables connections through bastion hosts, SOCKS proxies, and other proxy setups that are common in corporate SSH environments.
Example SSH config that now works:
Host A100server
HostName 10.30.121.100
Port 30863
User root
ProxyCommand nc -X4 -x 192.168.100.23 %h %pSupported SSH tokens in ProxyCommand: %h (hostname), %p (port), %n (original alias), %r (user), %% (literal %).
Hosts using ProxyJump (not yet supported) will get a warning with a ProxyCommand conversion suggestion.
rsync SSH Config Passthrough (#198)
rsync now inherits SSH config settings (ProxyCommand, IdentityFile, etc.) by passing -F ~/.ssh/config to its SSH subprocess. Previously, rsync would fail for hosts that required these settings.
Details
- New
proxyConntype wraps proxy subprocess stdin/stdout asnet.Conn - Process groups (
Setpgid) ensure clean cleanup of proxy subprocesses - Handshake timeout prevents hanging when proxy connects but SSH stalls
- Extracted shared
buildSSHCmd()helper to deduplicate rsync SSH command construction - Fixed pre-existing staticcheck false positives in host tests
v0.19.2
What's New
Fixed
-
Sync command now acquires lock -
rr syncpreviously skipped lock acquisition, allowing it to overwrite files on a remote host while anotherrr runorrr <task>was actively executing. Sync now follows the same Connect -> Lock -> Sync -> Release flow as other commands. Lock is skipped for dry-run mode and local connections. (#181, #182) -
Defensive slice copy for dry-run flags - Fixed a pre-existing issue where appending dry-run flags could mutate the shared config slice's backing array.
Full Changelog
v0.19.1
What's New
Fixed
- Orchestrator deadlock on parallel task completion - Fixed a circular channel deadlock in the orchestrator shutdown sequence that caused parallel tasks to hang indefinitely after all tasks completed. Also fixed unconsumed tasks in the queue when all hosts are unavailable not producing failure results. (#177, #178)
Changed
- Dependency updates - Bumped charmbracelet/bubbles, go-viper/mapstructure/v2, golang.org/x/crypto, golang.org/x/term. Bumped Go toolchain to 1.24.13 to fix GO-2026-4337 (crypto/tls vulnerability). (#179)
Full Changelog
v0.19.0
What's New
Added
- Provision command - New
rr provisioncommand installs missing tools on remote hosts - Pull command - New
rr pullcommand downloads files from remote hosts
Fixed
- Parallel task sync uses project root - Fixes sync issues when running tasks from subdirectories
- Graceful task re-queuing - Tasks re-queue to other hosts when one becomes unavailable
Full Changelog
v0.18.1
What's New
Added
- Repeat flag for parallel tasks - New
--repeat Nflag runs the same task N times in parallel, useful for detecting flaky tests. Example:rr test --repeat 10runs the test task 10 times concurrently across available hosts. - Duplicate tasks in parallel blocks - Parallel task definitions can now include the same task multiple times. Previously duplicates were deduplicated; now each instance runs independently.
Fixed
- Config discovery error messages - Improved error messages when
.rr.yamlcannot be found, making it clearer what went wrong and how to fix it.
Full Changelog
v0.18.0
What's New
Auto-discover project root - Running rr from a subdirectory now works correctly. Config discovery walks up the directory tree to find .rr.yaml, similar to how git finds .git, npm finds package.json, and cargo finds Cargo.toml. Sync operations use the project root (where .rr.yaml is located) instead of the current directory.
Example
# From project root - works as before
cd ~/projects/myapp
rr test
# From subdirectory - now works too!
cd ~/projects/myapp/src/components
rr test # Walks up, finds .rr.yaml in ~/projects/myapp, uses that as rootFixes #154
Full Changelog: v0.17.0...v0.18.0
v0.17.0
What's New
Added
-
Nested parallel tasks - Parallel tasks can now reference other parallel tasks. When
rrencounters a nested parallel reference, it flattens the task tree before execution. This makes maintaining large parallel task groups much easier. Diamond dependencies are deduplicated. Cycle detection prevents infinite recursion.--dry-runshows the expanded task list. Fixes #145. -
Parallel task setup phase - New
setupfield for parallel tasks runs a command once per host before any subtasks execute. Avoids redundant work when multiple subtasks on the same host need shared setup.
Changed
- Performance-based work-stealing - Parallel task execution now tracks first-task completion time per host to identify slow hosts. Slow hosts wait before grabbing additional tasks, giving fast hosts priority. Fixes #146.
Example: Nested Parallel Tasks
tasks:
test-opendata:
parallel: [opendata-1, opendata-2, opendata-3]
test-backend:
parallel: [backend-1, backend-2, backend-3]
# References parallel tasks - expands to 7 tasks
test:
parallel: [test-opendata, test-backend, frontend]Run rr test to execute all 7 tasks in parallel across your hosts.
Full Changelog
v0.16.0
What's New
Added
- GPU monitoring in dashboard - GPU utilization and temperature now display in host cards. Cards show GPU percentage with color-coded temperature (cyan normal, purple warm 70C+, pink hot 80C+).
- Apple Silicon GPU support - Monitors Apple M-series GPU utilization via
ioreg AGXAccelerator. Works on macOS hosts with Apple Silicon chips. - GPU sparkline graphs - Detail view shows 8-row braille sparkline for GPU utilization history, matching the CPU graph style.
- Reorganized detail view layout - CPU and GPU graphs now display side-by-side. Processes and Latency graphs are side-by-side below them.
Changed
- Card section order - Reordered metrics in cards to: CPU, GPU, LAT, RAM, TOP, NET. Groups compute metrics (CPU/GPU) together.
Full Changelog
v0.15.0
What's New
Task Dependencies
Define task execution order with the depends field. Tasks run their dependencies first, then execute their own command.
tasks:
lint:
run: golangci-lint run
test:
run: go test ./...
ci:
depends:
- lint
- testSupports parallel groups within dependencies:
ci:
depends:
- parallel: [lint, typecheck] # Run simultaneously
- test # Run after parallel completesNew CLI flags:
--skip-deps- Skip dependencies, run only the target task--from <task>- Start from a specific task in the chain
Remote Environment Bootstrap
New require field declares tools that must exist before running commands:
require:
- go
- node
tasks:
build:
run: make build
require: [cargo] # Task-specific requirementMissing tools trigger actionable error messages with install suggestions.
Full Changelog
v0.14.2
What's New
Fixed
- Latency calculation - Monitor now displays actual SSH network latency (~75-100ms) instead of metrics collection time (~5000ms on macOS). Uses a lightweight probe command to measure real round-trip time. Fixes #131.