taskunity 2026.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- taskunity/__init__.py +1 -0
- taskunity/app.py +1268 -0
- taskunity/cli.py +43 -0
- taskunity/models.py +103 -0
- taskunity/render.py +371 -0
- taskunity/static/app.css +1394 -0
- taskunity/static/chart.umd.min.js +14 -0
- taskunity/static/chartjs-adapter-date-fns.bundle.min.js +7 -0
- taskunity/static/htmx.min.js +68 -0
- taskunity/task_store.py +598 -0
- taskunity/templates/base.html +397 -0
- taskunity/templates/index.html +4 -0
- taskunity/templates/partials/board.html +24 -0
- taskunity/templates/partials/calendar.html +25 -0
- taskunity/templates/partials/main.html +283 -0
- taskunity/templates/partials/milestone_banner.html +34 -0
- taskunity/templates/partials/milestone_panel.html +222 -0
- taskunity/templates/partials/milestones.html +55 -0
- taskunity/templates/partials/projects.html +41 -0
- taskunity/templates/partials/task_list.html +52 -0
- taskunity/templates/partials/task_panel.html +310 -0
- taskunity/templates/partials/timeline.html +24 -0
- taskunity-2026.1.dist-info/METADATA +238 -0
- taskunity-2026.1.dist-info/RECORD +27 -0
- taskunity-2026.1.dist-info/WHEEL +5 -0
- taskunity-2026.1.dist-info/entry_points.txt +2 -0
- taskunity-2026.1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: taskunity
|
|
3
|
+
Version: 2026.1
|
|
4
|
+
Summary: A local, file-backed productivity app for program/task tracking.
|
|
5
|
+
Author: Taskunity Contributors
|
|
6
|
+
License: MIT
|
|
7
|
+
Keywords: tasks,productivity,fastapi,local-first,dashboard
|
|
8
|
+
Classifier: Development Status :: 3 - Alpha
|
|
9
|
+
Classifier: Framework :: FastAPI
|
|
10
|
+
Classifier: Intended Audience :: Developers
|
|
11
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
16
|
+
Requires-Python: >=3.10
|
|
17
|
+
Description-Content-Type: text/markdown
|
|
18
|
+
Requires-Dist: fastapi>=0.111
|
|
19
|
+
Requires-Dist: uvicorn[standard]>=0.30
|
|
20
|
+
Requires-Dist: jinja2>=3.1
|
|
21
|
+
Requires-Dist: python-multipart>=0.0.9
|
|
22
|
+
Requires-Dist: pydantic>=2.7
|
|
23
|
+
Requires-Dist: markdown>=3.6
|
|
24
|
+
Provides-Extra: dev
|
|
25
|
+
Requires-Dist: pytest>=8; extra == "dev"
|
|
26
|
+
Requires-Dist: ruff>=0.5; extra == "dev"
|
|
27
|
+
Provides-Extra: docs
|
|
28
|
+
Requires-Dist: sphinx>=7; extra == "docs"
|
|
29
|
+
Requires-Dist: myst-parser>=3; extra == "docs"
|
|
30
|
+
Requires-Dist: furo>=2024.1; extra == "docs"
|
|
31
|
+
|
|
32
|
+
# Taskunity
|
|
33
|
+
|
|
34
|
+
A local-first, file-backed productivity web app for managing tasks. Everything lives in
|
|
35
|
+
plain files on your disk — no database, no account, no cloud. Point Taskunity at a folder and it
|
|
36
|
+
serves a browser UI for dashboards, a Gantt timeline, a Kanban board, a calendar, activity logs,
|
|
37
|
+
burndown charts, and an editable task side panel.
|
|
38
|
+
|
|
39
|
+
> Documentation: a full guide is in the [`docs/`](docs/) folder and is set up to build on
|
|
40
|
+
> [Read the Docs](https://readthedocs.org/) (Sphinx + Markdown).
|
|
41
|
+
|
|
42
|
+
## Screenshots
|
|
43
|
+
|
|
44
|
+
| Task List | Task Board |
|
|
45
|
+
|-----------|-----------|
|
|
46
|
+
|  |  |
|
|
47
|
+
|
|
48
|
+
| Gantt Timeline | Calendar |
|
|
49
|
+
|----------------|----------|
|
|
50
|
+
|  |  |
|
|
51
|
+
|
|
52
|
+
| Milestones | Projects |
|
|
53
|
+
|------------|----------|
|
|
54
|
+
|  |  |
|
|
55
|
+
|
|
56
|
+
| Task Activity Log | Settings (Theme) |
|
|
57
|
+
|-------------------|------------------|
|
|
58
|
+
|  |  |
|
|
59
|
+
|
|
60
|
+
| Task Burndown Chart | Milestone Burndown Chart |
|
|
61
|
+
|---------------------|--------------------------|
|
|
62
|
+
|  |  |
|
|
63
|
+
|
|
64
|
+
## Why Taskunity
|
|
65
|
+
|
|
66
|
+
- **File-backed source of truth.** Each task is a single JSON file you can read, diff, and commit
|
|
67
|
+
to git. The whole workspace is a folder you own.
|
|
68
|
+
- **Local-first.** Runs entirely on `127.0.0.1`. Your data never leaves your machine.
|
|
69
|
+
- **Git-aware.** The UI shows branch/ahead/behind/dirty status and has a one-click commit + pull +
|
|
70
|
+
push sync button when the workspace folder itself is a git repo.
|
|
71
|
+
|
|
72
|
+
## Workspace layout
|
|
73
|
+
|
|
74
|
+
The source of truth is a workspace folder:
|
|
75
|
+
|
|
76
|
+
```text
|
|
77
|
+
workspace/
|
|
78
|
+
config.json # editable workspace/app metadata
|
|
79
|
+
projects/
|
|
80
|
+
apollo.json # one file per project
|
|
81
|
+
tasks/
|
|
82
|
+
A1B2-C3D4-E5F6-7890.json # one file per task (native id format)
|
|
83
|
+
milestones/
|
|
84
|
+
M-1A2B-3C4D.json # one file per milestone (groups tasks across projects)
|
|
85
|
+
assets/
|
|
86
|
+
A1B2-C3D4-E5F6-7890/ # attachments live alongside their task id
|
|
87
|
+
screenshot.png
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
The app provides a browser UI for viewing dashboards, timelines, task boards, activity logs,
|
|
91
|
+
burndown charts, and editing tasks through a side panel.
|
|
92
|
+
|
|
93
|
+
## Install locally
|
|
94
|
+
|
|
95
|
+
From a clone of this repository:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
pip install -e .
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
This installs the `taskunity` command. (A PyPI release will come later; for now install from
|
|
102
|
+
source.)
|
|
103
|
+
|
|
104
|
+
## Quick start
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
taskunity serve --workspace ./my-workboard
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
If the workspace folder does not exist yet, `taskunity serve` will create the empty Taskunity
|
|
111
|
+
structure for you. You can also run it from the current directory and let Taskunity use `.` as
|
|
112
|
+
the workspace.
|
|
113
|
+
|
|
114
|
+
Then open:
|
|
115
|
+
|
|
116
|
+
```text
|
|
117
|
+
http://127.0.0.1:8000
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
`init` is available if you want to scaffold a folder explicitly. It creates an editable
|
|
121
|
+
`config.json`, empty `projects/`, `tasks/`, `milestones/`, and `assets/` directories, plus a README
|
|
122
|
+
stub. It does not create starter projects or tasks; use the app to add your own once you begin.
|
|
123
|
+
|
|
124
|
+
## Serve an existing workspace
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
taskunity serve --workspace ./path/to/workspace --host 127.0.0.1 --port 8000
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
| Flag | Default | Description |
|
|
131
|
+
| --- | --- | --- |
|
|
132
|
+
| `--workspace` | `.` | Workspace folder to serve |
|
|
133
|
+
| `--host` | `127.0.0.1` | Host interface to bind |
|
|
134
|
+
| `--port` | `8000` | Port to listen on |
|
|
135
|
+
| `--reload` | off | Enable uvicorn auto-reload (development) |
|
|
136
|
+
|
|
137
|
+
## Task file example
|
|
138
|
+
|
|
139
|
+
```json
|
|
140
|
+
{
|
|
141
|
+
"id": "A1B2-C3D4-E5F6-7890",
|
|
142
|
+
"title": "CAF refinement prototype",
|
|
143
|
+
"status": "working",
|
|
144
|
+
"priority": "high",
|
|
145
|
+
"project": "Apollo",
|
|
146
|
+
"summary": "Build a prototype CAF refinement workflow.",
|
|
147
|
+
"description": "Compare baseline CAF sharpness against protection-aware refinement.",
|
|
148
|
+
"tags": ["caf", "signal-processing", "prototype"],
|
|
149
|
+
"start_date": "2026-06-24",
|
|
150
|
+
"due_date": "2026-06-30",
|
|
151
|
+
"completed_date": null,
|
|
152
|
+
"percent_complete": 60,
|
|
153
|
+
"depends_on": ["0EBB-528F-371E-61AE"],
|
|
154
|
+
"checklist": [
|
|
155
|
+
{"text": "Generate baseline CAF", "done": true},
|
|
156
|
+
{"text": "Export comparison plots", "done": false}
|
|
157
|
+
],
|
|
158
|
+
"activity": [
|
|
159
|
+
{
|
|
160
|
+
"id": "a1b2c3d4",
|
|
161
|
+
"event_type": "note",
|
|
162
|
+
"created_at": "2026-06-26T10:30:00",
|
|
163
|
+
"note_text": "Protection-aware version improved sharpness."
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
"id": "e5f6a7b8",
|
|
167
|
+
"event_type": "progress_update",
|
|
168
|
+
"created_at": "2026-06-26T11:00:00",
|
|
169
|
+
"progress_before": 40,
|
|
170
|
+
"progress_after": 60
|
|
171
|
+
}
|
|
172
|
+
]
|
|
173
|
+
}
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
`depends_on` stores task **ids**. In the UI you add dependencies with a search-as-you-type picker
|
|
177
|
+
that finds tasks by name and shows their status, project, due date, and id — then stores the id.
|
|
178
|
+
Dependencies are reflected on the Gantt timeline (an `↳ after <name>` label plus a marker where the
|
|
179
|
+
dependency's bar ends).
|
|
180
|
+
|
|
181
|
+
## Milestones
|
|
182
|
+
|
|
183
|
+
Milestones are a separate entity from projects. A milestone can span **multiple projects**, holds an
|
|
184
|
+
**ordered list of tasks** (which can come from any project, and a task can belong to any number of
|
|
185
|
+
milestones), and has its own description, notes, and attachments — just like a task.
|
|
186
|
+
|
|
187
|
+
- Open the **Milestones** view to see every milestone with a live rollup (task count, progress,
|
|
188
|
+
target date).
|
|
189
|
+
- Click a milestone to **filter the whole board to just its tasks** and show a rollup banner; the
|
|
190
|
+
side panel opens the milestone for editing.
|
|
191
|
+
- Each milestone has its **own colour** used on milestone cards and the rollup banner.
|
|
192
|
+
- From inside a milestone you can **add a task** with one search-as-you-type picker and use the
|
|
193
|
+
sticky **+ New task** button at the bottom of the list for quick creation (auto-added to that
|
|
194
|
+
milestone), and remove tasks.
|
|
195
|
+
|
|
196
|
+
Milestones are stored one JSON file per milestone under `milestones/`.
|
|
197
|
+
|
|
198
|
+
## Features
|
|
199
|
+
|
|
200
|
+
- JSON-per-task source model you can version with git
|
|
201
|
+
- Dashboard summary cards (total / done / working / blocked)
|
|
202
|
+
- Kanban-style board with per-project color strips
|
|
203
|
+
- Gantt timeline with dependency markers
|
|
204
|
+
- Calendar view
|
|
205
|
+
- **Milestones** that group tasks across projects, with per-milestone colour,
|
|
206
|
+
click-to-filter rollup, and their own notes/attachments/description
|
|
207
|
+
- Click any task (row, card, timeline bar, calendar entry) to open an editable side panel
|
|
208
|
+
- Save edits back to the JSON file; raw JSON editor escape hatch
|
|
209
|
+
- **Unified activity log** per task: notes, images, and progress changes in chronological order
|
|
210
|
+
- **Task burndown chart**: remaining work over time from progress_update events
|
|
211
|
+
- **Milestone cumulative burndown chart**: aggregate remaining work across all tasks in a milestone
|
|
212
|
+
- Searchable "depends on" picker that resolves names to task ids
|
|
213
|
+
- Project management with custom colors, each stored in its own JSON file
|
|
214
|
+
- Filtering by project, milestone, date range, and free-text search; sortable views
|
|
215
|
+
- CSV / JSON export
|
|
216
|
+
- Built-in git status chip and one-click sync (commit + pull + push)
|
|
217
|
+
|
|
218
|
+
## Building the docs locally
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
pip install -e ".[docs]"
|
|
222
|
+
sphinx-build -b html docs docs/_build/html
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
Open `docs/_build/html/index.html`. On Read the Docs the build is driven by
|
|
226
|
+
[`.readthedocs.yaml`](.readthedocs.yaml).
|
|
227
|
+
|
|
228
|
+
## Development
|
|
229
|
+
|
|
230
|
+
```bash
|
|
231
|
+
pip install -e ".[dev]"
|
|
232
|
+
pytest
|
|
233
|
+
ruff check .
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
## License
|
|
237
|
+
|
|
238
|
+
MIT
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
taskunity/__init__.py,sha256=kUR5RAFc7HCeiqdlX36dZOHkUI5wI6V_43RpEcD8b-0,22
|
|
2
|
+
taskunity/app.py,sha256=L8ZpCHD6FmrevznU89cYWHwDyJBh-2w0aOVNlmd7950,46654
|
|
3
|
+
taskunity/cli.py,sha256=JSBe-O5H0_A9BK2Xy4S6O_6E_Y1lqoFQ7BOdsDhtxSU,1702
|
|
4
|
+
taskunity/models.py,sha256=aBNhVdY8naS0M19Dy9Vi0NOkSan6ytMbo1xm81l0SZ4,3057
|
|
5
|
+
taskunity/render.py,sha256=yd9D8TBlcedlGuwklRNtE-S3Uhbg2tq1kY1knd6q0kk,12952
|
|
6
|
+
taskunity/task_store.py,sha256=2_BGI42MbbiiMHn_r_4MVfX_2tUz2zEpauZUIa99y3Y,22217
|
|
7
|
+
taskunity/static/app.css,sha256=moWR7hOM-iBeh33PCXJqfXklLcBsEG735zMBrzTmMVU,45847
|
|
8
|
+
taskunity/static/chart.umd.min.js,sha256=SERKgtTty1vsDxll-qzd4Y2cF9swY9BCq62i9wXJ9Uo,208522
|
|
9
|
+
taskunity/static/chartjs-adapter-date-fns.bundle.min.js,sha256=6nqzDSbDjc8fLSa7Q-c6lFN7WPGQb1XhpUbdCTIbVhU,50650
|
|
10
|
+
taskunity/static/htmx.min.js,sha256=klmgDHsZ6a8XOPG-kmXPLypaMFoBKirr7Mt0uEVp8vw,2773
|
|
11
|
+
taskunity/templates/base.html,sha256=m2VfkK3if5VeqkU56dmD1DSSM5AHRCSuExx5LJTzP6E,16576
|
|
12
|
+
taskunity/templates/index.html,sha256=pwN71jYXFk9F2_u0lnKfjIa1hyheYORJw8pwmh5R7zs,95
|
|
13
|
+
taskunity/templates/partials/board.html,sha256=O3kHt4JOqCLWv-XEodsTtnfhdZWkcwdtzEbI6khelP4,1462
|
|
14
|
+
taskunity/templates/partials/calendar.html,sha256=enMtbW7aLCH22LESwiiH6FVjcy0wEmoR32DkQbmgTrk,1182
|
|
15
|
+
taskunity/templates/partials/main.html,sha256=ADYaFA1SLwbHXcDcunuIhQM7XaHs4fPSaVozKW-GyhQ,18901
|
|
16
|
+
taskunity/templates/partials/milestone_banner.html,sha256=idIeD9uAU4EDnV48m04_st-T5D0J_iXk77OT9--8XhA,2097
|
|
17
|
+
taskunity/templates/partials/milestone_panel.html,sha256=6ACKRGIN77vo9UVSkD2kXiNmAp2U8uvK0p4Ay5a2A2U,12542
|
|
18
|
+
taskunity/templates/partials/milestones.html,sha256=UmbLMCwpPhaxydr3Uqmc3SKxKCqra56bTVg6kuBfnPs,2876
|
|
19
|
+
taskunity/templates/partials/projects.html,sha256=PFvhEprbihtH9sVW-kIB2i5Rth7ffJH7imbTZPl86FI,1768
|
|
20
|
+
taskunity/templates/partials/task_list.html,sha256=HhZikF2clnExMav2PiVbojpTckRKYTm3KRDEk-KZ030,3233
|
|
21
|
+
taskunity/templates/partials/task_panel.html,sha256=qBrs7NZwn5CwVBzdzAZI9atgY7_V_Lr6YDjOPycZy1c,17591
|
|
22
|
+
taskunity/templates/partials/timeline.html,sha256=ae8d_do8Z5bI_IQLiDZmz3o5flAP8fxYQ-yZVqF_zos,1750
|
|
23
|
+
taskunity-2026.1.dist-info/METADATA,sha256=pjWS42bAS6GJRJJYusx-ZZAhYwLWt4SpAf2HPMXU3SY,9134
|
|
24
|
+
taskunity-2026.1.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
|
|
25
|
+
taskunity-2026.1.dist-info/entry_points.txt,sha256=gRoen6I_jQKeihjHZlkw4ewKlr6nfe2YGgvYXDczM4w,49
|
|
26
|
+
taskunity-2026.1.dist-info/top_level.txt,sha256=umSK26x52afLBsi90EfwiR0MuTWrxmgReATuMUAE5L0,10
|
|
27
|
+
taskunity-2026.1.dist-info/RECORD,,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
taskunity
|