A single self-contained prompt. Paste it into a coding agent with image and video generation available, and it will rebuild this page end to end — the artwork, the dither engine, the animation loop and the layout.
Build a single-page animated landing page hero. Work through it in this order.
# 1. Generate the artwork
Use an image model to make ONE still, 16:9:
"Renaissance old master oil painting study of a great fleet of tall ships under full sail, dozens of vessels with masts and rigging crowding the frame in one vast armada. Deep umber
and slate pigments on a plain flat pale cream parchment background. It fills the
frame, dense at the centre and breaking into individual elements at the edges.
No sky, no scenery, no figures outside the subject. No frame, no border."
The subject MUST be composed of many small discrete elements (a flock, a field, a
crowd, a plume, repeated architecture). This is the single most important
constraint. A solid object — one animal, one face, one smooth mass — turns into an
illegible grey blob when dithered, because the dot field has no internal structure
to latch onto. Subjects made of many parts render as themselves.
# 2. Turn the still into video
Feed that still to an image-to-video model as the start frame, 5s, 1080p, no audio:
"A great fleet of tall ships rocks gently at sail, dozens of masts swaying and canvas billowing. Renaissance old master oil painting style, deep umber and
slate on flat pale cream parchment. LOCKED-OFF STATIC CAMERA: the subject stays
centred and fills the frame, never drifting off. No camera pan, no zoom. Flat
empty cream background, no scenery, no horizon."
Video, not a batch of separately generated frames. Independently generated frames
drift in geometry, scale and identity, and the result flickers between subtly
different subjects no matter how carefully you align them. One video generation
gives temporal coherence for free. Insist on the locked-off camera in the prompt or
the subject will travel across frame and the loop becomes unusable.
# 3. Extract and clean the frames
ffmpeg -i clip.mp4 -vf "fps=11,crop=iw*0.84:ih*0.84:iw*0.08:ih*0.08,scale=1400:-2" %03d.png
The crop removes the painted parchment border these models bake in from the start
image; without it the artwork dithers into a hard rectangle. Then flatten every
pixel brighter than ~232 luma to one flat paper tone, or codec noise in the
background renders as a haze of stray dots.
# 4. Write the dither engine
A canvas 2D renderer, no WebGL:
1. Downscale the frame to a grid of one cell per 12px block.
2. Convert to luma with Rec. 709 weights (0.2126 R, 0.7152 G, 0.0722 B).
3. Auto-level against the 2nd/98th histogram percentiles, then PIN those levels
for the whole sequence. Recomputing per frame makes the dot density visibly
pulse.
4. Apply brightness -4 and contrast 20, then
invert (dots land on the artwork, not the paper).
5. Clamp anything below 0.02 normalised luma to zero, removing
parchment texture.
6. Quantise with an 8×8 Bayer ordered-dither matrix into 6 tone
levels. Build the 8×8 by recursing a 4×4 into each quadrant.
7. Draw each cell as a filled circle, radius scaled by its tone level, with
0.52 of the cell as gap and dot radius × 0.7.
Use per-dot colour sampled from the artwork (colorMode 'sampled', colorMix 0.5, saturation 0.9, tinted toward #8A8378).
Airiness comes from big cells with small dots inside them, leaving paper visible
between each one. Small cells with full-size dots pack into a solid mass.
# 5. Animate it
Play the frames at 11fps. These motifs are turbulent — they never return to an
earlier state — so there is no true loop point and a hard cut always jumps. Instead
crossfade the last 8 frames back into the opening frames so the wrap dissolves.
Add a pointer effect: cells within ~62% of the canvas lean horizontally away from
the cursor and lift slightly, with an eased falloff, so the field bends like wind
moving through it. Displace the sampling coordinates, not the drawn output. Avoid
radial ripple distortions — on a natural motif they read as a lens artefact sitting
on top of the image rather than something happening to the subject.
# 6. Compose the page
Palette: paper #F7F5F0, ink #2A2722, muted #B3AEA4, accent #5C554A.
Typefaces: 'Cormorant Garamond', Georgia, serif for the headline, 'Spectral', Georgia, serif for everything else.
Layout: full-bleed artwork with a centred, symmetric copy block (headline, sub-paragraph, CTA) stacked in the middle of the page.
Headline, clamp(54px,8vw,134px), line-height 0.9, letter-spacing -.02em, italic:
THE WHOLE
ARMADA ← this line in the muted colour
Eyebrow above it, small and letterspaced: "Reach every market"
Sub-paragraph: "Numbers, markets and reps deployed together instead of one at a time."
CTA button: "↗ Book a demo"
A row of three small stats along the bottom: TX HVAC $4M → $6M / mo · 60 seats,
live in 14 days · pickup rate 3.1× baseline.
Top nav: wordmark "Clairvo" plus Product, Customers, Company, with "Book a demo"
pushed right.
Set the nav and headline to mix-blend-mode: multiply so the dots show through the
letterforms instead of punching a hole in the field.
Everything full-viewport, no scroll.
This prompt encodes the findings from building it: why the motif has to be made of many small elements, why the source must be video rather than independently generated frames, and the specific dither settings for this style.