Skip to content

Releases: TimefoldAI/timefold-solver

Timefold Solver 2.0.0 Beta 1

12 Mar 13:01

Choose a tag to compare

Pre-release

This is a Beta release of the upcoming Timefold Solver 2.0.0, coming later this month.

Although we aren't yet finished with all the backwards incompatible changes, there is already enough to give a good overview of what the release is shaping up to be.

We are grateful to everyone in our community who decide to help us test this release.
Check out our migration documentation to help you with the transition.

Changelog

🚀 Features

🐛 Fixes

🔄️ Changes

Contributors

We'd like to thank the following people for their contributions:

Timefold Solver Community Edition is an open source project, and you are more than welcome to contribute as well!
For more, see Contributing.

Should your business need to scale to truly massive data sets or require enterprise-grade support,
check out Timefold Solver Enterprise Edition.
Timefold Solver Enterprise Edition requires a license.

How to use Timefold Solver

To see Timefold Solver in action, check out the quickstarts.

With Maven or Gradle, add the ai.timefold.solver : timefold-solver-core : 2.0.0-beta-1 dependency in your pom.xml to get started.

You can also import the Timefold Solver Bom (ai.timefold.solver : timefold-solver-bom : 2.0.0-beta-1)
to avoid duplicating version numbers when adding other Timefold Solver dependencies later on.

Additional notes

The changelog and the list of contributors above are automatically generated.
It excludes contributions to certain areas of the repository, such as CI and build automation.
This is done for the sake of brevity and to make the user-facing changes stand out more.

Timefold Solver 1.32.0

10 Mar 13:01

Choose a tag to compare

This is the first quarterly maintenance update of Timefold Solver 1.x. With all forward development having shifted towards Timefold Solver 2.0.0 (to be released later this month), this release brings some bugfixes and a version bump of Quarkus.

In the next maintenance release, we will upgrade to the new Quarkus 3.33 LTS, and will stay on that branch for as long as possible.

Changelog

