Silkscreen Travel Poster 丝印旅行海报

Three Trails·38s·Lemo-Opuscarby Lemomo

Opaque, hard-edged flat inks pulled one colour at a time through a screen: 4–6 inks per poster, stepped colour bands instead of gradients, thin paper-white gaps where the registration slips. Information is revealed the way the print is made: one layer, one beat.

The demo: Three trail posters are screen-printed one ink at a time, then climbed in one long take from noon to dusk.

Trail & destination guidesTourism promosEvent posters
Style prompt · STYLE.md

Opaque, hard-edged flat inks pulled one colour at a time through a screen: 4–6 inks per poster, stepped colour bands instead of gradients, thin paper-white gaps where the registration slips. Information is revealed the way the print is made: one layer, one beat. References (grammar only):

  • 1930s–40s WPA national-park screen prints: 4–6 flat inks, lit and shade faces, stepped-band skies, a dark information band, concentric sun rings.
  • Fifty-Nine Parks (contemporary): restraint, paper as a colour, a series on one template with a new palette per poster.
  • The physical process: hinged screen, squeegee pushing an ink bead across mesh, split-fountain pulls, drag streaks, pinholes, off-register slivers.

Never copy a real poster's composition, park name, lettering or logo, and never name a real agency.

A scene style: it does a practical job (a guide, an event poster, a destination series) for any place, event or product with a few facts. See §11 for the jobs.

1. Essence, and what it is not

A poster being printed on camera. Every colour is an opaque ink laid by its own pull; later ink covers earlier ink completely. No halftone, no fluorescent ink, no line work: a shape's edge is where one flat ink stops. Gradients are forbidden: skies and haze are stepped bands (a flat colour, thinning stripes, the next colour).

What makes it read as silkscreen and not as flat vector art:

  • Registration: every layer offset 1–3 px at 1080p; a knocked-out shape leaves a crescent of bare paper.
  • Overprint edge: a faint multiply ghost ~2 u off under each ink, leaving a darker sliver where ink laps over ink.
  • Ink thickness: a light rim top-left, a dark rim bottom-right, fills only; fresh ink has a wet sheen that fades within a second.
  • Paper: cream stock with fibres; mottle and pinholes in paper colour, visible only on ink.

Not risograph (translucent fluorescent overprint with halftone grain), not ukiyo-e (key-block line work with bokashi), not woodcut (carved line), not low-poly (3D facets). This style is opaque, line-free, flat and banded.

2. Materials & rendering

  • One Path2D per ink layer, filled in the current transform's units; knock-outs are holes in the path. Any shape can be printed.
  • Pull reveal: a ragged squeegee front as a clip (a ~30 u drag tail); blade, bead and a sliver of handle ride on it.
  • Ink bead: a round tube with lit half, dark underside, rolling glints and viscous strands; a split fountain puts several colours in one bead.
  • Screen: a hinged frame with mesh, emulsion and tape; its shadow is a ring (even-odd), never a full rectangle.
  • Shapes: ridges with a jagged lit facet, pines as one outline of drooping tiers, water as a flat body with glint bars. Hard edges everywhere.
  • Poster template (1000×1500 u): paper border, art area, a dark info band at the foot holding a name, a number, a rule and a row of stats; columns sized by content.
  • Texture budget: fine paper tile, mottle multiply ~55 %, pinholes ~75 %, light encode grain. More reads as risograph.

3. Colour logic

  • One palette per poster, ≤ 6 inks, assigned by role: light sky, deep sky / bands, far, mid, near (darkest; also the info band), and one bright accent (sun, route, highlights, key number). An optional lit-face ink.
  • Values step from far (light) to near (dark); depth is value, never blur.
  • The accent is rare: the sun or light source, the one route or product, the most important number.
  • Paper is a colour: an unprinted area is the brightest thing on the sheet (water, snow, a beam of light).
  • A series = one template, a new palette per item (time of day, season, colourway, neighbourhood). Re-inking the same geometry in another palette is a statement.
  • Text inks are chosen by contrast against the ink underneath (WCAG), never by a fixed key; a night palette must not swallow a header.
  • Examples (sky1 → near, accent): dawn #F6CD98 #EE9A73 #9A7FA8 #3E7079 #1E3B3F #FBE6B4; harbour noon #E8F0F2 #7FB3C8 #D9C7A3 #2F6E8E #173247 #E8553D; winter #EEF1F4 #B8C9D9 #8B9BB0 #4A5D78 #1F2A3C #F2B134.

