Best terminal recording tools for CLI demo videos (asciinema & beyond)

Recording a terminal is the easy part โ€” every tool here does it. Getting a legible, vertical, still-correct-in-six-weeks demo out the other end is where most of them stop helping. Here's what each is actually for, and where a typed terminal beats recording one.

By Hitesh UmaletiyaAugust 10, 20268 min read

"Terminal recording tool" turns up a real zoo of options โ€” asciinema, VHS, terminalizer, ttystudio, the built-in `script` command, or just hitting record in OBS. They don't all do the same job, and the differences matter more once you're trying to turn the result into a 60-second vertical Short instead of a GIF for a README. This is what each one is actually for, where they agree, and the one wall every single one of them hits the moment the target is social video instead of documentation.

Three different jobs wearing one label

Before comparing tools, it helps to sort them by what they actually capture, because "terminal recording" quietly covers three different things:

  • Session recorders run your real shell, capture the actual bytes that scroll by, and play them back later โ€” asciinema and the Unix `script`/`scriptreplay` pair are this camp. You're recording a real command against a real system, warts included.
  • Scripted renderers don't watch a live session at all. You write a small script describing keystrokes and pauses, and the tool drives a terminal emulator through it deterministically, then exports the result as GIF or video โ€” VHS is the clearest example of this shape.
  • Screen capture is the blunt instrument: OBS, QuickTime, or any screen recorder pointed at a terminal window. It doesn't know or care that it's looking at a terminal โ€” it's the same tool you'd use to record a browser.

All three produce something you could call a terminal recording. Only one of those three categories is built around the idea that the output should be reproducible โ€” which turns out to be the property that matters most once you're publishing, not just demoing to a teammate over a call.

asciinema โ€” built for docs, not for Shorts

asciinema records a real terminal session as a compact text file โ€” a timestamped log of the bytes your shell printed โ€” not a video. That's a genuinely good design for its actual use case: the file is tiny, it's copy-paste-able, it plays back crisply at any size because it's replaying characters, not pixels, and you can embed it in a README or a docs site with the official player. If your goal is "let someone watch this command run inside my documentation," asciinema is hard to beat.

It's the wrong tool the moment your target is a vertical Short on YouTube or Instagram, though, for a boring reason: it doesn't export a video file at all. Getting an MP4 or GIF out of an asciicast means a second conversion step through another tool, and what comes out is still shaped like the terminal window you recorded in โ€” usually wide, sized for a desktop, not reflowed for a 9:16 phone frame. You're solving the recording problem and still starting the video problem from zero.

VHS and the scripted-renderer camp

Charm's VHS is the clean example of the second job: instead of recording a live session, you write a small `.tape` script โ€” type this, wait this long, press enter, sleep, screenshot โ€” and VHS drives a real terminal emulator through those exact instructions headlessly, then renders the result to GIF, MP4, or WebM. The output is deterministic: run the same tape twice and you get the same frames twice, because nothing about it depends on how fast your network or your machine happened to be that day. That single property โ€” reproducibility โ€” is what separates this camp from asciinema and plain screen capture, and it's also the closest any of these tools get to the idea a typed terminal takes further: the recording is really a script, and the script is the thing you actually edit.

It still hits the same wall as everything else here, though: the frame is a literal terminal emulator window, typically landscape, themed like a desktop terminal. Reflowing that for a phone screen, or restyling it to match a brand palette, means fighting the renderer's config rather than just changing a component's props.

terminalizer, ttystudio, and the GIF-renderer family

A cluster of tools โ€” terminalizer and ttystudio are the well-known ones โ€” sit between the two camps above: they record a real session like asciinema does, then render that session out to an animated GIF through a headless browser, with configurable window chrome and color themes. They're a reasonable middle ground if you want a nicer-looking embeddable GIF than the raw asciicast player gives you, and the theming options are genuinely useful for matching a project's brand. What they don't solve is the same thing asciinema doesn't solve: the output is a recording of a specific terminal window, at that window's aspect ratio, and turning it into a legible vertical Short is a second project, not a checkbox in these tools.

The default answer: just hit record

Worth naming honestly, because it's what most people actually reach for first: OBS, QuickTime, or any screen recorder pointed at a terminal window. It requires no new tool, no learning curve, and it captures exactly what you saw. It's also the worst of the four options for anything you intend to publish, for reasons that have nothing to do with terminals specifically โ€” it captures your actual desktop resolution and theme, it's one take with no scripting, so a typo or a slow network call means a full re-record, and there's no reflow step at all: whatever aspect ratio your terminal window happened to be is the aspect ratio you're stuck cropping later.

