Skip to content

Releases: rileyhilliard/rr

v0.20.0

29 Mar 04:07
efab045

Choose a tag to compare

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 %p

Supported 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 proxyConn type wraps proxy subprocess stdin/stdout as net.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

14 Feb 04:42
953e4b0

Choose a tag to compare

What's New

Fixed

  • Sync command now acquires lock - rr sync previously skipped lock acquisition, allowing it to overwrite files on a remote host while another rr run or rr <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...v0.19.2

v0.19.1

14 Feb 00:14
23962cc

Choose a tag to compare

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...v0.19.1

v0.19.0

05 Feb 05:19
18b3de4

Choose a tag to compare

What's New

Added

  • Provision command - New rr provision command installs missing tools on remote hosts
  • Pull command - New rr pull command 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...v0.19.0

v0.18.1

27 Jan 06:05
e25eb18

Choose a tag to compare

What's New

Added

  • Repeat flag for parallel tasks - New --repeat N flag runs the same task N times in parallel, useful for detecting flaky tests. Example: rr test --repeat 10 runs 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.yaml cannot be found, making it clearer what went wrong and how to fix it.

Full Changelog

v0.18.0...v0.18.1

v0.18.0

27 Jan 03:34
ba2a506

Choose a tag to compare

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 root

Fixes #154

Full Changelog: v0.17.0...v0.18.0

v0.17.0

27 Jan 00:49
8f715df

Choose a tag to compare

What's New

Added

  • Nested parallel tasks - Parallel tasks can now reference other parallel tasks. When rr encounters 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-run shows the expanded task list. Fixes #145.

  • Parallel task setup phase - New setup field 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...v0.17.0

v0.16.0

24 Jan 08:47
346f341

Choose a tag to compare

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...v0.16.0

v0.15.0

24 Jan 07:56
6dccbfc

Choose a tag to compare

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
      - test

Supports parallel groups within dependencies:

  ci:
    depends:
      - parallel: [lint, typecheck]  # Run simultaneously
      - test                          # Run after parallel completes

New 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 requirement

Missing tools trigger actionable error messages with install suggestions.

Full Changelog

v0.14.2...v0.15.0

v0.14.2

21 Jan 23:36
fd6cbd3

Choose a tag to compare

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.

Full Changelog

v0.14.1...v0.14.2