<?xml version="1.0"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Timefold</title>
    <link>https://timefold.ai/</link>
	<atom:link href="https://timefold.ai/feed.xml" rel="self" type="application/rss+xml" />
    <description>Timefold product updates, news, press releases &amp; more!</description>
    <language>en</language>
    <lastBuildDate>Tue, 14 Apr 2026 10:54:25 +0200</lastBuildDate>
	<docs>https://validator.w3.org/feed/docs/rss2.html</docs>
	<generator>timefold.ai</generator>
	<image>
   		<title>Timefold</title>
		<url>https://timefold.ai/images/og.jpg</url>
		<link>https://timefold.ai/</link>
	</image>
	<copyright>All rights reserved 2024, Timefold BV</copyright>
	<category>Planning</category>
	<category>Planning Optimization</category>
	<category>Planning Software</category>
	<category>Planning Solving</category>
	<category>Timefold</category>
	<category>OptaPlanner</category>

    		      <item>
        <title><![CDATA[ Employee Shift Scheduling: Time Off ]]></title>
        <link>https://timefold.ai/videos/employee-shift-scheduling-time-off</link>
        <guid>https://timefold.ai/videos/employee-shift-scheduling-time-off</guid>
        <pubDate>Mon, 13 Apr 2026 11:53:00 +0200</pubDate>
		<description><p>Employee Shift Scheduling: Time Off</p></description>
        <content:encoded>
          <![CDATA[ <figure class="media"><div data-oembed-url="https://youtu.be/H78EkUX9Fo8"><div class="c-embed__wrapper c-embed--video"><iframe src="https://www.youtube.com/embed/H78EkUX9Fo8" frameborder="0"></iframe></div></div></figure><h2>Why AI is the Key to Fair Scheduling</h2><p>Employee scheduling isn’t just a logistical puzzle - it’s about <strong>fairness, compliance, and well-being.</strong> In high-stakes industries, ensuring staff get adequate rest isn't just "nice to have"; it’s a regulatory necessity.</p><h3>Smart Compliance, Better Rest</h3><p><strong>Timefold</strong> uses advanced constraint programming to move beyond simple calendars. Our AI-driven platform balances operational efficiency with the human side of work:</p><ul><li><strong>Automated Time-Off:</strong> Seamlessly integrate vacation and leave requests without breaking the schedule.</li><li><strong>Guaranteed Rest Periods:</strong> Automatically enforce mandatory downtime between shifts to prevent burnout and ensure safety.</li><li><strong>Cross-Industry Precision:</strong> Whether it’s <strong>nurse rostering</strong>, <strong>airline crew management</strong>, or <strong>field service dispatch</strong>, our API adapts to your specific labor laws and union rules.</li></ul><p><strong>Watch the video to see how intelligent optimization keeps your team rested and your business compliant.</strong></p>]]>
        </content:encoded>
		<enclosure url="https://timefold.ai/uploads/images/maxresdefault-6.jpg" length="0" type="image/jpg" />      </item>
    		      <item>
        <title><![CDATA[ Employee Shift Scheduling: Skills and Risk Factors ]]></title>
        <link>https://timefold.ai/videos/employee-shift-scheduling-skills-and-risk-factors</link>
        <guid>https://timefold.ai/videos/employee-shift-scheduling-skills-and-risk-factors</guid>
        <pubDate>Mon, 13 Apr 2026 11:53:00 +0200</pubDate>
		<description><p>Employee Shift Scheduling: Skills and Risk Factors</p></description>
        <content:encoded>
          <![CDATA[ <figure class="media"><div data-oembed-url="https://youtu.be/xJgRQldq-6k"><div class="c-embed__wrapper c-embed--video"><iframe src="https://www.youtube.com/embed/xJgRQldq-6k" frameborder="0"></iframe></div></div></figure><h2>Stop Juggling Shifts: </h2><p>In complex industries, you can’t just assign anyone to any shift. Whether it's healthcare, aviation, or field services, compliance and skill-matching are non-negotiable.</p><p><strong>Timefold</strong> is an enterprise-grade scheduling API that replaces manual guesswork with intelligent automation.</p>]]>
        </content:encoded>
		<enclosure url="https://timefold.ai/uploads/images/maxresdefault-5.webp" length="0" type="image/webp" />      </item>
    		      <item>
        <title><![CDATA[ Solve a Vehicle Routing Problem with AI ]]></title>
        <link>https://timefold.ai/videos/solve-a-vehicle-routing-problem-with-ai</link>
        <guid>https://timefold.ai/videos/solve-a-vehicle-routing-problem-with-ai</guid>
        <pubDate>Fri, 10 Apr 2026 16:13:00 +0200</pubDate>
		<description></description>
        <content:encoded>
          <![CDATA[ <figure class="media"><div data-oembed-url="https://youtu.be/Lcdw8i38X78"><div class="c-embed__wrapper c-embed--video"><iframe src="https://www.youtube.com/embed/Lcdw8i38X78" frameborder="0"></iframe></div></div></figure><h2>What are the best algorithms to optimize a Vehicle Routing Problem (VRP)?</h2><p>How do you automatically assign visits to vehicles while minimizing travel time?<br />And which technology actually makes this possible at scale?</p><p>The <strong>Vehicle Routing Problem (VRP)</strong> sits at the core of fleet optimization  and solving it efficiently is far from trivial. From greedy approaches to advanced AI-driven methods, there are multiple ways to tackle it, each with its own trade-offs.</p><p>In this video, Geoffrey De Smet breaks down the key challenges behind fleet routing optimization and explores the different algorithmic approaches available today, including:</p><ul><li>Greedy algorithms</li><li>(Meta)heuristics</li><li>Mixed Integer Programming (MIP) solvers (with optional GPU support)</li><li>Machine learning and AI techniques</li><li>Emerging approaches like quantum computing</li></ul><p>More importantly, he explains how these concepts translate into real-world solutions using <strong>Timefold Solver (open source)</strong> and Timefold’s REST APIs.</p><p>Whether you're building field service routing or solving pickup and delivery problems, this video shows how to move from theory to practical, scalable optimization.</p>]]>
        </content:encoded>
		<enclosure url="https://timefold.ai/uploads/images/VRP.png" length="0" type="image/png" />      </item>
    		      <item>
        <title><![CDATA[ Live webinar: Changelog &amp; Roadmap Q1 ]]></title>
        <link>https://timefold.ai/events/live-webinar-changelog-roadmap-q1</link>
        <guid>https://timefold.ai/events/live-webinar-changelog-roadmap-q1</guid>
        <pubDate>Thu, 02 Apr 2026 10:47:00 +0200</pubDate>
		<description><p>A lot landed in Q1. This session walks through it with live demos: managing and reprioritizing optimization jobs from the UI, new field service routing constraints and vehicle utilization metrics, and shift scheduling cost optimization with the Efficiency X-Ray. Then we open up the Q2 roadmap, including where Pickup and Delivery Routing is headed.</p></description>
        <content:encoded>
          <![CDATA[ <p>This session is the fastest way to catch up on what we released in Q1, and what's ahead in Q2. </p><p>We're running live demos across the Timefold Platform and two core models (Field Service Routing and Employee Shift Scheduling), walking through the features that matter most for engineering teams building and running scheduling systems in production.</p><p><strong>What we'll cover:</strong></p><ul><li><strong>Platform:</strong> Timefold Platform v1.0, the new Solve Queue and configuration overrides from the UI</li><li><strong>Field Service Routing</strong>: Technician area preferences, co-located visit grouping, and machine-readable validation</li><li><strong>Employee Shift Scheduling:</strong> Shift breaks for labor law compliance, per-employee disruption rules during replanning and and the employee &amp; shift Efficiency X-Ray</li><li><strong>Looking ahead: </strong>Insights into our Q2 plans and where we are headed. A first glimpse at our Pickup &amp; Delivery Routing API. </li></ul><p>No slides-heavy presentations, this is a hands-on demo session.<br />We'll leave time for questions at the end.</p>
<section class="">
	





<div
		class="c-form  c-form--no-formie js-form c-form--inline"
	
>
	

		<div class="c-form__form flex flex-col gap-8" >
			
					</div>

	
	</div>
</section>
<p> </p>]]>
        </content:encoded>
		<enclosure url="https://timefold.ai/uploads/images/blog/2025/webinar-timefold-bryntym-scheduling_2026-03-05-154522_kvuh.jpeg" length="0" type="image/jpeg" />      </item>
    		      <item>
        <title><![CDATA[ Mixed Models in Timefold Solver: Combining Planning Variable Types in One Solution ]]></title>
        <link>https://timefold.ai/blog/mixed-models-timefold-solver</link>
        <guid>https://timefold.ai/blog/mixed-models-timefold-solver</guid>
        <pubDate>Fri, 27 Mar 2026 13:10:00 +0100</pubDate>
		<description><p>Timefold Solver supports both basic and list planning variables... and you can mix them! Learn all three patterns and when each one makes sense.</p></description>
        <content:encoded>
          <![CDATA[ <p>Most planning problems fit neatly into one of two camps: you're either using <code>@PlanningVariable</code> to assign a single value to an entity, or <code>@PlanningListVariable</code> to build an ordered sequence. But real-world problems aren't always that tidy.</p><p>Sometimes a production line needs both an assigned operator <i>and</i> a queue of jobs to process. Sometimes you've got two different kinds of planning entities that each need their own variable type. And sometimes, the items inside a list are complex enough to need their own variables too. That's where mixed models come in.</p><h2>A quick refresher on variable types</h2><p>Before we get into mixed models, it helps to understand what we're mixing.</p><p>A <strong>basic planning variable</strong> holds a single value. Think assigning a <code>Shift</code> to an <code>Employee</code>, or a <code>Room</code> to a <code>Meeting</code>. It maps one entity to one value from a defined value range.</p><p>A <strong>list planning variable</strong> holds an ordered sequence of planning values. Think building a route for a <code>Vehicle</code> by assembling an ordered list of <code>Visits</code>. The solver decides both <i>which</i> values go in the list and in <i>what order</i>.</p><p><strong>Mixed models let you use both in the same solution.</strong></p><h2>Pattern 1: Both variables on the same entity</h2><p>The simplest form of a mixed model is a single planning entity that carries both a basic variable and a list variable.</p><pre><code class="language-java">@PlanningEntity
public class Line {

    @PlanningVariable
    private Operator operator;
    
    @PlanningListVariable
    private List&lt;Job&gt; jobs;
    // ...
}
</code></pre><p>Here, <code>Line</code> needs to know two things: which <code>Operator</code> is running it, and which <code>Job</code>s it's processing (and in what order). Neither variable type alone could express this — you'd lose either the assignment or the sequence.</p><p>This pattern is useful any time a single resource needs both an assignment <i>and</i> a workload. A manufacturing floor is the obvious example: each production line is staffed by a single operator, but processes a variable list of jobs throughout the day. The operator assignment affects skill-based constraints (can this operator run this type of job?), while the job list drives throughput and scheduling constraints (do we have enough time? are dependencies respected?).</p><p>The same structure applies to a surgical theatre that needs an assigned anaesthetist <i>and</i> an ordered list of procedures for the day, or a cloud VM assigned to a physical host <i>and</i> running an ordered queue of batch jobs. One entity, two concerns, two variable types.</p><figure class="image"><img style="aspect-ratio:1098/357;" src="https://timefold.ai/uploads/images/blog/2026/mixed-models/_hundredPercent/use-case-card-pattern-1.svg?transformId=4265&site=default" alt="" width="1098" height="357" /></figure><h2>Pattern 2: Multiple entities, each with their own variable</h2><p>The second pattern splits things across multiple planning entities. Each entity defines its own variable type independently.</p><pre><code class="language-java">@PlanningEntity
public class Line {

    @PlanningListVariable
    private List&lt;Job&gt; jobs;
    // ...
}

@PlanningEntity
public class LineOperation {

    @PlanningVariable
    private Operator operator;
    // ...
}
</code></pre><p>This works well when two decisions have genuinely different cadences or ownership: different lifecycles, different constraints, or different parts of the model that don't need to be tightly coupled on a single object.</p><p>Weekly staff rostering (assigning nurses to wards) combined with daily task scheduling (ordering tasks within a shift) is a natural fit. The roster changes weekly, the task list changes daily, and keeping them as separate entities means you can re-solve either without touching the other. Fleet assignment (which truck covers which region) paired with route planning (which stops that truck makes) follows the same logic: one decision is strategic, the other is operational, and conflating them in a single entity makes both harder to reason about.</p><figure class="image"><img style="aspect-ratio:1098/357;" src="https://timefold.ai/uploads/images/blog/2026/mixed-models/_hundredPercent/use-case-card-pattern-2.svg?transformId=4257&site=default" alt="" width="1098" height="357" /></figure><h2>Pattern 3: A child entity with its own variable</h2><p>The third pattern goes one level deeper: the items inside a list variable are themselves planning entities, each carrying their own basic variable.</p><pre><code class="language-java">@PlanningEntity
public class Vehicle {

    @PlanningListVariable
    private List&lt;Visit&gt; visits;
    // ...
}

@PlanningEntity
public class Visit {

    @PlanningVariable
    private DropoffPoint dropOffBefore;
    // ...
}
</code></pre><p>Here, <code>Vehicle</code> owns an ordered list of <code>Visit</code>s, that's your standard vehicle routing setup. But each <code>Visit</code> is also a <code>@PlanningEntity</code> in its own right, carrying a <code>dropOffBefore</code> variable that links it to a <code>DropoffPoint</code>.</p><p>This is what makes the Capacitated Vehicle Routing Problem with intermediate stops expressible. The parent shapes the route; the child refines each stop. That separation is what makes Pattern 3 so powerful, and what makes it the hardest to model without native support.</p><p>The common thread across use cases is decisions that are <i>scoped to an element of a list</i> rather than to the list as a whole. Consider last-mile delivery with parcel lockers: each <code>Visit</code> carries a <code>@PlanningVariable</code> for which locker to use as a fallback if no one is home. The route is solved at the vehicle level; the fallback assignment is solved at the visit level. Two decisions, two scopes, one clean model.</p><p>Multi-modal transport works the same way. An itinerary is a list of legs on a <code>Traveller</code> entity, but each leg independently decides its <code>TransportMode</code> (train, bus, or taxi) based on time, cost, and availability constraints. Without Pattern 3, you'd be encoding that per-leg decision somewhere it doesn't belong.</p><figure class="image"><img style="aspect-ratio:1097/406;" src="https://timefold.ai/uploads/images/blog/2026/mixed-models/_hundredPercent/use-case-card-pattern-3.svg?transformId=4258&site=default" alt="" width="1097" height="406" /></figure><h2>Wrapping up</h2><p>Mixed models are one of those features that quietly unlocks a whole class of problems that used to require awkward workarounds. If you've been shoehorning your domain into a single variable type, it's worth asking whether your model is actually mixed and if so, just saying so explicitly.</p><p>Check out the <a target="_blank" href="https://docs.timefold.ai/timefold-solver/latest/introduction" rel="noreferrer noopener">Timefold Solver docs</a> for the full reference on planning variables and mixed model configuration.</p>]]>
        </content:encoded>
		<enclosure url="https://timefold.ai/uploads/images/blog/2026/mixed-models/pexels-pavel-danilyuk-7776189.jpg" length="0" type="image/jpg" />      </item>
    		      <item>
        <title><![CDATA[ They&#039;re everywhere: Spotting optimization problems in the wild ]]></title>
        <link>https://timefold.ai/blog/theyre-everywhere-spotting-optimization-problems-in-the-wild</link>
        <guid>https://timefold.ai/blog/theyre-everywhere-spotting-optimization-problems-in-the-wild</guid>
        <pubDate>Thu, 19 Mar 2026 10:36:00 +0100</pubDate>
		<description><p>Airports. Restaurant kitchens. CERN. Once you start seeing planning problems in everyday life, you can't stop. Fair warning: this is a one-way door.</p></description>
        <content:encoded>
          <![CDATA[ <p>I’ve been flying a bit more recently for speaking engagements. Dublin. CERN. A few other places in between. As fun as that sounds, it also means something else: A lot of time in airports.</p><p>Right now, as I’m writing this, I’m sitting at a gate waiting for my flight. My flight is delayed. The gate next to mine just changed. A crowd of people is collectively refreshing the airport app, hoping their boarding time magically moves forward so they don’t miss their connection.</p><p>I couldn’t help but smile and think: yep, this is a planning problem!</p><p>Over the past year, I’ve noticed something interesting about how I look at the world. I’ve written about it before, but the idea keeps coming back: <strong>Planning problems are everywhere.</strong></p><figure class="image"><img style="aspect-ratio:1098/618;" src="https://timefold.ai/uploads/images/blog/2025/_hundredPercent/planning-problems-are-everywhere-timefold.jpeg" alt="" width="1098" height="618" /></figure><p>I’ve joked it is sort of a curse, once you start seeing them, you can’t really unsee them. And yet people underestimate just how common they are. When you start modelling these problems, you begin to notice something interesting: they all share the same structure.</p><h2>Airports: A giant optimization puzzle</h2><p>Airports might be one of the best examples.</p><p>When you think about everything that has to come together, it’s really a lot! Airports are actually running several optimization problems at the same time: gate assignment, crew scheduling, aircraft turnaround planning, runway slot allocation**,** and passenger connection protection. It’s almost a wonder airports work at all.</p><figure class="image"><img style="aspect-ratio:1098/618;" src="https://timefold.ai/uploads/images/blog/2025/_hundredPercent/planning-problems-are-everywhere.jpg?transformId=4150&site=default" alt="" width="1098" height="618" /></figure><p>Yet people often remember just the negative and chaotic parts: the boarding delay, the last minute gate changes or the long lines at security.</p><p>Working with planning problems on a daily basis, I see things a little differently. Just understanding the immense complexity behind creating an initial plan already makes me feel calmer about the chaos.</p><p>Think about the decisions involved:</p><ul><li>Which <strong>gate</strong> should each flight use?</li><li>Which <strong>crew</strong> can legally operate a flight after delays?</li><li>How do we minimize <strong>missed connections</strong>?</li><li>Where should incoming aircraft be <strong>parked</strong>?</li><li>How do we <strong>re-route passengers</strong> when things go wrong?</li></ul><p>Every delay or mishap ripples through that system of decisions, forcing the plan to be re-evaluated.</p><p>When the chaos hits, like it has around me writing this, I realize that this is just the result of a complex system constantly trying to adapt its plan as the situation changes.</p><p>And honestly, I can’t help but admire the attempt 🙂.</p><h2>Irish breakfast, but optimized</h2><p>Apparently I don’t even need to be fully awake to get bitten by the optimization bug.</p><p>After a busy evening speaking at a user group in Dublin and a shorter night than I hoped for, I dragged myself to a nearby breakfast restaurant to grab a proper Irish breakfast with a fellow optimization enthusiast.</p><p>As we were talking about the different projects we’d worked on, I became fascinated with the restaurant’s open kitchen layout. And once again, my mind drifted toward optimization.</p><p>A restaurant kitchen is basically a <strong>job scheduling system</strong>. Orders arrive dynamically. Each dish requires different preparation steps. The kitchen has limited resources: burners, ovens, chefs, and time.</p><p>The staff constantly make small scheduling decisions:</p><ul><li>Which order should be cooked first?</li><li>Which dishes can run in parallel?</li><li>How do we avoid one table waiting forever?</li></ul><p>Experienced kitchens develop an intuition for it, but under the hood it resembles a classic <strong>job-shop scheduling problem</strong>.</p><p>And I couldn’t help but think how I’d model this problem as an optimization problem.</p><p>Sure, this kitchen is at a small scale. But structurally, it’s not that different from much larger systems.</p><h2>CERN</h2><p>I was lucky enough to be invited to speak at Voxxed Days CERN, which came with some awesome perks, including a guided tour through the facilities. You probably guessed it by now, but even here it made me wonder about the planning challenges behind the scenes.</p><ul><li>Scheduling <strong>maintenance for all different facilities</strong></li><li>Allocating <strong>compute resources</strong> for analysis jobs</li><li>Coordinating <strong>experiments and detector usage</strong></li></ul><figure class="image"><img style="aspect-ratio:1098/824;" src="https://timefold.ai/uploads/images/blog/2025/_hundredPercent/CERN-timefold.jpg?transformId=4168&site=default" alt="" width="1098" height="824" /></figure><p>Even at one of the world’s most advanced research labs, the same fundamental problem appears again and again: <strong>“How do we allocate limited resources in the best possible way?”.</strong></p><p>And of course, my brain was already buzzing with ways to optimize it.</p><h2>Seeing the pattern</h2><p>If you are involved with planning optimization solutions, a pattern starts to emerge that you can’t unsee. Many everyday systems share the same underlying structure:</p><ul><li><strong>Resources</strong> (gates, buses, chefs, CPUs)</li><li><strong>Tasks</strong> (flights, routes, orders, jobs)</li><li><strong>Constraints</strong> (time limits, capacity, regulations)</li><li><strong>Objectives</strong> (speed, cost, fairness, efficiency)</li></ul><p>…and the challenge becomes finding the <strong>best possible plan</strong>.</p><p>Optimization problems are just amazing puzzles… and quite addictive 🙂 The only downside is that once you start thinking this way, it becomes hard to stop.</p><p>You start seeing optimization problems everywhere:</p><p>In airports. In supermarkets. In conference schedules. In traffic lights. In restaurant kitchens.</p><p>Sometimes you’re just standing in line somewhere and suddenly catch yourself thinking:</p>



<blockquote class="c-quote  ">
	<span class="c-quote__quote"></span>

	</blockquote>
<p>Much to the dismay of my partner and friends, who occasionally see me drift off mid-conversation.</p><p>But when things go sideways, like delays at an airport, it also brings a strange kind of calm.</p><p>Because the chaos we see in the real world often isn’t chaos at all.</p><p>It’s a plan being repaired in real time.</p><p>And if you know how to look at it…</p><p>You start seeing optimization problems everywhere.</p>]]>
        </content:encoded>
		<enclosure url="https://timefold.ai/uploads/images/blog/2025/planning-problems-are-everywhere.jpg" length="0" type="image/jpg" />      </item>
    		      <item>
        <title><![CDATA[ Solver 2.x: Java Platform Module System (JPMS) support. ]]></title>
        <link>https://timefold.ai/blog/solver-2-x-java-platform-module-system-support</link>
        <guid>https://timefold.ai/blog/solver-2-x-java-platform-module-system-support</guid>
        <pubDate>Tue, 10 Mar 2026 11:41:00 +0100</pubDate>
		<description><p>We are introducing JPMS support in Timefold Solver 2.x. In this blog post, we explain what that means to our current users and to the long term maintainability of the project. </p></description>
        <content:encoded>
          <![CDATA[ <p>We recently announced Timefold Solver 2.x, slated for somewhere later this month. It’s our first <i>real</i> major version since the fork (1.x was largely a package rename from the old OptaPlanner days) which means it’s finally time to address some issues we’ve been wanting to tackle for ages. One of them was <i>modularity</i>.</p><h2>Java's <code>public</code> challenge</h2><p>In Java, classes have a few visibility options. <code>private</code>, package-private, <code>protected</code>, and <code>public</code>. Large libraries often end up marking internal classes as <code>public</code> so different packages inside the library can interact. That’s exactly what happened in Timefold over the years.</p><p>As the codebase grew, some classes were technically public but <strong>never meant to be used by consumers</strong>. You’ve probably seen them:</p><p><code>ai.timefold.solver.core.*impl.*</code></p><p>Those packages contain implementation details of the solver. But since the classes were public, they were sometimes used anyway. From a user’s perspective, the reasoning is understandable: <i>"If it’s public, why shouldn’t I use it?"</i></p><p>For years, Java lacked a visibility level that meant “public within this codebase, but not part of the supported API.” That changed with the introduction of <a target="_blank" href="https://cr.openjdk.org/~mr/jigsaw/spec/" rel="noreferrer noopener">Java Platform Module System (JPMS)</a>, which we will formally be supporting starting with Solver 2.0.</p><p>With JPMS we can explicitly choose which packages are exported and which remain internal.</p><pre><code class="language-java">module ai.timefold.solver.core {

    exports ai.timefold.solver.core.api.domain.common;
    exports ai.timefold.solver.core.api.domain.entity;
    exports ai.timefold.solver.core.api.domain.solution;
    exports ai.timefold.solver.core.api.domain.solution.cloner;
    
    // rest of file excluded
}
</code></pre><p>Exported packages are the supported API. Everything else stays internal. In other words:</p><p><strong>public no longer means “public to the world.”</strong></p><p><i>(If you run everything on the classpath instead of the modulepath, JPMS boundaries can still be bypassed. But for Solver 2.x, exported packages define the supported API.)</i></p><h2>Why does this matter?</h2><p>This change is mostly about <strong>clarity and long-term stability</strong>.</p><p>With explicit API boundaries we can:</p><ul><li>avoid accidental dependencies on internals</li><li>refactor internal code more freely</li><li>make upgrades less risky</li></ul><p>Internal classes may change or disappear without notice. Exported packages are the stable API.</p><h2>If you depend on internal classes</h2><p>If your code imports packages containing <code>.impl.</code>, you’re probably using internals.</p><p>Sometimes that happened because certain advanced use cases required it (e.g. Custom Moves). We’re actively working on replacing those patterns with <strong>supported public APIs</strong>.</p><p>If you have a legitimate use case that depends on internals, we’d like to hear about it. The goal isn’t to block anything, it’s to provide <strong>stable ways to do what you need without relying on implementation details</strong>.</p><p>If you’re using Timefold Solver and have concerns about internal classes you depend on, now is a great time to let us know.</p>]]>
        </content:encoded>
		<enclosure url="https://timefold.ai/uploads/images/blog/2026/pexels-andreea-ch-371539-11889329.jpg" length="0" type="image/jpg" />      </item>
    		      <item>
        <title><![CDATA[ Am I Ready for Optimization? The Data Foundations of Efficient Field Service ]]></title>
        <link>https://timefold.ai/blog/am-i-ready-for-optimization-the-data-foundations-of-efficient-field-service</link>
        <guid>https://timefold.ai/blog/am-i-ready-for-optimization-the-data-foundations-of-efficient-field-service</guid>
        <pubDate>Tue, 03 Mar 2026 15:12:00 +0100</pubDate>
		<description></description>
        <content:encoded>
          <![CDATA[ <p>Over the past decade, enterprises have invested heavily in understanding their data. Enterprises that have learned how to work with their data are in a strong position to forecast future needs, spot efficiencies, and act on opportunities.</p><p>If your field service organization has reached that point (or is getting close) there is one more door that structured, accessible data unlocks: <strong>optimization</strong>.</p><p>Not the vague, aspirational kind of optimization. The kind where you feed your technician availability, customer appointments, and job locations into an engine that produces the best schedule for the day - respecting every shift limit, skill requirement, time window, and lunch break - and returns it in seconds. </p><p>Optimization can be a key differentiator for many enterprises, but it is only as good as the data it consumes. In this post, we will walk through the data prerequisites for field service scheduling optimization, and explain why data readiness matters, which specific data you need (and where it typically lives), what opportunities open up once it is structured, and how to put it to work.</p><h2>Why data readiness determines optimization success</h2><p>A scheduling optimization engine is, at its core, a constraint solver. It takes a precise description of your planning problem (every technician, every job, every rule) and finds the best feasible assignment of work to people across time and space.</p><p>The operative word is <i>precise</i>. The engine cannot infer what it does not know. If a technician's lunch break is not in the data, the optimizer will schedule visits straight through it. If a customer's availability window is missing, the engine has no reason to avoid sending someone at 7 AM. If locations are inaccurate, travel time calculations fall apart, and the beautifully optimized route becomes fiction the moment a technician starts driving.</p><p>The quality of the output is bounded by the quality of the input. Organizations that have invested in structuring and owning their operational data are already past the hardest part. The remaining step is understanding <i>which</i> data optimization requires, and mapping it from where it already lives.</p><h2>Which data do you need?</h2><p>Field service optimization consumes three categories of data, each representing a different dimension of your operation. If you are familiar with spreadsheet-based scheduling, think of these as the tabs in your planning workbook. The difference? Instead of a planner manually cross-referencing them, an engine processes them all simultaneously.</p><h3>1. Employee and vehicle data (the supply side)</h3><p>This describes your workforce: who is available, when they work, what they can do, and when they need a break.</p><p>In the optimization model, each vehicle represents a technician and their transport for a given day. A vehicle record includes an <code>id</code>, the operating date, shift boundaries (<code>minStartTime and maxEndTime</code>), an optional <code>maxSoftEndTime</code> for overtime flexibility, the technician's skills, their <code>startLocation</code> and <code>endLocation</code> (typically home or a depot), a <code>technicianRating</code>, and any <code>requiredBreaks</code> for that day.</p><p>Breaks are defined within each vehicle's shift. Each break includes an <code>id</code>, a type (floating for a lunch that can slide within a window, or fixed for something like a medical appointment that cannot move), the date, a <code>minStartTime</code> and <code>maxEndTime</code> defining when the break can occur, and optionally a <code>locationId</code> if the technician needs to be somewhere specific for it.</p><p>Here is a simplified example of what this looks like as structured data:</p><pre><code class="language-java">{
 "id": "vehicle-1",
 "date": "2025-06-10",
 "minStartTime": "08:00",
 "maxEndTime": "17:00",
 "skills": ["HVAC", "electrical"],
 "startLocation": "loc-depot-01",
 "endLocation": "loc-depot-01",
 "requiredBreaks": [
   {
     "id": "break-1",
     "type": "floating",
     "minStartTime": "11:30",
     "maxEndTime": "13:30"
   }
 ]
}</code></pre><p>This data typically lives across your HR or workforce management system (for shifts, skills, and PTO), your fleet management tool (for vehicle assignments), and sometimes a separate time-and-attendance platform. The key is being able to extract it per day, per technician, in a structured format.</p><h3>2. Customer and work order data (the demand side)</h3><p>This is every job that needs to happen: where, how long, when, and under what conditions. </p><p>Visits are the core unit of demand. Each visit includes an <code>id</code>, a <code>name</code>, a <code>locationId</code> linking it to a physical address, a <code>serviceDuration</code> (how long the job takes on-site), any <code>requiredSkills</code> the technician must have (matching the skills defined on the vehicle), a <code>latestSlaEndTime</code> if there is a contractual deadline, a <code>priority</code> level, and optionally a <code>visitGroupId</code> for jobs that require multiple technicians on-site simultaneously.</p><p>Each visit also includes one or more time windows defining when the customer is available. A time window has an <code>id</code>, a <code>date</code>, and a <code>minStartTime</code> and <code>maxEndTime</code>. A window of 10:00 to 13:00 means the technician must arrive within that range. Some visits may have multiple windows across different days, giving the optimizer flexibility in scheduling.</p><p>The completeness of your time windows and skill requirements often determines how much optimization headroom you actually have. If the engine does not know a customer is only available in the morning, it cannot avoid scheduling an afternoon arrival.</p><p>This data typically originates in your CRM, ERP, ticketing system, or field service management application.</p><h3>3. Geographical data (the physical reality)</h3><p>The third pillar ties everything together spatially. Without it, the optimizer has no concept of distance or travel time.</p><p><strong>Locations</strong> are simple but critical: each record is an <code>id</code>, a <code>latitude</code>, and a <code>longitude</code>. These location IDs are referenced everywhere, in visits (where the job is), in vehicles (where the technician starts and ends their day), and in vehicle breaks (where a fixed appointment takes place).</p><p>This data lives in your CRM, address databases, or GIS systems. If you are still working primarily with street addresses, geocoding them into coordinate pairs is a prerequisite. Street-level addresses introduce ambiguity, a geocoded coordinate does not.</p><p>The optimization engine uses these coordinates to compute real-world travel times and distances between every relevant pair of points. The accuracy of your locations directly determines the accuracy of every route the engine produces.</p><h2>What opportunities open up</h2><p>Structuring and connecting these three data pillars is not just a checkbox exercise. It is the foundation for a fundamentally different way of operating.</p><p><strong>From manual assembly to automated optimization.</strong> Today, dispatchers and planners spend hours each morning assembling routes by hand: Cross-referencing technician availability, customer windows, skill requirements, and geography, often in spreadsheets or on whiteboards. With structured data, this entire process becomes an API call. The engine considers every constraint simultaneously and returns an optimized plan in seconds.</p><p><strong>From static plans to real-time replanning.</strong> A technician calls in sick at 8 AM. An emergency job arrives at 11:00. A visit runs an hour over. With structured, accessible data, you update the inputs and re-solve. The engine does not carry stale assumptions from the morning schedule. It takes the current reality and produces the best schedule from this point forward.</p><p><strong>From gut feeling to explicit trade-offs.</strong> Should you minimize mileage or minimize overtime? Is SLA compliance more important than travel efficiency? With structured data and a configurable optimization model, these become tunable parameters with measurable impact. Not judgment calls made under pressure at 6 AM.</p><p><strong>From siloed reporting to operational KPIs.</strong> Optimization outputs include metrics like total travel time, overtime incurred, visits completed versus unassigned, and utilization per technician. When your input data is clean and complete, these outputs become trustworthy enough to drive strategic decisions.</p><h2>Putting it into practice</h2><p>Most organizations will not find all three data pillars neatly organized in a single system. That is normal. The integration challenge is not about migrating everything into one database. It is about building a pipeline that assembles the optimization input from your existing sources and keeps it flowing.</p><p><strong>Step 1: Map your sources.</strong> For each data entity (vehicles, vehicle breaks, visits, visit time windows, visit groups, locations), identify which system of record holds the authoritative version. Document where gaps exist: missing coordinates, incomplete time windows, skills not yet digitized.</p><p><strong>Step 2: Close the gaps.</strong> Geocode addresses into coordinates. Ensure every technician's shift has explicit start and end times. Capture customer availability as structured time windows, not free-text notes. Define skills as a controlled vocabulary, not ad-hoc descriptions.</p><p><strong>Step 3: Build the extraction layer.</strong> Create repeatable, automated exports from each source system. This could be API integrations, database queries, or scheduled file exports, whatever your systems support. The goal is to assemble a complete optimization dataset on demand, not through manual effort.</p><p><strong>Step 4: Transform and submit.</strong> Map your extracted data into the structure the optimization engine expects (each vehicle with its shifts and breaks, each visit with its time windows and skills, each location as a coordinate pair) and POST it as a JSON payload to the API. Timefold's Field Service Routing API is stateless by design: it takes the full problem description, validates the input, solves it, and returns the optimized route plan. It does not store your data between runs. Each request is self-contained.</p><p><strong>Step 5: Integrate the results.</strong> The response contains the optimized assignments - which visits land on which vehicle shift, in what order, with arrival times, departure times, and travel durations - plus KPIs summarizing overall plan quality. Push these assignments back into your dispatch system, mobile app, or field service management platform.</p><p>This stateless architecture is a deliberate choice that keeps you in control. Your data stays in your systems and you send only what is needed for each run. Any system that can make an HTTP request can integrate. When reality changes mid-day, you update the inputs and re-solve with no stale state. And every input and output is a complete, self-describing JSON document you can version, compare, and audit.</p><h2>The takeaway</h2><p>Data readiness is not a prerequisite you endure before the real work begins. For many organizations, it <i>is</i> the highest-leverage work and the foundation that makes forecasting, analysis, and optimization possible.</p><p>If your field service operation has been investing in structuring and owning its data, you are closer to optimization than you might think. The data you need already exists in your systems. The remaining step is connecting it.</p><p>And once it is connected, the results follow: less time on the road, more visits per day, fewer SLA breaches, and dispatchers freed to focus on exceptions rather than assembly. Not because of a magic algorithm, but because you gave the algorithm something precise to work with.</p><p>If you want to see how your data maps to the optimization model,<a target="_blank" href="https://docs.timefold.ai/field-service-routing/latest/introduction" rel="noreferrer noopener"> explore Timefold's Field Service Routing documentation</a> or<a target="_blank" href="https://app.timefold.ai" rel="noreferrer noopener"> </a><a target="_blank" href="https://timefold.ai/request-a-trial" rel="noreferrer noopener">start a trial on the platform.</a></p>]]>
        </content:encoded>
		<enclosure url="https://timefold.ai/uploads/images/blog/2025/Am-I-ready-for-optimization-The-data-foundations-of-efficient-field-service.jpeg" length="0" type="image/jpeg" />      </item>
    		      <item>
        <title><![CDATA[ Beyond self-scheduling: Balancing efficiency and autonomy in field service ]]></title>
        <link>https://timefold.ai/blog/beyond-self-scheduling-balancing-efficiency-and-autonomy-in-field-service</link>
        <guid>https://timefold.ai/blog/beyond-self-scheduling-balancing-efficiency-and-autonomy-in-field-service</guid>
        <pubDate>Sun, 01 Mar 2026 20:57:00 +0100</pubDate>
		<description><p>Self-scheduling feels like freedom for field technicians, but it masks inefficiencies that drain profitability. And forcing technological solutions that ignore frontline expertise is a recipe for resistance.</p></description>
        <content:encoded>
          <![CDATA[ <p>Field service engineers don't resist technology because they fear change. They resist it because they've seen what happens when tools<strong> ignore how work actually gets done</strong>.</p><p>The objection we hear most often from operations leaders: "Our FSEs self-schedule. They won't accept a system that tells them where to go."</p><p>They're right to be cautious. But the <strong>choice isn't between autonomy and optimization</strong>. The best-performing field service organizations have found a third way.</p><h2>The real problem with self-scheduling</h2><p>Self-scheduling persists because it solves real problems. Engineers know their territories. They understand which customers need extra time. They've built relationships that smooth difficult service calls.</p><p>But self-scheduling also creates <strong>invisible costs</strong>:</p><ul><li><strong>Route inefficiency compounds daily.</strong> An engineer who prefers to work east-to-west on Mondays might be adding 30 minutes of drive time without realizing it. Multiply that across a 50-person team and 250 working days.</li><li><strong>You have to trust blindly.</strong> The 80-20 rule applies here. Even if 80% of your employees schedule in good faith, there's always a minority that takes advantage of their freedom.</li><li><strong>The bigger picture stays invisible.</strong> Engineers often schedule only their immediate workload. They can't see that shifting Tuesday's route would unlock a more efficient Wednesday, or that a job they're avoiding this week will cascade into a scheduling nightmare next week. Longer planning horizons (across days, weeks, over the full team) reveal efficiencies that short-term, individual scheduling simply cannot surface.</li><li><strong>Skill mismatches go undetected.</strong> The best-qualified engineer for a complex repair might be in the next territory, but self-scheduling never surfaces that option.</li><li><strong>Preference conflicts accumulate.</strong> When three engineers all want Fridays off, or all avoid a difficult customer site, someone ends up overloaded, usually the newest team member who hasn't yet learned to game the system.</li></ul><p>Can you afford the efficiency gap between what your team produces and what's mathematically possible?</p><h2>Why FSEs push back on optimization</h2><p>If optimization delivers clear efficiency gains,<strong> why the resistance</strong>?</p><p>Because most pure optimization tools treat engineers as interchangeable units to be deployed, not as skilled professionals with legitimate preferences and local knowledge.</p><p>When an algorithm assigns routes <strong>without explanation, engineers lose trust</strong>. When the schedule ignores a technician's need to pick up their child on Wednesdays, it fails the human test. When the system can't answer "why am I driving past this job to reach one further away?", it invites workarounds.</p><p>The result: engineers learn to game the system, dispatch overrides multiply, and the theoretical efficiency gains evaporate in practice.</p><p>This is a <strong>design failure, not an optimization failure</strong>.</p><h2>The hybrid model: Optimal starting points, human control</h2><p>The solution is not choosing between optimization and autonomy, but architecting systems that provide both.</p><p><strong>Start with mathematically optimal schedules.</strong> The optimization engine generates routes that account for every constraint: geography, skills, time windows, equipment, SLAs, labor rules, and historical performance. This is objectively the best possible starting point, one that no human could calculate manually.</p><p><strong>Present schedules as recommendations, not mandates.</strong> Engineers see their daily route with clear rationale. They can accept it as-is (which they probably should, since it's mathematically proven to be the most efficient solution given all constraints) or they can adjust it.</p><p><strong>Enable controlled adjustments.</strong> If an engineer needs to be in a specific area on Wednesdays, they can set that preference. If they want to make a personal stop, they can adjust the route. If they see a better option based on local knowledge, they can make the change. Whether it's display as a drag-and-drop UI, or as re-optimize button with new constraints, engineers keep working on their terms.</p><h2>Explainable AI: The trust architecture</h2><p>Optimization without explanation is a black box. Engineers won't trust it, and operations leaders can't defend it.</p><p>For any scheduling decision, the <strong>system should articulate which constraints drove it</strong>: "You're assigned this job because you hold the required certification and are 12 minutes closer than the next qualified option." When trade-offs exist, show them: "Swapping these two stops would save 8 minutes of drive time but push the priority customer outside their SLA window."</p><p>When engineers can see <i>why</i> a schedule looks the way it does, <strong>resistance transforms into collaboration</strong>. Questions like "wouldn't it be better to go here first?" get answered in plain language, whether it's geographical clustering, skill-matching, time windows, or SLA requirements driving the sequence.</p><p>Engineers become<strong> partners in optimization </strong>rather than subjects of it.</p><h2>Self-scheduling vs. optimized scheduling</h2><figure class="table"><table><thead><tr><th> </th><th>Self-Scheduling</th><th>Optimization-Assisted</th></tr></thead><tbody><tr><td><strong>Planning horizon</strong></td><td>Mostly one day at a time</td><td>Days, weeks, months, for the entire team</td></tr><tr><td><strong>Route efficiency</strong></td><td>Based on intuition and habit</td><td>Mathematically optimized for all constraints</td></tr><tr><td><strong>Skill matching</strong></td><td>Limited to what the engineer knows</td><td>System-wide visibility into certifications and expertise</td></tr><tr><td><strong>SLA visibility</strong></td><td>Reactive: problems surface late</td><td>Proactive: risks flagged before they materialize</td></tr><tr><td><strong>Workload distribution</strong></td><td>Uneven, favors experienced engineers</td><td>Balanced across the team</td></tr><tr><td><strong>Engineer preferences</strong></td><td>Fully autonomous, but uncoordinated</td><td>Respected as constraints, coordinated across team</td></tr><tr><td><strong>Adjustments</strong></td><td>Total freedom, no guardrails</td><td>Freedom to adjust with re-optimization</td></tr><tr><td><strong>Explainability</strong></td><td>"I know my territory"</td><td>Plain-language rationale for every decision</td></tr><tr><td><strong>Adaptability</strong></td><td>Slow and stressful: requires manual replanning</td><td>Real-time re-optimization when conditions change</td></tr></tbody></table></figure><h2>Implementation without disruption</h2><p>Even more than distrust, the strongest <strong>objection to any new system is disruption</strong>. Field service operations can't pause while IT rebuilds the scheduling stack. The right approach integrates optimization via <strong>API into existing dispatch systems</strong> and mobile apps. Why? Because engineers keep using familiar interfaces, and dispatchers keep their dashboards. Start with a pilot team, run optimization in parallel, compare results, and expand once the efficiency gains are proven.</p><h2>A different conversation</h2><p>The field service teams that succeed with optimization aren't the ones that override engineer autonomy. They're the ones that<strong> reframe the conversation</strong>.</p><p>Self-scheduling asks: "What route do I want to run today?"</p><p>Optimized scheduling asks: "Given everything we need to accomplish, what's the best version of the day I want to have?"</p><p>The second question is better. It respects engineer preferences while acknowledging that individual choices affect teammates, customers, and business outcomes.</p><p>When the optimization engine handles the combinatorial complexity,<strong> engineers can focus on what they do best: solving problems, building customer relationships, and applying the expertise that no algorithm can replicate.</strong></p><p>That's the balance worth building toward.</p>


<section
	class=" rounded-3xl p-8 prop-bg   "
	
	style="background-image: url(); background-size: cover; background-position: center;"
>
	
</section>

]]>
        </content:encoded>
		<enclosure url="https://timefold.ai/uploads/images/blog/2025/self-scheduling-vs-optimization-field-service.jpeg" length="0" type="image/jpeg" />      </item>
    		      <item>
        <title><![CDATA[ From complex labor laws to scalable conditional constraints ]]></title>
        <link>https://timefold.ai/blog/complex-labor-laws-to-scalable-conditional-constraints</link>
        <guid>https://timefold.ai/blog/complex-labor-laws-to-scalable-conditional-constraints</guid>
        <pubDate>Wed, 18 Feb 2026 14:27:00 +0100</pubDate>
		<description><p><br />Our engineer Lukas Downes shares his experience building constraints which don't always apply.</p></description>
        <content:encoded>
          <![CDATA[ <p>I like labor laws, but holy cats, they're complex to implement. The people who formulated the labor laws wanted to ensure the well-being of employees, but forgot about the poor engineers who have to implement them.</p><p>Take a look at this scheduling constraint for example:</p>



<blockquote class="c-quote  ">
	<span class="c-quote__quote"></span>

	</blockquote>
<p>This is what we call a (headache) <strong>Conditional Constraint</strong>. Let me show you how I solved it.</p><h2>Dealing with conditional constraints</h2><p>The first step is to understand the requirement. "Every seven days" means that I need to group shifts in 7 day windows we call these “rolling windows”. "If they work a night shift" means that I need to count the night shifts in this group of shifts. "Work a Maximum of 40h" is what I need to evaluate and penalize in that same group of shifts, if I detected a night shift.</p><p>Next, I want to lay out how I want my constraint to look.</p><ol><li>I need to count the amount of shifts worked in a rolling window</li><li>I also need to track the minutes worked in that same rolling window</li><li>I want to filter shifts with certain tags, but independently for both previous rules, i.e. we want to count night shifts, and penalise the time worked of all shifts</li><li>Everything should be high performance and scale up to at least 100.000 shifts</li><li>The API should be minimal, clear, extensible, specific...</li></ol><p>With the rules set, I can start working on this. Grouping the shifts for (1.) and (2.) can be difficult, but luckily I can just do a cheeky copy paste from our existing constraints. Combining them can also be pretty challenging, because I have to penalize a group of shifts, if the same group of shifts exists in the other stream. </p><p>But the answer lies in how you formulate the problem. "... if ... exists ..." is the perfect case to use the constraint node <a target="_blank" href="https://docs.timefold.ai/timefold-solver/latest/constraints-and-score/score-calculation#constraintStreamsConditionalPropagation" rel="noreferrer noopener">ifExists</a>. A benefit of using <code>ifExists</code> in this case, is that we ensure scalability and performance.</p><h2>API design</h2><p>Another difficult step is creating an easily extensible, specific, easily understandable API. During our design meeting, we settled on:</p><pre><code class="language-plaintext">{
 "rollingWindowRules": {
   "id": "max 36h worked if night shift is present",
   "window": 0,
   "minutesWorkedLimit": {
     "minutesWorkedMax": 2160 // 36 * 60 minutes
   },
   "condition": {
     "triggerLimit": 1,
     "type": "MIN_SHIFTS_WORKED",
     "includeShiftTags": [ "night shift" ],
     "shiftTagMatches": "ALL"
   }
 }
}</code></pre><p>Let's see if it meets our requirements. </p><ol><li><i>minimal</i>: yes, we only added the 'condition' field.</li><li><i>extensible</i>: yes, a type to specify what type of condition the triggerLimit will represent, for example MIN_SHIFTS_WORKED or MIN_MINUTES_WORKED. I only implemented these two, but we can easily add more.</li><li><i>specific</i>: yes, we allow the filtering of shifts with our includeShiftTags.</li></ol><h2>Conclusion</h2><p>I'm proud of how the constraint turned out. I managed to create a design for a complex problem that makes full use of the constraint stream's performance capabilities and is still readable and extensible. Creating new conditions is super easy now. So if you're interested in having a condition like "if the time off exceeds 48h then ..." or "if the amount of consecutive shifts worked exceeds 3 then..." Please do contact us, and I'll be so glad to put my hard work to good use!</p>]]>
        </content:encoded>
		<enclosure url="https://timefold.ai/uploads/images/blog/2025/From-complex-labor-laws-to-scalable-conditional-constraints.jpeg" length="0" type="image/jpeg" />      </item>
      </channel>
</rss>
