Verify Why Read site Can't read Sketch Done Change it Draw 10 Done Fails Unavailable Drop Draw 10 Done Broken file Sketch Draw 10 Figma Done GitHub Agents Sketch Use it App Continue yes sketch done Draw 10 yes no read image Draw 10 no Work email? Passes review?
S
How sketches and brand reading work The states as stored, the new components, and the rules these flows keep.
System
H
Arrive with your brand Sign in with a work email and the app is already set up: name, logo and colors read from the company site in about two seconds.
5 screens
I
Sketch first Three sketches arrive in about 12 seconds for nothing. Pick one, and the drawing follows it.
8 screens
J
Match an image Drop any image, in any format. It becomes the target, measured for size and colors.
5 screens
K
Matched set A new moment's sketches carry the app's character, so the set stays one family.
3 screens
L
Connections Optional, after onboarding. Website, Figma, GitHub and coding agents each add context without adding steps.
6 screens
How a moment starts now Boxes are stored states, diamonds are checks, pills start or end. Click a box to open its screen.
Signs in Email or link.
app_from_site Logo and colors read. See H2 sketching Three sketches. Free. See I2 sketched One picked. See I3 drawing 10 held. Traced parts. See I5 ready Hold settles at 10. See I6 app_describing Site or logo, optional. See H4 reference_attached Size and colors measured. See J2 failed Hold released, sketch kept. See I8
Components Existing is used as is, adapted is an existing component in a new place, new is built for this feature.
Sketch tray New
new: src/moments/workspace/SketchTray.tsxThree directions, one picked.
testmigo.comAI-powered mock tests for IELTS, PTE, SAT and JFT-Basic.
Brand card New
new: src/moments/onboarding/BrandCard.tsxThe app, read from its site.
Our ghost graduates and flies forward on a comet trail SuccessDraw10 Reference in the composer Adapted
src/studio/character/referenceAttachments.tsAny image, normalized first.
Design rules How this fits the product.
Sketch before you pay Sketches arrive in about 12 seconds and cost nothing. Credits move only on Draw. The sketch is the promise The drawing traces the picked sketch, so a 60 to 90 second wait ends in what was chosen. Any image works Screenshots, SVG, HEIC, giant PNGs. The browser converts and trims. Only unreadable files get a message. The brand finds you A work email reads the company site. Personal email asks for a link, and a logo works too. Connections are optional Website comes free with the email. Figma, GitHub and coding agents wait in settings. One family per app New sketches carry the app's first moment, so characters and colors stay matched.
H1 Work email
auth: email_entered · domain: testmigo.com One field. The domain starts the brand read in the background while the code is on its way.
POST /api/auth/start; the Worker enqueues brand read for the domain via ctx.waitUntil Free mail domains (gmail.com, outlook.com, icloud.com …) skip the read Brand cached per domain in D1 brand_reads(domain, json, read_at); 7 day TTL
H2 Your app, found
app: created_from_site · palette: 5 colors · credits: 20 Verifying the code lands here with the app already filled in. One tap to accept, or tap a swatch to change it.
Measured Oct 5 on testmigo.com: 2.3 s cold, no model call Reads logo SVG, theme-color, manifest, CSS brand variables and frequent CSS colors, ranked in that order POST /api/apps {name, description, palette, logo_url, source: site} 1 new
H3 Where these came from
app: created_from_site · palette: expanded Provenance opens in place, so a wrong color is easy to spot and swap.
Sources from the live read: logo.svg gave #1000ff; CSS brand variables gave #0485f7 and #55e878 Tapping a role opens the existing colors popover 1 adapted 1 new
H4 Personal email
app: describing · domain: none With a personal email, one optional field does what the domain did. A logo works as well as a link.
Same brand read, triggered by the pasted URL A dropped logo runs the image palette read instead (server/referenceFacts.ts)
H5 Site can't be read
app: describing · brand_read: failed A site that blocks bots never blocks onboarding. Continue stays available.
4 s timeout per fetch; failure stored so the next visit doesn't wait again Fallback for script-only sites: Cloudflare Browser Rendering screenshot, then the image palette read
I1 Ready to sketch
moment: describing · credits: 20 Sketch replaces Draw as the first button. It is free, so trying an idea costs nothing.
Sketch has no price; Draw 10 appears once a sketch is picked Verified email required; 6 sketch rounds per day on free accounts 5 adapted
I2 Sketching
moment: sketching · credits: 20 · held: 0 Three tiles fill in place. Nothing is held because nothing is charged.
POST /api/moments/sketches {app_id, brief, kind} streams 3 images as they land Measured Oct 5: 11.9 to 13.1 s each, run in parallel, $0.014 each Prompt carries the app's brand colors and house style 4 adapted 2 new
I3 Pick a direction
moment: sketched · sketches: 3 · picked: 1 The decision happens on a 12 second preview instead of a 60 second drawing.
Sketches stored in R2 moments/:id/sketches/:n.png for 7 days Draw this 10 sends the picked sketch with the brief to the drawing run 4 adapted 3 new
I4 Change the sketch
moment: sketched · sketches: 4 · picked: 4 A note redraws one sketch, not the set. Earlier sketches stay one tap away.
POST /api/moments/:id/sketches {note, from: 1} uses the picked sketch as the image reference Shown result is real: the buddy-only direction from the same run 3 adapted 2 new
I5 Drawing over the sketch
moment: drawing · sketch: 1 · credits: 10 held The sketch stays faintly visible while named parts arrive on top, so the wait shows progress toward what was picked.
Moments pipeline with the sketch as an image in the first message Measured Oct 5: 92 s, 2 calls, $0.063; review: composition faithfully retained Stop releases the hold and keeps the sketches 1 existing 5 adapted 3 new
I6 Ready
moment: ready · from_sketch: 1 · credits: settled 10 The finished moment matches the picked sketch. Sketch reopens the tray to compare or start over.
Same ready state as the Moments prototype, plus sketch_id on the revision Real vector output, played by the export runtime 1 existing 4 adapted 2 new
I7 Sketches unavailable
moment: describing · sketch_service: unavailable Sketching is a shortcut, never a gate. Without it the original flow still works.
Image model error, refusal or timeout over 30 s Falls back to the plain Draw path from the Moments prototype 5 adapted
I8 Drawing didn't come together
moment: failed · sketches: kept · credits: released 10 A failed drawing never loses the picked direction.
settleFixedCredits(release) Sketch kept; retry reuses it at no sketch cost 3 adapted 1 new
J1 Drop an image
moment: none · reference: dragging Any image works. The browser converts, trims and resizes it before upload, so format is never the user's problem.
Client normalizer: decode any browser-readable image, first frame of animations, trim margins, fit 2048 px References upload as PNG or JPEG so the server can measure them 5 adapted
J2 Match this
moment: describing · reference: 1 · facts: measured The image becomes the target. Its size and colors are measured, so the brief can stay one line.
Reference facts: 1254×836, 3:2; content box; palette #7bd66b, #83cbfc, #c8e8fc, #2464dc, #102c77 Facts sit next to the image in the model message as measured data 7 adapted
J3 Drawing from your image
moment: drawing · reference: 1 · credits: 10 held The same tracing view as a sketch: the reference stays faint under the parts.
Measured Oct 5: 94 s, 2 calls, $0.055 Review: diagonal composition, ghost, cap, tassel, diploma and trail preserved 1 existing 6 adapted 3 new
J4 Ready
moment: ready · reference: 1 · credits: settled 10 An editable, animated moment that matches the image, with named parts to change.
Real Moments pipeline output for the Testmigo hero Charged like any moment: 10 credits 1 existing 4 adapted 2 new
J5 Unreadable file
moment: none · reference: rejected The one error left: a file no browser can decode. It says what to do next.
Only when createImageBitmap and the image element both fail Nothing uploads, nothing charges 1 existing 4 adapted
K1 Next moment
moment: describing · style_ref: tally/welcome A new moment sketches from the app's first moment, so the character carries over without asking.
Sketch request attaches the rendered Welcome moment as the image reference 1 existing 5 adapted 1 new
K2 Sketch keeps the buddy
moment: sketched · style_ref: tally/welcome The same paper-plane buddy, scarf and palette as Welcome, now celebrating with a coin jar.
Measured Oct 5: 11.4 s, $0.021 with the Welcome render as reference 1 existing 6 adapted 2 new
K3 Didn't pass review
moment: failed · reason: review · credits: released 10 A real failure from the October 5 run, shown as the user would see it.
Measured: 4 calls, 153 s, $0.126; review rejected black coin faces twice Likely cause: gradient stops using palette variables that the review renderer paints black. Fix before launch 1 existing 3 adapted 1 new
L1 Connections
app: testmigo · connections: website Connections live in app settings, not onboarding. The website is already there from the email.
app_connections(app_id, kind, status, scopes, read_at) Each connection is read-only except GitHub pull requests 2 adapted 1 new
L2 Figma connected
connection: figma · file: read Figma tightens the brand and adds frames to reference. One summary, no setup.
Figma OAuth, file_content:read; GET /v1/files/:key/variables/local Frames exported on demand: GET /v1/images/:key?ids=…&format=png 2 adapted 2 new
L3 Mention a Figma frame
moment: describing · mention: figma/colleges-hero @ finds frames and components in the connected file. A mention becomes a reference image, like a dropped one.
Mention menu reuses the artwork reference picker The picked frame's size also sets the moment's frame 6 adapted 1 new
L4 GitHub connected
connection: github · repo: read · findings: 3 The repo says what the app is missing. Six empty states with no art become six suggested moments.
GitHub App, contents:read; scan for EmptyState, Onboarding, Success components and CSS variables Suggestions only; nothing is drawn or charged until Draw 2 adapted 2 new
L5 Open a pull request
moment: ready · export: pull_request With GitHub connected, Use it can open a PR that places the moment where it belongs.
Same registry item as npx add, written through the GitHub App Paid accounts only; the PR is the private export 1 existing 4 adapted 2 new
L6 Coding agents
connection: mcp · token: issued The agent already has the repo as context, so the brief writes itself from the screen being built.
Remote MCP server on the Worker; tools: sketch_moment, draw_moment, add_moment Scoped token per app; same credits and failure rules 1 existing 4 adapted 1 new