DEV Community

Elias Shieh
Elias Shieh

Posted on Edited on AI-assisted

I can't draw. My AI ghosts named my crab, then turned it into a spider.

Hacktoberfest Open-Source AI Challenge: Ghost in the Machine Submission 👻🌼

This is a submission for the Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine

What I Built

I whispered "a crab with enormous claws" to a table of AI ghosts.

The first ghost drew it. The second ghost looked at the drawing and said "a caterpillar with a propeller on its head."

Then it was my turn. I can't really draw, but I drew my crab. The next ghost said "A crab with a single antenna that sticks straight up—odd for its species."

The ghosts took it from there. The last one said "spider with a face and spider legs."

The whole crab round in seven steps: my whisper, Pip's drawing, Dot's caterpillar guess, my crab drawing, Moth's guess, Hush's drawing, and Wisp's spider guess.

That is Monster Telephone: the party game Telephone, played with ghosts. You are the only living player at the table. Each ghost sees only the turn before it, so you are the only one who remembers the original. When they lose your monster, you draw it back into the story. At the end you see your monster beside what it became.

The challenge asks about the memories and stories we carry. Here the ghosts carry nothing from one turn to the next, so the player has to.

Drawing is optional, and a ghost can take your turn. There is no score and nothing to bet. It's for anyone who can't draw and has nobody around to play Telephone with.

I wanted this game to be fun, cute and surprising. I can't draw, but I still get a turn to draw my monster back into the story.

Demo

Play: monstertelephone.tech

Press "Watch one go wrong" for a 15-second recorded chain. The first one is the crab above, with my real drawing. Press "Try saving a monster" for a live round. The server sleeps when nobody is playing, so the first turn can take a minute.

The table is Pip the enthusiast, Dot the overthinker, Moth the dreamer, Hush the worrier and Wisp the dramatist. When your turn comes, the page shows your original whisper and a sheet of paper.

The "Draw it back" screen. A note says "They've lost your monster" above my whisper, and my crab is on the paper. Five small ghosts sit around the stage.

At the end the page shows your whisper beside what came back. "Save this chain" downloads the round as a picture, and "Copy chain link" gives you a link to send to a friend.

The page ships with nine recorded rounds. In these four, a ghost took the player's turn.

Four recorded rounds. A ghost wearing a tiny crown ended as a cat with tarantula legs. A teapot with human feet ended as a stickman. A cat with a second head ended as an animal with chest fur. A very polite vampire ended as a deer with thin legs.

Code

GitHub logo ting-hong-shieh / monster-telephone

Telephone with monsters: keep yours alive through a table of AI ghosts

Monster Telephone

Telephone with monsters. You whisper a monster to a table of AI ghosts. One draws it, the next guesses from the drawing alone, and the story drifts. You are the only one who remembers the original, so at your turn you try to draw it back.

Play at monstertelephone.tech.

How it works

The ghosts run on open-weight models through Tinker:

Role Model Sees
Artist Qwen3.5-4B, fine-tuned The whisper only
Listener Qwen3.5-4B The drawing as a picture, not the whisper

The fine-tune

Qwen3.5-4B alone often fails to finish a clean line drawing. Qwen3.6-35B draws well but is larger. teach.py had the larger model draw 1,200 monsters and kept the 955 that passed a strict check. learn.py fine-tuned the small model on them with a rank 64 LoRA for 3 epochs.

Evaluation used 60 prompts about six creatures absent from training, sampled twice each:

Model Valid drawings Mean
…

How I Built It

How one round runs

you whisper a monster
  -> Pip draws it (fine-tuned Qwen3.5-4B)
  -> Dot looks at the picture and guesses (Qwen3.5-4B)
  -> you draw it back, or a ghost takes your turn
  -> Moth guesses, Hush draws, Wisp guesses
  -> you see your monster beside what it became
Enter fullscreen mode Exit fullscreen mode

Each ghost sees only the turn before it. Only you see the whole chain. The five ghosts share two models: the fine-tuned artist draws, and plain Qwen3.5-4B guesses.

How the project runs in three columns. Train on Tinker: the teacher draws, a strict check keeps 955, then the fine-tune. Serve on Render: the FastAPI server, drawing to picture, two ghosts on Tinker. Play on the web: the domain, the static page, the recorded rounds.

