Spaces:
Running
title: PixelLock
emoji: π¨
colorFrom: purple
colorTo: indigo
sdk: docker
app_port: 7860
pinned: true
license: gemma
short_description: Footprint-locked AI pixel-art retexturing
models:
- solarkyle/pixellock-gemma-12b-pixelart-gguf
tags:
- gradio
- build-small-hackathon
- track:wood
- sponsor:modal
- achievement:offbrand
- achievement:welltuned
- achievement:llama
- achievement:sharing
- achievement:fieldnotes
- achievement:offgrid
- best-demo
- bonus-quest-champion
- pixel-art
π¨ PixelLock β AI Pixel-Art Retexturing
Upload a sprite, pick a vibe (or write your own), hit Run. PixelLock restyles the colors and shading while keeping the exact silhouette β pixel-perfect, guaranteed by construction.
β οΈ This Space runs on CPU (the hackathon org has no dedicated-GPU credits), so live edits won't run here. βΆ Try it live on GPU β https://huggingface.co/spaces/solarkyle/pixellock (cold-starts ~60s) β or watch the 45-second demo video linked below.
π Links
- π₯ Demo video: WATCH βΆ
- π£ Social post: SEE POST
- π§ Model (fine-tuned GGUF): https://huggingface.co/solarkyle/pixellock-gemma-12b-pixelart-gguf
- π Full technical writeup: read it
The idea: the wrong model on purpose
PixelLock does not use an image generator. It uses a fine-tuned text LLM
(Gemma-4-12B). The sprite is serialized to a tiny text wire β a PALETTE block
plus a GRID of space-separated cells β and the model rewrites that text in a
new style. The trick is a per-sprite GBNF decoding grammar (llama.cpp): every
transparent cell is pinned to a fixed literal, so the model is physically
incapable of moving a pixel. The footprint and transparency are preserved by
construction, not by luck. It's language modeling, not diffusion β and that's
exactly why the shape can never break.
In a benchmark, no model could emit a correct 32Γ32 grid unconstrained (~0/150 attempts); the grammar takes validity from 0% β 100% at every size (16Γ16 β 128Γ128, incl. 2Γ upscale), footprint-perfect every time.
The tech
- Fine-tuned model β QLoRA fine-tune of Gemma-4-12B (trained on Modal, A100-80GB) on a curated corpus of palette-indexed pixel-art sprites (β€64px); completion-only loss, step-checkpointing, final eval loss 0.378. Exported to GGUF (q4_k_m).
- Grammar-constrained decoding β a per-sprite GBNF grammar compiled from the input footprint; the silhouette is locked in the decoder, not post-filtered.
- Custom Gradio UI β a heavily themed
gr.Blocksinterface (Off-Brand) that builds the grammar per upload, footprint-checks the output, and shows you the raw text the model wrote. - Serving β Docker GPU Space running llama.cpp
llama-server(CUDA) with the per-request grammar; auto-sleeps when idle.
Built for the Build Small hackathon Β· Thousand Token Wood track.