Recordee: my own screen and camera recorder, after 10 years of OBS

A native Mac recorder with OBS-style scenes: 1 Stream Deck key sets up the screen, the camera and the mic, and records. It replaces OBS, which I used for more than 10 years, and my agents can drive every part of it. Built with Claude Code.

The Recordee app icon: a red record button in a white ring, with the white edelweiss hexagon logo in the middle, on black, and the name Recordee under it
Recordee
A screen and camera recorder for macOS with OBS-style scenes.
1 Stream Deck key calls a scene, or calls it and records. 1 MP4 per recording, with my voice and the other voices on separate tracks.
macOS 26 Apple silicon Swift 6 · SwiftUI + AppKit 0 dependencies 8 MB app Built with Claude Code

Recordee is my own recorder for screens, cameras and calls. It keeps the one idea of OBS I used every day, preset scenes called from a key, and drops the rest. A scene is a fixed layout of screens, windows and cameras, plus 1 mic, the system audio and a quality setting. 1 key on my Stream Deck switches to a scene, or switches and records.

The name follows the -ee family of my other tools, like Webcamee: my own green screen virtual camera and Textee: my own text editor for macOS. Why I build my own apps at all is in The era of personal software is here. This note is the what and the how.

The Recordee window in dark mode: the live preview of the Demo with me scene, a web page with me keyed in the bottom-left corner, the red Record button, audio meters, source checks, and 7 scene tiles with a large shortcut badge and green Display, Audio and Camera rows

The Demo with me scene is live: my demo screen, with me keyed in the bottom-left corner. For this screenshot, Recordee showed sample pictures in place of my real screens.

Why I replaced OBS

I've recorded calls, demos and videos with OBS for more than 10 years. It's a great piece of open-source software, and it's built for streamers. I used about 5 % of it.

Before I wrote a line of code, Claude Code read 10 sessions of my OBS logs, my scene collection and my Stream Deck profiles. What it found:

  • 13 recordings in 9 days, median 29 minutes: the length of a call. 1 recording ran for 5 h 17 min because I forgot to stop it after the call.
  • 16 scenes, 9 in use. The main pattern: start on the call scene, switch to the demo screen each time I share, switch back.
  • Display sources broke. OBS finds a display by an ID that macOS changes. My collection held 5 sources for 2 physical displays.
  • A missing mic was silent. One day my audio interface went away mid-session. OBS wrote 53,605 log lines about it and showed me nothing.
  • 1 mixed audio track. My voice and the other people's voices were in 1 track, so a transcript tool couldn't tell them apart.
  • Every file stored twice. OBS wrote .mkv, then a remuxed .mp4 beside it, and kept both.
  • Not made for my agents. The scenes live in a large JSON file that OBS rewrites, the control API was off, and nothing told a script what OBS was doing.
Job With OBS With Recordee
Scenes 16, by display ID, 5 sources for 2 screens 7, by display role and pixel size, edited as JSON or in an editor
Audio 1 mixed track 3 tracks in 1 MP4 (mix, mic, system), plus mic.mp3 and remote.mp3
Files .mkv and .mp4 of every recording 1 MP4, written in 1 s fragments
Forgotten stop 5 h 17 min, 8.4 GB, twice A warning after 10 min of silence and no change on screen, a stop at 15
Missing device Silence in the log A red banner, "Not found" on the canvas, the recording goes on
Name YYMMDD-HHMMSS, renamed by hand A name panel after Stop, with the cursor ready
Agents No way in Links, a status file, a command line tool, files it watches

How it works

Diagram of Recordee: displays, app windows, the Cam Link 4K and Webcamee cameras, the mic and the system audio go into Recordee, which captures only the live scene's sources, composes the scene on the GPU, mixes the audio on 1 clock and writes 1 MP4 with 3 audio tracks, stems, and a status file. The Stream Deck, hotkeys, recordee:// links, a command line tool and my agents control it

Recordee is 1 native app. It opens only the sources of the live scene: a scene that isn't live costs nothing. A switch opens the new sources, waits for their first frames, then fades over 300 ms. The mic and the system audio switch in the middle of the fade, so the file has no gap.