🐛 Fixes

  • 13bf59d in event consumption, always release the lock if we already aquired it (#2169)
  • a3ccc3a remove support for the identity map from the value range cache (#2140)

🧰 Tasks

Contributors

We'd like to thank the following people for their contributions:

Timefold Solver Community Edition is an open source project, and you are more than welcome to contribute as well!
For more, see Contributing.

Should your business need to scale to truly massive data sets or require enterprise-grade support,
check out Timefold Solver Enterprise Edition.
Timefold Solver Enterprise Edition requires a license.

How to use Timefold Solver

To see Timefold Solver in action, check out the quickstarts.

With Maven or Gradle, add the ai.timefold.solver : timefold-solver-core : 1.32.0 dependency in your pom.xml to get started.

You can also import the Timefold Solver Bom (ai.timefold.solver : timefold-solver-bom : 1.32.0)
to avoid duplicating version numbers when adding other Timefold Solver dependencies later on.

Additional notes

The changelog and the list of contributors above are automatically generated.
It excludes contributions to certain areas of the repository, such as CI and build automation.
This is done for the sake of brevity and to make the user-facing changes stand out more.

Timefold Solver 1.31.0

11 Feb 15:08

Choose a tag to compare

In this release, we bring major improvements (such as constraint profiling for our Enterprise customers) and many quality of life improvements and bugfixes.

Timefold Solver 1.31.0 marks the final feature release of the 1.x line. All new feature development will focus on Timefold Solver 2.0, and the 1.x line moves into maintenance mode. Find out more in the announcement.

Changelog

🚀 Features

  • 4b89910 Add constraint stream profiling (#1901)
  • 706173f Allow shadow variable updaters to read the solution (#2029)
  • b156174 Enable exhaustive search for list variables and mixed models (#2023)
  • 922c072 Introduce flatten() as a more generic alternative to flattenLast() (#2018)

🐛 Fixes

  • 333e618 Prevent the generation of invalid moves (#2077)
  • ffa264a Make ComparableValue fallback to comparing identity hashcode (#2056)
  • 868c49c Remove a faulty fail-fast (#2035)
  • 3417d4a Enable the list variable to use an anonymous value range provider (#2079)

🧰 Tasks

📝 Documentation

Contributors

We'd like to thank the following people for their contributions:

Timefold Solver Community Edition is an open source project, and you are more than welcome to contribute as well!
For more, see Contributing.

Should your business need to scale to truly massive data sets or require enterprise-grade support,
check out Timefold Solver Enterprise Edition.
Timefold Solver Enterprise Edition requires a license.

How to use Timefold Solver

To see Timefold Solver in action, check out the quickstarts.

With Maven or Gradle, add the ai.timefold.solver : timefold-solver-core : 1.31.0 dependency in your pom.xml to get started.

You can also import the Timefold Solver Bom (ai.timefold.solver : timefold-solver-bom : 1.31.0)
to avoid duplicating version numbers when adding other Timefold Solver dependencies later on.

Additional notes

The changelog and the list of contributors above are automatically generated.
It excludes contributions to certain areas of the repository, such as CI and build automation.
This is done for the sake of brevity and to make the user-facing changes stand out more.

Timefold Solver 1.30.0

14 Jan 09:02

Choose a tag to compare

In the first release of year 2026, we bring a whole bunch of performance improvements, as well as bugfixes and quality of life improvements. Especially users of the recently introduced Constraint Streams' precompute should benefit.

Changelog

🚀 Features

🐛 Fixes

🔄️ Changes

  • 7ec4e34 Improve hashing performance (#2001)
  • bf4a651 Assorted improvements to help JVM to inline methods (#1990)
  • 1cef560 Improve precompute performance by optimizing updates (#1977)

🧰 Tasks

  • a9b98e3 Add fail-fast when a list or inverse variable is used as a group source (#2016)
  • 55b928d Improve XXE attack prevention (#2008)

Contributors

We'd like to thank the following people for their contributions:

Timefold Solver Community Edition is an open source project, and you are more than welcome to contribute as well!
For more, see Contributing.

Should your business need to scale to truly massive data sets or require enterprise-grade support,
check out Timefold Solver Enterprise Edition.
Timefold Solver Enterprise Edition requires a license.

How to use Timefold Solver

To see Timefold Solver in action, check out the quickstarts.

With Maven or Gradle, add the ai.timefold.solver : timefold-solver-core : 1.30.0 dependency in your pom.xml to get started.

You can also import the Timefold Solver Bom (ai.timefold.solver : timefold-solver-bom : 1.30.0)
to avoid duplicating version numbers when adding other Timefold Solver dependencies later on.

Additional notes

The changelog and the list of contributors above are automatically generated.
It excludes contributions to certain areas of the repository, such as CI and build automation.
This is done for the sake of brevity and to make the user-facing changes stand out more.

Timefold Solver 1.29.0

09 Dec 08:15

Choose a tag to compare

In our final scheduled release of 2025, we're bringing many quality of life improvements and bug fixes, especially around value ranges and move selection.

Unfortunately, due to some changes on the Quarkus side, we had to upgrade the minimum supported version of Quarkus. Users of our Quarkus integration will need to migrate to Quarkus 3.30.0 or later.

Thank you for optimizing with us this year, and thanks especially to our community members who answered user questions, implemented code improvements or provided feedback. We'll see you all in 2026, with many exciting things in the pipeline already!

Changelog

🚀 Features

  • eb02044 Supporting parameters for the @ValueRangeProvider-annotated method (#1962)

🐛 Fixes

  • 61e0a33 Avoid NPEs by fetching outer values before calling inner nodes (#1965)
  • 927ecba Automatically add bean-defining annotation values in Quarkus (#1952)
  • be45006 Always update successors of single directional graph when referencing non-declarative vars of parent (#1949)
  • 8ceb598 Only generate member accessors once per member

🔄️ Changes

🧰 Tasks

  • a583a8e Migrate MemberAccessor and SolutionCloner to Gizmo2 (#1947)
  • 78a2f52 Apply OpenRewrite recipe best practices (#1926)

Contributors

We'd like to thank the following people for their contributions:

Timefold Solver Community Edition is an open source project, and you are more than welcome to contribute as well!
For more, see Contributing.

Should your business need to scale to truly massive data sets or require enterprise-grade support,
check out Timefold Solver Enterprise Edition.
Timefold Solver Enterprise Edition requires a license.

How to use Timefold Solver

To see Timefold Solver in action, check out the quickstarts.

With Maven or Gradle, add the ai.timefold.solver : timefold-solver-core : 1.29.0 dependency in your pom.xml to get started.

You can also import the Timefold Solver Bom (ai.timefold.solver : timefold-solver-bom : 1.29.0)
to avoid duplicating version numbers when adding other Timefold Solver dependencies later on.

Additional notes

The changelog and the list of contributors above are automatically generated.
It excludes contributions to certain areas of the repository, such as CI and build automation.
This is done for the sake of brevity and to make the user-facing changes stand out more.

Timefold Solver 1.28.0

11 Nov 05:43

Choose a tag to compare

What a packed release! We're bringing improvements both big and small, as well as important bugfixes and speedups.

Constrains streams can now be precomputed

In certain exceptional cases where the stream does not depend on any variables, your constraint can now be precomputed, improving the solver's performance when operating on static data.

Sorting of entities and values in construction heuristics

We have long since supported custom sorting for entities and values in construction heuristics, but only for the basic variable. In this release, we are making the same possible for list variables as well. We recommend you experiment with all kinds of input sorting, because it can greatly improve the results you can get out of the construction heuristics.

Quickstarts get a visual refresh

Timefold Solver gets a new logo and with it, the quickstarts got a slightly cleaner, more unified look. Have you seen our quickstarts lately?

Deprecations galore

As we continue evolving the solver, we need to make changes to the solver API. Most often, these changes are backwards compatible - we deprecate the old APIs and introduce new ones on top. In this release, we have made a whole bunch of such changes, and we encourage you to check our upgrade recipe.

Changelog

🚀 Features

  • 298d4ed Add a producer id to BestSolutionChangedEvent (#1913)
  • d890863 Add hasNoImpact() to ConstraintVerifier assertions (#1909)
  • 9eb30e8 Enable sorting for CH with list variable (#1833)
  • dfd8e34 Allow caching the results of an unfiltered constraint stream (#1853)

🐛 Fixes

  • 9618337 Make flattenLast use object equality instead of identity (#1908)

🧰 Tasks

  • 5899f4f Improve memory consumption of reachable values structure (#1917)
  • 3531f19 Deprecate PiggybackShadowVariable

📝 Documentation

Contributors

We'd like to thank the following people for their contributions:

Timefold Solver Community Edition is an open source project, and you are more than welcome to contribute as well!
For more, see Contributing.

Should your business need to scale to truly massive data sets or require enterprise-grade support,
check out Timefold Solver Enterprise Edition.
Timefold Solver Enterprise Edition requires a license.

How to use Timefold Solver

To see Timefold Solver in action, check out the quickstarts.

With Maven or Gradle, add the ai.timefold.solver : timefold-solver-core : 1.28.0 dependency in your pom.xml to get started.

You can also import the Timefold Solver Bom (ai.timefold.solver : timefold-solver-bom : 1.28.0)
to avoid duplicating version numbers when adding other Timefold Solver dependencies later on.

Additional notes

The changelog and the list of contributors above are automatically generated.
It excludes contributions to certain areas of the repository, such as CI and build automation.
This is done for the sake of brevity and to make the user-facing changes stand out more.

Timefold Solver 1.27.0

14 Oct 12:29

Choose a tag to compare

The October release of Timefold Solver is a quiet one, focusing on bug fixes, performance improvements and small tweaks.

Possible decrease in move speeds

With the improvements to value ranges in this release, we now eliminate some useless moves much earlier. This means move generation takes slightly longer, and the moves which actually get executed are more likely complex moves, as they are no longer crowded out by useless "short" moves.

As a consequence of this, you may see your move speed drop significantly, if you're using entity-based value ranges. But in this case, this is actually good news! We have seen that, even though the move speed drops, the step count increases. The solver is more likely to actually accept a move, because the generated moves are, on average, more useful now. And therefore the score is better in the same amount of time.

Changelog

🚀 Features

  • 649aba4 Add SolverConfigOverride support for setting the time spend directly (#1808)
  • 54bb2a9 Add ScoreAnalysis.summarize(int topLimit) method to customize constraint/matches display limit (#1807)
  • 36928b6 Add random seed setting to Quarkus and Spring Boot (#1816)

🐛 Fixes

  • c9a40d5 Process deep-cloned entities in a queue for GizmoSolutionCloner (#1849)
  • d30e910 Don't test the filtering joiner on insert if a tuple is already retracting
  • d7dc382 Don't test the filtering joiner if a tuple is already retracting (#1850)
  • 4a6b2f8 Fail fast when referenced entities are not included in ConstraintVerifier.given or updateShadowVariables (#1836)
  • df4a081 Enable ListIterator support on FilteringEntityByEntitySelector and FilteringEntityByValueSelector (#1821)
  • fa704e9 Avoid using stale references in entity value ranges filtering nodes (#1822)
  • dbb9b53 Avoid reusing configuration on move factories (#1814)

🔄️ Changes

  • efdcb79 Use a better data structure to minimize memory usage for edge counts (#1795)

🧰 Tasks

📝 Documentation

Contributors

We'd like to thank the following people for their contributions:

Timefold Solver Community Edition is an open source project, and you are more than welcome to contribute as well!
For more, see Contributing.

Should your business need to scale to truly massive data sets or require enterprise-grade support,
check out Timefold Solver Enterprise Edition.

How to use Timefold Solver

To see Timefold Solver in action, check out the quickstarts.

With Maven or Gradle, add the ai.timefold.solver : timefold-solver-core : 1.27.0 dependency in your pom.xml to get started.

You can also import the Timefold Solver Bom (ai.timefold.solver : timefold-solver-bom : 1.27.0)
to avoid duplicating version numbers when adding other Timefold Solver dependencies later on.

Additional notes

The changelog and the list of contributors above are automatically generated.
It excludes contributions to certain areas of the repository, such as CI and build automation.
This is done for the sake of brevity and to make the user-facing changes stand out more.

Timefold Solver 1.26.2

09 Oct 19:25

Choose a tag to compare

A hotfix release.

Changelog

🐛 Fixes

Contributors

We'd like to thank the following people for their contributions:

Timefold Solver Community Edition is an open source project, and you are more than welcome to contribute as well!
For more, see Contributing.

Should your business need to scale to truly massive data sets or require enterprise-grade support,
check out Timefold Solver Enterprise Edition.

How to use Timefold Solver

To see Timefold Solver in action, check out the quickstarts.

With Maven or Gradle, add the ai.timefold.solver : timefold-solver-core : 1.26.2 dependency in your pom.xml to get started.

You can also import the Timefold Solver Bom (ai.timefold.solver : timefold-solver-bom : 1.26.2)
to avoid duplicating version numbers when adding other Timefold Solver dependencies later on.

Additional notes

The changelog and the list of contributors above are automatically generated.
It excludes contributions to certain areas of the repository, such as CI and build automation.
This is done for the sake of brevity and to make the user-facing changes stand out more.

Timefold Solver 1.26.1

22 Sep 13:45

Choose a tag to compare

The 1.26.0 release introduced an unfortunate series of regressions. This hotfix addresses all of them.
Apologies for the inconvenience, we got that one wrong.

Changelog

🐛 Fixes

  • afe99f5 enable ListIterator support on FilteringEntityByEntitySelector and FilteringEntityByValueSelector (#1821)
  • 2eb59ef avoid using stale references in entity value ranges filtering nodes (#1822)
  • dc97d27 avoid reusing configuration on move factories (#1814)

Contributors

We'd like to thank the following people for their contributions:

Timefold Solver Community Edition is an open source project, and you are more than welcome to contribute as well!
For more, see Contributing.

Should your business need to scale to truly massive data sets or require enterprise-grade support,
check out Timefold Solver Enterprise Edition.

How to use Timefold Solver

To see Timefold Solver in action, check out the quickstarts.

With Maven or Gradle, add the ai.timefold.solver : timefold-solver-core : 1.26.1 dependency in your pom.xml to get started.

You can also import the Timefold Solver Bom (ai.timefold.solver : timefold-solver-bom : 1.26.1)
to avoid duplicating version numbers when adding other Timefold Solver dependencies later on.

Additional notes

The changelog and the list of contributors above are automatically generated.
It excludes contributions to certain areas of the repository, such as CI and build automation.
This is done for the sake of brevity and to make the user-facing changes stand out more.

Timefold Solver 1.26.0

10 Sep 13:40

Choose a tag to compare

A new month, a new Timefold Solver release packed with excitement! We have done many performance improvements around value ranges, and also fixed some important bugs. But most importantly, declarative shadow variables are now part of our public API.

This is a big milestone, and we want to thank everyone who provided their feedback as we were evolving the feature out there in public. The magic of open source in action! For those who were using the feature even while it was in preview, we want to point out the changes we've made in this release, which are likely to affect you:

  • All annotations related to the feature moved to their final place in the public API, specifically to the ai.timefold.solver.core.api.domain.variable package.
  • ShadowVariableLooped annotation was renamed to ShadowVariablesInconsistent.
  • This annotation was also made optional. If you don't need it in your model or for your constraints, you need not include it.
  • In constraints, forEach() and forEachIncludingUnassigned() now filter out every inconsistent (formerly looped) entity. To include them in your constraints, use forEachUnfiltered() instead.

SBOMs

Timefold Solver releases now come with SBOMs to help with supply chain security. You can find our SBOMs in Maven Central alongside our binaries, such as SBOM for Solver core.

Changelog

🚀 Features

  • 14bc23c Finalize declarative shadow variables (#1775)
  • e856684 Add high-level aggregation methods to BenchmarkAggregator (#1777)

🐛 Fixes

  • 7d21b3a Avoid removing iterators prematurely (#1779)
  • 1a86e96 Review nullability annotations around SolutionManager (#1757)
  • 2d4b566 Start the termination counter at the first step (#1736)
  • a2d0e73 Address Quarkus warning about recorders not being injected as RuntimeValue

🔄️ Changes

  • 8008ccd Allow using builtin variable after builtin variable source in declarative shadow variables (#1734)
  • eda0ba8 Improve entity value range logic for basic variables (#1750)
  • 72e7021 Create filtering value range selectors as early as possible (#1738)

🧰 Tasks

  • aff9401 ForEach and forEachUnassigned exclude inconsistent entities by default (#1764)
  • c4fe983 Fail-fast if shadow variables has a source-induced loop in their graph (#1758), closes #1675
  • 4c3c9fe Make @ShadowVariablesInconsistent optional (#1778)
  • b701ef9 Move streams support for swap moves (#1765)
  • c5ab8c3 Rename @ShadowVariableLooped to @ShadowVariablesInconsistent (#1749)

📝 Documentation

  • fa96019 Rework structure for shadow variables (#1781)
  • ce15bc4 Add programmatic benchmark aggregation example to documentation (#1774)

Contributors

We'd like to thank the following people for their contributions:

Timefold Solver Community Edition is an open source project, and you are more than welcome to contribute as well!
For more, see Contributing.

Should your business need to scale to truly massive data sets or require enterprise-grade support,
check out Timefold Solver Enterprise Edition.

How to use Timefold Solver

To see Timefold Solver in action, check out the quickstarts.

With Maven or Gradle, add the ai.timefold.solver : timefold-solver-core : 1.26.0 dependency in your pom.xml to get started.

You can also import the Timefold Solver Bom (ai.timefold.solver : timefold-solver-bom : 1.26.0)
to avoid duplicating version numbers when adding other Timefold Solver dependencies later on.

Additional notes

The changelog and the list of contributors above are automatically generated.
It excludes contributions to certain areas of the repository, such as CI and build automation.
This is done for the sake of brevity and to make the user-facing changes stand out more.