TapeSplit

Every moment on every tape. Found.

TapeSplit watches your digitized VHS and camcorder tapes for you. It splits each one into moments, works out when and where they happened and who was there, and leaves only the uncertain guesses for you to check.

Free for personal use · Runs on your Mac · Your tapes stay home

The first archive: 19 tapes and 31 hours from 1997 to 2007, turned into 279 moments, 101 people and 244 places.

Moments

Every tape split into the moments on it, with blank tape and static left out.

See a tape split

Places

Signs, landmarks and conversations put each trip on the map.

Open the map

The Journal

Days from the tapes, drafted into entries that cite the clips they use.

Read an entry

Review

Strong guesses are accepted for you. The rest wait, with the clip one click away.

See the queue
Why I made this

These are my family's tapes.

I'm Phillip, the kid in these clips. My family's nineteen tapes cover 1997 to 2007: Madison, then Eugene, and trips to Hawaiʻi, Alaska, Davos and Moscow. Much of it is narrated in Russian, some of it straight to my grandparents in Moscow. On my first day of school, my dad asks what I want to tell them. I say I don't know.

When the tapes came back from the digitizer, they were thirty-one hours of video with no labels. Nobody was ever going to sit through all of it to find the moments that matter. So I built something that would: TapeSplit watches the tapes, splits them into moments, works out when and where each one happened and who's in it, and leaves the guesses it isn't sure about for us to check.

Phillip

Phillip today, smiling in front of a mountain range
me, now
me, 2006
Devil's Lake, May 2001
a bagel, April 2002
first day of school, 2005
2007
Moments

Two hours of tape. Forty-three moments.

Tape 16 came back from the digitizer as one unlabeled two-hour file. TapeSplit found a trip to Hawaiʻi, a weekend on the Oregon coast and a spring at home on it, and skipped the blank tape in between.

Tape 16 · tape-18.mp4 · 2:04:23
Hawaiʻi · March 2006 25:10

Night view of lava entering the ocean

25:10 – 27:11 · 2 min

Hawaiʻi, March 2006 Oregon coast, April 2006 Spring in Oregon, May 2006 Blank tape, skipped

Move across the filmstrip to skim the tape. Click any moment for everything TapeSplit found.

How it works

One morning, taken apart.

Tape 18 came back from the digitizer as tape-20.mp4: two hours and no label. An hour in is a Wednesday in September 2005, my first day of first grade. Here's how TapeSplit worked out when it was, where, who's talking and what they're saying.

Translate the Russian into
Tape 18 tape-20.mp4

this stretch ↓

Moscow on September 1. Eugene six days later. Then February. All on one tape.
When

It reads the clock in the corner.

For a few seconds after you press record, a camcorder burns the date into the picture. TapeSplit reads those stamps twice: Apple Vision reads the text in the frame, and the video model reads it while it watches. It also catches dates said out loud or written on screen, and a date only counts if it fits the tape's other dates.

burned in by the camcorder
the teacher wrote it too
Date stamp · read by the video model SEP 7 2005 September 7, 2005 Apple Vision found it too, in two pieces: “SEP” and “7 2005”.
Whiteboard · cited by the video model “Today is Wednesday September 7, 2005” Agrees
Said six days earlier, in Moscow “Сегодня 1 сентября, я иду в школу…” “Today is September 1st. I'm going to the school…”« Aujourd'hui, c'est le 1er septembre. Je vais à l'école… » September 1, 2005

the camcorder and the teacher agree

Tape 18's dates all fall in

Each tape gets a window from its own stamps and spoken dates. A date outside it is flagged instead of trusted.

