Skip to content
caleb mark: an iris cut into a circular plate, with a blue check drawn through itcaleb mark: an iris cut into a circular plate, with a blue check drawn through it

caleb

Rustratatuicrosstermclap

A Rust terminal application that holds a to-do list for the length of one coding session. Tasks sit in two panes side by side, Active and Completed, and checking one off moves it across. Each session is a single GitHub-flavored markdown file on disk, so the list stays readable in any editor long after the terminal is closed.

Why I built it

I wanted a list that begins when I sit down to build software and ends with the terminal, instead of a permanent backlog that follows me around. Sessions expiring is the point: yesterday is a file I can pull from, not a debt I carry.

The name is the personal half. It is for Caleb Smith in Ex Machina, a film I keep going back to for its story and its look, which this app borrows from.

Key features

  • Two panes, Active and Completed, with a task crossing over the moment you check it off
  • Every session is one GitHub-flavored markdown file under ~/.local/share/caleb/, editable outside the app
  • Pull unfinished work forward from a past session, which ticks those tasks off where they came from
  • A resume picker with a live preview pane, so you can read a session before opening it
  • Mouse aware: wheel to scroll, click to select, double-click to toggle a task done
  • Clear sessions containing all completed tasks with caleb --clean
caleb resume picker listing four past sessions on the left, with a live markdown preview of the selected session on the right
caleb showing its two panes, Active on the left with three open tasks and Completed on the right with three struck-through tasks

Tech notes

Written in Rust on the 2024 edition with ratatui and crossterm for the interface and clap for the command line. Errors are typed per module with thiserror and surface through anyhow at the entry point, and unsafe code is forbidden crate-wide. Dates come from jiff, which resolves the local time zone in pure Rust.

There is no database and no network: the markdown file is the state, parsed and reserialized on every save. Around 246 tests cover it, from in-file unit tests and ratatui buffer assertions to pty-driven smoke scripts, all gated in CI alongside clippy at pedantic.

Linux only for now, since that is where I work.