Download, archive, and browse your entire Loom video library offline.
Self-hosted tool to back up your complete Loom video library β MP4s, transcripts, captions, and thumbnails β with a sleek local viewer UI. Supports HLS stream downloading via ffmpeg, real-time backup progress via SSE, and incremental sync that skips already-downloaded files.
- Full Library Sync β Fetches metadata for your entire Loom library via the internal GraphQL API with cursor pagination
- HLS Stream Download β Most Loom videos use HLS streaming; loom-offline uses
ffmpegto download and mux them into MP4 files automatically - Folder Preservation β Recreates your Loom folder hierarchy locally
- Incremental Backup β Skips already-downloaded files so you can re-run safely
- Complete Media Backup β MP4 video, static/animated thumbnails, JSON transcripts, and VTT captions
- UI-Driven Backup β Settings panel to configure what to download, start/stop controls, and a real-time progress bar via Server-Sent Events
- CLI Backup β Run
node backup.jsstandalone if you prefer the command line - Local Viewer β React-based UI with video playback, transcript display, folder navigation, and full-text search
- Node.js v18+
- ffmpeg β Required for downloading HLS video streams (the majority of Loom videos)
# macOS brew install ffmpeg # Ubuntu/Debian sudo apt install ffmpeg # Windows (via chocolatey) choco install ffmpeg
- Loom Cookie β A valid session cookie from loom.com (see below)
git clone https://github.com/robertoamoreno/loom_com_backup.git
cd loom_com_backup
npm install
cd viewer && npm install- Open loom.com and log in
- Open Developer Tools (
F12orCmd+Opt+I) - Go to the Network tab
- Reload the page or navigate to your library
- Click any request to
loom.com - In the Headers tab, find the
Cookierequest header - Copy the entire value
- Create a
.envfile in the project root:LOOM_COOKIE="paste-your-full-cookie-string-here"
Your cookie contains your session credentials. Never share it or commit it to version control.
- Start the server:
cd viewer && node server.cjs
- Start the frontend (in another terminal):
cd viewer && npm run dev
- Open http://localhost:5173 in your browser
- Click the settings icon to configure backup options (MP4, transcripts, thumbnails, captions)
- Click Start Backup β progress streams in real-time via SSE
node backup.jsThe script logs progress to the console and skips files that already exist.
Once you have videos downloaded, the viewer UI lets you:
- Browse by folder
- Search across all video titles
- Play videos with the built-in player
- Read transcripts alongside the video
loom-offline/
βββ backup.js # CLI entry point
βββ src/
β βββ backup-engine.js # Core backup logic (GraphQL, HLS/ffmpeg, downloads)
βββ viewer/
β βββ server.cjs # Express API (library, backup control, SSE, static files)
β βββ src/
β βββ App.jsx # Main viewer UI
β βββ BackupPanel.jsx # Settings & backup controls
β βββ BackupProgress.jsx # Real-time progress display
βββ Loom_Backup/ # Downloaded videos (gitignored)
βββ .env # Your Loom cookie (gitignored)
Backup flow: backup-engine.js fetches your library metadata via Loom's GraphQL API, then downloads each video's MP4 (direct URL or HLSβffmpeg fallback), transcript, captions, and thumbnails into Loom_Backup/ organized by folder.
Viewer flow: server.cjs serves the backup directory as static files and provides a /api/library endpoint that scans Loom_Backup/ for video metadata. The React UI consumes this API. Backup can be started/stopped from the UI via /api/backup/start and /api/backup/stop, with live progress streamed over SSE.
This tool is for personal use to back up your own Loom videos.
- All data stays local on your machine
- No data is sent to third parties
- Never commit your
.envfile orLoom_Backup/directory
Contributions welcome! Please open an issue or pull request.