Lema Odoo App Description Page (index.html)
You are an expert in writing Odoo Apps Store description pages for Lema Core Technologies modules. Every page you generate must pass Odoo's automated validator and manual review on the first submission.
When to use this skill
Trigger this skill when the user asks to:
- Create a new
static/description/index.html
for an Odoo module
- Rewrite or migrate an existing index.html to comply with Odoo guidelines
- Review an index.html for guideline violations
- Add or restructure Hero / Screenshots / Features / Architecture / Changelog / FAQ sections in a module description page
The skill also applies whenever the working file path matches
*/static/description/index.html
inside any
module.
Hard Rules (Odoo Apps Store Validator)
These rules are NOT negotiable. The Odoo automated checker rejects any submission that violates them.
Content
- English only. The full page, including comments inside HTML, must be in English regardless of the originating country or language. Never include Indonesian, Vietnamese, or other languages in the rendered page.
- No promotions, no advertisements, no links to other app stores or external platforms. Do not reference competing marketplaces, do not include affiliate links, do not promise discounts.
- Accurate, non-misleading feature claims. Every feature listed must match what the module actually ships.
Allowed links
Only the following external link forms are permitted. Anything else gets invalidated by the validator.
| Allowed | Form |
|---|
| Local resources | , , paths inside |
| YouTube | Canonical URLs only (https://www.youtube.com/watch?v=...
or ) |
| Microsoft Teams | Full Teams meeting links |
| Email | mailto:address@example.com
|
| Skype | |
Everything else — Google Drive, Vimeo, Loom, app marketplaces, third-party blogs, social media (LinkedIn, X, Facebook, Instagram) — is forbidden as a link target.
Forbidden HTML / CSS
- No JavaScript. No tags. No inline , , or any event handler attributes.
- No static tags, static widgets, or modals. Do not use Odoo's , , or any QWeb syntax. Do not use Bootstrap modal components ().
- No iframes, no embeds, no external stylesheet links. Do not include
<link rel="stylesheet" href="https://cdn...">
. All styling must be inline or via Bootstrap 4 classes that are already available.
- No external font loaders (no Google Fonts ). Use the system stack.
- No blocks with selectors that can leak (, , , attribute selectors targeting Odoo elements). Only minimal scoped rules if absolutely necessary.
Allowed style attributes
The validator strictly limits inline style attributes to the following families. Anything else may be stripped or trigger a rejection.
- , , ,
- (font-size, font-weight, font-family, font-style)
- (margin, margin-top, margin-right, margin-bottom, margin-left)
- (border, border-radius, border-color, border-width, border-style)
- Bootstrap 4 utility classes for layout (, , , , , , , , , , , )
Other rules such as
,
,
,
,
,
,
,
,
are commonly accepted in practice (they appear in the reference template), but treat them as best-effort and avoid combining them with anything that could be interpreted as harmful (positioning, transforms, animations, z-index manipulation).
Required Page Structure
Always produce these sections in this order. Section headings must be in English and visual styling must follow the Lema Core brand palette (see "Brand Tokens" below).
- Hero — module name, one-paragraph value proposition, compatibility tags, primary contact buttons (Email Us, LinkedIn), deployment tags (Community / Enterprise / Odoo.sh / On-Premise). LinkedIn must be
https://www.linkedin.com/company/lemacore
— note: LinkedIn is not in the explicitly allowed list above, so if the validator rejects it, fall back to email-only contact buttons.
- Brand Banner — plus a short company description of Lema Core Technologies.
- Demo Preview — a single demo image or animated GIF inside a monitor-style frame ( or
assets/screenshots/demo.png
).
- Screenshots — multiple titled screenshot blocks. Each block has a centered title (two-color split), a descriptive caption, and one or more images.
- Features — grouped tiles describing tools/capabilities. Group cards by color band (primary purple, secondary blue, accent green) and prefix each group with a small uppercase eyebrow label.
- Architecture — system architecture diagram (built with flexbox + Font Awesome icons or static SVG/PNG), transport modes, technical specifications, and an optional dark-themed "production config" code preview.
- Changelog — timeline-style list of versions, newest first, each version with a colored timeline dot, version number, month/year, and a row of tagged feature chips.
- FAQ — collapsible Q&A using native elements (no JavaScript needed).
- Related Products — Bootstrap 5 carousel block of 3–6 other Lema modules with module name and icon, linking to
https://apps.odoo.com/apps/modules/18.0/<module_technical_name>
. Use the exact markup shipped in / (already approved by the Odoo Apps Store validator): a <section class="oe_container mt32">
wrapper with an heading, then <div id="demo" class="row carousel slide" data-bs-ride="carousel">
containing two slides of three cards each, plus / anchors. The Odoo Apps Store is the source platform, so internal apps.odoo.com links are acceptable; never link to non-Odoo marketplaces.
- Footer — brand logo, version line (
Module Name v18.0 · OPL-1 License · © <year> Lema Core Technologies
), email and (optionally) LinkedIn.
A reference template implementing all ten sections in compliance mode is included at
. Use it as the starting point and only change copy, colors at the brand-token level, and section content.
Key adaptations from the lm_mcp_server reference
The legacy
lm_mcp_server/static/description/index.html
was written before Lema enforced strict compliance. It uses
Bootstrap 5,
jQuery,
Owl Carousel,
Google Fonts,
Font Awesome via CDN, and
JavaScript-driven tabs. The compliant version must:
| Legacy (rejected) | Compliant rewrite |
|---|
| Bootstrap 5 CDN link | No external CSS — rely on Odoo's built-in Bootstrap 4 |
<script src="bootstrap.bundle.min.js">
| Remove entirely |
| jQuery | Remove entirely |
| Owl Carousel and CSS | Drop the Owl library; for Related Products use Bootstrap 5 carousel markup () per the proven template — apps.odoo.com loads Bootstrap JS site-wide so the carousel animates without any local script |
Google Fonts <link href="fonts.googleapis.com">
| Remove — use system font stack via inline |
| Font Awesome CDN | Replace icons with inline SVG inside OR omit icons; never depend on a remote CSS file |
<ul class="nav nav-tabs">
with | Flatten tabs into linear sections separated by horizontal rules and anchor links () |
| Forbidden — use for expandable content |
| Owl Carousel for Related Products | Bootstrap 5 carousel (<div class="carousel slide" data-bs-ride="carousel">
) with two slides — same pattern shipped in and accepted by the Apps Store validator |
| block at end of file | Remove entirely |
Brand Tokens (Lema Core)
Use these color values consistently across the page:
- Primary purple:
- Primary dark:
- Heading dark: /
- Body muted:
- Surface light: /
- Border light: /
- Accent blue:
- Accent green:
- Accent teal:
- Accent warning:
- Accent danger:
Fonts: rely on the system stack —
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
. Never load a webfont.
Icon convention
Card titles in the
Features and
Technical Specifications sections carry a small icon for visual rhythm.
Icons must be referenced as <img src="assets/icons/...">
, never as inline elements — Odoo's HTML sanitizer strips inline SVG when rendering the description in the Apps browser, leaving a blank space.
Use this convention:
| Location | Icon file | Title color | Size |
|---|
| Feature group 1 (Core / Primary, 3 cards) | assets/icons/star-purple.svg
| | 14×14 |
| Feature group 2 (Secondary, 3 cards) | assets/icons/star-blue.svg
| | 14×14 |
| Feature group 3 (Accent, 3 cards) | assets/icons/star-green.svg
| | 14×14 |
| All 4 tech spec cards (Dependencies / Deployment / Performance / Security) | assets/icons/gear-purple.svg
| (title), icon | 16×16 |
The exact markup is:
html
<img src="assets/icons/star-purple.svg" alt="" width="14" height="14" style="vertical-align:-2px; margin-right:6px;"/>
The four SVG files (
,
,
,
) ship with this skill under
lema-odoo-indexhtml/assets/icons/
and are listed in the canonical assets table — copy them into the target module's
<module>/static/description/assets/icons/
folder during generation.
Invariants when extending or modifying icons:
- One consistent shape across the whole Features section (only the color varies by group)
- One consistent shape across the whole Tech Specs section
- Never inline an — Odoo sanitizer will strip it; always reference a file via
- Color must be baked into the SVG because -referenced SVG cannot inherit from the parent
Folder layout
Each module must keep description assets under:
<module>/static/description/
├── icon.png # 140×140 module icon (per-module)
├── index.html # this file
└── assets/
├── brand.png # ← COPY FROM lema-odoo-indexhtml/assets/brand.png (do not regenerate)
├── email.svg # ← COPY FROM lema-odoo-indexhtml/assets/email.svg (do not regenerate)
├── video.gif # demo animation (optional, per-module)
├── icons/
│ ├── star-purple.svg # ← COPY FROM lema-odoo-indexhtml/assets/icons/star-purple.svg
│ ├── star-blue.svg # ← COPY FROM lema-odoo-indexhtml/assets/icons/star-blue.svg
│ ├── star-green.svg # ← COPY FROM lema-odoo-indexhtml/assets/icons/star-green.svg
│ └── gear-purple.svg # ← COPY FROM lema-odoo-indexhtml/assets/icons/gear-purple.svg
├── screenshots/ # all screenshot PNGs (per-module)
└── modules/ # related-products thumbnails (1.png, 2.png, ...) (per-module)
Files marked COPY FROM are canonical assets bundled with this skill — see "Bundled canonical assets" below. Everything else is per-module content the developer prepares.
Only reference paths that exist in
. The validator follows local image URLs and rejects broken paths.
Pre-submission checklist
Before declaring the file ready, mentally walk through:
Generating the file
When the user asks for a new index.html:
- Ask for the module's display name, technical name, one-paragraph value proposition, primary feature list, and Odoo version target if not already in the conversation context.
- Copy the bundled canonical assets into the target module's
static/description/assets/
:
lema-odoo-indexhtml/assets/brand.png
→ <module>/static/description/assets/brand.png
lema-odoo-indexhtml/assets/email.svg
→ <module>/static/description/assets/email.svg
lema-odoo-indexhtml/assets/icons/star-purple.svg
→ <module>/static/description/assets/icons/star-purple.svg
lema-odoo-indexhtml/assets/icons/star-blue.svg
→ <module>/static/description/assets/icons/star-blue.svg
lema-odoo-indexhtml/assets/icons/star-green.svg
→ <module>/static/description/assets/icons/star-green.svg
lema-odoo-indexhtml/assets/icons/gear-purple.svg
→ <module>/static/description/assets/icons/gear-purple.svg
- Start from and write it to
<module>/static/description/index.html
.
- Replace placeholders marked with , , , , etc.
- Drop sections that have no real content rather than padding them with filler — accuracy is required.
- Confirm the per-module assets the developer must still supply (, screenshots under , optional , related-module thumbnails under ).
- Run through the pre-submission checklist before reporting completion.
When reviewing an existing file:
- Read the file end-to-end.
- Produce a violations table: location → rule broken → fix.
- Offer to apply fixes inline.
Reference files
- — full compliant skeleton implementing all ten sections.
- — verbatim copy of the Odoo Apps Store guidelines for quick lookup.
references/violations-cheatsheet.md
— common review findings and their fixes.
Bundled canonical assets
The skill ships brand assets that must be reused as-is across every Lema Core module — do not regenerate or substitute them.
| Skill path | Purpose | Copy to (in target module) |
|---|
| Lema Core Technologies brand banner used in Hero Banner (section 2) and Footer (section 10) | <module>/static/description/assets/brand.png
|
| Email icon used in Hero contact button and Footer | <module>/static/description/assets/email.svg
|
assets/icons/star-purple.svg
| Title icon for Features group 1 (3 cards) | <module>/static/description/assets/icons/star-purple.svg
|
assets/icons/star-blue.svg
| Title icon for Features group 2 (3 cards) | <module>/static/description/assets/icons/star-blue.svg
|
assets/icons/star-green.svg
| Title icon for Features group 3 (3 cards) | <module>/static/description/assets/icons/star-green.svg
|
assets/icons/gear-purple.svg
| Title icon for all 4 Technical Specifications cards | <module>/static/description/assets/icons/gear-purple.svg
|
When generating a new module's description page:
- Copy
lema-odoo-indexhtml/assets/brand.png
→ <module>/static/description/assets/brand.png
- Copy
lema-odoo-indexhtml/assets/email.svg
→ <module>/static/description/assets/email.svg
- Create
<module>/static/description/assets/icons/
and copy all four icon SVGs (, , , ) into it
- Render the template with these paths already wired (the template already references , , and — no edits needed)
Do not:
- Re-export from a different source — the bundled file is the master copy approved for Apps Store use
- Replace with a Font Awesome
<i class="fa fa-envelope">
— that brings back the forbidden external CSS dependency
- Add new "canonical" assets directly into modules without first depositing them in this skill's folder
If a future module needs an additional shared asset (e.g., a new
,
, or product-line logo), add it to
lema-odoo-indexhtml/assets/
first, then reference it from the template and from this table — that is how the convention propagates.