Odoo addon publisher (App Store-ready, verified)
Build an Odoo addon that is ready to sell on apps.odoo.com, and prove it
follows the vendor guidelines with a validator that runs — not just advice.
Core principle
Compliance is measured, not claimed. The loop is: scaffold a compliant module
(or point at an existing one) → run the validator → fix the ERRORs → re-validate
until the gate is green → then work the manual pre-submission checklist.
Honest scope (the rule that keeps this correct): the validator checks the
automatable guideline rules (manifest, structure, listing assets, licence/price
coherence). It does not guarantee App Store approval — Odoo's manual review
(English quality, screenshots that truly show the product, "not a clone of
Enterprise", accurate claims, support) is the final authority. Never report
"App Store ready" on a green validator alone. → references/01-publishing-guidelines.md
When to use vs. not
- Use for: building/packaging/publishing an Odoo module for 18.0 or 19.0; writing
or fixing
__manifest__.py; preparing the App Store listing (icon, cover,
screenshots, index.html, company info); checking Odoo Apps compliance.
- Not for: writing the module's business logic itself (that's normal Odoo dev),
or non-Odoo packaging.
Inputs to gather first
- Target series — Odoo 18.0 or 19.0 (sets the
version prefix + API).
- Module — technical name (snake_case), display name (≤ 25 chars),
summary, category, dependencies.
- Commercial — free (
LGPL-3) or paid (OPL-1, price ≥ 9, currency,
support email). Paid apps may not use (A)GPL.
- Vendor/company — author, company, website, support email, optional
live_test_url; tagline, features and screenshots for the listing.
Workflow
Load each reference when you reach its step.
- Know the rules. Skim the distilled vendor guidelines + the honest-scope
note. →
references/01-publishing-guidelines.md
- Get the manifest right. Keys, version strings per series, licence/price.
→
references/02-manifest-reference.md
- Lay out the module per Odoo's conventions. →
references/03-module-structure.md
- Build the listing kit — icon, cover,
*_screenshot, English index.html,
company info. → references/04-listing-assets.md
- Scaffold + validate in a loop until 0 errors. →
references/05-running-the-tooling.mdcp scripts/addon.config.example.json addon.config.json # edit module + vendor + listing
python3 scripts/scaffold_addon.py --config addon.config.json --out ./addons
python3 scripts/validate_addon.py --addon ./addons/<tech_name> --odoo-version 18.0 --config addon.config.json
- Finish the manual pre-submission checklist, then zip & upload. →
references/06-pre-submission-checklist.md
What's in this skill
scripts/scaffold_addon.py — generates a self-validating, guideline-compliant module + listing kit (valid placeholder icon 140×140, cover 560×280, screenshot, index.html with company info).
scripts/validate_addon.py — the gate: manifest + structure + listing checks against the vendor guidelines; writes report.json/report.md, exits non-zero on any error.
scripts/lib/manifest.py, scripts/lib/imaging.py — safe manifest parsing + stdlib PNG read/write.
scripts/templates/ — __manifest__.py and index.html templates.
scripts/addon.config.example.json — module + vendor/company + listing config.
references/01–06 — guidelines, manifest reference, structure, listing assets, running the tooling, and the manual pre-submission checklist.
Definition of done
Guardrails — avoid these mistakes
- Don't claim "App Store ready" from a green validator — say "0 validator
errors; manual checklist complete." Odoo's review is final.
name ≤ 25 chars, explicit, no adjectives or company name.
- Paid ⇒ OPL-1. You may not charge a price under (A)GPL; minimum price is 9.
version must match the target series (18.0.x.y.z / 19.0.x.y.z).
- No JavaScript /
<script> in index.html, English only, no links to other
app stores; host all images locally under static/description.
- A missing/non-existent
depends or a broken manifest can unpublish your whole
repository — validate before every upload.
- Don't clone Enterprise modules; disclose external services and data collection.
1---2name: odoo-addon-publisher3description: Produce sale-ready Odoo addons/modules that follow the Odoo Apps Store vendor guidelines for Odoo 18.0 and 19.0, gated by a validator that runs. Scaffolds a guideline-compliant module (manifest, company/vendor info, OPL-1 licensing, static/description/index.html, icon, cover image and screenshots) and verifies any addon against the rules. Use when the user wants to build, package, publish or submit an Odoo app/module/addon, fix a __manifest__.py, prepare an App Store listing, add a cover image/icon/screenshots, or check Odoo Apps compliance. Triggers: "Odoo module/addon/app", "publish to Odoo Apps", "__manifest__.py", "OPL-1", "Odoo App Store", "Odoo 18 / 19 module".4license: MIT5---67# Odoo addon publisher (App Store-ready, verified)89Build an Odoo addon that is ready to **sell on apps.odoo.com**, and prove it10follows the vendor guidelines with a validator that runs — not just advice.1112## Core principle1314**Compliance is measured, not claimed.** The loop is: scaffold a compliant module15(or point at an existing one) → run the validator → fix the `ERROR`s → re-validate16until the gate is green → then work the manual pre-submission checklist.1718**Honest scope (the rule that keeps this correct):** the validator checks the19*automatable* guideline rules (manifest, structure, listing assets, licence/price20coherence). It does **not** guarantee App Store approval — Odoo's manual review21(English quality, screenshots that truly show the product, "not a clone of22Enterprise", accurate claims, support) is the final authority. Never report23"App Store ready" on a green validator alone. → `references/01-publishing-guidelines.md`2425## When to use vs. not2627- Use for: building/packaging/publishing an Odoo module for 18.0 or 19.0; writing28 or fixing `__manifest__.py`; preparing the App Store listing (icon, cover,29 screenshots, `index.html`, company info); checking Odoo Apps compliance.30- Not for: writing the module's business logic itself (that's normal Odoo dev),31 or non-Odoo packaging.3233## Inputs to gather first34351. **Target series** — Odoo **18.0** or **19.0** (sets the `version` prefix + API).362. **Module** — technical name (snake_case), display name (**≤ 25 chars**),37 summary, category, dependencies.383. **Commercial** — free (`LGPL-3`) or paid (**`OPL-1`**, `price ≥ 9`, `currency`,39 `support` email). Paid apps may **not** use (A)GPL.404. **Vendor/company** — author, company, website, support email, optional41 `live_test_url`; tagline, features and screenshots for the listing.4243## Workflow4445Load each reference when you reach its step.46471. **Know the rules.** Skim the distilled vendor guidelines + the honest-scope48 note. → `references/01-publishing-guidelines.md`492. **Get the manifest right.** Keys, version strings per series, licence/price.50 → `references/02-manifest-reference.md`513. **Lay out the module** per Odoo's conventions. → `references/03-module-structure.md`524. **Build the listing kit** — icon, cover, `*_screenshot`, English `index.html`,53 company info. → `references/04-listing-assets.md`545. **Scaffold + validate in a loop** until 0 errors. → `references/05-running-the-tooling.md`55 ```bash56 cp scripts/addon.config.example.json addon.config.json # edit module + vendor + listing57 python3 scripts/scaffold_addon.py --config addon.config.json --out ./addons58 python3 scripts/validate_addon.py --addon ./addons/<tech_name> --odoo-version 18.0 --config addon.config.json59 ```606. **Finish the manual pre-submission checklist**, then zip & upload. → `references/06-pre-submission-checklist.md`6162## What's in this skill6364- `scripts/scaffold_addon.py` — generates a self-validating, guideline-compliant module + listing kit (valid placeholder icon 140×140, cover 560×280, screenshot, `index.html` with company info).65- `scripts/validate_addon.py` — the gate: manifest + structure + listing checks against the vendor guidelines; writes `report.json`/`report.md`, exits non-zero on any error.66- `scripts/lib/manifest.py`, `scripts/lib/imaging.py` — safe manifest parsing + stdlib PNG read/write.67- `scripts/templates/` — `__manifest__.py` and `index.html` templates.68- `scripts/addon.config.example.json` — module + vendor/company + listing config.69- `references/01–06` — guidelines, manifest reference, structure, listing assets, running the tooling, and the manual pre-submission checklist.7071## Definition of done7273- [ ] `validate_addon.py` reports **0 errors** for the target series; warnings reviewed.74- [ ] Manifest: `name` ≤ 25 chars, `version` matches the series, `depends` complete with `base`.75- [ ] Paid ⇒ `OPL-1`, `price ≥ 9`, `currency` EUR/USD, `support` email present.76- [ ] `static/description/icon.png` (PNG) + `index.html` (English, no JS) + cover + a `*_screenshot` image, all present and local.77- [ ] Company/vendor info in the manifest **and** the index.html "About" section.78- [ ] Manual pre-submission checklist (`06`) complete; packaged as the module folder.7980## Guardrails — avoid these mistakes8182- **Don't claim "App Store ready" from a green validator** — say "0 validator83 errors; manual checklist complete." Odoo's review is final.84- **`name` ≤ 25 chars**, explicit, no adjectives or company name.85- **Paid ⇒ OPL-1.** You may not charge a price under (A)GPL; minimum price is 9.86- **`version` must match the target series** (`18.0.x.y.z` / `19.0.x.y.z`).87- **No JavaScript / `<script>` in `index.html`**, English only, no links to other88 app stores; host all images locally under `static/description`.89- **A missing/non-existent `depends` or a broken manifest can unpublish your whole90 repository** — validate before every upload.91- **Don't clone Enterprise modules**; disclose external services and data collection.