Skip to content

IR Brief — STAND BY Fix + Teletype Receipt Sequence

SURFACE: ir.ucca.online (ucca-ir) DO NOT TOUCH: ucca-keys, t.ucca.online, any other Worker or repo


Part 1 — Fix STAND BY card (do this first)

Delete this line from the HTML:

<div class="ucca-logo-faded">UCCA</div>
Delete the .ucca-logo-faded CSS rule entirely.

2. Fix horizontal overflow

The card overflows the viewport on narrow screens due to letter-spacing + padding. Apply:

.receipt-block {
  width: calc(100vw - 2rem);
  max-width: 380px;
  box-sizing: border-box;
  overflow: hidden;
}

.receipt-headline {
  letter-spacing: 0.15em; /* was 0.3em */
}

.receipt-cta {
  letter-spacing: 0.12em; /* was 0.25em */
}

3. Constrain the container

#ir-confirmation {
  width: 100%;
  display: flex;
  justify-content: center;
  box-sizing: border-box;
  padding: 0 1rem;
}

Part 1 acceptance

  • No horizontal scroll at 360×740 ✓
  • No ghost logo ✓
  • Card centred on all viewports ✓

Puppeteer screenshot at 360×740 and 430×932. Confirm before proceeding to Part 2.


Part 2 — Teletype receipt sequence

This replaces everything that happens after the STAND BY card. The STAND BY card itself stays — Part 2 begins after it.

The full sequence

Phase 1 — STAND BY (existing) - Form submits → STAND BY card appears - Video continues playing underneath — never stops, never pauses - Hold 3 seconds

Phase 2 — Fade to black - Everything fades to black over 1.2s — card, video, everything - Pure black. Nothing visible.

Phase 3 — Tractor feed receipt Pure black screen. Monospace receipt prints from top, jerking upward line by line.

Layout: - max-width: 480px, centred on screen, left-aligned text within that column - Font: IBM Plex Mono / Courier New (existing monospace) - Colour: #e8e8e8 on #000000 - Cursor: blinking block at 600ms interval, always visible at end of current line

Tape movement: - Discrete upward jerks — NOT smooth scroll - Each new line causes existing lines to jump up one line-height - Like tractor feed. Like a real teletype. No easing, no animation — just a jump.

Typing speed: 28ms per character


Receipt content and timing

Each line prints character by character at 28ms/char. Cursor blinks during pauses. Pauses are non-uniform — the machine is waiting for data down the serial line.

UCCA REGISTRY
pause 1.8s

WILMINGTON · DELAWARE
pause 0.8s

------------------------
pause 1.4s

DATE    [DD MMM YYYY]
pause 0.4s

REF     [short_hash]
pause 2.2s — long pause

------------------------
pause 0.6s

[BARCODE — see spec below] pause 1.6s

------------------------
pause 0.8s

EMAIL   [masked_email]   CONFIRMED
pause 1.2s

SMS     [masked_mobile]  CONFIRMED
(omit this line entirely if no mobile was provided)
pause 2.8s — longest pause. cursor blinks. machine waiting for ACK.

------------------------
pause 0.6s

CHECK YOUR ENDPOINTS.
pause 3.0s — cursor blinks. human reads.

Then four carriage returns — blank lines jerking up, paper feeding out:

[blank]
pause 0.4s
[blank]
pause 0.4s
[blank]
pause 0.4s
[blank]
pause 0.4s

### MESSAGE ENDS
hold 4.0s — cursor blinks. human can screenshot. machine is done.

Fade to black — 2.0s fade. Page stays black. No UI. No button. No navigation. Done.


Barcode spec

Render a Code128 barcode of the short_hash value.

  • Library: JsBarcode from CDN — https://cdnjs.cloudflare.com/ajax/libs/jsbarcode/3.11.5/JsBarcode.all.min.js
  • Render to <svg> or <canvas>
  • Width: fit within receipt column
  • Height: 48px
  • lineColor: '#e8e8e8', background: '#000000'
  • No text label under barcode — REF line above it is the label
  • Barcode materialises instantly when its turn comes — no animation on the barcode itself
  • Tape jerks up to accommodate its height after it appears

Cursor behaviour

  • Blinking block always at end of last printed line
  • Blinks at 600ms interval continuously
  • During character printing, cursor stays live at the advancing position
  • During pauses, cursor blinks at end of last complete line

Data from Worker

Registration response must include these fields (add any missing): - shortHash — for REF line and barcode - maskedEmail — server-side masked, format: first char + ***@ + domain (e.g. t***@gmail.com) - maskedMobile — server-side masked, format: country code + first digit + XX XXX XXX (e.g. +61 4XX XXX XXX). null if not provided. - timestamp — ISO string, formatted client-side as DD MMM YYYY


What does NOT change

  • Registration Worker logic
  • D1 schema
  • SMS flow
  • Email flow
  • Keys ledger
  • Video — plays through entire sequence. Pause only after the final black fade is complete.
  • STAND BY card design (beyond Part 1 fixes)

Part 2 acceptance criteria

  1. Video plays continuously through STAND BY and fade-to-black ✓
  2. Tape jerks upward discretely — no smooth scroll ✓
  3. Cursor blinks between every line ✓
  4. Pauses are non-uniform — feels like a machine waiting for data ✓
  5. Barcode renders white on black, Code128 of short_hash ✓
  6. Email masked correctly server-side ✓
  7. SMS line absent if no mobile captured ✓
  8. Four blank CR lines print after CHECK YOUR ENDPOINTS ✓
  9. MESSAGE ENDS prints, holds 4s, fades to black ✓

  10. After final fade — black screen, nothing. No UI. Done. ✓

Deploy

Puppeteer captures at: - 360×740 and 430×932: mid-receipt (after REF, before barcode) and at ### MESSAGE ENDS - 1440×900: same two states

Paste all before deploying.