VideoCAT VideoCAT
Open source · Self-hosted · Private

Find every video,
even when its drive is offline

Catalog your external drives, review captured frames, find likely duplicates and manage files from a private web app you host yourself. Original videos stay on your drives.

Install with Docker Requires Docker
$

Starts PostgreSQL, the API and the web app with the official images. Then open http://localhost:8081 and sign in as admin with the password the installer shows.

Download Companion
View on GitHub How it works

Server with Docker (amd64 and arm64). Companion for Windows.

Real screenshot with a fictional catalog

  • Originals stay on your drives
  • Survives drive-letter changes
  • Cross-resolution duplicates
  • Deferred, verified deletion
The problem

Hundreds of hours of video spread across drives you rarely plug in

Once your collection outgrows a single drive, finding anything becomes impossible: which drive was it on? Is it a duplicate? Did I already review it? Plugging in drive by drive does not scale, and media servers assume everything is always connected.

  • ✕ You can't remember what's on each drive without connecting it.
  • ✕ Duplicates eat up space you could reclaim.
  • ✕ There's no record of what you've already reviewed or decided to delete.
How it works

Up and running in three steps

A server you host and a Companion on your Windows PC. The server keeps the catalog; the files stay where they are.

  1. 1

    Deploy

    One command starts the web app, the API and PostgreSQL with Docker. Open http://localhost:8081 and sign in as admin.

  2. 2

    Pair

    Install the Companion on Windows, generate a code in Administration › Companions and paste it into the Companion.

  3. 3

    Scan

    Add drives or folders. The Companion reads metadata with FFmpeg, builds thumbnails and visual fingerprints, and uploads only that.

Web platform

Private catalog with login, in English and Spanish, deployed with Docker Compose behind your own domain.

  • Postgres + Fastify + Prisma
  • React + Vite served by Nginx
  • Reverse proxy, secure cookies and HTTPS
  • Official images for amd64 and arm64

Windows Companion

A tray app that detects your drives, scans them, serves remote playback and runs copies and deletes.

  • Pairs with a one-time code
  • Recognizes drives by their .videocat-disk.json
  • Serves remote playback over an outbound tunnel
  • Updates itself from GitHub Releases
Catalog and search

Your whole collection in view, even what sits in a drawer

The drive strip shows which drives are connected and how full they are. Videos on an unplugged drive stay in the catalog, marked as such, with their thumbnails and metadata.

  • Grid or list, and Ctrl K search across filename and path that ignores accents.
  • Filters by drive, extension, folder (a tree that loads on demand), tags, categories and duplicates.
  • A detail panel with a 15-frame gallery, likely duplicates and file actions.
  • “Show connected” to work only with the drives that are plugged in.
  • Drives are recognized by their .videocat-disk.json, even when Windows changes the drive letter.
Review

Decide what stays, one video at a time

A full-screen session with random pending videos, optionally only from connected drives. Every decision has its own key and can be undone.

  • Single-frame view or a gallery with all 15 thumbnails at once.
  • Assign categories while you review, with keys 1 to 9.
  • The next video is already preloaded, so there is no wait in between.
  • Pending, marked today, last 7 days and freed space, always in view.
  • On mobile, each decision gets an animated confirmation and the file name stays pinned on top.
  • FKeep
  • JMark for deletion
  • SSkip
  • ZUndo
  • GFrame or gallery
Assisted duplicates

The same video on three drives and two resolutions

Comparing file sizes will never find the copy you re-encoded years ago. VideoCAT samples visual fingerprints at 15 points in each video and combines them with metadata to suggest likely copies, even when resolution, codec or compression changed. The final decision is always yours.

  • Every group shows a confidence level, why it matched and the space you could reclaim.
  • Side-by-side assisted mode: the recommended copy comes first, picked by resolution, size and duration.
  • One key decides: 1 or ← keeps A, 2 or → keeps B, Enter applies the recommendation.
  • “Connect first” ranks drives by the space you would free by resolving them.
  • PIN-protected folders stay out of the calculation.
15
visual fingerprints per video
Downloads

What you want to watch, copied to your PC

Queue videos and the Companion copies them, one at a time, from connected drives into a local Windows folder.

  • Per-file and whole-queue progress, with speed and estimated time.
  • Safe pause: it finishes the current copy and holds the rest.
  • Random picks by a target size in GB, limited to drives or folders, without repeating what you already downloaded.
  • A stalled copy is marked as failed and the queue moves on.
  • It never overwrites a file that already exists at the destination.
Remote playback

Watch the videos on your PC’s connected drives from your phone

The Companion opens an authenticated outbound tunnel to VideoCAT. It exposes no Windows ports and mounts no drives on the server. The drive has to be connected to the PC to play.

Outbound tunnel, read-only

The connection starts from the Companion on your Windows PC. The tunnel serves playback and accepts no remote write operations.

HTTP Range, no copies

The server relays the bytes the player asks for, without revealing the local path and without storing the video.

Touch player

Full screen, double-tap to seek back or forward, jump straight to another video and shuffle that persists across connected drives.

Bounded sessions

Each session belongs to the user who created it, has duration and idle limits, and closes if the tunnel drops.

  • Before playing it checks whether the browser supports the container and codecs. For H.264 with AAC or MP3 there is an optional temporary MP4 remux (-c copy).
  • It does not transcode H.265, AV1 or other codecs: that would use a lot of CPU. What plays depends on the browser.
  • Chromecast is off by default; you turn it on in Profile and it uses signed, temporary links.

The whole web app, on your phone too

A bottom tab bar, slide-up sheets for filters and the same sections as on desktop.

