---
title: "Deploy Cap for Teams"
description: "Company-only sign-ups and private videos on your own Cap"
category: "Other"
url: https://railway.com/deploy/deploy-cap-for-company-teams
---

# Deploy Cap for Teams

Company-only sign-ups and private videos on your own Cap

**[Deploy Cap for Teams on Railway](https://railway.com/template/deploy-cap-for-company-teams)**

Machine-readable deploy manifest (JSON, validated by TemplateCI): https://railway.com/deploy/deploy-cap-for-company-teams/manifest.json

- **Creator:** onepush
- **Category:** Other

## Template content

### media-server

- **Image:** ghcr.io/capsoftware/cap-media-server@sha256:d47944a3744f30e0e0a36b184e24ca99b2723618580ffe97853af2b6a08abde4
- **Health check:** /health

### MySQL

- **Image:** mysql:8.0.46@sha256:7dcddc01f13bab2f15cde676d44d01f61fc9f99fe7785e86196dfc07d358ae2b
- **Start command:** `docker-entrypoint.sh mysqld --max_connections=1000 --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --performance-schema=OFF`

### cap-web

- **Image:** ghcr.io/capsoftware/cap-web@sha256:8ee4cbd3fd87f88f538831aed06c954c525db9c2426a62abeaf0ca307c5e1ce9
- **Start command:** `node -e 'const e=process.env,fs=require("fs"),d=e.WORKFLOW_LOCAL_DATA_DIR||"/app/apps/web/.workflow-data";if(process.getuid()===0){fs.mkdirSync(d,{recursive:true});fs.chownSync(d,1001,1001);process.setgroups([1001]);process.setgid(1001);process.setuid(1001);console.log("[railway] workflow data in "+d+", running as uid "+process.getuid())}try{const{S3Client:C,PutBucketCorsCommand:P}=require("/app/node_modules/.pnpm/node_modules/@aws-sdk/client-s3");new C({endpoint:e.S3_INTERNAL_ENDPOINT,region:e.CAP_AWS_REGION,forcePathStyle:e.S3_PATH_STYLE==="true",credentials:{accessKeyId:e.CAP_AWS_ACCESS_KEY||"",secretAccessKey:e.CAP_AWS_SECRET_KEY||""}}).send(new P({Bucket:e.CAP_AWS_BUCKET,CORSConfiguration:{CORSRules:[{AllowedOrigins:[e.WEB_URL],AllowedMethods:["GET","HEAD","PUT","POST"],AllowedHeaders:["*"],ExposeHeaders:["ETag"],MaxAgeSeconds:3600}]}})).then(()=>console.log("[railway] bucket CORS set for "+e.WEB_URL),x=>console.error("[railway] bucket CORS not set: "+x.name+" "+x.message))}catch(x){console.error("[railway] bucket CORS skipped: "+x.message)}e.HOSTNAME="::";require("/app/apps/web/server.js")'`
- **Health check:** /api/status
- **Public domain:** Yes

## Buckets

- **Bucket**

## Documentation

# Deploy and Host self hosted Cap for Teams (Open-Source Team Screen Recording) on Railway

This template deploys self hosted Cap, the open-source screen recorder, set up for a whole company.

## About Hosting Cap for Teams open-source software on Railway (self hosted Cap for company teams template)

Cap for Teams is the open-source Cap screen recorder on your own Railway project, so recordings and account data stay in infrastructure you control.

Recordings never sit on a public bucket, since Cap hands out short-lived presigned URLs.

## Why Deploy Cap for Teams, the Loom Business alternative on Railway (Railway Free Trial)

Loom Business charges per seat, so every colleague who records a walkthrough adds to the bill.

Railway is a singular platform to deploy your infrastructure stack. Railway will host your infrastructure so you don't have to deal with configuration, while allowing you to vertically and horizontally scale it.

By deploying Cap for Teams on Railway, you are one step closer to supporting a complete full-stack application with minimal burden. Host your servers, databases, AI agents, and more on Railway.

### Railway vs Other Hosting Providers and VPS for Cap for Teams self hosting

Railway runs the whole Cap stack for you, while a VPS leaves the setup to you.

| Provider | What You Get with Railway | What You Get with the Other Provider |
| --- | --- | --- |
| DigitalOcean | Four linked services, with secrets generated per deploy. | Full root access and a fixed price, but Docker, the bucket and TLS are yours to set up. |
| AWS | A running stack with no VPC or IAM work. | Fine-grained control, but more setup and a harder-to-predict bill. |
| Hetzner | Managed deploys and a bucket for recordings, with nothing to patch. | Very low cost, but you own backups and bucket CORS. |

Both routes run the same Cap code, so the choice is how much server work your team wants to own.

## Common Use Cases for hosted Cap for Teams

- **Async standups and walkthroughs:** Engineers record a short screen walkthrough instead of joining a meeting. Leave CAP_VIDEOS_DEFAULT_PUBLIC=false on cap-web so new recordings stay private to the team.
- **Bug reports with screen recordings:** QA and support attach a recording of the exact steps that broke, which is much easier for developers to reproduce than a written description.
- **Onboarding videos kept private to staff:** HR and team leads record internal how-tos for new hires. Set CAP_ALLOWED_SIGNUP_DOMAINS so only company addresses can create accounts.
- **Sales demos shared by link:** Account executives record product demos and send one link to a prospect. Share only the clips you choose instead of opening the whole library.
- **Replacing per-seat Loom licences:** One self-hosted Cap instance can serve the whole team, so the server cost stays flat no matter how many people record. Recordings stay on infrastructure you control.

## Dependencies for Cap for Teams Docker hosted on Railway

This template runs four parts on one Railway project: cap-web, media-server, MySQL and a Railway Bucket.

### Deployment Dependencies for Managed Cap for Teams Service (Screen Recording)

- **cap-web:** the official ghcr.io/capsoftware/cap-web image, pinned by digest, on port 3000 with health check /api/status.
- **media-server:** the official ghcr.io/capsoftware/cap-media-server image, pinned by digest, on private port 3456.
- **MySQL:** version 8.0.46, pinned by digest, on private port 3306 with its volume at /var/lib/mysql.
- **Railway Bucket:** private S3-compatible storage for recordings and thumbnails.

### Implementation Details for Cap for Teams (Using Cap official docker image)

cap-web runs migrations on first boot and keeps a volume at /app/apps/web/.workflow-data so recording jobs survive redeploys.

```
CAP_ALLOWED_SIGNUP_DOMAINS=yourcompany.com
CAP_VIDEOS_DEFAULT_PUBLIC=false
RESEND_API_KEY=your-resend-key
RESEND_FROM_DOMAIN=yourcompany.com
```

Never change DATABASE_ENCRYPTION_KEY after the first deploy.

## How does Cap for Teams compare against other team screen recording tools

### Cap vs Loom Business (Loom Business Alternative)

- **Hosting:** Cap runs on your own Railway project, so recordings sit in your Railway bucket and not on Loom's servers. Loom is fully managed, which means no database to back up and no upgrades to run.
- **Seats:** Self-hosted Cap has no per-user subscription, so cost stays flat as the team grows. Loom bills per seat.
- **Polish:** Loom wins on out-of-the-box polish, integrations and mobile apps. Expect to spend a little more time on setup with Cap.

### Cap vs Vidyard (Vidyard Alternative)

- **Focus:** Vidyard is built for sales and marketing video, with viewer analytics and CRM hooks. Cap is built for internal team messages and walkthroughs.
- **Control:** Cap keeps viewer data and video files on infrastructure you control, with sign-ups locked to your domain through CAP_ALLOWED_SIGNUP_DOMAINS.
- **Analytics:** Vidyard wins on engagement tracking and sales tooling. Cap does not try to match that.

### Cap vs Microsoft Stream (Microsoft Stream Alternative)

- **Ecosystem:** Stream is tied into Microsoft 365 and works well if your company already lives in SharePoint and Teams. Cap works independently of any suite.
- **Recording:** Cap Desktop records your screen and camera directly and uploads to your server, which is quicker for a quick async update than uploading to a corporate library.
- **Admin:** Stream inherits Microsoft's admin model. Cap uses a simple sign-up domain allow list and private-by-default recordings, which is easier to explain to a small team.

### Cap vs Zoom Clips (Zoom Clips Alternative)

- **Location:** Clips lives inside Zoom, so it makes sense if your meetings already happen there. Cap works without any meeting tool at all.
- **Storage:** Clips stores recordings in Zoom's cloud. Cap stores them in your own bucket, which you can size and back up yourself.
- **Scope:** Zoom wins for recording live meetings with other people in the call. Cap is better for recording a solo screen walkthrough and sharing it by link.

## How to use Cap for Teams (the OSS screen recorder)?

1. Deploy the template and wait for cap-web to go healthy. Enter your email on the login page, click Login with email, then open cap-web Deployments, View logs and copy the 6-digit code (valid 10 minutes).
2. On cap-web, add the sign-up lock and privacy default, then redeploy:

```
CAP_ALLOWED_SIGNUP_DOMAINS=yourcompany.com
CAP_VIDEOS_DEFAULT_PUBLIC=false
```

3. Set RESEND_API_KEY and RESEND_FROM_DOMAIN on cap-web and redeploy so teammates get login codes by email.
4. In Resend, verify your sending domain. Login emails come from auth@ your domain, so the DNS records must be live first.
5. Invite teammates. Anyone outside the domain is turned away.
6. Each teammate sets Cap Server URL to https://your-domain in Cap Desktop Settings and signs in.
7. Record a test clip and confirm it's private before relying on the setup.

## How to self host Cap for Teams on other VPS Services (Cap self hosting guide)

Running the Cap for Teams stack on your own VPS works, but you own the parts Railway normally handles.

### Clone the Repository

Clone the upstream project and move into it:

```bash
git clone https://github.com/CapSoftware/Cap.git
cd Cap
```

### Install Dependencies

Install Docker and the Compose plugin, then confirm both work.

```bash
docker --version
docker compose version
```

### Configure Environment Variables

Set the public URL and secrets before the first start. Upstream compose ships publicly known default secrets, so replace them.

```bash
WEB_URL=https://your-domain
NEXTAUTH_SECRET=replace-with-64-hex
DATABASE_ENCRYPTION_KEY=replace-with-64-hex
CAP_ALLOWED_SIGNUP_DOMAINS=your-company.com
CAP_VIDEOS_DEFAULT_PUBLIC=false
```

Never change DATABASE_ENCRYPTION_KEY after first boot, or existing data becomes unreadable.

### Start the Cap for Teams Application

Bring the stack up and check that cap-web answers on /api/status:

```bash
docker compose up -d
curl -s https://your-domain/api/status
```

Put a TLS reverse proxy in front of cap-web, since Cap Desktop needs HTTPS. Railway handles all of this for you.

## Official Pricing of Cap for Teams (Cap pricing)

Cap is free and open source under AGPL-3.0, so there is no licence fee to pay for self hosting it on Railway.

## Cap for Teams cloud vs self hosted comparison (Pricing, features, costs, and more)

Cap's cloud and a self-hosted Cap give your team the same recorder and sharing features, so the choice comes down to who runs the server and what you pay.

### Monthly cost of self hosting Cap for Teams on Railway

Railway bills by resource use, so a small team running about 850 MB of RAM at idle should expect roughly $10-20 a month, plus Railway Bucket storage.

### System Requirements for Hosting Cap for Teams on a VPS

Plan for about 850 MB of RAM at idle across cap-web, MySQL and media-server, with cap-web using around 490 MB, MySQL around 220 MB and media-server around 130 MB.

## Frequently Asked Questions (FAQs)

### How do I stop people outside my company from signing up?

Set CAP_ALLOWED_SIGNUP_DOMAINS on cap-web to your company domain, such as yourcompany.com, and redeploy.

### Are new recordings private by default?

Not unless you set CAP_VIDEOS_DEFAULT_PUBLIC=false on cap-web.

### How do teammates get login codes without Resend?

The 6-digit code is printed in the cap-web deploy logs and is valid for 10 minutes.

### Can we use Google sign-in?

Yes, set GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET on cap-web and redeploy.

### What will storage cost us?

Recordings live in the Railway bucket, which is billed per GB-month with free egress, so cost grows with how much your team records.

### Can I delete a user who left the company?

Yes, an admin can remove the account from the dashboard, but their videos may stay in the bucket.


## Similar templates

- [Rocky Linux](https://railway.com/deploy/rocky-linux) — Hosted Rocky Linux 9 workspace with SSH and persistent storage. 🚀
- [Foundry Virtual Tabletop](https://railway.com/deploy/X5tR6G) — A Self-Hosted & Modern Roleplaying Platform
- [Letta Code Remote](https://railway.com/deploy/letta-code-remote) — Run a Letta Code agent 24/7. No inbound ports, just deploy.

Open this page in a browser: https://railway.com/deploy/deploy-cap-for-company-teams
