Inspire from anywhere

Compose a message, watch it on a photoreal Vestaboard, and share it — the board below is the embeddable engine (index-webpage.html) dropped in with a single <iframe>: real flap footage on the photographic board render, transparent, responsive, and cycling its messages on its own.

One line per board row · press Enter for a new row · color chips like {G} and {H} work too.
Color chips & heart:
click to drop into your message
Turn this on, then click any single flap on the board to select it — type a letter, hit a colour chip, or press Space/Backspace to clear. Arrow keys move the selection. Everything you paint is written straight back into the message box above, so typing and painting stay in sync.
Flap speed sets how long each individual flap takes, so a message whose letters have further to travel takes longer — same as the real board. The times shown are for a typical message; short ones land quicker. The pause adds a still moment to each end of an export so there's something to trim into.
Note + Frameless only — boards stack flush, no gap, up to 8 wide x 6 tall. The physical array always flips Classic (every Note at once, in sync); Concept previews the proposed whole-array sweep.
Save & Send also updates this page’s URL (bookmark it to keep the message) and builds an index-webpage.html#… link you can paste into another site’s <iframe src>.
What travels in a link: the message, model, finish, frame, lighting, transition, scene, array size, shadow and output size. What doesn’t: an uploaded photo (its bytes only ever exist in your browser), and the fine-tuning you do on top of it — nudged board position, photo framing and hero calibration are saved per browser, so the person opening your link sees the scene’s default placement, not yours. Send a rendered video if the exact composition matters.
The preview above reshapes to match, so what you compose is exactly what exports — board placement, photo framing and shadow all land where you put them.
MP4 renders offline (no need to keep the tab in front) as a crisp, frame-exact clip at the chosen output size — smooth and complete every time, even for large stacked board arrays. Export all sizes renders 16:9, 9:16 and 1:1 back-to-back and saves three separate files (each name ends in its size), reshaping the composition for each. ProRes 4444 also renders offline at the chosen size and has a real alpha channel — just the board, background removed, ready to drop over anything in After Effects/Premiere. First use downloads the ProRes encoder (~25 MB, cached after).

Drop it in with one tag

Point an iframe at the board and pass your message + style in the URL hash.

<iframe
  src="index-webpage.html#view=hero&model=flagship&theme=black&msg=INSPIRE%20FROM%20ANYWHERE~COMMUNICATE%20WHAT%20MATTERS&transition=wave"
  style="width:100%; aspect-ratio:16/7; border:0; background:transparent"
  title="Vestaboard" loading="lazy"></iframe>

Tip: separate rows with | and separate cycling messages with ~. Use the URL hash (#) rather than ? so parameters survive static-host "clean URL" redirects.

Or change it live from your code

No reload needed — post a message to the iframe and the board re-flips to the new content instantly. (That's exactly what the controls under the board above do.)

const board = document.getElementById('heroBoard').contentWindow;
board.postMessage({ type:'vestaboard',
  msg: 'NOW OPEN ~ COME ON IN',      // | = new row,  ~ = next message
  theme: 'white', transition: 'curtain'
}, '*');

Send any subset of msg, model, theme, frame, view, transition, speed, hold, colms, loop, breathe, autoplay, bg, pad, light, shadow, center, fromblank, scene, nudge, stackx, stacky, arrayflip, ratio. If the board is on the same page (not in an iframe), call Vestaboard.setMessage('HELLO') or Vestaboard.set({theme:'black'}) directly.

Full window.Vestaboard API: set(opts), setMessage(msg,extra), config (read-only getter), ready(), export(opts) / exportAlpha(opts) (MP4 / ProRes 4444 alpha, both return a Promise), and the scene-placement pair startPlace({realWidthIn}) (arms draw-to-place for the active custom photo, returns false if there's no successfully-decoded photo to draw on; with Note + Frameless active the drawn rectangle suggests a whole board array, and passing the photo's real-world width via realWidthIn makes that suggestion physically accurate) and impliedWidth(realWidthIn) (sanity-check readout only — never affects rendering; array-aware).

Also available: refitNow() — forces an immediate re-measure and re-fit of the board. Worth knowing if you host the engine yourself and change the frame's shape: the engine's own re-fit rides on resize/ResizeObserver, which browsers suspend in a background tab, so call this before measuring or exporting after a reshape. Photo framing: frameZoom(scale), frameReset(), frameState(). Paint: setPaint(on), paintSelection(), paintCell(drumIndex), paintKey(key) (forward a keystroke when focus sits outside the board), plus gridText() / cellText(drumIndex) to read the board back as message text.

Any model, finish, or motion

Note · white · frameless · curtain
Note · black · drift

URL parameters

ParamValuesNotes
modelflagship · noteBoard size (6×22 / 3×15)
themeblack · whiteFlap finish
frameframed · framelessNote variant
viewflat · heroflat = instant; hero = photoreal (needs /assets)
transitionclassic · wave · drift · curtainReveal style
msgtext| = new row · ~ = next message · {G} etc. = color chips, {H} = heart
speed / holdmsPer-flap speed / per-message hold
loop / breathe1 · 0Cycle the queue / pulse a single message
bgCSS colorStage background (default transparent)
padpxGap between board and container edge
lightleft · top · rightLighting direction (default top)
shadow0-100Cast-shadow intensity onto the scene, direction keyed to light (default 55, 0 = off). Applies only on scene-photo and custom-photo backgrounds (transparent/studio scenes are shadow-free); MP4 export only — omitted from the ProRes alpha export by design
center1 · 0Center the message on the board
fromblank1 · 0Reveal from a blank board (default 1)
scenetransparent · studio-light · studio-dark · office-wall · kitchen-counter · living-shelf · retail · conference · customBackground scene (default transparent). custom only works after an upload — see the composer's photo upload panel, since it isn't reproducible from a URL alone
nudge1 · 0Drag-to-move/resize the board within the active scene (real-world or custom scenes only)
stackx / stacky1-8 / 1-6Note + Frameless only — tile that many boards wide/tall, flush with no gap (default 1x1, an ordinary single board)
ratio16x9 · 9x16 · 1x1Output aspect ratio for exports (default 16x9). Note this sizes the exported file; it does not resize an embedded board — the composer pairs it with a matching preview frame, which is what makes preview == export. On scene backgrounds the export follows the host frame's shape
arrayflipphysical · conceptArray flip behavior (default physical, matching the real Note Array: every Note flips Classic, all starting in sync — wave/drift/curtain apply to single boards only). concept previews the proposed unified whole-array sweep