- When setting a new task to DOING, the previous DOING task now switches to PENDING instead of TODO
- Task display order now prioritizes by status: DONE < DOING < PENDING < TODO, with order field respected within each status group
Goals table has selected_task_id referencing tasks(id) without
ON DELETE SET NULL. When deleting a task, first clear any
selected_task_id references in goals to prevent FK violation.
Also update schema for future databases.
The Save button already has type=submit which naturally triggers
form submission. The additional click handler dispatching submit
event caused handleTaskSubmit to run twice.
'order' is a reserved keyword in SQLite. Quote all column names
in update_user, update_goal, and update_task to prevent syntax
errors when updating columns with reserved names.
- Add novalidate to task-form to prevent browser validation quirks
- Add explicit click handler for Save button that triggers
form submission via dispatched event for mobile compatibility
On small screens (<=640px), modal action buttons now stack
vertically with full width instead of wrapping unpredictably.
This applies to all modals: note, task, goal.
On small screens (<=480px), the goal selector dropdown could
overflow due to long option text. Match notes page behavior:
set select to width:100% with max-width:100%.
Use INSERT OR IGNORE instead of SELECT-then-INSERT for
default admin user creation, avoiding the race condition
when multiple gunicorn workers initialize simultaneously.
- Implement notes database schema and API endpoints
- Add notes page with filtering, search, and markdown support
- Persist selected goal and task preferences for better UX
- Include responsive design and mobile-friendly layout
- Replace TinyDB (JSON file) with sqlite3 for data persistence
- Add schema.py: table creation + data migration from db.json
- Rewrite database.py: all CRUD operations use sqlite3 directly
- All data retains original IDs via migration script
- Remove tinydb dependency from pyproject.toml
- Complete tasks now displayed in scroll view alongside unfinished tasks
- Priority order: completed tasks first (by finished_time desc), then unfinished (by order asc)
- Time picker-style scroll: wheel scroll snaps per task, center item gets visual focus
- Landscape mode (>=1024px): scroll view + edit panel side by side, panel always visible
- Portrait mode: edit panel slides in from right on tap
- Fixed flex layout so scroll view and edit panel align perfectly in height
- Flask backend with TinyDB database
- Multi-user auth with bcrypt password hashing
- Goal CRUD with activation/deactivation and per-user limits
- Task CRUD with status tracking (todo/doing/pending/done)
- Focus rule: one doing task per goal
- Time picker-style scroll view with drag-and-drop reordering
- Admin panel for user management
- uv environment management