Plembfin
Public demo: actions are simulated in this browser only. Nothing is saved and no media or metadata services are connected.
Plembfin

Admin access

Unlock your archive

Sign in with your admin username and password to browse your library, import Trakt history, and review webhook appends.

Forgot your password?

Plembfin keeps administrator login local to this instance, so it does not send email reset links.

If you can sign in, change the password in Settings → General → Account with your current password.

If you are locked out, stop Plembfin, set a new ADMIN_PASSWORD in the host or container environment, and restart it. If the password was previously changed in Plembfin, remove only the authManagedInApp property from data/config.json first so the environment value can be used.

The old password cannot be recovered from the stored hash.

Administrator account

This account controls the local Plembfin instance and is created only once.

Required

At least 8 characters. Store this password somewhere safe - it controls the entire instance.

Dashboard

Overview
Controls

Dashboard

Now Playing

Up Next

TV Shows - Recently watched

Movies - Recently watched

Most Played

All time - by plays

Playback Platforms

by watch events

Watch Activity

Monthly archive volume
Sync - Idle
No activity

One row per movie or show. Resume checkpoints and every target result remain available inside the row.

Showing 0-0 of 0
Page 1 of 1
Demo settings are read-only. You can browse the configuration, but changes, connections, syncs, backups, and restores are disabled.

Account

Local username and password session

Saving changes signs out other dashboard sessions.

Account Guide

Portal Security
Login Security

Manages credentials for the admin portal. Saving a new password invalidates existing session cookies across all active browsers.

System Integrity

Diagnostic health checks and database state inspection
Refresh Sync Health Loads a fast snapshot of database row counts, disk storage usage, and outbound media server request pressure.
Run System Diagnostic Runs nine live diagnostic checks in sequence and provides actionable fix recommendations for any warnings or errors.

Integrity Help

Database Care
Run System Diagnostic

Runs nine live checks. Each one is marked Online, Warnings Detected, Failed, or Not Configured.

Anything unhealthy gets a fix tip and a link to the right settings page.

  • Watch History API - checks the local database responds.
  • Server Configuration - checks saved settings can be read back.
  • Webhook Listener Endpoint - pings the webhook URL and shows the last event received.
  • Scheduled Cron Job - checks the background worker ran recently.
  • Outbound Playstate Sync - checks the 5 most recent watches synced without errors.
  • Plex / Emby / Jellyfin Media Server - tests the connection to each configured server.
  • Plex Realtime Notifications - checks the live Plex connection works (falls back to periodic polling if not).
  • Cross-Platform Library Matching - lists current "no matching item found" failures per platform.
Refresh Sync Health

A quicker, lighter check than the full diagnostic.

Shows row counts, database size, and how hard Plembfin is hitting each media server.

Useful before running a large Force Sync, to spot rate-limiting or an oversized database first.

Image Cache

Locally stored artwork from Plex, TMDB, and other sources

About the Cache

Local Asset Storage
Posters & Backdrops

Local cover art thumbnails and wide hero banners fetched from Plex, TMDB, and TVDB.

Cast Profiles

Cached headshot portraits for cast and crew members on movie and show details pages.

Cache Maintenance

Clearing the cache removes local image files from disk. Images are re-fetched automatically on demand as you browse.

Plex

Sync watch history with a Plex server

Plex Setup

Watchstate Sync Engine
Connected Server

Plembfin connects to your Plex server to read watched status, match media correctly, and push plays to your other connected servers.

Credentials & Tokens

The server URL and token are kept on the server and never shown in the browser.

Connection Testing

Use Test before saving to check the server is reachable, the token works, and your account is found.

Emby

Sync watch history with an Emby server

Emby Setup

Watchstate Sync Engine
Connected Server

Plembfin connects to your Emby server to read watched status, match media correctly, and push plays to your other connected servers.

Credentials & Tokens

The server URL and API key are kept on the server and never shown in the browser.

Connection Testing

Use Test before saving to check the server is reachable, the key works, and your account is found.

Jellyfin

Sync watch history with a Jellyfin server

Jellyfin Setup

Watchstate Sync Engine
Connected Server

