Define tasks in Python. Run only what changed.

A task management & automation tool like make, but in pure Python. Tracks file dependencies, caches results, and skips tasks that are already up-to-date.

python logo
pip install doit

Often compared to make, just, invoke, and snakemake — but with DAG execution and incremental builds built in.

Quick Example

Create a dodo.py — tasks are plain Python dicts.

def task_hello():
    """create a greeting file"""
    return {
        'actions': ['echo "Hello from doit" > hello.txt'],
        'targets': ['hello.txt'],
        'clean': True,
    }

def task_shout():
    """convert greeting to uppercase"""
    return {
        'actions': ['tr a-z A-Z < hello.txt > shout.txt'],
        'file_dep': ['hello.txt'],
        'targets': ['shout.txt'],
        'clean': True,
    }
$ pip install doit
$ doit
.  hello
.  shout
$ doit            # nothing to do - already up-to-date
-- hello
-- shout
$ doit clean      # remove generated files
$ doit            # runs again
.  hello
.  shout


Python-Native Task Runner

No DSL, no YAML — tasks are plain Python dicts and functions.

Pure Python

Tasks are Python dicts. Use any library, generate tasks programmatically, debug with pdb.

Shell or Python actions

Run shell commands, call Python functions, or mix both in a single task.

Self-documenting

doit list shows all tasks with docstrings. doit help <task> for details.


Incremental Builds & Pipelines

DAG execution with dependency tracking — run only what changed.

Incremental builds

Tracks file dependencies and targets (MD5 or timestamp). Skips tasks that are already up-to-date.

Flexible up-to-date checks

Not limited to file timestamps. Computed dependencies (calc_dep), custom checkers, and result-based checks.

Pipelines

Pass results between tasks without intermediate files. Dynamic task creation via yield for complex workflows.


Advanced Features

Extensible

Plugin architecture — custom commands, storage backends, task loaders, and output reporters

Framework API — build your own tools on top of doit

Batteries included

Parallel execution — threaded or multi-process

Auto execution — watch for file changes and re-run tasks [linux/mac]

Shell tab-completion — bash and zsh

DAG visualisation — graphviz integration

Testimonials

Status

doit is a mature project actively maintained since 2008. Current version: 0.37.0.

doit runs on Python 3.10+. 99% unit-test code coverage.

Contributions are welcome. Development is driven by real-world use cases.

Project Details

LICENSE
This is an open-source project (MIT license) written in python.
DOWNLOAD
from PyPi
SUPPORT
See support page
DEVELOP
Project management (bug tracker, feature requests and source code ) on github
WEBSITE
This web site is hosted on http://pages.github.com
Powered by Universal template and Sphinx.