Inspiration

Every child carries a world in their head: a castle on the moon, a ferry that never comes, a dragon who is a friend. Building those worlds goes with creativity. In two studies, about 17% of 8- to 12-year-olds described an imaginary world of their own in detail, and those children scored higher on a creative storytelling task (Taylor et al., Child Development). MacArthur Fellows were about twice as likely as students to have built one as children (Root-Bernstein & Root-Bernstein, 2006).

Yet the biggest screen in most homes only shows children other people's worlds. Screens fill hours that free play used to, and one large analysis of creativity tests found American children's scores falling after 1990, most among the youngest (Kim, 2011; a later reappraisal disputes the decline). Whatever the trend, the worlds in their heads stay there: a notebook can't hold one, a sketch doesn't answer back, nothing remembers what they made last week, and a six-year-old can't type theirs up at all.

We wanted the TV in the living room to keep theirs, and to make making things up something a child does with it, not just something they watch. It's for the grown-ups who still carry worlds too: artists, writers, people who build worlds for fun.

What it does

Inkwash turns the Fire TV remote into a brush. You draw a piece of your world, a storyteller tells it back as a story, and every chapter becomes part of a world the TV remembers. No typing, at any age. Each world opens on its map: the world seen from above as a hand-inked atlas, everything ever drawn into it marked where it stands; choose a place and the map grows round it until you are in your world there.

