Skip to content

TomBonness/fasterm

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

fasterm

Read terminal output at speed without scanning the whole scrollback.

fasterm is a terminal RSVP reader: it takes terminal output, shows it one token at a time in the center of your screen, highlights a recognition point inside the current token, and keeps nearby source context visible so you can stop and immediately see where the word came from.

It is built for the workflow where you are reading a long terminal response, log, command output, or agent transcript and want to move through it quickly without moving your eyes line-by-line.

┌──────────────────────── fasterm ────────────────────────┐
│                                                          │
│                         terminal                         │
│                            ^                             │
│                    recognition point                     │
│                                                          │
├──────────────────────── source ──────────────────────────┤
│ ... command output scrolls by and fasterm highlights ... │
│ ... the active token in this source context pane ...      │
└──────────────────────────────────────────────────────────┘
paused | progress 42/817 | 500 wpm | context on
Space play/pause | h/l step | +/- speed | Enter context | q/Esc quit

What it does

  • Runs as a normal terminal wrapper with a reader hotkey, or reads stdin, files, cmux scrollback, and tmux scrollback.
  • Presents one readable unit at a time using RSVP-style display.
  • Highlights an optimal recognition point / vowel-style anchor inside the active token.
  • Shows surrounding source text with the active token highlighted.
  • Lets you pause, step, change speed, and toggle context from the keyboard.
  • Works in Ghostty, cmux, tmux, and other terminals through normal TUI rendering.

Normal terminal workflow

Use fasterm term when you want to keep working in an ordinary interactive terminal and open the reader only when output gets long:

fasterm term

By default this starts your $SHELL. Press Ctrl-G inside that terminal to open the RSVP reader over recent terminal output. Quit the reader with q or Esc and you return to the same shell session.

Run a command inside the wrapped terminal by placing it after --:

fasterm term -- pi

Useful options:

fasterm term --lines 5000 --wpm 650 --hotkey Ctrl-G --buffer-bytes 1048576 -- pi

fasterm term is the recommended workflow for Oh My Pi and other interactive tools because it captures the wrapped terminal's recent output instead of trying to read another terminal's scrollback after the fact.

One-shot capture modes

A normal CLI cannot universally read another terminal emulator’s existing scrollback. fasterm read works anywhere when you pipe text into it or pass a file, because that text is sent directly to fasterm.

To read text that is already in a terminal pane once, use a capture layer:

  • fasterm cmux reads the current cmux terminal surface once.
  • fasterm tmux reads the current tmux pane once.
  • fasterm here detects cmux first, then tmux, and explains the available options when neither session is present.

Ghostty alone does not expose arbitrary scrollback to a generic CLI, but cmux does.

Install

From anywhere:

cargo install --git https://github.com/TomBonness/fasterm

From a local checkout of this repository:

cargo install --path /path/to/fasterm

If your shell cannot find fasterm after installing, add Cargo's bin directory to your shell path:

export PATH="$HOME/.cargo/bin:$PATH"

Or run directly during development:

cargo run -- --help

Usage

Try it now

Run the built-in demo without piping anything:

fasterm demo

Start the demo at a specific speed:

fasterm demo --wpm 650

Use it as a normal terminal

Start your shell inside fasterm:

fasterm term

Start Oh My Pi inside fasterm:

fasterm term -- pi

Press Ctrl-G while the wrapped terminal is running to read recent output. Adjust the hotkey if needed:

fasterm term --hotkey Ctrl-] -- pi

Use one-shot capture in Ghostty + cmux

Inside a cmux terminal surface, read existing scrollback from the current pane once:

fasterm cmux

Limit the capture depth:

fasterm cmux --lines 5000

Open a bottom cmux terminal pane for the reader when cmux reports a target surface:

fasterm cmux --bottom

If bottom-pane targeting is not available, fasterm saves the capture to a temporary file and prints the exact fasterm read --file ... fallback command.

Let fasterm choose cmux first, then tmux:

fasterm here

Preview the cmux command flow without launching the UI:

fasterm cmux --dry-run

Use it in tmux

Inside tmux, read existing scrollback from the current pane:

fasterm tmux

Capture a specific pane and scrollback depth:

fasterm tmux --pane %12 --scrollback 5000

Preview the tmux command without launching the UI:

fasterm tmux --dry-run

Recommended bindings and examples

Print current recommendations:

fasterm bind

For the normal terminal workflow, launch:

fasterm term -- pi

Press Ctrl-G in that terminal to read recent output.

cmux nightly action registry example for ~/.config/cmux/cmux.json:

{
  "actions": {
    "fasterm.pi": {
      "type": "command",
      "title": "Oh My Pi with fasterm",
      "command": "fasterm term -- pi",
      "target": "newTabInCurrentPane",
      "shortcut": "cmd+shift+p"
    }
  }
}

Edit the config yourself, then reload cmux with cmux reload-config or Cmd+Shift+,. fasterm bind only prints this guidance; it does not edit your config.

For tmux one-shot capture, add a bottom split binding to your tmux config:

bind-key R split-window -v -l 35% "fasterm tmux --pane '#{pane_id}'"

Or add a popup binding:

bind-key R display-popup -E "fasterm tmux --pane '#{pane_id}'"

Then press your tmux prefix followed by R to open the reader for the current pane once.

Read piped output

Pipe mode reads output you send to fasterm:

some-command | fasterm read

Read a file

fasterm read --file output.txt

Start at a specific speed:

fasterm read --file output.txt --wpm 650

Keyboard controls

Key Action
Space Pause / resume
Left, h Step one token backward and pause
Right, l Step one token forward and pause
Up, + Increase WPM
Down, - Decrease WPM
Enter Toggle source context pane
q, Esc Exit

Ghostty / cmux workflow

For Ghostty + cmux, prefer the normal terminal wrapper when starting a new interactive tool:

  1. Install fasterm with cargo install --path ..
  2. Launch the tool inside fasterm, for example fasterm term -- pi.
  3. Work normally in that terminal.
  4. Press Ctrl-G when output gets long, read quickly, quit the reader, and continue in the same session.

Use fasterm cmux, fasterm cmux --bottom, or fasterm here when you need a one-shot read of scrollback that already exists in a cmux terminal surface.

Development

Run the formatter and tests:

cargo fmt
cargo test

Smoke-check the CLI:

cargo run -- --help
cargo run -- term --help
cargo run -- demo --wpm 500
cargo run -- term -- sh -lc 'printf "long ai-like text ...\n"; sleep 1'
cargo run -- bind
cargo run -- here --dry-run
cargo run -- cmux --dry-run
cargo run -- tmux --dry-run

Status

fasterm is an early, focused CLI/TUI for fast terminal reading. The current implementation supports a normal terminal wrapper with a reader hotkey, stdin/file reading, and cmux/tmux one-shot scrollback capture with source-context highlighting.

About

A terminal RSVP reader for stdin and tmux scrollback

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages