diff --git a/_includes/jump-dev-2025-schedule.html b/_includes/jump-dev-2025-schedule.html
new file mode 100644
index 0000000..b4d43d0
--- /dev/null
+++ b/_includes/jump-dev-2025-schedule.html
@@ -0,0 +1,152 @@
+<table>
+<tr>
+  <th></th>
+  <th><b>Monday 17</b></th>
+  <th><b>Tuesday 18</b></th>
+</tr>
+<tr>
+  <td class="talk-table">09:30&nbsp;</td>
+  <td class="talk-table talk-organization"><div class="talk-title">Introduction and welcome</div></td>
+  <td class="talk-table"><div class="talk-title">What's new in HiGHS, and thanks to JuMP for its support!</div><div class="talk-speaker">Julian Hall</div></td>
+</tr>
+<tr>
+  <td class="talk-table">09:45&nbsp;</td>
+  <td class="talk-table"><div class="talk-title">The state of JuMP</div><div class="talk-speaker">Miles Lubin</div></td>
+  <td class="talk-table"></td>
+</tr>
+<tr>
+  <td class="talk-table">10:00&nbsp;</td>
+  <td class="talk-table"></td>
+  <td class="talk-table"><div class="talk-title">Unlocking the Power of Google OR-Tools with MathOptInterface.jl</div><div class="talk-speaker">Thibaut Cuvelier</div></td>
+</tr>
+<tr>
+  <td class="talk-table">10:15&nbsp;</td>
+  <td class="talk-table"><div class="talk-title">JuMP on demand: Creating your own compute cluster for solving optimisation problems</div><div class="talk-speaker">James Foster</div></td>
+  <td class="talk-table"></td>
+</tr>
+<tr>
+  <td class="talk-table">10:30&nbsp;</td>
+  <td class="talk-table talk-break"><div class="talk-title">Morning tea</div></td>
+  <td class="talk-table talk-break"><div class="talk-title">Morning tea</div></td>
+</tr>
+<tr>
+  <td class="talk-table">10:45&nbsp;</td>
+  <td class="talk-table talk-break"></td>
+  <td class="talk-table talk-break"></td>
+</tr>
+<tr>
+  <td class="talk-table">11:00&nbsp;</td>
+  <td class="talk-table"><div class="talk-title">Optimizing over trained neural networks with MathOptAI.jl</div></td>
+  <td class="talk-table"><div class="talk-title">GPU Implementation of Algorithm NCL</div><div class="talk-speaker">Michael Saunders</div></td>
+</tr>
+<tr>
+  <td class="talk-table">11:15&nbsp;</td>
+  <td class="talk-table"></td>
+  <td class="talk-table"></td>
+</tr>
+<tr>
+  <td class="talk-table">11:30&nbsp;</td>
+  <td class="talk-table"><div class="talk-title">Bridging the Gap Between Models and Solvers through Constraint Programming</div><div class="talk-speaker">Jean-François Baffier</div></td>
+  <td class="talk-table"><div class="talk-title">Revisiting sparse matrix coloring and bicoloring</div><div class="talk-speaker">Alexis Montoison</div></td>
+</tr>
+<tr>
+  <td class="talk-table">11:45&nbsp;</td>
+  <td class="talk-table"></td>
+  <td class="talk-table"></td>
+</tr>
+<tr>
+  <td class="talk-table">12:00&nbsp;</td>
+  <td class="talk-table talk-break"><div class="talk-title">Lunch</div></td>
+  <td class="talk-table talk-break"><div class="talk-title">Lunch</div></td>
+</tr>
+<tr>
+  <td class="talk-table">12:15&nbsp;</td>
+  <td class="talk-table talk-break"></td>
+  <td class="talk-table talk-break"></td>
+</tr>
+<tr>
+  <td class="talk-table">12:30&nbsp;</td>
+  <td class="talk-table talk-break"></td>
+  <td class="talk-table talk-break"></td>
+</tr>
+<tr>
+  <td class="talk-table">12:45&nbsp;</td>
+  <td class="talk-table talk-break"></td>
+  <td class="talk-table talk-break"></td>
+</tr>
+<tr>
+  <td class="talk-table">13:00&nbsp;</td>
+  <td class="talk-table talk-break"></td>
+  <td class="talk-table talk-break"></td>
+</tr>
+<tr>
+  <td class="talk-table">13:15&nbsp;</td>
+  <td class="talk-table talk-break"></td>
+  <td class="talk-table talk-break"></td>
+</tr>
+<tr>
+  <td class="talk-table">13:30&nbsp;</td>
+  <td class="talk-table talk-break"></td>
+  <td class="talk-table talk-break"></td>
+</tr>
+<tr>
+  <td class="talk-table">13:45&nbsp;</td>
+  <td class="talk-table talk-break"></td>
+  <td class="talk-table talk-break"></td>
+</tr>
+<tr>
+  <td class="talk-table">14:00&nbsp;</td>
+  <td class="talk-table"><div class="talk-title">The State of InfiniteOpt.jl</div><div class="talk-speaker">Joshua Pulsipher</div></td>
+  <td class="talk-table"><div class="talk-title">CuClarabel: GPU Acceleration for a Conic Optimization Solver</div><div class="talk-speaker">Yuwen Chen</div></td>
+</tr>
+<tr>
+  <td class="talk-table">14:15&nbsp;</td>
+  <td class="talk-table"></td>
+  <td class="talk-table"></td>
+</tr>
+<tr>
+  <td class="talk-table">14:30&nbsp;</td>
+  <td class="talk-table"><div class="talk-title">Large Scale JuMP Models with Constraint Generators</div><div class="talk-speaker">Benoît Legat</div></td>
+  <td class="talk-table"><div class="talk-title">Open energy models: benchmarking, profiling and debugging tool for JuMP</div><div class="talk-speaker">Joaquim Dias Garcia</div></td>
+</tr>
+<tr>
+  <td class="talk-table">14:45&nbsp;</td>
+  <td class="talk-table"></td>
+  <td class="talk-table"></td>
+</tr>
+<tr>
+  <td class="talk-table">15:00&nbsp;</td>
+  <td class="talk-table talk-break"><div class="talk-title">Break</div></td>
+  <td class="talk-table talk-break"><div class="talk-title">Break</div></td>
+</tr>
+<tr>
+  <td class="talk-table">15:15&nbsp;</td>
+  <td class="talk-table talk-break"></td>
+  <td class="talk-table talk-break"></td>
+</tr>
+<tr>
+  <td class="talk-table">15:30&nbsp;</td>
+  <td class="talk-table"><div class="talk-title">Automatic Generation of JuMP.jl Constraints from ModelingToolkit.jl Models</div><div class="talk-speaker">Dimitri Alston</div></td>
+  <td class="talk-table"><div class="talk-title">The life and times of SDDP.jl</div><div class="talk-speaker">Oscar Dowson</div></td>
+</tr>
+<tr>
+  <td class="talk-table">15:45&nbsp;</td>
+  <td class="talk-table"></td>
+  <td class="talk-table"></td>
+</tr>
+<tr>
+  <td class="talk-table">16:00&nbsp;</td>
+  <td class="talk-table"><div class="talk-title">AdaptiveProjection.jl: Automating the Speed-Accuracy Trade-off in Random Projection Methods</div><div class="talk-speaker">Jean-François Baffier</div></td>
+  <td class="talk-table talk-organization"><div class="talk-title">Wrap up and thanks</div></td>
+</tr>
+<tr>
+  <td class="talk-table">16:15&nbsp;</td>
+  <td class="talk-table"><div class="talk-title">ApplicationDrivenLearning.jl a framework to train forecast models with application-driven cost functions</div><div class="talk-speaker">Joaquim Dias Garcia</div></td>
+  <td class="talk-table talk-organization"></td>
+</tr>
+<tr>
+  <td class="talk-table">16:30&nbsp;</td>
+  <td class="talk-table talk-organization"><div class="talk-title">Wrap up</div></td>
+  <td class="talk-table talk-organization"></td>
+</tr>
+</table>&nbsp;
diff --git a/_posts/2024-09-26-jump_dev_2025.md b/_posts/2024-09-26-jump_dev_2025.md
index 648854a..e1a1ee7 100644
--- a/_posts/2024-09-26-jump_dev_2025.md
+++ b/_posts/2024-09-26-jump_dev_2025.md
@@ -34,12 +34,10 @@ excursion. The schedule is subject to change at any time.
  * Wednesday 19 November: self-guided excursion
  * Thursday 20 November: hackathon (venue to be confirmed)
 