Plembfin connects to your Jellyfin server to read watched status, match media correctly, and push plays to your other connected servers.

Credentials & Tokens

The server URL and API key are kept on the server and never shown in the browser.

Connection Testing

Use Test before saving to check the server is reachable, the key works, and your account is found.

Webhooks

Platform setup guides

Platform Setup

Per-Server Instructions
Plex

No setup required. Plembfin connects to Plex's WebSocket notification channel automatically to capture watched and unwatched changes in real time.

Emby & Jellyfin

Expand the setup dropdowns on the left to view provider-specific instructions for registering the webhook URL and choosing which events to send.

Webhook Secret

Secret token used by Plex, Emby, and Jellyfin webhooks
Secret token: Not available

Each platform's setup guide above includes the full webhook URL with this secret already in it.

Automation clients can also pass the secret in an X-Plembfin-Webhook-Secret or Authorization: Bearer header.

Webhooks Guide

Real-Time Sync Engine
Webhook Listener URL

Receives instant play, pause, stop, scrobble, and watched events pushed by Plex, Emby, and Jellyfin as media plays. Updates live session tracking instantly.

Secret Token & Rotation

Authenticates incoming webhooks via ?token= or X-Plembfin-Webhook-Secret header. Rotate anytime to invalidate old endpoints without affecting admin login.

Background Scheduler

Executes every minute to evaluate active playback progress against your watched threshold (90%), write completed watches to history, and dispatch cross-platform sync.

Metadata Providers

TMDB is required for artwork and detail pages; the other providers are optional enhancements

Metadata Setup

Artwork & Enrichment
TMDB (Required)

Powers core movie and TV metadata, posters, backdrops, cast bios, trailers, and release dates across Plembfin.

TheTVDB (Optional)

Enriches TV series with episode guides, season ordering, and high-resolution series artwork.

Fanart.tv & OMDB (Optional)

Fanart.tv supplies clearart, logos, and disc art. OMDB provides IMDb ratings and Rotten Tomatoes score comparisons.

Refresh Metadata

Pre-cache metadata from TMDB and TVDB
Refresh All TMDB Metadata Idle
Pre-cache trailers, posters, cast, and summaries locally
Refresh log will appear here.
Refresh All TVDB Metadata Idle
Fetch episode schedules, series details, and artwork from TVDB
Refresh log will appear here.

Refresh Metadata Help

Cache Enrichment
Refresh All TMDB Metadata

Scans local history items and fetches missing trailers, posters, overview descriptions, and cast info from TMDB to keep local metadata cache up to date.

Refresh All TVDB Metadata

Scans local TV shows in your library, resolves TVDB series IDs, and pre-caches extended series metadata, season episode lists, and artwork from TVDB.

Trakt

Bulk import watch history from Trakt.tv CSV or JSON exports
Live Trakt Connection Checking
Keep watched and unwatched state synchronized in both directions
Disable Existing Trakt Plugins

Disable Trakt plugins/tasks in Plex, Emby, and Jellyfin first - Plembfin must be the sole Trakt bridge.

Checking the Plembfin Trakt app…

Reading the complete Trakt watched snapshot… This can take a little while for a large history.
Manual Connection
Advanced fallback using personal Trakt API credentials
Trakt History Importer Idle
Bulk import records from a Trakt.tv export
0%
[idle] Waiting for files.

Trakt Help

Trakt Connection
Live Trakt Connection

Keeps Trakt and Plembfin in sync automatically, both ways.

New watches, rewatches, and unwatches all sync across Plex, Emby, Jellyfin, and Trakt.

Sync Now also double-checks older Trakt watches and fixes anything that drifted out of sync.

First Connection Mode

Start from current state - the safe default. Records where things stand now, without changing anything on your other servers.

Import all existing Trakt watched state - pulls in your full Trakt history and queues it to sync everywhere.

Manual Connection

Use custom Trakt API client credentials if you prefer a personal VIP developer application instead of Plembfin's built-in device application.

Trakt History Importer

Bulk import watch history from Trakt.tv CSV or JSON exports into your local Plembfin database without making outbound API calls.

Single Bridge Rule

