Alliance Auth XIX Theme
The Legion of xXDEATHXx theme for Alliance Auth 5 (Django 5.2 LTS, Bootstrap 5). It ships a self-contained Bootstrap 5 build with the XIX brand styling and restyles the public/login pages, delivered as a standard Python package.
Русская версия: README.ru.md.
Features
- Dashboard theme via the AA5 theme selector. Registers a
ThemeHooknamed xix that appears in the user's theme picker. - Self-contained assets. The theme serves its own Bootstrap 5 CSS, JS bundle and the Lato web font from this package's static files; nothing is loaded from a CDN or Google Fonts.
- Restyled public pages. The login chain — with an animated starfield background — and the django-esi character-pick page are overridden with Bootstrap 5 layouts that match the theme.
- Operator-configurable strings via an optional
AA_THEME_XIXsettings dict — no template forking required (see Configuration). - English and Russian translation catalogues.
Requirements
- Alliance Auth
>=5,<6 - Python
>=3.11,<3.15
Installation
pip install aa-theme-xix
To install the latest unreleased changes straight from the repository instead:
pip install git+https://gitlab.com/legion-of-xxdeathxx/aa-theme-xix.git
Open your local.py and add the following right below your INSTALLED_APPS:
# XIX Theme - https://gitlab.com/legion-of-xxdeathxx/aa-theme-xix
INSTALLED_APPS.insert(0, "aa_theme_xix")
This single entry both activates the template overrides (login page, ESI token selection, icons) and registers the theme with Alliance Auth's theme selector.
Then collect the static files:
python manage.py collectstatic
Once installed, each user can pick xix from the theme selector in their Alliance Auth profile.
Configuration
The theme works without any configuration. To override the operator-facing
strings on the public pages without forking the templates, add an optional
AA_THEME_XIX dict to your local.py:
AA_THEME_XIX = {
"LOGIN_TITLE": "My Alliance",
"LOGIN_SUBTITLE": "TICKER",
"DISCORD_INVITE_URL": "https://discord.gg/example",
"OPENGRAPH_DESCRIPTION": "My Alliance's auth system.",
}
| Key | Default | Description |
|---|---|---|
LOGIN_TITLE |
Legion of xXDEATHXx |
Heading (and logo alt text) in the login box. |
LOGIN_SUBTITLE |
X.I.X |
Ticker line under the heading. |
DISCORD_INVITE_URL |
the XIX Discord invite | Target of the Discord link on the login page. |
OPENGRAPH_DESCRIPTION |
the Alliance Auth blurb | Site description used in link previews (OpenGraph meta). |
Any key left unset keeps the theme's built-in default, so an out-of-the-box install renders exactly as shipped.
Default theme
Each user selects a theme from their profile. Until a user makes a choice,
Alliance Auth renders the theme named by its core DEFAULT_THEME setting
(shipped as allianceauth.theme.flatly.auth_hooks.FlatlyThemeHook). To make
XIX the default for everyone who has not picked one yet, set DEFAULT_THEME
in your local.py:
# Make XIX the default for users who have not chosen a theme
DEFAULT_THEME = "aa_theme_xix.auth_hooks.AaXixThemeHook"
DEFAULT_THEME is an Alliance Auth core setting, not a XIX one — it only sets
the fallback; users can still switch to any installed theme from their
profile. The public login pages are always XIX-styled regardless of this
setting.
Upgrade
pip install --upgrade aa-theme-xix
python manage.py collectstatic
Using aa-gdpr
If you are using aa-gdpr,
this theme's entry needs to come after the aa-gdpr entry:
# GDPR Compliance
INSTALLED_APPS.insert(0, "aagdpr")
AVOID_CDN = True
# XIX Theme - https://gitlab.com/legion-of-xxdeathxx/aa-theme-xix
INSTALLED_APPS.insert(0, "aa_theme_xix")
Building from source
The shipped CSS and JS are not edited directly — they are compiled from
scss/ and js/ with a gulp + dart-sass + PostCSS + esbuild toolchain:
npm ci # reproducible toolchain pinned by package-lock.json
npm run compile # compiles scss/ and js/ -> aa_theme_xix/static/
The Python package is built with uv on the hatchling build backend:
uv build # produces a wheel and sdist in dist/
The package version is single-sourced in pyproject.toml (version);
aa_theme_xix/__init__.py derives __version__ from the installed
distribution metadata at runtime, and the test suite enforces the match.
Limitations
- Alliance Auth 5 only. The templates target the AA5 / Bootstrap-5 theme-hook era; Alliance Auth 4 is not supported.
- Run
collectstaticafter every install or upgrade — the theme serves its Bootstrap bundle and compiled CSS from this package's static files. - This is a presentation layer only: it adds no models, views, or URLs.
License
Distributed under the GPL-3.0-or-later license.
Changelog
See CHANGELOG.md.
Metadata
Release files for aa-theme-xix 0.5.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| aa_theme_xix-0.5.0.tar.gz | 261.1 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| aa_theme_xix-0.5.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 529.7 kB
Release files / aa_theme_xix-0.5.0.tar.gz
| Download URL | aa_theme_xix-0.5.0.tar.gz |
|---|---|
| Size | 261.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6a1e32f0b576f0ecfb4ccd20b9d45fa0ec2aecc5db552e614f111dedd2230da0
|
|
BLAKE2b-256 checksum How to use checksums |
29f7c3ad69da23768cf9911da78807610b46ca2178270ece50db56be2bcfd574
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / aa_theme_xix-0.5.0-py3-none-any.whl
| Download URL | aa_theme_xix-0.5.0-py3-none-any.whl |
|---|---|
| Size | 268.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c3c06258666cfd429403f0b5b61a968c48adcbe7f43caa80dfe7ad6508405b3e
|
|
BLAKE2b-256 checksum How to use checksums |
98991be4bf1ae62fc402d039e5314064be61bca0d83087a93c71333e825f1745
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for aa-theme-xix 0.5.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.