an abundance of strawberries

Odoo module upgrades, done for you

Your custom JS widgets broke — Owl web client migration

Legacy odoo.define widgets and old Owl components are the hardest part of many upgrades. A few hundred lines of JavaScript can outweigh thousands of lines of Python — and it's what blocks install on 16, 17, or 18.

What the port involves

Legacy AMD-style modules:

odoo.define('my_module.CustomWidget', function (require) {
    "use strict";
    var Widget = require('web.Widget');
    // ...
});

become ES modules built on Owl components:

/** @odoo-module **/
import { Component } from "@odoo/owl";
import { registry } from "@web/core/registry";

export class CustomWidget extends Component { /* ... */ }

It's rarely a mechanical rename: widget lifecycles, RPC calls, field-widget registration, and template rendering all changed between the legacy client and Owl 2. This is exactly why JS-heavy modules are our $250 tier — and why we test the UI in a browser, not just the install.

Send us the module. We port the JS/Owl layer to the target web client, install, and test until the UI actually works. Try it live, then $50 to download.

Try the working result before you pay a cent. No signup to get started.

Common questions

Why is JavaScript the hardest part of Odoo upgrades?

The web client rewrote around Owl across 15→18. Old widget patterns, RPC calls, and component lifecycles all changed. Static analysis flags JS-heavy modules as complex for a reason.