NEWƎИ

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-generated ATTRIBUTION.md.
  • 3D preview — self-hosted <model-viewer> loads a Quaternius dog GLB if dropped in assets/; 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.