Calling Claude from Scala with the official Java SDK
There is no Scala SDK for Claude, and you don't need one: anthropic-java inside a Play 3 app, async end to end, behind one small trait. Plus the Jackson classpath trap that compiles fine and fails later.
1 Nov 2026
·
5 min read
·20 views
Security and privacy, in practice
Adding Claude Haiku to my CV builder: sign-in first, a spend cap, and a fallback
BuildCV ran entirely in the browser. Here is how I added four opt-in Claude Haiku 5.5 actions on my own API credit: behind LinkedIn sign-in, capped three ways, falling back to built-in coaching when the money runs out, plus what the first real calls got wrong.
31 Oct 2026
·
8 min read
·42 views
Working with Claude Code
Spec-Driven Iteration with Claude Code: Taming Requirements That Won't Sit Still
When requirements keep changing, the expensive part is not the code. It is re-explaining everything each session. A method that keeps the spec in the repo and treats every pivot as a reviewed delta.
28 Oct 2026
·
10 min read
·69 views
Guice and play and escaping DI hell
·
Part 4
Guice and Play, part 4: teaching Guice to build what it can't
A Provider class for the MongoDB client, a @Provides method for the database, and @Named qualifiers for two clocks of the same type, with the real errors Guice prints when I get it wrong.
25 Oct 2026
·
5 min read
·52 views
Guice and play and escaping DI hell
·
Part 3
Guice and Play, part 3: eager doesn't mean at boot
A MongoDB client as an eager singleton, closed by an ApplicationLifecycle stop hook. Why sbt run printed nothing until the first request, and why my tests built three clients.
25 Oct 2026
·
5 min read
·42 views
Cats Core
·
Part 9
Cats Core, Part 7: Eq and the Comparisons == Lets Through
Scala's == compares any two values, so a TodoId against a String compiles and returns false. Cats' Eq makes that a type error, explains why Some(1) === None fails, and lets me decide which fields count as equal.
23 Oct 2026
·
5 min read
·49 views
Guice and play and escaping DI hell
·
Part 2
Guice and Play, part 2: the moment Guice can't guess
A test that could not pass forced my first trait into the graph. @ImplementedBy, a root Module, a test that builds the real Guice graph, and the error Guice prints when a binding is missing.
23 Oct 2026
·
5 min read
·52 views
Guice and play and escaping DI hell
·
Part 1
Guice and Play, part 1: I deleted my wiring file and Guice built the graph
At work I wire Play apps by hand with the cake pattern. In my own projects I switched a Play 3 template to Guice: one deleted config line, one @Inject(), and a timestamp that made me think Guice was broken.
23 Oct 2026
·
6 min read
·46 views
Blog search with one Postgres trigger: tsvector, Anorm and snippets that never trust HTML
How this blog's search works end to end: a weighted tsvector side table kept by a trigger, a thin Anorm query with websearch_to_tsquery and ts_rank, and highlighted snippets split on control characters instead of rendered HTML.
22 Oct 2026
·
5 min read
·52 views
Scala and the JVM
·
Part 20
unapply decides what catch catches: Scala extractors in match and try/catch
A hand-written unapply turns a catch block into a policy: pass your own errors through, wrap recoverable JVM exceptions, and let fatal ones propagate. A runnable Scala 2.13 demo shows exactly when the matcher calls it.
19 Oct 2026
·
5 min read
·50 views