# Drasl Web UI Customization > How far you can reskin Drasl's web frontend, and what it costs. > Source repo: · config docs: > ## TL;DR Drasl has **no theme/plugin system**. You get three tiers, increasing effort: 1. **Config knobs** (runtime, trivial) — rename instance, toggle footer / 3D bg. 2. **Static-asset override** (mount, easy) — swap `style.css`, `logo.svg`, `icon.png`. 3. **Template / fork** (build, heavy) — edit `view/*.tmpl`, rebuild the image. For a "very noob-friendly UI" the realistic win is **tier 2** (reskin CSS + logo) plus a **dead-simple guide page on the landing site** that walks guests through register → login → upload skin, screenshots included. Drasl's own pages stay the backend; the landing page is where you make it friendly. --- ## Tier 1 — Config knobs (config.toml) Live in `drasl/config/config.toml.tmpl`. Already rendered into the container at `/etc/drasl/config.toml`. No rebuild — just `docker compose restart drasl`. | Option | Default | Effect | |--------|---------|--------| | `InstanceName` | `"Drasl"` | Site name shown in header/title. Set to `"Ulicraft Accounts"`. | | `ApplicationOwner` | `"Anonymous"` | Owner label (already `"Ulicraft"`). | | `EnableBackgroundEffect` | `true` | 3D animated background. Off = cleaner/faster. | | `EnableFooter` | `true` | Footer block. | | `EnableWebFrontEnd` | `true` | Master switch for the whole web UI. | Low effort, low ceiling. Does **not** change layout, colors, or copy. --- ## Tier 2 — Static-asset override (CSS + logo) ← recommended Drasl serves static files from **`DataDirectory`** (default `/usr/share/drasl`). The shipped assets live in the image's `public/`: - `style.css` — primary stylesheet (all colors/spacing/theme) - `logo.svg` — header logo - `icon.png` — favicon - `openid-logo.svg` — OIDC button icon (unused here, no OIDC) ### Plan 1. Pull the upstream `style.css` as a baseline: 2. Create `drasl/public/` in this repo. Drop in your edited `style.css`, `logo.svg`, `icon.png`. 3. Bind-mount over the container's asset dir in `docker-compose.yml`: ```yaml drasl: volumes: - ./drasl/config:/etc/drasl:ro - ./drasl/public:/usr/share/drasl/public:ro # <-- add - drasl_state:/var/lib/drasl ``` ⚠ **Verify the exact in-container path first** — assets may sit at `/usr/share/drasl/public/` or directly under `/usr/share/drasl/`. Check: ```bash docker compose exec drasl sh -c 'find /usr/share/drasl -name style.css' ``` Mount to match whatever that prints. Mount the *directory*, not the single file, so the logo/icon ride along. 4. `docker compose up -d drasl`. Hard-refresh browser (CSS cache). Ceiling: full restyle of existing pages — colors, fonts, button sizes, hide clutter, big friendly upload button. Cannot add/remove page elements or reword text (that's the templates → tier 3). --- ## Tier 3 — Templates / fork (heavy) Page structure + copy live in Go templates `view/*.tmpl`, **embedded into the binary at build time** (Go `embed.FS`) — not overridable by mounting. Files: ``` root.tmpl user.tmpl player.tmpl registration.tmpl complete-registration.tmpl challenge.tmpl admin.tmpl layout.tmpl header.tmpl footer.tmpl error.tmpl ``` To change them you must **fork + rebuild**: 1. Fork `unmojang/drasl`. 2. Edit `view/*.tmpl` (reword, restructure, add help text/links). 3. Build a custom image, push to your registry (or build locally). 4. Point `image:` in compose at your fork. Maintenance cost: you now track upstream and rebase on releases. Only worth it if tier 2 + landing-page guide aren't enough. Alternative to forking: **build a thin custom frontend** that talks to Drasl's HTTP API (see `api.go`) for the one flow guests care about (login + skin upload), hosted at e.g. `${BASE_DOMAIN}/skins`. More code, but total UI control and no upstream coupling. Overkill for 4–10 friends. --- ## Recommended path for Ulicraft 1. **Tier 1**: `InstanceName = "Ulicraft Accounts"`, decide on bg/footer. 2. **Tier 2**: reskin `style.css` to match the landing page, swap logo + favicon. 3. **Landing-page guide**: add a `/skins` (or `/help`) page on the apex landing site — numbered steps + screenshots: register at `auth.`, log in, upload skin, done. This is what actually makes it noob-friendly; Drasl stays the plumbing. 4. Skip tier 3 unless a specific page is confusing enough to justify a fork. ## Related - Skin/cape config flags: see `plan/03-drasl.md` and CLAUDE.md gotchas. - `AllowTextureFromURL = true` lets guests paste a skin URL (e.g. from a skin site) instead of uploading a file — friendlier for non-technical users.