--- language: - en license: other tags: - nanites - retro-web - text-generation - text-to-image base_model: - unsloth/gemma-4-E4B-it - stable-diffusion-v1-5/stable-diffusion-v1-5 library_name: peft pipeline_tag: text-generation --- # nanites retro web designer (bundle of two LoRAs) ![A pre-Y2K web designer's desk](media/retro_web_designer.jpg) 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 (`
`, ``, ``, table frames...). - `image/adapter/` — a **Stable Diffusion 1.5** LoRA fine-tuned on GIFCities era GIFs (buttons, banners, dividers, backgrounds, clipart) so every `src`/`background` in 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) ```python 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" 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/`. ## Quick start (image asset) ```python 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.