← ClaudeAtlas

odoo-owllisted

Building or extending the Odoo 17/18/19 web client — OWL 2 components, custom field widgets (widget="..."), view widgets, client actions, systray items, patching core web components, ORM/notification/dialog/action services, and the assets bundles that load them. Use whenever writing JavaScript/XML under static/src, wiring a widget into a view, or debugging "my component renders nothing / props are undefined / the template isn't found / the client action is clipped or cannot scroll". OWL is where LLM memory is most stale (v16→v17→v18 renamed half the field API) — do NOT write a hook, service, registry category, or field-prop name from memory. Read the real addon source first, then write.
tuanle96/odoo-ai-skills · ★ 4 · AI & Automation · score 62
Install: claude install-skill tuanle96/odoo-ai-skills
# Odoo web frontend (OWL 2) Odoo 17/18/19's web client is **OWL 2** (Odoo's own React-like framework) — not jQuery, not the legacy `web.widget`. The frontend has the same failure mode as the backend: the APIs you "remember" are wrong because they were renamed across versions, and the wiring (which view uses your widget, which bundle loads your file) lives in **this** instance, not in your head. **The rule: read the canonical source for the thing you're extending, then write the smallest component.** Odoo ships the reference implementation of every field widget under `web/static/src/views/fields/`. Read one before you write one. **Version floor: Odoo 17/18, through Odoo 19 (current LTS).** Snippets are verified against 18.0; v19 keeps the OWL 2 model and the v17 field-value API. The renames AI gets wrong are tabled next — but Odoo keeps refining OWL internals between majors, so **read the canonical widget source in the target version**, don't trust a snippet verbatim. Older targets → `skills/odoo-introspect/references/version-matrix.md`. ## The version churn AI gets wrong (v16 → v19) Most training data is v15–v16, so these renames are the silent-failure zone: the old form often still parses and just does nothing. Emit the current form and confirm against the target instance. | Concern | Old (≤ prior) | Current (v17/18/19) | Since | |---|---|---|---| | Field value — **read** | `props.value` | `props.record.data[props.name]` | **17.0** | | Field value — **write** | `props.