Step 01
Upload
Drop in a recording, or a Zoom folder with a separate track for every participant.
PINE transcribes your interviews, separates the speakers, and lets you code the transcript — all of it on your own machine. After setup it runs with the network off. It's open source, so you can check that yourself.
Windows 10/11 · macOS 12.3+ · Python 3.11–3.13
Walk me through the last time you handed a case over to someone else.
I print it out. All of it, and then I mark it up by hand — the notes field only takes two lines, so there is nowhere else for any of it to go.
And I keep a second spreadsheet for the things the system won't let me record. Everybody on the team has one.
Does anyone else ever see that spreadsheet?
My lead, if she asks for it. Which makes the spreadsheet the real record and the system the paperwork, doesn't it.
Why it exists
The transcript is made on your machine: no additional services, no leak risk, nothing shared while you work. Your participants’ words never become training data.
A model could group the quotes in seconds, and it could be confidently wrong — coding them yourself is how you know which it is. When there is no time for that, the export takes the transcript wherever you send it, prompt and all.
The loop
Create a project, fill in the brief, drop the recordings in. Transcription and diarization run in parallel with an ETA calibrated on your own runs, so you can leave and come back.
Step 01
Drop in a recording, or a Zoom folder with a separate track for every participant.
Step 02
Whisper large-v3 on your GPU, speakers separated by pyannote alongside it. Queue the whole study before you leave; it works through the recordings one by one.
Step 03
Highlight any quote, give it a colour, add a comment. Rename speakers, fix the transcript, import a codebook from another project, group codes into themes.
Step 04
Hand the transcript to a colleague or an LLM with your codes and comments intact.
Turn on PII removal and names, emails, phone numbers and addresses become tags
like [REDACTED].
Privacy & network
Setup needs the internet: Python packages and about 3.1 GB of models. After that, disconnect the machine and everything still works — because nothing was ever going anywhere.
backend/run.py disables HuggingFace, pyannote, OpenTelemetry and W&B
reporting before the app is even imported.
It opens at pine.localhost:5000 in your own browser. Close the last PINE
tab and the backend shuts down with it.
An optional GLiNER multilingual pass strips names and identifiers from an export, with a sensitivity slider you control. It runs locally too.
A transfer package is a ZIP of transcripts, annotations and metadata — the analysis, with the participants' voices left behind on your disk.
The first time you transcribe a language other than English, PINE goes online once to download the language pack for it. After that it sits on your disk like everything else.
Every line that runs on your machine is in the repository, launchers included. Give the code to an LLM and ask for a security review — for example:
Review github.com/paul815/pine for anything that could send data off the machine: network calls, telemetry, update checks, uploads. List each one, what triggers it and what it sends.
What’s in the box
Built for how research actually runs: a brief up front, many conversations in the middle, synthesis at the end.
Install
The launchers are unsigned scripts, so both systems stop them the first time. That is about a missing paid developer certificate, not about what is inside.
A ZIP from GitHub marks every file as downloaded from the internet, so you get
“publisher could not be verified” — or a hard block if Smart App Control is on.
Right-click Setup_WIN.bat → Properties → tick Unblock.
Don’t switch Smart App Control off to get past it: on Windows 11 it can’t be switched back on without resetting the OS. Cloning with git avoids the prompt entirely — files git creates carry no such mark.
Gatekeeper calls the file “from an unidentified developer”. Right-click
Setup_MAC.command → Open, then Open in the dialog. macOS
remembers the choice, and every later start is an ordinary double-click.
No Open button? Double-click the file once, then go to System Settings → Privacy & Security and press Open Anyway.
Setup runs once, in five steps: system check, modules, storage, HuggingFace token, download. The token is free and only needed to accept the pyannote licence — create one at huggingface.co/settings/tokens and accept the conditions on pyannote/speaker-diarization-community-1.
Unpack the release somewhere permanent — the app lives where you put it — and double-click the launcher for your OS. It builds the virtual environment, installs what it needs, starts the app and opens your browser.
| OS | Windows 10/11, or macOS — Metal needs 12.3+, older runs on CPU |
|---|---|
| Python | 3.11, 3.12 or 3.13 — the installers find it themselves |
| Disk | 12 GB free — models ~3.1 GB, ML packages take the rest |
| RAM | 10 GB recommended; setup warns you below that |
| GPU | Optional. NVIDIA + CUDA is the fast path, Apple Silicon uses MLX, no GPU falls back to CPU at roughly 10× slower |
| Account | A free HuggingFace token, for the diarization model licence |