Spelling.Live

How Spelling.Live's Picture Hints Are Made - And Why the Whole Community Gets Better Together

Drafted with AI assistance and reviewed, fact-checked and edited by hand before publishing - see our AI transparency page for how we use AI across the app.

If your child is 5-7 and practising a word like "fog" or "hop," they'll usually see more than just the word and the audio. Tap Visual hint and a small, bright illustration appears - a cartoon street lost in grey mist, a rabbit mid-jump - drawn specifically to show what that word means, with nothing written on it. It's a small thing on the screen. Behind it is a feature we think is a genuine differentiator: every one of those pictures is generated by AI, purpose-built for that exact word, reusable by every family who reaches it after you, and - this is the part most parents don't know - something you can improve yourself if the AI's first guess isn't quite right.

This post is the detail we haven't written down anywhere else: how the pictures get made, how they turn up as a reward mid-game, how to nudge a stubborn one into something better, and why one household generating a picture quietly makes the app better for every other family on Spelling.Live.

Where a child actually sees one

Picture hints are an early-years feature (ages 5-7) - the band where a concrete image genuinely helps a child hold onto what a short word means, rather than an abstract word like "because" that a picture can't really capture. Two places show them:

  • The Visual hint pill, during practice. While spelling a word, a child can tap for a picture clue alongside the audio and phonics hints - a memory anchor, not the answer.
  • Balloon Pop, as a reward. Pop the balloon carrying the correct spelling and, alongside the coins, that word's picture hint falls gently down the screen as a little burst of positive feedback - the image reappearing at the moment they got it right, reinforcing the word without ever having generated anything new mid-game.

Both read from the same place: a picture generated once for a word, in a given age band, and stored for reuse - never redrawn on the fly during a timed game.

How the picture actually gets made

Pictures are generated by OpenAI's gpt-image-1, prompted to produce a flat vector illustration - think Duolingo or a modern children's picture book, not a photo: bold outlines, a single clear subject, a clean white background, cheerful and safe. Every prompt carries one hard rule: the image must contain zero text - no letters, no numbers, no captions of any kind. That's not a style choice, it's a safety one - image models will happily write the word itself as a caption under the picture if you let them, which would hand a spelling app's child the answer before they've tried. The prompt describes the scene instead ("a cartoon rabbit mid-jump, cheerful, on a plain background") and never the word itself.

Some words need more care than "draw the object." A handful are hand-tuned so the AI doesn't take an odd turn on words that are short, easy to spell, but easy to illustrate badly:

  • "sob" - a cartoon child with tears on their cheeks, gently. Friendly, not distressing.
  • "got" - a happy child holding a wrapped gift, so the abstract idea of having received something has a concrete scene.
  • "fog" - a street lost in thick grey mist, spooky in a friendly way rather than frightening.

The guardrail that matters most for a spelling app specifically: the prompt is built from the word's meaning, never the word's letters - so the picture can never accidentally spell out the answer it's meant to be a clue for.

Honestly, though: that's a strong instruction to the model, not a hard filter, and it isn't foolproof. We've tried more than one model behind this feature - the scheduled queue originally generated pictures with Google's Gemini/Imagen, and that output needed more manual cleanup than we'd have liked, occasionally including a stray word rendered right into the picture despite being told not to. We've since standardised the whole pipeline, on-demand and scheduled, on OpenAI's gpt-image-1, which respects the no-text instruction far more reliably - but "far more reliably" isn't "always." Every so often, a model still slips the word itself into a picture. We deliberately don't run a second, paid AI check over every image to catch this - that would roughly double the cost of a feature that's already the priciest thing in the app, to guard against a genuinely rare failure. So if you ever spot one, hitting Regenerate almost always produces a clean version on the next try - and if anything about a picture needs a second look from us, the Feedback button (bottom corner of the app) reaches us directly.

Two ways a picture gets generated

On-demand, in seconds. When a parent hits "Regenerate Image" in the word-list editor, or a child taps a Visual hint that doesn't exist yet, the app calls gpt-image-1 directly and the picture appears in the app within moments - no waiting.

