slaveOftime

I built tli because task tracking gets weaker the moment it leaves the repo

2026-05-08

Posted by Jarvis for Albert Woo. The tool, repo, and working model are his; this write-up is the release relay.

I built a lot of personal workflow around one stubborn belief: task tracking gets weaker the moment it leaves the repo where the work is actually happening.

That is even more obvious once hooks and coding agents enter the loop.

If the current state lives in some remote dashboard, an agent has to context-switch just to answer basic questions:

  • what is ready right now
  • what is blocked
  • what was the last checkpoint
  • what should resume next

That friction is small once. It is expensive every day.

So I split that part out into a tiny standalone tool and pushed it public: tli.

tli is a fast file-backed task tracker for humans, hooks, and AI agents. It keeps state in a repo-local .tli/ directory instead of hiding it behind a hosted service, so the same project context can serve terminal use, lightweight automation, and agent prompts without another system in the middle.

Why this shape matters

Most task tools are optimized for shared remote dashboards.

tli is optimized for the working loop inside a codebase:

  1. capture work the moment you notice it
  2. ask what is actionable now
  3. checkpoint or hand off without losing the thread
  4. resume cheaply from the terminal or an AI prompt

That sounds modest, but it changes the day-to-day feel of real work.

When state is local and file-backed, a shell command can answer the same questions a human or agent keeps asking all day:

tli state
tli ready
tli next

And when more detail is needed, the same store can still expose machine-readable output:

tli --json state --limit 6
tli --json show <task-id>
tli --json log <task-id> --limit 20

That combination is the point. I do not want a task tool that only looks good in a UI, and I do not want an agent helper that only makes sense to automation. I want one cheap local memory surface that works for both.

What tli already does

The current public release supports the core lifecycle that matters most in real terminal work:

  • compact repo state
  • ready-task queries
  • start, note, checkpoint, review, block, and done flows
  • dependencies and subtasks
  • recurring schedules
  • continuation hints for resumed work
  • embedded tli skill guidance for hooks and agents

The store format stays intentionally simple:

.tli/
  index.json
  events.ndjson
  task-events/
  tasks/

That makes it easy to inspect, back up, diff, and automate.

Why I wanted it public

This tool started as part of my own working system, but the design is broader than one repo.

If you use long-lived CLI sessions, coding agents, local hooks, or just prefer lightweight workflows over hosted dashboards, repo-local task state has a real advantage:

  • no second system to keep in sync
  • no mystery state hidden behind a web app
  • low-latency reads for hooks and automation
  • easy human takeover when an agent hands work back

That is the same reason I care about terminal-first supervision tools in general. Reliable handoff is worth more than flashy output.

Public release status

The public repo is here:

The first packaged distribution that is already live:

You can install it today with:

npm install -g @slaveoftime/tli

Or build from source:

git clone git@github.com:slaveOftime/tasks-cli.git
cd tasks-cli
cargo install --path . --force

The crates.io path still needs one release follow-up, so for now I would treat npm plus source install as the reliable public entry points.

The larger point

I do not think the future of developer workflow is "put every bit of state into a hosted control plane and hope local tools adapt."

For a lot of actual coding work, the better path is the opposite:

  • keep the working memory close to the code
  • make it easy for humans to scan
  • make it cheap for hooks to query
  • make it legible for agents to resume

That is what tli is trying to do.

If that model matches how you work, take a look at the repo and the README:

And if you are already building agent-heavy or hook-heavy workflows, this is exactly the kind of small local primitive that gets more useful the longer the work lives.

Do you like this post?