What it won't count

    Where

    Which Maplewood?

    My dad says we're back in Eugene. The sign over the doors says Maplewood School. But there are Maplewood Schools all over the country, so TapeSplit doesn't trust the name alone. It weighs every clue against where we lived that year.

      Me and my mom walking to school, seen from behind; I have a big backpack and a lunchbox
      on the way, 1:12:21
      A street corner with a stop sign under the street signs for Onyx and 22nd
      Onyx & 22nd

      The school and teacher names are changed on this page, and nothing near home gets an exact pin.

      Who

      Two voices, one conversation.

      TapeSplit separates the voices on the soundtrack and lines each one up with its words. This is my dad asking me about my first day, in Russian, for my grandparents back in Moscow. TapeSplit suggests who's who; the names are mine.

      1:11:03
      DadPhil

        Video without sound. Russian as transcribed; translations added for this page.

        Faces, followed

        InsightFace follows a face through the shot. Each track is matched against faces from other tapes and grouped into a person; naming the group takes one click.

        One person, eight spellings

        At home I'm Филя; my teacher writes Philip. TapeSplit merges the spellings across both alphabets into one person. “Grandma” and “Grandpa” are only spoken to here, so they're kept as mentions, not confirmed people.

        Language

        Russian, English, and both in one breath.

        My family switches languages mid-sentence. TapeSplit keeps every line in the language it was spoken, then lets you search across both.

        Translate the Russian into

          See all 21 stages of the pipeline ›

          Chronology

          Nineteen tapes, out of order. One timeline.

          Tapes get reused, rewound and recorded over. Tape 3 jumps from 2003 to 2006, and Tape 6 covers four years. TapeSplit dates each moment on its own, then lays the whole archive out in order.

          Each of the 19 tapes as a row from 1996 to 2009. A bar shows the years a tape could have been filmed, and dots show the moments dated to the day: solid where an on-screen date stamp read by Apple Vision confirms the date, hollow where the date came from what was seen or heard in the moment.
          Confirmed by an on-screen date stamp Seen or heard in the moment Years the tape could cover No direct evidence yet
          Everything else

          The rest of the work, done for you.

          Blank tape, skipped.

          8.3 of the 31.4 hours were static, black frames or a blue screen. TapeSplit finds them from the picture itself and leaves them out.

          Recorded TV, set aside.

          Tape 1 is an NBA game and a TV movie taped off NBC. TapeSplit marks 54 stretches like these as unrelated and keeps them out of the archive.

          Search in plain words.

          “First day of school” finds Filip's in Eugene, a copy of it on Tape 3, and the one in Moscow. It searches summaries, transcripts, captions and text read off the screen.

          Faces, kept together.

          Tracks become people across tapes and years. You name a person once.

          Asks only when it's unsure.

          Strong guesses clear per-type rules and are accepted for you. The rest, 368 here, wait with their evidence.

          The Journal writes the day down.

          TapeSplit drafted this entry for September 7, 2005 in Russian, the language on the tape. Every paragraph cites the clips it came from.

          Cloud is optional, and capped.

          Every cloud batch is priced before it runs and skipped if it would go over your cap. With --profile local, nothing leaves your Mac.

          From the tapes

          Click any moment. See what TapeSplit knows.

          When it happened and how TapeSplit knows, where it was on the map, who's in it, and which guesses are still waiting for a person. Skim a moment by moving across it.

          Real frames from my family's tapes, with TapeSplit's output. Names other than mine are changed.

          Places

          Every trip, on the map.

          TapeSplit reads place names off signs and out of conversations, checks them against the moments around them, and geocodes what it can. Red pins are the moments on this page; click one.

          A moment on this page Approximate: placed from nearby moments Another place TapeSplit found
          The app

          A photo library for your tapes.

          A local app on your Mac where every moment links back to the second of tape it came from. Click a screenshot to see it full size.

          Every moment, back to the second it came from.

          Open a moment and it plays from the right spot, with its keyframes and the places and people behind its labels.

          • Dates read off the camcorder's date stamp.
          • Places from signs, landmarks and what was said.
          • Details that still need a person are flagged.

          The Journal. Days from your tapes, written down.

          TapeSplit drafts short entries about the days on your tapes. Every paragraph cites the clips it came from, and quotes are verbatim, Russian included, with a translation alongside.

          Review. The guesses that are left.

          Strong guesses are accepted for you, under rules for each kind of fact. The rest wait here with their evidence and the moments they touch. Your corrections are kept apart and replayed after every rebuild.

          The pipeline

          Four passes over every tape.

          One command runs the whole pipeline. Each stage checks what your Mac can do, skips with a reason when it can't, and picks up where it stopped if you run it again.

          1

          Watch

          On your Mac
          • Scene cuts from ffmpeg, with blank tape and static thrown out.
          • Every word transcribed by whisper.cpp, in any language.
          • Voices separated with pyannote.
          • Text in the frame read by Apple Vision, including date stamps.
          • Faces followed through each shot with InsightFace.
          2

          Understand

          Cloud, optional
          • Gemini watches each tape in chunks and proposes moments with timestamps.
          • Priced before it runs and capped by --max-cloud-usd.
          • Optional. Without it, local signals still build a timeline.
          3

          Reconcile

          On your Mac
          • Every signal becomes a claim that keeps its evidence.
          • Moments are dated from stamps, speech and the moments around them.
          • Names are reconciled. Mom, Katya and Катя become one person.
          • A blind verifier re-checks a sample against the clips.
          4

          Review

          You, a few minutes
          • Strong guesses are accepted under per-type safety rules.
          • The rest wait in a queue with the evidence.
          • Your fixes stick and replay after every rebuild.
          $ tapesplit auto ~/Tapes

          That's the whole pipeline: 21 stages, resumable and cost-capped. tapesplit doctor shows which stages your Mac can run.

          ingest → exif → non-content → scenes → transcribe → diarize → gemini → core-build → visuals → ocr → captions → visual-embed → visual-similarity → faces → face-tracks → face-cluster → reground → finalize → apply-suggestions → semantic-embed → verify

          Built to be checked

          It shows its work.

          Guesses look like guesses.

          Inferred facts read "appears to be…" and link to the transcript line, frame or face track they came from.

          Auto-accept has rules.

          Each kind of fact has its own confidence floor. A relationship needs both people resolved and evidence that agrees.

          Your fixes stick.

          Corrections live in their own file and are replayed after every rebuild. Re-run the pipeline as often as you like.

          It measures itself.

          A blind verifier samples claims and checks them against the clips. Precision decides when new logic ships.

          Your tapes stay home.

          Every stage has a local path. Cloud stages are opt-in, estimated first, and capped at a dollar amount you set.

          Plain files underneath.

          A project is a folder of JSONL files, a SQLite search index and thumbnails. Nothing is locked inside the app.

          Tech Specs

          Run it on your tapes.

          Requirements

          • A Mac with Apple silicon (best tested), or Linux without the Apple Vision stages
          • Python 3.11 or newer and ffmpeg
          • Node 20 or newer for the review app
          • Tapes as video files: MP4, MOV, MKV, AVI, DV, MPEG, VOB or M2TS

          Install

          Terminal
          # install
          brew install ffmpeg whisper-cpp
          git clone https://github.com/bindeman/tapesplit
          cd tapesplit
          python3.12 -m venv .venv
          .venv/bin/pip install -e \
            '.[local-ai,vision,macos,visual-ai,face-ai,speaker-ai]'
          
          # check what this Mac can run
          .venv/bin/tapesplit doctor
          
          # tapes in, archive out
          .venv/bin/tapesplit auto ~/Tapes
          
          # browse and review
          .venv/bin/tapesplit ui ~/Tapes.tapesplit

          On your Mac

          • Scene and blank-tape detection with ffmpeg
          • Transcription with whisper.cpp, in the language that was spoken
          • Speaker diarization with pyannote, or SpeechBrain without a token
          • On-screen text and date stamps with Apple Vision
          • Face tracks and clustering with InsightFace on ONNX Runtime
          • Search with SQLite full-text and multilingual vectors
          • The review app, served only to your own machine

          Optional services

          Every key is optional. Put them in .env; tapesplit doctor reports which ones it found without printing them.

          ServiceWhat it addsWithout it
          Google CloudVertex AI · GeminiWatches the video itself: titles, summaries, people, places and dates. Sign in with gcloud auth application-default login.Low-confidence moments from local signals
          Hugging FaceHF_TOKENpyannote speaker diarizationSpeechBrain fallback
          Azure OpenAIAZURE_OPENAI_*Diarized transcription with speaker names, the blind verifier and Journal draftingThose stages skip with a reason
          Google MapsGOOGLE_MAPS_API_KEYSharper geocoding, with a daily budget capOpenStreetMap Nominatim
          TwelveLabsTWELVELABS_API_KEYAn optional hosted video indexLocal hybrid search

          Cost

          Gemini analysis of all 31 hours of the sample archive came to about $8 on Vertex AI. Each run is estimated first and skipped if it would go over --max-cloud-usd (default $10), and GEMINI_PROJECT_BUDGET_USD caps the total.

          Privacy

          With --profile local, nothing leaves your Mac. Cloud stages are opt-in: Gemini reads low-resolution proxies from a bucket in your own Google Cloud project, and the Azure stages send individual frames and audio snippets.

          License

          Source-available under the PolyForm Noncommercial License 1.0.0: free for personal, family, educational and research use. Commercial use needs my written permission.

          Questions

          Before you dig out the box.

          Do my videos leave my computer?

          Only if you turn on a cloud stage. Gemini analysis uploads low-resolution proxies to a Cloud Storage bucket in your own Google Cloud project, and the Azure stages send individual frames and audio snippets. With --profile local, nothing leaves your machine.

          How does it know when something was filmed?

          It reads the camcorder's burned-in date stamp off the frame, listens for dates said on tape, and uses the dated moments around a moment on the same tape. When those disagree, the date stays a guess for you to review.

          How does it know where something was filmed?

          From signs and landmarks in the frame, places named on tape, and the trip a moment belongs to. Named places are geocoded; generic ones like "beach" borrow context from nearby moments and are marked as approximate.

          Does it handle more than one language?

          Yes. The sample archive mixes Russian and English. Transcripts keep the original language, search works across both, and Journal quotes stay verbatim with a translation.

          Can I use TapeSplit commercially?

          Not without permission. TapeSplit is free for personal, family, educational and research use under the PolyForm Noncommercial License 1.0.0. For anything commercial, get in touch through phillipbindeman.com.

          Is it finished?

          It's an alpha. The pipeline runs end to end on a real 31-hour archive, and the review queue exists because it still makes mistakes, like borrowing a place from the wrong trip. Issues and pull requests are welcome.