The game had a hole

My first design asked the player to guess and bet along the way. While reading it through, I asked why I could not just insist on my own drawing, since I was the one who set the question. The player already knows the answer, so the guessing was fake.

That question changed the round. The player's memory became the turn. Betting and the score both went.

The small model could not finish a drawing

I wanted the smallest model that could do the job, but Qwen3.5-4B often failed to finish a clean line drawing. So I had a larger model teach it.

  1. Qwen3.6-35B drew 1,200 monsters as SVG.
  2. I kept the 955 that passed a strict check.
  3. I fine-tuned Qwen3.5-4B on them with Tinker: a rank 64 LoRA, 3 epochs, 180 steps. I later retrained it the same way so the weights could be exported.
  4. I tested all three models on 60 prompts about six creatures that were not in training, two samples each.
Model Valid drawings Mean tokens Mean seconds
Qwen3.5-4B 54 / 120 765 4.2
Qwen3.5-4B, fine-tuned 117 / 120 (118 / 120 on the retrain) 591 4.0
Qwen3.6-35B 92 / 120 830 5.4

Valid means the reply parses, has 3 to 14 unfilled paths, stays inside the canvas, and finishes within 1,100 tokens. Half of the small model's failures were replies that hit that limit. For a live game this matters: a player can't wait for a drawing that never ends, and the fine-tuned model almost always ended.

Here are the three models on the same four prompts: the first prompt for each of the first four creatures in the test, first sample, from the first training run.

Four test prompts across three models. The base 4B model passed on two and failed the check on two. The fine-tuned model and the 35B teacher passed on all four.

Then I ran a review on my first draft of this post. It pointed out that the check only looks at the file format. The student had beaten its teacher on a test that never asks what the drawing shows.

The blind test

I rendered 89 drawings from the first training run and made a page that hid the model and the prompt. Then I tried to name each creature from six choices. Picking at random would be right 1 time in 6.

You can try it too. These six came from the large model, one for each creature: crab, goat, lantern, moth, radio, witch. I took the first of each creature in the test file.

Six line drawings labelled A to F, for the reader to name.

My answers, and the real ones
Drawing The prompt I said
A a radio with a mouth on its belly dancing radio
B a moth with long thin arms waving hello moth
C a witch with stitches looking very polite witch
D a goat with a forked tongue crab
E a lantern with long thin arms grinning lantern
F a crab with one enormous eye goat

Four of six flatters me. Over all 30 drawings from this model I named 7.


The whole test:

Model I named the creature
Qwen3.5-4B 1 / 29
Qwen3.5-4B, fine-tuned 2 / 30
Qwen3.6-35B 7 / 30

I answered "can't tell" for 66 of the 89. By the rule I wrote before the test, the gap between student and teacher is inconclusive. What I can say is smaller: the fine-tune taught the model to finish a drawing. I could not see that it taught the model to draw a goat.

The ghosts could not read

The listener first read each drawing as SVG text. I sent it 18 drawings from the large model, three guesses each. It named the right creature 0 times out of 54. I drew one of each creature myself: 0 out of 18.

So the rescue did nothing. A player's drawing went into the chain and the ghost could not see it.

Qwen3.5-4B can also read images, so I rendered the same drawings as pictures and ran the same test with the same rules.

Drawings Ghost reads SVG text Ghost reads a picture
Large model's 0 / 54 0 / 54
Mine 0 / 18 4 / 18

My six drawings: crab, moth, lantern, witch, goat and radio. Beside each is the first guess from the ghost reading SVG text and the first from the ghost reading a picture. The crab was named 3 of 3 times, the moth 1 of 3, the others not at all.

Each row shows the first of three guesses, and the count covers all three. Three of the four hits came from one crab and the fourth from a moth called a butterfly. The rule used a fixed word list, so near misses scored nothing: "a lightbulb head" for the lantern, a hat twice for the witch, horns for the goat, a square head or body twice for the radio. Six drawings by one person who can't draw is not a rate. But it changed the game, and the live server now shows the ghosts pictures. In the recorded crab chain, my crab lasted one turn: the ghost named it, drew it, and the next ghost saw a spider.

Making the wait feel like a game

