A lightweight, file-based CLI tool for managing personal tasks using folders and Markdown.
tasks is a simple productivity utility that stores each task as its own directory containing a TASK.md file.
The structure is intentionally designed to support future expansion such as attachments, images, or additional metadata alongside the Markdown file.
⚠️ Disclaimer
This is a personal recreational project provided as-is.
Use at your own risk. No guarantees are provided regarding data safety or stability.
ℹ️ Note While building on Linux/Mac you can test:
sh tests/test_cli.sh ./build/taskor
chmod +x ./tests/test_cli.sh tests/test_cli.sh ./build/taskIf you are on macOS and you want to test for Linux then you have:
sh ./linux_test.shwhich run docker, builds the project and automatically run the ./test_cli.sh
If you are on macOS/Linux and you want to test for windows:
sh ./windows_test.sh- macOS: supported
- Linux: supported
- Windows: supported (not verified yet)
- TODO: Fix windows_test.dockerfile
- and windows_test.sh
- TODO: Fix windows_test.dockerfile
- File-based task storage (no database, no lock-in)
- Human-readable Markdown task format
- Stable task identifiers based on UTC timestamps
- Designed for extensibility (attachments, assets, metadata)
- Single static binary — fast, portable, and dependency-free
Each task is stored in its own directory, named using the current UTC timestamp:
20260104201212/ └── TASK.md This structure allows future enhancements (images, notes, related files) to be placed directly next to the task description.
When executed, tasks creates (or uses) a tasks/ directory in the current working directory.
- If the program is run outside a
tasks/directory, it creates one. - If run inside an existing
tasks/directory, it uses that directory directly and avoids nesting.
This makes the tool fully portable and project-local.
- C compiler with C11 support
- CMake 4.1+
cmake -S . -B build cmake --build build./build/taskscmake -S . -B build cmake --build build make install # use (sudo make install) if permission requiredtasks — manage entries stored in ./tasks Usage: tasks [-h] [-a] [-c "title"] [-d [TASK_ID]] [-p [TASK_ID]] Options: -h Show help and exit -a List all tasks -c "some title" Create a new task -d [TASK_ID] Delete a task (or list tasks if no ID provided) -p [TASK_ID] Preview a task (or list tasks if no ID provided) Examples: tasks tasks -a tasks -c "Write documentation" tasks -p 20260104192618 tasks -d 20260104192618 # ID: 20260104192618 # CREATED_AT: 2026-01-04 19:26:18 STATUS: OPEN PRIORITY: ? TASK: Task title // Description Once tasks are created inside the tasks/ directory, you can choose how they integrate with your workflow:
- Commit tasks to Git if you want all contributors to share and update the same task list.
- Ignore the
tasks/directory in.gitignoreif tasks are personal or should not be modified by every contributor.
This flexibility allows the tool to be used both for individual productivity and for team coordination.
- Edit task content directly from CLI
- Mark tasks as completed / archived
- Tagging and filtering
- Task search
- Import / export support
- Optional JSON metadata file
- Optional sync support (git-friendly)
- Cross-platform packaging