relay-creative · easter eggs · June 2026

Non-essential delights.
Portable. Purposeful.

11 self-contained micro-interactions for the RelayCTX app, console, and marketing site. Each egg is a drop-in <style> + <script> block — no build step, no dependencies, no layout impact.

11 eggs3 surfaces4 priorities100% vanilla
Hard Constraints
Reduced motion
Every egg gates on prefers-reduced-motion. All animations collapse to instant or crossfade.
Non-essential
No critical information inside an animation. Eggs are pure delight.
Accessible
aria-hidden on decorative elements. role + aria-live on status changes.
One accent
Teal #0d9488 only. JetBrains Mono for Codes; Outfit for UI labels.
Self-contained
Each egg is a portable <style> + <script> drop-in. No external CSS, no build step.
No layout impact
Eggs use position:fixed, opacity, transform only. No reflow.
Eggs A – K
A
Konami Beam
↑↑↓↓←→←→BA keydown
any pageP3
Effect

Full-width teal gradient beam sweeps left→right. A Code fades in at center. ~0.9 s, self-resetting. Wire Code to real active Code in production.

→ View demo
Porting
  • Add #relay-konami-beam overlay to <body>
  • Drop in CSS keyframes + script block
  • Replace QNHC2C with real active Code
B
Mark × 5
Click relay mark 5× within ~2.5 s
nav markP2
Effect

Rays spin 135°. “Context, carried.” fades in in Cormorant italic. Auto-resets after 3 s.

→ View demo
Porting
  • Wrap mark SVG with .relay-mark-wrap
  • Add .relay-mark-reveal span below
  • Don’t show pip dots in production
C
Console Greeting
Page load, once
app entryP1
Effect

Styled console.log: teal RelayCTX header, “Context in. Context out.”, Loop link. Curious devs find it.

→ View demo
Porting
  • One IIFE in main.js or app entry
  • Uses %c CSS injection for teal color
  • No DOM changes, no visible side-effects
D
Code Scramble
mouseenter / focus on Code display
code displayP1
Effect

Characters scramble through random alphanumeric, cascade back to real Code left→right over ~800 ms. Skipped on reduced-motion.

→ View demo
Porting
  • Add data-relay-code attr to Code element
  • Call initCodeScramble() after DOM ready
  • running flag prevents mid-scramble re-trigger
E
Status Snap
Call relayStatusSnap() on receive
app · console · marketingP0
Effect

Amber dot snaps to green with scale bounce (1→1.7→0.88→1). Label: “Awaiting receipt” → “Received”. After 2.2 s dims to grey “Code spent”.

→ View demo
Porting
  • Wire relayStatusSnap(dotEl, labelEl) to receive success callback
  • Marketing home Code figure is a P0 candidate
F
Receive Beam
First receive per session
appP1
Effect

Vertical teal beam sweeps top→bottom; 14 particles scatter radially; “Context received.” fades up and out. ~1.1 s total.

→ View demo
Porting
  • Add #relay-receive-beam overlay to app shell
  • Call relayReceiveBeam() on first receive event
  • Guard with sessionStorage for once-per-session
G
Code Gravestone
Code expires or is spent
app relay listP1
Effect

Card fades to 38% opacity, grayscale 70%. Code text goes grey + line-through. glyph fades in after 300 ms.

→ View demo
Porting
  • Add <span class="relay-gravestone" aria-hidden="true">†</span> inside Code value element
  • Call relayExpireCode(cardEl, statusEl) on state change
H
Empty State
List renders with zero items
app · pulse feedP0
Effect

Relay mark breathes (opacity .55→.85, scale 1→1.06, 4 s loop). Three copy variants: relay list, pulse feed, first-time user.

→ View demo
Porting
  • Replace empty state div with .relay-empty markup
  • Pick copy variant by context
  • Opacity + scale only — no layout impact
I
404 — Context Lost
404 route
app · marketingP0
Effect

Relay mark breathes dimly above Code-typography 404. Headline: “This context didn’t transfer.” Home + back CTAs.

→ View demo
Porting
  • Use as the 404 template for app and marketing site
  • Update home/back links to correct routes per surface
J
Late-Night Banner
10 pm – 5 am, once per session
app · consoleP2
Effect

Dark frosted banner slides down. “Working late? Relay it — pick up fresh tomorrow.” Dismissable. One per session.

→ View demo
Porting
  • Add #relay-late-banner div to app/console shell
  • Guard with sessionStorage
  • Reduced-motion: instant show/hide instead of slide
K
Idle Pulse
90 s of no user activity
app nav markP2
Effect

Mark’s 8 rays pulse sequentially (350 ms stagger). Stops immediately on any activity. Multiple marks on a page share one listener.

→ View demo
Porting
  • Add class="relay-mark-idle" to mark SVG
  • Add class="ray" to each line element
  • Change IDLE_MS from 5000 (demo) to 90000 (prod)
Porting Priority
PriorityEggSurfaceReason
P0E — Status SnapApp, Console, Marketing homeHigh-visibility state; marketing Code figure is already the right markup
P0H — Empty StateApp relay list, Pulse feedEvery new user hits this; current state is a dead end
P0I — 404App + marketing siteTies broken pages to product language
P1D — Code ScrambleApp Code display, MarketingReinforces Code as a product primitive
P1C — Console GreetingApp entry pointOne IIFE; targets developer users
P1G — GravestoneApp relay listSpent Codes are currently undifferentiated
P1F — Receive BeamApp first receiveCelebration moment; once-per-session
P2K — Idle PulseApp nav markAdds life; triggers only at 90 s idle
P2J — Late-Night BannerApp + consoleContextual, once-per-session, builds habit
P2B — Mark × 5Nav mark everywhereClassic discovery egg
P3A — KonamiAny Relay pageFor the devs who know
Live Demos
→ Open egg gallery