MIT licensedopen source
for macOS 15+ · Apple silicon & Intel

The screen recorder
your agent can drive.

Every verb is a hotkey, a CLI command, and a localhost REST call — against one daemon. Your agent starts the take; you stop it from the floating pill. Neither has to know the other exists.

Download for macOSMac-Rec-0.4.0.dmg · universal · 2.2 MB
$git clone https://github.com/joelburlin/mac-rec

Unnotarized open-source build — right-click → Open the first time. Requires macOS 15 or later.

the floating pill — excluded from its own recording
0:42.18 🎙
click the meter to mute mid-take · ⌥⌘R record · ⌥⌘← rewind · ⌥⌘S save
01

One daemon, two operators

An agent that can see your screen still can't show you one — GUI recorders expose no API. mac-rec inverts that: the interface is a thin shell over a documented local API, so both operators drive the same session.

Human

  • ⌥⌘R start · pause · resume
  • ⌥⌘A drag a region
  • ⌥⌘← rewind ten seconds
  • ⌥⌘S stop & save
  • menu bar displays, windows, mics
127.0.0.1:5757
recorder daemon
ScreenCaptureKit

Agent

  • mac-rec start --json
  • POST /rewind {"seconds":10}
  • GET /status single source of truth
  • mac-rec stop --captions bold
  • skill drop-in for Claude Code
02

Live rewind, zero re-encoding

Recording streams straight into ~2-second fragmented MP4 chunks on disk. Rewinding just deletes trailing fragments — no seeking, no re-encoding, no waiting. Resume opens a new run; stop concatenates whatever survived, losslessly.

00:00fragment stream · 2s each00:42
$ mac-rec pause && mac-rec rewind 10 && mac-rec resume
⏪ dropped 10.0s (5 fragments) — 0:32.18 kept
03

Finishes the video, not just the capture

Stop runs a real post pipeline: lossless concat, hardware HEVC, transcription, captions, optional AI narration — and keeps the untouched master beside it.

Captions

Five burn-in templates

whisper.cpp with word timings, rendered natively with CoreText — classic, boxed, bold, karaoke, minimal. Correct bidi, so Hebrew and Arabic render properly. SRT, VTT and TXT sidecars always.

Voice

AI re-narration that stays in sync

Replace recorded narration with an ElevenLabs voice. Each sentence is spoken separately, re-anchored to its original timestamp and speed-fit to its slot — then captions are rebuilt from where the audio actually landed.

Audio

A mic that survives reality

Auto-gain rescues quiet webcam mics, denoise and speech-leveling clean the take, and a live level meter means you never discover the silence in post.

Capture

Display, window, or region

Pick a monitor, a single window by id or name, or drag a region. System audio and microphone are captured as separate tracks, so they can be mixed — or replaced — later.

Encode

Hardware HEVC

VideoToolbox on Apple Silicon: a seven-second 1080p take compresses from 2.2 MB to 423 KB with no visible loss. The lossless master is always kept.

Resilience

Nothing eats a take

Displays stay awake while recording, a killed capture auto-pauses instead of zombie-recording, and any failed save is rebuildable from the fragments still on disk.

04

Agent-first, not agent-bolted-on

Drop the skill into Claude Code and "record a walkthrough of this bug" just works — the agent checks state, records, rewinds its own mistakes, and hands back a captioned MP4.

install the skill
$ cp -r skills/mac-rec ~/.claude/skills/

# then, in any session:
"record a demo of the checkout flow
 and caption it"
what the agent runs
$ mac-rec status --json
  {"state":"idle"}
$ mac-rec start --source window \
    --query "Chrome" --json
... drives the UI, misspeaks ...
$ mac-rec pause && mac-rec rewind 8
$ mac-rec resume
$ mac-rec stop --captions bold --json
  {"final":"…/final.mp4","srt":"…"}
05

The whole API

Localhost only. Every CLI verb maps to one call; every call returns JSON. Errors come back as {"error":"…"} with a real status code.

EndpointBodyDoes
GET /statusstate, elapsed, source, mic level, last event
POST /start{source, display, windowID, area, mic}begin a session
POST /pausefinish the current run; enables rewind
POST /rewind{seconds}delete trailing fragments
POST /resumeopen a new run
POST /mic{muted}mute the mic mid-take
POST /stop{output, captions, voiceover, trim}finalize and return the deliverable
06

Get it on your Mac

macOS 15 (Sequoia) or later. Universal — Apple silicon and Intel. ffmpeg does the finalize work (brew install ffmpeg); add whisper-cpp for captions.

download the app
1. Download the .dmg and drag
   Mac-Rec into Applications.

2. Right-click Mac-Rec → Open → Open.
   # once — the build is unnotarized,
   # so macOS quarantines the download

3. Grant Screen Recording on first
   record. One grant covers the app,
   the CLI, and your agent.
or build from source — no Gatekeeper
$ git clone https://github.com/\
    joelburlin/mac-rec
$ cd mac-rec
$ ./setup-signing.sh  # once
$ ./make-app.sh       # app + CLI
$ open /Applications/Mac-Rec.app

# signing locally means permissions
# survive every rebuild
Download for macOSMac-Rec-0.4.0.dmg · universal · 2.2 MB