MANIFEST File
The MANIFEST file lives at the project root and controls which Odoo modules are installed and which addon paths are active. It is a Python dict literal (not JSON — comments and trailing commas are allowed).
Example
{
"version": 17.0,
# Modules loaded server-wide (available without database)
"server-wide-modules": ["web"],
# Python version for the Odoo container
"python_version": "3.12",
# Modules to install
"install": [
"sale",
"purchase",
"account",
"stock",
"my_custom_module",
],
# Modules to uninstall (if present)
"uninstall": [
"web_tree_many2one_clickable",
],
# Modules from "uninstall" whose code is gone and that may be
# uninstalled anyway - their tables are dropped
"uninstall_without_source": [
"partner_simple_default_avatar",
],
# Modules to uninstall only in DEVMODE
"devmode_uninstall": [
"password_security",
],
# Extra SQL files run after a DEVMODE restore (relative to the project
# root). A module's data/neutralize.sql is run by Odoo itself.
"neutralize": [
"devscripts/neutralize_interfaces.sql",
],
# Modules to run tests for
"tests": ["my_custom_module"],
# Robot suites for `odoo robot run-all` (glob patterns, project root)
"robotests": ["addons/*/tests/robot/*.robot"],
# Run these update steps before the main update
"before-odoo-update": [
["update", "base"],
],
# Where Odoo looks for modules
"addons_paths": [
"odoo/odoo/addons",
"odoo/addons",
"enterprise", # Odoo Enterprise (if available)
"addons_tools", # zodoo helper modules
# "addons_OCA/sale-workflow",
# "addons_OCA/account-invoicing",
],
}
Fields
| Field | Description |
|---|---|
version | Odoo version as float: 17.0, 16.0, etc. |
server-wide-modules | Loaded without a database. Always include "web". |
python_version | Python version for the Odoo Docker image. |
install | Modules to install/keep installed. |
uninstall | Modules to force-uninstall. Their missing dependencies are ignored when resolving requirements. |
devmode_uninstall | Modules to uninstall when DEVMODE=1. |
uninstall_without_source | Modules from uninstall (or devmode_uninstall) whose code is no longer in any addons path and that may be uninstalled anyway. Without this entry odoo update lists the models that would be dropped and asks you to type the module name; non-interactive runs abort before any service is stopped. |
tests | Modules to run tests for (used by odoo module run-tests). |
robotests | Glob patterns (relative to the project root) selecting the robot suites odoo robot run-all runs and odoo robot list / odoo module list-robot-test-files (zCICD) report. Without it, every *.robot file of the project is used. |
neutralize | Extra SQL files (relative to the project root) that DEVMODE=1 runs after a restore, after Odoo's and zodoo's neutralization. Modules that talk to external systems should rather ship a data/neutralize.sql - Odoo runs it on odoo-bin neutralize, the database manager and every zodoo restore. From Odoo 16 on, entries pointing to a module's data/neutralize.sql are skipped, because Odoo already ran them. |
before-odoo-update | Module update steps to run before main update. |
addons_paths | Directories where Odoo searches for modules. Order matters. |
odoo_dir | Where the Odoo source is cloned (default: odoo). |
upgrade_path | Path to upgrade-utils for OpenUpgrade migrations. |
Running Odoo from a non-standard directory
By default the Odoo source is cloned into odoo/ inside the project. Set
odoo_dir to use a different folder — useful when you keep several Odoo
versions side by side in one project, or when a custom Docker setup expects
the source somewhere else:
{
"odoo_dir": "odoo2"
}
zodoo resolves the server directory from this value at runtime; there is no
separate setting for it. Remember to keep addons_paths in step, since the
<odoo_dir>/odoo/addons and <odoo_dir>/addons paths are derived from it.
OCA addons
OCA modules are managed via gimera. Add the desired OCA repo to addons_paths (uncomment in template), then run:
gimera apply
odoo reload