A chapter, in five steps:

  1. Draw with the remote. OK touches down, the arrows steer, ▼ brightens the line (hold it and it glows), ▲ fades it, « and » change the ink. You draw straight into your world, as light.
  2. Show how it felt. ▶‖ plays the drawing back while you hold brighter or darker, calmer or wilder; or pick one word.
  3. Hear it told. The storyteller sees the drawing as you see it, and everything in your world so far; it starts looking while you mark how it felt, so there is a turn less to wait. It may ask a question, with answers to choose (one that names something in your world carries its picture, for a child who can't read yet). Then it tells the drawing back as a story, a line at a time, read aloud. ▲ keeps a line, ▼ says "not quite" and it tries again. For a child it is a little story with their world's friends in it, and what they drew stays what they said it was.
  4. It wakes up in its place. No world has a set background: the Set Designer writes where yours stands from its story (a lamplit library, a still lake at first light), the TV draws it, and an image model (Google's Gemini) can paint it, and each thing in it, held to the shapes you drew. Every picture after the place is painted with the place as its style reference, so the things and the chapter's picture look made by the same hand as the world they stand in. Then home is repainted as one picture, the place and everything in it together. Choose See all around it and it widens into a panorama to look across with ◀ ▶; Paint it again and it comes back in another look.
  5. It's remembered. Come back on Friday and it opens like a series: Previously in Star's world. Draw the rocket again and the storyteller asks if it's the same rocket, with Tuesday's drawing beside tonight's. What happens next? lets you draw the story on, or change its ending.

Or write it instead. No time to draw with a remote? Write a story instead: scan the code on the TV and say or type it on your phone, or pick a starting idea with the remote. The storyteller reads the feeling in your words, tells it back a line at a time, and one picture is painted from them while it tells.

Around it: walk among everything you ever drew and hear the stories each thing came in; step inside a drawing as it opens like a pop-up book; answer the Worldbuilder's questions about your world (from its second chapter, each night closes on one, still waiting next time if the TV goes off); page through it as a picture book. Each person in a family picks a seal instead of typing a name and keeps a world of their own, and the worlds can meet: send something of yours to visit your sister's, and her storyteller may bring it into her story. It stays yours. For a child, everything is read aloud and the telling is kept kind in code. Choose Forget on a thing and it goes, with everything that grew from it, and nothing else does. Left alone, the TV becomes a frame for the family's drawings.

The first time Inkwash opens, it shows all this in twenty seconds: a child's drawing draws itself as light, is told back, and wakes up as their world, chapter after chapter.

How we built it

On the TV. A Vega OS app (React Native for Vega) holding one full-screen WebView; the page ships as a single file, because the WebView loads it from file://. The ink is a WebGL2 simulation (a wet layer that runs and dries, a halo where wet meets dry) shown as light, from a brush of 16 clumps of bristles. Their world, walking through it and stepping inside are drawn on the GPU, and the ink takes fewer wet steps a second on a stick that can't keep up.

Four agents, and code where code will do. The brush, the ink, the places and every check are code; a model is asked only where judgement is wanted.

  • The storyteller (a large model, built for Amazon Bedrock and called through Anthropic's API until our account can reach Bedrock) is an agent whose hands are on the TV. The loop runs on the TV, which carries out its eight tools: look at the drawing, strokes, recall and night to search past chapters, thing, ask, tell, remember.
  • The Worldbuilder, the Illustrator and the Set Designer (a fast model) ask about the world, describe how each thing looks so it stays the same night after night, and write where the world stands. Google's Gemini (Gemini 3 Pro Image) paints over their ink, keeping its layout; it paints each thing of their world on its own, which the TV cuts out, and paints it again from its last picture when it changes, held first to how they said it looks, in their own words, if they have. We built the pictures on Amazon Nova Canvas, and when AWS retired it on 30 September 2026, one small adapter moved them to Gemini; the TV only learned to fit Gemini's shapes to its paper and to cut things out itself. Amazon Polly reads it all aloud.
  • Walk inside: World Labs builds the picture into a 3D world, and they walk through it on the TV with the remote (three.js and Spark draw it). Nothing on AWS builds a world to walk through from a picture. World Labs builds it from the TV's picture; in the Vega simulator the world drew black (WebGL2 is there and the file loads), so it isn't in the video, and it hasn't been tried on a stick.
  • See all around it, and paint it again: Gemini widens the picture to either side into a panorama they look across with the remote, and paints the same ink again in another look (a painting, a picture book, an animated film), each version kept to go back to.

A prompt can ask; code can promise. Before anything reaches the screen, each line of a telling must come from something of theirs: their words, their answers, a thing in their world, or how they drew it. A child's telling is checked line by line: nothing frightening they didn't bring (55 word families), nothing they marked darker made bigger, no figure of speech they might take literally. A telling that fails is sent back once with the reason, and the same checks hold the pictures and the questions.

A memory that keeps, and forgets only what you ask. Every chapter stays on the TV beside its drawing; the storyteller gets a short brief (about 13 KB after two simulated years of daily drawing): the last two chapters word for word, older ones as short recaps made in code where they bear on tonight, fenced as for reference and counted against a token budget; and it searches for the rest. Each chapter's page says what it remembered. What happens next carries the story on instead of retelling it; "not quite" hears the line's other version at once, if it holds; the story is always told to you as "you"; and the same paid picture or world asked for twice is paid once. Every line of a story knows the things it was about and every fact the line it came from, all set by code, so Forget follows those links and removes exactly that thing and what grew from it, tested the way access revocation is tested.

It learns each person. A model of which kinds of line they keep, learned from every ▲ and ▼, chooses between a line and its alternative: in a simulation of 400 people it picked the line they'd rather keep 78% of the time, against 62% for one guess for everyone. Another learns how each person's brush feels.

A small server, because keys can't go in a TV app. An AWS Lambda function (deployed with SAM) holds the API keys, checks every block the TV sends, caps the day's pictures and spending in DynamoDB, and stores no drawings or stories (a picture it just made is held in its memory for ten minutes, so one asked for twice is paid once). Their worlds stay on their TV.

Tested: 99 unit tests of the TV, 103 of the server, 93 of the engine, and 34 browser steps that drive the real page, served and packaged, with simulated remote keys.

Challenges we ran into

  • Smooth on a stick. We measured every screen with the CPU slowed six times. A brush redrawn on a full-screen canvas every frame was most of a frame: drawing went from 12 to 17.5 frames a second once nothing was redrawn that hadn't changed. The opening froze for five seconds while it made its pictures; now it makes them one at a time while the story is told, and 95% of its frames finish within 50 ms.
  • Finding a simulator that runs a WebView app. The Vega Virtual Device needs KVM, which our build machine lacked, and it runs a WebView app only on an Apple Silicon Mac. So we tested in Chromium at 1920 × 1080 with the remote's keys, including the packaged file opened from file://, and ran it in the simulator on a rented Apple Silicon Mac two days before the deadline. Keys sent over remote desktop never reached the app; the device's own input tool (inputd-cli, through vega device run-cmd) did, so the video was driven by exact key presses and held buttons, and recorded with OBS on the Mac.
  • A deploy that broke every call. The Lambda function URL's own CORS setting and the handler's headers together sent two Access-Control-Allow-Origin values, and the browser refused every reply ("Failed to fetch"). The handler now answers CORS alone.
  • Back and the media keys never reached the page until allowSystemKeyEvents and allowsDefaultMediaControl={false}.
  • Gentle, and still able to say yes. A child's rocket kept being painted with "flames", and the check refused it twice. It now names the word it refused, and the second try paints a warm glow.
  • Kind wasn't enough; it had to be fun. A child's tellings were safe but described the drawing ("its long string hangs down below it"). Five drawings in a child's world, told by the real storyteller before and after a new prompt and judged blind in both orders: the new tellings won on delight, story and the child's own world all five times, and lines bringing in their world's friends rose from 4 to 17. Its first draft turned a child's star into a castle door, so it now keeps every mark and answer just as the child said it (on that: four ties, one loss).

The friction log is attached.

Accomplishments that we're proud of

  • A six-year-old can draw a dragon tonight with a TV remote, hear it told, and on Friday the storyteller still knows it's their dragon.
  • What happens next is always theirs, and nothing scary gets in that they didn't bring.
  • Lines of light that behave like ink.

What we learned

  • Every word on screen is a demand on someone holding a remote, more so a child. We took out every word that didn't need to be there.
  • Give the model what a chat window can't (how the drawing was made, who's in the room, how each line landed, their history), let it judge, and keep the promises in code.

What's next for Inkwash

  • All on Amazon. We meant to build it all on AWS and couldn't this time: Bedrock's models weren't open to our new account, and Amazon retired Nova Canvas and Nova Reel on 30 September. The storyteller is already written for Amazon Bedrock (the same requests, a key and a model name apart; never run, since our account had no access), so it moves the day the account does. Next, the pictures move to an image model on Bedrock through the same one-adapter seam that moved them to Gemini, and every model call but Walk inside runs on AWS.
  • On the Appstore, so a family can install it on their own Fire TV, starting with a Live App Test.
  • Made with the people it's for: kids and their families first, then artists, writers and worldbuilders.
  • More voices and languages, and worlds that meet between homes with both families' say-so: a grandchild's dragon visiting a grandparent's TV.

Built With

Share this project:

Updates

Submission history