Skip to main content

tali 🧙‍♂️

The CLI magic 🔮 for task alchemists -- Weave productivity spells with symbols that conjure order 📓 from chaos 🌀.

GitHub License PyPI Python Version

tali is a magical command-line task manager. It manipulates tasks with intuitive symbols for fast yet powerful filtering, grouping, sorting and batch operations.

screenshot

Contents

✨ Features

  • 🚀 Fast Symbolic Syntax -- Intuitive symbols for fast task filtering and editing: @tag, /project, ^1week.
  • 🔎 Powerful Filtering, Grouping and Sorting -- Filter, group and sort items with ease: tali /work ! ^today @ =^.
  • 📒 Batch Operations -- Modify multiple filtered tasks at once: tali /grocery @fruit . ,d marks tasks with tag @fruit in /grocery project as done.
  • 😄 Emoji Support -- Use Emoji markups for visual flair: 💥 = :boom:.
  • ⏪ Undo/Redo -- Never fear accidental changes with -u/--undo and -r/--redo.
  • ⚙️ Highly Customizable -- Configure symbols, aliases, rendering format/style, editor, pager, database location, and more in ~/.config/tali/config.toml.
  • 📁 Folder-specific Task Management -- Organize tasks in specific directories by creating a .tali folder in any directory.
  • 📇 JSON Storage/Export -- Machine-readable output with -j/--json.
  • 📜 Cheat Sheet Built-in -- Always available with -c/--cheatsheet.
  • 1️⃣ Idempotent Operations -- Use interactive editor or scripts to modify tasks.

📦 Installation

  • Using pip

    pip install tali-cli
    
  • Using uv

    uv tool install tali-cli
    
  • From source

    git clone https://github.com/admk/tali && cd tali && pip install .
    
  • Requires Python 3.10+.

📖 Usage Examples

🪄 Basic Usage

tali . "Buy milk" /grocery ^today  # Create a task with project and deadline
tali . "Meeting notes" /work ^"tue 4pm" ,n  # Create a note
tali . "Fix bug" /tali !high @urgent  # Create high-priority task with tag
tali 42 . ,  # Toggle completion for task 42
tali 42 . ,x  # Delete task
tali ^today . @star  # Toggle star tag for all tasks due today

🔎 Filtering & Querying

tali /work !high ^today  # Show high-priority work tasks due today
tali /work + /home  # Show tasks in /work or /home
tali '(/work + /home) @urgent'  # Show urgent tasks in /work or /home
tali /work ~@waiting  # Show /work tasks without the @waiting tag
tali ^fri  # Select tasks that are due by Friday
tali @ =^  # Group tasks by tag sorted by deadline
tali 42 ?^  # Query deadline of task 42

✏️ Task Modifications

tali 42 . ,done  # Mark task 42 as done ☑️
tali 42 . ,  # Toggle task status
tali 42 . @star  # Toggle star tag ⭐
tali 42 . @fav  # Toggle favorite tag ❤️
tali 42 . !h  # Set high priority ‼️
tali 42 . ,x  # Delete task 🗑️
tali 42 . : "Details..."  # Add description
tali 42 . "New title" /newproject ,n  # Edit multiple properties

⏰ Deadline Management

tali 42 . ^+3d  # Postpone deadline by 3 days
tali 42 . ^2mon  # Set to Monday after next
tali 42 . ^M  # Set to end of month
tali 42 . ^oo  # Remove deadline

📒 Batch Operations

tali 1..5 . ,x  # Delete tasks 1-5
tali @urgent . !high  # Set all @urgent tasks to high priority
tali /home .  # Edit all tasks in /home project in text editor

🧪 Advanced Options

tali (-d|--debug) <...>  # Debug mode
tali (-j|--json) <...>  # Output in JSON format
tali (-H|--history)  # Show commit history
tali (-u|--undo)  # Undo last operation; repeat, e.g. -uu, to undo more
tali (-r|--redo)  # Redo last undone operation; repeat, e.g. -rr, to redo more
tali (-R|--re-index)  # Re-index database

📝 Editor Usage

You can invoke an interactive editor by running:

tali (-e|--edit)  # start an empty editor for task editing
tali <selection> .  # or edit tasks filtered by <selection>

In the editor, you can write task editing or adding commands without the tali prefix. When you save and close the editor:

  • Each line will be treated as a separate command
  • Commands will be executed sequentially
  • Supports recursive prefix sharing for faster editing

