Independent software workshop

Voices, signals & strange maps.

I build local-first tools that put the interesting machinery on the outside—so it can be measured, questioned, and changed.

Eight public projects

The workbench

Each project has its own repository and field notes. The apps stay local; the measurements, trade-offs, and failures are left visible.

01 / CARTOGRAPHY

Gateway Forge

A guided-meditation assembly system and journal that keeps the published map beside what was actually found—without forcing them into one answer.

Swift · SwiftUI · macOS · GPL-3.0-or-later
Gateway Forge desktop home screen with its Focus-level map
02 / SPEECH

Voice Forge

A text-to-speech instrument with the synthesiser’s timing controls exposed and measured instead of hidden behind one generic speed slider.

Swift + Electron · macOS · Linux · untested: Windows · GPL-3.0-or-later
Voice Forge native macOS interface with speech and timing controls
03 / FACE

Protoke

proto + karaoke. A karaoke and narration renderer fronted by a protogen visor face — two eyes and a mouth drawn as vector outlines and burned in by the same libass pass that draws the lyrics, so there is no image sequence to composite.

Python · macOS · tested on Linux, Windows · MIT
◤‿◥ visor^w^ happy▶_◀ sharp
¬‿¬ smugo_o wide-_- sleepy
owo curious^o^ delighted^_^ content
04 / DELIVERY

Media Preflight

Check a finished file against where it is going — YouTube, ACX, EBU R 128, or a standard of your own — and get the exact timestamps of what is wrong. Then, optionally, a corrected copy that is measured again from scratch before it claims to be fixed. The original is never touched.

Python · macOS · tested on Linux, Windows · MIT
✓ -23.1 LUFS✓ -1.4 dBTP⚠ 2.1 s black
✕ 48 kHz✓ h264⚠ drift 0.4 s
✓ fast start✕ mono✓ no clipping
05 / INTAKE

siphon

Paste a link and get the file — or point it at a folder you already have and get the same thing in a different shape. It is one pipeline either way, and it does not re-encode what it does not have to: asking for an mp4 that is already H.264 and AAC moves the streams into a new container and changes nothing else. Playlists from Deezer, Spotify and Tidal arrive tagged, covered and foldered, and a track it is not sure about stops and asks before it fetches.

Python · macOS · tested on Linux · untested: Windows · MIT
✓ audio copied✓ video copiedalready h264
✓ mp4 ⟶ mp4nothing re-encoded16 s
⚠ matched 69%worth a listen✓ cover embedded
06 / FILING

auto-sort

Empties a Downloads folder and keeps it empty. It works out what each file is from its bytes rather than its name, reads what documents call themselves, and once three of them share a heading they get a folder of their own. When it learns something new it goes back over what it already filed. Every move is written down and can be undone, and nothing is ever deleted: what goes, goes to the bin.

Python standard library · macOS · Linux · tested on Windows · MIT
✓ scan.pdf⟶ Scans/2026read, not named
✓ 3 invoices⟶ new folderlearnt
⚠ encryptedset aside↶ undo any move
07 / INTERPRETING

Interpreter

Live interpreting into English that waits for a complete thought, the way a human interpreter does, instead of translating every half-sentence. Polish, Hungarian or any of 25 languages around the table arrive in your ear a few seconds behind; English is left alone. Recognition, translation and the voice all run on the iPhone or Mac in front of you.

Swift · SwiftUI · macOS · iPhone · iPad · untested: Android · GPL-3.0-or-later
✓ halb elf⟶ 10:304.2 s behind
✓ 916 Englishleft quietcontext kept
⚠ 7-5please repeatnot spoken
08 / FIELD TOOLS

tools-core

The useful pieces that fell out of the larger work: caption checks, media repackaging, audio tagging, file identification, duplicate finding, asset grouping and tray icons, alongside audio forensics, corpus preparation and voice research.

Python + shell · local-first · MIT / GPL-3.0 split
tools-core/
├── audio-analysis/
├── audio-tag/
├── bundle-list/
├── caption-check/
├── exact-duplicates/
├── file-identify/
├── gateway-authoring/
├── piper-workflows/
├── remux/
├── site-capture/
├── site-fonts/
├── tray-icon/
└── tts-research/

tools-core

Open the toolbox

These are working instruments, not a framework. Take the one that answers your question, give it explicit paths, and keep the generated material out of Git.

git clone https://github.com/snepssen/tools-core.git && cd tools-core
Captions / from Media Preflight

Caption Check

Find subtitle cues that are too fast, too long, overlap in the same position or run past the end. Check SRT, VTT and ASS locally, with the exact times and configurable thresholds.

python3 caption-check/caption-check.py subtitles.srt
Instructions ↗
Media / from siphon

Remux

Put a recording in another container without re-encoding. Every supported track is copied; an incompatible track stops the operation. Preview the decision, then write a new file.

python3 remux/remux.py recording.mp4 recording.mkv --plan
Instructions ↗
Files / from auto-sort

Exact Duplicates

Find files with identical bytes across folders. See every copy and its logical size, with hard links counted once. Nothing is deleted, moved or chosen for you.

python3 exact-duplicates/exact-duplicates.py ~/Downloads
Instructions ↗
Files / from auto-sort

Bundle List

See which files belong together: a film and its subtitles, a RAW/JPEG pair, a model and its sidecars, or a sequence of frames. Read the groups or export a JSON listing.

python3 bundle-list/bundle-list.py ./assets --groups-only
Instructions ↗
Audio / release prep

