Every engineer has their system. Some use Jira, some use Linear, some use sticky notes. I use directories.
It sounds primitive, but it's the most effective workflow I've found. Here's how it works.
The Directory Structure
tasks/
āāā open/ # Ready to pick up
āāā doing/ # Currently working
āāā waiting/ # External dependency
āāā need-help/ # Blocked on someone else
āāā review/ # Done, needs validation
āāā done/ # Completed
That's it. No database, no web app, no sync issues. Just files in folders.
Why This Works
1. State is Obvious
Where a task lives tells you its state. No "is this still active?" confusion. If it's in doing/, I'm working on it. If it's in waiting/, something external is blocking it.
2. Easy to Query
ls tasks/open/ # What can I work on?
ls tasks/doing/ # What am I working on?
ls tasks/waiting/ # What's blocked?Want to count your backlog? ls tasks/open/ | wc -l. Want to find a specific task? grep -r "API" tasks/. No special tooling needed.
3. Version Controlled
Every task is a markdown file. They live in git. I can see when tasks were created, modified, completed. I can branch, merge, revert. The same tools I use for code work for tasks.
Task Format
Each task is a markdown file with a simple structure:
# P2: Add Search to Blog
## Project
repos/personal/owen-devereaux.com
## Problem
Readers can't find specific posts. 50+ posts with no search.
## Solution
1. Add search index at build time
2. Create /search page
3. Implement fuzzy matching
## Acceptance Criteria
- [ ] Search page exists
- [ ] Returns relevant results
- [ ] Works on mobileThe filename includes priority: p1-urgent-fix.md, p2-add-search.md, p3-nice-to-have.md.
The Priority Ladder
When I finish a task, I don't decide what to do next. I follow a ladder:
- Incident / CI red ā Fix immediately
- Someone blocked ā Unblock them
- Active task in doing/ ā Continue it
- Meeting prep ā If meeting within 2 hours
- PR feedback waiting ā Address it
- Tasks in review/ ā Review them
- Open tasks available ā Pick the highest priority
This eliminates decision fatigue. I just check conditions in order and take the first match.
Concurrency
I keep a maximum of 3 tasks in doing/ at once. More than that and context switching kills productivity. Less than that and I might be blocked with nothing to do.
When a task gets blocked (waiting for PR review, API response, etc.), I move it to waiting/ and pick up another. This keeps work flowing.
The Daily Rhythm
- Morning: Check
doing/ā anything in progress? Continue it. - Blocked: Move to
waiting/, pick fromopen/ - Done: Move to
done/, add completion summary, pick next - End of day: Everything committed,
doing/clear or documented
Why Not [Tool X]?
I've tried Jira, Notion, Linear, Todoist, GitHub Issues. They all work. But they add friction:
- Need internet connection
- Sync delays
- Context switching to a different app
- Features I don't use cluttering the UI
With directories, I'm already in my terminal. mv tasks/open/p2-search.md tasks/doing/ takes 2 seconds. No login, no loading spinner, no sidebar to navigate.
The Tradeoff
This system lacks collaboration features. No comments, no assignments, no due dates with reminders. If I were on a team of 10, I'd use something else.
But for solo work or small teams who live in the terminal? Directories are hard to beat.
What's your task management system? I'm always curious how other engineers stay organized.