Archives
- 11 Nov Keeping call audio alive in the background by registering in-app calls with the OS
- 10 Nov Managing server env files with GitHub Environment Secrets and Kamal, hiding values but keeping failure reasons
- 09 Nov Measuring and cutting monorepo deploy time, from a 35-minute full backend deploy to 13
- 04 Nov Zero-downtime deploys on an on-prem server with Kamal
- 03 Nov Roles changed, but the old ones kept working for 30 minutes: putting a permission version in the JWT
- 03 Nov Stopping scheduled jobs from running twice during zero-downtime deploys with ShedLock
- 02 Nov Adding circuit breakers to internal service calls, and switching permission checks from fail-open to fail-closed
- 28 Oct Automating App Store and Google Play uploads with fastlane
- 27 Oct One harness for Claude Code and Codex — from CLAUDE.md to AGENTS.md
- 27 Oct Upgrading to Spring Boot 4, and finding out our LAZY was really EAGER because the entities were final
- 20 Oct Where does next start read next.config from? Three run-ins with a Docker runtime image
- 08 Oct AI in the product — why I pulled the chat assistant after 5 days, and brought it back 4 months later as a document judge
- 04 Oct Moving six subdomains under one host's basePath: four zero-downtime stages, and where Next doesn't add the prefix
- 04 Sep Why I rolled back refresh token rotation after one day
- 03 Sep A LiveKit call-ending race: when a REST leave and a webhook change the same state
- 28 Jul Why the unread badge was wrong three times: from a client-side counter to a server count
- 24 Jul Why WebSockets quietly die in background tabs: four causes behind the same banner
- 23 Jun A subagent merged a PR under my name — permissions you shouldn't give an agent
- 16 Jun Login returns 200 but the cookie disappears: NextResponse.cookies is keyed by name only
- 07 May Teaching the repo to agents — CLAUDE.md, memory/, hooks and skills
- 16 Apr From autocomplete to agents — bringing a coding agent into a backend I'd been writing alone
- 08 Dec Getting entities out of the web app — splitting domain modules from API modules
- 08 Dec A locked_yn nobody ever set to true — computing the period lock from dates instead of a flag
- 05 Dec Building a transaction statement PDF with PDFBox — coordinates start at the bottom left
- 16 Jun If nothing gets deleted, don't call it delete — soft deletes with a status column
- 07 Oct Daangn Tech Meetup 2024 notes: Daangn Alba's early strategy, the chat system, an Istio outage and Daangn Pay networking
- 24 Sep Installing Apache Airflow 2.10 with Conda on macOS
- 12 Sep SLASH24 notes: replay verification, core banking on MySQL, compensating transactions
- 11 Sep With an API Gateway in place, move token authentication into it
- 04 Sep Adding a Lua custom plugin to Kong via a Docker image
- 30 Aug Installing Kong API Gateway and Konga with Docker
- 25 Jul Migrating passwords to SHA-256 without taking the service down
- 24 Jul When the same request hits several servers: a Redisson distributed lock behind one annotation
- 12 Jun Spring Boot 2.7 to 3.3 and Java 11 to 21, in two steps
- 31 Dec 2023 in review: the strategy and criteria behind my first job search
- 27 Oct An N+1 that IN clauses couldn't fix: when @OneToOne lazy loading can't create a proxy
- 15 Oct One method per condition is too many: a cursor-paginated dynamic query in Querydsl
- 11 Oct From 22 queries to 3: replacing a per-user offer lookup with a Querydsl IN clause
- 01 Oct Checking for duplicate emails: findBy vs countBy vs existsBy on 50,000 rows