CarpeDiem
CarpeDiem (carpe diem — seize the day) turns quick notes into a realistic day plan: natural-language capture, a smart morning proposal with real time slots, pomodoro focus during the day, evening closing. Offline-first, in English or Italian, no account, no network in the planning path.
Capture in seconds (n, natural language) → morning proposal to confirm (P)
→ work from the Day plan timeline with pomodoro (p, o) → evening Closing (R).
In the app, open the menu (m) → Day → Recommended workflow for the 5-step daily checklist.
Home: task table with the due-date radar (priority × horizon,
b cycles chart → text → hidden, click a dot to open the task).
Buongiorno (
P): explicit availability window (HH:MM–HH:MM), fixed events (HH:MM-HH:MM Title) and the proposal with HH:MM–HH:MM slots plus today context above. Confirming only adds — Esc writes nothing.
Day plan (
p): the confirmed tasks re-scheduled in the persisted window, with inline HH:MM–HH:MM prefixes, read-only EVENT: rows and the ▶ marker on the pomodoro task. Fully operational (Enter/Space/o/O/x).
Day closing (
R): today summary (done vs goal, pomodoros) and the picker that becomes exactly tomorrow's plan.
Stats (
k): goals and streaks, per-project breakdown, peak hours, punctuality, heatmap — plus the estimates-vs-actual factor the planner learns from.
Agenda (
Day → Agenda): the chronological radar — overdue, today, tomorrow, next 7 days, important undated.
Install in 2 minutes
- You need Python 3.12+: check with
python3 --version. - Recommended: isolated install with pipx (puts
carpediemon your PATH):
pipx install carpediem
From the git repo:
pipx install git+https://github.com/fabx-dev/carpediem.git
- Alternative for developers (virtualenv):
python3 -m venv .venv
.venv/bin/pip install .
- Start the TUI:
carpediem
On first run: load the demo data to explore, or start empty.
Check it works:
carpediem --help
carpediem list
Common issues: pipx: command not found (install pipx first), old Python (<3.12), separate data dir with TASKO_HOME=/tmp/carpediem-demo carpediem. Docker (docker compose up) is dev-only, not the main install path.
Requires Python 3.12+. Built with Textual; data stays in local JSON (see Data below).
The daily loop
- Capture —
nopens the form;ctrl+lfills the fields from the title using#tag *project !priority ~estimate //note(dates in Italian or English, e.g.domani,friday). Same parser in the CLI:carpediem add "Call bank tomorrow #calls *personal !high". The due field also has a📅calendar picker;Escnever writes. - Morning (
P, Buongiorno) — context (planned, due, overdue, load in 🍅 over capacity, yesterday, streak) plus the smart proposal with inline reasons (deadline, priority, calibrated estimates…). You set an explicit availability window (HH:MM–HH:MM, overnight rejected) and optional fixed events (one per lineHH:MM-HH:MM Title, never persisted as tasks); the proposal showsHH:MM–HH:MMslots around them. Confirming is additive only: already-planned stay,Escwrites nothing, confirming with an empty/invalid window clears the persisted one (no stale reuse). - Execution (
p, Day plan) — the operational sheet: exactly the confirmed tasks (planned_for == today), re-scheduled in the persisted window in Planner merit order. Scheduled rows carry an inlineHH:MM–HH:MMprefix and stay fully operational (Enterdetail,Spacestate,o/Opomodoro,xremove); fixed events appear as read-onlyEVENT:rows; tasks without a slot wait at the tail without a prefix. The▶marker follows the running pomodoro; the evening report adds aPlanned vs executedsection (estimate, slot, sessions, actuals, state). - Closing (
R, Day closing + evening report) —Rshows today (done vs goal, pomodoros) and the picker that becomes exactly tomorrow's plan; the evening report (Day→Evening report) recaps done/leftovers, can print, and jumps toRin one click. No window, no slots invented: without a confirmed window the plan shows plain rows, never a default 09:00–18:00.
Planner notes: deterministic (same input → same plan) and explainable (every row carries its reason). day_hours in Settings is capacity, not working hours. A task without an estimate counts as 1 pomodoro (30 min) for planning only — a fallback, never a user estimate. Finishing an estimated task asks for the actual pomodoros (pre-filled with the counted ones); the planner calibrates with the local median factor (min 5 samples) and shows it in Stats. No network, no AI, no external calendar in v1.
Views
Day: agenda, plans, calendar
Recommended workflow— 5-step checklist (capture / morning / day / evening / week), first entry ofDay.Buongiorno(P) — context + proposal + slots, see loop step 2.Agenda— chronological radar: overdue, today, tomorrow, next 7 days, important undated.Day plan(p) — manual plan of today (+add from Upcoming,xremove,Spacepause,Enterdetail,o/Opomodoro).Week(w) /Calendar(c) — week strip and month calendar (day → day plan).Evening report/Day closing(R) — recap + print + tomorrow picker.
Views and insights
- Due-date radar (
bcycles chart → text → hidden,Bfull board) — strip-scatter priority × horizon with today line, worst-offenders caption and undated count; click a dot for the detail (or a picker on overlap). Falls back to text automatically when empty, without overwriting your preference. Stats(k) — goals/streaks, week totals, per-priority and per-project, time-of-day and weekday peaks, pomodoros, 14-day completions, punctuality, 🍅 heatmap, estimates-vs-actual factor; CSV export.Smart lists— name the current home filter (state/tag/project/search) and reapply it in one click from menu or palette (ctrl+p); any manual filter touch detaches back to manual (max 10, unique names).Project health(y) — OK / at-risk / critical per project (progress, overdue, momentum).Templates(T) — create/edit/apply, including from a project.Goals— daily/weekly targets with streaks.
Data: backup, transfer, archive
Backup now/Restore backup— automatic zip snapshots in~/Tasko_backups/(14 kept), restore validates before touching disk with rollback.Export: Markdown(ctrl+e) /CSV/stats CSV/iCal— the.icscovers active tasks with due dates; files land in~/CarpeDiem_screenshots/.Import: CSV— idempotent on(source, external_id)(re-import skips, internal ids untouched; rows without external id are always new).Archive— done tasks aside with viewer and restore.
System
Settings— theme, filters, goals, language,day_hourscapacity (1–16).Security— optional Fernet encryption (PBKDF2, key in RAM only); locked files read as empty, never as corrupt.Screenshot(ctrl+s) — SVG capture to~/CarpeDiem_screenshots/.Clear filters,Theme(v),Keyslist,Refresh(r),Quit(q).
Keys
| Key | Action |
|---|---|
n / s |
New todo / subtask of selected |
ctrl+l (in form) |
Fill fields from title (natural language) |
Space then 1/2/3 |
Active / Paused / Done (grid with arrows + Enter) |
Enter / e |
Details (with inline edit) / Edit |
d / u |
Delete (confirm) / Undo |
o / O / X |
Start-open pomodoro / pause-resume / complete-skip |
P / p |
Buongiorno proposal / Day plan |
R / r |
Day closing / Refresh |
b / B |
Radar chart → text → hidden / full board |
c / w / k / y |
Calendar / week / stats / project health |
f / t / g / / |
State, tag, project, search filters |
Esc (search active) |
Clear search only (other filters kept) |
T / v / m / ctrl+p |
Templates / theme / menu / command palette |
ctrl+s / ctrl+e |
Screenshot SVG / Markdown export |
q |
Quit |
Press m for the menu (Day / Views and insights / Data / System). The footer shows only m ☰ Menu; the palette (ctrl+p, Category › Entry) holds every command with its shortcut.
CLI
carpediem add "Call bank tomorrow #calls *personal !high ~2" # natural language (default)
carpediem add "Buy milk" --project home --due 2026-09-30 --priority alta --tags spesa
carpediem list # all, sorted by due then title
carpediem list --state active --project home
carpediem list --porcelain # id|state|priority|due|title, script-friendly
carpediem done 12
carpediem show 12
add without flags parses the phrase (#tag *project !prio ~estimate //note, recurrence, dates it/en); with flags the title is taken literally. done/show use ids; errors go to stderr with exit codes.
Data
Everything lives in local JSON next to your home (offline-first):
| File | Content |
|---|---|
~/.todo_app.json |
Tasks (+ .bak.json previous copy; fields include actual_pomo/minutes, source/external_id) |
~/.todo_templates.json |
Templates |
~/.todo_pomodoro.json |
Timer session + cycle |
~/.todo_config.json |
Theme, filters, goals, language, day_hours, kanban_mode, smart_lists (max 10), day_window ({date, start, end, events[]}) |
~/.todo_archive.json |
Archived done tasks |
~/Tasko_backups/ |
Automatic zip snapshots (14 kept) |
~/CarpeDiem_screenshots/ |
SVG screenshots, CSV/Markdown exports |
Single-writer commit() with inter-process lock and three-way per-id merge (CLI and TUI never overwrite each other). Restore a backup any time from the menu (Backup: restore). Optional encryption from System → Security. Language follows the system (Italian or English), override with TASKO_LANG=it|en or in Settings; isolate data with TASKO_HOME=/tmp/demo.
Dev
pip install -r requirements-dev.txt
python -m pytest tests/ -q
python -m ruff check src/ tests/
See CONTRIBUTING.md. Hobby project, Italian-first: issues in Italian or English welcome.
License
MIT — see LICENSE and CHANGELOG.md.
Release files for carpediem 0.18.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| carpediem-0.18.1.tar.gz | 271.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| carpediem-0.18.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 459.3 kB
Release files / carpediem-0.18.1.tar.gz
| Download URL | carpediem-0.18.1.tar.gz |
|---|---|
| Size | 271.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0653c079604470d2393211e1863d040e766b560c16a6ba3f29407e5efb58dd29
|
|
BLAKE2b-256 checksum How to use checksums |
a95c8efb46b6d74cf8b8594553931b1b70b5988fbabe066bc80e63404f04381b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.
Transparency logRelease files / carpediem-0.18.1-py3-none-any.whl
| Download URL | carpediem-0.18.1-py3-none-any.whl |
|---|---|
| Size | 188.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7a5da60aa652a311859c112b291ce320980b081c7bdd12a9b932bfbf290d68c8
|
|
BLAKE2b-256 checksum How to use checksums |
9442b7a05883cff852b9657928d2ec52168ee2f05b4c96ee32d3f4f4b15187fe
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.
Transparency log