4. Type & subtitles

  • Condensed display for names and values (e.g. Big Shoulders Display, League Gothic), auto-fit; a geometric sans for letter-spaced labels (e.g. Outfit 600).
  • Headers are printed into the sky, tracked out; the info band is printed last.
  • The poster text is the subtitle. No narration is needed; if there is a voice, subtitles are a printed strip (a band pull), never a floating caption.
  • Reading rule: each text stays ≥ chars/12 + 1 s (min 1.5 s) after its last item lands, and ≥ max(1.8 s, speech + 0.6 s) with a voice. Compute it from the content, round up to the beat.
  • On a wall shot, labels stay ≥ ~18 px and values ≥ ~30 px at 1080p; close-ups on a band keep the whole band in frame with ≥ 5 % side margins.

5. Motion quality

  • Pulls are linear and steady (a squeegee does not ease). Accent inks start half a beat after the main ink of their layer.
  • Info items print left to right on subdivisions of the beat. There is no fade anywhere.
  • Screen lift: the frame hinges up (vertical squash + growing shadow) in ~0.4 s.
  • Palette re-ink: a wide squeegee travels diagonally over the sheet in ~0.35 s; geometry identical on both sides of the blade, only the inks change. Show only the blade, bead and a sliver of handle.
  • Loose layers: in a multi-plane move, planes parallax by depth with paper gaps and thickness shadows, then snap into register on one hit.

6. Camera grammar

A vocabulary, not a route. Opening and ending come from the topic.

Move Expresses Can serve
Truck with the squeegee, slight roll, frame edge in view the act of printing; colour arriving a hook; a split-fountain sky
Locked top-down full sheet layers stacking into a picture watching a poster build; a comparison
Fast pull-back as the screen lifts the reveal of a finished layer a scene complete; a title
Push + tilt to the info band reading facts; a date; a price
Truck through a foreground silhouette (tree, lamp post, sail) in screen space passing into the next poster poster-to-poster transitions
Crane through loose planes (multi-plane parallax) depth, a journey inside the print a route; a climb; a street
Slow lateral dolly along a row of prints a set, a range a series wall; colourways
Push into the mesh until the weave shows the craft, the grain of the medium an intimate beat; a detail
Log-zoom pull-back to the wall or window the poster in the world a final lockup (hold ≥ 3 s)

Close-ups on a sheet keep its edge in frame; a squeegee across a close-up is tilted with the handle hidden, so it doesn't split the frame. Layers change by squeegee, posters through foreground silhouettes or a table move. No dissolves, no bare cuts.

7. Sound palette

  • Acoustic, hand-played instruments: strummed guitar, slide guitar, harmonica, upright bass, cajon or brushes, banjo, fiddle, accordion, harmonium, ukulele. Choose the family from the place: folk, surf, bossa or brass band all fit.
  • One pull, one hit: each ink lands on a musical event (a strum, a hit, a chord change); accelerate by subdividing, not by changing tempo. A registration snap is a loud downbeat.
  • Foley by material: squeegee on mesh (band-passed noise with a ~220–280 Hz mesh grain; faster = brighter), wet ink squelch, screen clack and hinge creak, paper stamps, ticks for dashed routes, paper hiss, a wood-and-metal clamp, drying-rack clips.
  • Ambience from inside the print: a finished scene may "wake up" (surf, street, crowd), J-cut in and L-cut out. Room tone under the table.
  • Silence as a tool: the music drops out for a beat before the key facts; what remains is one ambience, and the first sound after is a decisive gesture (a clamp, a long slide up).
  • Music ducks a few dB under foley. −14 LUFS.

8. Native moves

