nanites retro web designer (bundle of two LoRAs)
One repo, two fine-tuned LoRA adapters that turn a plain request into a complete pre-Y2K (1994-1999) web page with materialized image assets:
web/adapter/โ a Gemma-4-E4B-it QLoRA (bilingual 4B-class) fine-tuned on real archived pages (GeoCities / Tripod / Angelfire / personal sites) to emit era-correct HTML (<center>,<font>,<marquee>, table frames...).image/adapter/โ a Stable Diffusion 1.5 LoRA fine-tuned on GIFCities era GIFs (buttons, banners, dividers, backgrounds, clipart) so everysrc/backgroundin the generated page resolves to an on-era asset.
The two are loaded together in one process (fine on 8 GB) to produce a fully local, self-contained page.
Trigger tokens
| expert | token |
|---|---|
| web coder | retro web 1999 |
| image asset | retroweb90s |
Quick start (web coder)
import torch
from peft import PeftModel
from transformers import AutoModelForCausalLM, AutoTokenizer
base = "unsloth/gemma-4-E4B-it" # the base the LoRA trains against
model = AutoModelForCausalLM.from_pretrained(
base, torch_dtype=torch.bfloat16, device_map="cuda").to("cuda")
model = PeftModel.from_pretrained(model, "./web/adapter")
tok = AutoTokenizer.from_pretrained(base)
prompt = "retro web 1999, make me a website about my cat.\n<html>"
ids = tok(prompt, add_special_tokens=True)["input_ids"]
out = model.generate(
torch.tensor([ids]).to("cuda"), max_new_tokens=700,
do_sample=True, temperature=0.8, top_p=0.9)
print(tok.decode(out[0][len(ids):], skip_special_tokens=True))
The adapter config ships with local base paths blanked; pass your own
base explicitly. For the full generate flow (page + synthesized assets)
run the repo's generate.py --assets synth with these adapters mounted
at run/adapter/<expert>.
Quick start (image asset)
import torch
from peft import PeftModel
from diffusers import StableDiffusionPipeline
base = "stable-diffusion-v1-5/stable-diffusion-v1-5"
pipe = StableDiffusionPipeline.from_pretrained(
base, torch_dtype=torch.float16, safety_checker=None).to("cuda")
pipe.unet = PeftModel.from_pretrained(pipe.unet, "./image/adapter")
img = pipe("retroweb90s, a small 1990s web button graphic named boost.gif, "
"theme visiting, vintage 90s website clipart").images[0]
Samples
samples/ holds pages generated end-to-end by this bundle (LLM page + synth assets): goat soap, honda civic, personal notes, cat homepage.
Each *.html is openable directly; every image ref points at the sibling
file next to it.
Training
- web: QLoRA r16 on ~thousands of real 1994-99 archived pages
(
experts/retro_web_designer/data/); NF4 quantized linears + CPU embeddings on RTX 4070 8 GB, raw continuation (no distillation). - image: LoRA r16 on ~1500 curated GIFCities era GIFs (filtered, despeckled, deduped) at 256px (
experts/retro_image_designer/data/); SD1.5 UNet, fp16.
License
- The web adapter is a derivative of Gemma 4 weights (Gemma Terms of Use apply to the base and derivatives).
- The image adapter is a derivative of Stable Diffusion 1.5 UNet weights (CreativeML Open RAIL-M applies).
- Training pages are historical archives reproduced for research/art; training assets remain the property of their original creators.
Model tree for Nanite-Labs/nanites-retro-web-e4b-designer
Base model
stable-diffusion-v1-5/stable-diffusion-v1-5