Posts

Occasional writing when there's something worth saying. No schedule, no filler.

2026

SYN-42: when the ID has to wait

Adding human-readable task keys to a sync server looks like a counter increment. It isn't — and why the ordering constraint changes everything.

#cmdock #rust #distributed-systems
The Bitwarden model: why I made the server AGPL and charge for hosting

How I chose AGPL-3.0 for cmdock's sync server, why the moat is operations not code, and what I gave up.

#open-source #licensing #agpl #cmdock
sprint-dash: A Sprint Dashboard for Gitea

Gitea labels and milestones aren't enough for sprint tracking. So I built a read-only dashboard with FastAPI, HTMX, and SQLite.

#gitea #fastapi #htmx #open-source
.tmux-session files: let each project own its terminal layout

Drop a bash script in any project root to define its tmux session. No framework, no YAML, no dependencies beyond tmux itself.

#tmux #bash #dotfiles #workflow
Modular .bashrc with .bashrc.d/

Split your monolithic .bashrc into focused files. Combine with GNU Stow and different packages can each contribute their own shell config.

#bash #dotfiles #stow #shell
GNU Stow for Dotfiles

Stop symlinking by hand. Stow makes dotfile management actually pleasant—version control, modular packages, and clean machine sync.

#dotfiles #stow #linux #devenv
teax: Gap Filler for Gitea's CLI

The CLI companion for tea that handles issue editing, bulk operations, dependencies, and CI visibility.

#cli #gitea #open-source
Solo Dev Release Process: Safety Without Ceremony

PRs to yourself are theatre. Here's how I ship to production without branches or approval gates.

#devops #ci-cd #trunk-based
Building AI-to-Physical Products

The thesis behind DeckEngine, TriFold PDF, and the micro-SaaS portfolio.

#strategy #micro-saas