finds.dev← search

// the find

pydoit/doit

★ 2,064 · Python · MIT · updated Feb 2026

CLI task management & automation tool

doit is a Make-like task runner where tasks are defined as Python dicts and functions in a dodo.py file. It tracks file hashes (not just timestamps), skips up-to-date tasks, and handles dynamic dependency graphs. Aimed at Python developers who want a build system without leaving Python or learning a DSL.

Incremental execution is based on file content hashing by default, not mtime — avoids the classic Make gotcha where touching a file triggers unnecessary rebuilds. The calc_dep feature lets tasks compute their own dependencies at runtime, which handles generated-file scenarios cleanly without hacks. Plugin architecture is real: custom commands, reporters, backends, and task loaders all have defined extension points. Test coverage looks thorough — one test file per module, including a Dockerfile for isolation.

2064 stars after 16+ years is a small audience for a general-purpose build tool; it never broke out of the Python data-science niche, which limits community momentum and third-party integrations. Task definitions as raw dicts are error-prone — typo a key like 'file_deps' instead of 'file_dep' and doit silently ignores it with no validation error. Parallel execution uses multiprocessing/threading but there's no built-in distributed execution or worker pool concept, so large DAGs on a single machine hit real limits. The dependency backend is SQLite by default, which means concurrent doit invocations from multiple processes on the same project will corrupt state.

View on GitHub → Homepage ↗

// want more like this?

We dig through GitHub every week and send a few repos picked for what you actually care about — each with an honest take like this one.

Get finds in your inbox → Search again →