Let Plembfin be the sole Trakt bridge. Disable the Emby or Jellyfin Trakt plugins and their scheduled tasks so secondary writers do not overwrite recent state or introduce loops.

Seerr

Optional request integration for movie and TV detail pages

Seerr Setup

Request Integration
Overseerr / Jellyseerr

Connects your Seerr instance to display live request status pills and "Request on Seerr" action buttons directly on movie and TV show detail pages.

API Integration

Requires your Seerr base URL and an API key from Overseerr/Jellyseerr Settings ➔ General. Enables one-click requesting without leaving Plembfin.

Guided setup

Reopen the first-run setup wizard
Reopen Onboarding

Setup Guide Help

Onboarding
Reopen Onboarding

Reopens the same step-by-step wizard shown on first run.

It's safe to run again - nothing already set up gets changed or reset. Each step just shows your current connections.

Use it to revisit a single step later, like adding a second media server or connecting Trakt.

Database Repairs

Repair rows, clean duplicates, and audit phantom watches
Repair History Rows Idle
Fill in missing media types and backfill missing posters on recent history rows
Repair log will appear here.
Audit Phantom Watches Idle
Finds suspicious duplicates and malformed imported episode rows
Audit results will appear here.
Remove Duplicate Watches Idle
Keeps only the oldest watch date for each movie or episode across the whole library
Results will appear here.
Restore Missing Episode Names Idle
Backfill real episode names onto watch rows that only stored a coordinate like “8”
Results will appear here.

Database Repairs Help

Database Care
Repair History Rows

Checks your 300 most recent history rows for a missing media type or poster.

If the type is missing, it's guessed from the title (like S01E01 for an episode). A poster is then found from the cache, your media server, or TMDB.

Works in small batches of 10 rows, and stops on its own once a batch finds nothing left to fix.

Audit Phantom Watches

Read-only scan for suspicious duplicate watches or broken imported episode data.

Each result is marked high-confidence or review-only. Nothing is changed or deleted - it's just a report.

Remove Duplicate Watches

Finds every movie or episode with more than one watch recorded, and keeps only the oldest date.

The rest are deleted for good, and the correction is pushed out to every connected platform.

You'll always see the exact number of watches affected before confirming. This cannot be undone.

Restore Missing Episode Names

Looks at watch history for TV episodes whose stored episode name is missing or is just a coordinate (such as 8 or Episode 08).

Audit is read-only and scans the full watch history. Restore fills in the real name using other stored rows and cached season metadata first, then a metadata lookup when needed. Episodes verified by the metadata source to have no title are reported separately as No title provided; only retryable failures remain for another attempt.

Library Rebuilds

Reprocess local metadata and backfill Trakt imports
Rematch All TV Shows Idle
Resolve each show title against TVDB (primary) and update episode IDs
Rematch log will appear here.
Backfill Trakt Imports Idle
Fetch missing posters for imported Trakt events
Trakt backfill log will appear here.

Rebuilds & Backfills Help

Library Care
Rematch All TV Shows

Looks up each show on TVDB, the main source for TV matching.

The matching TMDB ID normally comes from TVDB's own cross-reference. If that's out of date, it falls back to a TMDB title search instead.

The corrected IDs are then saved onto your local episode rows.

Backfill Trakt Imports

Fetches missing posters and metadata for imported Trakt watch history events.

Wipe Data

Permanently delete tracked watch history, personal watchlist, sync history, or any combination
Back up before you wipe anything

These actions delete rows from the local database. There is no undo. Take a watch history or Plembfin backup first if you might want this data back.

Watch History Idle
Watch history, playstate, resume progress, and live sessions

Loading row counts…

Wipe log will appear here.
Personal Watchlist Idle
Canonical rows, provider ledger, queue, runs, and activity

Loading row counts…

Wipe log will appear here.
Sync History & Logs Idle
Sync history, watch audit events, and diagnostic logs

Loading row counts…

Wipe log will appear here.
Everything Tracked Idle
Watch history and sync history/logs together

Loading row counts…

Wipe log will appear here.
Wipe All / Fresh Start Idle
Resets Plembfin to a brand-new install
This is a full factory reset

