Cap Documentation

Open source Loom alternative. Beautiful, shareable screen recordings.

20,689 stars TypeScript TypeScript 1 file ยท ~4,487 tokens #app#cap#coss#loom#mac#nextjs#nextjs15#open-source
RAW Doc

Docker & Self-Hosted Deployment Verified OCI

Deploy Cap on any server, homelab, or cloud container platform.

1-Click Terminal Command
bash (docker run)
docker run -d --name cap --restart always ghcr.io/capsoftware/cap-web:latest
Configured Services & Ports
โš™๏ธ cap-web
image: ghcr.io/capsoftware/cap-web:latest
โš™๏ธ media-server
image: ghcr.io/capsoftware/cap-media-server:latest
โš™๏ธ mysql
image: mysql:8.0
โš™๏ธ minio
image: pgsty/minio:RELEASE.2026-08-04T00-00-00Z@sha256:b6bfe7239bfc83fb90d31612d9704d86039dd714f7904b3f1ad68f211e602372
โš™๏ธ minio-setup
image: pgsty/mc:RELEASE.2026-09-16T00-00-00Z@sha256:cfc83108c3abb371f8fb84d99c1fdc88f8c237e022409b0081fb7c0a3be634dd
docker-compose.yml
yaml (docker-compose.yml)
name: cap
services:
  cap-web:
    image: 'ghcr.io/capsoftware/cap-web:latest'
    restart: unless-stopped
    depends_on:
      mysql:
        condition: service_healthy
      minio:
        condition: service_healthy
    environment:
      SERVICE_URL_CAP_WEB_3000: ''
      DATABASE_URL: 'mysql://cap:${SERVICE_PASSWORD_MYSQL}@mysql:3306/cap'
      WEB_URL: '${SERVICE_URL_CAP_WEB}'
      NEXTAUTH_URL: '${SERVICE_URL_CAP_WEB}'
      DATABASE_ENCRYPTION_KEY: '${SERVICE_HEX_32_DATABASEENCRYPTIONKEY}'
      NEXTAUTH_SECRET: '${SERVICE_HEX_32_NEXTAUTHSECRET}'
      CAP_AWS_ACCESS_KEY: capadmin
      CAP_AWS_SECRET_KEY: '${SERVICE_PASSWORD_MINIO}'
      CAP_AWS_BUCKET: cap
      CAP_AWS_REGION: us-east-1
      S3_PUBLIC_ENDPOINT: '${SERVICE_URL_MINIO}'
      S3_INTERNAL_ENDPOINT: 'http://minio:9000'
      S3_PATH_STYLE: 'true'
      RESEND_API_KEY: '${RESEND_API_KEY:-}'
      RESEND_FROM_DOMAIN: '${RESEND_FROM_DOMAIN:-}'
      GOOGLE_CLIENT_ID: '${GOOGLE_CLIENT_ID:-}'
      GOOGLE_CLIENT_SECRET: '${GOOGLE_CLIENT_SECRET:-}'
      APPLE_CLIENT_ID: '${APPLE_CLIENT_ID:-}'
      APPLE_CLIENT_SECRET: '${APPLE_CLIENT_SECRET:-}'
      MEDIA_SERVER_URL: 'http://media-server:3456'
      MEDIA_SERVER_WEBHOOK_SECRET: '${SERVICE_HEX_32_MEDIASERVER}'
      MEDIA_SERVER_WEBHOOK_URL: 'http://cap-web:3000'
    healthcheck:
      test:
        - CMD
        - wget
        - '-q'
        - '-O'
        - /dev/null
        - 'http://127.0.0.1:3000/'
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 60s
  media-server:
    image: 'ghcr.io/capsoftware/cap-media-server:latest'
    restart: unless-stopped
    environment:
      PORT: 3456
      MEDIA_SERVER_WEBHOOK_SECRET: '${SERVICE_HEX_32_MEDIASERVER}'
    healthcheck:
      test:
        - CMD
        - bun
        - '-e'
        - "fetch('http://127.0.0.1:3456/health').then((response) => process.exit(response.ok ? 0 : 1)).catch(() => process.exit(1))"
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 10s
  mysql:
    image: 'mysql:8.0'
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: cap
      MYSQL_USER: cap
      MYSQL_PASSWORD: '${SERVICE_PASSWORD_MYSQL}'
      MYSQL_ROOT_PASSWORD: '${SERVICE_PASSWORD_64_MYSQL}'
    command:
      - '--max_connections=1000'
      - '--character-set-server=utf8mb4'
      - '--collation-server=utf8mb4_unicode_ci'
    volumes:
      - 'cap-mysql-data:/var/lib/mysql'
    healthcheck:
      test:
        - CMD
        - mysqladmin
        - ping
        - '-h'
        - localhost
        - '-u'
        - cap
        - '-p${SERVICE_PASSWORD_MYSQL}'
      interval: 10s
      timeout: 5s
      retries: 10
      start_period: 30s
  minio:
    image: 'pgsty/minio:RELEASE.2026-08-04T00-00-00Z@sha256:b6bfe7239bfc83fb90d31612d9704d86039dd714f7904b3f1ad68f211e602372'
    restart: unless-stopped
    command: 'server /data --console-address ":9001"'
    environment:
      MINIO_ROOT_USER: capadmin
      MINIO_ROOT_PASSWORD: '${SERVICE_PASSWORD_MINIO}'
      SERVICE_URL_MINIO_9000: ''
    volumes:
      - 'cap-minio-data:/data'
    healthcheck:
      test:
        - CMD
        - mc
        - ready
        - local
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 10s
  minio-setup:
    container_name: cap-minio-setup
    image: 'pgsty/mc:RELEASE.2026-09-16T00-00-00Z@sha256:cfc83108c3abb371f8fb84d99c1fdc88f8c237e022409b0081fb7c0a3be634dd'
    exclude_from_hc: true
    depends_on:
      minio:
        condition: service_healthy
    entrypoint: "/bin/sh -c \" mc alias set capminio http://minio:9000 capadmin $${SERVICE_PASSWORD_MINIO}; mc mb capminio/cap --ignore-existing; exit 0; \"\n"
    environment:
      MINIO_ROOT_USER: capadmin
      MINIO_ROOT_PASSWORD: '${SERVICE_PASSWORD_MINIO}'
      S3_BUCKET: cap
