Screen Studio Lite

ScreenFlow

Turns a recorded terminal session into a GIF you can paste into a ticket.

Free right now — no account, no card

Get ScreenFlow 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 ScreenFlow, 1 of 1
Screenshot ScreenFlow running on Windows today

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

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