What it does

Scenes

Feature What it does
Layers Displays, app windows and cameras, each with a position, a crop and an optional chroma key
Audio per scene 1 mic and the system audio: all apps, some apps or none
Quality per scene Small, Standard or High, at 30, 25 or 15 fps. HEVC on the hardware encoder
Key mode A key switches, or switches and records
Chroma key auto reads the wall colour from the picture every 2 s, so it follows the daylight
Scene editor A canvas with the layers, or the JSON file by hand. Recordee reloads it at once
Displays by role demo, prompter, left, right: found by name and pixel size, never by an ID that changes

My 7 scenes today: Call (the Prompter display with the call, my mic, the call audio), Call - share, Screen + mic, Screen silent, Camera check, Demo with me, and Webcamee check.

Recording

Feature What it does
3 audio tracks Mix (what players play), my mic only, the system audio only. ffmpeg -map 0:a:1 reads my voice
Stems mic.mp3, remote.mp3 and meta.json (scenes, devices, durations, stop reason) next to the file
Switch while recording 1 file, whatever the number of scene changes
Name after Stop The file saves at once. A panel then offers the name, with the cursor at the end
Crash recovery The file grows in 1 s fragments. The next launch saves what a crash left: about 1 s lost
Runaway guard 10 min with silence on every track and no change on screen: a warning. 15 min: a stop and a save
Disk guard No start under 10 GB free, a warning when less than 1 hour is left
Shared devices No lock: Recordee records the same mic as Teams or Webcamee without taking it from them

Actions

A scene can run actions when it goes live, or when a recording starts and stops:

The window

Recordee on my vertical 4K display: a large live preview of Demo with me at the top, the Record button, audio and checks under it, then 7 scene tiles in 2 rows of 4, each with its shortcut badge and Display, Audio and Camera rows in green for the devices the scene uses

Recordee lives on my vertical 4K display, and the layout follows the window: wide, tall or portrait.

  • Preview of the live scene, with its name in large type and a LIVE or REC badge.
  • Scene tiles with a still of each scene, a large ⌘ number, and 3 rows: Display, Audio, Camera. Each row lists all my devices. Green means the scene uses it. A KEY badge marks a keyed camera.
  • Checks for every source of the live scene: live, missing, or no permission.
  • Camera panel at the bottom: the Cam Link 4K, whatever scene is live, to check my framing before a camera scene.
  • Recent recordings, with play, rename and show in Finder.

Made for my agents

This is the part OBS couldn't give me. Everything I do with a key, an agent can do with a file or a link:

Way in What it gives
scenes.json The scenes as plain JSON. Claude Code adds or changes a scene, and Recordee reloads it at once
settings.json Displays, devices, actions, output folder. Same: edit, save, live
recordee:// scene/<id>, scene/<id>?record=1, record, stop, toggle, show: from a script, Raycast or Hammerspoon
status.json Rewritten every second: the live scene, the state, the time, the levels, every problem
recordee-rec The same engine on the command line: devices, record --scene <id> --seconds <n>, rename
Stems and meta.json What my call-notes skill reads: my voice and the others apart, the scenes, the devices

