Skip to main content

A local, file-backed productivity app for program/task tracking.

Project description

Taskunity

A local-first, file-backed productivity web app for managing tasks. Everything lives in plain files on your disk — no database, no account, no cloud. Point Taskunity at a folder and it serves a browser UI for dashboards, a Gantt timeline, a Kanban board, a calendar, activity logs, burndown charts, and an editable task side panel.

Documentation: a full guide is in the docs/ folder and is set up to build on Read the Docs (Sphinx + Markdown).

Screenshots

PyPI renders images reliably when they use absolute GitHub URLs. The screenshots below include both light mode and dark mode.

Light mode

Task List Task Board
Task List (Light) Task Board (Light)
Gantt Timeline Calendar
Gantt (Light) Calendar (Light)
Milestones Projects
Milestones (Light) Projects (Light)
Task Activity Log Settings (Theme)
Task Panel (Light) Settings Popup (Light)

Dark mode

Dashboard Task Board
Dashboard (Dark) Task Board (Dark)
Gantt Timeline Calendar
Gantt (Dark) Calendar (Dark)
Milestones Task Panel
Milestones (Dark) Task Panel (Dark)

Why Taskunity

  • File-backed source of truth. Each task is a single JSON file you can read, diff, and commit to git. The whole workspace is a folder you own.
  • Local-first. Runs entirely on 127.0.0.1. Your data never leaves your machine.
  • Git-aware. The UI shows branch/ahead/behind/dirty status and has a one-click commit + pull + push sync button when the workspace folder itself is a git repo.

Workspace layout

The source of truth is a workspace folder:

workspace/
  config.json           # editable workspace/app metadata
  projects/
    apollo.json         # one file per project
  tasks/
    A1B2-C3D4-E5F6-7890.json  # one file per task (native id format)
  milestones/
    M-1A2B-3C4D.json    # one file per milestone (groups tasks across projects)
  assets/
    A1B2-C3D4-E5F6-7890/  # attachments live alongside their task id
      screenshot.png

The app provides a browser UI for viewing dashboards, timelines, task boards, activity logs, burndown charts, and editing tasks through a side panel.

Install locally

From a clone of this repository:

pip install -e .

This installs the taskunity command. (A PyPI release will come later; for now install from source.)

Quick start

taskunity serve --workspace ./my-workboard

If the workspace folder does not exist yet, taskunity serve will create the empty Taskunity structure for you. You can also run it from the current directory and let Taskunity use . as the workspace.

Then open:

http://127.0.0.1:8000

init is available if you want to scaffold a folder explicitly. It creates an editable config.json, empty projects/, tasks/, milestones/, and assets/ directories, plus a README stub. It does not create starter projects or tasks; use the app to add your own once you begin.

Serve an existing workspace

taskunity serve --workspace ./path/to/workspace --host 127.0.0.1 --port 8000
Flag Default Description
--workspace . Workspace folder to serve
--host 127.0.0.1 Host interface to bind
--port 8000 Port to listen on
--reload off Enable uvicorn auto-reload (development)

Task file example

{
  "id": "A1B2-C3D4-E5F6-7890",
  "title": "CAF refinement prototype",
  "status": "working",
  "priority": "high",
  "project": "Apollo",
  "summary": "Build a prototype CAF refinement workflow.",
  "description": "Compare baseline CAF sharpness against protection-aware refinement.",
  "tags": ["caf", "signal-processing", "prototype"],
  "start_date": "2026-06-24",
  "due_date": "2026-06-30",
  "completed_date": null,
  "percent_complete": 60,
  "depends_on": ["0EBB-528F-371E-61AE"],
  "checklist": [
    {"text": "Generate baseline CAF", "done": true},
    {"text": "Export comparison plots", "done": false}
  ],
  "activity": [
    {
      "id": "a1b2c3d4",
      "event_type": "note",
      "created_at": "2026-06-26T10:30:00",
      "note_text": "Protection-aware version improved sharpness."
    },
    {
      "id": "e5f6a7b8",
      "event_type": "progress_update",
      "created_at": "2026-06-26T11:00:00",
      "progress_before": 40,
      "progress_after": 60
    }
  ]
}

depends_on stores task ids. In the UI you add dependencies with a search-as-you-type picker that finds tasks by name and shows their status, project, due date, and id — then stores the id. Dependencies are reflected on the Gantt timeline (an ↳ after <name> label plus a marker where the dependency's bar ends).

Milestones

Milestones are a separate entity from projects. A milestone can span multiple projects, holds an ordered list of tasks (which can come from any project, and a task can belong to any number of milestones), and has its own description, notes, and attachments — just like a task.

  • Open the Milestones view to see every milestone with a live rollup (task count, progress, target date).
  • Click a milestone to filter the whole board to just its tasks and show a rollup banner; the side panel opens the milestone for editing.
  • Each milestone has its own colour used on milestone cards and the rollup banner.
  • From inside a milestone you can add a task with one search-as-you-type picker and use the sticky + New task button at the bottom of the list for quick creation (auto-added to that milestone), and remove tasks.

Milestones are stored one JSON file per milestone under milestones/.

Features

  • JSON-per-task source model you can version with git
  • Dashboard summary cards (total / done / working / blocked)
  • Kanban-style board with per-project color strips
  • Gantt timeline with dependency markers
  • Calendar view
  • Milestones that group tasks across projects, with per-milestone colour, click-to-filter rollup, and their own notes/attachments/description
  • Click any task (row, card, timeline bar, calendar entry) to open an editable side panel
  • Save edits back to the JSON file; raw JSON editor escape hatch
  • Unified activity log per task: notes, images, and progress changes in chronological order
  • Task burndown chart: remaining work over time from progress_update events
  • Milestone cumulative burndown chart: aggregate remaining work across all tasks in a milestone
  • Searchable "depends on" picker that resolves names to task ids
  • Project management with custom colors, each stored in its own JSON file
  • Filtering by project, milestone, date range, and free-text search; sortable views
  • CSV / JSON export
  • Built-in git status chip and one-click sync (commit + pull + push)

Building the docs locally

pip install -e ".[docs]"
sphinx-build -b html docs docs/_build/html

Open docs/_build/html/index.html. On Read the Docs the build is driven by .readthedocs.yaml.

Development

pip install -e ".[dev]"
pytest
ruff check .

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

taskunity-2026.12.tar.gz (146.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

taskunity-2026.12-py3-none-any.whl (148.6 kB view details)

Uploaded Python 3

File details

Details for the file taskunity-2026.12.tar.gz.

File metadata

  • Download URL: taskunity-2026.12.tar.gz
  • Upload date:
  • Size: 146.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for taskunity-2026.12.tar.gz
Algorithm Hash digest
SHA256 99ab0defa98f5954b418036bbbeb3dabb6df6f6ab263843fab3e8214f7b3b4c8
MD5 d992254b992765c70b0446bfd6386a17
BLAKE2b-256 1db0409b614d3c80111ded7a96a65171cc1e122d9a5325b5a1b62069ba3c1619

See more details on using hashes here.

File details

Details for the file taskunity-2026.12-py3-none-any.whl.

File metadata

  • Download URL: taskunity-2026.12-py3-none-any.whl
  • Upload date:
  • Size: 148.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for taskunity-2026.12-py3-none-any.whl
Algorithm Hash digest
SHA256 b09d3de46c68b061ec1a7aaf28b5b3c0ff242662c622ef298308ad1abe4cac57
MD5 910edda9780752702b3c229ea07f4004
BLAKE2b-256 a3e36f9c385dfcfc15aa91a4769bd4a3022f242e22c539564ecad773d3678885

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page