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.
{G} and {H} work too.index-webpage.html#… link you can paste into another site’s
<iframe src>.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.
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.
| Param | Values | Notes |
|---|---|---|
model | flagship · note | Board size (6×22 / 3×15) |
theme | black · white | Flap finish |
frame | framed · frameless | Note variant |
view | flat · hero | flat = instant; hero = photoreal (needs /assets) |
transition | classic · wave · drift · curtain | Reveal style |
msg | text | | = new row · ~ = next message · {G} etc. = color chips, {H} = heart |
speed / hold | ms | Per-flap speed / per-message hold |
loop / breathe | 1 · 0 | Cycle the queue / pulse a single message |
bg | CSS color | Stage background (default transparent) |
pad | px | Gap between board and container edge |
light | left · top · right | Lighting direction (default top) |
shadow | 0-100 | Cast-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 |
center | 1 · 0 | Center the message on the board |
fromblank | 1 · 0 | Reveal from a blank board (default 1) |
scene | transparent · studio-light · studio-dark · office-wall · kitchen-counter · living-shelf · retail · conference · custom | Background 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 |
nudge | 1 · 0 | Drag-to-move/resize the board within the active scene (real-world or custom scenes only) |
stackx / stacky | 1-8 / 1-6 | Note + Frameless only — tile that many boards wide/tall, flush with no gap (default 1x1, an ordinary single board) |
ratio | 16x9 · 9x16 · 1x1 | Output 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 |
arrayflip | physical · concept | Array 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 |