doit is a free, open source data engineering & integration project written in Python and released under MIT. It has 2,084 GitHub stars, 195 forks and 94 open issues, and was last pushed 7 months ago. On this registry it ranks #24 of 39 tracked projects in Data Engineering & Integration, with 5 head-to-head comparisons available.

What is doit?

What it is

doit is a Python command line task management and automation tool. It lives in the Python ecosystem and is distributed under the MIT license. Users define tasks in Python functions or dictionaries inside a dodo.py file, then run those tasks from the command line.

The concrete problem it solves is repeated or stale execution in build, data pipeline, and workflow tasks. doit tracks file dependencies, target files, and cached results. It runs only changed tasks, skips up-to-date tasks, and can remove generated files with a clean command.

Key capabilities

  • Incremental builds track file dependencies and targets, so a task runs only when inputs or outputs are missing or changed.
  • DAG execution orders tasks by dependency, so shout.txt can run after hello.txt is created.
  • Python native definitions let users write plain Python functions and dictionaries, and use any Python library in task code.
  • Parallel execution runs independent tasks concurrently through multiprocessing or threading.
  • Subtask generation lets one function yield multiple tasks, so repeated work can come from one definition.
  • Computed dependencies through calc_dep allow the dependency graph to be built dynamically at runtime.

Who uses it and how

  • Python developers use it as a local command line tool for build automation, replacing or complementing make style workflows with Python task definitions.
  • Data pipeline and data science users apply it to ordered steps where one output file feeds the next input file, as shown by hello.txt and shout.txt.
  • Workflow automation users run doit after editing dodo.py, run it again to verify that up-to-date tasks are skipped, and run doit clean to remove generated files.
  • Users with many independent generated files use parallel execution to run those tasks concurrently while still respecting dependency order.

Getting started

Users install doit with pip install doit, create a dodo.py file containing task functions, and run doit from the project directory. Documentation is available at pydoit.org.

When to use it — and when not to

doit is useful when a project is already in Python and needs incremental task execution without a separate YAML or domain specific language. It is less suitable when a hosted service or non-Python workflow definition is required, because the facts describe a local command line tool with Python task files. The project has open issues and no hosted option is mentioned, so users should expect to operate it locally.

project readme (upstream, from github) — read inline

================ README

.. display some badges

.. image:: https://img.shields.io/pypi/v/doit.svg :target: https://pypi.python.org/pypi/doit

.. image:: https://github.com/pydoit/doit/actions/workflows/ci.yml/badge.svg?branch=master :target: https://github.com/pydoit/doit/actions/workflows/ci.yml?query=branch%3Amaster

.. image:: https://codecov.io/gh/pydoit/doit/branch/master/graph/badge.svg?token=wxKa1h11zn :target: https://codecov.io/gh/pydoit/doit

.. image:: https://zenodo.org/badge/DOI/10.5281/zenodo.4892136.svg :target: https://doi.org/10.5281/zenodo.4892136

pydoit - automation tool

Define tasks in Python. Run only what changed.

doit is a task management & automation tool like make, but in pure Python. It tracks file dependencies, caches results, and skips tasks that are already up-to-date. No DSL, no YAML - just Python functions.

Quick Example

Create a dodo.py:

.. code:: python

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 shout.txt'], 'file_dep': ['hello.txt'], 'targets': ['shout.txt'], 'clean': True, }

Run it:

.. code:: console

$ 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

Key Features

  • Incremental builds - tracks file dependencies and targets, re-runs only what changed
  • DAG execution - tasks run in correct dependency order
  • Python-native - tasks are plain Python dicts and functions, use any library
  • Parallel execution - run independent tasks concurrently (multiprocessing or threading)
  • Subtask generation - yield multiple tasks from a single function
  • Computed dependencies - calc_dep for dynamic dependency graphs
  • Plugin architecture - extensible commands, reporters, backends, and task loaders

Links

license

The MIT License Copyright (c) 2008-2026 Eduardo Naufel Schettino

see LICENSE file

Financial contributions on Open Collective _

.. image:: https://opencollective.com/doit/tiers/backers.svg?avatarHeight=50 :target: https://opencollective.com/doit/tiers

Frequently asked questions

Is doit free to use?

doit is open source under the MIT licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does doit do?

CLI task management & automation tool

What is doit written in?

doit is primarily written in Python. Its source is publicly available at https://github.com/pydoit/doit, and it has 2,084 GitHub stars.