back

Words

Thoughts on code, music, and everything in between.

Two voice embeddings compared with a similarity score

Making a Voice Login: The Backend, Part 2

ECAPA-TDNN embeddings, cosine similarity, the median aggregation, the hand-picked threshold, and how sessions and rate limits hold the door.

Sep 29, 2026#voice#python#recognition
An audio signal flowing through the processing pipeline

Making a Voice Login: The Backend

Turning an untrusted browser blob into a clean 16 kHz mono speech sample: ffprobe, ffmpeg, Silero VAD, hull trimming, and the failure modes in between.

Sep 28, 2026#voice#python#fastapi
A microphone with an audio waveform

Making a Voice Login: The Idea

Why I built VoiceID, a passwordless voice login, and how the frontend records your voice. MIME negotiation, the never-sent prompts, and staged registration.

Sep 27, 2026#voice#nextjs#typescript
Source code to AST diagram

Making a Programming Language

A step-by-step guide to building your own programming language in TypeScript, covering lexing, parsing, evaluation, variables, math, arrays, and more.

May 18, 2026#typescript#compilers
Source code being split into tokens

Making a Language: The Lexer

Building the lexer for Spark, turning source code into tokens with line/column tracking, comments, and escape sequences.

May 18, 2026#typescript#compilers
Token stream being parsed into an AST

Making a Language: The Parser

Building a recursive descent parser with precedence climbing for Spark's expressions, statements, and control flow.

May 18, 2026#typescript#compilers
AST nodes being evaluated

Making a Language: The Evaluator

Building Spark's evaluator, covering environments, closures, operator overloading, return signals, and error reporting.

May 18, 2026#typescript#compilers
Spark code in a playground

Making a Language: Using Spark

Tying everything together, the run function, complete Spark examples, and exercises for extending the language.

May 18, 2026#typescript#compilers