Deletes every table above, plus settings, connections, cached artwork, and the admin login. You'll land back on the first-run setup screen and need to claim the account again. There is no undo.

Loading row counts…

Wipe log will appear here.

Wipe Data Help

Irreversible
What stays untouched

Your settings, media server connections, Trakt connection, API keys, and admin login are never touched by Watch History, Personal Watchlist, Sync History & Logs, or Everything Tracked.

Wipe All / Fresh Start is the one exception below - it resets those too.

Wiping local data does not unwatch anything on Plex, Emby, or Jellyfin themselves - it only clears what Plembfin has recorded.

Watch History

Deletes every watched item, resume position, and live session Plembfin has recorded. This is the same data a watch-history backup restores from - back one up first if you want a way back.

Personal Watchlist

Deletes the canonical local watchlist, mutation/tombstone history, provider observations, queued work, sync runs, activity, and Plembfin-owned playlist/container identifiers. It does not remove items from Plex, Emby, or Jellyfin.

Sync History & Logs

Deletes the sync history list, audit trail, and diagnostic logs. Lower stakes - your actual watch history is untouched.

Everything Tracked

Runs Watch History, Personal Watchlist, and Sync History & Logs together. Your settings and connections still stay untouched.

Wipe All / Fresh Start

The most destructive option here. Deletes everything above, plus settings, media server and Trakt connections, cached artwork, and the admin login.

Plembfin ends up exactly like a brand-new install - you'll be signed out and taken to first-run setup to claim the account again. A full Plembfin backup is the only way back.

Local

Local backup schedules and files
Local Watch History Backups
Enable scheduled local snapshots of watched state, playstate, and resume progress
Local Plembfin Backups
Create an encrypted full Plembfin backup and download it to your computer

Remote

Remote backup destinations and mirroring
Remote Destinations
Configure cloud destinations for remote backups
Remote Watch History Backups
Upload daily watch history backups to remote destinations
Remote Plembfin Backups
Store encrypted Plembfin backup files off-server automatically

Backup Guide

Disaster Recovery
Local Watch History Backups

Daily snapshots of watched state, playstate, and resume progress. Saved unencrypted to data/backups/watch-history on the server.

No passphrase needed. "Save Schedule" and "Back Up Now" work as soon as backups are enabled.

Local Plembfin Backups

A full encrypted export of the database and saved settings, including server credentials and API keys.

Encrypted in your browser with the passphrase you enter - Plembfin never sees or stores the plaintext backup.

The passphrase needs to be at least 12 characters. Losing it means the backup can't be decrypted - there's no recovery.

Remember passphrase

Scheduled backups run on the server with no browser open, so the server needs the passphrase saved.

Checked: the passphrase is stored in data/config.json so the schedule can run on its own.

Unchecked: the passphrase stays browser-only. Only "Back Up Now" works, and the schedule stays off.

Remote Destinations

Add a Backblaze B2 bucket as an upload target: region/endpoint, bucket name, and an application key scoped to it.

Every enabled destination gets a copy of each remote backup run.

Remote Watch History / Plembfin Backups

Mirrors the same two backup types to every enabled remote destination, each on its own schedule and retention.

Remote Plembfin backups use the same passphrase and "remember" setting as the local encrypted backup above.

Local

Restore from files on this server or your computer
Local Watch History Restore
Restore a watch-history backup stored on this server or upload one
No watch-history file selected
Local Plembfin Restore Idle
Restore an encrypted full Plembfin backup
Restore log will appear here.

Remote

Restore from configured remote storage
Remote Watch History Restore
Restore a watch-history backup mirrored to Backblaze B2
Remote Plembfin Restore
Restore an encrypted full Plembfin backup mirrored to a remote destination

Local Restore Guide

Disaster Recovery

Two backup types

Watch-history backups contain watched state, playstate, and resume progress. Use them to roll watch history back to a known point and push that state to Plex, Emby, and Jellyfin.

Plembfin backups contain the full Plembfin database data and saved settings. They are encrypted because they can include API keys and server credentials.

Watch-history restore

