Category
Technical Notes
Reading paths
Read end to end.
Building an AI Podcast Index
An eight-part build-along: a locally-running tool that ingests a YouTube podcast channel, extracts guests and topics, lets you clip-search by intent, and generates questions for future episodes — using uv, FastAPI, Vite + React, and a provider-switchable LLM client.
Start →Python Monorepos in 2026
A five-part series on building Python monorepos with uv workspaces — package boundaries, Pydantic-to-TypeScript shared schemas, a Vite + React frontend co-living with FastAPI, and CI that scales.
Start →uv: the 2026 Python toolchain
A six-part series on uv — why it replaces pip, venv, pyenv, pipx, and pip-tools; how to start a new Python project in 2026; and a pragmatic migration path that keeps requirements.txt where it earns its keep.
Start →Browse all series →
See every reading path on the site.
- · 3 min read
The React side: guest pages, search UI, and codegen'd types
A Vite + React SPA with three real pages — popular guests, guest detail, search — wired to FastAPI through codegen'd TypeScript types from a shared Pydantic schema. No UI framework, five components, type-safe end to end.
- · 3 min read
The question generator, the cron job, and shipping it locally
Grounded question generation is one prompt away. Wrap the project with a local cron, a one-line backup, and a popular-guests landing query — and the podcast index runs on its own.
- · 3 min read
Ingesting YouTube transcripts: the YT Data API path, with yt-dlp + Whisper as honest fallback
YouTube's Data API is the right primary path for transcripts. yt-dlp + local Whisper is the fallback when captions are missing — used carefully, documented honestly, and quota-aware.
- · 3 min read
Search without embeddings: Postgres tsvector, LLM rerank, and 30-second clips
For a few hundred podcast episodes, Postgres full-text search plus an LLM rerank beats embedding-based RAG on both quality and operational simplicity. No vector DB, no embedding pipeline.
- · 3 min read
Taming a polyglot monorepo: Taskfile, selective CI, and reproducible setup
A monorepo's developer experience is mostly a Taskfile plus a CI workflow. Both should answer one question: what changed, and what depends on what changed?
- · 3 min read
Building a provider-switching LLM client: one interface, three providers, task-tier routing
A 60-line adapter package lets you swap Anthropic, OpenAI, and local Ollama via an env var, route cheap classification to Haiku and synthesis to Opus, and add prompt caching without touching call sites.
- · 3 min read
Entity resolution for guests: fuzzy matching first, LLM disambiguation second
The same person shows up as 'Bibhusan Bista', 'Bibhusan B.', and 'B. Bista' across three episodes. Don't ask the LLM first — try cheap deterministic matching, then escalate only the ambiguous cases.
- · 3 min read
A Vite + React SPA inside a uv monorepo: pnpm-workspace, dev proxy, shared types
Two workspace managers minding their own business — uv for Python, pnpm for JS, with a thin Taskfile on top so you never have to remember both.
- · 3 min read
The killer monorepo argument: Pydantic models, codegen'd to TypeScript, consumed by React
A 20-line codegen pipeline turns Pydantic into JSON Schema into TypeScript. Rename a field on the backend and the frontend stops compiling. That's the whole point of a polyglot monorepo.
- · 3 min read
Structured extraction with Pydantic + Claude: guests, topics, and quotes from raw transcripts
Schema-first prompting with Pydantic + Anthropic tool use, tiered routing between Haiku and Sonnet, prompt caching for the system block, and a single retry that feeds the validation error back into the prompt.