A plain-text task manager and time tracker with pluggable AI parsing (Ollama / OpenAI-compatible / Anthropic).
Project description
jasem
A plain-text task manager and time tracker for your terminal.
You write tasks in natural language; an AI backend extracts the structure (title, deadline, priority, tags) and plain Python turns the deadline phrase into a real date. Everything is stored in a human-readable Markdown table, so you can read, grep, edit, sync, or version-control it however you like.
- Zero dependencies. A single Python file using only the standard library.
- Local by default. Works fully offline with Ollama.
- Bring your own AI. Point it at any OpenAI-compatible API or at Anthropic with two environment variables — no code changes.
- Degrades gracefully. If no model is reachable, your task is still saved (dates are parsed with regex; you just don't get auto title/priority/tags).
$ jasem "pay rent next friday, high priority, finance"
✓ added #1: pay rent
priority=high deadline=2026-06-19 tags=finance
$ jasem today
Due today
☐ 2 [medium] 2026-06-15 (today) call dentist #health
$ jasem track "1h 30min, code review, work"
✓ tracked 1h 30min · code review · today · #work
Install
jasem needs Python 3.8+ and nothing else.
With pipx (recommended)
pipx install .
# or straight from a checkout / git URL once you publish it:
# pipx install git+https://github.com/your-username/jasem
With pip
pip install .
Both install a jasem command on your PATH.
No install at all
It's one file — copy it and run it:
cp jasem.py ~/.local/bin/jasem && chmod +x ~/.local/bin/jasem
Choosing an AI backend
Natural-language parsing is the only step that uses a model. Pick a backend
with JASEM_PROVIDER; the rest is config via environment variables.
Ollama (default — local, free, private)
ollama serve
ollama pull qwen2.5:3b # or any model you like
jasem "submit report by friday, work"
No keys, nothing leaves your machine. Override the model with
JASEM_MODEL=qwen2.5:7b and the host with OLLAMA_HOST.
Any OpenAI-compatible API (OpenAI, Groq, OpenRouter, Together, LM Studio, vLLM, …)
export JASEM_PROVIDER=openai
export JASEM_API_KEY=sk-...
export JASEM_MODEL=gpt-4o-mini # default for this provider
# For a non-OpenAI host, also set the base URL:
export JASEM_API_BASE=https://api.groq.com/openai/v1
Anthropic (Claude)
export JASEM_PROVIDER=anthropic
export JASEM_API_KEY=sk-ant-...
export JASEM_MODEL=claude-opus-4-8 # default; e.g. claude-haiku-4-5 for cheaper/faster
Put whichever block you use in your shell profile (~/.zshrc, ~/.bashrc) so
it's set for every session.
Commands
ADD
jasem "pay rent next friday, high priority, finance"
jasem add "..." force-add even if the text starts with a command word
VIEW (append a category to filter, e.g. jasem list work)
jasem list (ls) open tasks, soonest deadline first
jasem today due today
jasem week due within the next 7 days
jasem overdue past deadline, not done
jasem all everything, including completed
jasem tags list categories in use, with counts
UPDATE
jasem done <id>... mark task(s) complete
jasem rm <id>... delete task(s)
jasem set <id> priority high | medium | low
jasem set <id> deadline next friday | in 3 days | 2026-07-01 | none
jasem set <id> category work finance (space/comma-separated; "none" clears)
TIME TRACKING format: "<time>, <work>[, <date>][, <tag>]"
jasem track "2h, coding"
jasem track "30 min, coding, yesterday, work"
jasem track today's entries, with a daily total
jasem track week last 7 days, grouped by day
jasem track all [tag] everything; optional tag filter
jasem help full, colorized help
Run jasem help for the complete reference.
Configuration
| Env var | Default | Purpose |
|---|---|---|
JASEM_PROVIDER |
ollama |
ollama | openai | anthropic |
JASEM_MODEL |
per provider | Model id |
JASEM_API_KEY |
— | Key for openai/anthropic (also reads OPENAI_API_KEY / ANTHROPIC_API_KEY) |
JASEM_API_BASE |
provider default | Base URL for any OpenAI-compatible / custom endpoint |
OLLAMA_HOST |
http://localhost:11434 |
Ollama daemon address |
JASEM_DIR |
~/.jasem |
Where data is stored |
JASEM_FILE |
$JASEM_DIR/tasks.md |
Tasks file |
JASEM_TRACK_FILE |
$JASEM_DIR/timelog.md |
Time-log file |
How storage works
tasks.md and timelog.md are ordinary Markdown tables. You can hand-edit
rows, keep them in a synced folder, or commit them to a private repo — just
keep the column order intact. jasem reads and rewrites the whole file on each
write, preserving your edits.
Writing good tasks
Clearer cues parse better:
- deadline:
tomorrow,next friday,in 3 days,june 20,2026-07-01(avoidasap/soon) - priority: say
highorlow(defaultmedium; avoidurgent/important) - category: name it plainly —
work,finance,university - pattern:
"<what> by <when>, <priority>, <category>"
License
MIT — see LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file jasem-0.2.0.tar.gz.
File metadata
- Download URL: jasem-0.2.0.tar.gz
- Upload date:
- Size: 14.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
920bba91eae7be70db23747b02e32a9ee2f01684fec9ca1989a1777a1f377ba6
|
|
| MD5 |
969fd6b636adb7b23a90dc781c23d520
|
|
| BLAKE2b-256 |
7dfe5087ab7ccb55f51e8e4333a88ebc2ae5bd3b8c4af1d5f63c1f5d6231fa6b
|
File details
Details for the file jasem-0.2.0-py3-none-any.whl.
File metadata
- Download URL: jasem-0.2.0-py3-none-any.whl
- Upload date:
- Size: 15.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9c6e0e8526ab8d0b68b3db17d203c48dc43002b734d8b6abe6443251c50e635a
|
|
| MD5 |
cfffd01d6f56d644344519dccc326852
|
|
| BLAKE2b-256 |
0057a0153841f6009ddd81ede5f91afbeb7d275ee162566a417bf2ac8af22086
|