The selected watch-history backup becomes the source of truth:

  1. Wipes the local watch history, playstate and resume progress, and reloads them from the backup.
  2. Pushes that state out to every connected app (Plex, Emby, Jellyfin).
  3. Stamps a restore watermark so background sync does not re-import the previous app state.

While the restore is running, the cron sync and incoming webhooks are ignored, so nothing is written to watch history mid-restore. Watch dates are always preserved - an item already watched on an earlier date is never re-added as watched today.

Merge into existing state

Adds only the items the backup knows about to each app, without touching anything else. Fast. Any watched items the apps have that the backup never tracked are left as they are.

Replace existing state

Marks every currently-watched item on each app as unwatched, then re-applies only the backup's watched set, so each app ends up matching the backup exactly. Slower (it touches every watched item on every app), but this is a true restore.

Sync Tuning

Choose how watched flags from Plex, Emby, and Jellyfin are dated or reviewed

Sync Tuning Help

Understanding the Defaults
What This Controls

These values decide when a play counts as watched, how a watched flag is dated, and how sync behaves.

The watched-flag policy defaults to Require review. The numeric fields remain optional: leave one blank to keep the built-in default (or a matching environment variable, if one is set on the server).

Fields

When you manually mark an item as watched in Plex / Emby / Jellyfin: choose now, the release day, the same before/after episode timing used by media pages, or Require review to approve each item manually from the Manual Watch review page.

Watched Threshold: playback progress percentage at which a play counts as watched. Default 90%.

Minimum Resume Position: playback position, in seconds, below which a stopped play is too short to save as a resume point. Default 60s.

Active Session TTL: how long a "now playing" session is kept without an update before it's considered stale. Default 5 minutes.

Outbound Request Timeout: how long Plembfin waits for a response from Plex, Emby, or Jellyfin before giving up. Default 10 seconds.

Fast Local-Network Sync: off by default. When enabled, Force Sync, Full Sync Watchstates, and other bulk sync operations send more concurrent requests with shorter gaps between them, finishing much faster. Only turn this on when Plex, Emby, and Jellyfin are all self-hosted on the same trusted local network as Plembfin.

Sync Tools

Repair recent items, then pull, combine, and push watched status across your connected servers
Repair Recent Items Scans recent watch activity and active sessions across Plex, Emby, and Jellyfin.
Checks for missing recent records without scanning the full libraries.
When to use: Run this when a recent watch was not picked up automatically.
Personal Rating Sync Two-way sync for personal movie, show, and episode ratings across Plembfin and connected services.
Disabled
Two-way rating sync is enabled across all connected providers.
Plex Watchlist Sync Add or remove an item in Plembfin or the Plex app and Plembfin keeps both watchlists aligned.
Disabled
Local watchlist actions always save in Plembfin first.
Activity log Latest sync output
Live output
Preparing sync 0% · Estimating remaining
[idle] Waiting for force sync.
Sends Plembfin's currently recorded watched status and saved resume positions to the selected server or all connected servers, overwriting whatever they currently show.
Nothing is checked or pulled in first. If Plembfin's own record is wrong, this sends that wrong state out too.
When to use: Use this when you've confirmed Plembfin's record is correct and want every connected app to match it.
Reads watched status from the selected server or all connected servers and adds anything Plembfin doesn't already have.
Purely additive: never sends anything back out, and never marks anything unwatched or removes existing history.
When to use: Use this to bring watched status in from a server without changing anything else.
Sync activity Live server output for this operation
Ready
Preparing operation

                              

Sync Tools Guide

Detailed Tool Information
Repair Recent Items

Performs a rapid incremental scan of recent watch activity and active sessions across Plex, Emby, and Jellyfin.

Set Plembfin as Source of Truth

Sends Plembfin's watched status and resume positions to the selected server, or all of them, overwriting what they currently show.

Nothing is checked first - it just pushes Plembfin's record out.

Import Watched Status

Reads watched status from the selected server, or all of them, and adds anything Plembfin is missing.

Only adds - never sends anything out, marks anything unwatched, or removes existing history.

Stop / Reset Sync

Cancels a Force Sync that's currently running.

If the server restarted mid-sync and left a stuck lock behind, this also clears it so a new sync can start.

Sync Issues