Each serves information order. A menu: use the ones your film needs.

  • One ink, one beat. Facts print last, when they are read. Fits content like: museum hours; a ferry timetable; tasting notes.
  • Split fountain. Several inks in one pull fill the frame with colour. Fits content like: a festival's night sky; a sunset beach bar; a rainbow of colourways.
  • Palette re-ink. Same poster, another palette = time passing, a season, a variant. Fits content like: summer vs winter hours; three jacket colourways; day and night at a market.
  • Registration slip → snap. Loose layers clamp into register with one hit, before the key facts. Fits content like: the date of a race; a launch price; a ticket sale opening.
  • Paper as a colour. The unprinted sheet is the brightest element. Fits content like: a ski slope; a lighthouse beam; fresh snow on a roof.
  • The route as a printed layer. A dashed accent line stamped segment by segment. Fits content like: a bus line; a marathon course; a delivery path.
  • The series wall. Every print ends up hung together as the final lockup. Fits content like: a city's four districts; a band's tour dates; a product family.

9. Pitfalls of the medium

  • Stroke edge effects draw internal lines on unioned paths → fills only (fill, then fill shifted inside a clip).
  • A full-rectangle screen shadow muddies the print → ring shadow.
  • Cool shadow facets next to water read as water → shadows in the near ink.
  • Jagged ink beads read as paper edges → a round bead.
  • Parallax alone reads as "the mountains are moving" → paper gaps and thickness while loose, snapped to zero with a sound.
  • Silhouette wipes hold a dark blank → centre on the switch so full cover lasts ~1 frame.
  • Very wide banners are slivers in 16:9 → about 4:1.
  • Random coloured dots on the table read as confetti → a real workbench (planks, grain, muted stains, tape).
  • Too many items at honest reading times overrun the length → print items side by side in the same pulls, or let secondary ones be read on the final wall.

10. Engine

demo/engine/silk.js prints any shape in this style from a Path2D: makeTextures, paperSheet, ink(ctx, {path, knock, paint}, {color, reg, clip, sheen, trap}), wipeRegion/wipeFront (ragged pull), squeegee (blade, beads, split fountain), screenFrame, inkFinish, bandSteps (the gradient substitute), shape helpers. demo/engine/poster.js (template, banner, pickInk contrast), demo/engine/scenes.js (planes you can reorder or extend), demo/film.js (timeline and shots). API table and a minimal example that prints a new shape: DEMO.md.

11. Variation space

You decide the subject, the scenes and their planes, the palettes within the colour logic, the number of posters, the camera path, the opening, the ending, the instrument family and the length. Use cases are grammar for the order and duration of information; build your own timeline from the user's facts.

Use case Information order (print order) Hold per layer Length
Trail / attraction guide place → per item: scene → name → difficulty → distance → time → footer title ~3 s; name ≥ chars/12 + 1 s; stat row ≥ 2.2–3 s after its last item 30–40 s, 3 items
Event / festival poster scene pulls → headline → date → venue → call to action headline 2.5 s, date + venue 3 s, final 3 s 15–20 s
Destination series one template, a palette per place: name → one fact → series wall 2.5 s per poster + 4 s wall 20–30 s
Product drop layers around a flat product silhouette → name → colourway ×3 (re-ink) → price / date 1.8 s per colourway 12–18 s
Seasonal / hours notice one poster re-inked per season → season + hours 2 s per swap 10–15 s

All far from our demo:

  • Structures: one poster, many runs (re-inked for each of four nights, the line-up changing in the band); a street walk (one multi-plane truck down a street, each shop sign printed as we pass); a misprint story (registration drifts until the last pull lands true on the date).
  • Openings: the empty screen (light through a blank mesh, a stencil being exposed); the accent first (a lone product in the bright ink on bare paper); the finished wall at night, then back to the table.
  • Endings: the drying rack (prints clipped in a row, swaying); the poster in use (pasted on a bus shelter, rain starting); the last pull is paper (the squeegee runs dry, leaving a white silhouette).

Swapping demo/content.json and rebuilding is a technical check that the engine re-flows, not a way to make a film.


How our demo was made (story, shots, score, end card, build, content fields): DEMO.md. Read it after your treatment exists.

