Bringing arf, a modern R console, to Homebrew

A community-requested R console, now one brew command away on macOS and Linux

r
homebrew
arf
rust
Author

James Balamuta

Published

May 12, 2026

Abstract

arf is a modern R console written in Rust by eitsupi, with tree-sitter syntax highlighting, fuzzy history search on Ctrl+R, vi and emacs editing modes, and a headless mode aimed at AI agents and CI. As of May 12, 2026 it has a formula in homebrew-core, so installing and updating it on macOS and Linux is now a single brew command. Here is the short story of how the formula came to be, starting from a one-line feature request.

Good news for anyone who spends their day at an R prompt: arf, a modern R console written in Rust, now has a formula in homebrew-core. As of May 12, 2026, installing it on macOS or Linux is exactly one command:

brew install arf

arf is eitsupi’s rethink of what an R console can be, and the name is too good to leave alone. It’s the sound a dog makes, it fetches things when you ask, and it has now, at last, been taught to come when you call brew.

Animated demo of the arf R console running in a dark terminal. An indigo greater-than sign serves as the prompt at the top left, with a block cursor beside it. R expressions are typed at the prompt and evaluated, with the typed input shown under syntax highlighting.

Demo from the arf project by eitsupi.

Meet arf

The stock R console hasn’t changed much in a long time. It’s dependable, it’s familiar, and it’s also a rather plain room. arf furnishes it.

It’s a single binary, written entirely in Rust, with no runtime dependencies beyond R itself. Once it’s installed, you get:

  • Syntax highlighting as you type, powered by tree-sitter, so a stray bracket is obvious before you ever press Enter.
  • Fuzzy history search on Ctrl+R, fzf-style. It’ll happily import the history you already built up in radian or a plain .Rhistory.
  • vi and emacs editing modes, multiline editing with matched brackets, and tab completion for objects, functions, and file paths.
  • A fuzzy help browser that searches across every installed package.
  • rig integration, so you can switch R versions without leaving the prompt.
  • A headless IPC mode, built for AI agents and CI rather than for humans, which is either the future or a sign of the times depending on your mood.

If you’ve used radian, the shape will feel familiar. The difference is underneath: arf is one compiled binary rather than a Python application, so it starts quickly and there’s no second language runtime to keep happy.

brew upgrade and you’re done

So why does a perfectly good Rust binary need a Homebrew formula? arf already ships prebuilt binaries, and cargo install works fine.

The honest answer is updates. A binary you downloaded by hand is a binary you have to remember to update by hand. It sits in a folder, quietly going stale, until one day the project README mentions a feature you don’t have. A cargo install is a little better, but it’s still a separate chore to track.

A formula folds arf into the routine you already run for everything else:

brew update && brew upgrade

That one line now sweeps arf along with the rest of your tools. No version to look up, no release page to watch, no PATH to babysit. For a team, it’s one more entry in a Brewfile instead of a paragraph of setup notes. (I made this case at greater length when packaging Posit’s Air formatter for Homebrew; the short version is that a tool you can’t easily keep current is a tool you quietly stop using.)

How arf learned a new trick

The formula exists because someone asked for it. Back in April, pat-s opened issue #153 on the arf repository with a modest request: a Homebrew formula, “for easier installation and upgrade on macOS.” Hard to argue with that.

So I opened a pull request against homebrew-core on April 16. Here’s the pleasing part: I’d done very nearly this before. Last year I packaged Air, Posit’s R formatter, and Air turned out to be a Rust workspace, a single repository holding several crates. A bare cargo install can’t tell which crate you mean, and the fix is to point Homebrew at the right one.

arf is a Rust workspace too. Its binary lives in a crate called arf-console, so the formula does the very same step:

def install
  system "cargo", "install", *std_cargo_args( "crates/arf-console")
end

The Air post signed off by noting that its formula “establishes a pattern for packaging other tools.” It was satisfying to watch that pattern pay off so directly. After a review from the Homebrew maintainers and a full set of bottles built across macOS and Linux, the pull request merged on May 12, 2026. It went in as arf 0.3.0, and from there Homebrew’s autobump takes over, keeping the formula in step with new releases without any further effort from me. Which is, of course, exactly the point of putting it there.

Bring arf home

If you’re on macOS or Linux with Homebrew installed, you can adopt arf right now:

brew install arf

Homebrew ships prebuilt bottles for Apple Silicon, Intel Macs, and Linux on both arm64 and x86_64, so for most people this is a quick download rather than a Rust compile. One thing the formula doesn’t do is install R for you: arf is a console for R, not a copy of R, so you’ll want R already on your machine. Then start it up:

arf

When a new release lands, you already know the routine:

brew upgrade arf

Or just let arf ride along the next time you run brew update && brew upgrade.

Fin

That’s the whole story: a one-line request, a pattern borrowed from last year, and one more R tool that installs the way macOS and Linux developers expect. Thanks to eitsupi for building arf, and to pat-s for the nudge that set the formula in motion.

arf is in Homebrew now. Go on, call it. It’ll come.