--- since: 1.2.1 --- # DjangoPlay — `frontend` App > Doc generated by direct inspection of every file in `webapp/frontend/` (Python, HTML, CSS, and the `minify.sh` asset pipeline — CSS/JS/image binaries were listed and spot-checked, not fully read line-by-line), plus its wiring points: `paystream/app_settings/templates.py`, `paystream/app_settings/static_media.py`, `paystream/app_settings/cdn.py`, `paystream/services/context_processors/*`, `utilities/context_processors/report_bug.py`, `utilities/constants/template_registry.py`, `utilities/admin/base_admin_page.py`, and `mailer/engine/*`. > > **Revision note:** this pass adds Cloudflare R2/CDN asset delivery (`dist/`, `assets/`, `vendor/` now optionally served from R2 instead of the Django box) and supersedes the prior revision's description of the static pipeline as purely local. See `docs/releases/djangoplay/frontend-r2-requirements.md` for the original design doc and decision log, and `docs/system/asset-builder-cloudflare-r2.md` for the brand-asset generator this ships alongside. ## 1. Summary `frontend` (`AppConfig.name = "frontend"`, no custom `ready()`, **no models, no views, no urls.py, no admin.py**) is DjangoPlay's **shared presentation layer** — the single place every other app's HTML, CSS, JS, and email templates live. It is not a conventional "page-owning" Django app; it owns no routes of its own. Instead: - It is registered as the **sole entry** in both `STATICFILES_DIRS` and `TEMPLATES[0]['DIRS']` (`paystream/app_settings/static_media.py`, `paystream/app_settings/templates.py`) — the comment in `static_media.py` is explicit: *"Only `frontend/static` should be used now"*. - Every other app's views (`users`, `apidocs`, `helpdesk`'s issue-tracker integration, `teamcentral`, `industries`, `locations`, etc.) render templates that physically live under `frontend/templates/`, resolved indirectly through `utilities.constants.template_registry.TemplateRegistry` rather than hard-coded template paths scattered per-app. - It carries **three small template-tag modules** (`actions.py`, `filter_config_tags.py`, `privacy_filters.py`) that are the only executable Python in the app — everything else is markup, CSS, and hand-written vanilla JS (no frontend build framework — no React/Vue/webpack; a bespoke bash script (`packaging/minify.sh`) concatenates and minifies plain `