Platform Overview
AA Customizer is a branding plugin for Alliance Auth that gives administrators a simple admin-panel UI to fully brand their installation โ custom logos, backgrounds, layout, CSS, and more โ all without touching code or static files.
Core Features
Global override for SITE_NAME without editing local.py.
Fullscreen .mp4/.webm/.ogv videos with configurable loop count (play once, N times, or forever).
Centered Card or Split-Screen (Background Left / Login Left) login layouts.
Upload or link logos for the Login page, Navbar, and Sidebar independently.
Add custom HTML to the Login card or site-wide <head> (analytics, Discord links, etc.).
Inject inline CSS or link external stylesheets, loaded after the active theme.
Inject CSS, HTML, and JS exclusively on the login page for a completely custom landing page design.
Turn the login page into a full-viewport multi-page public site with a navigation bar โ no server changes required.
Inject custom CSS, HTML, and scripts into the member dashboard and a separate admin status widget visible only to superusers.
Optionally limit AA Customizer admin access to a specific list of user IDs via AA_CUSTOMIZER_TRUSTED_USER_IDS in local.py.
System Requirements
- Alliance Auth >= 4.0.0 (Bootstrap 5 template set)
django-soloPillow(required for image upload & processing)
Customization Areas
Breakdown of configuration categories.
Installation Guide
Every installation requires the Core Setup below. Then select the tab for your hosting environment to finish configuring media storage.
1. Core Setup โ All Environments
Activate your Alliance Auth virtual environment and install:
Edit your local.py:
INSTALLED_APPS.insert(0, 'aa_customizer')
# 2. Register the context processor
TEMPLATES[0]["OPTIONS"]["context_processors"].append(
"aa_customizer.context_processors.aa_customizer"
)
# 3. Define media paths (adjust to your install path)
MEDIA_ROOT = "/var/www/myauth/media/"
MEDIA_URL = "/media/"
Run migrations:
Docker: Media Volume Setup
The easiest approach for Docker is to use URL fields (external CDN, Imgur, GitHub raw) so no volume is needed.
If you want to self-host media, add a named volume in three places in docker-compose.yml:
-
Add the volume to the base service definition, nginx, and top-level volumes:
# In x-allianceauth-base
x-allianceauth-base: &allianceauth-base
volumes:
- media-data:/var/www/myauth/media
# In the nginx service
services:
nginx:
volumes:
- media-data:/var/www/myauth/media
# Top-level volumes section
volumes:
media-data: -
Add the Nginx media location block inside
server {}:client_max_body_size 20m;
location /media {
alias /var/www/myauth/media;
autoindex off;
} -
Fix permissions โ the AA container runs as UID 61000:
docker compose exec -u root allianceauth_gunicorn chown -R 61000:61000 /var/www/myauth/media
-
Build and restart:
docker compose build
docker compose up -d
Bare Metal: Nginx & Static Files
-
Create the media directory and set permissions:
mkdir -p /var/www/myauth/media
chown -R www-data:www-data /var/www/myauth/media -
Collect static files:
python manage.py collectstatic
-
Add the media block to your Nginx config inside
server {}:# Raise this if uploads are rejected with 413
client_max_body_size 20m;
location /media {
alias /var/www/myauth/media;
autoindex off;
} -
Restart services:
sudo nginx -t && sudo systemctl reload nginx
sudo systemctl restart gunicorn
Media Hosting Strategy
There are two ways to supply images and videos to the customizer. Choose based on your hosting environment and accessibility needs.
๐ Option A: External URLs
Quickest setup โ no storage config needed
Paste a URL from any public image/video host (Imgur, Cloudflare R2, GitHub raw, etc.) directly into the URL fields in the admin panel.
๐๏ธ Option B: Local Hosting
Best reliability โ served from your own domain
Upload files directly via the Media Library tab in the admin panel. They're served from your own domain, so any user who can reach your Auth site will see them.
Input Priority Logic
For fields that support all three input methods (URL, Library, Upload), the plugin uses a strict priority chain. Only the highest-priority non-empty value is rendered.
If a URL is set, the Library and Upload fields are ignored.
Field & Layout Reference
All configuration fields available in the AA Customizer admin panel. Use the search box to jump to a specific field.
Admin Panel Fields
| Section | Field | Description |
|---|---|---|
| Site | Site Name | Global override for SITE_NAME from local.py, displayed across the whole site. |
| Background | Login Background โ URL | URL of a background image or video (takes priority over all other background fields). Video files (.mp4, .webm, .ogv) play fullscreen, muted, and auto-pause when the tab is hidden. |
| Background | Login Background โ Library | Select an image uploaded to the Media Library. Takes priority over a direct upload. |
| Background | Login Background โ Upload | Upload a background image or video directly into this field. Supported formats: JPEG, PNG, GIF, WebP, BMP, TIFF, SVG, MP4, WebM, OGV. |
| Background | Login Background Color | CSS color shown when no image is set, or behind a video while it loads. Example: #1a1a2e. |
| Background | Background Video โ Loop Count | 0 = loop forever (default). 1 = play once then freeze on the last frame. N = play N times then freeze. Only applies to video backgrounds. |
| Layout | Login Page Layout | Centered Card โ login card centered over the full background (default). Split Screen โ Background Left โ background on the left, dark login panel on the right. Split Screen โ Login Left โ mirrors it. |
| Layout | Split Panel โ Show Overlay Text | Tick to show text on the background panel of a split-screen layout; untick to hide it. |
| Layout | Split Panel โ Overlay Text | Text shown on the background panel. Leave blank to auto-display the site name. |
| Layout | Split Panel โ Text Position | Vertical position of the overlay text: Top, Center, or Bottom. |
| Login Branding | Login Logo โ URL | URL of a logo image shown at the top of the login card (highest priority). |
| Login Branding | Login Logo โ Library | Select a logo from the Media Library. |
| Login Branding | Login Logo โ Upload | Upload a logo image directly. |
| Login Branding | Login Logo Max Width (px) | CSS max-width applied to the login logo image. |
| Login Branding | Login Page Title | Custom heading shown above the SSO button on the login card. |
| Login Branding | Login Page Subtitle | Optional description text shown below the title. |
| Login Branding | Login Page Extra HTML | Raw HTML injected below the EVE SSO button on the login card. Useful for Discord links, notices, etc. |
| Favicon | Favicon โ URL | URL of a favicon image (highest priority). Replaces all Alliance Auth browser-tab icons. |
| Favicon | Favicon โ Library | Select a favicon from the Media Library. |
| Favicon | Favicon โ Upload | Upload a favicon image directly. |
| Navbar Logo | Navbar Logo โ URL | URL of a logo shown alongside the site name in the top navigation bar (highest priority). |
| Navbar Logo | Navbar Logo โ Library | Select a navbar logo from the Media Library. |
| Navbar Logo | Navbar Logo โ Upload | Upload a navbar logo directly. |
| Navbar Logo | Navbar Logo Height (px) | CSS height applied to the navbar logo. |
| Sidebar Logo | Sidebar Logo โ URL | URL of an image to replace the Alliance Auth logo in the sidebar (highest priority). |
| Sidebar Logo | Sidebar Logo โ Library | Select a sidebar logo from the Media Library. |
| Sidebar Logo | Sidebar Logo โ Upload | Upload a sidebar logo directly. |
| Sidebar Logo | Sidebar Logo Width (px) | CSS max-width applied to the sidebar logo. |
| Custom CSS | Custom CSS โ URL | External stylesheet URL linked in every page <head>, loaded after the active theme. |
| Custom CSS | Custom CSS (Inline) | Raw CSS text injected via <style> on every page, loaded after the active theme. Takes precedence over the built-in Custom CSS admin. |
| Extra HTML | Extra <head> HTML | Raw HTML injected at the end of <head> on every page. Useful for analytics scripts, font imports, or custom meta tags. |
| Login Page | Login Page โ CSS URL | External stylesheet URL linked only on the login page <head>, loaded after global CSS. Useful for a completely custom login page design. |
| Login Page | Login Page โ CSS (Inline) | Raw CSS text injected via <style> only on the login page, loaded after global CSS. Use to restyle or completely override the login page appearance. |
| Login Page | Login Page โ Extra <head> HTML | Raw HTML injected at the end of <head> only on the login page. Useful for login-specific scripts or meta tags. |
| Login Page | Login Page โ Extra Body HTML | Raw HTML injected just before </body> only on the login page. Useful for custom overlays, JS bundles, or analytics specific to the login experience. |
| Login Page โ SPA | Login Page โ Enable SPA mode | When enabled, a full-viewport overlay SPA is shown on the login page with a nav bar and multiple page sections. Visitors browse a public site; clicking Sign In reveals the standard EVE SSO card. Add page content via Login Page โ Extra Body HTML using <section data-route="slug" data-label="Nav Label"> elements wrapped in <div id="aac-spa-content" style="display:none">. |
| Login Page โ SPA | Login Page โ SPA nav brand | Text shown in the top-left of the SPA navigation bar. Defaults to the site name if left blank. |
| Dashboard | Dashboard โ CSS URL | External stylesheet URL loaded only on the main (member) dashboard, after the global CSS URL. Use for widget-specific design frameworks without affecting other pages. |
| Dashboard | Dashboard โ CSS | Inline CSS applied only on the main dashboard, after all other stylesheets. Highest CSS priority โ full design control over the dashboard layout and widgets. |
| Dashboard | Dashboard โ Extra <head> HTML | Raw HTML injected at the end of <head> on the main dashboard only. Useful for chart libraries or custom fonts specific to the member dashboard. |
| Dashboard | Dashboard โ Extra Body HTML | Raw HTML injected before </body> on the main dashboard only. Useful for overlays, widget scripts, or custom markup visible to all logged-in members. |
| Admin Dashboard | Admin Dashboard โ CSS URL | External stylesheet URL loaded only in the admin status widget (superusers only). Non-superusers never receive this stylesheet. |
| Admin Dashboard | Admin Dashboard โ CSS | Inline CSS applied only inside the admin status widget (superusers only). Non-superusers never receive these styles. |
| Admin Dashboard | Admin Dashboard โ Extra <head> HTML | Raw HTML injected at the end of <head> when the admin status widget is shown โ superusers only. Useful for chart libraries or extra scripts for the admin panel. |
| Admin Dashboard | Admin Dashboard โ Extra Body HTML | Raw HTML injected inside the admin status widget, after all panel cards โ superusers only. Useful for overlays or extra markup visible only to administrators. |
Image & Video Recommendations
JPEG, PNG, or GIF. JPEG recommended for photos.
MP4 (H.264) or WebM (VP9). Keep under ~15 MB for fast loads.
Transparent PNG. Displayed at the top of the login card.
Navbar height โค 64 px. Sidebar width โค 256 px.
PNG or ICO format for best browser-tab display.
Security & Licensing
Important considerations for administrators regarding raw input fields and the open-source license.
โ ๏ธ Security Notes
-
Raw HTML fields:
Login Page Extra HTML,Extra <head> HTML,Login Page โ Extra <head> HTML,Login Page โ Extra Body HTML,Dashboard โ Extra <head> HTML,Dashboard โ Extra Body HTML,Admin Dashboard โ Extra <head> HTML, andAdmin Dashboard โ Extra Body HTMLare injected without sanitization. Only Django staff/superusers can access the AA Customizer admin panel, but you should still restrict access to highly trusted administrators to prevent XSS vulnerabilities. -
Restricted Admin Access:
Add
AA_CUSTOMIZER_TRUSTED_USER_IDS = [1, 7]tolocal.pyto limit AA Customizer admin access to only those user IDs, even if other staff/superusers exist. Leave the setting unset (or as an empty list) to fall back to the default Django staff/superuser check. Find your user ID in the Alliance Auth admin panel under Authentication โ Users. - CSS Precedence: The customizer's CSS loads after Alliance Auth's default custom CSS. This is intentional โ it lets you override theme styles โ but double-check your selectors to avoid unintended layout breaks.
-
Custom CSS URL:
Validated as a URL by Django's field validator; only
httpandhttpsschemes are accepted.
๐ License
This project is licensed under the MIT License.
Login Page Showcase
Using only the four Login Page Custom Code fields, you can replace the default Alliance Auth login card with a fully custom marketing page โ without touching a single server file. This live demo shows a complete EVE Online corporation landing page built entirely in the admin panel. For an even richer experience, enable SPA mode to get a built-in navigation bar and multi-page routing powered automatically by the plugin's own JavaScript and CSS.
Imports the Space Grotesk Google Font used throughout the landing page.
Repositions the existing login card as a hidden overlay modal and styles the entire showcase page โ 250+ lines of CSS.
Injects the full marketing page (nav, hero, stats, feature cards, CTA, footer) and all the JavaScript โ 230+ lines.
The Alliance Auth EVE SSO login button still works normally โ only its visual presentation is controlled by your CSS.
💡 How the modal overlay works
The CSS field sets .aac-login-root { position: fixed; opacity: 0; pointer-events: none; },
effectively hiding the existing login card without removing it from the DOM. The JavaScript
in the Body HTML field adds the .aac-open class when a visitor clicks
Member Login, transitioning the card to full opacity. The EVE SSO button inside
the card still points to Alliance Auth's real login URL โ no server-side changes required.