The wall all four of them hit

Every tool above, however good, converges on the same result: a rectangle of pixels showing a terminal at whatever size and shape it was recorded at. That's fine for a README or a docs page, embedded at whatever width the page gives it. It stops being fine the moment the destination is a phone screen, for three concrete reasons:

  • Desktop terminals are landscape; Shorts are 9:16. A recording made at 1280ร—720 doesn't reflow into vertical โ€” it gets cropped, letterboxed, or shrunk until the monospace text is unreadable at arm's length.
  • A recording is baked pixels. If the command you typed had a typo, or the flag you're demoing gets renamed next release, the fix is a full re-record, not an edit โ€” the same problem that shows up with any baked-pixel AI video, just with a human doing the re-take instead of a model.
  • Live sessions leak. A real recorded session shows whatever the network, the filesystem, or a background process actually did at that moment โ€” which is exactly how a stray API key, a hostname, or a half-finished command ends up on camera. Scripted renderers like VHS improve this by scripting the keystrokes, but the command itself still runs for real and can still print something you didn't plan for.

A different approach: type it, don't record it

This is the thing our own terminal demo maker does differently, and it's worth being explicit that it's solving a narrower problem than the tools above, not a superset of it. It isn't a session recorder at all โ€” you write the command and the output as text, and the scene types both out on a real 9:16 canvas sized for a phone from the start. There's no live shell underneath it, so there's nothing to leak: no stray output, no flaky network call, no fifteenth take because a package registry was slow. And because the command and its output are just text in a scene โ€” the same layered, editable model the rest of the studio uses โ€” fixing a wrong flag or updating a renamed command is a text edit and a re-render, not a re-take.

The honest tradeoff: you're not recording a real session, so this only works when you already know what the terminal should show โ€” which is true for almost every planned demo (you know the install command, you know the expected output) and false for the cases these other tools genuinely own, covered below.

A worked example

Take the shape from our README-to-Short post: a CLI's quickstart is one install line and one command that proves the tool works. As a typed scene, that's two beats:

$ npm install -g yourtool
โœ“ installed yourtool@2.4.0

$ yourtool watch ./logs
โ–ธ tailing 3 sources ยท press q to stop

Written out like that, it's not a transcript of something that happened โ€” it's the *intended* output, exactly as clean as the real thing looks on a good day, minus the progress bars, the occasional warning, and the six seconds of install time nobody wants to sit through. That's the actual value of typing it: not that it's easier than recording (recording is often just as fast), but that what ends up on screen is the version of the command you'd want a stranger's first impression to be.

Where the recording tools still win

Symmetry requires saying where a typed terminal is the wrong tool. If the point of the video is proof that something really happened โ€” a benchmark run, a live deploy, an interactive TUI a viewer needs to see actually respond to keystrokes โ€” a scripted or recorded session is doing real work a typed scene can't fake, and shouldn't try to. VHS in particular is a genuinely good fit for a project's own README GIF, where reproducibility matters (CI can regenerate it on every release) and the audience is already reading docs, not scrolling a feed. And if you're demoing a REPL, a debugger, or anything where the interesting part is the back-and-forth rather than a fixed sequence, none of the typed-terminal approach's advantages apply โ€” you need the real thing.

How to pick, in one pass

A short checklist, roughly in the order these questions actually resolve the choice:

  • Is the destination a docs page/README, or a vertical Short? Docs โ†’ asciinema or VHS. Short โ†’ you need a 9:16-native output, which none of the recording tools give you directly.
  • Do you need proof the command really ran (a benchmark, a live system), or is a clean, intended demonstration good enough? Proof โ†’ record it for real. Demonstration โ†’ typing it is faster and cleaner.
  • Will the command or its output change before the video does? If yes, a baked recording is a maintenance liability โ€” an editable scene isn't.
  • Does the session risk showing something you don't want on camera โ€” a real hostname, a real key, a slow real network call? If yes, that's the strongest single argument for scripting or typing the output instead of recording it live.

Try it

If you've got a CLI and a README, the fastest way to see the difference is to point the terminal demo maker at your actual install and quickstart commands and watch them typed out on a real vertical canvas โ€” then decide whether that's the shape you wanted, or whether your case is one of the ones above where a real recording is still the right call. Either way, you'll know in about the time it takes to record one take.

Related

Not ready to build one yet?

Get one practical MCP-video tip when we publish the next post โ€” no more than that.

See it in one real run

Point your agent at a video pipeline that speaks MCP and make one small thing. Free founding-creator pilot โ€” your keys, no watermarks.

Create your studio โ€” free pilot