volumes:
  cap-mysql-data: null
  cap-minio-data: null

Cap

Cap is the open source alternative to Loom. It gives you fast screen recording, polished local editing, instant share links, comments, transcripts, analytics, team workspaces, custom domains, custom S3 storage, and full self-hosting when you need complete control.

Use Cap for product demos, bug reports, onboarding, tutorials, design reviews, engineering walkthroughs, async standups, client updates, and any moment where showing the work is faster than scheduling another call.

Why Cap

  • Record, edit, share. Capture your screen, camera, and microphone, then share a link or export a finished video.
  • Instant Mode for speed. Upload while recording and get a shareable link the moment you stop.
  • Studio Mode for polish. Record locally, edit with backgrounds, zooms, trimming, captions, and export controls.
  • Desktop apps for your team. Cap runs on macOS and Windows, with a web dashboard for viewing, sharing, and managing recordings.
  • Own your storage. Use Cap Cloud, connect your own S3-compatible bucket, keep recordings local, or self-host the full platform.
  • Privacy by default. Share publicly or privately, add passwords, use your own domain, or keep sensitive recordings off hosted infrastructure.
  • Async collaboration. Comments, reactions, transcripts, viewer analytics, and team workspaces keep feedback attached to the video.
  • Cap AI. Generate titles, summaries, clickable chapters, captions, and transcripts automatically.
  • Move from Loom. Import existing Loom videos into Cap and keep your library in one place.

Recording Modes

Mode Best for How it works
Instant Mode Fast feedback, bug reports, async updates Cap uploads while you record, then gives you a share link as soon as recording stops.
Studio Mode Product demos, tutorials, launches, client work Cap records locally, opens the editor, and lets you export or share a polished video.

Data Ownership

Cap is designed for people and teams who do not want their recording workflow locked inside a black box.

  • Use Cap Cloud for the fastest hosted experience.
  • Connect AWS S3, Cloudflare R2, Backblaze B2, MinIO, Wasabi, or another S3-compatible provider.
  • Serve share pages from your own domain.
  • Self-host Cap Web, the API, database, media server, and object storage with Docker Compose.
  • Point Cap Desktop at your self-hosted instance from Settings > Cap Server URL.

Get Started