-## Key dates
+A preliminary schedule is as follows. Some accepted talks are not yet scheduled
+because of uncertainty around the speaker's travel.
 
- * October 2024: [talk submissions open](https://forms.gle/SzbqwzfsRNW97PZt5)
- * March 31 2025: talk submissions close
- * April 30 2025: talk acceptance notifications
- * November 17--20 2025: JuMP-dev 2025
+{%include jump-dev-2025-schedule.html %}
 
 ## How do I attend?
 
diff --git a/assets/jump-dev-workshops/2025/schedule.toml b/assets/jump-dev-workshops/2025/schedule.toml
new file mode 100644
index 0000000..38ec050
--- /dev/null
+++ b/assets/jump-dev-workshops/2025/schedule.toml
@@ -0,0 +1,190 @@
+
+days = ["Monday 17", "Tuesday 18"]
+
+[talks]
+
+[talks.1_09_30]
+title = "Introduction and welcome"
+type = "organization"
+
+[talks.1_09_45]
+speaker = "Miles Lubin"
+title = "The state of JuMP"
+
+[talks.1_10_00]
+
+[talks.1_10_15]
+speaker = "James Foster"
+title = "JuMP on demand: Creating your own compute cluster for solving optimisation problems"
+
+[talks.1_10_30]
+title = "Morning tea"
+type = "break"
+
+[talks.1_10_45]
+type = "break"
+
+[talks.1_11_00]
+# speaker = "Oscar Dowson"
+title = "Optimizing over trained neural networks with MathOptAI.jl"
+
+[talks.1_11_15]
+
+[talks.1_11_30]
+speaker = "Jean-François Baffier"
+title = "Bridging the Gap Between Models and Solvers through Constraint Programming"
+
+[talks.1_11_45]
+
+[talks.1_12_00]
+title = "Lunch"
+type = "break"
+
+[talks.1_12_15]
+type = "break"
+
+[talks.1_12_30]
+type = "break"
+
+[talks.1_12_45]
+type = "break"
+
+[talks.1_13_00]
+type = "break"
+
+[talks.1_13_15]
+type = "break"
+
+[talks.1_13_30]
+type = "break"
+
+[talks.1_13_45]
+type = "break"
+
+[talks.1_14_00]
+speaker = "Joshua Pulsipher"
+title = "The State of InfiniteOpt.jl"
+
+[talks.1_14_15]
+
+[talks.1_14_30]
+speaker = "Benoît Legat"
+title = "Large Scale JuMP Models with Constraint Generators"
+
+[talks.1_14_45]
+
+[talks.1_15_00]
+title = "Break"
+type = "break"
+
+[talks.1_15_15]
+type = "break"
+
+[talks.1_15_30]
+speaker = "Dimitri Alston"
+title = "Automatic Generation of JuMP.jl Constraints from ModelingToolkit.jl Models"
+
+[talks.1_15_45]
+
+[talks.1_16_00]
+speaker = "Jean-François Baffier"
+title = "AdaptiveProjection.jl: Automating the Speed-Accuracy Trade-off in Random Projection Methods"
+
+[talks.1_16_15]
+speaker = "Joaquim Dias Garcia"
+title = "ApplicationDrivenLearning.jl a framework to train forecast models with application-driven cost functions"
+
+[talks.1_16_30]
+title = "Wrap up"
+type = "organization"
+
+[talks.2_09_30]
+speaker = "Julian Hall"
+title = "What's new in HiGHS, and thanks to JuMP for its support!"
+
+[talks.2_09_45]
+
+[talks.2_10_00]
+speaker = "Thibaut Cuvelier"
+title = "Unlocking the Power of Google OR-Tools with MathOptInterface.jl"
+
+[talks.2_10_15]
+
+[talks.2_10_30]
+title = "Morning tea"
+type = "break"
+
+[talks.2_10_45]
+type = "break"
+
+[talks.2_11_00]
+speaker = "Michael Saunders"
+title = "GPU Implementation of Algorithm NCL"
+
+[talks.2_11_15]
+
+[talks.2_11_30]
+speaker = "Alexis Montoison"
+title = "Revisiting sparse matrix coloring and bicoloring"
+
+[talks.2_11_45]
+
+[talks.2_12_00]
+title = "Lunch"
+type = "break"
+
+[talks.2_12_15]
+type = "break"
+
+[talks.2_12_30]
+type = "break"
+
+[talks.2_12_45]
+type = "break"
+
+[talks.2_13_00]
+type = "break"
+
+[talks.2_13_15]
+type = "break"
+
+[talks.2_13_30]
+type = "break"
+
+[talks.2_13_45]
+type = "break"
+
+[talks.2_14_00]
+speaker = "Yuwen Chen"
+title = "CuClarabel: GPU Acceleration for a Conic Optimization Solver"
+
+[talks.2_14_15]
+
+[talks.2_14_30]
+speaker = "Joaquim Dias Garcia"
+title = "Open energy models: benchmarking, profiling and debugging tool for JuMP"
+
+[talks.2_14_45]
+
+[talks.2_15_00]
+title = "Break"
+type = "break"
+
+[talks.2_15_15]
+type = "break"
+
+[talks.2_15_30]
+speaker = "Oscar Dowson"
+title = "The life and times of SDDP.jl"
+
+[talks.2_15_45]
+
+[talks.2_16_00]
+title = "Wrap up and thanks"
+type = "organization"
+
+[talks.2_16_15]
+type = "organization"
+
+[talks.2_16_30]
+type = "organization"