Remote Ops Workspace

SessionForge

Records a command's output with exact timings and replays it at real speed.

Free right now — no account, no card

Get SessionForge free Windows & Mac · one file, nothing to install

Preview

1 interface design, then a screenshot of it running. Drag, scroll or use the arrows.

Interface design SessionForge, 1 of 1
Screenshot SessionForge running on Windows today

Free while we’re in preview

Get SessionForge

Records a command's output with exact timings and replays it at real speed.

The Mac button is for Apple Silicon. On an older Intel Mac, get this one instead.

One file, both ways. Double-click it for the window. Run the same file from a command prompt with arguments and it behaves as the command-line tool, because the engine is inside it. Nothing else to download and nothing to keep beside it.

Early preview. The window has been built and run, but not yet on a real Windows PC or Mac, so expect rough edges. The engine underneath it is fully tested.

  • One file — no installer
  • Runs on your machine, offline
  • Source code published below

Free while in preview. It isn’t signed yet, so Windows or macOS will ask you to confirm the first time you open it. At launch, SessionForge is included in every plan along with the rest of the range.

The point is the pauses

Anyone can capture a log. SessionForge stores when each chunk arrived, so a replay shows the ninety seconds where nothing moved as ninety seconds of nothing moving. On a deploy that went wrong, that gap is usually the interesting part.

sessionforge record deploy.jsonl `--title` "prod deploy" -- ./deploy.sh
sessionforge replay deploy.jsonl `--speed` 4 `--max-idle` 2

Delays are scheduled against an absolute start time, so a long replay doesn’t drift.

Invisible while it records

record prints no banner and no summary. Its own stdout and stderr carry only the child’s bytes and it exits with the child’s status, so you can drop it in front of a command in a script and nothing downstream notices. Events are written a complete line at a time, so a recording killed halfway is still a valid file.

Pipes, not a terminal

Here’s the honest boundary. A real PTY needs syscalls the portable Go library doesn’t have, so stdout and stderr are captured as two pipes. htop and vim detect that and behave differently. Most tools also drop colour and switch to block buffering on a pipe, which changes the very timing you’re recording. And a cast is plaintext: if the command printed a credential, the file holds it.

Reading on the job itself

Advanced & technical details Command-line builds, source code, checksums and a recorded session — for developers and IT teams

A working CLI prototype of the session recorder: run a command, capture every output chunk with its exact timing, then replay it at true speed — with a speed multiplier and an idle-gap cap so a long pause doesn't have to be sat through. Verified against real pauses: a 3-second session replayed in 3.01s, in 1.01s at 3x, and in 0.61s capped. This records output streams, not a full interactive PTY; that's on the roadmap.

Recorded session

Recorded terminal session showing SessionForge running
A real recorded session — SessionForge’s actual output, captured by running the shipped binary.

Naming status

Working name only — brand verdict **RENAME** (High). Collision: SessionForge. Prefer a different coined name.

What it draws on

Existing paid software whose best ideas shaped this program: MobaXterm Professional, SecureCRT, WinSCP Microsoft Store Edition, Remote Desktop Manager.

Command line

There is nothing extra to install. The program you download is the command-line tool as well: give it arguments instead of double-clicking it and it runs as one, with its output on your terminal. The standalone builds below are the same engine on its own, for machines where you would rather not ship a window at all.

sessionforge - record a command's output with timing, replay it later

USAGE
  sessionforge record <cast.jsonl> [--title TEXT] -- <command> [args...]
  sessionforge replay <cast.jsonl> [--speed 1.0] [--max-idle 2.0] [--no-timing]
  sessionforge info   <cast.jsonl> [--json]
  sessionforge cat    <cast.jsonl> [--stdout-only | --stderr-only]
  sessionforge help | version

RECORD
  Runs the command, streams its output to your terminal live, and writes every
  chunk to the cast file with the elapsed time it arrived at. stdout and stderr
  are tagged separately but stored interleaved in real time order. record is
  transparent: its own stdout and stderr carry only the child's bytes, and it
  exits with the child's exit status (128+N if the child was killed by signal N).
    --title TEXT   label stored in the cast header

REPLAY
  Replays the cast with the original inter-event delays.
    --speed N      divide every delay by N (2 = twice as fast). Default 1.0
    --max-idle S   cap any single gap at S seconds, so a five minute pause can
                   replay in two. Default 0, meaning no cap
    --no-timing    dump everything instantly, no sleeping

INFO
  Header fields, event count, duration, byte totals, longest idle gap and the
  recorded exit code. --json emits the same data as one JSON object.

CAT
  Plain transcript with no timing. Byte-identical to what the command printed.
    --stdout-only  only stdout events
    --stderr-only  only stderr events

CAST FORMAT
  JSON lines. Line 1 is a header object, then one array per event:
    [elapsed_seconds, "o"|"e", "chunk"]
  and a trailing footer object holding the exit code. See README.txt.

NOTE
  This records output streams, not a full interactive PTY session.

Recorded from the shipped binary, not written by hand.

Source

Every file the program is built from:

console.go · console_test.go · guided.go · main.go

SHA-256 checksums · build instructions & scope notes · full build plan