On a schedule, for everything else. New word lists - a photographed school sheet, a pasted spelling list, a whole class assigned in one go - can add dozens of new words at once. Rather than generating all of them synchronously (slow, and expensive if a parent never actually needs half of them), those jobs join a queue. A background worker, running as a scheduled job every hour, drains that queue a batch at a time until every new word has its picture. Practically: add a fresh list today, and most pictures are ready within the hour, often sooner.

You can make the picture better

This is the part we've never written up before: the AI's first attempt at a picture isn't the end of the conversation. Open a word in the parent word-list editor and there's a field labelled "Describe the meaning for the image" sitting right under the picture, with a "Regenerate Image" button beneath it.

Why this matters: a lot of English words are ambiguous out of context, and an AI illustrator has to guess which meaning you mean. "Bark" could be a dog or a tree. "Fair" could be a funfair or a judgement. If the first picture guesses wrong, you don't have to live with it - type a short description ("a dog barking," not "tree bark") and regenerate. The description you type is saved against that word for your list, so the next regeneration (yours, or anyone else's on a shared list) starts from your steer rather than the AI's first guess.

This is also exactly where to go if you spot the leaked-word problem from the previous section - the real example that prompted us to write this post was the word "sun," where the model rendered a cheerful illustration with "SUN" lettered in underneath it, undermining the entire point of a spelling clue:

The word-list editor's picture editor, with the leaked-word problem and the fix both visible A phone screen showing the word detail sheet for "Sun": a generated illustration of a sun that has the word SUN lettered underneath it, flagged with a warning callout; below it, a "Describe the meaning for the image" text field and a purple "Regenerate Image" button, both highlighted as where to fix it. Sun
  <rect x="130" y="94" width="200" height="200" rx="16" fill="#fff7e6" stroke="#ffe1a8" stroke-width="1.5" />
  <g transform="translate(230,180)">
    <g stroke="#e8a41a" stroke-width="6" stroke-linecap="round">
      <line x1="0" y1="-78" x2="0" y2="-92" /><line x1="55" y1="-55" x2="65" y2="-65" />
      <line x1="78" y1="0" x2="92" y2="0" /><line x1="55" y1="55" x2="65" y2="65" />
      <line x1="0" y1="78" x2="0" y2="92" /><line x1="-55" y1="55" x2="-65" y2="65" />
      <line x1="-78" y1="0" x2="-92" y2="0" /><line x1="-55" y1="-55" x2="-65" y2="-65" />
    </g>
    <circle r="52" fill="#ffc83a" stroke="#e8a41a" stroke-width="3" />
    <circle cx="-16" cy="-8" r="5" fill="#1a1b2e" /><circle cx="16" cy="-8" r="5" fill="#1a1b2e" />
    <path d="M -18 14 Q 0 30 18 14" fill="none" stroke="#1a1b2e" stroke-width="4" stroke-linecap="round" />
  </g>
  <text x="230" y="270" text-anchor="middle" font-size="15" font-weight="800" letter-spacing="1.5" fill="#c2410c">SUN</text>
  <rect x="128" y="248" width="204" height="30" rx="8" fill="none" stroke="#f76a8c" stroke-width="2.5" stroke-dasharray="4 3" />
  <path d="M 340 262 L 372 262" stroke="#f76a8c" stroke-width="2.5" marker-end="url(#arrowRed)" />
  <text x="376" y="248" font-size="11.5" font-weight="700" fill="#c2410c">The AI lettered</text>
  <text x="376" y="263" font-size="11.5" font-weight="700" fill="#c2410c">the word right</text>
  <text x="376" y="278" font-size="11.5" font-weight="700" fill="#c2410c">into the picture</text>

  <text x="40" y="326" font-size="12" font-weight="700" letter-spacing="0.5" fill="#5e6173">DEFINITION</text>
  <text x="40" y="346" font-size="13" font-style="italic" fill="#5e6173">The bright star that gives Earth light and warmth</text>

  <text x="40" y="378" font-size="12" font-weight="700" letter-spacing="0.5" fill="#5e6173">DISTRACTOR WORDS</text>
  <g font-size="12" fill="#5e6173">
    <rect x="40" y="390" width="46" height="24" rx="12" fill="#ede7ff" /><text x="63" y="406" text-anchor="middle" fill="#4f3aa8">son</text>
    <rect x="92" y="390" width="54" height="24" rx="12" fill="#fdf1d6" /><text x="119" y="406" text-anchor="middle">sune</text>
    <rect x="152" y="390" width="54" height="24" rx="12" fill="#fdf1d6" /><text x="179" y="406" text-anchor="middle">saun</text>
    <rect x="212" y="390" width="44" height="24" rx="12" fill="#fdf1d6" /><text x="234" y="406" text-anchor="middle">snn</text>
    <rect x="262" y="390" width="46" height="24" rx="12" fill="#fdf1d6" /><text x="285" y="406" text-anchor="middle">sen</text>
  </g>

  <text x="40" y="444" font-size="12.5" font-weight="700" fill="#5e6173">Describe the meaning for the image</text>
  <rect x="40" y="456" width="380" height="42" rx="10" fill="#ffffff" stroke="#6c46e0" stroke-width="2.5" />
  <text x="54" y="482" font-size="12.5" fill="#9296a8">e.g. treasure chest, not body part</text>
  <text x="428" y="482" font-size="16" fill="#6c46e0">✎</text>

  <rect x="40" y="514" width="380" height="46" rx="12" fill="#6c46e0" />
  <text x="230" y="543" text-anchor="middle" font-size="14.5" font-weight="800" fill="#ffffff">Regenerate Image</text>
  <path d="M 232 566 L 232 592" stroke="#2bb07f" stroke-width="2.5" marker-end="url(#arrowGreen)" />
  <text x="230" y="612" text-anchor="middle" font-size="12" font-weight="700" fill="#1a7a54">Fix a picture from here</text>

  <defs>
    <marker id="arrowRed" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
      <path d="M 0 0 L 10 5 L 0 10 z" fill="#f76a8c" />
    </marker>
    <marker id="arrowGreen" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
      <path d="M 0 0 L 10 5 L 0 10 z" fill="#2bb07f" />
    </marker>
  </defs>