The Stream Deck follows the same files. When Recordee starts, the Stream Deck switches to the Recordee profile, and its scene keys come from scenes.json: a new scene gets a key without me touching the Stream Deck app (my note: Elgato's Stream Deck for business users). Each key shows its scene, and the record key shows the timer.

Recordee vs OBS

The same job for both: record my demo display and the system audio at 1080p, 30 fps, HEVC on the hardware encoder. Measured on 15th October 2026 on the Mac Studio M1 Ultra.

Measure Recordee OBS Studio 32
Memory while recording 292 MB 598 MB (with its muxer)
CPU while recording 31 % of 1 core 54 % of 1 core
Energy impact 29 50
Launch to first picture 1.5 s 5.0 s
App on disk 8 MB 435 MB
Audio tracks per file 3 1

2 notes on fairness:

  • OBS keeps every source of all its scenes open, 16 scenes in my case. Recordee opens only the live scene's sources.
  • About 100 MB of Recordee's memory isn't Recordee. macOS loads its camera effects engine (Reactions, with hand and face models) into every app that opens a camera, and my camera panel keeps the Cam Link open. Without a camera, Recordee idles at 130 MB.

For business people

Most of my videos are calls and demos for clients and colleagues. They need to look right and sound right, and the recording must be there afterwards.

  • 1 key, everything ready. Screen, camera, mic, Key Lights and the Hue BUSY light, from 1 key on the Stream Deck.
  • Nothing lost. A crash costs about 1 second. A missing device shows at once, and the recording goes on. A forgotten recording stops by itself.
  • Better notes from calls. My voice and the other voices are on separate tracks. The transcript knows who said what, so the call notes my agents write get better.
  • Private. Everything runs on my Mac: no cloud, no account, no analytics.
  • Cost. No subscription. About half the memory of OBS and 40 % less CPU for the same recording.
  • Limits. No streaming, no virtual camera, no plugins. It's built for 1 Mac and 1 person: me.

For technical people

Part Built with
App Swift 6, AppKit and SwiftUI on macOS 26. A window, a menu bar dot, and global hotkeys
Capture ScreenCaptureKit for displays, windows and system audio. AVFoundation for cameras and mics
Compositor Core Image on Metal, 1920 x 1080. The chroma key is OBS's maths baked into a 64 x 64 x 64 colour cube
Audio 1 timeline on the host clock at 48 kHz: mic and system audio mixed, and kept apart for their own tracks
File Fragmented MP4: HEVC and 3 AAC tracks in 1 alternate group. ffmpeg makes the MP3 stems
Stream Deck A native plugin in Swift on the Stream Deck SDK, with live key faces. A Python script builds the profile from scenes.json
Signing My own Apple Developer ID. No App Store, no sandbox
Size About 12,700 lines of Swift, plus 1,000 lines of Python for the build and the Stream Deck

Gotchas I hit

  • ScreenCaptureKit sends a frame only when the screen changes. A still screen means no frames. The compositor repeats the last frame, so the file keeps a steady frame rate.
  • A pale green wall made me half transparent. My wall is a soft green in the morning light, and a fixed key distance ate into my face. The key distances now scale with the wall's saturation.
  • 2 apps on 1 audio interface hung Core Audio. 2 processes opened the same USB audio device and the whole Mac's audio stopped. Tests now use a different mic.
  • The camera effects of macOS cost about 100 MB. Reactions load an effects engine and hand models into every app that opens a camera. Recordee now turns the gestures off by default; the Reactions toggle is the user's, in Control Center.
  • A Stream Deck profile from a plugin needs a name. The Stream Deck app refused to import the profile until its manifest carried a preconfigured name.
  • Scene stills need their sources. The tiles showed a picture only after a visit to each scene. The window now opens the other scenes' cameras and screens for 2 s at launch, never their mics.

How I built it

  • Analysis first. Claude Code read my OBS logs, scene collection and Stream Deck profiles, and wrote down how I really use OBS, the problems above, and a list of open questions. I answered them in 1 prompt.
  • Then a spec. About 530 lines: scenes, audio, file format, safety, control, actions, tests.
  • Then the build, with Claude Code, on 14th and 15th October 2026. Every change gets tested with a separate settings folder, so a test never switches on my real lights.
  • QA without my screens. A test hook replaces each source with a picture file. The screenshots in this note come from it.

What's next

  • Scenes as my call camera. Recordee sends Demo with me to Webcamee, Webcamee sends it to Teams, and I switch between "me" and the scene from Callee, my Teams call helper.
  • Webcamee's cut-out in Recordee. Webcamee keys me better than Recordee's colour key does. It can send me, already cut out, to Recordee.
  • Reactions off for Recordee, then a new memory measure.
  • A public repo, with the scene editor screenshots, once I've checked it for personal paths.

Further reading

NicAI
Written by NicAI, Nic's AI assistant, for his personal knowledge base. Researched and drafted by the model, not hand-written by Nic. Verify anything you plan to act on.