Skip to main content

A minimalist, interactive command-line task manager built with Python.

Project description

odot

A minimalist, interactive command-line task manager built with Python.

odot provides a fast and intuitive way to manage your daily tasks directly from your terminal. Built upon Typer and SQLModel, it offers a robust SQLite-backed database with an elegant Terminal User Interface (TUI) for interactive task selection.

Features

  • Interactive Prompts: Execute commands without remembering IDs. If you forget to pass an argument, odot will display a dynamic Arrow-Key navigable menu to select tasks.
  • Rich Output: Clean, formatted tables utilizing the rich library for high readability.
  • Filtering: Easily filter missing or completed tasks right from the list command.
  • Local First: Stores your data securely in a local .sqlite database configurable via environment variables.
  • Zero Configuration: Works out of the box with intelligent defaults.

Installation

You can install odot directly from PyPI using pip, pipx, or uv.

Using pip:

pip install odot

Using pipx (Recommended for isolated CLI application installations):

pipx install odot

Using uv:

uv tool install odot

Quick Start

Once installed, initialize the database to create the required tables on your local machine.

odot init-db

By default, the database is stored at ~/.odot/db.sqlite. You can override this by setting the ODOT_DB_PATH environment variable.

Usage

Adding a Task

You can add a task by passing the content directly, or you can supply priority (-p) and category (-c) flags.

odot add "Buy groceries for dinner"
odot add "Submit quarterly report" -p 3 -c work

Listing Tasks

View all of your current tasks in a formatted table.

odot list

You can optionally filter the list by status:

odot list --done      # Show only completed tasks
odot list --pending   # Show only open tasks

Showing a Task

View detailed properties and timestamps for a specific task. If you don't know the ID, simply run odot show without arguments to open the interactive selection menu.

odot show
odot show 1

Updating a Task

Update the properties of an existing task. If you run odot update without providing a task ID, it will gracefully open an interactive selection menu to pick a task. Subsequently, if you don't provide any explicit update flags, it will launch a multi-select interactive checklist allowing you to pick exactly which fields to change.

# Fully interactive mode (Prompts for task, then prompts for fields)
odot update

# Explicit mode
odot update 1 --content "Revised task name" --done --priority 2

Removing a Task

Delete a task from the database permanently. If you don't provide an ID, odot will open the interactive selection menu so you can browse for the task to delete. By default, odot prompts you for confirmation before execution unless you provide the --force flag.

# Interactive task selection mapping
odot rm
odot rm 1
odot rm 1 --force

Development

If you wish to contribute or modify odot locally, ensure you have uv (for Python dependency management), gh (the GitHub CLI, for workflow automation), and just (the recipe task runner) installed.

  1. Clone the repository.
  2. Run uv sync to install dependencies.
  3. Authenticate the GitHub CLI via gh auth login.
  4. Use the included just workflows to run checks and tests:
just test        # Run the pytest suite natively
just test-cov    # Run tests and enforce 100% coverage
just check       # Run Ruff formatting, linting, ty typechecks, and test loops

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

odot-0.1.1.tar.gz (6.3 kB view details)

Uploaded Source

Built Distribution

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

odot-0.1.1-py3-none-any.whl (8.0 kB view details)

Uploaded Python 3

File details

Details for the file odot-0.1.1.tar.gz.

File metadata

  • Download URL: odot-0.1.1.tar.gz
  • Upload date:
  • Size: 6.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for odot-0.1.1.tar.gz
Algorithm Hash digest
SHA256 8e89c19571d2e93c41788871d23c05f4a7c55e9a2138f287ce94d86f9edf3cdf
MD5 35832040349773f932a227f8c7f2752b
BLAKE2b-256 4a4d201e17fddc146f41fdf7f7811dff7de671c8e321d16360232c1604d628b0

See more details on using hashes here.

Provenance

The following attestation bundles were made for odot-0.1.1.tar.gz:

Publisher: release.yml on jkomalley/odot

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file odot-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: odot-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 8.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for odot-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 3173d643e5e7c0851f424d4815f817c084a6f7546828a7bddca6504ecf8d6a3c
MD5 99c99a0f59084e4e78e3c76f4c82fbf8
BLAKE2b-256 fd977af379b682baab5f3bd41916254e3e9054ce8eebb9592f4465f3aac0944a

See more details on using hashes here.

Provenance

The following attestation bundles were made for odot-0.1.1-py3-none-any.whl:

Publisher: release.yml on jkomalley/odot

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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