ScreenFlow
Turns a recorded terminal session into a GIF you can paste into a ticket.
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 ScreenFlow
Turns a recorded terminal session into a GIF you can paste into a ticket.
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, ScreenFlow is included in every plan along with the rest of the range.
Start with a recording you already have
ScreenFlow doesn’t touch your screen. There’s no capture code in it at all. What it reads is a cast file SessionForge wrote earlier, a list of timestamped output chunks, and it paints those characters into frames using a 5x7 bitmap font compiled into the binary. Everything in the GIF was reconstructed from recorded bytes, not photographed.
sessionforge record build.jsonl -- make deploy
screenflow render build.jsonl `--out` build.gif `--apply`
Without --apply it does all the work and writes nothing, so you can check the frame count and pixel size first.
The timing is honest
One frame per recorded event. GIF can’t express a delay finer than a hundredth of a second, so ScreenFlow rounds each gap and carries the rounding error forward into the next frame instead of throwing it away. Total running time then matches the recorded session to within half a hundredth. --max-idle 2 squashes a five minute pause down to two seconds of animation.
Where it falls down
Colour escapes are stripped, not rendered. Cursor addressing goes the same way, so vim or htop comes out as garbage. This is a tool for line-oriented output: builds, test runs, deploys. Every non-ASCII rune is drawn as a question mark.
Reading on the job itself
- How to record a terminal session and share it Record the output and its timings rather than the pixels. The result is a fraction of the size, it is text ...
Advanced & technical details Command-line builds, source code, checksums and a recorded session — for developers and IT teams
A working command-line build of the renderer: it replays a recorded session through a terminal model and encodes a real animated GIF, or exports individual frames as PNG. It renders sessions recorded by SessionForge; colour, and capturing the screen itself, are on the roadmap.
Naming status
Working name only — brand verdict **AVOID** (Very High). Collision: ScreenFlow. Rename completely.
What it draws on
Existing paid software whose best ideas shaped this program: Bandicam, Snagit, FastStone Capture, Action! Screen Recorder.
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.
screenflow - turn a recorded SessionForge session into an animated GIF
USAGE
screenflow render <cast.jsonl> --out <out.gif> [--cols 80] [--rows 24]
[--speed 1.0] [--max-idle 2.0] [--font-scale 1]
[--theme dark|light] [--apply]
screenflow info <cast.jsonl> [--json]
screenflow frames <cast.jsonl> --out <dir> [--every N] [--cols 80] [--rows 24]
[--font-scale 1] [--theme dark|light] [--apply]
screenflow help | version
RENDER
Replays the cast into a screen buffer, draws the buffer with a built-in 5x7
bitmap font and encodes the result as a real GIF89a animation you can drop
into a chat, a ticket or a README.
--out PATH GIF to write (required)
--cols N terminal width in characters. Default 80
--rows N terminal height in lines. Default 24
--speed N divide every delay by N (2 = twice as fast). Default 1.0
--max-idle S cap any single gap at S seconds. Default 2.0, 0 = no cap
--font-scale N integer pixel scale, 1..8. Default 1
--theme NAME dark or light. Default dark
--apply actually write the file. Without it this is a dry run that
reports frames, dimensions and size and touches nothing
INFO
What would be rendered at render's defaults: event count, duration, frame
count after idle-capping, animation length and output dimensions. --json
emits the same data as one JSON object.
FRAMES
Writes individual PNG frames instead, for anyone who wants to build their own
animation. --every N keeps every Nth frame (the last frame is always kept).
Also a dry run unless --apply is given.
FRAMES AND TIMING
One frame per event, plus one opening frame of the still-empty screen. GIF
delays are whole hundredths of a second, so each gap is rounded to the nearest
hundredth and the rounding error is carried into the next frame: output bursts
less than ~5ms apart get a delay of 0 and are shown as fast as the viewer can,
...
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