Project Info
Inspiration
Paper Cuts started from a simple belief: play is one of the best ways people learn to build. Today, most people grow up consuming games, videos, and apps, but far fewer get to create them. We wanted to make game creation feel less like opening a complex engine and more like drawing an idea on paper. We are inspired by the creativity of childhood sketchbooks, playground games, paper prototypes, and the moment when someone says, “What if this was a level?” Paper Cuts is our attempt to turn that moment into something playable. We do not want to constrain people to one game mode, one visual style, or one fixed idea of what a game should be. Our goal is to give people tools that make creation feel immediate, playful, and approachable. What It Does Paper Cuts lets people create playable game worlds by drawing, editing, and remixing game pieces. At its core, it is a creation-first game platform. Players can draw ideas on an iPad or browser canvas, turn those drawings into game objects, and then play inside the world they made. The end-to-end loop: Draw a shape on the iPad canvas (or use a phone as a projector pen to draw directly into the shared scene). Recognize: a multi-tier perception stack names the drawing: a custom CNN fast-path for the common vocabulary, an open-vocabulary vision-language model for anything else, and retrieval-augmented recognition against a Redis vector memory of every doodle ever drawn. Enhance: the rough doodle is re-synthesized into a clean, on-style raster game sprite (label-conditioned image-to-image) and matted to a transparent asset, while preserving the kid's original shape. Compose mechanics: a neuro-symbolic composer turns the meaning of the drawing into actual gameplay: a sword swings, a drawn flame becomes a fire projectile that beats a drawn vine, a fruit heals, a star grants invulnerability, a spring launches you. Play: drag the object onto a live mini-map of the arena and it drops into the running match. Phones become gamepads via QR codes; the whole thing is built to be projected. Finish: the first item a fighter picks up imprints a generative cinematic finisher: a stylized KO sequence that ends the round in spectacle. How We Built It We built Paper Cuts as a multi-part web stack. Web App Game engine: vanilla JS + HTML5 Canvas. We deliberately avoided a heavyweight engine so we'd have direct control of the render loop, camera, physics, hitboxes, particles, and the procedural "marker-and-paper" art style (every stroke is drawn, never templated), with DPR-aware sizing for sharp projector output. Drawing surface: React + Vite + tldraw. A first-class iPad/browser drawing experience: freehand strokes, shapes, labels, and touch, with platform reference overlays so you can draw onto the world. Backend: FastAPI. Live rooms, drawing capture, semantic candidate generation, the clarification loop, generative-finisher jobs, the Paper Trail vector service, and WebSocket broadcasts. Realtime layer: Node.js relay. Serves the game, mints QR codes, hosts phone-controller pages, runs the phone-as-gamepad WebSocket relay (lobbies, slots, input edges), and proxies backend routes. AI Implementation We run a small fleet of powerful, specialized models: Recognizer — a multi-tier perception stack. A custom-trained CNN fast-path classifies the common vocabulary on-device in milliseconds; an open-vocabulary vision-language model handles true draw-anything recognition; and retrieval-augmented recognition (RAR) does k-NN vector search over our Redis doodle memory to recognize. The three are fused behind a single confidence-gated recognize() call. Recognizer — a multi-tier perception stack. A custom-trained CNN fast-path classifies the common vocabulary on-device in milliseconds; an open-vocabulary vision-language model handles true draw-anything recognition; and retrieval-augmented recognition (RAR) does k-NN vector search over our Redis doodle memory to recognize. The three are fused behind a single confidence-gated recognize() call. Caecae — our drawing-to-asset visual model. A multi-stage image-to-image pipeline that takes a child's rough, shaky doodle and re-renders it as a clean, flat, bold-outline raster game sprite without discarding the original shape. The training stack was deliberately layered for reliability and fidelity: SD1.5 floor compile (guaranteed) — a Stable Diffusion 1.5 baseline that was certain to compile, as a floor we could always fall back to. SDXL primary compile in parallel — SDXL as the high-fidelity target, compiled concurrently so the floor never blocked the ceiling. Teacher dataset on Colab — we distilled a teacher dataset of doodle→sprite pairs on Google Colab. InstructPix2Pix fine-tune — an instruction-conditioned fine-tune so a label-based semantic hint from the recognizer steers the edit (it knows it's cleaning up a sword, not a snake). Fuse the best base → serve, then tune — model-merge the strongest base, ship it, and keep tuning online. Output is raster-sprite + rembg background stripping, yielding a transparent, drop-in asset. We trained Caecae on AWS Trainium (trn1) accelerators, but were unable to compile/serve the model on them. Caecae — our drawing-to-asset visual model. A multi-stage image-to-image pipeline that takes a child's rough, shaky doodle and re-renders it as a clean, flat, bold-outline raster game sprite without discarding the original shape. The training stack was deliberately layered for reliability and fidelity: SD1.5 floor compile (guaranteed) — a Stable Diffusion 1.5 baseline that was certain to compile, as a floor we could always fall back to. SDXL primary compile in parallel — SDXL as the high-fidelity target, compiled concurrently so the floor never blocked the ceiling. Teacher dataset on Colab — we distilled a teacher dataset of doodle→sprite pairs on Google Colab. InstructPix2Pix fine-tune — an instruction-conditioned fine-tune so a label-based semantic hint from the recognizer steers the edit (it knows it's cleaning up a sword, not a snake). Fuse the best base → serve, then tune — model-merge the strongest base, ship it, and keep tuning online. Output is raster-sprite + rembg background stripping, yielding a transparent, drop-in asset. We trained Caecae on AWS Trainium (trn1) accelerators, but were unable to compile/serve the model on them. Moose — a neuro-symbolic mechanic composer. Instead of letting a black-box model rewrite our game, Moose composes mechanics from a safe-by-construction operation graph (operations × triggers × element tags). A LoRA-tuned model proposes the intent of a drawing; the graph guarantees a valid, non-crashing, balanced mechanic. Interactions (fire melts ice, fire burns through vines, water douses fire) are generated on the fly with element-tag algebra. Moose — a neuro-symbolic mechanic composer. Instead of letting a black-box model rewrite our game, Moose composes mechanics from a safe-by-construction operation graph (operations × triggers × element tags). A LoRA-tuned model proposes the intent of a drawing; the graph guarantees a valid, non-crashing, balanced mechanic. Interactions (fire melts ice, fire burns through vines, water douses fire) are generated on the fly with element-tag algebra. Asset isolation pipeline. Generated sprites pass through saliency-based matting (rembg / BiRefNet) and a connected-component "keep-largest" pass that strips backgrounds and stray decoration blobs, yielding clean transparent assets that drop straight into the scene. Asset isolation pipeline. Generated sprites pass through saliency-based matting (rembg / BiRefNet) and a connected-component "keep-largest" pass that strips backgrounds and stray decoration blobs, yielding clean transparent assets that drop straight into the scene. Generative finishers. The first item a fighter grabs imprints a cinematic KO, generated with a generative-video model (Pika via fal.ai) styled to the characters and scene, then cached and pre-baked so the spectacle lands with zero in-match latency. Generative finishers. The first item a fighter grabs imprints a cinematic KO, generated with a generative-video model (Pika via fal.ai) styled to the characters and scene, then cached and pre-baked so the spectacle lands with zero in-match latency. Paper Trail — Redis as our vector brain (sponsor track) Every doodle anyone draws is embedded and written into a Redis Stack (RediSearch) HNSW vector index alongside its confirmed label, composed mechanic, and a thumbnail — a living, shared visual memory of every drawing. Today that memory powers Retrieval-Augmented Recognition (RAR): a new drawing is embedded and recognized by k-NN vector search over the community's collective memory, so recognition gets smarter and cheaper the more people play — and we lean on the expensive, high latency VLM less and less. Redis is our vector brain and agent memory, not a TTL cache: RediSearch HNSW does the similarity search, and the doodle index is the model's long-term memory. The same vector memory is built to power "Déjà Draw" remixing and cross-room mechanic consistency for Moose; see What's Next. Realtime, multi-device coordination The desktop game has its own camera, zoom, and world coordinates; the iPad has a completely separate canvas. We built a coordinate-reconciliation layer so a stroke drawn over a platform reference lands pixel-correct in the real game world, and a WebSocket fan-out so phones-as-controllers, phones-as-pens, and the host screen all stay in lockstep. Challenges We Ran Into Training Caecae on Trainium. Getting Caecae to compile and train on AWS Trainium was a real fight, the toolchain had many unforgiving nuances. We hedged with a layered compile strategy: an SD1.5 floor that was guaranteed to compile while the SDXL primary compiled in parallel, a teacher dataset on Colab, an InstructPix2Pix fine-tune fused onto the best base, then serve-then-tune. We ultimately ran out of Trainium access before serving the full SDXL weights at our target latency, so we swapped in hosted inference for the live demo while keeping the trained pipeline intact. Latency vs. quality. Turning a doodle into a beautiful asset and a fast asset pull in opposite directions. We chased sub-500ms enhancement, profiled diffusion paths (including on-device distilled variants), and learned exactly where the quality/latency cap is for flat 2D art on custom trained models. We were also forced to introduce clever latency masking features after running out of Trainium access. Keeping the doodle a doodle. Generative models love to add realistic shading, depth, and motion at the cost of time. Preserving the crisp, flat, hand-drawn aesthetic through image-to-image (and especially generative-video) took heavy prompt constraint, strength tuning, label-conditioning, and rembg post-processing. How much should the AI control? We refused to ship a black box that silently mutates the game, so we built a clarification loop — the system proposes candidates, the player confirms or corrects and made mechanics safe-by-construction so a quick wrong guess never causes a crash. Redis as memory, not cache. Designing the doodle embedding, the RediSearch HNSW schema, and the retrieval-augmented recognition vote (so the vector memory improves recognition without ever blocking the game) was a difficult part of integration. Coordinate systems across devices. Reconciling the iPad canvas, the projector world, and phone inputs into one coherent, drift-free scene was a surprising amount of math. Orchestrating a fleet of models. Recognizer, Caecae, Moose, the generative-video finisher, and the Paper Trail vector service (plus graceful degradation when any one is slow, rate-limited, or offline). Accomplishments That We’re Proud Of A real draw → recognize → enhance → compose → play loop that feels like magic. A multi-tier, open-vocabulary recognition stack — CNN + VLM + retrieval-augmented recognition over a Redis vector memory. Caecae's layered diffusion training stack (SD1.5 floor + SDXL primary, Colab teacher set, InstructPix2Pix fine-tune, model fusion) on Trainium. Moose's neuro-symbolic, safe-by-construction mechanic composition — AI creativity with deterministic guarantees. Paper Trail — a living Redis (RediSearch HNSW) vector memory of every doodle that powers retrieval-augmented recognition. A character system where custom sketches animate through the same rig as the built-in cast. Generative cinematic finishers that turn a KO into a moment. Custom maps, portals, hazards, cannons, bouncy platforms, and breakable objects. Phone-as-gamepad and phone-as-projector-pen multiplayer over QR codes. Most importantly, we are proud that the project feels playful and isn't boring. You can draw something, make a choice, and see it become part of a game world. What We Learned We learned that making creation feel simple requires a lot of structure underneath. We also learned that game creation tools should not start with complexity. Most engines ask people to think like developers before they can play. Paper Cuts tries to reverse that: start with play, drawing, and imagination, then gradually expose more power. Technically, we learned a lot about real-time sync, WebSockets, canvas rendering, semantic object detection, structured game patches, and multi-device workflows. What’s Next For Paper Cuts Next, we want to expand Paper Cuts from a single playable prototype into a broader creation platform. The next steps are: Support more game modes beyond the current platform-fighter demo Let creators choose or define different art styles Add richer character creation and prop refinement Let users build rules, win conditions, pickups, enemies, and hazards Add better world saving, sharing, and remixing "Déjà Draw" discovery & remix and cross-room mechanic memory, built on the Paper Trail vector index — surface and remix kindred community creations. Collaborative multi-author creation and richer world saving, sharing, and remixing — scaling the Paper Trail vector memory into a global, cross-session creation graph. Create a smoother “draw → clarify → playtest” loop Add collaborative creation, where multiple people can draw and edit together The long-term dream is that Paper Cuts becomes a bridge from imagination to interaction. Instead of only consuming games, people can sketch, remix, test, and play their own ideas.
Doodle Smash
A hand-drawn 2D platform fighter (Super Smash Bros–inspired) rendered in a charcoal "soft marker" doodle style. Vanilla HTML5 Canvas + JavaScript — no build, no deps.
See GOAL.md for the project's north star: a live creation game where players draw characters, weapons, and hazards on an iPad and an AI pipeline injects them — refined and functional — into a projected match in real time. Runtime design: docs/13.
Working on this? Read docs/ first — especially
docs/02-aesthetic-rules.md, the visual contract that keeps the
whole game looking hand-drawn. It documents the architecture, mechanics, the character rig, the
draw tool, how to extend things, and the dev workflow.
Run it
Just open index.html in a browser (double-click it, or drag it into Chrome).
No server or install needed.
MagicBoard drawing
Local desktop and iPad testing can stay on HTTP:
cd backend
cp .env.example .env
# fill OPENAI_API_KEY and MAGICBOARD_VLM_MODEL for VLM classification
uv run uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
cd ../draw-client
npm install
npm run dev -- --host 0.0.0.0
cd ..
npm install
npm start
Open the desktop game with ?backend=http://YOUR-LAN-IP:8000&drawClient=http://YOUR-LAN-IP:5173/, then open the draw client on the iPad. The flow is doodle first: VLM classification can auto-confirm platform/spike/etc. candidates, and the iPad manual choice menu is the fallback when classification fails or is unavailable.
Provider keys belong only in backend/.env; do not put OpenAI keys in draw-client/.env.
Phone controllers (optional)
To let people join by scanning a QR code and use their phone as a controller (a landscape Brawlhalla-style pad — D-pad + jump/attack buttons + a special-aim joystick, up to 6 per lobby), run the bundled server:
npm install # one time (ws + qrcode, server-only)
npm start # → http://localhost:8080
Open that URL, hit ≡ Menu → Players for the QR, and point a phone at it. Deploy server.js to
any Node host (with HTTPS) for play across the internet. Full details: docs/11.
(The game itself still runs from file:// with the keyboard — the server is only for phone controllers.)
Optional URL hashes (handy for testing/demos; not the long-term product entry point):
index.html#play— jump straight into a matchindex.html#demo— attract-mode: two AI fighters battle on their ownindex.html#editor— open the editor (#editor-stage,#editor-settingsfor sub-tabs)
Controls (2 players, one keyboard)
| Player 1 | Player 2 | |
|---|---|---|
| Move | A / D | ← / → |
| Jump (×2) | W | ↑ |
| Crouch / drop-through | S | ↓ |
| Attack (melee) | F | . |
| Special (ranged) | G | / |
| Shield | Left Shift | Right Shift |
Enter start / rematch · P pause · ? (top-right) shows this in-app.
Mechanics: run, double jump, fast-fall (hold down in air), drop through soft platforms (down on a pass-through platform), shield, a melee attack and a ranged Special (throws a projectile), all with frame data, percent-scaled knockback by weight, stocks (hearts), blast-zone KOs, respawn, match timer.
Modes & maps
Open the ≡ Menu (top-right, also shown on load) to pick a mode and a map:
- Smash — the classic; knock rivals off the stage, last one with stocks wins.
- King of the Hill — stand alone on the high platform to bank time; first to 12s. Infinite respawns.
- Gem Grab — slow-drifting gems float through the air; first to grab 5.
- K.O. Rush — no stocks; every knockout scores, first to 5 K.O.s.
Maps: Meadow (the editable Editor stage), Twin Peaks, Sky Loft, Quarry, Ruins —
big themed arenas with background structures, plants, several material types, swinging platforms
you can ride, and breakable crates. Modes and maps are small registries in js/modes.js — see
docs/10 to add more.
Editor
Click the Editor tab. Everything is editable and saved to your browser (localStorage); use Export/Import to move setups between machines.
- Characters — pick a character + action (idle/walk/jump/attack/…), then reshape its pose with the joint sliders (the big canvas preview updates live). Tune stats (speed, jumps, weight, size) and, for attack/special, the hitbox + frame data.
- Draw — draw your own fighter over a faint "ghost" body. Each stroke is auto-sorted into the body part it lands on (head, body, both arms, both legs); lock a part with the buttons, or undo/clear. Because the drawing rigs onto the same skeleton, your character instantly animates through every move. Toggle "use drawing" off to fall back to the built-in stick figure. (Each part = vector strokes stored relative to its joint.)
- Stage — drag platforms to move them, drag a platform's bottom-right corner to resize, drag the dotted circles to reposition spawns, add/remove platforms, toggle pass-through.
- Settings — gravity, timer, stocks, knockback scale, hitstop.
Code map
| File | Role |
|---|---|
js/data.js | Data model (characters/poses, stage, settings) + localStorage store. Single source of truth. |
js/draw.js | Rough "marker" Canvas2D renderer + offscreen pose-cache + paper texture. |
js/character.js | Parametric doodle fighter: pose (joint angles) → line-art (used until a character has a drawn skin). |
js/skin.js | User-drawn "skins": 6 hand-drawn parts rigged to the same joints; stroke→part auto-assignment; mannequin guide. |
js/physics.js | AABB platformer collision (solid + pass-through). |
js/fighter.js | Movement, jumps, attacks, hitboxes, knockback, KO, render. |
js/stage.js | Platforms + doodle decorations. |
js/modes.js | Game modes (Smash/KotH/Gems/K.O. Rush) + map presets, as data-driven registries. |
js/effects.js | Juice: particles, screen shake, hitstop, KO bursts. |
js/game.js | Match flow, active mode/map, HUD (timer/%/hearts/scores/portraits), overlays, attract AI. |
js/editor.js | The editor tab. |
js/main.js | Canvas/DPR sizing, tabs, frame loop. |
Notes toward the AI creation pipeline
- Skin / stage / mechanic data is plain and serializable. AI-generated content (vector strokes,
data.stage.platformsrectangles, mechanic specs) flows through the same seams the editor uses, so the drawing pipeline, agents, and the editor all produce the data the game reads. See docs/13. - Rendering is isolated behind
draw.js;draw.getCached()pose-caches to offscreen canvases so per-frame cost stays low when many drawn entities are on screen. - (Optional, far-future) a computer-vision module could also generate
data.stage.platformsfrom detected real-world surfaces through the same seam — a nicety, not the goal. See docs/08.
Analysis
View
Metric
- 68
- 56
- 24
Figures cover GitHub contributors during the hackathon window. A co-authored commit counts in full for each author, so per-member totals add up to more than the whole-team figures.
Technology
- CSSIn code
- FastAPIIn code
- HTMLIn code
- JavaScriptIn code
- OpenAIIn code
- PythonIn code
- ReactIn code
- Node.jsClaimed
- PyTorchClaimed
- RedisClaimed
7 of 10 appear in the indexed code. 3 claimed on Devpost could not be matched to code, which may simply mean the tool leaves no trace in the repository.
AI coding agents
No AI coding agent signals were found in this repository.
Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.
Codebase size
Source size
1.5 MB
Source files
110
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
Jeremyliu-621/paper-cuts
134 files · 10.5 MB · @ dafd5e8
Structure
Interface
15 files · 11%Screens, components and styles rendered to the user.
Application logic
58 files · 43%Domain rules, services and shared utilities.
+4 more
Supporting
Layers are inferred from where files sit in the tree, not from reading the code. A project that names its directories unconventionally will read oddly here — open the file browser to check anything the diagram implies.
Languages
- JavaScript52%
- Python24%
- Markdown18%
- HTML3%
- CSS3%
- Shell0%
- Other (1)0%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
backend/pyproject.toml
pypi · 9- certifi
- fastapi
- httpx
- openai
- pillow
- pydantic
- python-dotenv
- uvicorn[standard]
- websockets
draw-client/package.json
npm · 5- @vitejs/plugin-react
- react
- react-dom
- tldraw
- vite
package.json
npm · 3- qrcode
- ws
- +1 more
Declared in the repository’s manifests at the indexed commit. A declared package is not proof it is used, and runtime dependencies are listed first.
Feature verification
AR pose-recorded custom ultimates via webcam MediaPipe pose landmarkerVerified
(Related capability found in codebase beyond core claims) webcam pose capture drives custom character ultimates
Claimed on readmehigh confidencejs/ultimateRecorder.js:9— loads MediaPipe pose_landmarker_lite model and runs PoseLandmarker to record a custom move clip
Confidence-gated fused recognize() call across CNN/VLM/RARVerified
The three [tiers] are fused behind a single confidence-gated recognize() call
Claimed on Devposthigh confidencejs/ai.js:357— single recognize() orchestrates RAR-first, CNN confidence check, then VLM fallback with background indexing
Custom CNN fast-path doodle recognizerVerified
A custom-trained CNN fast-path classifies the common vocabulary on-device in milliseconds
Claimed on Devposthigh confidenceservices/recognizer/serve.py:32— DoodleCNN nn.Module (2 conv layers + FC) loaded from model.pt/classes.json and served via /recognizetrain/train_recognizer.py— dedicated training script exists for the recognizer
Drag drawn object onto live mini-map to spawn into matchVerified
Drag the object onto a live mini-map of the arena and it drops into the running match
Claimed on Devposthigh confidencejs/main.js:134— mini-map of the arena section implementeddrawpad.html:602— comment confirms draw -> drag onto mini-map -> live spawn flow
Editor: characters, draw, stage, settings tabs with localStorage persistenceVerified
Editor tab lets you edit characters, draw fighters, edit stage, and tune settings, saved to localStorage
Claimed on readmehigh confidencejs/editor.js— editor tab module present matching README's documented editor feature setjs/data.js— README states this is the localStorage-backed single source of truth for character/stage/settings data
Element-tag algebra interactions (fire melts ice, fire burns vines, water douses fire)Verified
Interactions generated on the fly with element-tag algebra
Claimed on Devposthigh confidencejs/mechanics.js:33— ELEMENT_LABELS mapping (fire/water/ice/plant/poison/light/dark/metal/rock/wind) and elementWeapon() tag drawn elementsdocs/17-runtime-ai-pipeline-status.md:127— confirms DS.Graph.resolveContacts reaction table with 17 element pairs (fire+water fizzle, fire beats plant, dark+light annihilate)
FastAPI backend for live rooms, drawing capture, semantic candidates, clarification loop, WebSocket broadcastsVerified
Backend: FastAPI. Live rooms, drawing capture, semantic candidate generation, clarification loop, generative-finisher jobs, Paper Trail vector service, WebSocket broadcasts
Claimed on Devposthigh confidencebackend/app/main.py— FastAPI app wiring paper_trail router, finishers, rooms, orchestratorbackend/app/semantic.py:523— build_semantic_draft() generates semantic candidates/questions for the clarification loopbackend/app/rooms.py— room state management module present
Fighting game modes and maps (Smash, KotH, Gem Grab, K.O. Rush)Verified
Multiple modes and maps implemented as data-driven registries
Claimed on readmehigh confidencejs/modes.js— modes/maps registry file exists as described in README code map
Generative cinematic KO finishers via Pika (fal.ai)Verified
First item picked up imprints a generative-video KO finisher styled to characters/scene, via Pika through fal.ai, cached and pre-baked
Claimed on Devposthigh confidencebackend/app/finishers.py:15— PIKAFFECTS_MODEL/PIKAFRAMES_MODEL fal-ai/pika model IDs, job submission to queue.fal.run, caching via _cache_keyjs/finishers.js— frontend finisher module wired per docs/17 into index.html
iPad/browser drawing surface (tldraw)Verified
React + Vite + tldraw first-class drawing experience with freehand strokes/shapes/labels/touch
Claimed on Devposthigh confidencedraw-client/src/App.jsx:13— imports from 'tldraw' and mounts <Tldraw> componentdraw-client/package.json— tldraw 5.1.1 and vite listed as dependencies
Neuro-symbolic mechanic composer (Moose/CHLOE) with LoRA-tuned intent model and safe operation graphVerified
A neuro-symbolic composer with a safe-by-construction operation graph (operations x triggers x element tags); LoRA-tuned model proposes intent, graph guarantees valid/balanced mechanic
Claimed on Devposthigh confidenceservices/chloe/serve.py:55— graph_config-driven /mechanic server with Claude teacher or local PEFT/LoRA student backend, clamp_spec() enforces bounded valid paramstrain/train_chloe_peft.py— LoRA/PEFT training script for the mechanic composerdocs/17-runtime-ai-pipeline-status.md:40— status doc confirms CHLOE (Qwen3-0.6B + PEFT LoRA) is core and in active use, run through js/graph.js deterministic VM
Node.js realtime relay: serves game, mints QR codes, phone-controller pages, phone-as-gamepad WS relay, proxies backendVerified
Realtime layer: Node.js relay serving the game, minting QR codes, hosting phone-controller pages, running phone-as-gamepad relay, proxying backend routes
Claimed on Devposthigh confidenceserver.js:19— qrcode generationserver.js:434— lobby/controller WebSocket relay with slotsdocs/17-runtime-ai-pipeline-status.md:231— confirms server.js hosts /fal-enhance and /vlm-recognize proxy routes to backend/third-party APIs
Open-vocabulary VLM recognition fallbackVerified
An open-vocabulary vision-language model handles true draw-anything recognition
Claimed on Devposthigh confidencejs/ai.js:62— connectVLM() wires a VLM endpoint used as recognition fallbackdocs/17-runtime-ai-pipeline-status.md:42— status doc confirms VLM (OpenAI gpt-4.1-mini) is in use as fallback when CNN isn't confident
Phone as gamepad via QR codesVerified
Phones become gamepads via QR codes, up to 6 per lobby
Claimed on Devposthigh confidenceserver.js:19— requires 'qrcode' package and generates SVG QR via QRCode.toStringserver.js:435— lobby relay supports up to MAX_PLAYERS controller slots with join/host protocol
Phone controller pad (D-pad, jump/attack buttons, special-aim joystick, up to 6 per lobby)Verified
A landscape Brawlhalla-style pad with D-pad + jump/attack buttons + special-aim joystick, up to 6 per lobby
Claimed on readmehigh confidenceserver.js:435— lobby Map keyed by host + up to MAX_PLAYERS slot-keyed controllers
Retrieval-augmented recognition (RAR) via Redis vector memory (Paper Trail)Verified
Retrieval-augmented recognition against a Redis vector memory of every doodle ever drawn, k-NN via RediSearch HNSW
Claimed on Devposthigh confidencebackend/app/paper_trail.py:83— ensure_index() creates a RediSearch HNSW VectorField index; knn() runs KNN query; recognize_via_retrieval() does weighted votejs/ai.js:365— recognize() calls _recognizeRar(strokes) against paperTrailEndpoint before/alongside CNN/VLM, with fire-and-forget indexing
Vanilla JS/HTML5 Canvas game engine with DPR-aware renderingVerified
Game engine built with vanilla JS + HTML5 Canvas, no heavyweight engine, DPR-aware sizing
Claimed on readmehigh confidencejs/main.js:10— DS.DPR = Math.min(2, devicePixelRatio) drives canvas sizing; no engine framework imports across js/*.js
Asset isolation via saliency matting (rembg/BiRefNet) + connected-component keep-largest passCode-supported
Generated sprites pass through saliency-based matting (rembg/BiRefNet) and a connected-component keep-largest pass
Claimed on Devpostmedium confidenceservices/caellum/serve.py:24— rembg.remove() referenced for background stripping in the (dropped) Caecae serviceserver.js:211— comment references '_isolateDoodle' keep-largest connected-component cleanup used client-side in the actually-shipped pipelinedocs/17-runtime-ai-pipeline-status.md:80— status doc explicitly states BiRefNet was tried server-side and 'dropped' for grabbing the wrong region; live isolation is pure client-side JS connected-components, and background removal in the shipped path is via third-party Bria, not rembg/BiRefNet
Caecae training stack: SD1.5 floor + SDXL primary + InstructPix2Pix fine-tune + model fusion, trained on AWS TrainiumCode-supported
Layered training stack (SD1.5 floor, SDXL primary compile, Colab teacher dataset, InstructPix2Pix fine-tune, model fusion) trained on AWS Trainium (trn1), unable to compile/serve on it
Claimed on Devpostmedium confidenceservices/caellum/serve.py:86— NeuronStableDiffusionControlNetPipeline (sd15) and NeuronStableDiffusionXLControlNetPipeline (sdxl) referenced for Trainium/Neuron servingtrain/train_caellum_ip2p.py— InstructPix2Pix training script existsdocs/17-runtime-ai-pipeline-status.md:106— doc confirms Trainium access was lost and CAELLUM was ultimately dropped from the live product; matches the claim's own admission of inability to compile/serve on Trainium
Label-conditioned image-to-image doodle-to-sprite enhancement (Caecae)Code-supported
Rough doodle re-synthesized into a clean on-style raster sprite via label-conditioned image-to-image, preserving shape
Claimed on Devpostmedium confidenceservices/caellum/serve.py:77— SD1.5/SDXL ControlNet (scribble/canny) img2img pipeline existsdocs/17-runtime-ai-pipeline-status.md:43— project's own status doc states CAELLUM was 'Dropped'; live pipeline actually uses third-party Recraft v3 text-to-image via server.js /fal-enhance, not the trained Caecae model
Phone/camera as projector pen drawing into shared sceneCode-supported
Use a phone as a projector pen to draw directly into the shared scene
Claimed on Devpostmedium confidencedrawpad.html:602— comment describes iPad draw pad QR flow (draw -> drag onto mini-map -> live spawn); phone controller is a joystick/buttons pad per server.js, not explicitly a drawing surface
An AI agent derived these features from the project’s Devpost page and readme, then searched the code for each one. Verified features are backed by cited code; claimed-only features had no supporting code, which is not by itself proof a feature is missing.
Export this project's context (description, README, evidence, key source files) to chat with an AI agent elsewhere.