A running log of what I'm actively working on — products, experiments, and side projects.
Debugging: the unstable_cache fetch-cache was surviving dev server restarts and serving stale timeline data even after installing a new profile pack. Root cause: Next.js persists the fetch cache to .next/dev/cache/fetch-cache/ on disk. Fix: replaced revalidateTag(tag, 'max') — which silently throws when cacheLifeProfiles['max'] is not found — with bustTag() using inline CacheLifeConfig { expire: 0 }.
Shipped profile pack system — export, import, install, version history, and contract validation all working. You can now swap the entire portfolio identity (name, bio, projects, blog posts) in one click. Demo: install maya.pack.zip, site becomes Maya Chen's portfolio instantly. Reinstall karanveer pack, back to mine.
Squashed 41 database migrations into a single 0000_baseline.sql. The migration journal was getting unwieldy and causing issues on fresh installs. Did a full smoke test on an empty DB — all routes returning expected data, no orphaned FK references.
Portfolio AI assistant now has 5 layers of context: static profile knowledge, live DB query tools, semantic search over blog posts via Qdrant, a streaming UI with typing indicators, and tool-call visibility for transparency. The hardest layer was the semantic search — had to tune chunk size and overlap to get relevant blog excerpts without truncating mid-sentence.
Running Flux locally on M1 Max for the OTT platform's thumbnail generation pipeline. 512x512 images generating in ~8 seconds on CPU (no GPU on M1 — it uses ANE but Flux doesn't support it). Good enough for batch processing overnight, not for real-time. Production will use a cloud GPU for thumbnails.
Docsee TUI (Ratatui) hit 10,310 lines of Rust. Implemented proper vim-style keybinding system with modal input (normal/insert/visual modes). The hardest part was getting the event loop right — Ratatui's draw loop and crossterm's event polling need careful interleaving to avoid frame tearing.
Learning Ratatui constraint system properly. Spent 3 hours thinking my layout was broken before realizing I was using Constraint::Percentage on a parent that already had Min/Max constraints set. The tiling engine is more like a flexbox than I expected — you need to think about fill vs fixed before writing any layout code.
Karmpath load testing with k6: 10K concurrent users at sustained load, p95 latency 340ms, p99 590ms. Redis caching the workflow state snapshots is what makes those numbers possible — without it, the Postgres query pattern would fall over at ~2K concurrent. Still want to get p99 under 400ms before I'm happy.
Config-pilot v0.8 — added Caddy config validation via dry-run before writing. Previously a bad Caddy config would apply immediately and take down all reverse-proxied services. Now it runs caddy validate --config against the new config file before the atomic swap. Takes 200ms but prevents outages.
MCP server count hit 23 across the Prachyam stack. New additions: env-config-mcp (Infisical integration, 34 tools), feature-flags-mcp (Flipt + Statsig, 18 tools), monitoring-mcp (Prometheus + Grafana queries, 12 tools). Claude now has full visibility into infra state without me writing a custom prompt each time.
Mailcow race condition fix shipped. Root cause: concurrent SMTP workers were both reading the same unsent batch, processing it, and writing send receipts simultaneously. Fixed with a Postgres advisory lock on the batch selection query. No more duplicate emails — monitored for 72 hours, zero duplicates.
Blocker: Tailscale mesh went down at 2am because the exit node (the iMac) dropped off after a macOS sleep policy change. Three projects' staging environments were unreachable. Fixed with a LaunchDaemon that prevents sleep when Tailscale has active connections and adds auto-reconnect on wake.