Ad – 728×90
⚙️ Module Development

Odoo __manifest__.py – The Module Manifest

The __manifest__.py file is the identity card and configuration file for every Odoo module. It tells Odoo the module's name, version, dependencies, which files to load, which assets to register, and much more. This page covers every manifest key — required and optional — with examples and explanations of when to use each one.

⏱️ 20 min 🎯 Beginner 📅 Updated 2026

A Complete Manifest Example

Here is a real, fully-annotated __manifest__.py covering every commonly-used key:

Python
{
    # ── Required keys ──────────────────────────────────────────────────────────
    'name': 'Library Management',          # Human-readable display name
    'version': '19.0.1.0.0',              # Format: odoo_version.major.minor.patch

    # ── Metadata ───────────────────────────────────────────────────────────────
    'summary': 'Manage your library books, members, and borrowings',
    'description': """
        Library Management System
        =========================
        Track books, members, borrowings, and returns.
        Includes portal access for members to view their history.
    """,
    'author': 'Algorid Limited',
    'website': 'https://algorid.com',
    'category': 'Services/Library',       # Apps menu category
    'license': 'LGPL-3',                  # or OPL-1 for proprietary

    # ── Dependencies ───────────────────────────────────────────────────────────
    'depends': [
        'base',          # always required (implicitly, but explicit is better)
        'mail',          # for chatter / messaging
        'portal',        # for customer portal access
    ],

    # ── Files to load ──────────────────────────────────────────────────────────
    'data': [
        'security/ir.model.access.csv',
        'security/record_rules.xml',
        'views/book_views.xml',
        'views/member_views.xml',
        'views/menus.xml',
        'data/book_sequence.xml',
        'report/book_report.xml',
    ],
    'demo': [
        'demo/demo_books.xml',
        'demo/demo_members.xml',
    ],

    # ── Web assets ─────────────────────────────────────────────────────────────
    'assets': {
        'web.assets_backend': [
            'library_management/static/src/scss/library.scss',
            'library_management/static/src/js/book_widget.js',
            'library_management/static/src/xml/book_widget.xml',
        ],
        'web.assets_frontend': [
            'library_management/static/src/scss/portal.scss',
        ],
    },

    # ── App behaviour ──────────────────────────────────────────────────────────
    'application': True,          # Shows as a top-level app in Apps menu
    'installable': True,          # Can be installed (default True)
    'auto_install': False,        # Don't auto-install when all depends installed
}

Required Keys

  • name (string) — the display name shown in the Apps menu. Keep it short and clear.
  • version (string) — must follow the odoo_version.major.minor.patch format. The first number must match the Odoo major version (19 for Odoo 19). Increment the patch for bug fixes, minor for new features, major for breaking changes.
Ad – 336×280

Dependencies

The depends key is a list of module technical names this module requires. Odoo loads dependencies first. If a dependency isn't installed, this module can't be installed either.

Always depend on base (the foundation). If you use the chatter, depend on mail. If you extend sale orders, depend on sale.

DependGives you
baseCore models (res.partner, res.users, etc.)
mailChatter, messaging, mail templates
portalPortal routes, portal user group
saleSale orders, sale teams
purchasePurchase orders
stockInventory, warehouses, stock moves
accountAccounting, invoices, journals
websitePublic website, snippets, eCommerce
point_of_salePOS models and UI

Data and Demo Keys

  • data list — loaded on every install and upgrade, in order. Security CSV must come before views (the model must exist before access rules can reference it), views before menus, menus before actions.
  • demo list — loaded only when demo data is enabled at database creation.
  • File paths are relative to the module root.
⚠️
Load order matters

Odoo processes data files top-to-bottom. A file that references (via ref=) a record from a later file will raise "External ID not found". Always list security first, then views, then actions, then menus.

Assets Key (Odoo 14+)

The assets dict registers static files into asset bundles. Files added to a bundle are compiled and served together by Odoo's asset pipeline.

BundleWhen loaded
web.assets_backendBackend (logged-in Odoo interface)
web.assets_frontendFrontend (public website, portal)
web.assets_commonBoth backend and frontend
point_of_sale.assetsPOS UI
web.report_assets_commonQWeb PDF reports

Metadata Keys

  • summary — one-line description shown under the module name in the Apps list
  • description — long description (RST format supported); shown in the module info page
  • author — your name or company name
  • website — your website URL
  • category — path like 'Services/Library' or 'Technical' — controls Apps menu grouping
  • license'LGPL-3' for open-source Community modules; 'OPL-1' for proprietary/Enterprise modules

App Behaviour Keys

  • application: True — module appears as a top-level app tile (with an icon) in the Apps menu. Set to True only for modules that are the "main app" of a feature area.
  • installable: True — module appears in the Apps list and can be installed. Set to False to hide a module (e.g. a base library module not meant to be installed directly).
  • auto_install: False — if True, Odoo automatically installs this module when ALL of its dependencies are installed. Used for "glue modules" that add integration between two other modules (e.g. sale_stock, which adds stock features when both sale and stock are installed).
ℹ️
Glue modules

A glue module has auto_install: True and two or more dependencies. It is automatically installed when all its dependencies are present. The Odoo core uses this pattern extensively — for example, sale_stock bridges sale and stock with delivery-related fields on sale orders.

Version Numbering

The version format odoo_version.major.minor.patch (e.g. 19.0.1.0.0) is a community convention — not enforced by Odoo — but followed universally:

  • 19 — must match the Odoo major version
  • 1 — major version of your module (increment for breaking changes)
  • 0 — minor version (increment for new features)
  • 0 — patch (increment for bug fixes)
PartWhen to increment
Major (19)Never during normal development — changes when you port to a new Odoo version
2nd (1)Module has breaking changes — data migration needed
3rd (0)New features added, backward compatible
4th (0)Bug fixes only

📋 Key Points

  • name and version are the only truly required keys — Odoo will load a module without others, but best practice is to include all metadata keys.
  • The depends list determines load order — missing dependencies prevent installation entirely.
  • data files load on every install and upgrade; demo files load only with demo data. Load order within data matters — security first, then views, then actions, then menus.
  • The assets dict registers JS/SCSS/XML into bundles — use web.assets_backend for backend, web.assets_frontend for portal/website.
  • application: True adds a top-level app tile; auto_install: True creates a glue module that installs automatically when all its dependencies are present.

FAQ

What happens if I add a new file to data in an upgraded module? +

Odoo will load the new file and create the records it defines. Existing records defined in existing files will also be reloaded and updated, unless wrapped in noupdate="1".

What is the difference between application: True and installable: True? +

installable: True makes the module appear in the Apps list at all. application: True additionally gives it a main menu entry and an icon tile — it becomes a "top-level app". A module can be installable without being an application — most integration or extension modules are installable but not applications.

Can I depend on a module that isn't installed? +

No. If a module in your depends list is not installed, your module cannot be installed either. Odoo checks all dependencies are available before allowing installation.

What is a glue module? +

A module with auto_install: True and two or more dependencies — it automatically installs when all its dependencies are present. For example, sale_stock is a glue module: it adds stock-related features to sale orders, but only makes sense when both sale and stock are installed.