Case study · for Cheddar
DawgHouser / Puppy Mixer.
A dog-breed encyclopedia, mixer, and storytelling app. Pick two breeds, meet each one (analytics + ratings + a vivid short story), then click MIX to see what kind of beautifully chaotic puppy these two characters could produce. Built for my fiancée. Single-file app, live here.
Status
V2 — live
Breeds
61 entries
Stack
Vanilla JS
Hosting
GitHub Pages
What it does
Pick two breeds from the encyclopedia. Each gets a profile — analytics, ratings, a short story written in the locked DawgHouser voice (warm, irreverent, vet-meets-dog-magazine-columnist). Click MIX. A deterministic compatibility engine runs a 6-factor weighted score against a 12-template scenario bank, and lands a puppy with parents-trot-in → DNA-pulse → reveal.
What's actually in the box
- 61 breed entries — 50 standard + 4 pit family + 3 mastiff variants + 3 Wild Cards (Wolf, Coyote, Dingo, gated behind a Mix Lab toggle) + a hidden 51st Cheddar memorial card.
- Deterministic mix engine — 6-factor weighted compatibility + 12-template scenario bank in
lib/mix-engine.js. No randomness, no LLM call at runtime — same inputs always produce the same puppy. - Wikimedia hero photos — ~60 CC-licensed photos fetched and attributed by
scripts/fetch-breed-photos.py, with auto-generatedATTRIBUTION.md. - 3D preview — self-hosted
<model-viewer>loads a Quaternius dog GLB if dropped inassets/; SVG fallback otherwise. - Hidden Cheddar memorial — click the 🧀 in the footer five times to unlock. Persists in localStorage.
Why it's here
The intentional smallness is the point. One HTML file (~1700 lines) plus data and scripts. No build step, no framework, no API. Runs equally well from file:// or GitHub Pages. It exists to prove that NEWƎИ can ship a complete public tool without hiding behind a heavy stack.
Voice
The whole app speaks in one register, locked in docs/dawghouser-voice-style-guide.md. Every breed story and mix scenario was written or rewritten to match.
