A calcurse-inspired terminal task manager and calendar, styled with a Material-tonal / Apple-HIG color system.
Project description
nokkam
A calcurse-inspired terminal task manager and calendar. Calendar and tasks live side by side on one home screen — no mode-switching to see what's due. Local-first: everything lives in a single SQLite file, nothing leaves your machine.
┌──────────────────────────────────────────────────────────────┐
│ nokkam / home July 2026 │
├─────────────────┬────────────────────────────────────────────┤
│ mo tu we th fr │ Saturday, 25 July 2026 │
│ sa su │ Design system spec 2026-07-25 │
│ │ Standup 2026-07-25 09:00 │
│ 29 30 1 2 3 │ ────────────────────────────────────────── │
│ 4 5▓ 6 7 8 │ All tasks │
│ 9 10 11 12 13 │ Design system spec 2026-07-25 │
│ ... │ Standup 2026-07-25 09:00 │
│ │ Weekly review 2026-07-28 │
│ │ Read newsletter │
├─────────────────┴────────────────────────────────────────────┤
│ [ Prev ] Next t Today/Timer a Add e Edit d Delete ... │
└──────────────────────────────────────────────────────────────┘
Contents
Features
Tasks
- Priority (high/medium/low), due date + time, projects, tags
- Subtasks with indented tree display
- Recurrence — daily/weekly/monthly; completing a recurring task automatically spawns the next occurrence
- Dependencies — mark a task "blocked by" another; completing a blocked task is refused until its blocker is done
- Undo — every add/edit/delete/toggle can be undone with
u
Calendar (always visible, not a separate mode)
- Month grid with a task-count dot on any day that has tasks due
- Keyboard (
h j k l/ arrows,[]for month) or mouse (click a day) - The right-hand panes update live to whichever day is selected
Quick add — free-text capture with natural-language dates:
Buy milk tmrw 3pm, Standup fri 9:30, Follow up in 3 days
Command palette (Ctrl+K) — fuzzy-search tasks to jump to one, or run
any action: Add task, Quick add, Undo, Focus calendar, Open agenda, Show
stats, Pomodoro, Smart list: Today/Overdue/This week/All
Smart lists — Today, Overdue, This week, All (filters the task list in place; shown in the header)
Agenda — rolling 14-day view of everything upcoming, chronological
Stats — completion rate, current streak, overdue count, and a GitHub-style contribution heatmap of the last 12 weeks
Time tracking — start/stop a timer on the selected task (starting a new one stops whatever was running); Pomodoro — 25/5 focus timer with pause/reset
Reminders — due-soon desktop notifications (macOS, Linux, Windows), each task surfaced only once
Import/export — JSON and CSV round-trip tasks including tags; ICS export for calendar apps
CLI quick-capture — nokkam add "..." writes a task from your shell
without opening the UI
Design — a considered visual system, not default Textual chrome: warm
near-black/linen-white neutrals, a single configurable signature accent
(vermillion by default), priority shown as a colored accent bar rather than
an icon, light/dark theme (Ctrl+T)
Install
Requires Python 3.11+. Runs anywhere Textual does — macOS, Linux, and Windows (Windows Terminal recommended for full color/glyph support).
From PyPI (once published):
pipx install nokkam # or: pip install nokkam
From source:
git clone git@github.com:AyirusZone/cad_tui.git nokkam
cd nokkam
python3 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install .
The only runtime dependency is Textual — no C extensions, nothing else to compile.
Usage
nokkam
launches the home screen: calendar on the left, the selected day's tasks
top-right, the full task list bottom-right. Data lives in
~/.nokkam/data.db (SQLite) — nothing else to set up.
Panes and focus
Tab cycles focus between the three panes (calendar → today's tasks → all
tasks). Which pane is focused changes what a few keys do:
t— jumps the calendar to today if the calendar pane is focused, otherwise starts/stops the timer on the selected taska— adding a task defaults its due date to the selected calendar day when the calendar or day pane is focused, otherwise leaves it blank
Everything else (e edit, d delete, space toggle complete, s add
subtask) acts on whichever task is currently selected, in whichever pane
has focus.
Keybindings
| Key | Action |
|---|---|
Tab |
Cycle focus: calendar / today's tasks / all tasks |
h j k l / arrows |
Move — day+week in the calendar, line in a task list |
[ / ] |
Previous / next month |
t |
Jump to today (calendar focused) or start/stop timer (task focused) |
a |
Add task |
e |
Edit selected task |
d |
Delete selected task |
space |
Toggle complete |
s |
Add subtask under selected |
u |
Undo last action |
A |
Quick add (free text with a natural-language date) |
w |
Open agenda (next 14 days) |
S |
Open stats |
P |
Open Pomodoro (25/5 focus timer) |
Ctrl+T |
Toggle light/dark theme |
Ctrl+K |
Command palette |
? |
Help |
q |
Quit |
esc |
Close current dialog / go back |
Clicking a calendar day with the mouse selects it, same as navigating to it with the keyboard.
Task fields
The add/edit form covers: title, notes, priority, due date + time,
project, tags (comma-separated), repeats (none/daily/weekly/monthly), and
"blocked by" (matched against an existing task's title). A subtask is
created the same way, just pinned under the task you had selected when you
pressed s.
Completing a task that's still blocked is refused with a warning instead of silently succeeding. Completing a recurring task spawns its next occurrence automatically, carrying over title, priority, project, and tags.
CLI quick-capture
Add a task without opening the UI — writes straight to the same database:
nokkam add "Buy milk tmrw 3pm"
nokkam add "Renew passport" --due 2026-09-01 --priority high --project Admin --tags docs,travel
Flags: --due YYYY-MM-DD (overrides any date parsed from the text),
--priority high|medium|low, --project NAME, --tags a,b,c.
Import / export
nokkam export --format json --out tasks.json
nokkam export --format csv --out tasks.csv
nokkam export --format ics --out tasks.ics # calendar apps
nokkam import --format json --in tasks.json
nokkam import --format csv --in tasks.csv
JSON and CSV round-trip tags by name; ICS is export-only.
Configuration
Optional — ~/.nokkam/config.toml:
theme = "nokkam-dark" # or "nokkam-light"
accent = "#FF6B4A" # any hex color; drives both themes' accent
db_path = "~/.nokkam/data.db"
Nothing needs to be set — these are the defaults if the file is absent.
Development
git clone https://github.com/AyirusZone/cad_tui.git nokkam
cd nokkam
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
pre-commit install
The app is layered (presentation → services → domain → data/infra)
so business logic stays independent of the Textual UI. See commit history
for the phase-by-phase build log.
Testing
pytest
pytest --cov=nokkam --cov-report=term-missing --cov-report=xml --cov-report=html
Linting
ruff check src tests
Formatting
black --check src tests # verify
black src tests # apply
Type checking
mypy src
Packaging
python -m build
twine check dist/*
Versioning
nokkam follows Semantic Versioning (MAJOR.MINOR.PATCH).
Development releases use a PEP 440 dev suffix, e.g. 0.5.0.dev1; stable
releases drop it, e.g. 0.5.0. See CHANGELOG.md for the
version history.
Release process
Releases are fully automated by CI once a tag is pushed — nothing is published from a developer's machine.
| Branch | Tag | Publishes to | GitHub artifact |
|---|---|---|---|
development |
dev-vX.Y.Z |
TestPyPI | Pre-release |
master |
vX.Y.Z |
PyPI | Release |
Each tag push runs: validate the tag matches the pyproject.toml version →
build → test → publish → create the GitHub release/pre-release with the
wheel and sdist attached. A version/tag mismatch fails the workflow before
anything is published. Maintainers: see the repository's release runbook
for the manual tagging steps.
Contributing
Contributions are welcome — see CONTRIBUTING.md for the branch strategy, dev setup, and pull request checklist. Please also review the Code of Conduct. To report a security issue, see SECURITY.md instead of opening a public issue.
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 nokkam-0.1.0.tar.gz.
File metadata
- Download URL: nokkam-0.1.0.tar.gz
- Upload date:
- Size: 71.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
39f6d89629a1dfca056437bc66037406b47e85d77d3c72b9bcf14255dde1dc5d
|
|
| MD5 |
b68a626ec89bf9d706b063e097b6e4fc
|
|
| BLAKE2b-256 |
a09d963e94a258bcc366b1120d38e74257dd4379cc4ccf5f8b657146fd711d69
|
Provenance
The following attestation bundles were made for nokkam-0.1.0.tar.gz:
Publisher:
publish-pypi.yml on AyirusZone/nokkam
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
nokkam-0.1.0.tar.gz -
Subject digest:
39f6d89629a1dfca056437bc66037406b47e85d77d3c72b9bcf14255dde1dc5d - Sigstore transparency entry: 2256279313
- Sigstore integration time:
-
Permalink:
AyirusZone/nokkam@3c967596ba77e27a5b2eaad29588960db0d20b33 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/AyirusZone
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@3c967596ba77e27a5b2eaad29588960db0d20b33 -
Trigger Event:
push
-
Statement type:
File details
Details for the file nokkam-0.1.0-py3-none-any.whl.
File metadata
- Download URL: nokkam-0.1.0-py3-none-any.whl
- Upload date:
- Size: 62.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
071dd724342e6580e33b46ddd883f5f0f973b5de801018496e475143d3c6f136
|
|
| MD5 |
9f69ba47429394547c00838beeef26cf
|
|
| BLAKE2b-256 |
b012b35f677fc76abb577a24fe4280192d7fade2eb69d57bcb423a54521b54ea
|
Provenance
The following attestation bundles were made for nokkam-0.1.0-py3-none-any.whl:
Publisher:
publish-pypi.yml on AyirusZone/nokkam
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
nokkam-0.1.0-py3-none-any.whl -
Subject digest:
071dd724342e6580e33b46ddd883f5f0f973b5de801018496e475143d3c6f136 - Sigstore transparency entry: 2256279319
- Sigstore integration time:
-
Permalink:
AyirusZone/nokkam@3c967596ba77e27a5b2eaad29588960db0d20b33 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/AyirusZone
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@3c967596ba77e27a5b2eaad29588960db0d20b33 -
Trigger Event:
push
-
Statement type: