Skip to content

video-db/bloom

Electron Node License Stargazers Issues Website


Bloom

An open source, agentic Loom alternative.

Record locally. Make recordings AI-ready. Run workflows on top.

Record → Query → Automate

Install · Features · Docs · Report Bug


What is Bloom?

Bloom is a local-first screen recorder built for agentic workflows.

  • Record locally — No lock-in, your files stay yours
  • Upload to VideoDB — Automatic cloud sync with AI processing.
  • Find any moment — Transcripts, visual embeddings, metadata.
  • Let agents work on your recordings — Query via APIs or agent frameworks like Claude Code and access your recordings data.

Recordings are no longer files, they are inputs for AI.


Demo

Bloom.Demo.mp4

Installation

Run this in your terminal to install Bloom:

curl -fsSL https://artifacts.videodb.io/bloom/install | bash

This will automatically detect your Mac architecture, download the right build, and install it to /Applications.

Manual install
  1. Mount the DMG and drag Bloom to your Applications folder
  2. Open Terminal and run xattr -cr /Applications/Bloom.app
  3. Launch the app from Applications or Spotlight

Supported on macOS and Windows (pre-built installer available for macOS). Linux support coming soon.


Features

Feature Description
No subscription Pay only for usage
Local-first Record locally, no lock-in
AI-ready Search, summarize, extract
Screen recording Capture screen, microphone, and system audio via VideoDB Capture SDK
Camera overlay Draggable camera bubble during recording
Floating bar Always-on-top control bar that never blocks your apps
Multi-monitor Display picker to choose which screen to record
Library Browse, search, play, rename, and download recordings
Transcription Automatic transcript generation with subtitled playback
Chat with video Ask questions about your recording via VideoDB Chat
Share One-click shareable link for any recording
Keyboard shortcut Cmd+Shift+R to start/stop recording from anywhere
Open source Fully customizable UI layer

Architecture

Bloom = UI layer (open source)
VideoDB = Intelligence layer (cloud)
graph LR
    subgraph EA["  Electron App  "]
        R["Renderer UI"]
        M["Main Process"]
        DB[("SQLite")]
        R -->|IPC| M
        M --> DB
        M --> SDK
    end

    subgraph VS["  VideoDB SDK  "]
        SDK["Node SDK"]
        CC["CaptureClient"]
        WS["WebSocket"]
        API["Connection API"]
        BIN["Native Binary"]
        SDK --> CC & WS & API
        CC --> BIN
    end

    subgraph LC["  Local Capture  "]
        SC["Screen Capture"]
        MIC["Microphone"]
        SA["System Audio"]
        BIN --> SC & MIC & SA
    end

    subgraph VC["  VideoDB  "]
        UPLOAD["Upload & Export"]
        STREAM["HLS Streaming"]
        IDX["Indexing"]
        TRX["Transcription"]
        UPLOAD --> STREAM
        IDX --> TRX
    end

    BIN -->|"upload chunks"| UPLOAD
    WS -->|"session events"| UPLOAD
    API -->|"index / transcribe"| IDX

    classDef orange fill:#2e1a08,stroke:#EC5B16,stroke-width:1.5px,color:#f5a36a
    classDef amber  fill:#2e2008,stroke:#E8A317,stroke-width:1.5px,color:#f5d080
    classDef red    fill:#2e0d08,stroke:#FF4000,stroke-width:1.5px,color:#ff8a60
    classDef green  fill:#0d2e1a,stroke:#4CAF50,stroke-width:1.5px,color:#8ed4a0
    classDef db     fill:#1a1208,stroke:#EC5B16,stroke-width:1.5px,color:#f5a36a

    class R,M orange
    class SDK,CC,WS,API,BIN amber
    class SC,MIC,SA red
    class UPLOAD,IDX,TRX,STREAM green
    class DB db

    style EA fill:#1a0e04,stroke:#EC5B16,stroke-width:2px,color:#f5a36a
    style VS fill:#1a1504,stroke:#E8A317,stroke-width:2px,color:#f5d080
    style LC fill:#1a0804,stroke:#FF4000,stroke-width:2px,color:#ff8a60
    style VC fill:#071810,stroke:#4CAF50,stroke-width:2px,color:#8ed4a0
