mirror of
https://github.com/heygen-com/hyperframes.git
synced 2026-09-11 14:50:02 +00:00
930 lines
35 KiB
Markdown
930 lines
35 KiB
Markdown
# Media treatment recipes
|
|
|
|
These are optional tested seeds, not the complete capability surface. Read the
|
|
shared policy and choose one relevant section through `media-treatments.md`.
|
|
Agents may modify or combine a seed with compatible canonical controls after
|
|
inspecting the media, or assemble a bespoke payload from
|
|
`hyperframes media-treatment --capabilities --json` when no seed fits.
|
|
|
|
## Natural Portrait
|
|
|
|
Use for a talking head, interview, presenter, or people-focused photo whose
|
|
intended result is natural, polished, and restrained.
|
|
|
|
Do not use when the face is incidental or tiny, the source is intentionally
|
|
neon/monochrome/strongly stylized, or the requested result is beauty retouching.
|
|
This treatment changes the whole frame; it is not a face mask or skin-smoothing
|
|
effect.
|
|
|
|
Inspect face exposure, highlight retention, shadow detail, white balance, and
|
|
whether the existing look is intentional. Signalstats do not detect faces or
|
|
creative intent.
|
|
|
|
### Base payload
|
|
|
|
Start here, then tune only when the sampled frames justify it:
|
|
|
|
```json
|
|
{ "preset": "skin-soft", "intensity": 0.6 }
|
|
```
|
|
|
|
`skin-soft` is a global tonal/color preset whose vibrance math is reduced for
|
|
skin-like colors. It does not blur, retouch, segment, or track a face.
|
|
|
|
### Bounded tuning
|
|
|
|
Adjustment values are absolute values in the final payload, not deltas added to
|
|
the preset. Keep changes inside these conservative ranges unless the user asks
|
|
for a stylized result:
|
|
|
|
| Property | Natural Portrait range |
|
|
| ----------- | ---------------------- |
|
|
| intensity | 0.45 to 0.75 |
|
|
| exposure | -0.06 to 0.14 |
|
|
| contrast | -0.05 to 0.08 |
|
|
| highlights | -0.18 to -0.04 |
|
|
| shadows | 0.04 to 0.18 |
|
|
| whites | -0.10 to 0.04 |
|
|
| blacks | -0.06 to 0.06 |
|
|
| temperature | -0.05 to 0.10 |
|
|
| tint | -0.03 to 0.05 |
|
|
| vibrance | 0 to 0.06 |
|
|
| saturation | -0.04 to 0.06 |
|
|
|
|
Leave grain, blur, and pixelate at zero. A vignette is optional at `0` to
|
|
`0.05` only when it improves subject focus without looking like an effect.
|
|
|
|
Manual controls must stay inside their schema section; they are never
|
|
top-level keys. A tuned Natural Portrait payload looks like this:
|
|
|
|
```json
|
|
{
|
|
"preset": "skin-soft",
|
|
"intensity": 0.58,
|
|
"adjust": {
|
|
"highlights": -0.08,
|
|
"shadows": 0.08,
|
|
"temperature": 0.02,
|
|
"vibrance": 0.02
|
|
},
|
|
"details": { "vignette": 0.03 }
|
|
}
|
|
```
|
|
|
|
Use the same nested shape in `grade-compare` candidate files. `adjust` owns
|
|
tonal/color controls, `details` owns vignette/grain, and `effects` owns blur,
|
|
pixelate, chroma bleed, and the advanced treatment primitives below.
|
|
|
|
During the common comparison, reject any result that makes skin implausible,
|
|
loses highlight detail, flattens or desaturates dark skin, or casts clothing and
|
|
background colors accidentally.
|
|
|
|
## Product Polish
|
|
|
|
Use for photographed or filmed physical products when the goal is clean,
|
|
accurate, dimensional presentation. Protect product color, material texture,
|
|
label readability, specular highlights, and intentional lighting.
|
|
|
|
Do not use this treatment for literal app/site screenshots or screen captures;
|
|
follow UI Fidelity below. Do not neutralize a lifestyle scene's deliberate
|
|
ambient color, and do not infer exact brand-color correction without a neutral
|
|
reference or known product color.
|
|
|
|
Inspect the product separately from its background. Check white balance, label
|
|
legibility, surface texture, highlight clipping, shadow detail, white point,
|
|
and black point. Statistics cannot identify a white package, metallic
|
|
highlight, amber glass, or intentional warm light.
|
|
|
|
### Base payload
|
|
|
|
Compare this restrained correction against the untouched source:
|
|
|
|
```json
|
|
{
|
|
"intensity": 0.7,
|
|
"adjust": {
|
|
"exposure": 0.01,
|
|
"contrast": 0.06,
|
|
"highlights": -0.1,
|
|
"shadows": 0.04,
|
|
"whites": 0.02,
|
|
"blacks": -0.03,
|
|
"vibrance": 0.03,
|
|
"saturation": 0.02
|
|
}
|
|
}
|
|
```
|
|
|
|
This is a comparison starting point, not an instruction to change an already
|
|
finished source. If the original has accurate color, clean endpoints, and good
|
|
texture, leave the pixels unchanged and polish through framing or motion.
|
|
|
|
### Bounded tuning
|
|
|
|
| Property | Product Polish range |
|
|
| ----------- | -------------------- |
|
|
| intensity | 0.45 to 0.8 |
|
|
| exposure | -0.08 to 0.1 |
|
|
| contrast | 0 to 0.1 |
|
|
| highlights | -0.16 to 0 |
|
|
| shadows | 0 to 0.12 |
|
|
| whites | -0.08 to 0.05 |
|
|
| blacks | -0.06 to 0.04 |
|
|
| temperature | -0.05 to 0.05 |
|
|
| tint | -0.03 to 0.03 |
|
|
| vibrance | 0 to 0.06 |
|
|
| saturation | -0.04 to 0.05 |
|
|
|
|
Temperature and tint stay at zero unless the frames show a plausible cast.
|
|
Leave grain, vignette, blur, and pixelate at zero for catalog/e-commerce media.
|
|
For a lifestyle product shot, a vignette up to `0.04` is acceptable only when
|
|
it improves focus without changing the product itself.
|
|
|
|
During the common comparison, reject any result that clips white packaging,
|
|
muddies black products, shifts a known brand color, hides texture, or makes
|
|
labels harder to read. Report when preserving the original was the deliberate
|
|
decision.
|
|
|
|
## UI Fidelity
|
|
|
|
Use for literal app, website, dashboard, terminal, slide, or screen-recording
|
|
pixels whose colors and readability are part of the product being shown.
|
|
|
|
The default payload is **none**: do not add `data-color-grading`. Global color
|
|
changes affect brand colors, status colors, charts, screenshots, and tiny text
|
|
together, so even a tasteful photographic look can make the demonstration less
|
|
truthful.
|
|
|
|
Polish UI footage with crop, scale, pacing, cursor emphasis, surrounding DOM
|
|
overlays, or seek-safe motion outside the captured pixels. If the user
|
|
explicitly asks for a stylized UI look, preview it against the original and
|
|
state that exact UI color is no longer preserved. If a camera filmed a screen,
|
|
correct only a demonstrated capture cast or exposure issue and still verify
|
|
text and brand colors across representative frames.
|
|
|
|
## Film Memory
|
|
|
|
Use when the story explicitly calls for a warm memory, restrained flashback,
|
|
personal archive, or film-like recollection. This is not the default meaning of
|
|
"cinematic", and it is not scanned-film-stock emulation.
|
|
|
|
Do not use for literal UI, product catalog media, technical demonstrations, or
|
|
footage whose accurate current-day color is important. Use a separate camcorder
|
|
treatment for VHS/REC language. Do not add dust, scratches, light leaks, film
|
|
burns, or halation unless an owned component is available and the requested
|
|
story actually benefits from it.
|
|
|
|
Check that the source has enough highlight and shadow detail to tolerate a
|
|
faded treatment, and confirm nostalgia or temporal separation belongs in the
|
|
story. Compare the full moving treatment, not only a still preset card.
|
|
|
|
### Static pixel base
|
|
|
|
Start with this owned shader recipe:
|
|
|
|
```json
|
|
{
|
|
"preset": "vintage-wash",
|
|
"intensity": 0.6,
|
|
"details": {
|
|
"vignette": 0.12,
|
|
"grain": 0.12,
|
|
"grainSize": 0.2,
|
|
"grainRoughness": 0.6
|
|
}
|
|
}
|
|
```
|
|
|
|
Keep the static values inside these ranges:
|
|
|
|
| Property | Film Memory range |
|
|
| -------------- | ----------------- |
|
|
| intensity | 0.5 to 0.75 |
|
|
| vignette | 0.08 to 0.16 |
|
|
| grain | 0.08 to 0.16 |
|
|
| grainSize | 0.16 to 0.24 |
|
|
| grainRoughness | 0.5 to 0.7 |
|
|
|
|
The stronger end can flatten dark skin, black clothing, or already-faded
|
|
footage. Compare against the source and lower strength when it does.
|
|
|
|
### Temporal character
|
|
|
|
Use the existing registered paused GSAP timeline on the same media element:
|
|
|
|
- author `--hf-color-grading-exposure: 0` in the media element's inline
|
|
`style`;
|
|
- move it through a finite irregular sequence within `-0.03` to `0.03`, using
|
|
gentle `sine.inOut` segments around `0.45` to `0.8` seconds;
|
|
- for gate weave, keep `x`/`y` within `0.15%` of the shorter composition edge,
|
|
rotation within `0.03` degrees, and scale between `1.005` and `1.01` to
|
|
protect the frame edges;
|
|
- return close to the starting exposure and transform at the treatment end.
|
|
|
|
Do not use randomness, infinite CSS keyframes, timers, or `onUpdate`. Flicker
|
|
is a gentle exposure pulse, not a flash. Weave is slight mechanical drift, not
|
|
handheld shake.
|
|
|
|
Also run focused keyframe diagnostics and seek directly to the final-minus-frame
|
|
position. Reject brightness pumping, distracting drift, clipped edges, or
|
|
skin/detail loss. Report the motion ranges and describe this as an HF
|
|
film-memory treatment, not camera-stock emulation. If motion reads as an effect
|
|
before it reads as a memory, reduce or remove it.
|
|
|
|
## Creator Camcorder
|
|
|
|
Use when the story explicitly calls for a creator-camera recording, consumer
|
|
camcorder memory, or restrained digital-video character. This treatment is a
|
|
modern camcorder language, not VHS restoration, CRT simulation, surveillance,
|
|
or a promise to reproduce a specific camera model.
|
|
|
|
Do not apply it to literal UI, product catalog media, tiny media tiles, or
|
|
already compressed footage that has distracting color bleed. Do not add a REC
|
|
HUD merely because the source contains a person talking; the camera-device
|
|
language must support the story or the user's requested style.
|
|
|
|
Check skin, saturated edges, fine text, source compression, and whether the
|
|
source already has a deliberate camera look. Reject softened chroma that
|
|
damages labels, graphics, or identifying product color. Judge chroma softness
|
|
and grain in motion, not one still.
|
|
|
|
### Static pixel base
|
|
|
|
Start with the proven shader payload below, then tune only inside the bounded
|
|
ranges when representative frames justify it:
|
|
|
|
```json
|
|
{
|
|
"intensity": 0.72,
|
|
"adjust": {
|
|
"contrast": 0.08,
|
|
"highlights": -0.05,
|
|
"shadows": 0.02,
|
|
"whites": 0.03,
|
|
"blacks": -0.04,
|
|
"temperature": -0.03,
|
|
"tint": -0.015,
|
|
"vibrance": -0.03,
|
|
"saturation": -0.06
|
|
},
|
|
"details": {
|
|
"vignette": 0.06,
|
|
"grain": 0.08,
|
|
"grainSize": 0.18,
|
|
"grainRoughness": 0.58
|
|
},
|
|
"effects": { "chromaBleed": 0.55 }
|
|
}
|
|
```
|
|
|
|
| Property | Creator Camcorder range |
|
|
| -------------- | ----------------------- |
|
|
| intensity | 0.55 to 0.8 |
|
|
| contrast | 0.03 to 0.1 |
|
|
| highlights | -0.1 to 0 |
|
|
| shadows | 0 to 0.06 |
|
|
| whites | 0 to 0.05 |
|
|
| blacks | -0.08 to -0.01 |
|
|
| temperature | -0.06 to 0.04 |
|
|
| tint | -0.03 to 0.02 |
|
|
| vibrance | -0.06 to 0.02 |
|
|
| saturation | -0.12 to -0.02 |
|
|
| vignette | 0.03 to 0.1 |
|
|
| grain | 0.04 to 0.12 |
|
|
| grainSize | 0.14 to 0.24 |
|
|
| grainRoughness | 0.45 to 0.7 |
|
|
| chromaBleed | 0.35 to 0.7 |
|
|
|
|
Leave blur and pixelate at zero. Square pixels, scanlines, RGB splitting, and
|
|
tracking noise are different visual languages and are not defaults for this
|
|
treatment.
|
|
|
|
### Optional camera HUD
|
|
|
|
When the narrative benefits from explicit recording-device language, install
|
|
the Registry overlay block:
|
|
|
|
```bash
|
|
npx hyperframes add camcorder-hud --no-clipboard
|
|
```
|
|
|
|
Insert the printed `data-composition-src` host over the intended media range.
|
|
Edit the displayed date/time/mode/counter in
|
|
`compositions/camcorder-hud.html`. The block's paused GSAP timeline derives
|
|
its counter and REC blink from composition time, so play, scrub, and render
|
|
agree. Keep the HUD finite and scoped to the shot.
|
|
|
|
The HUD is an optional authored overlay. The pixel payload remains useful
|
|
without it, and the HUD alone is not evidence that the footage was treated.
|
|
|
|
### Optional source-to-camera reveal
|
|
|
|
Global grading intensity fades only primary correction and LUT output; it does
|
|
not fade the independent camcorder effects. For a visible source-to-camera
|
|
mode change, use two synchronized media layers and a finite opacity crossfade
|
|
from untreated to treated footage. Fade the HUD in on that same paused GSAP
|
|
timeline. Do not animate shader state with callbacks or an independent clock.
|
|
|
|
Also verify HUD placement and framing in each aspect ratio the project supports.
|
|
Report whether the HUD was used and describe this as an HF camcorder treatment,
|
|
not camera/VHS emulation. If an effect artifact is more noticeable than the
|
|
subject, reduce chroma bleed/grain or keep the source unchanged.
|
|
|
|
## VHS Playback
|
|
|
|
Use when the story explicitly calls for analog home-video tape, a dated archive,
|
|
or a visibly degraded VHS playback. This treatment is not Creator Camcorder,
|
|
generic pixelation, CRT display simulation, or a default retro look.
|
|
|
|
Do not use for literal UI, product catalog media, small text, clean modern
|
|
creator footage, or any source whose identifying color/detail must remain exact.
|
|
Inspect high-contrast vertical edges, faces, saturated objects, and the bottom
|
|
of the frame in motion. Analog damage must support the story without making the
|
|
subject hard to read.
|
|
|
|
### Pixel payload
|
|
|
|
Start with the complete proven combination, not `tapeDamage` alone:
|
|
|
|
```json
|
|
{
|
|
"intensity": 1,
|
|
"adjust": { "contrast": -0.04, "saturation": -0.08 },
|
|
"details": {
|
|
"grain": 0.16,
|
|
"grainSize": 0.12,
|
|
"grainRoughness": 0.72
|
|
},
|
|
"effects": {
|
|
"tapeDamage": 0.82,
|
|
"tapeTracking": 0.85,
|
|
"tapeNoise": 0.3,
|
|
"tapeSpeed": 0.5,
|
|
"chromaBleed": 0.5,
|
|
"chromaticAberration": 0.18,
|
|
"chromaticAngle": 0,
|
|
"scanlines": 0.35,
|
|
"scanlineCount": 0.17,
|
|
"scanlineSoftness": 1,
|
|
"digitalGlitch": 0.32,
|
|
"digitalGlitchColorSplit": 0,
|
|
"digitalGlitchLineTear": 0.08,
|
|
"digitalGlitchPixelate": 0,
|
|
"digitalGlitchBlockAmount": 0,
|
|
"digitalGlitchBlockDisplacement": 0,
|
|
"digitalGlitchBlockOpacity": 0,
|
|
"digitalGlitchSpeed": 0.5
|
|
}
|
|
}
|
|
```
|
|
|
|
| Property | VHS Playback range |
|
|
| --------------------- | ------------------ |
|
|
| intensity | 0.75 to 1 |
|
|
| contrast | -0.1 to 0 |
|
|
| saturation | -0.16 to 0 |
|
|
| grain | 0.08 to 0.18 |
|
|
| grainSize | 0.08 to 0.18 |
|
|
| grainRoughness | 0.55 to 0.8 |
|
|
| tapeDamage | 0.65 to 0.9 |
|
|
| tapeTracking | 0.5 to 0.9 |
|
|
| tapeNoise | 0.15 to 0.45 |
|
|
| tapeSpeed | 0.35 to 0.65 |
|
|
| chromaBleed | 0.35 to 0.65 |
|
|
| chromaticAberration | 0.08 to 0.22 |
|
|
| scanlines | 0.2 to 0.4 |
|
|
| scanlineCount | 0.14 to 0.2 |
|
|
| digitalGlitch | 0.2 to 0.4 |
|
|
| digitalGlitchLineTear | 0.04 to 0.1 |
|
|
|
|
`tapeDamage` owns deterministic horizontal line jitter, slow time-base wobble,
|
|
bottom-edge head switching, luma bandwidth loss, restrained ghosting, noise,
|
|
and sparse dropouts. Its subordinate tracking/noise/speed controls add bounded
|
|
moving tape tears and control their signal character without introducing a new
|
|
clock. `chromaBleed` separately reduces horizontal chroma detail. The restrained
|
|
scanline and chromatic settings supply the remaining tape-playback character.
|
|
The digital stage is used only for rare horizontal row tears: keep its color
|
|
split, pixelation, block displacement, block opacity, and corruption values at
|
|
zero. Leave blur, CRT curvature, generic pixelation, and a camera HUD off.
|
|
|
|
These values are an original HyperFrames recipe calibrated on the same public
|
|
Orange Cat source used for the external visual reference. They are not copied
|
|
shader code or a claim of pixel-identical output from the external reference. The scanline count is
|
|
mapped to the reference's approximately 127-cycle primary line pattern; the HF
|
|
tracking math stays bounded in media pixels and uses the composition clock.
|
|
|
|
The shader damage evolves from the existing deterministic media time, so it
|
|
needs no CSS loop or private timeline. Global grading intensity does not fade
|
|
tape damage or other independent effects. If the story requires a finite
|
|
source-to-tape reveal, crossfade synchronized untreated and treated media layers
|
|
on the host's paused GSAP timeline. During the common workflow, inspect dense
|
|
consecutive frames and reject hard edge tearing, face
|
|
smearing, frozen noise, square blocks, blank borders, or a bottom disturbance
|
|
that competes with the subject.
|
|
|
|
## 8mm Home Movie
|
|
|
|
Use for personal archive, family-memory, childhood, travel-memory, or explicit
|
|
small-gauge home-movie language. This is stronger and more materially film-like
|
|
than Film Memory, but it is still an owned HyperFrames treatment rather than a
|
|
claim to reproduce a named film stock, camera, or laboratory process.
|
|
|
|
Do not use for literal UI, technical demonstrations, catalog products, clean
|
|
interviews, or footage where dust/scratches would imply false provenance. Check
|
|
skin, highlights, dark clothing, and frame edges before applying it.
|
|
|
|
### Pixel payload
|
|
|
|
```json
|
|
{
|
|
"preset": "vintage-wash",
|
|
"intensity": 0.72,
|
|
"details": {
|
|
"vignette": 0.28,
|
|
"vignetteMidpoint": 0.54,
|
|
"vignetteFeather": 0.72,
|
|
"grain": 0.34,
|
|
"grainSize": 0.18,
|
|
"grainRoughness": 0.72
|
|
},
|
|
"effects": { "filmArtifacts": 0.62 }
|
|
}
|
|
```
|
|
|
|
| Property | 8mm Home Movie range |
|
|
| -------------- | -------------------- |
|
|
| intensity | 0.6 to 0.8 |
|
|
| vignette | 0.18 to 0.34 |
|
|
| grain | 0.22 to 0.42 |
|
|
| grainSize | 0.12 to 0.24 |
|
|
| grainRoughness | 0.6 to 0.8 |
|
|
| filmArtifacts | 0.35 to 0.7 |
|
|
|
|
`filmArtifacts` owns only deterministic sparse dust and short scratches. The
|
|
existing preset/details own color, vignette, and grain; the host's paused GSAP
|
|
timeline owns optional gate weave. Keep weave within `0.15%` of the shorter
|
|
composition edge, rotation within `0.03` degrees, and scale between `1.005` and
|
|
`1.015`. Use finite `sine.inOut` segments around `0.6` to `1` second, return
|
|
near the starting transform, and never use randomness, timers, `onUpdate`, or
|
|
an infinite CSS animation.
|
|
|
|
Reject a result when dust is constantly visible, scratches persist unnaturally,
|
|
the frame pumps, weave exposes an edge, highlights turn muddy, or the material
|
|
artifacts are more noticeable than the memory. For a subtler nostalgic result,
|
|
use Film Memory instead.
|
|
|
|
## Editorial Halftone
|
|
|
|
Use for print/editorial transitions, poster frames, comic/newsprint language,
|
|
stylized product or portrait beats, and graphic sequences where visible ink
|
|
screening is the point. This is a real four-angle CMYK raster treatment, not a
|
|
dotted DOM overlay.
|
|
|
|
Do not use on literal UI, dense text, tiny labels, footage that must remain
|
|
photorealistic, or a long talking-head segment unless the user explicitly asks
|
|
for strong print stylization. Preserve text/captions as ungraded DOM above the
|
|
media whenever they must stay readable.
|
|
|
|
### Pixel payload
|
|
|
|
```json
|
|
{
|
|
"intensity": 1,
|
|
"adjust": { "contrast": 0.04, "saturation": 0.04 },
|
|
"effects": { "halftone": 0.94, "halftoneSize": 0.36 }
|
|
}
|
|
```
|
|
|
|
| Property | Editorial Halftone range |
|
|
| ------------ | ------------------------ |
|
|
| intensity | 0.8 to 1 |
|
|
| contrast | -0.02 to 0.08 |
|
|
| saturation | -0.04 to 0.08 |
|
|
| halftone | 0.75 to 1 |
|
|
| halftoneSize | 0.15 to 0.55 |
|
|
|
|
The shader uses fixed C/M/Y/K screen angles of 15/75/0/45 degrees, separate ink
|
|
coverage, a warm paper base, and resolution-aware dot-cell sizing. Keep those
|
|
screen semantics fixed; tune only amount and size unless a future visual proof
|
|
justifies a broader schema. Judge the result at final output resolution because
|
|
browser zoom can misrepresent the screen. Reject unstable moire, unreadable
|
|
subjects, clipped ink detail, excessive dot size, or any treatment that looks
|
|
like a transparent dot texture laid over unchanged footage.
|
|
|
|
## Two-Ink Editorial Print
|
|
|
|
Use for poster frames, editorial portraits, music/social cutaways, zine
|
|
graphics, and bold print-led transitions where two visible spot inks are more
|
|
appropriate than photographic color. This is a fixed original HyperFrames
|
|
vermilion/teal treatment, not a claim to emulate a named printer, ink set, or
|
|
commercial print process.
|
|
|
|
Do not use for literal UI, brand-color-critical products, small labels, natural
|
|
talking heads, or media that must remain photorealistic. Keep captions and
|
|
graphics as normal DOM above the treated media.
|
|
|
|
### Pixel payload
|
|
|
|
```json
|
|
{
|
|
"intensity": 1,
|
|
"adjust": { "contrast": 0.08, "highlights": -0.06, "shadows": 0.04 },
|
|
"effects": { "twoInkPrint": 1, "twoInkPrintSize": 0.42 }
|
|
}
|
|
```
|
|
|
|
| Property | Two-Ink range |
|
|
| --------------- | ------------- |
|
|
| intensity | 0.8 to 1 |
|
|
| contrast | 0.02 to 0.1 |
|
|
| highlights | -0.1 to 0 |
|
|
| shadows | 0 to 0.08 |
|
|
| twoInkPrint | 0.8 to 1 |
|
|
| twoInkPrintSize | 0.18 to 0.55 |
|
|
|
|
The shader maps warm midtones to vermilion, deep/cool shadows to teal, and
|
|
shared dark coverage to a dark overprint on warm paper. It uses separate
|
|
15/75-degree screens, a subtle fixed registration offset, deterministic paper
|
|
texture, and resolution-aware dot sizing. Do not combine it with `halftone` or
|
|
a duotone LUT: that re-separates the result and defeats the two-ink contract.
|
|
|
|
Judge it at output resolution and across multiple frames. Reject missing second
|
|
ink, crushed faces, unstable moire, illegible silhouettes, or a result that
|
|
reads as a red tint with dots rather than two screened inks.
|
|
|
|
## Monochrome Screen Print
|
|
|
|
Use for graphic portrait beats, posterized social inserts, newspaper-like
|
|
screens, or a finite transition into visible monochrome cells. Keep captions
|
|
and typography as normal DOM above the treated media.
|
|
|
|
```json
|
|
{
|
|
"intensity": 1,
|
|
"effects": {
|
|
"monoScreen": 1,
|
|
"monoScreenSize": 0.35,
|
|
"monoScreenAngle": 0.25,
|
|
"monoScreenSpread": 0.3,
|
|
"monoScreenShape": 0,
|
|
"monoScreenInvert": 0
|
|
},
|
|
"palette": ["#111319", "#f2ecdc"]
|
|
}
|
|
```
|
|
|
|
Use `monoScreenShape` `0..4` for circle, square, diamond, triangle, or line.
|
|
Keep cell size within `0.15..0.55` and spread within `0.15..0.55`. Reject faces
|
|
that lose their silhouette, unstable moire, or cells too small to survive the
|
|
final encoded resolution.
|
|
|
|
## Engraved Illustration
|
|
|
|
Use for editorial portraits, historical/technical illustration, title-card
|
|
cutaways, or a source-to-line-art reveal. It is not routine correction and
|
|
should not be applied to literal UI or brand-color-critical product footage.
|
|
|
|
```json
|
|
{
|
|
"intensity": 1,
|
|
"effects": {
|
|
"engraving": 1,
|
|
"engravingSpacing": 0.4118,
|
|
"engravingMinThickness": 0.2,
|
|
"engravingMaxThickness": 0.4571,
|
|
"engravingAngle": 0.25,
|
|
"engravingContrast": 0.4667,
|
|
"engravingSharpness": 0.59,
|
|
"engravingWave": 0.2,
|
|
"engravingWaveFrequency": 0.2222
|
|
},
|
|
"palette": ["#101216", "#f3eddf"]
|
|
}
|
|
```
|
|
|
|
Preserve the calibrated base first. Tune spacing within `0.25..0.6`, contrast
|
|
within `0.3..0.65`, and wave within `0..0.35`. Reject squeezed framing, broken
|
|
contours, noisy flat backgrounds, or lines that flicker across moving frames.
|
|
|
|
## Crosshatched Sketch
|
|
|
|
Use for hand-rendered editorial beats, comic/documentary cutaways, and short
|
|
illustrative transformations where multiple line directions should preserve
|
|
the subject contour.
|
|
|
|
```json
|
|
{
|
|
"intensity": 1,
|
|
"effects": {
|
|
"crosshatch": 1,
|
|
"crosshatchSpacing": 0.28,
|
|
"crosshatchThickness": 0.25,
|
|
"crosshatchAngle": 0.25,
|
|
"crosshatchContrast": 0.3333,
|
|
"crosshatchEdges": 0.5,
|
|
"crosshatchLineWeight": 0,
|
|
"crosshatchWave": 0.33,
|
|
"crosshatchWaveFrequency": 0.2222
|
|
},
|
|
"palette": ["#101216", "#f3eddf"]
|
|
}
|
|
```
|
|
|
|
Tune spacing within `0.18..0.5`, edge detail within `0.3..0.7`, and wave within
|
|
`0.1..0.45`. Reject distorted aspect ratio, dense black fill that hides the
|
|
subject, or temporal shimmer stronger than the intended sketch language.
|
|
|
|
## CRT Display
|
|
|
|
Use when the media is intentionally shown as an older monitor, terminal, game
|
|
screen, or broadcast display. Curvature alone is geometry, not a complete CRT
|
|
treatment, so pair it with restrained scanlines and only slight channel
|
|
separation.
|
|
|
|
```json
|
|
{
|
|
"intensity": 1,
|
|
"effects": {
|
|
"crtCurvature": 0.2,
|
|
"scanlines": 0.35,
|
|
"scanlineCount": 0.17,
|
|
"scanlineSoftness": 1,
|
|
"chromaticAberration": 0.08,
|
|
"chromaticAngle": 0
|
|
}
|
|
}
|
|
```
|
|
|
|
Keep curvature within `0.08..0.28`, scanlines within `0.18..0.45`, and channel
|
|
separation within `0..0.12`. Reject excessive black corners, unreadable UI,
|
|
large color fringes, or applying the display language to ordinary footage when
|
|
the user only asked for correction.
|
|
|
|
## Procedural ASCII
|
|
|
|
Use for a deliberate terminal, code, data, surveillance, editorial, or
|
|
source-to-character reveal. This is a real shader-generated 5x7 glyph field,
|
|
not monospace text placed over unchanged footage.
|
|
|
|
Do not use as routine talking-head polish, on literal UI or dense text, or when
|
|
recognizing a face/product precisely matters. Keep captions and graphics as
|
|
normal DOM above the treated media.
|
|
|
|
Choose one of these proven starting points:
|
|
|
|
```json
|
|
{
|
|
"effects": { "ascii": 1, "asciiSize": 0.08, "asciiInvert": 1 },
|
|
"palette": ["#020605", "#38ff78"]
|
|
}
|
|
```
|
|
|
|
The first is **Terminal ASCII**: dark field, bright green glyphs, appropriate
|
|
for code/data/device language. For a warmer print-like **Editorial ASCII**, use:
|
|
|
|
```json
|
|
{
|
|
"effects": { "ascii": 1, "asciiSize": 0.066, "asciiInvert": 0 },
|
|
"palette": ["#0b0d0d", "#eee9db"]
|
|
}
|
|
```
|
|
|
|
Keep `ascii` between `0.75` and `1` for a fully readable treatment and
|
|
`asciiSize` between `0.04` and `0.15`. A finite reveal may author
|
|
`--hf-color-grading-ascii: 0` inline and tween it to `1` with the registered
|
|
paused GSAP timeline. Reject unstable cells, lost silhouette/face structure,
|
|
unreadable composition, or a palette that conflicts with the project.
|
|
|
|
## Ordered Palette Dither
|
|
|
|
Use for posterized social beats, music/editorial cutaways, pixel-art language,
|
|
or a finite source-to-palette reveal. The shader uses a stable 4x4 Bayer
|
|
threshold matrix and an explicit dark-to-light palette. Do not describe it as
|
|
Floyd-Steinberg, Atkinson, or another sequential error-diffusion process.
|
|
|
|
Do not use on literal UI, brand-color-critical products, tiny labels, or long
|
|
photorealistic sections. Start with one of these original palettes:
|
|
|
|
```json
|
|
{
|
|
"effects": { "dither": 1, "ditherSize": 0.25 },
|
|
"palette": ["#17121a", "#824c50", "#e09873", "#f7ddb1"]
|
|
}
|
|
```
|
|
|
|
The four-color option is **Warm Print**. For a louder social/music beat, use
|
|
the six-color **Electric Ink** palette:
|
|
|
|
```json
|
|
{
|
|
"effects": { "dither": 1, "ditherSize": 0.4 },
|
|
"palette": ["#080717", "#3c185f", "#7e2278", "#d9339f", "#ff6b66", "#aafae0"]
|
|
}
|
|
```
|
|
|
|
HyperFrames also owns these named ramps. The name is an authoring shortcut;
|
|
persist the listed colors through the existing `palette` array:
|
|
|
|
| Group | Palette ID | Ordered colors |
|
|
| ----------- | ---------------- | ---------------------------------------------------------------- |
|
|
| Classic | `noir` | `#000000`, `#ffffff` |
|
|
| Classic | `ink-paper` | `#1a1a2e`, `#f5f5dc` |
|
|
| Classic | `terminal` | `#001100`, `#00ff00` |
|
|
| Classic | `amber-glow` | `#1a0f00`, `#ffcc00` |
|
|
| Classic | `handheld-green` | `#0f380f`, `#306230`, `#8bac0f`, `#9bbc0f` |
|
|
| Mood | `golden-hour` | `#1a1205`, `#4a3510`, `#8b6914`, `#d4a017`, `#fff8dc` |
|
|
| Mood | `deep-sea` | `#0a1628`, `#1a3a5c`, `#2d6187`, `#5ba4c9`, `#a8dce8` |
|
|
| Mood | `arctic-night` | `#0a0a14`, `#1a2a4a`, `#3a5a8a`, `#6a9aca`, `#cae8ff` |
|
|
| Mood | `synthwave` | `#120458`, `#7b2cbf`, `#e040fb`, `#ff6ec7`, `#fff59d` |
|
|
| Mood | `vaporwave` | `#1a0a2e`, `#3d1a5c`, `#ff71ce`, `#01cdfe`, `#fffb96` |
|
|
| Mood | `forest` | `#1a2e1a`, `#2d4a2d`, `#4a7c4a`, `#7ab37a`, `#c8e6c8` |
|
|
| Mono | `sepia` | `#1a1610`, `#3d3020`, `#6b5a40`, `#a89070`, `#e8dcc8` |
|
|
| Mono | `blueprint` | `#001830`, `#003060`, `#0050a0`, `#0080e0`, `#e0f0ff` |
|
|
| HyperFrames | `warm-print` | `#17121a`, `#824c50`, `#e09873`, `#f7ddb1` |
|
|
| HyperFrames | `electric-ink` | `#080717`, `#3c185f`, `#7e2278`, `#d9339f`, `#ff6b66`, `#aafae0` |
|
|
|
|
Choose by inspected source and project language, not by palette name alone.
|
|
For example, `terminal` fits device/code language, `warm-print` fits editorial
|
|
print, and `synthwave` is an intentional stylization rather than generic polish.
|
|
|
|
`palette` must contain two to six exact `#RRGGBB` colors in authored order. Use
|
|
dark-to-light order for this treatment; the runtime validates colors but does
|
|
not reorder them, so reversing the array intentionally inverts the mapping.
|
|
Keep `dither` between `0.7` and `1` and `ditherSize` between `0.1` and `0.5`.
|
|
A finite reveal may author `--hf-color-grading-dither: 0` inline and tween it
|
|
to the chosen amount with GSAP. Judge the moving result at output resolution;
|
|
reject shimmer, lost subject structure, accidental muddy intermediate colors,
|
|
or a palette chosen without regard to the project's design language.
|
|
|
|
## Cached Error Diffusion
|
|
|
|
Use exact error diffusion for a deliberate 1-bit Macintosh, newspaper/print,
|
|
limited-palette game, or crunchy editorial treatment. It bakes a new image or
|
|
MP4 because every processed block depends on error from earlier blocks; it is
|
|
not a realtime shader setting.
|
|
|
|
Choose the algorithm by visible intent:
|
|
|
|
- `floyd-steinberg`: balanced default with organic fine texture.
|
|
- `atkinson`: higher-contrast, more open and distinctly early-Macintosh.
|
|
- `jarvis-judice-ninke`: smoother gradients with a wider 12-neighbor field.
|
|
- `stucki`: smooth, slightly sharper alternative to JJN.
|
|
- `burkes`: compact two-row texture.
|
|
- `sierra`, `sierra-lite`, `two-row-sierra`: progressively different
|
|
speed/texture tradeoffs; use only after comparing frames.
|
|
|
|
Run the exact processor and register its output through the existing media
|
|
ledger/cache:
|
|
|
|
```bash
|
|
node <SKILL_DIR>/scripts/dither.mjs \
|
|
--input .media/videos/video_001.mp4 \
|
|
--out .media/generated/video_001.atkinson.mp4 \
|
|
--algorithm atkinson \
|
|
--palette '#17121a,#824c50,#e09873,#f7ddb1' \
|
|
--point-size 3
|
|
|
|
node <SKILL_DIR>/scripts/resolve.mjs \
|
|
--from .media/generated/video_001.atkinson.mp4 --type video --project .
|
|
```
|
|
|
|
Use the registered output path on a real `<img>` or `<video>`. Keep text,
|
|
captions, logos, and interface graphics outside the processed media. For a
|
|
finite reveal, overlap the original and processed media with identical framing
|
|
and crossfade or wipe them using the registered paused GSAP timeline. Do not
|
|
label the realtime Bayer shader as Floyd-Steinberg/Atkinson, and do not process
|
|
PQ/HLG footage without an explicit SDR tone-map decision.
|
|
|
|
## Organic Light Leak
|
|
|
|
Use for one motivated memory beat, time shift, warm scene handoff, or tactile
|
|
transition. It is a finite deterministic CSS/GSAP overlay, not a looping
|
|
texture, generic flash, or film-stock emulation.
|
|
|
|
Install the Registry overlay block:
|
|
|
|
```bash
|
|
npx hyperframes add organic-light-leak-overlay --no-clipboard
|
|
```
|
|
|
|
Insert the printed `data-composition-src` host at the intended beat and keep
|
|
its duration finite. Its paused timeline owns one rise, peak, and complete
|
|
recovery and scales those phases to the placed duration. Inspect the source
|
|
before, at the brightest frame, and after recovery. Reject clipped faces, an
|
|
unmotivated warm wash, visible black from incorrect blend mode, or a leak that
|
|
conceals the subject longer than the transition needs.
|
|
|
|
## Freeze-Frame Cutout
|
|
|
|
Use for a social introduction, speaker emphasis, chapter punctuation, sports
|
|
or creator beat, or a scrapbook/editorial hold. This requires a real alpha
|
|
matte; decoration may not conceal a poor subject edge.
|
|
|
|
Extract the exact deterministic source frame first, then remove its background:
|
|
|
|
```bash
|
|
ffmpeg -ss <seconds> -i <source-video> -frames:v 1 -y .media/generated/freeze-source.png
|
|
npx hyperframes remove-background .media/generated/freeze-source.png \
|
|
-o .media/generated/freeze-cutout.png --json
|
|
npx hyperframes add freeze-frame-dressing --no-clipboard
|
|
```
|
|
|
|
Add the transparent result as a direct-root timed media layer and insert the
|
|
printed overlay block above the same time range. The block owns the paper,
|
|
tape, and flash; the host timeline only animates the real cutout:
|
|
|
|
```html
|
|
<img
|
|
id="hf-freeze-cutout"
|
|
class="clip"
|
|
src="./.media/generated/freeze-cutout.png"
|
|
alt=""
|
|
data-start="6"
|
|
data-duration="3"
|
|
data-track-index="20"
|
|
/>
|
|
```
|
|
|
|
```js
|
|
tl.fromTo(
|
|
"#hf-freeze-cutout",
|
|
{ y: 42, scale: 0.86, rotation: -2 },
|
|
{ y: 0, scale: 1, rotation: 0.4, duration: 0.5, ease: "back.out(1.35)" },
|
|
freezeAt,
|
|
);
|
|
```
|
|
|
|
Inspect the matte over both light and dark temporary plates before styling it.
|
|
Reject missing hair/fingers, background halos, a cutout that changes identity,
|
|
overly thick outline, exposed frame edges, or a flash that obscures the reveal.
|
|
If the matte is not acceptable, choose another frame or keep the original media.
|
|
|
|
## Social Flash / Editorial Reveal
|
|
|
|
Use this treatment for one meaningful high-energy cut, creator reveal, product
|
|
beat, or before/after handoff. It is not a default transition for every scene.
|
|
Avoid it for calm long-form footage, accessibility-sensitive contexts, already
|
|
clipped highlights, literal UI that must remain readable through the cut, or
|
|
any request for repeated strobing.
|
|
|
|
Inspect representative frames on both sides of the cut first. Grade each media
|
|
layer for its own subject using the appropriate contract above; the flash is
|
|
not a substitute for correction. For people, a restrained `skin-soft` payload
|
|
is a safe starting point. For literal UI, preserve the pixels and use only the
|
|
authored light/motion layers when they do not obscure required information.
|
|
|
|
Install the Registry overlay block:
|
|
|
|
```bash
|
|
npx hyperframes add editorial-flash-overlay --no-clipboard
|
|
```
|
|
|
|
Insert the printed `data-composition-src` host so the block's midpoint lands
|
|
on the cut. Its own paused timeline drives the finite flash. The host timeline
|
|
may coordinate outgoing and incoming media motion without reaching into the
|
|
block:
|
|
|
|
```js
|
|
tl.to(
|
|
"#outgoing-media",
|
|
{
|
|
scale: 1.035,
|
|
"--hf-color-grading-exposure": 0.82,
|
|
duration: 0.12,
|
|
ease: "power3.in",
|
|
},
|
|
cutAt - 0.16,
|
|
);
|
|
tl.fromTo(
|
|
"#incoming-media",
|
|
{ scale: 1.1 },
|
|
{ scale: 1, duration: 0.42, ease: "power3.out" },
|
|
cutAt,
|
|
);
|
|
tl.to(
|
|
"#incoming-media",
|
|
{
|
|
"--hf-color-grading-exposure": 0,
|
|
"--hf-color-grading-intensity": 0.58,
|
|
duration: 0.24,
|
|
ease: "power2.out",
|
|
},
|
|
cutAt,
|
|
);
|
|
```
|
|
|
|
When the shader steps are used, author
|
|
`--hf-color-grading-exposure: 0.72` and
|
|
`--hf-color-grading-intensity: 0` inline on the incoming media so a fresh seek
|
|
has the correct start state. Set the final intensity to the source-approved
|
|
value instead of copying `0.58` blindly. Skip the shader intensity step when
|
|
the incoming source should remain ungraded.
|
|
|
|
Keep the rise between roughly `0.035` and `0.055` seconds and the recovery
|
|
between `0.24` and `0.38` seconds. Default to one neutral/warm flash event,
|
|
never saturated red, never a looping strobe, and never more than one authored
|
|
flash inside a one-second treatment window. Verify frames immediately before,
|
|
at, and after the cut, then inspect moving playback and a rendered draft. The
|
|
peak must hide the cut; the recovery must reveal a correctly framed source with
|
|
no retained prior canvas, clipped face, or unexpected highlight damage.
|