Skip to Content

Bringing My Personal Odoo Modules to Odoo 20

My personal Odoo projects are gradually catching up with the new release.
2 October 2026 by
All Things Toasty Software Ltd, Austin Welsh-Graham

Odoo 20 is here, and while I’m not quite ready to move everything I run over to it, I have now started bringing some of my own modules across.

Over the past few days I’ve updated three of my personal Odoo projects for Odoo 20: Sudoku, BreadBoard Counter, and Nine Men’s Morris.

These are all projects that I maintain separately from the modules I develop for Toasty Software, so they gave me a useful opportunity to work through the changes in Odoo 20 without having to immediately migrate everything else along with them.

A new Odoo version means more than changing a version number

When a new Odoo release arrives, there is always a temptation to think that moving a module to the new version will mostly involve changing the version number in __manifest__.py and fixing whatever breaks afterwards.

Sometimes that is almost true.

For these modules, however, the interesting parts of the migration were in the frontend.

All three projects make use of Odoo's OWL framework, with JavaScript components managing interactive parts of the applications. That means changes to the frontend framework can have a much bigger impact than a simple change to the Python side of the module.

This made these projects particularly useful for getting some practical experience with what has changed between Odoo 19 and Odoo 20.

Sudoku

The first module I brought across was my Sudoku module.

Sudoku is probably the most self-contained of the three. The actual puzzle generation is handled in Python, while the game itself is rendered using OWL on the Odoo website.

The game includes multiple difficulty levels, hints, board skipping and an option to automatically solve a puzzle. The game state itself is handled on the client, meaning that playing a game does not require creating a collection of database records just to keep track of the current board.

For the Odoo 20 version, I went through the frontend code and adapted it to the changes required by the new Odoo/OWL environment.

The result is now available in the 20.0 branch alongside the existing Odoo version.

Sudoku on GitHub - Odoo 20 branch

BreadBoard Counter

The BreadBoard Counter was another relatively small migration.

This is one of my simpler OWL projects: essentially an interactive counter application built as an Odoo module. Despite its simplicity, it is useful as a small example of an OWL application running inside Odoo.

The migration therefore gave me a nice opportunity to deal with the Odoo 20 frontend changes without also having to deal with a large amount of game logic or backend functionality.

The Odoo 20 version is now available in its own 20.0 branch.

BreadBoard Counter on GitHub - Odoo 20 branch

And then there was Nine Men's Morris

The third migration was Nine Men's Morris, and this one was considerably more involved.

Nine Men's Morris is one of my larger Odoo game projects. It has the actual game logic, an interactive OWL interface, AI functionality and integration with the separate Nine Men's Morris API that I built for the project.

That means there was considerably more frontend code to work through than there was in BreadBoard Counter.

It also made the migration a much better test of whether I had actually understood the changes involved, rather than simply fixing one or two obvious compatibility problems.

Nine Men's Morris on GitHub - Odoo 20 branch

Getting to work with OWL again

One of the things I particularly like about these projects is that they are small enough for me to experiment with the Odoo frontend without the complexity of a much larger application.

The three modules all make use of useState and OWL components, so working through their migrations has given me a much better practical understanding of how the frontend changes affect existing applications.

This is also relevant to some of the larger Odoo projects I maintain.

The work I've done here isn't just about getting three games and utilities running on Odoo 20. It gives me a chance to understand the changes before I eventually have to deal with them in more complicated modules.

I'm still not moving everything to Odoo 20

Interestingly, despite now having several modules working on Odoo 20, I am not moving my main websites to Odoo 20 just yet.

Both my personal site and Toasty Software's site are still running on Odoo 19.

There are a few reasons for that, but the biggest is that I have other modules to consider. Some of the modules I use have their own compatibility requirements, and I don't want to move an entire production environment to Odoo 20 before the wider collection of modules I depend on is ready.

Having my smaller personal projects working on Odoo 20 means I can take my time with that larger migration.

Rather than discovering every Odoo 20 change at once when I eventually migrate the websites, I can work through those changes gradually across projects like these.

Keeping the branches separate

I'm also continuing with separate Odoo-version branches for these projects.

The existing Odoo 19 code remains available, while the Odoo 20 work lives in the 20.0 branch.

This means that someone running Odoo 19 does not suddenly have to deal with Odoo 20-specific changes, while the newer version can continue to evolve independently.

It also gives me a useful reference point when I eventually start looking at future Odoo releases.

Building an Odoo DevOps Bridge
Why are my project tasks and my development work living in completely different places?