Open source

Work

I've spent most of my career in small teams, building products while the shape of the problem was still changing. I like getting close to the people who understand that problem, then having room to think through the system and build it.

At Finaloop, bank and marketplace data had to become accounting reports people could trust. I built event-driven and event-sourced pipelines, worked across different database models, and chased reconciliation gaps with accounting and fintech experts. It was distributed systems work with real business consequences, and some fixes had to ship under pressure.

At Prisma, the questions were about tools for other developers. On the experiments team, I worked on query performance insights tooling and a security product exploring bundling, RPC, and FaaS. Later, I worked on the internals of the new Studio and built prisma dev, a local development tool for Prisma Postgres. The work took me from persistence and APIs to SDKs, CLIs, and the occasional dashboard.

Random takes

Posts and replies, in my own words.

  1. Learning in public
    i do have strong opinions here and there, and i don't shy away from testing them, or my intuition/instincts about things, by stating/writing them as a way to learn/adjust if and when i get pushback. i do admit being wrong & show gratitude.
  2. Tests
    i think there needs to be a culture of test removal/refactor, more than simply add tests everywhere. bad tests kill velocity.
  3. Testing real systems
    purist hat on. the one major thing you cannot test with pglite, is transaction isolation. if you have a distributed system that relies heavily on that, you can't avoid spinning up a full-blown postgres instance. it's similar to unit tests, you cannot rely only on unit tests.
  4. Coding agents
    slop coding doesn't decrease org costs when a code review now takes waaay longer because the slop development environment is touching things for no good reason, you have to question everything, and the submitter has no recall why things were changed/added. change my mind.
  5. Abstractions
    people obssessing over DRY this DRY that like they've read "clean code" yesterday, need to hear this. Premature abstractions are a road full of pain, more often than not. And nope, you're not smarter than the good people that maintain the library you're about to wrap.
  6. Application code
    The more I got involved with library TS code, the less I wanted to do non-basic TS code in applications. A lot of people go ham with complex shit in application code to scratch an itch, they don't have an outlet.
  7. Contracts
    Return types are a must on exported functions and public class methods. Contracts are important, both for consumers and for maintenance of given functionality. Internals can be inferred or defined, depends on the complexity of the inferred type.
  8. Users first
    Do yourself a favor, learn SQL. It's not as hard as some authors/vendors make you believe. Optimize for app's User eXperience, not Developer eXperience (it's also important, not as important). Pick predictable tools that empower you & get out the way.
  9. Hiring
    when i interview people for an application-level typescript role, i wanna see application-level stuff. no wizardry. i wanna see you write some very maintainable, simple and type-safe code. ecosystem awareness. designs with extensibility in mind.
  10. Judgment
    be pragmatic. know when to steer and teach by example. know when to take your hands off the wheel. its about type of work and feel. don't ever lose feel.
  11. Boundaries
    the boundaries should always be explicitly typed and validated. this was true before agents. docs rot/drift/not tell the exact story. this was true before agents.
  12. Migrations
    schemas and migrations should be boring, predictable and decoupled from application code.
  13. Package trust
    trusted publishing is nice, but not enough. we need trusted maintaining, trusted process. something like `pnpm`'s `trustPolicy: no-downgrade` option but for not trusting packages with insecure repositories/processes.

Setup

Devices

Laptop
MacBook Pro 14″ · 2023 · Space Black
Apple M3 Pro · 18 GB memory · 512 GB SSD
11-core CPU · 14-core GPU
Phone
Samsung Galaxy S25 Ultra
Titanium Black · 12 GB memory
SM-S938B/DS

Developer tools

Editor
VS Code
Terminal
Ghostty
Browser
Chrome
Launcher
Raycast
Agent workspace
Herdr
Coding agents
Claude Code · Codex

Desk & gear

Desk
Decoline Honey
140 × 60 × 75 cm (W × D × H)
Monitors
2 × ASUS VP249QGR
1080p · 144 Hz
Keyboard
Durgod Taurus K320
White
Desk mat
Razer Gigantus V2 3XL
120 × 55 cm
DAC / headphone amp
E1DA 9038SG3
Earbuds
Sony WF-1000XM6
Black

Vinyls

  • Beats, Rhymes & Life

    A Tribe Called Quest

  • Midnight Marauders

    A Tribe Called Quest

  • The Low End Theory

    A Tribe Called Quest

  • Ventura

    Anderson .Paak

  • DIAMONDS & FREAKS

    BLK ODYSSY

  • “Awaken, My Love!”

    Childish Gambino

  • Be

    Common

  • Voodoo

    D’Angelo

  • Black Messiah

    D’Angelo and The Vanguard

  • AOI: Bionix

    De La Soul

  • Melt My Eyez See Your Future

    Denzel Curry

  • New Amerykah Part One (4th World War)

    Erykah Badu

  • Late Registration

    Kanye West

  • BUBBA

    KAYTRANADA

  • 99.9%

    KAYTRANADA

  • Mr. Morale & The Big Steppers

    Kendrick Lamar

  • To Pimp a Butterfly

    Kendrick Lamar

  • good kid, m.A.A.d city

    Kendrick Lamar

  • Candydrip

    Lucky Daye

  • Painted (Deluxe Edition)

    Lucky Daye

  • Black on Both Sides

    Mos Def

  • Stankonia

    Outkast

  • Process

    Sampha

  • Lahai

    Sampha

  • Blank Face LP

    ScHoolboy Q

  • Chasing Summer

    SiR

  • Fantastic, Vol. 2

    Slum Village

  • Ego Death

    The Internet

  • Things Fall Apart

    The Roots