Tools I needed and nobody had built.
Writing code since 1985, paid for it since around 1990 — Fortran77, Oracle Forms, LAMP, Angular, and whatever the current generation calls itself. Long enough to tell what will still be here in ten years from what is merely loud right now.
Programming is a puzzle and a craft at the same time: solve the problem, then make the code simpler than the problem was. I find a problem, I build a tool — lately in Python and TypeScript, on the command line and against whatever API is in the way. Nobody asked for any of these — the good ones never are.
Boring beats clever. Readable code beats a smart abstraction every time. The clever version is a debt someone pays later, usually me.
Context decides. A prototype may take shortcuts. Something people depend on may not. Knowing which one you are writing is most of the job.
No dependency without a reason. Every package is a promise someone else has to keep. Standards outlive vendors.
A view must not be able to disagree with its source. Anything derived gets recomputed, never kept by hand in a second place — two versions of the truth start drifting the day you write the second one.
Write down why, not just what. A decision that took an afternoon to reach should not take an afternoon to reconstruct.
logseq-cli — read and write a
Logseq graph from a shell or an AI agent. Python, click, no vendor
coupling. Verified writes, because the API answers a failed one with
HTTP 200 and null.
roadmapper — derive a Notion roadmap from GitLab epics and milestones. One way only: the board is a view, so it cannot drift from the tracker. TypeScript, two dependencies, one command for cron. Progress is a sum over the issue tree, which is the one thing a field mapping cannot do.
Germany. Off the keyboard: a gravel bike, daily, non-negotiable.
