SessionForge
Records a command's output with exact timings and replays it at real speed.
Free right now — no account, no card
Preview
1 interface design, then a screenshot of it running. Drag, scroll or use the arrows.
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
- How to watch a handful of servers without setting up a monitoring stack A list of host and port, checked on an interval, that stays silent until something changes state. Almost al...
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
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