Add your description here
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,
odotwill display a dynamic Arrow-Key navigable menu to select tasks. - Rich Output: Clean, formatted tables utilizing the
richlibrary for high readability. - Filtering: Easily filter missing or completed tasks right from the list command.
- Local First: Stores your data securely in a local
.sqlitedatabase 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.
- Clone the repository.
- Run
uv syncto install dependencies. - Authenticate the GitHub CLI via
gh auth login. - Use the included
justworkflows 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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file odot-0.1.0.tar.gz.
File metadata
- Download URL: odot-0.1.0.tar.gz
- Upload date:
- Size: 6.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.7 {"installer":{"name":"uv","version":"0.10.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
569678ae12d20b1ce9bd5640b0f3ff66351a96163d37dc88e2c828265295f627
|
|
| MD5 |
92011b85a147ce02daee90c0ffb222ba
|
|
| BLAKE2b-256 |
caabb60e71bc16c9d14d016c69f6360c3414029be9101d1d36f6ef213c140314
|
File details
Details for the file odot-0.1.0-py3-none-any.whl.
File metadata
- Download URL: odot-0.1.0-py3-none-any.whl
- Upload date:
- Size: 8.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.7 {"installer":{"name":"uv","version":"0.10.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f07d99a6909facf38396f820351abe6f79afe1a8c2e457f2f9e9f2f795c46aad
|
|
| MD5 |
8324a48f83ce1dabe1015b905842ebca
|
|
| BLAKE2b-256 |
6f178ef2e2612e6f8f2b8d06b8950e5f7d83c2b107cee96cee3c3d7c223342f7
|