About the service
I'm a Clojure developer and I create functional backend services and data processing applications running on the JVM. At the core of my work lie immutable data structures, pure functions and a compositional style where a program is built from small, clearly-named pieces you can actually reason about. Since Clojure is a Lisp, my main tool is the REPL: I grow a program interactively, evaluate expressions directly on live data and refine design as I go, rather than guessing everything upfront and debugging later. It's a distinct discipline, unlike working with Java, Scala or Elixir, and I approach it as a craft of its own, not Java with parentheses.
On multithreading I use honestly the tools the language gives: atoms, refs, agents and core.async channels — by task, not by fashion. I've built REST and streaming HTTP services on Ring and reitit, described data via spec and Malli, worked with Postgres via next.jdbc and HoneySQL, processed large volumes with transducers and lazy sequences so memory stays flat. I care about careful integration with the surrounding JVM ecosystem, sensible error handling and boring-in-a-good-way deploys. If code has sprawled into tangled state, I bring it back to a clean core and thin edges with effects.
If you have a service that must be correct under load, a data pipeline that must stay maintainable, or a Clojure project stuck halfway through, I'll pick it up and move it forward. I write tests that fix behavior, document complex spots and leave a healthy REPL process so the next person is productive from day one.
— Backend services in Clojure and ClojureScript for JVM
— REST and streaming APIs on Ring, reitit and core.async
— Data modeling and validation via clojure.spec and Malli
— Working with Postgres via next.jdbc, HoneySQL and connection pooling
— Multithreading with atoms, refs, agents and channels
— Transducers, lazy sequences, large volume processing
— REPL-driven development, tests and refactoring to pure functions
On multithreading I use honestly the tools the language gives: atoms, refs, agents and core.async channels — by task, not by fashion. I've built REST and streaming HTTP services on Ring and reitit, described data via spec and Malli, worked with Postgres via next.jdbc and HoneySQL, processed large volumes with transducers and lazy sequences so memory stays flat. I care about careful integration with the surrounding JVM ecosystem, sensible error handling and boring-in-a-good-way deploys. If code has sprawled into tangled state, I bring it back to a clean core and thin edges with effects.
If you have a service that must be correct under load, a data pipeline that must stay maintainable, or a Clojure project stuck halfway through, I'll pick it up and move it forward. I write tests that fix behavior, document complex spots and leave a healthy REPL process so the next person is productive from day one.
— Backend services in Clojure and ClojureScript for JVM
— REST and streaming APIs on Ring, reitit and core.async
— Data modeling and validation via clojure.spec and Malli
— Working with Postgres via next.jdbc, HoneySQL and connection pooling
— Multithreading with atoms, refs, agents and channels
— Transducers, lazy sequences, large volume processing
— REPL-driven development, tests and refactoring to pure functions