Loading...
Review unresolved watched-state and cross-platform match issues
Cross-Platform Match Report
Media each platform could not find during sync

Sync Issues Help

Understanding Issues
What are Sync Issues?

This section shows any problems with propagating watched states between your media servers. Click on any issue to view detailed telemetry about what went wrong.

Issue Categories

Missing Dispatch Telemetry: No logging data recorded. These likely synced successfully but the logs are missing. Safe to clear.

Plex Match Issues: Plex couldn't find the media item. Check Plex metadata and external IDs.

Emby/Jellyfin Match Issues: Plex found it but Emby/Jellyfin couldn't. Check their metadata and IDs.

Unresolved Sync Issues: Other sync problems detected. Click to view telemetry for error details.

How to Fix

Click "Retry" on an issue to re-attempt the sync and see detailed error messages. Click "Fix" to manually adjust the match if the item wasn't found.

Refresh Issues

Click "Refresh" in the Sync Issues header to immediately reload unresolved sync issues and match reports.

Sync History Help

Recent Propagations
What is Sync History?

Recent watched-state propagation attempts. Shows source, action, timestamp, and target sync results for every automatic and manual sync.

How Sync Works

When you mark something as watched (on any platform), Plembfin automatically propagates that state to your other configured servers every 60 seconds.

Resume positions sync similarly. Use the controls in the Force Sync box when you need a library-wide Set Plembfin as Source of Truth or Import Watched Status operation with live terminal output.

Server Logs

Live Output


                      

Logs Guide

System Diagnostics & Telemetry
All Logs

Everything in one stream, in time order - both server activity and browser activity.

Plex WebSockets

Live events pushed from Plex: playback updates, pause/resume, and unwatched detection.

Outbound Sync

Everything Plembfin sends to Plex, Emby, and Jellyfin.

Mark-played and mark-unplayed calls, resume syncs, loop checks, and each server's response.

Scheduled Polls

The background worker that runs every minute.

Checks connected servers for recent watches, applies the watched threshold, and works through the sync queue.

System Logs

General app events: startup, database setup, config changes, scheduled tasks, and errors or warnings.

Downloading & Exporting

Use Download Logs to save a full .log file with everything, for bug reports or troubleshooting.

Changelog

Your version and newer releases from GitHub

Release Guide

Updates & Maintenance
Automatic Update Checks

Plembfin queries published releases on GitHub to check for new feature releases, bug fixes, and performance improvements.

Release Tagging

The Current badge marks the version running on this instance. Any releases published since your build show a New badge.

Updating Plembfin

For Docker deployments, pull the latest image (docker compose pull). For Git installs, run git pull, npm install, and restart the process.

About Plembfin

Plembfin logo

The local brain for your media stack.

Version v1.1.0 · Channel Latest

Links

Project, documentation, support, and release links.

  • GitHub projectSource code and project development.
  • DocumentationSetup guides and reference material.
  • Release notesChanges and improvements by version.
  • Issue trackerReport bugs or suggest improvements.
  • WebsiteProject overview and public information.
  • DiscordCommunity help and discussion.
  • RedditCommunity posts and announcements.

Artwork & metadata: Artwork and metadata can come from TMDB, TheTVDB, Fanart.tv, OMDb, and YouTube. Plembfin is not endorsed or certified by those services.

Searching TMDB and local database…
No results found.

Share Plembfin

Choose where to share the project.

XPost it to your timeline. FacebookShare it with your network. RedditStart a Reddit submission. WhatsAppSend it to a conversation. TelegramSend it to a chat or channel. EmailOpen a pre-filled message.

Sync diagnostic audit

History row

Confirm Sync

Force Sync

Limit to specific seasons (optional)
Overwrites watched status on the selected server(s) to match Plembfin's current records without checking for existing differences.
Imports watched history from the selected server to fill in missing records in Plembfin without removing existing history or modifying remote servers.
Sends Plembfin's personal rating for this title only. This is separate from watched status, play history, resume positions, and lists.
Sync activity Live server output for this operation
Ready
Preparing operation

          

Sync Operation Console

Retry Sync Terminal


        

Cast Member Profile

Actor Name