Odoo 20 is finally here.
As someone who spends a rather unreasonable amount of time building just about anything on top of Odoo, a new major release is always something I look forward to. There is something particularly satisfying about pulling a fresh Odoo branch, looking through the changes, and wondering just how many things I've managed to accidentally depend on that are about to change.
And Odoo 20 looks particularly interesting for this.
Odoo officially released version 20 yesterday and I've had my chances to play around with it. It brings a fresh visual direction alongside a good set of changes across the platform, but for me, the interesting part is what's changed underneath the surface.
The release looks fantastic
One of the first things that stood out with Odoo 20 is all the style changes. Odoo has gradually been improving in that sense over the last few releases, and I feel that this is another of those steps. The new designs give the platform a noticeably different character, really embracing the fun side of Odoo. This has also led me to think about some of my own Odoo applications and what they should look like when I do eventually make the jump.
That doesn't mean I'm going to be immediately throwing everything onto Odoo 20.
My sites are staying on Odoo 19 for now
Both this website, Austin ATTS, as well as my business website, Toasty Software, will remain on Odoo 19 for the time being.
The main reason is that Odoo 20 is not simply an install and go upgrade for the sort of environment I run.
I use a mixture of Odoo's own modules, my own custom modules, and a few external modules. All of those will need to be updated and tested for Odoo 20 before I can confidently move a production database across. A module working on one version does not automatically mean that it will work correctly on another.
Owl 3 and useState
One of the changes that immediately caught my attention is the move to Owl 3.
Owl is the JavaScript framework underneath much of Odoo's modern web interface, and Odoo 20 brings a major change to its reactivity system. In particular, existing uses of useState are being replaced with the new proxy based approach as part of the Owl 3 migrations.
That matters to me because I use a lot of Owl in my own projects.
Some of my modules contain JavaScript components which currently rely on the patterns I have become accustomed to using in Odoo 19. Those components will need to be reviewed and potentially rewritten rather than a nice and simple copy into a 20.0 branch.
And useState is only part of the story.
Odoo 20 also contains wider changes to the backend and frontend APIs, along with removals and depreciations that need to be accounted for during a migration.
For somebody running an entirely standard Odoo installation, these changes are largely handled by the upgrade process, but for someone building extra projects on top of Odoo, it can be a hassle.
I want to finish Odoo 19 properly first
Another reason that I'm deliberately holding back is that several of my current projects are still in their active development cycle for Odoo 19. The biggest examples are The Baker's Archive and The Baking Journal.
Rather than interrupting those projects halfway through to port things to Odoo 20, I want to get them to a proper major release on Odoo 19 first.
It gives me a much cleaner starting point for when I do eventually work on the new stages.
The last thing I want is to discover that I've accidently baked a bug into a recipe and spend days determining whether the problem is the recipe or the oven.
Austin ATTS will go first
When I do start migrating, this website will be the first to make the jump.
This does not depend on the same collection of external modules as Toasty Software, and it is considerably less critical to my day to day work.
However, that does not mean it's trivial. It still contains a number of my personal modules, and both websites currently share the same server infrastructure. I therefore will still need to carefully test the Odoo 20 environment.
It'll still be some effort, but it's a much more sensible place to start. I'm committing to getting this site onto Odoo 20 before the end of 2026.
And then there's university
There is also an extra drain on my time in the form of my second year of university.
The start for my second year at Lancaster University is only a few weeks away so I don't want to pretend that I know exactly how much time I'll have available over the next few months, as I never usually do.
There is also plenty I still want to learn about Odoo and its new update before I start migrating everything, and I would rather do it properly than rush a production update on an arbitrary Tuesday.
Toasty Software is going to take longer
My business site is a different matter.
Toasty Software's Odoo installation is considerably more important than my personal site. It contains business functionality, client facing services, projects, and modules that I don't want to casually break while experimenting with a new major release.
There are also external modules involved, meaning that part of the migration schedule is outside of my control. If module maintainers need time to release their Odoo 20 versions, I will need to wait for them.
Additionally if new projects of client work arrive, they may quite reasonably take priority. So while this site has a target for the end of the year, I cannot make an equivalent promise for Toasty Software. It will move when it's ready.
If you're interested in more of the reasoning for this on the business side, you can read the blog posted over there as well.
A new version should not be a race
I think this is probably the most important part of the whole thing.
Odoo 20 is exciting. I want to use it. I want to learn Owl 3, and I'd love to experiment with the new interface. But upgrading simply because a new version exists isn't particularly useful.
Odoo 19 is still a supported release, with standard support currently planned through September 2028. That gives me plenty of breathing room to make the transition properly. Until then, the bread will continue to proof. Just because there's a new recipe doesn't mean the old loaf isn't worth finishing.