For most users, the fastest path is:

  1. Download Cap for macOS or Windows from cap.so/download.
  2. Sign in or create an account.
  3. Choose Instant Mode or Studio Mode.
  4. Record your first Cap.
  5. Share the link, export the file, or keep it local.

The full product docs live at cap.so/docs.

Self-Hosting

The fastest way to self-host Cap Web is Docker Compose:

bash
git clone https://github.com/CapSoftware/Cap.git
cd Cap
docker compose up -d

Cap will be available at http://localhost:3000.

Login links appear in the service logs when email is not configured:

bash
docker compose logs cap-web

Deployment Options

Method Best for
Docker Compose VPS, home servers, and any Docker-capable host
Railway One-click managed hosting
Coolify Self-hosted PaaS deployments with docker-compose.coolify.yml

For production, configure public URLs and replace the default secrets before exposing the deployment to the internet:

bash
CAP_URL=https://cap.yourdomain.com
S3_PUBLIC_URL=https://s3.yourdomain.com

See the self-hosting guide for email setup, AI providers, SSL, storage, production hardening, and troubleshooting.

Local Development

Cap is a Turborepo monorepo with Rust, TypeScript, Tauri, SolidStart, Next.js, Drizzle, MySQL, Tailwind CSS, and shared media crates.

Requirements:

  • Node.js 20 or newer
  • pnpm 10.5.2
  • Rust 1.88 or newer
  • Docker for MySQL, MinIO, and local services
  • Optional on macOS: Cinder for faster local check / build / test / run and desktop watch. pnpm dev:desktop uses it automatically when cinder is on PATH. Install with pnpm cinder:install. Set CAP_USE_CINDER=0 to force stock Cargo.

Install and set up the repo:

bash
pnpm install
pnpm env-setup
pnpm cap-setup

Common commands:

Command Purpose
pnpm dev Start the full local development stack
pnpm dev:web Start the web app without the desktop app
pnpm dev:desktop Start the desktop app
pnpm build Build the workspace
pnpm tauri:build Build the desktop release
pnpm lint Run Biome linting
pnpm format Format with Biome
pnpm typecheck Run TypeScript project references
cargo test -p <crate> Run Rust tests for a crate
pnpm cinder:install Install Cinder for faster local macOS Rust commands

Database commands:

Command Purpose
pnpm db:generate Generate database artifacts
pnpm db:push Push schema changes
pnpm db:studio Open Drizzle Studio

Repository Map

Path What lives there
apps/desktop Tauri v2 desktop app with SolidStart UI and Rust backend
apps/web Next.js web app for marketing, docs, dashboard, sharing, API routes, and auth
apps/cli Rust CLI
apps/media-server Media processing service used by the web app
apps/discord-bot Discord integration
packages/database Drizzle schema and database access
packages/ui Shared React UI
packages/ui-solid Shared Solid UI
packages/web-backend Backend service layer
packages/web-domain Web domain models and types
packages/env Environment validation
packages/sdk-embed Embed SDK
packages/sdk-recorder Recorder SDK
crates/* Recording, capture, camera, audio, encoding, rendering, muxing, export, and test crates
scripts/* Setup, analytics, build, and maintenance tooling
infra/* Infrastructure configuration

The web API uses Effect and @effect/platform HTTP APIs. Desktop capture and export paths are backed by Rust crates for fast recording, rendering, and platform-specific media access.

Analytics

Cap uses Tinybird for viewer telemetry dashboards. Set TINYBIRD_ADMIN_TOKEN or TINYBIRD_TOKEN before running analytics commands.

Command Purpose
pnpm analytics:setup Deploy Tinybird datasources and pipes from scripts/analytics/tinybird
pnpm analytics:check Validate that the Tinybird workspace matches the app expectations

analytics:setup can remove Tinybird resources outside the checked-in analytics configuration. Use it only against the workspace you intend to manage from this repo.

Contributing

Cap is built in public. Issues, pull requests, design feedback, bug reports, docs fixes, and bounties are welcome.

License

Portions of this software are licensed as follows:

  • Code in the cap-camera* and scap-* crate families is licensed under the MIT License. See licenses/LICENSE-MIT.
  • Third-party components are licensed under the original license provided by their owner.
  • All other content not mentioned above is available under the AGPLv3 license as defined in LICENSE.