NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #4116 most downloaded on PyPI
Workflow mgmgt + task scheduling + dependency resolution.
Last release 5 months ago
07 May 2026
Release timing varies
gaps range from 9 days to 1.1 years
Nearly every release is documented
notes for 58 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
14 years old
89 releases · first in 2012
Fix deprecated datetime.utcfromtimestamp() calls by @apoorvdarshan in https://github.com/spotify/luigi/pull/3410
_update_priority in scheduler.py by @subhramit in https://github.com/spotify/luigi/pull/3414luigi.run() by @subhramit in https://github.com/spotify/luigi/pull/3413Full Changelog: https://github.com/spotify/luigi/compare/v3.8.0...v3.8.1
One column per quarter.
Use __set__ / __get__ descriptors for type checking (replaces __new__ approach) by @kitagry in https://github.com/spotify/luigi/pull/3387
__set__ / __get__ descriptors for type checking (replaces __new__ approach) by @kitagry in https://github.com/spotify/luigi/pull/3387Full Changelog: https://github.com/spotify/luigi/compare/v3.7.3...v3.8.0
fix: correct sys platform markers for windows; update lockfile by @dlstadther in https://github.com/spotify/luigi/pull/3381
Full Changelog: https://github.com/spotify/luigi/compare/v3.7.2...v3.7.3
refactor(parameter): Improve type stubs and standardize argument names by @kitagry in https://github.com/spotify/luigi/pull/3375
Full Changelog: https://github.com/spotify/luigi/compare/v3.7.1...v3.7.2
fix: correct built readme rst format by @dlstadther in https://github.com/spotify/luigi/pull/3373
Full Changelog: https://github.com/spotify/luigi/compare/v3.7.0...v3.7.1
Fix logging of sensitive information in pai.py by @Ali-Razmjoo in https://github.com/spotify/luigi/pull/3310
luigi.Task by @hiro-o918 in https://github.com/spotify/luigi/pull/3315Full Changelog: https://github.com/spotify/luigi/compare/v3.5.2...v3.6.0
Updated luigi.contrib.azureblob to 12.x.y series of azure.storage.blob by @bcamel in https://github.com/spotify/luigi/pull/3290
Full Changelog: https://github.com/spotify/luigi/compare/3.5.1...v3.5.2
don't convert str to tuple in TupleParameter by @kitagry in https://github.com/spotify/luigi/pull/3275
Full Changelog: https://github.com/spotify/luigi/compare/3.5.0...3.5.1
worker: Log which outputs are missing when task is unexpectedly incomplete by @progval in https://github.com/spotify/luigi/pull/3258
Full Changelog: https://github.com/spotify/luigi/compare/3.4.0...3.5.0
Add CodeQL workflow by @jorgectf in https://github.com/spotify/luigi/pull/3244
Full Changelog: https://github.com/spotify/luigi/compare/3.3.0...3.4.0
Add host_config_options to allow configuration of DockerTask for GPU resources #3234
Fix typo in range_test.py #3228
Improve control over dynamic requirements #3179
Add worker config to cache task completion results.
Fix Python 3.10 deprecation warnings #3150
@requires #3077traceback_max_length parameter for error email notifications #3086Unfulfilled dependency error #3105OptionalParameter datatype options #3079batch_email.email_interval to be set in config as email-internal-minutes #3125TimeDeltaParameter to accept input as "seconds" #3125EnumListParameter to top-level attribute imports #3144metrics_custom_import for MetricCollectors #3146configure_job BigQuery property #3098run_task_kwargs property to ECS #3083pickle_protocol attribute and configuration option to Spark #3001pg8000 driver support to Postgres #3142task.disable_window #3081LocalTarget when is_tmp attribute dne #3085luigi.format.Nop import #3047cls.get_task_namespace() #3129notifications_test.py #3151max_shown_tasks and max_graph_nodes documentation to correct section #3156Task's Register metaclass #3154rdbms.CopyToTable's _add_metadata_columns() #3011@Tarrasch from codeowners #3127tenacity version #3147OptionalParameter #3130prometheus-client package #3163Adding retry on _obj_exists #3022
Garbage collect task result queue when worker context exits #2973
Return bq job id from biquery.run_job() #2957
From this version on, Luigi stops supporting Python2 for the obvious reason. 3.0.0 release includes a series of PRs deprecating Python2, plus a few ot…
This is a major release without many feature changes compared to 2.8.13. The reason we decided to give it a major bump is the drop of Python2 support. From this version on, Luigi stops supporting Python2 for the obvious reason. 3.0.0 release includes a series of PRs deprecating Python2, plus a few other changes listed below. Special thanks go to @drowoseque for doing all the great work!
This the second 3.0.0 beta release including a series of PRs deprecating Python2, plus following:
This the second 3.0.0 beta release including a series of PRs deprecating Python2, plus following:
Special thanks go to @drowoseque for doing all the great work!
autoload_range istead of autoload-rangeNothing published for this version
removed wrong type of Target.__init__ path arg from doc master
Import ABC from collections.abc instead of collections for Python 3.9 compatibility #2895
Add internal version info #2760
autoload_range istead of autoload-rangeAdd HEAD endpoint to scheduler server for status/health checks #2789
Adds "Force Commit" button in UI to set tasks to DONE #2751
Expandable Namespace Folders for the Visualiser Sidebar #2716
Add check_complete_on_run to optionally mark tasks as failed if complete() is false when run finishes
check_complete_on_run to optionally mark tasks as failed if complete() is false when run finishes (#2710)fix calling method on wrong object #2709 This fixes #2704.
(Doc) Fix example of "summary_length" #2700
__init__ error when using TOML config #2702Configuration documentation: remove deprecated/wrong [core]max_reschedules entry
This release is broken due to #2628 .
Add BaseTIS to the company list #2607
fix logging setup in Python 2.7
Fix inspect.getargspec() DeprecationWarning in PY3 #2579
Note: Broken due to a runtime error in LuigiConfigParser. See https://github.com/spotify/luigi/issues/2592.
This is a minor version bump, due to:
This is a minor version bump, due to:
s3client check for deprecated host keyword and raise error with the details
revert tornado upgrade (#2504) Upgrading tornado unfortunately breaks older version of Python
(Breaking change) Bump tornado milestone version (#2490) This changes requires Python version 2.7.9+ and 3.4+
blogged list (#2472)Add a configuration parameter to force multiprocessing
TaskProcess.run (via task_process_context configuration parameter) (#2449)S3Client (#2423, #2149)get_merge to snakebite client (#2410)MissingParameterException when generating execution summary (#2415)BoolParameters (via luigi.BoolParameter.parsing variable) (#2427)ChoiceParameter check if option is valid within .normalize (#2454)bulk_complete failing when argument is a generator (#2441)KeyError in KubernetesJobTask (#2433)activeDeadlineSeconds by default (#2452)append is vulnerable of xss #2391
Add google-auth-httplib2 as dependency
discovery.build() when instantiating GSCClient. (#2291)Added generated data files to .gitignore
.gitignore (#2367)Redshift column compression (#2343)oauth2client by google-auth (#2361)contrib.docker_runner exit code check (#2356)Replaced param_args with dynamic property with deprecation message
OptionalParameter parameter class (#2295)dates to datetimes for DateHourParameter (#2285)param_args with dynamic property with deprecation messageparam_kwargs instead of param_argsBigQueryLoadAvro (#2269) - said copying is done by BigQuery natively nowutil.requires (#2307)contrib.hive.HiveTableTarget.exists (#2323)Luigi 2.7.1 is mostly bug fixes and small feature additions.
Luigi 2.7.1 is mostly bug fixes and small feature additions.
There have also been some other feature additions, bugfixes, and docfixes. See all commits here.
_Removed deprecations!_ luigi.{postgres, s3} are removed, use luigi.contrib.{..} instead https://github.com/spotify/luigi/pull/2181
Introducing Luigi 2.7.0!
luigi.{postgres, s3} are removed, use luigi.contrib.{..} instead https://github.com/spotify/luigi/pull/2181luigi.xyx or luigi.contrib.xyz. This should simplify to move modules into seperate repositories, which is future work.There have been a lot of other bugfixes, docsfixes, cleanups and added testcases! See all commits here.
Luigi 2.6.2 is also mainly about bug-fixes. Including many fixes in the scheduler web interface.
Luigi 2.6.2 is also mainly about bug-fixes. Including many fixes in the scheduler web interface.
Luigi 2.6.1 is mainly about bugfixes. Some highlights:
Luigi 2.6.1 is mainly about bugfixes. Some highlights:
temporary_path decorator. Awesome! (https://github.com/spotify/luigi/pull/2057 and https://github.com/spotify/luigi/pull/2058, thanks @adaitche!)There actually is more! Read the whole commit log here!
_Removed deprecations!_ luigi.{hadoop, hadoop_jar, hdfs, hive, scalding, webhdfs} are removed, use luigi.contrib.{..} instead https://github.com/spoti…
Luigi 2.6.0 comes with many new cool features!
luigi.{hadoop, hadoop_jar, hdfs, hive, scalding, webhdfs} are removed, use luigi.contrib.{..} instead https://github.com/spotify/luigi/pull/1995luigi.{postgres, s3} are now moved into luigi.contrib. https://github.com/spotify/luigi/pull/1997--workers can be set. https://github.com/spotify/luigi/pull/1993There have been a lot of other bugfixes, docsfixes, cleanups and added testcases! See all commits here.
_Changed behavior warning!_ BooleanParameter is now removed after a long deprecation. Instead simply use BoolParameter. https://github.com/spotify/lui…
This releases contains mostly bugfixes, but also changes to the otherwise quite stale luigi core.
Most users will probably not have anything break. But at least read the warnings placed below to see what could've have changed for you.
BooleanParameter is now removed after a long deprecation. Instead simply use BoolParameter. https://github.com/spotify/luigi/pull/1959Task classes more pythonic and functional:
task_namespace is now inherited as usual in python and not overridden my metamagic from luigi. https://github.com/spotify/luigi/issues/1950 (Thanks @riga).externalize now goes out of it's way to ensure it doesn't mutate its input anymore, and returns a copy. Allowing for new cool usage patterns. https://github.com/spotify/luigi/pull/1975 (docs) (shameless thanks @Tarrasch :p)There have been a lot of other bugfixes, docsfixes, cleanups and added testcases! See all commits here.
This release come with a few new features and some changed behaviors. Hopefully bringing us a tiny step towards scheduling heaven.
This release come with a few new features and some changed behaviors. Hopefully bringing us a tiny step towards scheduling heaven.
task.clone() https://github.com/spotify/luigi/pull/1630 Thanks @ChrisBeaumonttarget.temporary_path() as a new recommended ways to deal with temporary paths in luigi https://github.com/spotify/luigi/pull/1909 (docs)There have been a lot of other features, cleanups and bugfixes! See all commits here.
Biggest risk of breakage for people updating early:
Biggest risk of breakage for people updating early:
Other things:
And many more other small improvements. Thanks to everyone who've contributed!
This is mostly a bug-fix release.
This is mostly a bug-fix release.
Here are the changes commit by commit.
This release mainly fixes bugs introduced in the two latest releases and also some older bugs.
This release mainly fixes bugs introduced in the two latest releases and also some older bugs.
Here are the changes commit by commit.
There's been over a month since the last release. This new release includes a bunch of new features. What I like the most is that they all come with f
There's been over a month since the last release. This new release includes a bunch of new features. What I like the most is that they all come with full and proper documentation!
UPSTREAM_FAILED means that that task cannot run because all downstream
tasks have failed or worse (like being disabled). As an effect there will be
much much fewer tasks considered to have an upstream status. https://github.com/spotify/luigi/pull/1789There have been a lot of other features, cleanups and bugfixes! See all commits here.
Usually, passing the empty string '' is a sufficient replacement. If you don't do this luigi will print a deprecation warning. https://github.com/spot…
There's been 3 months since the latest release. Making Google's results on readthedocs outdated and gives a stale feeling to luigi. Enjoy updated and hopefully bugfree software. :)
None as the default for a
parameter. Usually, passing the empty string '' is a sufficient
replacement. If you don't do this luigi will print a deprecation warning.
https://github.com/spotify/luigi/pull/1624.mrrunner.py is not hardcoded as the binary being run https://github.com/spotify/luigi/pull/1565A few great examples that show how improvements are well-receieved no matter how small they are. Yet these "small" changes helps hundreads of people reading the docs of luigi. https://github.com/spotify/luigi/pull/1672 https://github.com/spotify/luigi/pull/1642
There were even more changes which we didn't include in these release notes. Like every contribution, whether merged or not we are happy for getting them. So please keep contributing! :)
Last release was only 2 business days ago (as opposed to the 5 months since the one before it). But this release got rushed as of a security fix!
Last release was only 2 business days ago (as opposed to the 5 months since the one before it). But this release got rushed as of a security fix!
In addition to doc fixes:
We wait for a while with saying how to use this exploit, giving time to people to apply the bugfix.
Old deprecated (2014) stuff around scheduler and its state
Finally, a new PyPI release in a rather long while. Thanks @Tarrasch and @erikbern, and all the contributors!
EnumParameter (#1479), DictParameter (#1574)ExternalBigqueryTask (#1434), BigqueryCreateViewTask (#1465)ExternalProgramTask, ExternalPythonProgramTask - commonalities for running any external application or script (#1520)OpenerTarget, a single Luigi target to open multiple file system types (#1555)Query base task (giving rise also to luigi.contrib.redshift.RedshiftQuery and luigi.postgres.PostgresQuery) (#1493)RedshiftUnloadTask (#1527)UploadToSalesforceTask (#1404)task_id (as opposed to TaskName(param1=value1, param2=foo bar)) (#1444)date vs datetime) (#1473)SparkJob, Spark1xBackwardCompat, Spark1xJob, PySpark1xJob (#1442)RemoteTarget successfully creates temporary files (meaning, in a directory relative to output) (#1515)init_mapper()/init_reducer() calls in LocalJobRunner (#1475)HadoopJobError (#1528)post_copy() (#1502)...and a slew of other additions, fixes, improvements and documentation.
This version contains mostly bugfixes, in particular making Luigi 2.0 working on Windows
This version contains mostly bugfixes, in particular making Luigi 2.0 working on Windows
Thanks @daveFNbuck @econchick @Tarrasch @dlstadther @DeaconDesperado @jpiper @nresare @dhurlburtusa @stephenpascoe @mbruggmann and some more people I probably forgot!
Pull requests
There have been a lot of deprecations of features regarding Parameters. Before upgrading, please consider taking a look at the new module documentatio…
Highlights:
Contrib:
Scheduling:
--take-lock option to smoother roll out code changes. https://github.com/spotify/luigi/pull/1137Deprecations:
is_global finally removed! (It still exists to not break old code, but it only sets positional=False)
Notable changes:
is_global finally removed! (It still exists to not break old code, but it only sets positional=False)get_work() response times. https://github.com/spotify/luigi/pull/986Your coding agent can read these notes before it upgrades. Set up the MCP server →