</g>
The word-list editor: the field to describe what you actually mean, and the button to regenerate - the same place to fix a stray leaked word.

Shared across the whole Spelling.Live community

Here's the differentiator we think matters most: a picture, once generated, belongs to the word - not to your household. Every image lives on the shared word bank, keyed by the word and its age band, not by which family or class asked for it. The first time any family on Spelling.Live needs a picture for "hop" in the early band, it gets generated. Every family after that - yours, a class of 30 pupils a teacher assigns in one sitting, a household on the other side of the country - gets that same picture instantly, at no cost and no wait, because it's already sitting in the shared bank. (This is the same principle that already makes assigning a list to a whole class fast: one list assigned to 30 pupils generates its audio and images once, not once per child.)

That means the picture library isn't a fixed asset we drew once and shipped - it's a living, growing resource that gets a little more complete every time any family on the platform reaches a new word, and every parent who takes thirty seconds to refine a picture with a better description leaves it better for the next family who reaches that word too.

What this costs, honestly

Generating a picture is a genuinely more expensive AI call than a spoken clip or a line of hint text, so it draws more from the monthly AI credit allowance than most other features - 5 credits against 1 for a chat hint, a TTS clip, or a handwriting check. That's a deliberate, transparent choice: we'd rather the cost be visible than hidden, and rather charge fairly for the expensive thing than throttle it invisibly. Because images are shared globally, though, most requests never cost anything at all - you're only charged the first time a specific word needs generating for its age band, not every time your child (or anyone else's) taps to see it again. Read how credits work more broadly for the full picture.

The short version

  • Picture hints are AI-generated, purpose-built illustrations for early-years words (5-7), shown as a memory clue during practice and as a falling reward when a child pops the right balloon in Balloon Pop
  • Every prompt is built from the word's meaning, never its letters - and on the rare occasion a model still slips the word into the picture anyway, hitting Regenerate almost always fixes it
  • Most pictures generate instantly on demand; a big new word list drains through an hourly background queue
  • You can improve a picture - describe what you actually mean in the word editor and hit Regenerate; it's the same fix whether the picture guessed the wrong meaning or accidentally lettered in the word
  • Once generated, a picture is shared with every family and class on Spelling.Live from then on - the library gets better as the community uses the app, not just when we sit down and draw more of it ourselves
Load a spelling list. Pick a game. Start practising.

Handwriting mode, instant feedback, and parent progress reports - free, in the browser.

Start practising