Loading

Recording flow: The app creates a CaptureClient which spawns a native binary to capture screen, mic, and system audio. Chunks are uploaded to VideoDB Cloud in real-time. A WebSocket connection delivers session events (started, stopped, exported) back to the app.

Post-recording: Once the video is exported, the app calls the VideoDB API to index spoken words, generate a transcript, and create a subtitled stream — all available for in-app HLS playback or sharing via URL.


Open source

The UI layer is fully open source.

  • Modify it — Customize the interface to your needs
  • Extend it — Add new features and workflows
  • Plug it in — Integrate with your own systems

Bloom is not just a tool. It's a foundation for building agentic systems on top of recordings.


Philosophy

Your recorder should not trap your data.

It should:

  • Give you ownership — Local-first, no lock-in
  • Enable intelligence — AI-ready from day one
  • Power your agents — APIs and integrations built-in

Bloom is built for that future.


Development Setup

Prerequisites

Quick Start

npm install
npm start

On first launch, grant microphone and screen recording permissions, then enter your VideoDB API key.


Project Structure

src/
├── main/                       # Electron Main Process
│   ├── index.js                # App entry, windows, tray, IPC routing
│   ├── db/
│   │   └── database.js         # SQLite via sql.js
│   ├── ipc/                    # IPC handlers
│   │   ├── capture.js          # Recording start/stop, channels, devices
│   │   ├── permissions.js      # Permission check/request/open settings
│   │   ├── camera.js           # Camera bubble control
│   │   ├── history.js          # Library: recordings list, delete, sync
│   │   └── auth.js             # Login, logout, onboarding
│   ├── lib/                    # Utilities
│   │   ├── config.js           # App config
│   │   ├── logger.js           # File + console logging
│   │   ├── paths.js            # App paths (DB, config, logs)
│   │   └── videodb-patch.js    # Binary relocation for packaged apps
│   └── services/
│       ├── videodb.service.js  # VideoDB SDK wrapper
│       ├── session.service.js  # Session tokens, WebSocket, sync
│       └── insights.service.js # Transcript + subtitle indexing
├── renderer/                   # Renderer (context-isolated)
│   ├── index.html              # Floating bar page
│   ├── renderer.js             # Bar init + event routing
│   ├── permissions.html        # Permissions modal window
│   ├── onboarding.html         # Onboarding modal window
│   ├── history.html            # Library window
│   ├── history.js              # Library — list, player, download, share, sync
│   ├── display-picker.html     # Display picker popup
│   ├── camera.html             # Camera bubble
│   ├── ui/
│   │   └── bar.js              # Bar controls, toggles, timer, devices
│   ├── utils/
│   │   ├── permissions.js      # Permission check/request utility
│   │   └── logger.js           # Renderer-side logging
│   └── img/                    # Icons, brand assets, animated previews
└── preload/
    └── index.js                # Context bridge (renderer ↔ main)

build/
├── afterPack.js                # electron-builder hook (codesign, plist patch)
├── entitlements.mac.plist      # macOS entitlements
└── icon.icns                   # App icon

Troubleshooting

Permissions denied

  • macOS: System Settings → Privacy & Security → enable Screen Recording / Microphone / Camera

Camera not showing

  • Toggle camera off/on in source controls
  • Check Camera permission in system settings

Reset

# Delete the app database (stored in Electron userData)
# macOS
rm ~/Library/Application\ Support/bloom/bloom.db
rm ~/Library/Application\ Support/bloom/config.json

Then run npm start


Building

# Build directory (for testing)
npm run pack

# Build DMG installers (macOS arm64 + x64)
npm run dist

License

MIT


Community & Support


VideoDB

Made with love by the VideoDB team

About

An open source, agentic Loom alternative. Record locally, make recordings AI-ready, and run workflows on top

Topics

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Packages

 
 
 

Contributors