Director's notes for the demo film

One example among many. Don't reuse its story, arc, shots, props or timings.

Demo: Three Trails (38.4 s) · silkscreen-poster.mp4 · source in demo/

Story & structure

A trail guide for a fictional park: three trail posters are printed, one faster than the last, the third is climbed in one long take, and all three end up on a visitor-center wall. No narration.

This is the first use case of STYLE.md §11 (trail / attraction guide). Shot structure: title banner pull → poster 1 printed layer by layer → poster 2 printed on eighth notes → last poster climbed in one take → pull back to the wall. Information order: park title → scene → trail name → difficulty → distance → time → climb → footer. Holds: title 3.2 s; name ≥ chars/12+1 s; stat row ≥ 2.2–3.0 s after its last item; 30–40 s for 3 trails.

The other use cases in STYLE.md §11 use the same engine: a scene is just a list of planes, the band template takes any 1–4 facts, and swap re-inks a whole poster in another palette.

How the native moves serve information (not story):

  • One ink, one beat: each pull is one musical hit, so the eye is led through the layers in order and the facts are printed last, which is exactly when they are read.
  • Split fountain: several inks in one pull. It opens the film, because one stroke fills the frame with colour.
  • Palette re-ink: the whole poster pulled again in the next time-of-day palette. In the demo this is the data point "7 h": the day passes while the camera climbs.
  • Registration slip → snap: during the climb the layers hang loose (white gaps, paper-thickness shadows), then clamp into register with one hit. This is the only time the film pauses before the most important facts.
  • Paper as a colour: the waterfall is simply unprinted paper, the brightest thing on the sheet.
  • The trail as a printed layer: the route is a dashed line in the sun ink, stamped segment by segment as the camera follows it.

Shots

