This skill should be used when creating icons for Odoo modules. It generates modern Material Design style PNG icons (128x128) with white background, colored circle, and composable colored primitives...
Generate professional Material Design style PNG icons for Odoo modules using composable colored primitives on white background with colored circle, and automatically update all related files (manifest, menu views).
Use this skill when:
From user request, identify:
inventory_tracking, task_manager)If not provided, ask:
DO NOT ask about:
Execute the Python script:
# Basic usage (recommended)
uv run python .claude/skills/odoo_icon_maker/scripts/make_icon.py \
--module inventory_tracking \
--description "Warehouse inventory with boxes and tracking"
# With custom circle colors (green)
uv run python .claude/skills/odoo_icon_maker/scripts/make_icon.py \
--module task_manager \
--description "Task checklist and calendar" \
--colors "#27ae60,#229954"
# Dry run (preview without writing files)
uv run python .claude/skills/odoo_icon_maker/scripts/make_icon.py \
--module reporting_analytics \
--description "Charts and data visualization" \
--dry-run
How it works: The script detects primitives from keywords in description and automatically composes them into a modern Material Design icon.
Icon Design:
Available primitives (12 total):
Automatic composition:
Example detection:
Description: "Manufacturing workcenter with task planning"
Detected: gear + calendar + checkbox
Result: Gray gear (main), Red calendar (right), Green checkbox (corner)
All on colored circle on white background
Automatic circle color selection based on keywords:
Custom colors:
Override circle color with --colors "#color1,#color2" (uses first color for circle)
The script automatically performs:
Generate icon PNG
module_name/static/description/icon.pngUpdate manifest.py
'icon': '/module_name/static/description/icon.png'Check and update menu XML files
views/*menu*.xml or views/*views.xml with menuitemweb_icon="module_name,static/description/icon.png"Validation
Script returns JSON:
{
"status": "success",
"icon_created": true,
"icon_path": "addons_ticket/ticket_task_manager/static/description/icon.png",
"manifest_updated": true,
"menu_files_updated": [
"views/menu_views.xml"
],
"backups_created": [
"__manifest__.py.backup",
"views/menu_views.xml.backup"
],
"warnings": []
}
If errors occur:
{
"status": "error",
"error": "Module directory not found: addons_ticket/nonexistent_module",
"icon_created": false
}
On success:
✅ Icon created successfully!
Module: task_manager
Icon: static/description/icon.png (128x128 PNG)
Design: White background + green circle + colored primitives
Primitives detected: calendar (red), checkbox (green)
Files updated:
- __manifest__.py (icon path added)
- views/menu_views.xml (web_icon updated)
Backups created in case you need to rollback.
Next steps:
1. Update the module: odoo-bin -u task_manager
2. Refresh browser (Ctrl+F5)
3. Check Apps menu for new icon
On partial success (icon created but no menu):
✅ Icon created!
Module: task_manager
Icon: static/description/icon.png
⚠ Note: No menu XML files found
If this module should have a menu item, create one and include:
web_icon="task_manager,static/description/icon.png"
On error:
❌ Error creating icon
Error: Module directory not found: task_manager
Please check:
- Module name is correct
- Module exists in addon directories
- You're in the project root directory
Icon Requirements (Odoo 18):
/module_name/static/description/icon.pngMenu Structure: Root menu items need:
web_icon="module_name,static/description/icon.png"Automatic Updates:
Module Update Required: After creating/updating icon:
docker compose -f docker/arm/odoo18-dev-run.yml -p odoo18c_dev run --rm odoo \
python3 /opt/odoo/app/server/odoo-bin -c /opt/odoo/app/config/odoo.conf \
-d test_basic -u module_name --stop-after-init
Example 1: Manufacturing module
User: "Create an icon for am_workcenter_tasks - manufacturing with task planning"
You:
1. Run: make_icon.py --module am_workcenter_tasks --description "Manufacturing workcenter machine with planning calendar and task management"
2. Script detects: gear + calendar + checkbox
3. Result: White background → Dark blue circle → Gray gear + Red calendar + Green checkbox
4. Report: "Icon created with Material Design style!"
Example 2: Custom colors
User: "Create icon for ticket_purchase with green background"
You:
1. Run: make_icon.py --module ticket_purchase --description "Purchase orders with documents and products inventory" --colors "#27ae60,#229954"
2. Script detects: document + box
3. Result: White background → Custom green circle → Blue document + Orange box
4. Report: "Icon created with custom green circle!"
Example 3: Analytics module
User: "Icon for sales_reports - should show charts and analytics"
You:
1. Run: make_icon.py --module sales_reports --description "Sales analytics with charts and reports"
2. Script detects: chart + document
3. Result: White background → Teal circle → Teal bars + Blue document
4. Report: "Icon created with analytics style!"
Example 4: Document management
User: "Icon for doc_manager - documents and folders for teams"
You:
1. Run: make_icon.py --module doc_manager --description "Document management with folders for team collaboration"
2. Script detects: document + folder + user
3. Result: White background → Purple circle → Blue document + Yellow folder + Dark gray user
Design structure:
1 primitive:
2 primitives:
3+ primitives:
Each primitive has distinct color for recognition:
Good descriptions (specific):
Average descriptions:
Poor descriptions (vague):
Tip: Use 2-3 specific keywords from the primitives list for best results. More primitives = richer icon.
Module not found:
PIL/Pillow not available:
pip install PillowPermission errors:
XML parsing errors:
Before first use, customize config.py for your project:
# Project root (auto-detected from script location)
PROJECT_ROOT = Path(__file__).parent.parent.parent
# Addon directories (relative to PROJECT_ROOT)
ADDON_DIRECTORIES = [
'addons_ticket',
'addons_aimax',
# Add your custom directories
]
# Icon size in pixels (Odoo standard is 128x128)
ICON_SIZE = 128
Default values work for standard Odoo projects with common structure.
The script will:
Preview before creating:
make_icon.py --module my_module --description "..." --dry-run
Custom circle colors (hex format):
# Green circle
make_icon.py --module my_module --description "..." --colors "#27ae60,#229954"
# Blue circle
make_icon.py --module my_module --description "..." --colors "#3498db,#2980b9"
# Orange circle
make_icon.py --module my_module --description "..." --colors "#e67e22,#d35400"
Note: First color is used for the circle, second color is ignored (kept for compatibility).
Material Design Style:
Why colored primitives?
Full list with colors and visual descriptions:
.claude/skills/odoo_icon_maker/scripts/make_icon.py