diff --git a/_includes/jump-dev-2025-schedule.html b/_includes/jump-dev-2025-schedule.html
new file mode 100644
index 0000000..67f670b
--- /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><div class="talk-speaker">TBC</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">TIMES2JuMP -  Learnings from IEA-ETSAP feasibility study of migrating the TIMES code to Julia JuMP.</div><div class="talk-speaker">James Glynn</div></td>
+</tr>
+<tr>
+  <td class="talk-table">15:45&nbsp;</td>
+  <td class="talk-table"></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">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"></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"><div class="talk-title">Wrap up and thanks</div></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 fef38c1..66addea 100644
--- a/_posts/2024-09-26-jump_dev_2025.md
+++ b/_posts/2024-09-26-jump_dev_2025.md
@@ -8,6 +8,8 @@ permalink: /meetings/jumpdev2025/
 
 <img src="/assets/jump-dev-workshops/2025/jump-dev-nz.png" alt="JuMP-dev 2025 logo" width="25%">
 
+**Ticket sales now open: [purchase a ticket](http://events.humanitix.com/jump-dev-2025)**
+
 JuMP-dev 2025 will be held November 17--20, 2025 in Auckland, New Zealand.
 
 This is the week following [CPAIOR 2025](https://sites.google.com/view/cpaior2025),
@@ -28,6 +30,13 @@ development team.
 
 All participants will uphold the [JuMP Code of Conduct](https://github.com/jump-dev/JuMP.jl/blob/master/CODE_OF_CONDUCT.md).
 
+## How do I attend?
+
+To attend JuMP-dev, you must [purchase a ticket](http://events.humanitix.com/jump-dev-2025).
+
+To request a visa invitation, please write to `jump-dev-2025@googlegroups.com`
+with the subject line `Visa invitation letter`.
+
 ## Schedule
 
 The workshop will be structured as two days of talks, a hackathon, and a local
@@ -38,40 +47,12 @@ excursion. The schedule is subject to change at any time.
  * Wednesday 19 November: [self-guided excursion](#excursion)
  * Thursday 20 November: hackathon at the [University of Auckland](#venue)
 
-## How do I attend?
-
-To attend JuMP-dev, you must purchase a ticket. Ticket sales will open soon.
-Accepted speakers at JuMP-dev will receive a free ticket.
-
-To request a visa invitation, please write to `jump-dev-2025@googlegroups.com`
-with the subject line `Visa invitation letter`.
-
-## How do I give a talk?
-
-Similarly to previous years, we invite participants to present work related
-to JuMP.
-
-**Talk submissions are now closed.
-Accepted talks will be notified by May 1st, 2025.**
-
-We especially seek talks about JuMP applications and providing feedback on the
-user-experience of using JuMP in industry and teaching.
-
-Speakers are encouraged to highlight the challenges faced and lessons learned,
-not only successes. Talks should be aimed at a general audience, but familiarity
-with JuMP/Julia can be assumed.
+### Talk schedule
 
-If you have an idea for a talk and are not sure if it will be of interest, ask
-the program committee by writing to `jump-dev-2025@googlegroups.com`.
+A preliminary schedule is as follows. Some accepted talks are not yet scheduled
+because of uncertainty around the speaker's travel.
 
-See the previous workshops for examples of accepted talks:
-[2017](/meetings/mit2017),
-[2018](/meetings/bordeaux2018),
-[2019](/meetings/santiago2019),
-[2021](/meetings/juliacon2021),
-[2022](/meetings/juliacon2022),
-[2023](/meetings/juliacon2023), and
-[2024](/meetings/jumpdev2024).
+{%include jump-dev-2025-schedule.html %}
 
 ## Venue
 
diff --git a/assets/jump-dev-workshops/2025/schedule.toml b/assets/jump-dev-workshops/2025/schedule.toml
new file mode 100644
index 0000000..8cf6e66
--- /dev/null
+++ b/assets/jump-dev-workshops/2025/schedule.toml
@@ -0,0 +1,191 @@
+
+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 = "TBC"
+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 = "James Glynn"
+title = "TIMES2JuMP -  Learnings from IEA-ETSAP feasibility study of migrating the TIMES code to Julia JuMP."
+
+[talks.2_15_45]
+speaker = "Oscar Dowson"
+title = "The life and times of SDDP.jl"
+
+[talks.2_16_00]
+
+[talks.2_16_15]
+title = "Wrap up and thanks"
+type = "organization"
+
+[talks.2_16_30]
+type = "organization"