diff --git a/AUTHELIA_INTEGRATION.md b/AUTHELIA_INTEGRATION.md
new file mode 100644
index 0000000..59131c3
--- /dev/null
+++ b/AUTHELIA_INTEGRATION.md
@@ -0,0 +1,495 @@
+# Authelia Portal — LotusGuild Terminal Design System Integration
+
+This document covers everything that had to be **written from scratch** to theme the
+Authelia authentication portal using the LotusGuild Terminal Design System v1.2.
+It is a companion to `base.css` / `base.js` for future integrations with third-party
+applications that use their own component frameworks.
+
+---
+
+## Why a separate file at all?
+
+`base.css` targets exclusively `.lt-*` class names — the design system's own prefix.
+Authelia's frontend is a React single-page application built on
+**Material UI (MUI) v5**, which generates its own stable class names like
+`.MuiCard-root`, `.MuiButton-containedPrimary`, etc.
+Bridging the two requires a translation layer: the same design tokens and visual
+patterns from `base.css`, re-expressed against MUI's class structure.
+
+Additionally, Authelia v4.x (latest: 4.39.x) does **not** support native CSS
+injection — `server.asset_path` only handles `logo.png` and `favicon.ico`.
+The CSS is injected via **nginx `sub_filter`** in Nginx Proxy Manager, which rewrites
+Authelia's HTML on the fly to include a `` tag before ``.
+
+---
+
+## Deployment architecture
+
+```
+Browser
+ └─► https://auth.lotusguild.org (NPM — LXC 139)
+ ├─ GET /custom.css ──────── served from /data/custom_assets/authelia-custom.css
+ │ (nginx alias, no upstream request)
+ └─ GET /* ──────────────── proxied to Authelia (LXC 167 :9091)
+ HTML response is rewritten by sub_filter:
+ →
+```
+
+**NPM config changed:** `/data/nginx/proxy_host/29.conf` (auth.lotusguild.org proxy host)
+
+```nginx
+# Serve LotusGuild Terminal custom CSS
+location = /custom.css {
+ alias /data/custom_assets/authelia-custom.css;
+ add_header Content-Type "text/css";
+ add_header Cache-Control "public, max-age=3600";
+}
+
+location / {
+ ...existing headers...
+
+ # Prevent upstream gzip so sub_filter can inspect the body
+ proxy_set_header Accept-Encoding "";
+
+ # Inject CSS link before
+ sub_filter '' '';
+ sub_filter_once on;
+
+ include /etc/nginx/conf.d/include/proxy.conf;
+}
+```
+
+> **Warning:** NPM regenerates proxy_host conf files when you edit a proxy host in
+> the UI. If host 29 is ever modified through NPM, re-apply the `sub_filter` block
+> and the `/custom.css` location manually, or set the config via NPM's
+> "Advanced" tab before saving.
+
+**Authelia config changed:** `/etc/authelia/configuration.yml` — added `asset_path`
+under `server:` so Authelia serves the resized logo and favicon:
+
+```yaml
+server:
+ address: tcp://0.0.0.0:9091
+ asset_path: /etc/authelia/assets
+```
+
+Assets in `/etc/authelia/assets/`:
+- `logo.png` — 256 × 256 PNG resized from Tinker Tickets `assets/images/favicon.png`
+- `favicon.ico` — 32 × 32 ICO from the same source
+
+---
+
+## What is NOT in `base.css` and had to be written
+
+The sections below are ordered as they appear in `authelia-custom.css`.
+
+---
+
+### 1. Re-declaring design tokens with `!important`
+
+**In `base.css`:** `:root { ... }` is declared once, without `!important`.
+
+**What had to be added:** The entire `:root` block is repeated in `custom.css` because
+Authelia's HTML is a self-contained SPA — `base.css` is never loaded. More critically,
+MUI injects its own inline styles and CSS-in-JS rules at very high specificity.
+Every property that needs to override MUI requires `!important`. `base.css` never
+uses `!important` because it owns its namespace; here we are guests in MUI's DOM.
+
+```css
+/* base.css does NOT use !important anywhere */
+body { background-color: var(--bg-primary); }
+
+/* custom.css must fight MUI's inline styles */
+body { background-color: var(--bg-primary) !important; }
+```
+
+The token values themselves are identical to `base.css` — only the override
+mechanism is new.
+
+---
+
+### 2. Universal box-sizing reset with `!important`
+
+**In `base.css`:** `*, *::before, *::after { box-sizing: border-box; }` — no flag needed
+because `base.css` loads first.
+
+**What had to be added:**
+
+```css
+*, *::before, *::after {
+ box-sizing: border-box !important;
+}
+```
+
+MUI components set `box-sizing` inline on some elements. Without the flag the
+clip-path geometry breaks on inputs and buttons.
+
+---
+
+### 3. MUI typography selectors
+
+**In `base.css`:** Typography rules target `h1–h6`, `a`, `p`, `body` — standard HTML
+elements. No MUI class names exist in the design system.
+
+**What had to be added:** Authelia renders text almost exclusively through MUI's
+`` component, which produces elements with `.MuiTypography-root` and
+variant classes. Without targeting these, all text inherits MUI's Roboto font and
+light grey colour instead of JetBrains Mono and `--text-primary`.
+
+```css
+.MuiTypography-root,
+.MuiInputBase-input,
+.MuiFormLabel-root,
+.MuiFormHelperText-root,
+label, p, span, div {
+ font-family: var(--font-mono) !important;
+ color: var(--text-primary) !important;
+}
+
+h1, h2, h3, h4, h5, h6,
+.MuiTypography-h5,
+.MuiTypography-h6 {
+ color: var(--accent-orange) !important;
+ text-shadow: var(--glow-orange) !important;
+ ...
+}
+```
+
+---
+
+### 4. `.MuiCard-root` / `.MuiPaper-root` — the login card
+
+**In `base.css`:** `.lt-card` implements the terminal card with `clip-path`, border,
+background, and the `::before` corner triangle accent.
+
+**What had to be added:** Authelia wraps its login form in a MUI `` (which
+extends ``). Neither selector exists in `base.css`. The visual result is
+identical to `.lt-card` — the clip-path polygon, cyan border, box-glow, and
+corner triangle are all copied — but they target different class names and require
+`!important` throughout to override MUI's elevation shadows and `border-radius: 4px`.
+
+```css
+.MuiCard-root,
+.MuiPaper-root {
+ background: var(--bg-card) !important;
+ border: 1px solid var(--border-color) !important;
+ border-radius: 0 !important; /* ← overrides MUI default */
+ clip-path: polygon(...) !important; /* same geometry as .lt-card */
+ ...
+}
+
+.MuiCard-root::before,
+.MuiPaper-root::before {
+ /* same corner triangle as .lt-card::before */
+}
+```
+
+---
+
+### 5. Logo element — `img[alt="Authelia"]`
+
+**In `base.css`:** No equivalent. The design system has no logo slot component.
+
+**What had to be added:** Authelia renders the portal logo as
+``. This selector targets it
+specifically to apply the cyan drop-shadow and orange hover glow. Without it the
+logo renders without any terminal aesthetic treatment.
+
+```css
+img[alt="Authelia"] {
+ filter: drop-shadow(0 0 12px rgba(0,212,255,0.4)) !important;
+ transition: filter 0.25s ease !important;
+}
+img[alt="Authelia"]:hover {
+ filter: drop-shadow(0 0 18px rgba(255,107,0,0.5)) !important;
+}
+```
+
+---
+
+### 6. MUI outlined input family
+
+**In `base.css`:** `.lt-input`, `.lt-select`, `.lt-textarea` — custom elements with
+`clip-path`, terminal background, and cyan focus ring.
+
+**What had to be added:** MUI's outlined text field is a composition of three
+separate elements that each need individual targeting:
+
+| MUI class | What it controls | Equivalent in `base.css` |
+|-----------|-----------------|--------------------------|
+| `.MuiOutlinedInput-root` | Outer wrapper — background, clip-path | `.lt-input` outer |
+| `.MuiOutlinedInput-notchedOutline` | The SVG border element | `.lt-input` border |
+| `.MuiInputBase-input` | The actual `` inside | `.lt-input` inner text |
+| `.MuiInputLabel-root` | Floating label | `.lt-label` |
+| `.MuiFormHelperText-root` | Error / hint text below field | `.lt-form-hint` |
+
+MUI splits the border rendering into a separate SVG `