← Back to projects

Personal Python project

OneTask CLI

A command-driven Python task manager with persistent JSON storage, completion tracking, and due-date support.

Status
v0.1 complete · v0.2 in progress
Format
Python command-line application
Focus
Practical terminal workflow

OneTask CLI

$ tm
> add Finish operating systems assignment
Added task 6: Finish operating systems assignment

> due 6 tomorrow
Set due date for task 6 to 2026-08-02.

> list
Tasks:
[ ] 6: Finish operating systems assignment
    (due: 2026-08-02)

> done 6
Marked task 6 as complete: Finish operating systems assignment

Overview

I built OneTask to practice Python through a complete project rather than isolated exercises. It gave me a focused place to work through parsing, command routing, persistent data, validation, Git workflows, and incremental development.

I kept the interface command-driven because I wanted a terminal workflow I could use for school and personal tasks—not a large productivity system with more surface area than I needed.

Current features

Interactive terminal workflow

Launch with the local tm command and work through typed commands instead of numbered menus.

Task lifecycle

Add tasks, list saved work, mark tasks complete with done <id>, and delete by ID or exact text.

Persistent local data

Tasks are stored in tasks.json with auto-incrementing IDs and id, text, done, and due fields.

Due-date support

Set due dates to today, tomorrow, a YYYY-MM-DD value, or none, then see them while listing tasks.

Input safeguards

Reject empty and whitespace-only task names and provide a help command for the available workflow.

Terminal convenience

Use tm to launch the program without manually typing python3 main.py.

Terminal demo

tm
$ tm

----------------------------------
         OneTask CLI
----------------------------------
Type 'help' for a list of commands

> add Finish operating systems assignment
Added task 6: Finish operating systems assignment

> due 6 tomorrow
Set due date for task 6 to 2026-08-02.

> list
Tasks:
[ ] 6: Finish operating systems assignment
    (due: 2026-08-02)

> done 6
Marked task 6 as complete: Finish operating systems assignment

> list
Tasks:
[x] 6: Finish operating systems assignment
    (due: 2026-08-02)

> exit
Program Saving...... Closing!

How it works

  1. main.pyStarts the interactive loop and routes commands.
  2. parse.pySeparates a command from its arguments.
  3. commands.pyContains command behavior such as add, list, done, delete, and due.
  4. tasks.jsonStores task data locally, while load/save helpers manage persistence.
  5. Change signalCommand functions return whether data changed so the program knows when to save.

Evolution

  1. Foundation

    Started with a simple parser and command-routing experiment.

  2. Persistence

    Added JSON loading and saving, then task creation, listing, deletion, and completion.

  3. Polish

    Improved validation and command help, then tagged the initial v0.1 release.

  4. v0.2

    Began due-date support and continued organizing work through GitHub Issues.

  5. Next

    Filtering, tags, priorities, search, packaging, and richer terminal formatting remain planned work.

Challenges & lessons

Git workflows in practice

I learned how local history and GitHub fit together through staging, meaningful commits, pulling with rebase, pushing, releases, and resolving a .gitignore conflict.

Persistence without tracking user data

Keeping generated task data and the Python virtual environment out of Git made it clear which files belong to the program and which belong to a local user session.

Small command design decisions

Command functions report whether data changed, so the program knows when to save. That kept the interactive loop simple while making updates predictable.

Useful validation

Handling empty input and quoted whitespace early prevented confusing task data without making the command interface complicated.

Status & roadmap

Implemented

  • Interactive terminal interface and help command.
  • Add, list, complete, and delete task commands.
  • JSON persistence with auto-incrementing IDs.
  • Input validation and due-date support.
  • Local tm command for quick launch.

In progress

  • v0.2 development, including the newly added due-date workflow.

Planned

  • Filters for today, tomorrow, the upcoming week, and all tasks.
  • Startup dashboard, tags, priorities, sorting, and keyword search.
  • Better terminal formatting and completed-task archiving.
  • Python packaging, installation, and a potential macOS launcher.

Skills & technologies

  • Python
  • JSON
  • CLI design
  • Command parsing
  • File persistence
  • Input validation
  • Git
  • GitHub Issues
  • Releases
  • Terminal workflow

Small, focused features made room to practice release tagging, issue tracking, documentation, and a Git history built from meaningful commits rather than one large upload.

Repository

OneTask is an ongoing personal project, with v0.1 released and v0.2 development underway.

Open OneTask on GitHub ↗