What most people use Vimeo for is upload, convert, play: ffmpeg turns a file into an adaptive HLS stream, hls.js plays it, and a page or iframe embed shows it behind an unlisted link or a password. An agent builds that in an afternoon. Putting it in front of other people is the weekend: a server with HTTPS, storage that keeps growing, and a CDN so playback starts quickly far from your server. Live events, frame-accurate client review and Vimeo's audience stay out of reach.
Before you buildVimeo Free shows no ads, but its 1 GB never resets; it suits a couple of short clips, not a portfolio.
Build me a self-hosted video library to replace Vimeo for sharing my own videos. Requirements: - Node.js 22 + TypeScript with Fastify; ffmpeg must be installed. `npm start` serves the admin UI and the player on http://localhost:5200. - Resumable uploads with @tus/server, files up to 10 GB, into ./data/uploads/. - A job queue (one job at a time, state in better-sqlite3 at ./data/videos.db) runs ffmpeg: HLS at 1080p, 720p and 480p (never upscale), 6-second segments, a poster frame and a thumbnail strip, written to ./data/media/<id>/. - Player page /v/:id with hls.js: captions and chapters from VTT files I upload, speed control, keyboard shortcuts. /embed/:id is the bare player, with a copy-embed-code button in the admin. - Privacy per video: public, unlisted (random 12-character id) or password (bcrypt, signed cookie). Limit embedding to listed domains with the CSP frame-ancestors header. - Stats per video: plays, unique viewers per day (hashed IP with a daily salt) and average percent watched from player beacons. No third-party scripts. - Storage from .env: local disk, or an S3-compatible bucket (Cloudflare R2, Backblaze B2) via @aws-sdk/client-s3. Public and unlisted videos stream from the bucket; password-protected ones are proxied through the server. - One admin behind ADMIN_PASSWORD in .env. No viewer accounts, no telemetry. - Out of scope: live streaming, review comments, team seats. - README: installing ffmpeg, how much disk the renditions take next to the source, Cloudflare in front of /media, and running on a VPS behind Caddy.
Opens your agent with the prompt filled in, you press enter. Or copy it and paste it into an empty folder.
The first prompt builds the core. Run these one at a time in the same folder to grow it into your own Vimeo.
Add a Vimeo importer to the video library in this folder. Requirements: - Read a Vimeo personal access token from .env (scopes: private, video_files) and page through /me/videos. - For each video, download the original or the largest file the API offers, with title, description, privacy setting and upload date. - Feed each file into the existing upload and transcode queue and map Vimeo's privacy to public, unlisted or password. - Resume where it stopped after a crash; skip videos already imported. - Write a CSV mapping old Vimeo URLs to new /v/:id links. - Update the README with how to create the token.
Add review links to the video library in this folder. Requirements: - From the admin, create a review link for a video with an optional password and expiry date. - Viewers enter a name, then leave comments pinned to the current timestamp; markers appear on the player's timeline. - I can reply, resolve comments and export them as a CSV with timecodes. - No viewer accounts; rate-limit comments per link. - Update the README.
Add automatic captions to the video library in this folder. Requirements: - After transcoding, extract the audio with ffmpeg and transcribe it locally with whisper.cpp (model name in .env, default small). - Save the result as a WebVTT track, editable in the admin before publishing. - Skip videos that already have a caption file I uploaded. - Run captioning as a separate low-priority job so it never blocks transcodes. - Update the README with the whisper.cpp install and model download.
Filmmakers and agencies want a clean player with no ads or suggested videos next to client work, and private review links that clients already know how to open. Companies on the higher plans add live events and marketing features.
Estimate · A small VPS runs about $5 a month. R2 bills per GB stored with free egress, so a few hundred GB of video stays in single-digit dollars. The build is token usage on your agent plan.
| Plan | Monthly | Annual, per month | What you get |
|---|---|---|---|
| Free | $0/user | $0/user | 1 GB of storage for the lifetime of the account (accounts created since 17 June 2024). |
| Starter | $20 | $12 | 1 user, 2 TB storage, customizable player, password and unlisted links, review tools, engagement analytics. |
| Standard | $41 | $25 | 5 users, 4 TB storage; adds branding in the player, lead capture, calls to action, branded galleries and custom watermarks. |
| Advanced | $125 | $75 | 10 users, 7 TB storage; adds live events with Q&A and polls, multistreaming and scheduled simulive. |
| Enterprise | custom | — | More users, storage and bandwidth, SSO and SCIM, eCDN, dedicated support. |
Free has no ads but stops at 1 GB of uploads for the life of the account.
Kinda. The core is a weekend build with the prompt on this page, but real gaps remain: CDN delivery that starts fast for viewers anywhere, Live streaming, webinars and simulive events.
About $20 a month on the Starter plan, $240 a year (checked 2026-10-13).
CDN delivery that starts fast for viewers anywhere; Live streaming, webinars and simulive events; Time-coded review comments and approvals with clients; AI captions and translation, lead capture and calls to action in the player; Discovery through Vimeo's community and Staff Picks. If any of those matter to you, keep paying.
Yes: PeerTube (open source), MediaCMS (open source), Owncast (open source).