← 作品 · 第 01 / 04 · 底片沖洗
潛影沖洗所
有人手上有一捲拍了卻從沒沖洗的底片,不敢把唯一的一份寄出去;沖洗所讓他看著一格影像從看不見變成能握在手裡的相片,並在顆粒裡發現按下快門時沒看見的東西。



放映
下方是正在執行的現場版,可以直接捲動。
導演筆記(treatment.md)
這是 agent 在製作過程中寫下的工作筆記,維持原文(英文)未經修飾,供想看細節的人參考。
展開全文
Demo production for testing Cinematic UI 2.0 (award reel, award pass, type-fx). The brand, prices, address and
schedule are fictional. The photographs are real: Väinö Kannisto, Helsinki City Museum, CC BY 4.0 (credited on
the page and in assets/CREDITS.md).
1. Development
Product truth. A mail-in film lab in Taipei: develops 135 / 120 black-and-white and colour negative film, scans every frame, prints a contact sheet, and hand-prints chosen frames on fibre paper in a darkroom. The one action: send a roll. Claimable (inside the fiction): hand development for B&W, every frame looked at by a person, no automatic colour/“AI” correction, negatives returned in archival sleeves, 7 days.
Logline. Someone holding a roll they shot and never developed wants to see what is on it but is afraid to put the only copy in the post; the lab lets them watch one frame go from invisible to a print they can hold — and finds, in the grain, something they never saw when they pressed the shutter.
Audience arc. Arrives believing: sending film away is a gamble, and a lab returns flat JPEGs nobody looked at. Leaves believing: a person will look at every frame, in the dark, and show me what I actually caught.
Controlling idea. Looking closer is the service.
Dramatic problem. Trust (handing over the only copy) and desire (to see). Not speed, not awe.
2. Casting session
| Candidate | Mechanism that solves the problem | Signature shot | Risk / wrong for |
|---|---|---|---|
| Michelangelo Antonioni — Blow-Up (1966) | The photographer enlarges sections of one photograph again and again and hangs them round the studio until something he did not see when he shot it appears in the grain. Looking closer is the drama. | One print pushed in three times on one axis until it is grain. | The film's discovery is a body in the bushes: menace. Wrong for anything fast or glossy. Must turn the discovery tender. |
| Edward Yang — Yi Yi (2000) | Yang-Yang photographs the backs of people's heads because they cannot see them themselves; interiors seen through glass with the city reflected on them. | An office at night through a window, Taipei laid over the people. | The reflections need real Taipei footage we do not have at quality; the back-of-the-head photo is so iconic it becomes costume. |
| Alfred Hitchcock — Rear Window (1954) | A courtyard of windows (a wall of frames) watched through a long lens; POV then reaction. A contact sheet is a courtyard of windows. | The telephoto lens finding one window among many. | Voyeurism. A lab that holds people's private photographs must never frame looking as spying. Set aside for that. |
Cast: Antonioni, Blow-Up. Set aside: Yang (the medium he needs is not available; costume risk), Hitchcock (voyeur framing is exactly the wrong promise for a lab). Could a competitor use this unchanged? A generic photo lab could not: the direction is built on this roll — a frame where the photographer himself is in the picture and a ring held between two hands that only appears at ×96 — and on the lab's own instruments.
Sources checked (web): the enlargement sequence (sections enlarged and hung around the studio) and the ending (Thomas returns the imaginary tennis ball; his figure dissolves, leaving the grass) are confirmed. The opening credit sequence could not be confirmed, so no mechanism leans on it.
Mechanisms
- Successive enlargement on one axis → the click-film pushes into one frame ×7 → ×24 → ×96; the same cut twice is the film's voice.
- Prints hung and read in sequence → the hung print on a line at the end of the darkroom; the contact sheet read row by row.
- Discovery in the grain → at ×96 the image is grain and the line that names what was found is the only sharp thing.
- Holds of near silence between events → each enlargement is held until the visitor clicks; nothing moves inside a held shot. (The opening is scrolled, but it still holds: the H1 and the light table each get a stretch of scroll where nothing moves.)
- The figure dissolves, leaving the grass → the one dissolve of the film, at the coda: the print dissolves, leaving an empty latent frame.
- Colour as applied paint (Antonioni painted the park greener) → the only colour on the site is applied by hand: a grease-pencil red.
Filmography — how this differs from the last three (Kiln / 回聲選書 / Meridian): director (Antonioni vs Miller / Bresson / von Trier) · medium (archival photographs developed in a darkroom vs photoreal 3D / print-and-ink / line plan) · form (click-driven darkroom + flowing lab document + one scrubbed coda vs film / pinned short / document with set pieces) · skeleton (empty-set open, turn in the middle) · type (Anton + Noto Sans TC 900 numerals and labels, Noto Serif TC text, grease-pencil circle as switch) · lead (one negative frame through seven darkroom states) · interaction (circle a frame on a contact sheet and blow it up) · ending (rhyme with the opening: an empty latent frame, which is the CTA). Differs on all eight.
3. Medium
Observed: real photographs, developed. This film's mechanism is enlargement of something that already exists in silver, so the picture must be a real photograph and every other surface is the darkroom's own material: film base, rebate and sprocket holes, contact-sheet paper, fibre print, safelight amber, grain, grease pencil. No canvas, no 3D, no generated images. Why not 3D: nothing here is constructed; the drama is that the image already exists. A rendered object would be fiction pretending to be evidence. Shift: none in medium; the grade shifts negative → positive at the exposure cut.
4. Casting, locations, the asset call
Lead: one frame of a real roll — default N152070, Aunela children's home, Helsinki, 17.9.1947: a girl and the photographer Väinö Kannisto holding the same ring (archive caption: “girl plays with photographer Väinö Kannisto”). The product's verb (develop → look closer → print) decides what it does.
Lead states (7): latent (loader: real load) → negative rising (scrolled) → negative on the strip → positive on the contact sheet, circled → print ×7 on the easel → ×24 detail → ×96 grain (the turn) → hung print → (coda) gone, leaving the empty frame.
Supporting cast: the other eleven frames (Aunela 1947, Vallilantie 1945), three of which can also be chosen and have their own discoveries. Location: one darkroom with two lights — amber safelight and white (enlarger / light table) — and a paper-white finishing room.
Asset call: answered in the brief — no paid generation. Photographs: Wikimedia Commons / Helsinki City Museum,
CC BY 4.0, via find-footage.mjs (12 frames, 3200 px greyscale + 640 px thumbs). Casting test done at ×24 and
×96 crops on all four enlargeable frames (scratchpad crops viewed): ×24 holds; ×96 is grain, which is the point.
5. Screenplay (zh-TW)
Loader: 「潛影」 / 「潛影:已經拍下、還沒顯影的影像。」 / 顯影 timer.
Shot 1: H1 「底片裡,有你〔還沒看過〕的照片。」 — 「寄來一卷底片。我們在暗房沖出來、逐格看過、掃描,再把你沒注意到的那一格,放大給你看。」
Shot 2: 「先看〔整卷〕。」 — 「每卷先印一張印樣,十二格一起看。值得細看的格子旁,我們點了記號。圈起一格,放大它。」
Shot 3–5: per frame (lines A / B / C) — see js/roll.js.
Shot 6: 「每一格,都沖得像〔只有這一格〕。」 — 「黑白與彩色負片,135 與 120。手工顯影、逐格掃描;你圈的那一格,我們在暗房用纖維紙放大。」
Docs: 流程 「一卷底片,在我們這裡的〔七天〕。」 · 價目 「價目,寫在〔信封〕上。」 · 寄送 「寄來,〔不用拆〕片盒。」 · 問答 「寄底片之前,〔大家〕會問的。」
Coda: 「下一格,還是〔潛影〕。」 — 「拍完了,就寄來。我們在暗房等它。」 — CTA 寄出你的底片.
Footer: credits + 「本站為示範作品:潛影沖洗所、價格與地址皆為虛構。」
6. Storyboard
Form. Hybrid, chosen on purpose: a scrolled opening (one pinned shot, 500vh: the visitor's scroll develops the roll and contact-prints it), handing over to a click-driven darkroom on the same set (the lever: circle a frame, enlarge it ×7 → ×24 → ×96, hang it), then a calm flowing document (process, prices, mailing, questions), then one scroll-scrubbed coda. The line between scroll and click is the line between the lab's work and the visitor's: developing and contact printing are chemistry, timed by the developer, and the visitor only waits and watches, so the scroll is the developer's clock (the 顯影 timer runs with it); circling and enlarging are the visitor's own choices, one deliberate step at a time, so they stay clicks. The document scrolls because it is read.
The award pass
WORLD OBJECT the 35 mm negative strip and its contact sheet: rebate, sprocket holes, edge-print numbers, grease pencil.
Reaches: loader (a frame developing), cuts (exposure flash, enlarger push, pull-back to the line), buttons
(film-leader tongue with sprocket holes), progress (a 12-frame strip = the page as one roll), cursor
(a loupe on the contact sheet), focus ring (grease-pencil red), footer (END OF ROLL edge print).
LEAD STATES latent (loader) → negative rising (scroll) → negative on the strip (1) → circled positive on the contact
sheet (2) → ×7 print on the easel (3) → ×24 detail (4) → ×96 grain, the find (5) → hung print (6) → gone,
leaving the empty frame (coda)
LOADER shot one: the two characters 潛影 are windows onto frame N152070. While the roll really loads (fonts, 12
thumbs, the 3200 px frame) a first trace of the negative comes up in them (time-driven, dev 0 → 0.12);
then 「往下捲動,讓它顯影」 and the scroll takes over the same number: the negative rises in the
developer with scroll, the definition line fills (read-fill), the 顯影 timer runs to 09:30; the scroll
then pushes through the letters until the negative fills the frame and pulls it back onto the strip.
CUT MATERIAL light and lens: exposure flash (negative → positive), enlarger push into the circled cell, rack-focus push
×7→×24, the same push ×24→×96, pull-back from grain to the print pegged on a line. Exception: the one
dissolve, at the coda (Blow-Up's ending).
ACCENT grease-pencil vermilion #e0371d — "the frame you chose; look here" — dots, circles, focus ring; < 3 %.
TYPE display/label: Anton (Latin, figures) + Noto Sans TC 900 (CJK) — edge-print labels and the frame numeral ·
text: Noto Serif TC 400/600 · switch: one word per headline circled in grease pencil · extremes:
headlines small (≤ 3.4 vw, the photograph carries the scale); the frame numeral huge (≥ 26 vw).
INSTRUMENTS (1) identity top-left; (2) 寄底片 leader button top-right; (3) the 12-frame roll rail bottom-left
(where you are, in frames); (4) frame counter + magnification + step lever bottom-right.
VERB the visitor circles a frame on the contact sheet and enlarges it step by step (click / Enter / tap / →);
before the sheet, the lever's button scrolls the film on (the same cut, played by the scroll);
the circled frame persists into the price envelope, the hung print and the coda.
RHYTHM set piece (darkroom: 3 scrolled shots, then 5 click shots) → calm documents ×4 (流程, 價目, 寄送, 問答) → set piece (coda dissolve)
→ credits. Phone: strip shows three frames, contact sheet 3×4, ×24/×96 fill the portrait frame, lever at thumb.
Shot list — darkroom (x = playhead 0…6; 0 → 2 scrolled, 2 → 6 clicked)
One pinned scene, data-scene="darkroom", --length: 600 (500vh pinned; phone 520, 420vh). Its main clip
scrubs OP.p 0 → 1 and opening(p) in js/main.js turns that into the playhead; at p 0.90 the lever takes it.
In brackets: the fraction p of the pinned scroll and the desktop vh it spends.
| # · slug | Beat | Copy | Shot | Camera | Blocking | Light / colour | Cut out | E | Money frame | Mobile |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 · INT. DARKROOM — SAFELIGHT (loader, then p 0–0.14, 70vh) | Cold open, empty set | 潛影 / definition / 顯影 timer / 往下捲動,讓它顯影 | ECU on two characters | lock-off | a first trace while the roll loads; then the negative rises inside 潛影 with scroll, read-fill on the definition, timer 00:00 → 09:30 | amber safelight, near black | (scrubbed) push | 3 | letters half-developed (p 0.07) | 潛影 set vertical, below the rail; copy clear of the phone bar |
| 0→1 · PUSH-THROUGH / PULL-BACK (p 0.14–0.46, 160vh) | The image is there | — | ECU → full-frame negative → WS | push ×14 through the letters, then pull back | the letters scale until the negative fills the frame; it pulls back onto the strip, landing in frame 06's cell (match) | safelight; negative | (scrubbed) the strip lands | 4 | the negative mid pull-back, the strip around it (p 0.40) | the same, portrait |
| 1 · THE STRIP (p 0.46–0.70, 120vh) | Inciting: the roll exists | H1 + sub | WS of a 5-frame strip | lock-off | frame 06 centre; the H1 blur-resolves with scroll (p 0.46–0.62), lines rise; then held to be read | safelight; negatives | exposure flash (neg → pos), scrubbed p 0.70–0.80; the H1 is burnt out by the flash, not faded first | 4 | strip + H1 (p 0.66, data-still) |
three frames, H1 below |
| 2 · LIGHT TABLE (p 0.80–1, 100vh: the hand-over) | Visitor's part | 先看整卷 | top-down, contact sheet | lock-off | copy rises with scroll (p 0.80–0.90); from 0.90 the frame holds and the lever owns the playhead: 12 frames, 4 dotted; loupe cursor; circle one | white light table | enlarger push into the circled cell (click) | 5 | sheet with red circle | 3×4 grid |
| 3 · EASEL ×7 | The print | line A | MS of the print + giant numeral | lock-off | print with paper border; numeral | dark, print lit | rack-focus push | 5 | print + 06 | print top, line below |
| 4 · ×24 | Closer | line B | CU detail | push | full bleed; lab tag | print only | same push again | 7 | hands | full bleed portrait |
| 5 · ×96 | The turn | line C (blur-resolve) | ECU grain | push | grain; red circle traces the find | grain | pull-back to the line | 9 | the ring in grain | full bleed portrait |
| 6 · DRYING LINE | Resolution of the set piece | 只有這一格 | WS, print pegged | lock-off | print on a line, two pegs; CTA to the document | paper white daylight | push (scroll) into the document | 4 | hung print | print top, copy below |
Shots 3–6 are the lever's (clicks), as before. Scrolling back above p 0.90 rewinds the lever to the sheet; the circled frame stays chosen. Energy 3 4 4 5 5 7 9 4 → docs ~2 → coda 5. Turn at shot 5, the middle of the page by attention. The ×24 and ×96 cuts repeat on purpose (one axis, Antonioni's push). The light changes at every darkroom cut so the hard push never reads as the same frame twice: amber → white → dark → print → grain → paper.
Documents and coda (scroll)
| Scene | Beat | Set | Light | Notes |
|---|---|---|---|---|
| 流程 | How it works, plainly | lab worksheet: ruled rows, day stamps | paper white | flow |
| 價目 | The deal | kraft envelope with a printed price table; the circled frame clipped to it (lead in the margin) | paper / kraft | flow; chosen frame prefilled |
| 寄送 | What to do | three steps + address card | paper | flow |
| 問答 | Interrogation, quiet | <details> list |
paper | flow |
| 尾聲 CODA | Final image, rhyme | the hung print dissolves; an empty latent frame remains, edge-printed 13 ▸13A; CTA inside it | dark safelight | pinned 220vh, data-still 0.9; blur-resolve on the line |
Audience's part (contract)
Action: circle a frame on the contact sheet (click / tap / arrow keys + Enter), then enlarge (下一步 / → / swipe).
Response: a grease-pencil circle is drawn round the cell; the enlarger pushes into it.
Consequence: that frame is the one printed at ×7/×24/×96, hung on the line, clipped to the price envelope
(「放大:第 NN 格」) and shown in the counter until the visitor chooses another.
Equivalent: every frame is a <button>; arrows move between them; Enter/Space circles; touch taps.
Continuity sheet (devices): type entrance = line-mask rise for captions (all shots), blur-resolve for the three signature lines (H1 after the loader, the ×96 find, the coda) — a motif, not a tic; read-fill once (loader). Light events: safelight (0–1, 3–5 dim), exposure flash (1→2 only). Camera: lock-off except the enlargement pushes (3→4, 4→5) and the pull-back (5→6).
Type-fx casting: blur-resolve (#43) — beat: the enlarger coming into focus; the signature move, three times.
read-fill (#42) — beat: the image developing; the definition line fills from dim to ink with the real load
progress, once. Considered and refused: slit-scan (reads as a cinema reel — Siena's costume, wrong object: this
is a lab, not a cinema); odometer (no real number to prove); select-box (design-tool selection — another
world's chrome).
Short laptop: strip and sheet scale by vmin; copy column narrows; the print scales to 62svh.
Ultrawide: the stage letterboxes the set to 16:9 width; the numeral grows with vw.
Reduced motion: nothing is pinned or scrubbed; the darkroom rests on its data-still (p 0.66: strip + H1, the
negative developed) and the lever reaches every shot 1 → 6, each click a hard cut; the coda rests on the empty
frame with the CTA. No JS: the seven shots stack as a printed sequence, every word present.
Revision 1: the opening goes to the scroll (2026-10-18)
Note: "the hero would be better scroll-triggered." Agreed for the opening, not for the enlargements. The loader
used to run the development on a clock and play the push and pull-back by itself, so the visitor watched the
best shot of the film with their hands off. Now the scroll is the developer: the negative rises in 潛影 as the
visitor scrolls, the push through the letters and the pull-back onto frame 06 are scrubbed, the H1 resolves
under the hand, and the exposure flash contact-prints the roll onto the light table, where the pin holds. The
loader keeps only the real wait (a first trace while the roll loads) and hands its number to the scroll, so
there is no seam. The enlargement steps stay clicks: circling and enlarging are the visitor's chosen verb, and a
scrolled ×96 would make the find happen to them instead of by them. The choice still persists: the envelope
and the coda carry the circled frame, and rewinding the scroll keeps it. Lengths: --length 600 (500vh
pinned) on desktop, 520 (420vh) on the phone. The ring round the chosen cell and the loupe lost their CSS
transitions (the ring is a timed clip now), so no still catches a half state.
Revision 2: triggers and the type department (2026-10-18)
Note: the skill's new rules ask for at least five trigger kinds with scroll scrubbing no more than about a third of the performances, and for a type department around the signature move. Same director, same film, same lead, world object, copy and CTA. Blow-Up already gives the triggers their reasons: in Thomas's darkroom the chemistry runs on a clock nobody touches, the looking is done by hand, and the studio talks back only when he stops. So the scroll stays the lab's chemistry (develop, contact-print) and the coda's dissolve; everything the visitor does with their own eye or hand gets its own trigger.
What changed
- Kit updated to the skill's current
reel.js,reel.css,type-fx.js(rebuild keeps colours,data-cutclick-through,htmloverflow clip, blur-resolve inherits the font). The site uses nodata-cut; nothing else moved. - Lever frame counter →
slot-rollon click. The counter is a camera's frame-counter window: circling another frame rolls it 06 → 08, reel by reel. (It used to be swapped as plain text.) - The lab's voice → idle +
typewriter. Seven seconds alone on the light table without circling, a line types itself under the copy, labelled 暗房: 「慢慢看,不用急。」, deleted, then 「紅點那幾格,我們多看過一眼,可以從那裡 開始。」 It stops as soon as a frame is circled and does not come back in that visit. New copy. - Worksheet thermometer → scroll entry, then play,
odometer. In 流程 DAY 2 the line the copy already promised (「每一批都記下藥溫和時間」) is now shown: 藥溫 20.0°C rolls up once when it comes into view; D-76 1+1 · 顯影 9 分 30 秒 beside it rhymes with the opening's 09:30 timer. Revision of the original casting, which refusedodometerfor lack of a real number: this is the number the worksheet records. - Test strip → drag (and arrow keys). New figure at the end of 流程: before printing, the lab exposes a test strip. The circled frame (it carries 06 → 08 like the envelope and the coda) is shown in six exposure steps, 4–22 s; the visitor drags across it (a native range input over the strip, so arrows, Home/End and touch work) and a grease-pencil loop marks the step, with the lab's verdict on it (8 s: 我們選這一段). New copy.
- FAQ questions → hover / focus / open,
highlighter. The question being pointed at, focused, or last opened gets a grease-pencil wash behind it; one at a time. State-bound: built withreduced: false, set instantly under reduced motion. - No CSS transitions left on screened things: the film-leader button's hover slide is now an instant state.
shots.mjsrewritten for the new triggers (run intoscreening-act/).
Unchanged: the opening scrub, the click-driven enlargements, the loupe, the coda, every existing line of copy, the CTA (寄底片 / 寄出你的底片 stays unanimated: no type effect on any primary action).
Award pass, amended lines
TRIGGERS scrubbed: the lab's chemistry (develop, push, pull-back, H1, exposure flash) and the coda dissolve.
autoplay: the loader's first trace. click: circle, enlarge, frame counter. hover/focus: loupe, FAQ.
idle: the lab's voice. entry-played: the thermometer. drag: the test strip. (7 kinds)
TYPE CAST signature blur-resolve (H1, ×96 find, coda) + read-fill (definition) + slot-roll (frame counter, click)
+ typewriter (lab's voice, idle) + odometer (thermometer, entry) + highlighter (questions, hover/focus)
Trigger table
| Beat | Performance | Trigger | Keyboard / touch path | Reduced-motion state |
|---|---|---|---|---|
| 0 loader | first trace of the negative in 潛影 while the roll loads | autoplay (time, only as long as loading) | none needed | intro run to end; darkroom rests on its still |
| 0 develop | negative rises in 潛影; read-fill on the definition; 顯影 timer | scroll scrub | scroll / keys / swipe | still p 0.66 (developed) |
| 0→1 | push through the letters, pull back to frame 06 | scroll scrub | scroll | cut to the strip still |
| 1 strip | H1 blur-resolve, held | scroll scrub | scroll | H1 at rest |
| 1→2 | exposure flash, contact print | scroll scrub | scroll; lever button scrolls there | hard cut |
| 2 sheet | loupe follows the eye | hover | focus on a frame shows it; phone: the ×7 cut does the job | same, no motion |
| 2 sheet | grease-pencil ring round the chosen frame | click / tap | arrows + Enter / Space | ring drawn at once |
| 2 sheet | frame counter rolls 06 → 08 (slot-roll) | click / tap (on circling) | Enter / Space on a frame | shows the chosen number |
| 2 sheet | the lab's voice types a hint (typewriter) | idle (7 s, kit clock) | any key / pointer / touch resets the wait | the line appears whole |
| 3→5 | enlarger pushes ×7 → ×24 → ×96 | click / tap | → / Enter on 下一步, swipe | hard cuts |
| 5 ×96 | the find blur-resolves, grease circle draws | click (timed settle) | as above | at rest |
| 6 line | print hung on the line | click / tap | as above | at rest |
| 流程 DAY 2 | thermometer rolls up to 20.0°C (odometer) | scroll entry, then play (once) | reading position | 20.0 at rest |
| 流程 試條 | step through six exposures; loop marks the step; verdict | drag | ← → Home End on the range; touch drag | same, loop drawn at once |
| 問答 | wash behind the question (highlighter) | hover / focus / open | Tab to a question; tap opens and keeps it | chosen state set instantly |
| coda | print dissolves to the empty frame; line blur-resolves | scroll scrub | scroll | rests on the empty frame + CTA |
Scroll scrub drives 5 of 16 performances (31 %).
Type cast
| Effect | Job | Trigger | Where |
|---|---|---|---|
blur-resolve (signature) |
the enlarger coming into focus | scroll (H1, coda); click settle (×96) | H1, ×96 find line, coda line |
read-fill |
the image developing | scroll | 潛影 definition line |
slot-roll |
the camera's frame counter landing on your frame | click / tap on circling | lever counter 第 NN 格 |
typewriter |
the lab's voice, thinking aloud | idle on the light table | under the 先看整卷 copy |
odometer |
the thermometer settling: a number the lab writes down | scroll entry, played once | 流程 DAY 2 worksheet line |
highlighter |
the lab marking the question you are reading | hover / focus / open | 問答 questions |
Refused again: select-box (another world's chrome), slit-scan (a cinema's reel, not a lab's), any continuous loop
(Antonioni holds; nothing in this darkroom moves while held). CJK checked at real size: no clipped glyphs, Noto Sans TC
on every CJK label inside the effects, no negative tracking on Han.
本站所有作品都是虛構品牌;成品是真的,全部由 agent 使用這個 skill 做出來。