Overview
Cap uses a Turborepo-powered monorepo with a combination of TypeScript, React, Rust, and modern web technologies.Technology Stack
- Frontend: React, Next.js, SolidJS, TailwindCSS
- Backend: Rust, Node.js
- Desktop: Tauri v2
- Database: MySQL with Drizzle ORM
- Storage: S3-compatible (MinIO for local development)
- Build System: Turborepo, pnpm workspaces
Repository Structure
Apps
apps/desktop
The desktop application built with:
- Framework: Tauri v2 (Rust)
- Frontend: SolidStart
- Purpose: Native screen recording and video capture
apps/web
The web application built with:
- Framework: Next.js 15
- Purpose: Video management, sharing, and playback
- API Routes: Built with
@effect/platformHttpApi
apps/cli
Command-line interface built with:
- Language: Rust
- CLI Framework: Clap
- Purpose: Record and export videos from the terminal
Packages
packages/database (@cap/database)
Shared database layer:
- ORM: Drizzle
- Database: MySQL
- Schema: Users, videos, comments, organizations, folders
- Scripts:
db:generate- Generate migrationsdb:push- Push schema changesdb:studio- Open Drizzle Studio
packages/ui (@cap/ui)
React component library:
- Components: Button, Card, Dialog, Dropdown, Table, Input, etc.
- Styling: TailwindCSS
- UI Framework: Radix UI
- Exports:
@cap/ui,@cap/ui/tailwind,@cap/ui/style
packages/ui-solid (@cap/ui-solid)
SolidJS component library for desktop:
- Components: Button, ProgressCircle, SwitchTab
- Styling: TailwindCSS
- UI Framework: Kobalte
- Exports:
@cap/ui-solid,@cap/ui-solid/tailwind
packages/utils (@cap/utils)
Shared utility functions and helpers
packages/web-api-contract
API contract definitions using ts-rest:
- Desktop endpoints
- Video endpoints
- Notification endpoints
- Type-safe API contracts
packages/web-backend
Backend services and business logic
packages/web-domain
Domain models and types
Crates (Rust)
Thecrates/ directory contains Rust libraries for media processing:
Core Crates
cap-recording- Screen and audio recordingcap-export- Video export functionalitycap-rendering- Video rendering pipelinecap-editor- Video editing capabilitiescap-media- Media utilitiescap-project- Project file management
Camera Crates
cap-camera- Camera abstractioncamera-avfoundation- macOS camera supportcamera-mediafoundation- Windows camera supportcamera-directshow- DirectShow camera supportcamera-windows- Windows camera utilities
Encoding Crates
enc-avfoundation- macOS hardware encodingenc-mediafoundation- Windows hardware encodingenc-ffmpeg- FFmpeg encodingenc-gif- GIF export
Screen Capture
scap-targets- Screen capture target detectioncursor-capture- Cursor overlay capturecursor-info- Cursor information
Build System
Turborepo Configuration
The monorepo uses Turborepo for efficient builds and caching:Key Scripts
Naming Conventions
File Naming
File Naming
- TypeScript/React: kebab-case (
user-menu.tsx) - Components: PascalCase (
UserMenu) - Rust modules: snake_case
- Rust crates: kebab-case
Code Style
Code Style
- TypeScript: 2-space indentation
- Formatter: Biome (not Prettier)
- Linter: Biome + ESLint
- Rust: rustfmt + Clippy workspace lints
Effect.ts Integration
Next.js API routes inapps/web/app/api/* use @effect/platform:
Auto-Generated Files
Database Workflow
Always follow this order:- Modify schema in
packages/database/schema.ts - Run
pnpm db:generateto create migrations - Run
pnpm db:pushto apply changes - Run
pnpm db:studioto view changes
License Structure
Cap uses multiple licenses:- Camera & Screen Capture Crates (
cap-camera*,scap-*): MIT License - Third-party components: Original licenses
- Everything else: AGPLv3
Next Steps
Setup
Set up your development environment
Contributing
Learn how to contribute