Blog
Notes on shipping software.
The bug that lived in the gap between two services
Two services computed 'sold' two different ways. The admin got a 409 Conflict that made no sense from either seat. The bug wasn't in either service — it was in the gap between them, and a contract test stops the next one.
#microservices#debugging#distributed-systems#war-storyWhy we passed EntityManager as a parameter
A stock-drift bug nobody could reproduce locally. The fix was a function signature change — stop injecting EntityManager into NestJS singletons, pass it per-request instead.
#nestjs#typescript#concurrency#dependency-injection#war-storyHiring managers read your build choices, not your About page
Every technical decision in furevikstrand.cloud was also a hiring signal — three-tier degradation, a self-hosted dashboard, a shared code path. None of it shows on a CV; all of it shows in the repo and the live site.
#hiring#careeradvice#portfolio#softwareengineeringI built my own analytics to see what visitors ask my chat
/admin is a server-rendered, basic-auth gated Next.js page that reads chat events from MySQL — 13 panels covering traffic and chat, including a misses queue that turns spotted gaps into shipped answers in about 30 seconds.
#admin#analytics#selfhosted#privacy#mysql#nextjsAn AI chat that doesn't break when the API key expires
Three tiers of graceful degradation — Claude, Ollama, and a pure-TypeScript keyword matcher — keep the chat working even if my API balance hits zero or my LLM server goes offline.
#chat#claude#ollama#typescript#nextjs