Example:

. /home/grocery ^today buy
  @fruit
    apples
    oranges
  milk

This would be interpreted as:

. /home/grocery ^today @fruit buy apples
. /home/grocery ^today @fruit buy oranges
. /home/grocery ^today buy milk

To add nested tasks without knowing the parent's ID, start each nested child line with .:

. /work release checklist
  . draft outline
  . collect screenshots
    . crop hero image

Indented lines without a leading . still use prefix sharing. This also works inside nested blocks:

. /work
  release checklist
    @urgent
      . draft outline
      . collect screenshots

For multi-line descriptions in editor mode, use indented : lines under the task:

. /work release checklist
  : First description line.
  : Second description line.

For longer descriptions, use a fenced block. The fence defaults to """ and can be changed with token.description_fence:

. /work release checklist : """
First description line.
Second description line.
"""

⚙️ Configuration

Global configuration is stored in ~/.config/tali/config.yaml (or $XDG_CONFIG_HOME/tali/config.yaml). It also uses .tali/config.yaml in your project directory for project-specific setting overrides if it exists. Edit with:

tali --edit-rc

See config.yaml for all default configurations. See Configuration Guide for details of how to customize tali.

📜 Symbol Cheat Sheet

Token Name Description Example
. separator Separates selection from action 1..3 . ,done
.. id range Range of item IDs 1..5
, status Task status (see values below) ,pending
/ project Project category /work
@ tag Custom tag @critical
! priority Priority level (see values below) !high
^ deadline Due date/time expression ^tomorrow
= sort Sort results =! (priority)
? query Query attributes ?^ (deadline)
: description Long description : details...
+ or OR between selection clauses /work + /home
~ not Negate the next selection filter ~@waiting
( group open Opens a selection expression (/work + /home
) group close Closes a selection expression /home) @tag
- stdin Read from standard input -

Settable token values:

  • Status accepts pending, done, note, archive, and delete. Default aliases are p, d/c, n, a, and x. A bare , action toggles pending/done.
  • Priority accepts high, normal, and low. Default aliases are h, n, and l. A bare ! action sets high priority; !+ raises priority and !- lowers it.
  • Deadline accepts date expressions such as today, tomorrow, feb21, 10am, mon, +3d, -1w, and +M1d. Quote values with spaces, for example ^"tue 4pm". In actions, ^oo clears the deadline.
  • Selection adjacency is AND, a standalone + is OR, and ~ negates the next selection filter. Parentheses group selection expressions; through a shell, quote or escape them, for example '(/work + /home) @urgent'. These defaults are configured with token.or, token.not, token.open_paren, and token.close_paren.

🚀 Productivity Tips

📟 Shell Aliases

Use t as an alias for tali. For example:

  1. Add the following line to your ~/.bashrc or ~/.zshrc:
    alias t='tali'
    
  2. source ~/.bashrc or source ~/.zshrc to apply the changes.
  3. Use t <...> instead of tali <...> for extra speed.

🎨 Syntax Highlighting

🧙‍♂️ Contribute

💡 Inspired by

  • taskbook: Tasks, boards & notes for the command-line habitat.
  • taskwarrior: A command line task list management utility.

Metadata

Release files for tali-cli 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for tali-cli 0.3.0
File Size Uploaded
tali_cli-0.3.0.tar.gz 63.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for tali-cli 0.3.0
File Interpreter ABI Platform
tali_cli-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 119.0 kB

Release files / tali_cli-0.3.0.tar.gz

Download URL tali_cli-0.3.0.tar.gz
Size 63.8 kB
Tags Source
SHA-256 checksum
How to use checksums
e9d62a5a6c5764dccb5f9c8ed5b720d232817cfa963ebab51aadd671488588c0
BLAKE2b-256 checksum
How to use checksums
da95e8cf8c94ec518c7e5f9a35c60e4e261aba7bb59d1fb0535c8eaec124abe5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jun 10, 2026.

Transparency log

Release files / tali_cli-0.3.0-py3-none-any.whl

Download URL tali_cli-0.3.0-py3-none-any.whl
Size 55.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
214700333a2bc5f58a94cd4e18edd324b86a42aba884b9cf15229a0591fe758b
BLAKE2b-256 checksum
How to use checksums
15ed5af4b227fa93fd6e64c285cffa7b959502e4912f792a48bac607cb90f530
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jun 10, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.3.0 This release

2 release files

0.2.4

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.6

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page