A local-first, open-source screen recorder with Loom-style sharing that runs on storage you own.
Specification · Feature parity · Sharing · Publish to YouTube · Self-hosting · Contributing
Record your screen with your camera, or just your camera. Everything lands as a plain, seekable MP4 in a library on your own disk. When you want to send a link, share through a share server you run yourself (hosted watch page with comments, reactions and viewer analytics) or any S3-compatible bucket. No accounts, no telemetry, no vendor lock. Free and open source under the AGPL-3.0.
A 65-second tour: recording with your face in the shot, drawing while you talk, cutting the dead air, transcripts and AI, and the link you host yourself.
Two shorter guides: your first recording (42s) and connecting YouTube publishing (45s).
- Face-first capture. A slim always-on-top launcher with a live camera preview, and one switch between Full face and Screen (screen with your camera bubble composited in). Pick a whole display or a single application window. Every recording includes your camera by design - if you want screen capture with no webcam, Open Loom is not the tool for you.
- Camera bubble. Circular, draggable, three sizes, mirror toggle. In Screen mode a bottom-centre slider flips the camera between Full face and Face + screen live, mid-recording.
- System audio. Native loopback on macOS 14.2 and later, mixed with your microphone. No virtual driver.
- Recording controls. Countdown, pause and resume, restart, cancel, an on-screen control bar, configurable global shortcuts, a drawing tool and optional click highlights.
- Crash recovery. An interrupted recording is offered back to you on the next launch.
- Library. Thumbnail grid with animated hover previews, folders, and search across titles and transcripts. Uncapped, on your disk.
- Watch and edit. Custom player with speeds from 0.8x to 2.5x, captions and chapters. Trim, cut out middle sections, and stitch clips together.
- Transcription and AI. Local whisper.cpp (private and offline) or any OpenAI-compatible endpoint. Bring your own key for AI titles, summaries, chapters and action items, including local Ollama.
- Sharing that works instantly. The share link is minted and copied to your clipboard the moment a recording stops; the upload runs in the background. Watch pages carry timestamped comments, emoji reactions, viewer analytics, password protection and a call-to-action button.
The full comparison with Loom, feature by feature, is in FEATURES.md.
- Node.js 20.19+ or 22.12+ (older 20.x releases fail to build: vite and electron-vite require
those floors).
.nvmrcpins a known-good version -nvm usepicks it up. - ffmpeg and ffprobe on your PATH. If they are missing, the first-run Setup screen offers a guided download of a static build.
- Building from source on macOS: Xcode Command Line Tools (
xcode-select --install). One optional native addon (the FaceCam Portrait and Studio Light effects) compiles Objective-C++ against AVFoundation at install time. Without the tools it fails quietly,npm installstill succeeds, and the app runs with those two effects doing nothing - the reason only appears in the log. Everything else works. - macOS 14.2 or newer for system-audio capture. The rest of the app works on macOS 13 and later.
- Windows and Linux builds ship from the same source and CI, but the maintainer develops on macOS, so those two get far less real-world mileage. Bug reports from them are especially welcome.
Grab your platform from the latest release:
| Platform | File |
|---|---|
| macOS, Apple Silicon | OpenLoom-<version>-arm64.dmg |
| macOS, Intel | OpenLoom-<version>-x64.dmg |
| Windows | OpenLoom-<version>-x64.exe |
| Linux, AppImage | OpenLoom-<version>-x86_64.AppImage (mark executable and run) |
| Linux, Debian and Ubuntu | OpenLoom-<version>-amd64.deb (sudo dpkg -i) |
arm64 builds exist for every platform. Linux keeps its own architecture names,
so x86-64 reads as x86_64 on the AppImage and amd64 on the deb.
On macOS, drag Open Loom into Applications and open it.
Verify the download first. The build is ad-hoc signed, so the signature proves nothing about
who made it. Every release ships a SHA256SUMS.txt; check the file you downloaded matches before
you open it:
shasum -a 256 -c SHA256SUMS.txt # run in the folder holding both files
# OpenLoom-0.1.4-arm64.dmg: OKIf it does not say OK, do not open it - you have a tampered or corrupted copy.
The build is ad-hoc signed but not notarized, so macOS will refuse it on first launch with "Apple could not verify Open Loom is free of malware". To allow it: open System Settings > Privacy & Security, scroll to the Security section, and click Open Anyway next to the Open Loom message, then confirm. macOS remembers the choice. (The older right-click > Open trick was removed in macOS 15 Sequoia; on macOS 14 and earlier it still works.)
It then lives in your menu bar and Dock.
On Windows, SmartScreen will warn about an unrecognised publisher for the same reason: the installer is unsigned. Choose More info then Run anyway. Linux builds have no such gate.
New here? The Getting started guide walks through your first recording, connecting YouTube, editing, and sharing.
git clone https://github.com/jayden9889/open-loom.git
cd open-loom
npm install
npm run dev # launches Electron with hot reloadTo produce installers for your platform:
npm run dist # builds and packages via electron-buildernpm run dist writes a dmg and zip on macOS, an NSIS installer on Windows, and AppImage and deb
packages on Linux, into release/.
The first launch opens a Setup screen that checks four things and gives each a Fix button.
- Screen Recording (macOS). Required to capture your screen. macOS shows a system prompt the first time; if you miss it, open System Settings, then Privacy and Security, then Screen and System Audio Recording, and enable Open Loom. A recording that comes out black almost always means this permission is off.
- Camera. Only needed for camera and screen-plus-camera modes. The Fix button triggers the macOS prompt.
- Microphone. Only needed when the mic is on. Same prompt path.
- ffmpeg. Needed to turn a raw capture into a seekable MP4. If it is not on your PATH, the Fix button downloads a static build into the app's data folder.
You can re-run these checks any time from Settings, then About.
Open Settings, then General, then Save folder, and pick any directory. Every recording is a folder
inside it holding video.mp4, a thumbnail, a preview GIF, a transcript and a small meta.json.
Move, back up or delete these with ordinary file tools. Reveal in Finder is one click from any video.
Sharing is off by default and every recording stays on your machine. When you want links, choose a provider in Settings, then Sharing.
Nothing leaves your disk. You can still trim, transcribe, and reveal the MP4 to attach it to email or drop it into any tool by hand.
openloom-server is a small Hono and SQLite service that delivers the full loop: hosted watch page,
comments, reactions, analytics and password protection.
cd packages/server
echo "API_KEY=$(openssl rand -base64 24)" > .env
echo "BASE_URL=https://videos.example.com" >> .env
docker compose up -dDocker Compose reads .env automatically, so the key stays in a file that can be checked again
(cat .env) rather than only in scrolled-past terminal output. Put the same API_KEY and BASE_URL
into Settings, then Sharing, then use Test to confirm the app can reach it. A link only becomes
trustworthy once that domain is actually pointed at the box with HTTPS in front of it; the
recommended setup, a subdomain and automatic HTTPS with Caddy, plus the from-source path and
backups, is the full walkthrough in docs/SELF-HOSTING.md.
Any S3-compatible bucket works. R2 is a good default because egress is free. Create a bucket, add a public custom domain or dev URL, create an API token, then fill Settings, then Sharing, then S3 with the endpoint, bucket, keys and public base URL, and press Test. Open Loom uploads the video plus a self-contained static player page, so the share link is a plain public URL. Step by step in docs/SHARING.md.
Transcription runs locally with whisper.cpp or through any OpenAI-compatible endpoint. To set up the local engine:
scripts/setup-whisper.shThis clones and builds whisper.cpp (Metal on macOS) and downloads the base.en model. Settings, then
Transcription also has an Install whisper.cpp button that runs the same steps with a live log, or you
can point the two path fields at an existing whisper-cli binary and model. Turn on Transcribe
automatically to run it after each recording. Details in docs/TRANSCRIPTION.md.
AI titles, summaries, chapters and action items are generated from a video's transcript with a provider you bring yourself. In Settings, then AI, pick Anthropic, an OpenAI-compatible endpoint, or local Ollama, set the model and key, and press Test connection. Keys are stored encrypted with your operating system keychain and never leave your machine except to the provider you chose. Ollama needs no key and keeps everything local.
Global shortcuts work even when Open Loom is hidden, and are editable in Settings, then Shortcuts.
| Action | Default |
|---|---|
| Start or stop recording | Cmd+Shift+L |
| Pause or resume | Alt+Shift+P |
| Cancel recording | Alt+Shift+C |
| Restart recording | Cmd+Shift+R |
| Toggle drawing | Control+1 |
In the watch player:
| Action | Key |
|---|---|
| Play or pause | Space |
| Skip 5 seconds | Left / Right |
| Volume | Up / Down |
| Fullscreen | F |
| Captions | C |
Why not YouTube unlisted as the share backend? Videos uploaded through an unverified YouTube API project are locked to private with no appeal, and uploads sit in a small shared daily quota. That breaks "record, link works instantly" for an installable tool. Open Loom uses storage you own instead. Full analysis in docs/SHARING.md.
Where are my videos? In your save folder, as ordinary MP4 files you own. There is no cloud copy unless you choose a share provider, and even then the original never leaves your disk.
Do I need a server to use Open Loom? No. Recording, the library, editing, transcription and AI all work with sharing set to local only.
Is anything sent anywhere? No telemetry, ever. Network requests only happen when you share (to your own server or bucket) or when you use an AI or transcription endpoint you configured.
- The recording is black. macOS Screen Recording permission is off. Open System Settings, then Privacy and Security, then Screen and System Audio Recording, enable Open Loom, and restart it.
- No system audio. Loopback capture needs macOS 14.2 or newer. On older macOS the toggle is disabled with an explanation. Your microphone still records.
- ffmpeg not found. Install ffmpeg, or use the Setup screen (or Settings, then About) to download a static build.
- Click highlights say unavailable. The optional input hook could not load, or Accessibility permission is off. The rest of the app is unaffected.
npm run typecheck # strict TypeScript across all workspaces
npm test # vitest unit and integration tests (needs ffmpeg on PATH)
npm run build # production build (apps/desktop/out)
npm run dist # package installers via electron-builder
npm run e2e # Playwright smoke test against the built app
npm run lint # eslint
npm run make:icons # regenerate assets/icon.png and tray templates
npm run make:sample # generate a 5s H.264 sample video for testsRunning and testing details are in docs/TESTING.md.
npm workspaces: apps/desktop (Electron app, split into main, preload and renderer),
packages/shared (types and design tokens), packages/server (the self-hosted share server). The
full tree is in SPEC.md section 2.
Open Loom re-implements the Loom product experience openly. No Loom code, assets or branding are copied. It also stands on the shoulders of earlier open-source recorders as prior art: Cap (Tauri and Rust, AGPL, source of the instant-share idea), Screenity (a GPL browser extension), and OpenScreen (MIT, archived). Open Loom is original code.
GNU Affero General Public License v3.0 or later, copyright Jayden Mortimer. In plain words: use it, modify it, share it, run it at work, sell it if you like - all free. The one obligation is reciprocity. If you distribute a modified version, or run one as a service other people use over a network, you have to publish your changes under the same licence.
Licence history: v0.1.1 and earlier shipped under plain MIT, v0.1.2 and v0.1.3 under MIT with the Commons Clause. Those releases stay under the licence they shipped with. See LICENSE.