A live round once took 31.4 seconds from pressing Done to the reveal on a desktop, and 27.5 on a phone. The ghosts were waiting for animations to finish before they called the model. I moved each call into the animation before it and sent your drawing the moment you press Done. It now takes 21.0 seconds on a desktop and 20.7 on a phone.

Where it runs

  • Tinker trained the artist and serves both ghosts.
  • Render hosts the FastAPI server on the free plan. It keeps the Tinker key, draws each picture for the listener, and limits use to 30 requests a minute and 2,000,000 tokens a day. After a sleep, it took 62.7 seconds to answer.
  • DigitalOcean App Platform hosts the static page for free, and DigitalOcean DNS runs the domain.
  • .tech domain: monstertelephone.tech is the game's address.
  • ElevenLabs made the voice, the music and the sound effects in the demo film. The game itself does not use it.

The first idea failed

I started on something else: a small version of a 2026 Nature paper in which a model that loved owls wrote lists of numbers, and another model trained on those numbers came to love owls too. On Tinker with Qwen3.5-4B, my pilot gave 21 of 300 against 10 of 300 for the control, and the replay gave 41 of 600 against 39 of 600. The rule I set before the replay said to stop, so I stopped. My run was small, so this says nothing against the paper.

Why Does Open Innovation Matter?

When the drawings failed, I could change the weights of a small model for one narrow job with 955 examples. Both Qwen models are Apache-2.0, so I could train one on the other's drawings and publish those drawings.

OpenAI's fine-tuning, the closed route for that fix, is ending. Its docs say OpenAI is "winding down the fine-tuning platform" and that the platform is "no longer accessible to new users." A new account could not train this artist there today.

The artist is a file. The rank 64 LoRA is in the artist-2 release, and the live game runs that same checkpoint. Tinker only lets you export a training checkpoint, so I retrained to get one. I have not run the weights outside Tinker yet.

The training drawings and all test results are in the repository, including my blind answers and every guess.

I have used $16.66 of Tinker credit: I started with $20 and the billing page now shows $3.34 left.

Prize Categories

  • Best Use of Tinker: The category asks for a fine-tune that beats a baseline. On 60 prompts about creatures outside the training set, the same 4B model went from 54 of 120 valid drawings to 117 of 120, and to 118 on the retrain that became the public weights. It passed the 35B model that taught it (92 of 120). Tinker ran the whole loop, from the teacher drawings to both ghosts in the live game. The validity test showed that the fine-tune finishes drawings. My blind test did not show that the drawings got better.
  • Best Use of Render: Render is the game's AI runtime. Every live turn goes through the FastAPI server, which keeps the Tinker key, turns the player's drawing into a picture the ghost can read, and enforces the rate and token limits. It runs on the free plan, so it sleeps, and the page tells the player that the ghosts are waking up.
  • Best Use of DigitalOcean: App Platform hosts the whole game page for free, and DigitalOcean DNS runs the domain. The recorded rounds ship with the page and need no server, so a visitor can watch the crab chain while the live server is still asleep.
  • Best Use of a .tech Domain: I claimed monstertelephone.tech through Hacktoberfest, and it is the game's only address. It is where the live game runs, and it is the last thing on screen in the demo film.
  • Best Use of ElevenLabs: The category suggests narration for a demo, and I went further. ElevenLabs voices say the five narration lines in the film. The march, the tape rewind, the pencil, the paper and the small ghost cheer all came from its sound generator. The music breaks when the ghosts lose the crab.

How this was made

Claude Code wrote the Python, ran the training and tests, and wrote the first draft of this post from my decisions. An AI stand-in drafted the "fun, cute and surprising" lines near the top and "Why Does Open Innovation Matter?" from my notes, and I read them before publishing. Codex built the page and, when I asked, reviewed the game design as a producer would. I chose the game rules, approved the tests, did the blind test, and drew the crab.

For the film, Claude Code wrote the Blender stage, the web animation and the mix as code. The ghosts' table is staged. Every drawing and guess on it comes from a recorded round, and the crab is my real drawing, stroke by stroke.

A still from the film: Dot, a clay-like ghost with round glasses, peers over a sheet of paper holding Pip's drawing.

What would you whisper to the ghosts? Tell me in the comments what your monster turned into.

Top comments (0)