Luke Oliff.

Engineering.

117 posts

Full-Duplex Voice AI Needs a New ArchitectureOriginalThe PACE paper exposes a fundamental flaw in LLM voice dialogue: the model sees context the user never heard. Full-duplex voice needs a new architecture, not just faster TTS.Voice AI
TIL: GitHub Actions $/ Self-Reference SyntaxOriginalReference actions and workflows in the same repo using $/ syntax. Sibling actions match the running commit automatically, no hardcoded versions.TIL
Claude Fable 5 Built a Raccoon Heist Game From a TweetOriginalSimon Willison built a raccoon heist game with Claude Fable 5 from a 2022 tweet. One prompt, two images, and the model shipped a full 3D browser game.AI
AI Coding, One Year Later: What August 2025 Didn't See ComingOriginalThrowback Thursday. A year ago the best coding model had 200K context and scored 49% on SWE-bench. Today Claude Fable 5 scores 95% with 1M context. Here's the gap model by model.AI
TIL: Generating Audio Waveform Images With ffmpegOriginalffmpeg generates a waveform PNG from any audio file. Visualise silence gaps, volume levels, and speech patterns without a DAW.TIL
TIL: git history fixup replaces the autosquash danceOriginalGit 2.55's experimental git history fixup folds staged changes into an earlier commit in one command. I built it from source and ran it.TIL
MCP Goes Stateless on Monday: What Breaks and WhyOriginalThe MCP 2026-07-28 spec removes the initialize handshake and session IDs. I read the release candidate and wrote a stateless handler.AI
TIL: Playing Audio From the Terminal With SoX PlayOriginalplay (from SoX) plays any audio file through your speakers with one command. No media player needed when you are already in the terminal.TIL
Six tools that power production voice agentsOriginalBuilding a production voice agent takes more than an API key. Here are six tools I reached for daily at Deepgram, from streaming STT to async Python.Developer Experience
When SDKs Write Themselves: Voice API Code GenerationOriginalDeepgram switched from hand-rolled SDKs to spec-first generation with Fern. Here is what that looked like across five languages and how it changed shipping voice APIs.Developer Experience
TIL: Encoding Files as Base64 in the TerminalOriginalbase64 encodes any file into text-safe output. Embed small audio clips or images inline in JSON payloads without hosting them somewhere.TIL
5 command-line tools for shipping voice agentsOriginalBuilding voice agents means living in a terminal. Here are five CLI tools I use every day for audio debugging, API testing, and latency measurement.Developer Experience
Friday fun: my .zshrc has more aliases than I have memoryOriginalI opened my .zshrc for the first time in months and found aliases I don't remember writing, for tools I don't remember installing. This is what I found.Developer Experience
What multilingual voice agents cost: latency and complexityOriginalBuilding a voice agent that handles ten languages without falling over is harder than it sounds. Here's what the architecture actually costs.Voice AI
TIL: Debugging Pipelines With the tee CommandOriginaltee reads from stdin and writes to stdout and files at the same time. Debug complex shell pipelines and save intermediate data without breaking the chain.TIL
Testing 10 languages with one macOS commandOriginalThe macOS say command generates speech in ten languages. I used it to test a multilingual STT model without installing any audio tooling.TIL
Five SDKs, one streaming API: a maintenance retrospectiveOriginalMaintaining five SDKs for one streaming voice API taught me things about developer experience that no spec review ever could. Here is what I learned.Developer Experience
What nobody tells you about audio in speech-to-textOriginalProduction speech-to-text needs preprocessing sample rate, encoding, and chunk sizes. The docs skip these. Years debugging production STT taught me what matters.Developer Experience
ffmpeg taught me more about voice AI than the docs didOriginalThe first time I debugged a voice AI integration, ffmpeg saved me. It is still the most useful tool in my kit, and it is not even designed for voice.Developer Experience
Why Speaker Diarization Is the Hardest Problem in Voice AIOriginalSpeaker diarization figures out who spoke when. It sounds simple. It is not. Here is why it breaks, and what it takes to get right.Voice AI
TIL: What afinfo Reveals About Your Audio FilesOriginalafinfo prints every audio file property macOS knows about: sample rate, channels, bit depth, duration, and codec. Essential for debugging STT pipeline issues.TIL
Friday fun: inspecting audio files from my terminalOriginalsoxi shows audio file metadata like sample rate, duration, and channels from the command line. Inspect files before sending them to any voice API.TIL
How voice AI SDKs handle things REST clients never have toOriginalBuilding SDKs for streaming voice APIs means managing WebSocket state, audio buffers, reconnection, and backpressure. REST client patterns break immediately.Developer Experience
TIL: Measuring API Response Times With curl -wOriginalcurl -w prints timing details like time_total, time_connect, and time_starttransfer after every request. Profile API latency from the terminal.TIL
5 habits that reduce voice AI debuggingOriginalMost voice AI debugging time goes to problems that follow a pattern. Here are five habits I built at Deepgram that catch those patterns before they become incidents.Engineering
Friday fun: bat is cat with syntax highlightingOriginalbat shows file contents with syntax highlighting, line numbers, and a pager. It replaces cat with the same muscle memory and a lot more useful output.TIL
The invisible work of voice AI SDKsOriginalFour years of maintaining voice AI SDKs across half a dozen languages. The work that never makes the changelog.Developer Experience
How streaming speech recognition worksOriginalStreaming speech-to-text sends audio chunks over WebSocket. Acoustic models, language models, and decoders explain the latency-accuracy tradeoff.Engineering
TIL: ffprobe for audio file inspectionOriginalffprobe shows sample rate, channels, duration, and codec of any audio file. Check audio format before sending it to a speech-to-text API.TIL
5 questions I ask before integrating a streaming APIOriginalConnection drops, backpressure, and wire formats. Five questions I ask every streaming API before building on it, learned from voice AI integrations.Developer Experience
Friday fun: generating test tones for voice AI pipelinesOriginalsox synth generates test audio files from scratch at any sample rate and duration. No microphone needed for speech API development.TIL
Inside the Streaming Cascade Powering Voice AIOriginalReal-time voice agents chain three models over streaming connections. Here's how the cascade architecture works and where every millisecond goes.Voice AI
TIL: pv shows you what is flowing through your pipesOriginalpv (Pipe Viewer) sits between two commands in a pipeline and reports how fast data is moving. It is a progress bar for pipes.TIL
Sunday roundup: two posts, a fresh startOriginalTwo posts from the first weekend of daily writing on lukeocodes.dev. Terminal STT streaming, WebSocket audio patterns, and GPT-5.4-Cyber.Developer Experience
Five WebSocket patterns for real-time audio streamingOriginalStreaming audio WebSockets need reconnect logic, backpressure, heartbeats, and graceful shutdown. Five patterns covering the full connection lifecycle.Engineering
Friday fun: live speech to text from the terminalOriginalrec captures mic audio, websocat streams it to a WebSocket STT API, and the terminal shows the transcript in real time. No GUI needed.TIL
SDKs for Streaming APIs Are DifferentOriginalREST SDK patterns stop working when your API never closes the connection. Streaming audio needs reconnect logic, backpressure, and graceful shutdown baked in from day one.Engineering
TIL: Comparing Files Side By Side With diff -yOriginaldiff -y prints two files side by side with differences highlighted. Spot what changed in a config file without looking at two separate tabs.TIL
TIL: Testing Network Latency With ping Custom Payload SizesOriginalping -s sends packets larger than the default 56 bytes. Test how your connection handles audio-sized payloads before blaming the API.TIL
TIL: Running TypeScript Directly With tsxOriginaltsx executes TypeScript files with zero config using esbuild under the hood. Faster than ts-node and handles ESM and CJS automatically.TIL
TIL: Chaining Shell Commands With && vs ; vs ||Original&& runs next only on success, ; runs unconditionally, || runs only on failure. Choosing the right operator prevents silent cascade failures in CI.TIL
TIL: Finding Processes on a Port With lsof -iOriginallsof -i :PORT shows which process is holding a port. End the 'what is already running on 3000' guessing game for good.TIL
TIL: Reading Gzip Files Without Decompressing With zcatOriginalzcat pipes decompressed content to stdout without writing a temp file. Read compressed logs, CSVs, or JSON straight into your pipeline.TIL
TIL: Comparing Directory Trees With diff -rOriginaldiff -r compares two directories recursively, showing every file that differs. Verify that a build output matches between two branches.TIL
TIL: Generating Trusted Local HTTPS Certs With mkcertOriginalmkcert creates locally-trusted TLS certificates in one command. Your browser trusts them instantly — no more self-signed cert warnings.TIL
TIL: Running TypeScript Directly With ts-nodeOriginalts-node compiles and executes TypeScript in memory. No build step needed for quick scripts, REPL sessions, or SDK example testing.TIL
TIL: Finding Disk Usage Per Directory With du -shOriginaldu -sh gives a human-readable total per directory. Find the largest space hogs on a drive without clicking through a GUI.TIL
TIL: Deduplicating Lines With sort -uOriginalsort -u sorts and removes duplicate lines in one pass. Clean up word lists, logs, and API response extracts without writing a script.TIL
TIL: Formatting Terminal Output Into Tables With columnOriginalcolumn -t aligns whitespace-separated data into clean columns. Pipe any command output through it for instantly readable tables.TIL
TIL: Mirroring Sites With wget Recursive ModeOriginalwget -r downloads an entire site recursively. Useful for offline reference copies of documentation when you are without internet.TIL
TIL: Structuring Monorepos With TypeScript Project ReferencesOriginalTypeScript project references let you split a codebase into composable packages. Each reference builds independently and incremental builds get faster.TIL
TIL: Speeding Up GitHub Operations With gh AliasesOriginalgh alias set maps custom shortcuts to any gh command. Common workflows become two-word commands instead of multi-flag incantations.TIL
TIL: Building JSON Payloads in Shell Scripts With jqOriginaljq constructs valid JSON from variables without string concatenation. No more broken payloads from missing quotes or unescaped characters.TIL
TIL: Checking SSL Certificate Expiry With opensslOriginalopenssl connects to any TLS endpoint and prints the certificate details including expiry date. Automate cert monitoring in a cron job.TIL
TIL: Benchmarking Commands With hyperfineOriginalhyperfine runs a command multiple times and reports min, max, mean, and standard deviation. Compare tool performance with statistical confidence.TIL
TIL: Visualising Directory Structures With treeOriginaltree prints a directory as a nested tree diagram. Perfect for documenting project layouts in READMEs or during onboarding walkthroughs.TIL
TIL: Interactive Staging With git add -pOriginalgit add -p shows each change hunk by hunk and asks whether to stage it. Commit only the relevant parts of a messy working tree.TIL
TIL: Auto-Running Commands on File Change With entrOriginalentr runs a command every time a watched file changes. Pipe a list of files in, get automatic re-runs out. Lighter than nodemon.TIL
TIL: Running Containers Without Docker With PodmanOriginalPodman runs OCI containers with the same CLI as Docker but daemonless and rootless by default. No Docker Desktop needed.TIL
TIL: Quick Network Debugging With nc (netcat)Originalnc opens raw TCP connections from the terminal. Test if a port is open, send raw HTTP requests, or set up a one-off chat between machines.TIL
TIL: Converting Markdown to PDF With pandocOriginalpandoc turns any Markdown file into a styled PDF with one command. Great for generating docs that non-technical stakeholders can open.TIL
TIL: Using grep -P for Perl-Compatible Regex in the TerminalOriginalgrep -P gives you full Perl regex syntax — lookaheads, non-capturing groups, and character class shortcuts the basic syntax lacks.TIL
TIL: Scripting WebSocket Tests With websocatOriginalwebsocat connects to WebSocket servers from the terminal and pipes data in both directions. Better than wscat for automated testing.TIL
TIL: Creating Python Packages With pyproject.tomlOriginalpyproject.toml replaces setup.py as the standard Python packaging config. One file declares dependencies, build system, and metadata.TIL
TIL: Testing npm Packages Locally With npm linkOriginalnpm link creates a symlink so your local package behaves like an installed one. Test SDK changes in a real project before publishing.TIL
TIL: Managing Processes With pgrep and pkillOriginalpgrep finds processes by name. pkill kills them. No more ps aux | grep to find and kill a runaway Node process.TIL
TIL: Installing Specific Tool Versions With asdfOriginalasdf manages multiple language runtimes from one tool. A single .tool-versions file pins Node.js, Python, and everything else per project.TIL
TIL: Monitoring File Changes With inotifywait on LinuxOriginalinotifywait blocks until a file or directory changes, then exits. Use it in scripts to trigger actions when new files appear.TIL
TIL: Debugging APIs With httpieOriginalhttpie formats JSON responses, highlights syntax, and shows headers by default. One command is often clearer than curl for exploratory API work.TIL
TIL: Recording Terminal Sessions as SVGs With termtosvgOriginaltermtosvg records your terminal session and outputs an SVG file. Embeddable in docs, zoomable, and smaller than a GIF.TIL
TIL: Parallel Processing in Node.js With worker_threadsOriginalworker_threads runs JavaScript in parallel without the overhead of child processes. Distribute CPU-heavy work across available cores.TIL
TIL: Generating WAV Files at a Specific Sample Rate With SoXOriginalsox generates or converts audio to any sample rate, bit depth, and channel count. Create test fixtures that match your API's exact requirements.TIL
TIL: Batch File Operations With find -execOriginalfind -exec runs any command on every matching file. Bulk rename, convert, or delete without writing a loop or a script.TIL
TIL: Merging PDF Files With pdfuniteOriginalpdfunite combines multiple PDFs into one in a single command. No Adobe subscription, no drag-and-drop, just file paths.TIL
TIL: Implementing Exponential Backoff in TypeScriptOriginalA simple retry loop with exponentially increasing delays handles transient API failures. Add jitter to avoid thundering herd on recovery.TIL
TIL: Finding Duplicate Files With fdupesOriginalfdupes scans a directory tree for duplicate files by comparing checksums. Reclaim disk space from accidental copies and repeated downloads.TIL
TIL: Processing STT Word Timestamps With awkOriginalawk parses word-level timestamps from STT output in one line. Extract, filter, and reformat without importing a CSV library.TIL
TIL: Using set -e and set -x in Bash ScriptsOriginalset -e exits on any error. set -x prints every command before running it. Together they make shell scripts fail fast and show their work.TIL
TIL: Trimming Silence From Audio Files With SoXOriginalsox detects and removes silence from audio files automatically. Clean up recordings before processing without a GUI editor.TIL
TIL: Creating Python Virtual Environments With venvOriginalpython -m venv creates an isolated environment with its own packages. No more conflicts between projects needing different library versions.TIL
TIL: Auto-Restarting Node.js Processes With nodemonOriginalnodemon watches your source files and restarts the process on any change. No manual Ctrl-C up-arrow-enter cycle during development.TIL
TIL: Parsing Command-Line Arguments With Python's argparseOriginalargparse generates --help text, validates types, and parses positional and optional arguments. Built into Python, no third-party deps.TIL
TIL: Using tmux for Persistent Terminal SessionsOriginaltmux keeps your terminal session alive when you disconnect. Reattach from anywhere — long-running processes survive SSH drops.TIL
TIL: Checking File Integrity With shasumOriginalshasum computes a SHA hash of any file. Compare hashes before and after transfer to catch corruption — no extra tools needed.TIL
TIL: Configuring pre-commit Hooks for Python and Node ReposOriginalpre-commit runs linters and formatters on every git commit. A .pre-commit-config.yaml enforces the same checks across every contributor.TIL
TIL: Testing CLI Tools With pytest in PythonOriginalpytest with subprocess or click's test runner validates CLI output, exit codes, and error messages without manual terminal checks.TIL
TIL: Semantic Versioning With the semver CLIOriginalThe semver CLI validates, compares, and increments version strings from the terminal. No more manual math on MAJOR.MINOR.PATCH.TIL
TIL: Concurrent API Calls With asyncio in PythonOriginalasyncio runs multiple network requests concurrently without threads. gather() collects results as they finish, cutting wall-clock time dramatically.TIL
TIL: Building a CLI Tool With commander.js in Node.jsOriginalcommander.js parses flags, subcommands, and help text from a declarative config. A working CLI takes about ten lines of setup.TIL
TIL: Streaming JSON Parsing With ijson for Large ResponsesOriginalijson parses JSON as it streams in, skipping the full parse. Handles multi-gigabyte responses without running out of memory.TIL
TIL: Converting Audio Formats With ffmpeg in One CommandOriginalffmpeg converts between any audio format with a single command. WAV to MP3, FLAC to OGG, sample rate changes, channel mapping — all in one line.TIL
TIL: Handling WebSocket Streams With the websockets Library in PythonOriginalPython's websockets library opens a persistent connection in a few lines of async code. No polling, no HTTP overhead, just messages in both directions.TIL
TIL: Running GitHub Actions Locally With actOriginalact runs your GitHub Actions workflows on your machine using Docker. No push-and-pray, iterate locally first.TIL
TIL: Creating Tarballs With tar for Deployment PackagesOriginaltar bundles a directory into a single file preserving permissions and structure. One command packages your entire deployable artifact.TIL
TIL: Using git bisect To Find the Commit That Broke a BuildOriginalgit bisect does a binary search through your history to find the exact commit that introduced a bug. Mark good and bad, it does the rest.TIL
TIL: Redirect and Rewrite Rules With Plain _redirects FilesOriginalA _redirects file maps old paths to new ones with one rule per line. No config parser, no build step, just deploy and it works.TIL
TIL: Profiling Node.js Build Performance With node --profOriginalnode --prof generates a V8 tick profile of your script. Process it with --prof-process and see exactly where every millisecond went.TIL
TIL: Using diff and patch for Incremental File ChangesOriginaldiff produces a patch file describing what changed. patch applies it elsewhere. No git required for sharing small fixes between environments.TIL
TIL: Validating JSON Schemas With Ajv in Node.jsOriginalAjv validates JSON payloads against a schema in milliseconds. Define your shape once and reject bad data before it reaches your logic.TIL
TIL: Creating Named Pipes With mkfifo for IPCOriginalmkfifo creates a named pipe that acts like a file but connects two processes. One writes, the other reads, zero network overhead.TIL
TIL: Stripping ANSI Escape Codes From Terminal OutputOriginalColoured terminal output looks great until you pipe it to a file. The sed command strips ANSI codes cleanly, leaving plain text.TIL
TIL: Testing HTTP Endpoints Locally With httpbinOriginalhttpbin returns request data as JSON so you can see exactly what your client is sending. No real endpoint needed for debugging.TIL
TIL: Using tee To Split Command Output to File and TerminalOriginalThe tee command writes stdout to a file while still showing it on screen. Perfect for logging builds without losing visibility.TIL
TIL: Generating QR Codes in the Terminal With qrencodeOriginalqrencode turns any text into a QR code in one command. Pipe it to a PNG or straight to the terminal for quick mobile tests.TIL
TIL: Scheduling Recurring Tasks With node-cronOriginalA cron expression and a callback is all node-cron needs to run tasks on a schedule. No system cron, no external dependencies.TIL
TIL: Conditional Git Hooks With core.hooksPathOriginalGit's core.hooksPath lets each repo use its own hooks directory. No more symlinks or global hook collisions across projects.TIL
TIL: Rate-Limiting API Requests With BottleneckOriginalBottleneck queues API calls to stay under rate limits without losing data. Set max concurrent and min delay, then forget it.TIL
TIL: Creating an HTTP Server With the Node.js http ModuleOriginalNode's built-in http module creates a working server in five lines. No Express, no dependencies, just a callback and a port.TIL
TIL: Managing Environment Variables With .env Files in Node.jsOriginalA .env file keeps API keys and config out of your code. The dotenv package loads them into process.env with zero config.TIL
TIL: Testing Webhooks With curlOriginalA curl POST to your webhook endpoint with a JSON body simulates any provider. No dashboard, no test suite, just response codes and latency.TIL
TIL: Debugging Node.js With the Built-in InspectorOriginalnode --inspect opens Chrome DevTools for your server process. Breakpoints, heap snapshots, profiling — no console.log needed.TIL
TIL: Lazy Loading Vue Router Routes With Dynamic ImportsOriginalA dynamic import in your router config splits your Vue bundle per route. Pages load on demand instead of all at once.TIL
TIL: Chaining Promises With Async Await in Node.jsOriginalAsync await turns nested .then chains into flat readable code. One async function wrapper is all it takes to clean up any Node.js callback mess.TIL
TIL: Recording Terminal Sessions With script and scriptreplayOriginalThe script command records everything in your terminal to a file. scriptreplay plays it back. Built into macOS and Linux, zero install.TIL
TIL: Parsing JSON API Responses With jq in the TerminalOriginalPipe any JSON response into jq and get coloured, filtered, transformed output without opening a file or writing a parser.TIL
TIL: Forwarding Localhost With ngrok for Webhook DevOriginalOne ngrok command gives any local server a public HTTPS URL. Webhook testing goes from impossible to trivial in under five seconds.TIL
TIL: Testing WebSocket Connections With wscatOriginalA single wscat command opens an interactive WebSocket session to any endpoint. No browser, no boilerplate, just connect and send messages.TIL