Ledger
An append-only event store with typed projections and time-travel queries. Powers reporting for a fintech back office.
I build typed, dependable systems — backends, tooling and the quiet infrastructure that holds products together.
1package dev.sealedclass2 3sealed interface SealedClass {4 val who = "Ivan — Software Engineer"5 6 data object About : SealedClass // who I am7 data object Work : SealedClass // what I've shipped8 data object Writing : SealedClass // what I've learned9 data object Contact : SealedClass // say hello10 11 // exhaustive — nothing else to handle.12}A sealed class has a finite, known set of subtypes — the compiler can reason about all of them. I try to write software, and a career, the same way: a small set of things, each handled exhaustively.
I’m a software engineer focused on backend and systems work — the layers most users never see but always feel. I care about correctness, clear boundaries and code that’s still legible a year later.
My happy place is a strong type system, a fast feedback loop and a problem worth modelling well. I’ve shipped APIs, data pipelines and developer tools, and I like leaving things simpler than I found them.
fun approach() = "simple, typed, tested"
A few things I've designed and shipped. Each one a closed problem, modelled until it stopped surprising me.
An append-only event store with typed projections and time-travel queries. Powers reporting for a fintech back office.
A self-hosted webhook gateway with retries, signing and a replay UI. Handles millions of deliveries a day.
A tiny CLI that turns API schemas into exhaustive, type-safe clients. The project that named this site.
Notes on types, systems and the craft of keeping software boring.
Have a problem that deserves a precise solution? I’m open to select freelance and full-time work.