Changelog
Comic studio changelog
What the comic studio does, what changed, and what broke on the way. Written from the commits, including the parts that took two attempts.
In short
Describe a story or paste a URL, edit the script, watch the panels draw, look at them before they are stitched, and get a lettered comic with a cover, a share link and files. Three panels — one full page — are free and need no account.
The comic studio is the newest thing in Neubook Write. It takes a story — or a website — and returns a finished comic: a script you can edit line by line, panels drawn one at a time, pages laid out and lettered, a cover, a share link that opens a reader, and files you can keep. This page records what it does and what changed, in the order the work happened.
Everything below shipped in the week ending 17 September 2026, which is the week the studio was built. From here on, each change gets its own dated entry at the top.
The shape of it
You write a paragraph about the story, optionally say who is in it, pick how it should be drawn, and press on. A model plans the whole comic: panels in order, three to a page, each with a scene for the artist and dialogue for the letterer. You edit that script. Then the panels are drawn one by one, you look at them, redraw the ones that went wrong, and the pages are stitched and lettered in front of you.
Two halves, deliberately. The drawing happens on the server; the page layout and every balloon happen in your browser on a canvas, because there is no canvas in a Cloudflare Worker and because lettering should be instant when you change a word. It also means the image model never draws text. Every word on a finished page is real type composited on top of the art — which is why the lettering is readable, and why fixing a typo does not cost a new drawing.
Three panels — one full page, laid out and lettered — are free and need no account. Open the studio and the sample comic on the first screen is a real one made here, not a mock-up.
Writing the script
The script reads as one story, not a row of pictures
The first version described each panel as a single moment, with the cast restated word for word so the artist draws the same face twice. The planner took that literally and wrote twenty separate vignettes with a caption under each. Nothing joined a panel to the one before it.
The rules that were missing, now in the plan: panels are written in order as one continuous scene; each page carries one beat of the arc and turns on its third panel; a panel continues moments after the last one in the same place, and a jump in time or place has to be said in that panel's caption; the dialogue is one conversation, where a line answers the line before it and nobody explains what the reader has just seen; and whatever appears early comes back, with what a character learns staying learned. The verbatim appearance is now explained in the prompt as being for the artist, who only ever sees one panel — so the story is not written that way.
Every panel is told where it is
The cast was restated in every panel. The place was not. The planner had been writing a setting for every comic and the artist never saw it, so the same shed was a different shed in every drawing — a different roof, a different fence, a different door. The setting now travels with every panel and with the cover, exactly the way the cast does, and for comics the planner is asked for it differently: not "where and when, with a couple of details", but a reference sheet an artist could redraw the place from — what is built there, what it is made of, what stands around it, the light, and only the things that are there every time.
What is deliberately not sent to the artist is the story. An image model is not helped by a synopsis, and one naming several scenes invites it to draw more than one.
Standing instructions, written by you
One field, obeyed twice: it goes into the planner above the style notes, so the script follows it, and into every panel prompt, so the artist does too. It sits under the art style on the form and folds away on the script and panel screens, editable for the life of the comic — because what you want held to is usually only obvious after you have seen a few panels drawn. It applies to whatever is written or drawn next; panels already drawn stay as they are.
Every word of a comic comes from the story model
The script was routed to the better model. The rest of a comic's words were not: the title, the interview questions and the translation of a non-English cover concept still went to the cheapest model in the list, because those settings are shared with books — where that model only writes scaffolding that a stronger writer model fills in later. A comic has no prose, so nothing better ever ran on them. One helper now decides which model writes a book's words, and a comic gets the story model everywhere. The generation log names the model that actually ran, rather than the one in the setting.
Drawing the panels
Move the camera, or every panel is the same picture
Every prompt opened with the same thirty words of character sheet, and once the setting was added to that too, the only part of the prompt that changed between panels was a short clause at the end. Near-identical prompts draw near-identical pictures. Measured on a finished comic: one close shot in seventeen panels, and the rest "stands", "kneels", "sits".
Each panel summary now opens by naming the shot, and never uses the same one twice running — wide establishing, medium two-shot, close on a face, extreme close on hands or an object, over the shoulder, from behind, from above, from below, silhouette. A third of the panels are close or extreme close, and at least three panels in a comic have nobody in them at all, which is what lets a reader breathe. The appearance is restated only for whoever is visible, and in a close shot only for what is actually in frame.
Three faults you can see in a drawn page
- Balloons landing on faces. Lettering is printed over the top of the panel, and the prompt asked only for "calm empty space in the upper third" — soft enough that the model filled the frame with heads. It now asks for the top third to be empty and quiet with no face or hand in it, every face in the lower two thirds, and the shot framed further back than feels natural.
- A second body with no head. Nothing said how many people were in the picture, so the model added one and half-drew it. Both the panel and the cover prompts now say: only the people named, once each, nobody in the background, no body or limb without its person, every person whole and correctly proportioned.
- Irregular drawing. The plain rules were missing — no doubled lines, no half-drawn areas, no warped shapes, no floating parts.
Look at the panels before they are stitched
Drawing used to run straight into page layout, so a bad drawing was already inside a finished comic by the time anyone saw it, and the only way back was to redraw everything. Drawing now stops on the panel sheet. Every drawing opens full size. Each has Redraw under it and Change it beside that — Change it shows the scene as the planner wrote it, and a redraw from edited words keeps those words, so the fix sticks if that panel is ever drawn again. Only the page a changed panel belongs to is marked for lettering again. The way on is a button that says the panels look right, and the finished-pages screen has a way back, because a comic can be looked at again after it is done.
Click anything to see it full size
Panels are shown three to a row at about 230 pixels, which is too small to judge a face or read a balloon, and a whole comic page at thumbnail width tells you nothing at all. The lightbox built for the sample comic became a viewer that takes any list of images: panels, finished pages and the free lettered page all open in it, arrow keys walk the set and wrap at the ends, Escape or a click outside closes. Panels not yet drawn stay unclickable rather than opening an empty frame.
Style, and lettering like a comic
Style became a real thing rather than a suggestion
Style used to be decoration: the picker's words went into the brief, the planner paraphrased them into the outline, and the image model received a watered-down copy. That is how "chibi" vanished and how noir came back in colour. Eight styles generated from one scene came back nearly identical, and an explicit instruction to ignore the style stated earlier barely moved them — the renderer has a house style it does not leave.
The style id is now stored on the comic, and the panel prompt is built from a canonical description of that style, not from anything the planner wrote. Styles declared monochrome go further: colour words are stripped from the scene before it reaches the artist, the prompt says so plainly, and the finished art is desaturated through an S-curve as it is drawn onto the page. Noir is black and white because the compositor makes it so, not because the model was asked nicely.
Balloons that behave like balloons
The lettering was Comic Sans, one balloon shape and one caption box. It is now Comic Neue set in caps, with thought balloons drawn as a cloud trailing circles, shouts as a spiked burst, whispers with a dashed outline, and the word a speaker leans on set bold italic from *asterisks* in the script. The planner writes all of it, and uses it sparingly.
Balloons belong over the person speaking
The original rule put a balloon on the far side of the panel from its speaker so the tail would cross toward them. Tails are clamped to a stub, so instead they set off across the drawing and stopped in open air pointing at nobody, while every line in a panel piled into one corner and sat on whoever was standing there. A balloon now sits above its own speaker with a short tail down to them.
That exposed the next thing: the planner had marked every speaker "left", so honouring the script still stacked both lines together. It is now told to stage the panel — who stands where — and to give two speakers in one panel different sides; where a script still says otherwise, the reply is moved across, which is where a reader looks anyway. The script editor's left/right control used to write a field nothing read; it now sets the side the balloon is placed on.
The cover
Drawn by the same hand as the panels
A comic had no cover at all, though the planner had been writing a cover concept for one the whole time. The cover art is now drawn from that concept in the comic's own style, built the way a panel prompt is built: the chosen style's own words, the cast restated verbatim exactly as every panel restates it, the same monochrome rule and the same standing instructions — with a cover's composition instead of a panel's, and room left top and bottom for the logo and the credits. Before this, the cover prompt had no comic branch at all and would have returned editorial illustration, so the person on the cover could be a stranger to the person inside.
Lettered by you
Everything written on the cover is real type composited at the page's own size: the title in a heavy outlined logo under a soft gradient, the strapline in a box in the brand's colour, the credit on its own ground so it reads over dark art or light. Title, strapline and name are three fields — change one and the cover is lettered again a moment later. Draw new art re-rolls the picture, with an optional prompt of your own; Use my own image takes a file instead. New art keeps itself as soon as it is drawn; the words wait for Save cover, because renaming the comic should be deliberate.
The cover leads both exports: 000 in the CBZ, where it sorts before every page and is what a reader shows, and the first sheet of the print PDF.
Two fixes worth recording
The caret kept jumping out of the cover fields while typing. The first cause was paintCover finishing with a full re-render, which replaced the input being typed into. The second — found after the first fix did not hold — was the page compositor re-rendering the whole screen as each page was laid out, twenty times on a long comic. The render now remembers which field held the caret and where, and puts it back; fields opt in, and the cover fields, the story, the cast and the instructions all do.
And the paint's busy guard returned early, throwing away any repaint asked for while one was running — so the cover kept whatever half-typed word it had caught. It now marks the work dirty and loops until the canvas matches the fields.
Making a comic out of a website
Paste a URL, get a marketing comic
The studio reads a site the way a reader would: the title and the copy that says what the thing is, the logo, and the colours the site already uses. A model turns that into a brief — a person with the problem, the old painful way, the moment it changes — which lands in the story and cast fields for editing like any other script. The brand rides along on the comic, so every drawn page signs off with the mark, the host, and a rule in the site's own colour.
Read the whole site, not the front door
A landing page is what a company would like you to believe; the pages behind it say what it costs, how it works, who uses it, and what shipped last month. The scan now follows same-site links to five of those — how it works, pricing, customers, about, docs, news — reads them together so the whole thing still answers in about ten seconds, and takes the last few dated items from the RSS or Atom feed if one is declared.
It also had one story shape hardcoded — problem, old way, product, win — so every company on earth produced the same comic. There are four frames now, chosen in the studio: a story about someone it helps, how it works start to finish, why it was built, and winning over a sceptic. The second one is documentation with somebody in it.
Its own door, and the style chosen in the same place
The URL field used to sit at the top of the form, which read as a step everyone had to pass through. It is a door of its own now, next to Books: a button that opens a small panel, and once a site is read the button becomes the site — its mark, its host — with the brand card and a way to forget it inside. The panel also carries a Drawn like picker, wired to the same setting as the style cards on the form, so choosing Noir in the panel lights the Noir card and the other way round.
Fetching a stranger's URL, carefully
The fetch is the risky half of a feature like this, so it is fenced: SSRF is the attack, and the answer is http(s) only, with no loopback, private, link-local or CGNAT addresses, checked again after every redirect, with caps on bytes and seconds for each request and a scan limit per account and per network. The HTML is read with HTMLRewriter, streaming, so a large page never has to be held in memory.
The brief cap counted the typing, not the brief
The limit was 1,500 characters — the same as the story box — but the brief sent to the server is the story plus the cast plus the art direction plus the brand line. A scan of a well-documented site composed to 1,526 characters and was rejected as "brief too long", with nothing on the page over its own limit. The cap is 4,000 now, and the studio reads the real number from the API instead of guessing it. If a brief would still exceed it, the cast and then the story give way, so the art direction and the brand line — the parts the drawing depends on — always survive.
Sharing and reading
A link of its own
A finished page had no address. neubook.app/c/<token> now serves the comic with Open Graph tags, so a link posted anywhere unfurls as the comic, with a line under it inviting the reader to make one from their own site. There is a Copy share link button in the studio, and a single page can be shared by name: /c/<token>/3 is page three.
It opens a reader, not a picture
The share page first showed one image. As an unfurl card that was right; as a link someone actually followed it was a dead end — they arrived at the cover with nowhere to go. It became a reader, then a proper one: a single page fitted to the screen, arrows and keys and swipe, a counter, a deep link per page, and an end card with the invitation after the last page rather than before it.
Two false starts are worth recording. A scroll-snap track looked ideal and was not: a smooth programmatic scroll on a mandatory-snap container is dropped silently — the counter moved and the page did not — and worse, a page scrolled to by button never repainted at all, decoded bitmap and empty frame, until a real scroll event arrived. Showing and hiding one page has no such opinion, so that is what it does. Native lazy loading went the same way; pages are promoted from data-src as they are reached.
The card a link unfurls into
The unfurl image was the cover itself, 1988 × 3056. Social platforms crop a preview to about 1.91:1, so a tall image is centre-cropped and the title, which sits at the top of a cover, is the first thing lost. There is a purpose-built 1200 × 630 card now: the art down the left, cropped to the drawing itself — cover art often comes back as a framed panel sitting on a blank strip, and the card detects where the drawing stops — and the title, kicker and credit set as real type beside it, sized to fit rather than truncated. Comics made before the card existed build one the next time they are opened.
And it can go in the shop
The store used to take a cover as an upload and nothing else, so putting a comic in the shop meant downloading its cover and uploading the same image straight back. It now takes the comic's id and copies the composed cover across.
Paying for it
You start the payment
Running out of free panels used to send the browser straight to the card form, mid-draw, with no screen in between. Coming back from a cancelled payment, nothing said the card had never been charged, and the return URL was hard-coded to the book studio — so a comic buyer landed on a page that loaded their comic as a book and quoted the book's price, on a successful payment and a cancelled one alike.
Now the draw stops on the panels screen and states the price, and the buyer starts the payment. Comics return to /write/comic, which resumes the draw on success and, on anything else, shows a banner saying nothing was charged with the panels and the script still there. Payment is taken by Dodo Payments as merchant of record, so the price you see is the price their product carries.
The free part is a real page
Three free panels looked like three illustrations rather than a comic, because panels are bare art and balloons are only lettered when a page is laid out. Three panels is exactly one page, so the free page is now composed and shown — laid out, lettered, captioned. The free sample is the product. It also carries a line in the running foot reading "made at neubook.app/write/comic", which the comic loses when it is bought.
And no account until there is a payment
Writing the script used to ask for an account first, so the moment worth sharing sat behind a signup nobody had a reason to complete yet. A guest can now describe, plan, edit and draw the free panels; the account is asked for at the unlock, where a payment has to belong to someone. Guest device ids are whatever the client says they are, so the network is metered instead — a few plans and panels a day per address, answered in a way the studio can offer a route through.
Eighteen panel tiles are taller than a screen
So the price and the button sat below the fold and were easy to miss. They ride in a pinned bar now, the way the book studio's build bar does, and the same bar states the offer on the finished-pages screen.
Limits, and the failures worth naming
A paid comic cannot be stopped by our own limits
Three things could have failed someone who had already paid.
- The planner's output cap was flat — 6,000 tokens whatever the length — while a sixty-panel script measures about 7,200. The plan was cut short, and the validator only checked that some panels existed, so an author who bought twenty pages could have quietly received twelve. The budget now grows with the panel count, with about half again in headroom, and a plan that still comes back short is logged.
- That same script takes two and a half minutes to write, against a timeout of exactly 150 seconds. One slow day and the plan failed outright. The timeout scales too now: 174s at eighteen panels, 300s at sixty.
- The daily image ceiling is there to bound what free work can cost on a bad day, and one twenty-page comic eats a tenth of it. It no longer refuses work that is already paid for — paid draws are still counted, just never turned away. Where the ceiling does apply, the studio stops and says so, instead of looping through every remaining panel, failing them all and pushing the counter up as it goes.
Print / Save as PDF answered "missing token"
It was a plain link to the export route. Every export is behind a bearer token and a link cannot carry one, so the browser navigated there unauthenticated and the worker answered 401 {"error":"missing token"}. The CBZ button beside it had always fetched with the header, which is why only the PDF failed. It fetches with auth now and prints from a hidden frame rather than opening a tab — no pop-up permission, and the frame's load waits for every page image, so the print dialog opens on a complete comic rather than a stack of empty sheets.
The email said the wrong thing
A comic finishes in two halves — panels drawn on the server, pages laid out and lettered in the browser — so a paid comic drawn while its author was away has everything except the files. The email they received was the book email: chapters written, back matter in, cover painted, open it in the book studio. Wrong on every line, and pointed at the wrong page. It now says every panel is drawn, that opening the comic lays them out and letters them in front of you, and links to the comic studio. The download route, if reached directly, names the step and says it takes a few seconds rather than just refusing.
Doors between the two studios
The comic studio linked back to Books from the day it was built, and there was no way across from the book studio — so anyone who went to their books to find a comic was stranded. Worse, clicking a comic in the sidebar rendered it as a book, a view with no panel or page step, so a finished comic looked half empty. There is a Comics pill in the book studio header now, a comic opens in the comic studio at whatever step it left off, and the comic studio's own wordmark goes to the comic studio rather than the book site. The main site carries Comics in the top nav and in the footer.
Known limits
- Styles are less distinct than the picker implies. The renderer has a strong house style, and eight styles from one scene came back close together. Monochrome is enforced deterministically in the compositor rather than trusted to the model. Adding more styles is pointless until a renderer can tell them apart, so the next step there is a bake-off between image models, not a longer list.
- Layout happens in your browser. Opening a finished comic takes a few seconds while the pages are stitched and lettered. That is also why the lettering is instant when you change a word.
- Faces drift a little over a long comic. The cast sheet is restated in every panel, which holds it well, but a sixty-panel story will still show some drift.
What is next
- A model bake-off for the drawing, which is the blocker on real style variety.
- A guided view for phones — panel by panel rather than page by page.
- More frames for website comics, and a better use of what the news pages turn up.
Three panels, one lettered page, no account. Write a paragraph, or paste a URL and let it read the site.
Open the comic studio Books instead