diff --git a/custom/BetterF3-11.0.3-NeoForge-1.21.1.jar b/custom/BetterF3-11.0.3-NeoForge-1.21.1.jar new file mode 100644 index 0000000..5589011 Binary files /dev/null and b/custom/BetterF3-11.0.3-NeoForge-1.21.1.jar differ diff --git a/custom/BridgingMod-2.6.2+1.21.1.neoforge-release.jar b/custom/BridgingMod-2.6.2+1.21.1.neoforge-release.jar new file mode 100644 index 0000000..1d422b4 Binary files /dev/null and b/custom/BridgingMod-2.6.2+1.21.1.neoforge-release.jar differ diff --git a/custom/Controlling-neoforge-1.21.1-19.0.5.jar b/custom/Controlling-neoforge-1.21.1-19.0.5.jar new file mode 100644 index 0000000..e8d0868 Binary files /dev/null and b/custom/Controlling-neoforge-1.21.1-19.0.5.jar differ diff --git a/custom/ExplorersCompass-1.21.1-3.4.0-neoforge.jar b/custom/ExplorersCompass-1.21.1-3.4.0-neoforge.jar new file mode 100644 index 0000000..daab5cd Binary files /dev/null and b/custom/ExplorersCompass-1.21.1-3.4.0-neoforge.jar differ diff --git a/custom/FarmersDelight-1.21.1-1.3.2.jar b/custom/FarmersDelight-1.21.1-1.3.2.jar new file mode 100644 index 0000000..2fef351 Binary files /dev/null and b/custom/FarmersDelight-1.21.1-1.3.2.jar differ diff --git a/custom/FramedBlocks-10.6.0.jar b/custom/FramedBlocks-10.6.0.jar new file mode 100644 index 0000000..3a54aeb Binary files /dev/null and b/custom/FramedBlocks-10.6.0.jar differ diff --git a/custom/ImmediatelyFast-NeoForge-1.6.10+1.21.1.jar b/custom/ImmediatelyFast-NeoForge-1.6.10+1.21.1.jar new file mode 100644 index 0000000..fba292a Binary files /dev/null and b/custom/ImmediatelyFast-NeoForge-1.6.10+1.21.1.jar differ diff --git a/custom/Necronomicon-NeoForge-1.6.0+1.21.jar b/custom/Necronomicon-NeoForge-1.6.0+1.21.jar new file mode 100644 index 0000000..394687c Binary files /dev/null and b/custom/Necronomicon-NeoForge-1.6.0+1.21.jar differ diff --git a/custom/Patchouli-1.21.1-93-NEOFORGE.jar b/custom/Patchouli-1.21.1-93-NEOFORGE.jar new file mode 100644 index 0000000..610c901 Binary files /dev/null and b/custom/Patchouli-1.21.1-93-NEOFORGE.jar differ diff --git a/custom/Searchables-neoforge-1.21.1-1.0.2.jar b/custom/Searchables-neoforge-1.21.1-1.0.2.jar new file mode 100644 index 0000000..3e97e55 Binary files /dev/null and b/custom/Searchables-neoforge-1.21.1-1.0.2.jar differ diff --git a/custom/TravelersTitles-1.21.1-NeoForge-5.1.3.jar b/custom/TravelersTitles-1.21.1-NeoForge-5.1.3.jar new file mode 100644 index 0000000..4ee8a66 Binary files /dev/null and b/custom/TravelersTitles-1.21.1-NeoForge-5.1.3.jar differ diff --git a/custom/YungsApi-1.21.1-NeoForge-5.1.6.jar b/custom/YungsApi-1.21.1-NeoForge-5.1.6.jar new file mode 100644 index 0000000..859d5e2 Binary files /dev/null and b/custom/YungsApi-1.21.1-NeoForge-5.1.6.jar differ diff --git a/custom/appleskin-neoforge-mc1.21-3.0.9.jar b/custom/appleskin-neoforge-mc1.21-3.0.9.jar new file mode 100644 index 0000000..4028d08 Binary files /dev/null and b/custom/appleskin-neoforge-mc1.21-3.0.9.jar differ diff --git a/custom/architectury-13.0.8-neoforge.jar b/custom/architectury-13.0.8-neoforge.jar new file mode 100644 index 0000000..eb846ef Binary files /dev/null and b/custom/architectury-13.0.8-neoforge.jar differ diff --git a/custom/baguettelib-1.21.1-NeoForge-2.0.3.jar b/custom/baguettelib-1.21.1-NeoForge-2.0.3.jar new file mode 100644 index 0000000..2def853 Binary files /dev/null and b/custom/baguettelib-1.21.1-NeoForge-2.0.3.jar differ diff --git a/custom/cardboardboxes-1.21.1-0.1.2.jar b/custom/cardboardboxes-1.21.1-0.1.2.jar new file mode 100644 index 0000000..4868320 Binary files /dev/null and b/custom/cardboardboxes-1.21.1-0.1.2.jar differ diff --git a/custom/cloth-config-15.0.140-neoforge.jar b/custom/cloth-config-15.0.140-neoforge.jar new file mode 100644 index 0000000..8775b30 Binary files /dev/null and b/custom/cloth-config-15.0.140-neoforge.jar differ diff --git a/custom/comforts-neoforge-9.0.5+1.21.1.jar b/custom/comforts-neoforge-9.0.5+1.21.1.jar new file mode 100644 index 0000000..b28e247 Binary files /dev/null and b/custom/comforts-neoforge-9.0.5+1.21.1.jar differ diff --git a/custom/configured-neoforge-1.21.1-2.6.3.jar b/custom/configured-neoforge-1.21.1-2.6.3.jar new file mode 100644 index 0000000..0eeadf9 Binary files /dev/null and b/custom/configured-neoforge-1.21.1-2.6.3.jar differ diff --git a/custom/corpse-neoforge-1.21.1-1.1.13.jar b/custom/corpse-neoforge-1.21.1-1.1.13.jar new file mode 100644 index 0000000..4a8b68f Binary files /dev/null and b/custom/corpse-neoforge-1.21.1-1.1.13.jar differ diff --git a/custom/corpsecurioscompat-1.21.1-NeoForge-4.0.1.jar b/custom/corpsecurioscompat-1.21.1-NeoForge-4.0.1.jar new file mode 100644 index 0000000..84b322c Binary files /dev/null and b/custom/corpsecurioscompat-1.21.1-NeoForge-4.0.1.jar differ diff --git a/custom/curios-neoforge-9.5.1+1.21.1.jar b/custom/curios-neoforge-9.5.1+1.21.1.jar new file mode 100644 index 0000000..bdd9486 Binary files /dev/null and b/custom/curios-neoforge-9.5.1+1.21.1.jar differ diff --git a/custom/drippyloadingscreen_neoforge_3.1.2_MC_1.21.1.jar b/custom/drippyloadingscreen_neoforge_3.1.2_MC_1.21.1.jar new file mode 100644 index 0000000..fa80149 Binary files /dev/null and b/custom/drippyloadingscreen_neoforge_3.1.2_MC_1.21.1.jar differ diff --git a/custom/entity_model_features-3.2.4-1.21-neoforge.jar b/custom/entity_model_features-3.2.4-1.21-neoforge.jar new file mode 100644 index 0000000..ee704a7 Binary files /dev/null and b/custom/entity_model_features-3.2.4-1.21-neoforge.jar differ diff --git a/custom/entity_texture_features_1.21-neoforge-7.1.jar b/custom/entity_texture_features_1.21-neoforge-7.1.jar new file mode 100644 index 0000000..0d08799 Binary files /dev/null and b/custom/entity_texture_features_1.21-neoforge-7.1.jar differ diff --git a/custom/entityculling-neoforge-1.10.2-mc1.21.1.jar b/custom/entityculling-neoforge-1.10.2-mc1.21.1.jar new file mode 100644 index 0000000..b9fe8d5 Binary files /dev/null and b/custom/entityculling-neoforge-1.10.2-mc1.21.1.jar differ diff --git a/custom/fancymenu_neoforge_3.9.1_MC_1.21.1.jar b/custom/fancymenu_neoforge_3.9.1_MC_1.21.1.jar new file mode 100644 index 0000000..6a50f54 Binary files /dev/null and b/custom/fancymenu_neoforge_3.9.1_MC_1.21.1.jar differ diff --git a/custom/fastleafdecay-35.jar b/custom/fastleafdecay-35.jar new file mode 100644 index 0000000..09390e5 Binary files /dev/null and b/custom/fastleafdecay-35.jar differ diff --git a/custom/ferritecore-7.0.3-neoforge.jar b/custom/ferritecore-7.0.3-neoforge.jar new file mode 100644 index 0000000..a2d5384 Binary files /dev/null and b/custom/ferritecore-7.0.3-neoforge.jar differ diff --git a/custom/ftb-chunks-neoforge-2101.1.17.jar b/custom/ftb-chunks-neoforge-2101.1.17.jar new file mode 100644 index 0000000..7325763 Binary files /dev/null and b/custom/ftb-chunks-neoforge-2101.1.17.jar differ diff --git a/custom/ftb-essentials-neoforge-2101.1.9.jar b/custom/ftb-essentials-neoforge-2101.1.9.jar new file mode 100644 index 0000000..e10b627 Binary files /dev/null and b/custom/ftb-essentials-neoforge-2101.1.9.jar differ diff --git a/custom/ftb-library-neoforge-2101.1.31.jar b/custom/ftb-library-neoforge-2101.1.31.jar new file mode 100644 index 0000000..efb14d1 Binary files /dev/null and b/custom/ftb-library-neoforge-2101.1.31.jar differ diff --git a/custom/ftb-teams-neoforge-2101.1.10.jar b/custom/ftb-teams-neoforge-2101.1.10.jar new file mode 100644 index 0000000..ab07249 Binary files /dev/null and b/custom/ftb-teams-neoforge-2101.1.10.jar differ diff --git a/custom/ftb-ultimine-neoforge-2101.1.14.jar b/custom/ftb-ultimine-neoforge-2101.1.14.jar new file mode 100644 index 0000000..0bf1860 Binary files /dev/null and b/custom/ftb-ultimine-neoforge-2101.1.14.jar differ diff --git a/custom/functionalstorage-1.21.1-1.5.7.jar b/custom/functionalstorage-1.21.1-1.5.7.jar new file mode 100644 index 0000000..197903d Binary files /dev/null and b/custom/functionalstorage-1.21.1-1.5.7.jar differ diff --git a/custom/handcrafted-neoforge-1.21.1-4.0.3.jar b/custom/handcrafted-neoforge-1.21.1-4.0.3.jar new file mode 100644 index 0000000..8c10a92 Binary files /dev/null and b/custom/handcrafted-neoforge-1.21.1-4.0.3.jar differ diff --git a/custom/iris-neoforge-1.8.12+mc1.21.1.jar b/custom/iris-neoforge-1.8.12+mc1.21.1.jar new file mode 100644 index 0000000..edb687d Binary files /dev/null and b/custom/iris-neoforge-1.8.12+mc1.21.1.jar differ diff --git a/custom/jamlib-neoforge-1.3.6+1.21.1.jar b/custom/jamlib-neoforge-1.3.6+1.21.1.jar new file mode 100644 index 0000000..8907518 Binary files /dev/null and b/custom/jamlib-neoforge-1.3.6+1.21.1.jar differ diff --git a/custom/konkrete_neoforge_1.9.9_MC_1.21.jar b/custom/konkrete_neoforge_1.9.9_MC_1.21.jar new file mode 100644 index 0000000..789db30 Binary files /dev/null and b/custom/konkrete_neoforge_1.9.9_MC_1.21.jar differ diff --git a/custom/kubejs-neoforge-2101.7.2-build.368.jar b/custom/kubejs-neoforge-2101.7.2-build.368.jar new file mode 100644 index 0000000..909587a Binary files /dev/null and b/custom/kubejs-neoforge-2101.7.2-build.368.jar differ diff --git a/custom/kubejsdelight-1.1.6.jar b/custom/kubejsdelight-1.1.6.jar new file mode 100644 index 0000000..d92765e Binary files /dev/null and b/custom/kubejsdelight-1.1.6.jar differ diff --git a/custom/lithium-neoforge-0.15.3+mc1.21.1.jar b/custom/lithium-neoforge-0.15.3+mc1.21.1.jar new file mode 100644 index 0000000..d7722eb Binary files /dev/null and b/custom/lithium-neoforge-0.15.3+mc1.21.1.jar differ diff --git a/custom/lootr-neoforge-1.21.1-1.11.37.120.jar b/custom/lootr-neoforge-1.21.1-1.11.37.120.jar new file mode 100644 index 0000000..0afe5b9 Binary files /dev/null and b/custom/lootr-neoforge-1.21.1-1.11.37.120.jar differ diff --git a/custom/melody_neoforge_1.0.10_MC_1.21.jar b/custom/melody_neoforge_1.0.10_MC_1.21.jar new file mode 100644 index 0000000..64ceeed Binary files /dev/null and b/custom/melody_neoforge_1.0.10_MC_1.21.jar differ diff --git a/custom/morefunctionalstorage-1.2.3.jar b/custom/morefunctionalstorage-1.2.3.jar new file mode 100644 index 0000000..dc718d0 Binary files /dev/null and b/custom/morefunctionalstorage-1.2.3.jar differ diff --git a/custom/polymorph-neoforge-1.1.0+1.21.1.jar b/custom/polymorph-neoforge-1.1.0+1.21.1.jar new file mode 100644 index 0000000..db2ea5a Binary files /dev/null and b/custom/polymorph-neoforge-1.1.0+1.21.1.jar differ diff --git a/custom/ponderjs-neoforge-1.21.1-2.4.0.jar b/custom/ponderjs-neoforge-1.21.1-2.4.0.jar new file mode 100644 index 0000000..c723d22 Binary files /dev/null and b/custom/ponderjs-neoforge-1.21.1-2.4.0.jar differ diff --git a/custom/resourcefullib-neoforge-1.21-3.0.12.jar b/custom/resourcefullib-neoforge-1.21-3.0.12.jar new file mode 100644 index 0000000..7ff520d Binary files /dev/null and b/custom/resourcefullib-neoforge-1.21-3.0.12.jar differ diff --git a/custom/rhino-2101.2.7-build.85.jar b/custom/rhino-2101.2.7-build.85.jar new file mode 100644 index 0000000..386f868 Binary files /dev/null and b/custom/rhino-2101.2.7-build.85.jar differ diff --git a/custom/rightclickharvest-neoforge-4.6.1+1.21.1.jar b/custom/rightclickharvest-neoforge-4.6.1+1.21.1.jar new file mode 100644 index 0000000..e79b208 Binary files /dev/null and b/custom/rightclickharvest-neoforge-4.6.1+1.21.1.jar differ diff --git a/custom/simplemagnets-1.1.12c-neoforge-mc1.21.jar b/custom/simplemagnets-1.1.12c-neoforge-mc1.21.jar new file mode 100644 index 0000000..f923789 Binary files /dev/null and b/custom/simplemagnets-1.1.12c-neoforge-mc1.21.jar differ diff --git a/custom/sodium-extra-neoforge-0.8.7+mc1.21.1.jar b/custom/sodium-extra-neoforge-0.8.7+mc1.21.1.jar new file mode 100644 index 0000000..a681eff Binary files /dev/null and b/custom/sodium-extra-neoforge-0.8.7+mc1.21.1.jar differ diff --git a/custom/sodium-neoforge-0.8.12-alpha.4+mc1.21.1.jar b/custom/sodium-neoforge-0.8.12-alpha.4+mc1.21.1.jar new file mode 100644 index 0000000..ff18c69 Binary files /dev/null and b/custom/sodium-neoforge-0.8.12-alpha.4+mc1.21.1.jar differ diff --git a/custom/sophisticatedbackpacks-1.21.1-3.25.55.1852.jar b/custom/sophisticatedbackpacks-1.21.1-3.25.55.1852.jar new file mode 100644 index 0000000..50b1446 Binary files /dev/null and b/custom/sophisticatedbackpacks-1.21.1-3.25.55.1852.jar differ diff --git a/custom/sophisticatedcore-1.21.1-1.4.49.1976.jar b/custom/sophisticatedcore-1.21.1-1.4.49.1976.jar new file mode 100644 index 0000000..ecf4afd Binary files /dev/null and b/custom/sophisticatedcore-1.21.1-1.4.49.1976.jar differ diff --git a/custom/spark-1.10.124-neoforge.jar b/custom/spark-1.10.124-neoforge.jar new file mode 100644 index 0000000..d5fc090 Binary files /dev/null and b/custom/spark-1.10.124-neoforge.jar differ diff --git a/custom/supermartijn642configlib-1.1.8-neoforge-mc1.21.jar b/custom/supermartijn642configlib-1.1.8-neoforge-mc1.21.jar new file mode 100644 index 0000000..648062d Binary files /dev/null and b/custom/supermartijn642configlib-1.1.8-neoforge-mc1.21.jar differ diff --git a/custom/supermartijn642corelib-1.1.21-neoforge-mc1.21.jar b/custom/supermartijn642corelib-1.1.21-neoforge-mc1.21.jar new file mode 100644 index 0000000..db68908 Binary files /dev/null and b/custom/supermartijn642corelib-1.1.21-neoforge-mc1.21.jar differ diff --git a/custom/tagtooltips-neoforge-1.21.1-1.2.0.jar b/custom/tagtooltips-neoforge-1.21.1-1.2.0.jar new file mode 100644 index 0000000..06d4fd2 Binary files /dev/null and b/custom/tagtooltips-neoforge-1.21.1-1.2.0.jar differ diff --git a/custom/titanium-1.21-4.0.43.jar b/custom/titanium-1.21-4.0.43.jar new file mode 100644 index 0000000..a714504 Binary files /dev/null and b/custom/titanium-1.21-4.0.43.jar differ diff --git a/custom/torchmaster-neoforge-1.21.1-21.1.9.jar b/custom/torchmaster-neoforge-1.21.1-21.1.9.jar new file mode 100644 index 0000000..ff6df04 Binary files /dev/null and b/custom/torchmaster-neoforge-1.21.1-21.1.9.jar differ diff --git a/custom/trashcans-1.0.18c-neoforge-mc1.21.jar b/custom/trashcans-1.0.18c-neoforge-mc1.21.jar new file mode 100644 index 0000000..32379a1 Binary files /dev/null and b/custom/trashcans-1.0.18c-neoforge-mc1.21.jar differ diff --git a/custom/utilitarian-1.21.1-0.19.2.jar b/custom/utilitarian-1.21.1-0.19.2.jar new file mode 100644 index 0000000..eeafc48 Binary files /dev/null and b/custom/utilitarian-1.21.1-0.19.2.jar differ diff --git a/custom/voicechat-neoforge-1.21.1-2.6.18.jar b/custom/voicechat-neoforge-1.21.1-2.6.18.jar new file mode 100644 index 0000000..5b63c79 Binary files /dev/null and b/custom/voicechat-neoforge-1.21.1-2.6.18.jar differ diff --git a/custom/welcomescreen-neoforge-1.0.0-1.21.1.jar b/custom/welcomescreen-neoforge-1.0.0-1.21.1.jar new file mode 100644 index 0000000..f974e74 Binary files /dev/null and b/custom/welcomescreen-neoforge-1.0.0-1.21.1.jar differ diff --git a/custom/yeetusexperimentus-neoforge-87.0.0.jar b/custom/yeetusexperimentus-neoforge-87.0.0.jar new file mode 100644 index 0000000..f10ead8 Binary files /dev/null and b/custom/yeetusexperimentus-neoforge-87.0.0.jar differ diff --git a/custom/yet_another_config_lib_v3-3.8.2+1.21.1-neoforge.jar b/custom/yet_another_config_lib_v3-3.8.2+1.21.1-neoforge.jar new file mode 100644 index 0000000..562bb4f Binary files /dev/null and b/custom/yet_another_config_lib_v3-3.8.2+1.21.1-neoforge.jar differ diff --git a/pack/servers.dat b/pack/servers.dat new file mode 100644 index 0000000..509f486 Binary files /dev/null and b/pack/servers.dat differ diff --git a/plan/15-drasl-ui-customization.md b/plan/15-drasl-ui-customization.md new file mode 100644 index 0000000..97a130d --- /dev/null +++ b/plan/15-drasl-ui-customization.md @@ -0,0 +1,123 @@ +# 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.