TL;DR: AppLauncher loads your app at startup. These four files are what actually wire it into Horilla CRM: registration.py (features + permissions), menu.py (sidebar & FAB), signals.py (cross-module events), and dashboard.py (charts). Skip registration.py and your model is invisible to global search, import, export, and workflows.
In last post on AppLauncher , we saw how a Horilla CRM app declares url_prefix , auto_import_modules , and Celery schedules — then integrates without touching the root urls.py .
The next question every developer asks:
“What runs when AppLauncher imports registration , menu , signals , and dashboard ?”
This post answers that using the Leads module ( horilla_crm/leads ) — the reference implementation for every CRM app in Horilla CRM .
The standard app folder
Every production module follows the same layout:
horilla_crm/leads/ ├── apps.py # AppLauncher config ├── registration.py # Feature + platform hooks ← critical ├── menu.py # Sidebar / FAB / settings menus ├── signals.py #…