• Go
  • Bubble Tea
  • SQLite
  • GoReleaser
  • GitHub Actions

Every task manager I tried asked me to leave the terminal. Notion, Todoist, Linear — they all want you to pick up the mouse, open a tab, wait for a React app to load. For a developer mid-flow, that context switch is where the thought dies.

CLI tools existed, but they were plaintext at best. No structure, no status, no way to tell “I’m working on this right now” from “I’ll get to this someday.” Everything synced to a cloud I didn’t control.

So I built the tool I actually wanted to use.

What I built

tui-todo is a keyboard-driven todo app that runs entirely in the terminal. SQLite as the storage layer — no cloud, no account, no sync. Everything local, everything instant.

The design centres on a four-state workflow: Open → Doing → Done → Archived. Most todo apps give you a binary — done or not done. That middle state, “Doing,” is where real work lives. I wanted to be able to glance at the terminal and see exactly what I’m supposed to be working on right now, not just what’s left on the list.

Tags and due dates layer on top of that. A / filters by title. t filters by tag. The whole thing is navigable without leaving the home row.

The release pipeline is GoReleaser: cross-compiled binaries for macOS, Linux, and Windows, packaged as .deb, .rpm, .apk, and Snap, with a Homebrew tap on top. brew install tui-todo and it works.

Why this project

I’d shipped Go applications before, but always internal or private work. This was the first time I took a project all the way — from a problem I had, through architecture and implementation, to a public release with proper packaging and an open contribution model.

The hard parts were intentional. Building a TUI that feels good to use is a design problem, not just a code problem. Keyboard bindings have to be discoverable; navigation has to be predictable; feedback has to be instant. Getting GoReleaser to produce consistent, installable packages across five distribution formats required learning the full Go cross-compilation story. Open source maintenance means writing issues, reviewing PRs, and making decisions about what the project should and shouldn’t become.

I use it every day.

The tech

  • Go — the whole thing. Language was chosen for speed and distribution simplicity.
  • Bubble Tea (Charm) — TUI framework
  • SQLite — local-first storage, zero dependencies
  • GoReleaser — cross-platform release pipeline
  • GitHub Actions — CI, test runs, and automated releases