Windows Companion

A tray app that does the work on your PC

The Companion is the only piece that touches your drives. It scans, uploads metadata and thumbnails, copies, deletes and serves remote playback.

  • Installs with Setup.exe, without admin rights, and updates itself from GitHub Releases.
  • Pairs with a one-time code; its credential is encrypted by Windows and can be revoked from Administration.
  • Watches marked drives and local or network folders, and rescans without redoing finished work.
  • If a file disappears it is hidden without losing tags or history, and comes back if the file does.
  • Settings in pages: Connection, Browser, Paths, Files, Advanced and Updates.

Needs FFmpeg: winget install Gyan.FFmpeg.

The Companion windows are currently in Spanish only.

Interface

Light, dark or OLED, in your color

The interface adapts to how and where you use it. Your choice is saved in your browser.

  • Light, dark, OLED or system theme.
  • Six accent colors: CAT Orange, Cobalt, Emerald, Grape, Pink and Graphite.
  • Comfortable or compact density.
  • English and Spanish, detected from your system language.
  • A collapsible sidebar, and a URL for every section to reload or share.
And also

To understand and maintain your collection

The sections you don’t use every day, but need when something doesn’t add up.

Usage map

A map of folders by size, navigable level by level, to see where the space goes.

Audit

Scan, metadata, thumbnail and delete errors, grouped, with search and CSV export.

Administration

Physical and cataloged capacity per drive, paired Companions, recent activity and cleanup.

Profile

PIN and protected folders, local Companion, optional Chromecast and appearance.

Privacy & security

Your videos stay on your drives

The server keeps metadata, relative paths and thumbnails. When you play remotely it relays the bytes the player asks for, but never stores them.

Self-hosted · No telemetry
  • The server needs no access to your drives: it only receives metadata, relative paths, validated JPEG thumbnails and audit errors.
  • Each Companion has its own credential, paired with a one-time code, encrypted by Windows and revocable. The server keeps only its hash.
  • The tunnel is outbound and serves read-only HTTP Range: it accepts no remote writes.
  • Opening, copying or deleting from the browser requires the Companion’s local token.
  • Paths are resolved canonically: no symlink or junction escapes.
  • 12-hour JWT sessions, origin validation, rate limiting, CSP and HSTS.
  • Containers run without root, with a read-only filesystem and no capabilities.
  • Sensitive folders are PIN-protected and excluded from duplicates.

How a file gets deleted

  1. 01

    You mark a video for deletion. The server stores the intent and the history; it never touches the drive.

  2. 02

    When the right drive is connected, the Companion checks the path lies inside a monitored folder.

  3. 03

    It checks size, modification time and visual fingerprint. If the file changed, it cancels and clears the mark.

  4. 04

    If everything matches, it deletes the file and reports the result, which stays in the history.

A physical deletion cannot be undone without a backup. If you would rather decide when, set “Delete marked files” to “Only on request” in the Companion.

Open Source

Yours to self-host, inspect and improve

No cloud, no subscription, no telemetry. Deploy with Docker Compose in minutes.

  • AGPL-3.0-or-later license
  • Official Docker Hub images for amd64 and arm64
  • Companion releases with SHA-256, provenance attestation and SBOM
  • CI with API and UI tests on desktop and mobile
  • Backup, verification and restore scripts
TypeScriptFastifyPrismaPostgreSQLReactViteElectronDocker
Manual install
# 1. Download the compose file and settings
mkdir videocat && cd videocat
curl -fsSLO https://raw.githubusercontent.com/reiterstahl/videocat/main/docker-compose.hub.yml
curl -fsSL https://raw.githubusercontent.com/reiterstahl/videocat/main/.env.example -o .env

# 2. Change the secrets (openssl rand -hex 32)
nano .env

# 3. Start the stack
docker compose -f docker-compose.hub.yml up -d

# 4. On Windows, FFmpeg for the Companion
winget install Gyan.FFmpeg
Current version Docker stack v0.2.4 Windows Companion v0.2.3
Docker Hub →
FAQ

Common questions

Does VideoCAT upload my videos to the server?

No. The catalog stores metadata, relative paths, thumbnails, tags and history. During remote playback the Companion streams the bytes the player asks for through the server, but the file is not stored there.

Do all my drives have to stay connected?

No. That is exactly the use case: the catalog stays searchable while a drive sits in a drawer. Playing, copying or deleting does require connecting that drive.

What if Windows changes a drive letter?

Nothing breaks. VideoCAT identifies each drive by the UUID in its .videocat-disk.json, not by the letter.

Can it find the same video at another resolution?

Yes, as a likely duplicate. It combines metadata with visual fingerprints sampled across the video and shows you the confidence and the reasons. It does not use AI, and the final decision is yours.

Can it delete files?

Yes, deferred and through the Companion. Before deleting it validates the drive, the path and the file’s identity. A confirmed physical deletion cannot be undone without a backup.

Does it work on Android?

The web app is responsive and remote playback targets modern mobile browsers. Whether a video plays depends on the browser, the container and the codecs.

Does the Companion run on macOS or Linux?

Not for now: it is Windows only. The server runs anywhere Docker does.

Does it replace Plex or Jellyfin?

Not exactly. VideoCAT focuses on cataloging collections spread across drives that are usually unplugged, reviewing frames, finding duplicates and running local actions. It is not a transcoding server.

Do I have to donate?

No. VideoCAT is free software under the AGPL. The support links are optional, and forks may remove them while respecting the license and attribution.

Support

If VideoCAT saves you drives and hours, buy me a coffee

The project is free and open source. Your support funds development time and keeps it all open.