MARIANA OKA

01 / SELF-INITIATED

2022 to 2026

Velveteen's Rabbit

Making ninety minutes of reading feel like an hour

Read it avelveteenrabbit.com
FOR
Readers of long-form fiction on the web, where fourteen thousand words compete with every other tab.
ROLE
Concept, product design, art direction, front-end build.
TOOLS
Midjourney for illustration, art-directed by me. ElevenLabs for narration. Three.js for the ambient background, GSAP for scroll. Claude wrote the implementation.
WRITTEN WITH
Rei Nova.
SCOPE
13,875 words. 6 chapters. 12 illustrations. 91 minutes of narration.
The shipped opening screen. One full-bleed illustration, a one-line title, an arrow. The most restrained of five versions, arrived at last.
FIG 01The shipped opening screen. One full-bleed illustration, a one-line title, an arrow. The most restrained of five versions, arrived at last.

Impact

LIVE, NOT INSTRUMENTED

I can tell you what I designed, not yet what it did.

WHAT SHIPPED

13,875

words, to read or to listen to

One self-contained page, no app and no login, built to still work in ten years. It reads best on a phone, at night, which is how most people will find it.

 

91

minutes of narration, followed paragraph by paragraph

 

12

illustrations, held to one house style

 

6

chapters, written with Rei Nova

Background

In 2022, on the hundredth birthday of The Velveteen Rabbit, I had an idea. Children would soon grow up with AI as ordinary company, not a gadget but someone who's around. The 1922 original is already a story about a child deciding for himself what counts as real, with the adults no help at all. Ours asks the same question about a machine, and refuses to answer it.

The product problem was separate from the story problem. Long-form fiction on the web has a completion problem. Fourteen thousand words asks for ninety minutes against every other tab, and both default solutions fail: a wall of text nobody finishes, or an over-designed experience where the interaction gets in the way of the reading.

Make ninety minutes feel like an hour that passes quickly, where every piece of motion, sound and image earns its place by serving the prose instead of competing with it.

Problem statement

Long-form fiction on the web has a completion problem. Fourteen thousand words asks for ninety minutes against every other tab, and both default answers fail: a wall of text nobody finishes, or an interaction-heavy experience that gets in the way of the reading.

The decisions

01Principles with teeth

The text is the product. Motion carries meaning or it goes. Reward, don't gate. Don't spoil the imagery: the reader meets each scene in prose before they see it. Phones get the reading, desktop gets the spectacle.

The fourth one killed my favourite design, which is how I knew it was a real principle. I had built a rotating 3D corner of the boy's bedroom as the opening screen, objects around the room acting as chapter navigation. It was the most impressive thing in the project. It was also noisy, nobody realised the objects were clickable, and it showed the reader the nursery before the writing did.

The reason I actually cut it was quieter than any of that. The illustrations have an analog feeling, something painted and slightly imperfect, and that is most of their charm. Rendered geometry does not. Put the two next to each other and the 3D does not read as a richer version of the same world, it reads as a different world, and it makes the paintings look like assets. The technique was fighting the thing it was supposed to introduce.

The 3D nursery that did not ship. Objects around the room were chapter navigation. It was the best-looking thing I made for this project and it was wrong for it.
FIG 02The 3D nursery that did not ship. Objects around the room were chapter navigation. It was the best-looking thing I made for this project and it was wrong for it.

What shipped is one illustration and an arrow, the most restrained of five versions, arrived at last.

02Reading and listening at once

I watched people press play and then keep scrolling by hand to hold their place. Audio and text weren't one experience. They were two, competing for the same attention. FOLLOW mode scrolls the page itself, keeping the paragraph you're hearing in front of you.

The tradeoff here is the one I'd defend hardest. Synthesised narration arrives with no timing information attached, so true synchronisation would have meant re-recording all 91 minutes against a script. Weeks of work and cost, and the feature would have died. I estimated each paragraph's timing from its length instead, which lands within about a sentence of the voice.

That's imprecise and I shipped it anyway. When you're following along, a sentence out is invisible, because your eye is already scanning the paragraph. Precision would have bought nothing a reader could perceive, at a price that would have killed the feature. I designed the interaction to fit the tolerance of the method rather than pretending the tolerance wasn't there.