Audio Tag

Stop “Unknown artist”. Title, artist, album, year and track number for untagged WAV, MP3 and FLAC files, read from the folder layout, the file names and the order they were made. Preview first, then write in place.

python3 audio-tag/audio-tag.py ~/Music --artist "Your Name"
Instructions ↗
Audio / measurement

Beat analyser

Find persistent stereo tone pairs, calculate their differential, and separate likely entrainment signals from drifting content.

python3 audio-analysis/analyse-beat.py track.flac --json
Instructions ↗
Speech / corpus

Corpus aligner

Use authored text as truth, ASR only for timing, and quiet gaps for safe cuts—then preserve a manifest of every decision.

python3 audio-analysis/align-corpus.py read.wav words.json script.md output
Instructions ↗
Speech / Piper

Piper workflows

Train, resume, export, render, and A/B checkpoints while retaining fixes for checkpoint loading, dynamic shapes, and telemetry.

bash piper-workflows/check-in.sh RUN CONFIG OUT
Instructions ↗
Speech / Qwen3-TTS

Truth probes

Dump real MLX tensors, tokenizer slices, and speaking pace so a native port can be compared stage by stage instead of trusted by ear.

python3 tts-research/qwen3-tokenizer-truth.py --gateway-root PATH
Instructions ↗
Gateway / authoring

Library helpers

Index evidence, convert measured signals into playable profiles, verify corpus labels, and safely preview provisional briefings.

python3 gateway-authoring/seed-briefings.py PATH --dry-run
Instructions ↗
Files / from auto-sort

File identifier

Say what a file is from its bytes, not its name: the real format when the extension lies, the heading a document gives itself, when it happened and where it came from. auto-sort’s own identifier, unchanged, and it never writes.

python3 file-identify/identify-file.py FILE --facts
Instructions ↗
Desktop / from auto-sort

Tray icon

Put an icon with a menu in the macOS menu bar, the Windows notification area or a Linux panel, each entry running a command of yours. Nothing installed: auto-sort’s own tray, speaking to the Objective-C runtime, Win32 and D-Bus with the standard library.

python3 tray-icon/tray-icon.py "Backups" --item "Back up now" "~/bin/backup.sh"
Instructions ↗

Small live specimens

Try the ideas

Two deliberately tiny sketches from the larger projects. Nothing is uploaded and nothing follows you away from this page.

A / DIFFERENTIAL

Two tones, one perceived beat

Pick a differential, put on headphones, then start the quiet signal. The left and right channels differ by the selected amount.

ready · carrier 100 Hz · differential 4.0 Hz

Headphones required to perceive the differential. Starts very quietly, stops automatically after 30 seconds, and stops when the page is hidden.

B / TIMING

A lyric line is a clock

Play the timing sketch. The words are fixed; only their measured windows decide what is active.

Build a little signal,
then give it room to breathe.
00:00.000 / 00:05.200
C / FACE

The face is a subtitle track

No image sequence and no video layer: two eyes and a mouth, drawn from a dozen numbers and burned in by the same libass that draws the lyrics. These are Protoke's own frames, played back.

64 frames · 3 shapes · one loop

A recurring method

How I build

The subjects change. The rules underneath them have stayed remarkably consistent.

01

Keep it local

Personal voice, private journals, and unfinished material stay on the machine unless there is a clear reason for them to leave.

02

Measure the claim

A waveform, duration, tensor, or failing check is more useful than “sounds about right.” Unknown stays a named state.

03

Show the mechanism

Good tools expose the meaningful controls and preserve the source material, instead of hiding both behind a convenient button.

The wider workshop

Nine projects, five foundations, one local-first practice.

Move between guided-meditation authoring, measured speech, live interpreting, a voice companion, lyric video, delivery validation, keeping a Downloads folder empty, and the small field tools that support all of them, on one voice, one speech engine and one hearing layer they share.

01 / JOURNEYSmacOS

Gateway Forge

Assemble guided sessions and keep published maps beside what was actually found.

Explore Gateway Forge →
02 / SPEECHmacOS · Linux · untested: Windows

Voice Forge

A transparent Piper workbench for timing, pronunciation, and honest audio export.

Explore Voice Forge →
03 / VIDEOmacOS · tested on Linux, Windows

Protoke

Karaoke and narration video with a vector visor face that mouths every word.

Explore Protoke →
04 / DELIVERYmacOS · tested on Linux, Windows

Media Preflight

Check a finished file against where it is going, and correct it without touching the original.

Explore Media Preflight →
05 / INTAKEmacOS · tested on Linux · untested: Windows

siphon

Fetch from a link or convert what you already have, without re-encoding what it does not have to.

Explore siphon →
06 / FILINGmacOS · Linux · tested on Windows

auto-sort

Empty the Downloads funnel into structure the folder taught it, and undo any of it.

Explore auto-sort →
07 / INTERPRETINGmacOS · iPhone · iPad · untested: Android

Interpreter

Hear the table in English a few seconds behind, cut at the end of each thought, on your own phone.

Explore Interpreter →
08 / COMPANIONmacOS · iPhone · iPad

companion-forge

A local voice companion for Mac, iPhone and iPad, with a protogen LED-visor face.

Explore companion-forge →
09 / FIELD TOOLSPython · shell

tools-core

Small utilities for audio inspection, corpus work, authoring, and repeatable checks.

Open the toolbox →

Get in touch

If something looks wrong, say so

Bug reports belong in the project that produced them. For everything else, email or Telegram reaches me directly.