Your todo list shouldn't stress you out. Jim is a Bullet Journal for the terminal — fast, local, no account needed. Each morning starts clean. Overdue tasks don't scream at you: you decide what to keep and what to let go. Dropping a task isn't failure, it's a decision. Tasks, habits, grocery lists, birthdays — everything lives in
~/.jim/.
Philosophy: each morning starts empty. Tasks don't carry over automatically — you consciously decide to keep, snooze, or drop each one via jim review. No shame, no "stale", just intentional choices.
Jim integrates with Claude Code via a global skill. Claude automatically detects when you talk about tasks and uses jim behind the scenes.
# The skill lives in ~/.claude/skills/jim.md
# The pointer is in ~/.claude/CLAUDE.md
# Nothing to invoke — Claude does it on its owngit clone https://github.com/pierresisson/Jim.git
cd Jim
bun install
bun run build
npm install -g .Requires Bun >= 1.0.
Quotes are optional — jim add buy groceries works just as well as jim add "buy groceries".
# Work task (default)
jim add Review PR #42
jim add Review PR #42 -c pro -p high
# Personal task
jim add Set up Brita filter -c perso
jim add Call the plumber -c perso -p high
# Recurring habit
jim add "Walk the dog" --habit --frequency 4 --period week
jim add "Meditate" --habit --frequency 1 --period dayOptions:
-c, --category <key>— Category (default: first one defined in config, e.g.pro)-p, --priority <high|medium|low>— Priority (default:medium)--habit— Create a habit instead of a task--frequency <n>— Times per period (habits)--period <day|week>— Habit period (default:week)
jim tasks # Today's active tasks + habits
jim tasks -c perso # Only personal tasks
jim tasks --all # All tasks (active, dormant, dropped, done)
jim tasks --dormant # Dormant tasks (not reviewed today)
jim tasks --dropped # Dropped tasks
jim tasks --done # Completed tasksBy default, only active tasks (reviewed today) are shown. Older tasks become dormant and wait for your jim review.
Persistent lists for anything that isn't a task: birthdays, groceries, ideas...
jim list # Show all lists
jim list create <name> # Create an empty list
jim list show <name> # Show items in a list
jim list add <name> <text...> [-d] # Add an item (--date optional)
jim list done <name> <id> # Check off an item
jim list rm <name> [id] # Remove an item, or the entire list if no idName lookup is case-insensitive and supports partial prefixes (birth → Birthdays).
jim reviewWalks through dormant tasks one by one. For each task:
- [k]eep — Reactivate the task for today
- [d]rop — Drop the task (a conscious choice, not a failure)
- [s]nooze — Snooze until a future date
- d[o]ne — Mark the task as completed
jim nextThe algorithm takes into account:
- Task priority
- Daily quota per category (if set) — if not met, tasks from that category get boosted
- Habit urgency near end of period
Only active tasks (reviewed today) are suggested.
jim done 222d8738 # By ID (partial prefix accepted)
jim done --last # Complete the task suggested by `jim next`jim edit 222d8738 -t "New title"
jim edit 222d -c perso
jim edit 222d -p high
jim edit 222d -t "Updated" -c pro -p low # Multiple changes at onceOptions:
-t, --title <title>— New title-c, --category <key>— New category (validated against config)-p, --priority <high|medium|low>— New priority
At least one option is required. Partial ID prefix accepted.
jim cat # List all categories (default)
jim cat list # Same as above
jim cat add work --label WORK --color blue --quota 3
jim cat rm work # Fails if active tasks use itSubcommands:
list(default) — Show all categories with their color and quotaadd <key>— Add a category (--label,--color,--quotaoptional)rm <key>— Remove a category (refuses if active tasks still use it)
jim delete 222d8738 # By ID (partial prefix accepted)Permanently removes a task or habit from the data file.
jim remindShows a concise summary: active tasks by category, habit progress. If dormant tasks exist, suggests running jim review.
Add this line to your ~/.zshrc (or ~/.bashrc):
source /path/to/Jim/.jim-hook.shEvery time you open a terminal, jim remind will run automatically.
The ~/.jim/config.json file contains:
{
"categories": [
{ "key": "pro", "label": "PRO", "color": "cyan" },
{ "key": "perso", "label": "PERSO", "color": "magenta", "dailyQuota": 2 }
],
"reminderEnabled": true,
"dailyGoal": 5
}Set dailyGoal to a number to track how many tasks you want to complete each day. Progress is shown in jim tasks, jim next, and jim remind. Turns green when you hit the target. Optional — if omitted, nothing is displayed.
You can define as many categories as you want. Each category has:
key— Unique identifier (used with-cin commands)label— Display name in tables and reminderscolor— Label color (red,green,yellow,blue,magenta,cyan,white,gray)dailyQuota(optional) — Number of tasks to do per day; if not met,jim nextboosts tasks from that category
Example with custom categories:
{
"categories": [
{ "key": "pro", "label": "PRO", "color": "cyan" },
{ "key": "freelance", "label": "Freelance", "color": "blue" },
{ "key": "perso", "label": "PERSO", "color": "magenta", "dailyQuota": 2 },
{ "key": "health", "label": "Health", "color": "green", "dailyQuota": 1 }
],
"reminderEnabled": true
}The order in the categories array determines the display order in jim tasks.
Migration: the old format (
persoDailyQuota: 2) is automatically migrated in memory on load. No manual changes needed.
reminderEnabled— Enable/disable the terminal reminder
Stored in ~/.jim/data.json. The directory and files are created automatically on first run. Old data files without status/lastReviewedAt fields are auto-migrated on load.
bun run build # Compile TypeScript
bun run dev # Compile in watch mode
bun test # Run tests
bun run test:watch # Tests in watch modeMIT — see LICENSE.