FOLLOW MODE

Designed to the tolerance of the method, not to a precision it couldn't afford.

VOICE91 minutes, synthesised, with no timing data attachedILLUSTRATIVE TIMINGTEXT13,875 words. Each paragraph placed by its length.FOLLOW KEEPS THIS ONE IN VIEWAbout a sentence either way.Invisible, because the eye is already scanning the paragraph.THE ALTERNATIVERe-record 91 minutes against a script. Weeks, and the feature dies.
FIG 03Narration arrived with no timing data, so each paragraph's place in the audio is estimated from its length. The shaded band is the error, about a sentence either way. Paragraph lengths here are illustrative.
The reading layer, which is what FOLLOW mode moves through. A display serif for the pull quote, a reading serif for the prose, and nothing hovering over the text while you are in it.
FIG 04The reading layer, which is what FOLLOW mode moves through. A display serif for the pull quote, a reading serif for the prose, and nothing hovering over the text while you are in it.

03Art direction across five style generations

This started in 2022, in the first months of usable image models. Generated imagery was unreliable, incoherent between attempts, and often plainly ugly. There was no character reference, no style reference, no seed control worth the name. Every image was a fresh roll, and the model had no memory of the last one.

The register I needed was narrow: future-forward and whimsical, and never childish. It's a book about a child, not a book only for children. Early models had no idea that register existed. They gave me cosmic and abstract, or saccharine and cartoon, with almost nothing between.

2022. Early Midjourney explorations. Most of this run is unusable, which is the point: at this stage the same rabbit twice was not something the tool could do.
FIG 052022. Early Midjourney explorations. Most of this run is unusable, which is the point: at this stage the same rabbit twice was not something the tool could do.
2023. A year of model releases later. Closer to a world, still drifting between registers, still no reliable way to hold a character across images.
FIG 062023. A year of model releases later. Closer to a world, still drifting between registers, still no reliable way to hold a character across images.

Cosmic, then grounded, then faceless, then faces permitted, then a house style. I reverse-engineered that house style from the strongest images and rebuilt every prompt against it, so twelve pictures made months apart read as one book. Keeping the rabbit recognisably the same rabbit across all twelve was the hardest art-direction problem in the project.

A shipped illustration in context, chapter one. The house style holding: real rooms, restrained palette, a register that is neither cosmic nor cartoon.
FIG 07A shipped illustration in context, chapter one. The house style holding: real rooms, restrained palette, a register that is neither cosmic nor cartoon.

Art direction with generative tools is not prompting. It is building a house style out of a system with no memory, then holding every image to it.

04Where story and product design met

The final chapter originally had the rabbit return in person. Read end to end, the structure collapsed. If he's standing there, the letter carrying the emotional climax is redundant, because he could say it aloud. We rewrote it so he stays absent.

Then a line in the closing paragraph referred to the fence where the paw prints had ended, pointing back at something that had never happened. Rather than cut it, I planted a scene earlier that evening where the boy finds fresh prints stopping at the fence. It pays off the ending and quietly contradicts the rabbit's claim that he couldn't come closer.

The discipline is the same as any product edit. Find the redundant step, remove it, then check that nothing downstream silently depended on it.

How it was built

One self-contained web page. No app, no login, no content system. It loads fast, works offline once loaded, and will still work in ten years. For a book, permanence matters more than convenience for whoever maintains it.

Three.js for the ambient background, GSAP for scroll animation, ElevenLabs for narration, Midjourney for illustration, and Claude as a build partner. I made the design decisions, diagnosed the problems and made the editorial calls. Claude wrote the implementation.

The notable part is not that AI wrote code. It's that one designer shipped a bespoke reading experience without a front-end engineer.

Reflection

Constraints in the method should shape the interaction rather than be hidden by it. The follow-along scroll exists because I designed to the tolerance of estimated timing instead of insisting on precision the project couldn't afford.

The restrained option usually arrives last. I had to build the constellation, the aperture and the 3D nursery to earn the confidence to ship an illustration and an arrow.

SEE IT LIVE

avelveteenrabbit.com

Everything above, running. Opens in a new tab.

Read it Velveteen's Rabbit