Watchfolio is a private Vite and React viewer for TV Time GDPR exports. It turns shows, movies, episode history, rewatches, ratings, reactions, comments, and badges into a searchable local library.
Your selected ZIP is processed in the browser. The cleaned library is stored in IndexedDB and is never uploaded by Watchfolio.
Watchfolio is an independent reimplementation inspired by TV Time Capsule by Portvgal. The original project established the local-first approach, safe GDPR import workflow, and archive-viewer concept that this project builds on.
TV Time Capsule is distributed under the GNU General Public License v3.0. Credit and thanks belong to Portvgal and the original contributors for making their work public.
Watchfolio is not affiliated with TV Time, Whip Media, or TV Time Capsule.
- A Vite and React architecture
- A combined show and movie library
- Episode totals, total plays, and explicit rewatch counts
- Import support for
rewatched_episode.csvand legacy seen-episode records - Filters for media type, status, rewatches, and saved memories
- Grid and list layouts with several sorting options
- A complete viewing timeline and monthly activity insights
- Per-title season and episode details
- Comments, ratings, reactions, character votes, and badges
- Responsive desktop and mobile layouts
- IndexedDB persistence with a visible import report
- Automatic blocking of token, session, device, IP, and identity files
Request and save your official TV Time export before trying migration or replacement tools. Export requests can take time, so request yours as early as possible.
- Open the TV Time GDPR self-service page.
- Sign in with the email and password connected to your TV Time account.
- Use the password reset option if you do not know your password.
- Request your personal data export.
- Wait for TV Time to prepare it.
- Download the GDPR ZIP when it becomes available.
- Keep the original ZIP somewhere safe.
Do not unzip, rename files inside, or edit the archive before importing it. Watchfolio expects the original .zip structure.
The original TV Time Capsule documentation also recommends keeping an additional browser-generated backup when the official export is slow or unavailable:
- TV Time Data Extractor can create a basic local CSV export.
- TV Time Out by Refract can create export files and an HTML archive.
These are useful as extra backups. Watchfolio currently imports the official TV Time GDPR ZIP format, not these alternative formats.
From the watchfolio directory:
npm install
npm run devOpen the local URL printed by Vite, usually http://localhost:5173.
- Select Import archive.
- Choose the original TV Time GDPR ZIP.
- Keep the tab open while the archive is processed.
- Browse the Overview, Library, History, Insights, and Settings pages.
- Select any title to inspect its viewing record, episodes, rewatches, and memories.
After a successful import, Watchfolio saves the cleaned library in IndexedDB. It will reopen automatically on the next visit in the same browser profile.
npm run build
npm run previewThe compiled site is written to dist/. Watchfolio is a client-only application and does not require an application server, but serving dist/ through a normal static host is more reliable than opening index.html directly.
- Followed, archived, planned, and watched TV shows
- Watched movies and movie watch counts
- Watched episodes grouped by season
- Per-episode and per-title rewatch counts
- First and last recorded watch dates
- Viewing history grouped by month
- Aggregate watch time when it is present in the export
- Ratings, reactions, comments, and character votes
- Badge records
- A safe-file import report
Official exports can contain old personal comments, spoilers, reaction votes, and rating records. Watchfolio keeps these records local and shows them in each title's Memories tab.
This is not a complete migration of TV Time's community features. The GDPR export may omit discussion context, GIFs, translations, likes, or deleted community content. Unknown vote identifiers are kept as plain labels instead of being guessed.
Watchfolio combines detailed tracking rows, legacy seen-episode rows, and explicit entries from rewatched_episode.csv. Duplicate episode events with the same title, episode, and timestamp are merged.
Lifetime watch time is split into series and movie totals. Durations use 365-day years and 30-day months, followed by days, hours, and minutes. These are elapsed viewing-time units, not calendar dates.
Movie statistics use three separate definitions:
- Unique movies watched counts distinct movie titles with at least one watch record.
- Total movie plays counts every movie watch, including rewatches.
- Movies in library also includes followed and watch-later movies that have not been watched.
Counts can still differ from the current TV Time app because some exports contain aggregate totals without every historical event, or detailed rows without complete runtime metadata. Watchfolio prefers explicit export totals where they are available and exposes the detailed rows it can verify.
Watchfolio intentionally does not import sensitive account or device datasets, including:
- Access and refresh tokens
- Login and authentication records
- Password data
- IP address history
- Device tokens and identifiers
- Advertising identifiers
- Session and user-agent records
- Facebook and other private social identity data
The ZIP is read locally by the browser. Watchfolio does not include analytics, an upload endpoint, or a remote database.
Keep the original GDPR ZIP backed up. IndexedDB is convenient, but it is not a permanent backup.
The saved library can disappear if you clear browser site data, use a private window, change browser profiles, or reset the browser. If that happens, import the original ZIP again.
Use Settings → Clear data to remove Watchfolio's cleaned local copy. This does not modify or delete the original ZIP.
TV Time exports do not include poster image files or a complete provider catalogue. For shows, the exported tv_show_id is preserved as a TVDB ID and passed to TVmaze's exact TVDB-ID lookup. This avoids ambiguous title matches without requiring a TheTVDB API login. Title search is used only when an ID lookup is unavailable. Movie posters come from Cinemeta/Stremio, with iTunes as a fallback.
TheTVDB v4 is not the default image provider because its official API requires a project API key and authenticated access. Projects using its user-supported model may also require a subscriber PIN. Poster lookups start only when artwork is near the visible screen, and successful URLs are cached in the browser for 30 days.
This means title searches are sent directly to those metadata providers when poster loading is enabled. If a provider is unavailable or cannot match a title, Watchfolio keeps the generated local cover instead of showing a broken image.
Some TV Time information may not be portable because it is absent from the GDPR export or depends on TV Time's community systems:
- GIF reactions
- Full episode discussions and reply context
- Complete like history
- Community interactions
- Deleted or unavailable content
- Official badge artwork
- Poster image binaries
Watchfolio focuses on preserving the private viewing library and history that can be safely and reliably parsed.
- Episode names are often unavailable, so the interface may show a season and episode number only.
- Runtime totals depend on the fields included in the export.
- Aggregate TV Time totals may not reconcile perfectly with detailed history rows.
- Some obscure or localized titles may not have a matching poster from the metadata providers.
- Alternative browser-extension exports are not supported yet.
- IndexedDB data belongs to one browser profile and does not sync between devices.
npm run lint
npm run build
npx -y react-doctor@latest . --verbose