Move Use Demo
Truck with the squeegee, slight roll (−1.7°), frame edge and handle ends in view hook: the squeegee holds its place in frame while the bands stream past 0–1.0 s
Fast pull-back (ease-out 0.65 s) reveal the whole print as the screen lifts 1.0–1.65 s
Tilt across the print table from one sheet to the next 4.8 s
Locked top-down full shot watching layers stack 5.4–7.8 s
Push + tilt to the info band reading 7.8–9.0 s
Truck through a foreground tree (screen-space silhouette in the previous poster's near ink, covers the frame for about 1 frame) poster-to-poster transition 13.2 s, 19.2 s
Pull-back from a detail to the whole sheet "the white is the waterfall" 14.4 s
Crane up the trail, multi-plane parallax (signature) the hardest trail, one take 19.2–23.4 s
Tilt down from summit to band the climb ends in the data 24.0 s
Log-zoom pull-back to the wall final lockup, hold ≥ 3 s 29.4–30.6 s

Unified transition grammar: layers change by squeegee; posters change through foreground trees; the film ends with a squeegee pulling the end-card ink. No dissolves and no bare cuts.

Demo motion numbers: info band items 0.18 s each on eighth notes; accent inks sub: 1 (half a beat late); screen lift 0.4 s; palette swap blade at −12° over 0.35 s; climb parallax (camTopY − camY) × (depth − 1) × 0.42, each spur slides sideways (Gaussian bump, 190 u × depth); paper gaps 3 u and thickness shadows 9 u at 28 %, scaled by "looseness", zero on the registration snap. Hook truck roll −1.7°.

Score structure

  • Music: American outdoor folk, 100 BPM, D major, open-D guitar strums (physical model), slide guitar (numpy), VCSL harmonica, cajon kick, brushes, upright bass. Each pull is one strum, and the chords climb D – D/F# – G – A as the layers come nearer. Poster 2 doubles to eighth notes (acceleration). The climb builds instrument by instrument. The registration snap is the loudest downbeat in the film.
  • Foley by material: squeegee on mesh (band-passed noise with a 220–280 Hz amplitude grain from the mesh; faster pull = brighter), wet ink "squelch" (falling sine plus sticky noise), aluminium screen clack plus hinge creak, paper stamps for stats, 16th-note ticks for trail dashes, a paper hiss for sliding layers, and a wood-and-metal registration clamp.
  • Ambience: studio room tone; the lake inside poster 1 fades in when the screen lifts (the print "wakes up"); waterfall (J-cut 0.9 s early); mountain wind (J-cut into the silence, L-cut out onto the wall); visitor-center murmur, a door, footsteps.
  • Silences: 18.0–19.2 s (music off; the waterfall tail fades to about −59 dBFS; the first sound after it is a long slide up) and 23.4–24.0 s (wind only; the first sound after it is the clamp plus the full band).
  • Music ducks 2.5 dB under foley. Master: −14 LUFS.

Palette & props

  • Palette discipline: one palette per poster, 6 inks: sky1 (light sky), sky2 (deep sky / bands), far, mid, near (darkest, also the info band), sun (the one bright accent: sun, trail, difficulty, climb). An optional glow is the lit face of mountains. A given poster should use ≤ 6 of these. The demo palettes are:
    • dawn #F6CD98 #EE9A73 #9A7FA8 #3E7079 #1E3B3F #FBE6B4
    • noon #E4EEDC #86BCD0 #C2AE92 #4C8753 #1D4331 #F2C14A
    • golden #F7D787 #E9A94F #A57C68 #5E7A45 #2B3A28 #FFF1C4
    • dusk #F4B461 #D8613F #7C3E5F #43325A #1B1B2F #FBE3A6
    • Paper #F2E8D2. Title banner #F7C66B #E4683F #2F6F73 #1C2A33.
  • Contrast is automatic: text inks are picked by WCAG contrast against the ink underneath (pickInk). A night palette will not make the header vanish.
  • Shapes: mountains are midpoint-displaced ridges with a jagged lit facet; pines are one outline of drooping tiers plus a short trunk; water is a flat body with horizontal glint bars; forests are rows of pines on a solid base. Everything is drawn with hard edges.
  • Poster template (units 1000×1500): paper border 26 u; art area to y = 1140; the scene is shifted up 50 u, so a little sky is cropped to make room for the info band. The band (y 1148–1474, near ink) holds the trail name (Big Shoulders Display 900, up to 122 u, auto-fit), the number 01–04 in sun, a 6 u sun rule, and a row of stats: labels 34–38 u (Outfit 600, letter-spaced), values 48–68 u (Big Shoulders 800). Columns are sized by content. On a wall at 0.49 scale, labels are about 18 px and values about 31 px.
  • Header: park name tracked out at 62 u, printed in the sky.
  • Texture budget: paper tile at 0.6 u per texel, mottle multiply at 55 %, pinholes at 75 %, then ffmpeg grain 3. More than this starts to read as risograph.

Titles & text

No narration and no subtitles: the poster text is the information. The title card is a printed 4:1 banner (1800×440 u, title split into two balanced lines), framed to fill the width (≈5 % margins, ≈40 % of frame height), which becomes the header of the final wall (hung at 1150 px wide so the posters keep ≥30 px values). Reading rule used in the demo: each text stays ≥ chars/12 + 1 s (min 1.5 s) after its last item lands. The timeline computes this from content.json and rounds up to the beat.

End card

The end card is printed as a last landscape mini-poster in two pulls: a split-fountain pull for the art (sky bands, sun ring, ridge, trail dashes, title), then a near pull for the info band (style name, Lemo-Opuscar, LemoLab × Claude Opus 5.5, font and sample credits). The "LemoLab × Claude Opus 5.5" sign-off belongs to this library's demo only; a user's film carries no LemoLab credit and no copy of this card.

Build notes

sh styles/silkscreen-poster/demo/build.sh rebuilds everything:

  1. tools/timeline.mjs prints the timeline derived from content.json.
  2. core/render/events.mjs → events.json (every pull, lift, band, name, item, wipe, swap, part, silence, clack).
  3. music/compose.py reads events.json → score.wav plus stems.
  4. mix.py → mix.wav (ambience, foley, ducking, silence windows).
  5. tools/cuecheck.py checks the mix onsets against the events: median error 4 ms; 30/33 within 1 frame. The rest are overlapping events and slow harmonica attacks.
  6. Render (--workers 2, through a render limiter if your machine has one) → mux.sh … 24 3.

Files: engine/silk.js (print engine), engine/scenes.js (5 built-in scenes), engine/poster.js (template, banner, contrast), film.js (timeline and shots), mix.py, music/compose.py. Roughly 0.1 s per frame; a full render takes under a minute.

Pitfalls we hit

  • Stroke-based edge effects draw internal lines on unioned paths. A forest drawn as a union of pines showed every tree outline. Do sheen and trap with fills only: fill the shape, then fill it again shifted, inside a clip.
  • Screen shadow darkened the whole print. The frame's drop shadow must be a ring (even-odd), not a full rectangle, or everything under the mesh looks muddy.
  • Blue shadow facets on granite read as water. Keep shadow planes in near and put them on the inside faces next to the waterfall.
  • A thick squeegee across a close-up splits the frame into "two pictures". Tilt the blade, hide most of the handle, and keep the geometry continuous across it.
  • Jagged-triangle ink beads read as paper edges. The bead needs roundness: lit half, dark underside, highlight and strands.
  • Parallax alone reads as "the mountains are moving". Show paper gaps and thickness shadows while layers are loose, and snap them to zero with a sound.
  • Night palettes hid the header and labels. Choose text inks by contrast (pickInk), never by a fixed key.
  • Wet-sheen gradient stuck at the end of the pull (condition p < 1.02 stays true forever). Fade it out by time.
  • Tree-wipe covered the frame for 0.4 s (a dark blank). Centre the silhouette on the switch time so full cover lasts about 1 frame.
  • Four trails at these reading times run to about 45 s. See "Four trails in 40 s" below for how to compress.
  • A 7:1 title banner is a sliver in a 16:9 frame (about 1/5 of the height, lots of empty table). Make the banner about 4:1 so it can fill the width and about 40 % of the height.
  • Random coloured dots on the table read as confetti or placeholders. Build a real workbench: planks, grain, knots, a few large muted ink stains and torn tape.
  • Close-ups on an info band must keep the whole band in frame with ≥5 % side margins (z ≤ 1.75 for a 1000 u poster). Close-ups on a sheet being printed must keep the sheet's edge in frame, or the viewer sees only a flat colour.

Engine reference

engine/silk.js prints any shape in this style: it only needs a Path2D in whatever units the current transform uses.

Function What it does
makeTextures(paperHex, seed) paper, mottle and pinhole tiles (once)
paperSheet(ctx, T, x, y, w, h) paper stock
ink(ctx, part, o) one ink layer. part = { path, knock?, paint? } (knock = knocked-out holes, paint(ctx) = custom fill such as text). o = { color, reg:[dx,dy], clip, sheen, trap }
wipeRegion(box, dir, p, seed) / wipeFront(...) the ragged squeegee front as a clip path, and where the blade is
squeegee(ctx, a, b, lead, o) blade from a to b moving along lead; o.beads=[{t0,t1,color}] (split fountain), roll, handle 0–1, scale
screenFrame(ctx, box, o) hinged screen with mesh, emulsion and tape; lift 0–1
inkFinish(ctx, T, x, y, w, h) mottle and pinholes over the sheet
bandSteps(x, w, y0, y1, n) stepped colour bands (the gradient substitute)
ridgeLine, polyPath, circlePath, ringPath shape helpers

engine/poster.js: buildPoster(content, trail, i, n), drawPoster(ctx, P, { pal, T, prog, off, reg, sep, swap, items, … }), drawBanner, pickInk. engine/scenes.js: buildScene('lake'|'waterfall'|'ridge'|'forest'|'coast') returns planes you can reorder or extend.

Minimal example: a warm-orange #D97757 four-point spark with a cursor tail, printed in two inks and knocked out of a sky, then pulled in by the squeegee:

import { makeTextures, paperSheet, ink, wipeRegion, wipeFront, squeegee, inkFinish, polyPath, rectPath, circlePath } from './engine/silk.js';
const T = makeTextures('#F2E8D2');
paperSheet(ctx, T, 0, 0, 800, 600);
const spark = polyPath([[400,180],[430,270],[520,300],[430,330],[400,420],[370,330],[280,300],[370,270]]);
const tail = rectPath(540, 285, 160, 30);
const p = 0.7;                                                    // 70 % of the pull done
const clip = wipeRegion([0, 0, 800, 600], 'right', p, 3);
ink(ctx, { path: rectPath(0, 0, 800, 600), knock: circlePath(400, 300, 150) }, { color: '#1C2A33', clip, sheen: 1 });   // sky with a knocked-out halo
ink(ctx, { path: spark }, { color: '#D97757', reg: [2, -1], clip, sheen: 1, trap: 1 });
ink(ctx, { path: tail }, { color: '#D97757', reg: [2, -1], clip, sheen: 1 });
const x = wipeFront([0, 0, 800, 600], 'right', p);
squeegee(ctx, [x + 10, -20], [x + 10, 620], [1, 0], { color: '#D97757', roll: x / 30 });
inkFinish(ctx, T, 0, 0, 800, 600);

Single-colour posters: keep one palette key (usually sun) as the only colour and set the other inks to tints of one hue. pickInk keeps the text legible.

content.json fields

All text, data and colour come from demo/content.json; film.js has no copy in it.

Field Type Range If out of range
park string ≤ 22 chars header is letter-spaced at 62 u; longer names overflow the sky width (shorten or reduce tracking)
title string ≤ 34 chars auto-fits 132 → 60 u on the banner; under 60 u it gets too small to read
footer string ≤ 45 chars one line in the banner strip; the wall hold grows with its reading time
trails[] array 1–4 1 = press only (no climb); 2 = press + climb; 3 = press, quick, climb; 4 = press, quick, quick, climb (about 45 s, see below). Above 4, the wall posters become too small to read
trails[].name string ≤ 22 chars auto-fits 122 → 60 u
trails[].difficulty easy | moderate | hard | expert — unknown values show 1 filled triangle
trails[].distance number any printed as 3.2 KM (unit from units.distance)
trails[].time string ≤ 7 chars (1 h, 45 min) the column widens and all values shrink together (min 48 u)
trails[].elevation number | null null hides the CLIMB column shown in sun ink as ↑1,100 M
trails[].scene lake | waterfall | ridge | forest | coast built in unknown → lake
trails[].time_of_day key into palette dawn, noon, golden, dusk, night missing → noon. The climb re-inks from the previous trail's palette through golden to this one
palette.<time> {sky1, sky2, far, mid, near, sun, glow?} hex text contrast is checked automatically
palette.paper, palette.wall, banner_time hex / object / key — —

Steps: edit content.json → sh demo/build.sh. There is no TTS; the music and mix re-time themselves from events.json. To preview another file without overwriting: node core/render/still.mjs styles/silkscreen-poster/demo 30 --q content=content_alt.json.

Four trails in 40 s: the reading rule makes each middle poster about 6 s long. Options, in order of preference:

  1. Print the two middle posters side by side on one table in the same pulls (one quick section, two bands, read together).
  2. Drop the per-item stamp spacing from an eighth note to a sixteenth for middle posters.
  3. Skip the band close-up on middle posters and let them be read on the final wall (extend the wall hold by 2 s).

content_alt.json (4 walks, dawn/golden/noon/night, a new park, wall and banner palette) is the tested example. Its stills are in demo/stills/alt_*.jpg.

Minimal content:

{ "park": "Pine Lake", "title": "One Walk at Pine Lake", "footer": "Open dawn to dusk",
  "units": { "distance": "km", "elevation": "m" }, "banner_time": "dawn",
  "trails": [ { "name": "Shore Path", "difficulty": "easy", "distance": 2, "time": "40 min",
                "elevation": null, "scene": "lake", "time_of_day": "dawn" } ],
  "palette": { "paper": "#F2E8D2",
    "dawn": { "sky1": "#F6CD98", "sky2": "#EE9A73", "far": "#9A7FA8", "mid": "#3E7079", "near": "#1E3B3F", "sun": "#FBE6B4" } } }

Swapping this file and running build.sh checks that the engine re-flows; it is not how a user's film is made.