Production Brief — Explainer Video

OiMy.
For families who already
have enough to worry about.

A cinematic, story-driven 75-second video. One family. One real day. OiMy in the background — quiet, present, human.

75 seconds Cinematic · Story-first Mobile-first Telegram · WhatsApp · iOS Runway + Remotion

What this video must do

Goal
Show what it feels like — not how it technically works
Tone
Warm · Human · Intimate. Kitchen table, not enterprise SaaS
Length
75 seconds (tightest cut). 90s extended for website.
Platform
Telegram · WhatsApp · iOS. 9:16 primary. 16:9 secondary.
Style
Cinematic motion graphics + real-feeling family moments
Brand palette
Amber #C8722A · Sage #5D8A5E · Cream #FDF9F4

The one thing this video must make the viewer feel

"Oh — someone finally built something that understands what family life actually feels like."

Not "wow, this AI is powerful." Not "this is a smart product." The feeling of being understood. Of exhaling. Of not being alone in the chaos.

OiMy is not the hero. The family is. OiMy is the quiet friend who texts at exactly the right moment.

Visual language

🎞

Cinematography

Camera feel

Shot on a warm prime lens — 35mm or 50mm equivalent. Shallow depth of field. Slightly underexposed, lifted in post for warmth. Film grain overlay at 8% opacity. No clean, perfected advertising look — this should feel like a memory, not a commercial.

🎨

Color Grade

LUT direction

Warm shadows (#2A1808 base). Amber highlights pulled toward #E8A86A. Skin tones protected — rich, warm. Desaturate the blues slightly. Think Kodak Vision3 500T, not clean digital. Reference: The Fabelmans kitchen scenes.

✍️

Typography

Titles & captions

Caveat (handwritten, Google Fonts) for emotional captions. Lora (serif) for the OiMy logo reveal. All text appears with a gentle ink-draw animation — not a sharp slide. Handwritten captions sit in the lower-third, not centered, like a note left on a fridge.

📱

Phone UI Moments

Chat overlay style

Phone screen appears as a floating element over the live footage — not a full-screen insert. Soft drop shadow, slight tilt (natural hand hold angle, ~4°). The OiMy message bubbles use the real app design: cream background, amber accent, Lora font at 14px.

Reference films for the director/editor

Warm family chaos: Tully (2018) opening 10 min. Kitchen intimacy: Chef's Table first 2 episodes. Phone-as-character: Her ambient UI scenes. Product emotion: Apple's "Welcome Home" Spike Jonze spot — the feeling of a space that knows you.

The story of one ordinary Tuesday

Follow Maya (mom, 34), Rahul (dad, 36), two kids Aanya (7) and Dev (2), and Nani (grandma, 68, lives nearby). OiMy appears as a quiet presence — a warm glow on a phone screen. It never speaks out loud. It never announces itself. It simply knows what the family needs, a moment before they know they need it.

1
The alarm 0:00 – 0:04
Visual
Extreme close-up. An old phone screen reads 6:47am. The display is warm amber — the night-shift mode color that's never been turned off. The alarm vibrates against a wooden nightstand. Morning light cuts a single stripe across the frame. Film grain. Hold two beats before cutting.

No motion graphics. No logo. Just this one quiet moment before the day begins.
Audio: alarm fades · coffee percolator begins Camera: locked off, no movement
2
Morning chaos 0:04 – 0:14
Visual
Kitchen. Wide shot, then slow push-in to Maya. She's simultaneously making two lunches, looking for Aanya's missing shoe (it's on the counter), fielding Dev's crying, and watching the clock. She moves in that particular way of mothers who are running exactly 8 minutes late every single morning and have accepted this as truth.

The shot is slightly chaotic — camera follows Maya with a gentle handheld sway. Natural light. Cluttered but loved kitchen. A permission slip is on the fridge. An unread WhatsApp notification briefly visible.
Audio: kids in background, kitchen clatter, no music yet Camera: handheld follow, slight push-in on Maya's face
No voiceover — ambient only
The first 14 seconds have no music, no narrator. Just the sounds of real family life. Let it breathe. Let the viewer recognize their own morning.
3
OiMy arrives 0:14 – 0:22
Visual
Maya sets a lunchbox down and glances at her phone. The phone screen appears as a floating overlay — natural angle, held in her hand. A single notification slides in. No notification sound. Just a soft amber glow pulse on the screen.

OiMy
School pickup at 2:30 today. Want me to remind you at 2:10? 🌿

Maya's eyes. Something shifts. Not dramatic — a tiny exhale. She taps "Yes." One tap. Back to the chaos. But something is slightly easier now.
Audio: piano enters — single note, then a soft chord. Very quiet. Phone floats as overlay, slight tilt, realistic angle Caption: none — let the moment speak
4
Dad at work 0:22 – 0:34
Visual
Cut to: Rahul. Office environment. He's in a meeting but clearly distracted — worrying. He slips his phone under the table. Types with one thumb, trying not to be seen.

Did Dad take his pills today?
OiMy
Yes ✓ — marked at 9:15am. He also asked me to tell you: "I'm feeling good today."

Rahul's face. He closes his eyes for exactly one second. That quiet wave of relief that floods through when something you were quietly carrying is lifted. He puts the phone away. He's back in the meeting. Lighter.
Audio: music builds slightly, adds a second piano voice Close-up on Rahul's hands typing, pull to his face
Voiceover (warm female voice, gentle)
"The things you can't stop worrying about, even when you should be somewhere else."
5
The meltdown 0:34 – 0:46
Visual — the emotional center of the video
Mid-afternoon. Maya is on the kitchen floor, back against the cabinet. Dev is in full meltdown — not dangerous, just exhausting. The kind of crying that goes on and on. Maya looks depleted. She picks up her phone. Her hands are slightly shaking.

she won't stop crying and I don't know what to do

Hold a beat. Then — OiMy responds. No corporate cheerfulness. No productivity hack. Just this:

OiMy
That sounds really exhausting. You're doing great, even when it doesn't feel like it.

Is this a hunger cry, or is she overtired? — Last Tuesday she calmed down when you put on that playlist in the kitchen. Want me to start it?

Maya reads it. Her jaw softens. A tear. Not from sadness — from the relief of being seen, in a moment when she felt completely alone.
Audio: music pauses briefly, just ambient room tone, then a single cello note Camera holds — locked off on Maya's face, let the moment be still
Voiceover
"OiMy doesn't just help you remember. It helps you feel like yourself again."
6
Evening light 0:46 – 0:58
Visual
Golden hour. The kitchen is glowing. Rahul is at the stove. Aanya is "helping" (mostly making things worse, in the way that is actually wonderful). Dev is in a high chair, calm now, playing with a wooden spoon.

Maya is sitting at the kitchen table. Just sitting. Phone face-down. Watching her family. For the first time all day, she is not doing anything. She is just here.

Cut to: the pot on the stove. A particular dish — a dal that fits the family's preferences, the leftover vegetables, the low-energy Tuesday mood. We don't explain this. We just see it. A brief glimpse of Maya's phone on the counter: an OiMy suggestion she acted on this afternoon.

The family sits. Rahul makes a terrible joke. Aanya groans. Dev throws his spoon. Everyone laughs anyway.
Audio: music is fullest here — piano + soft guitar + cello, warm and complete Slow push-in on the family table. Candlelit feel. Caption appears — handwritten: "Dinner happened."
7
Night. Quiet. 0:58 – 1:06
Visual
House is quiet. Kids in bed. Maya on the couch, feet up, eyes half-closed. Phone lights up one last time:

OiMy
Tomorrow: Aanya's school project is due. Dentist at 9. I'll remind you in the morning. Rest up. 🌙

She reads it. She puts the phone face-down on the cushion. The screen goes dark. She closes her eyes.

First time today she isn't holding something.
Audio: music fades to just the single piano note it started with Camera slowly pulls back. Maya shrinks slightly in frame. She's small, but she's okay.
Voiceover
"OiMy. For families who already have enough to worry about."
8
Logo close 1:06 – 1:15
Visual — the close
Black for one full second. Silence.

Then: the OiMy wordmark appears — not as a sharp reveal, but as a fade from the darkness, as if it was always there. Warm cream on deep brown. The word breathes — very subtle scale animation (100% → 102% → 100%), like something alive.

Below it, the tagline letter-by-letter in Caveat (handwritten font):

For families who already have enough to worry about.

Hold four seconds. Then: platform badges appear gently from below.
Available on Telegram · WhatsApp · iOS

Music resolves on a final warm chord. Fade to black.
Audio: single final piano chord, very soft, resolves and fades All animated via Remotion — programmatic, pixel-perfect

Recommended approach: Hybrid AI pipeline

Pure AI video (Sora alone, or Runway alone) will feel clean and slightly dead. The goal is warmth and humanity. The recommended approach splits the work by what each tool does best.

Footage
Runway Gen-3
Human scenes, family moments
Grain & Grade
DaVinci Resolve
Film LUT + grain overlay
UI Overlays
Remotion
Phone screens, captions, logo
Export
FFmpeg
9:16 + 16:9 renders
🎬

Runway Gen-3 Alpha Turbo Primary

Human footage generation

Best current tool for realistic human faces with emotional nuance. Use Image-to-Video mode: generate a reference frame first (Midjourney/Firefly), then animate it. This gives character consistency across shots. Turbo mode is faster but Gen-3 Alpha gives richer motion. Budget: ~20 credits per shot.

🔴

Kling 2.0 Alternative

Hyper-realistic human moments

Currently the most photorealistic human video generator. Better skin texture and natural movement than Runway. Weaker on complex scenes (multiple people). Use for the solo moments: Maya's face, Rahul's relief, the quiet couch scene. Kling Pro mode for the emotional close-ups.

⚛️

Remotion Essential

Programmatic overlays + close sequence

All phone screen UI, message bubble animations, handwritten caption reveals, the logo close, and the platform badge sequence are built in Remotion (React/TypeScript). This gives pixel-perfect control over the OiMy brand moments — no keyframe approximation. Script below.

🎞

DaVinci Resolve

Color grade + film treatment

Apply the warm color grade to all AI-generated footage. Use the Kodak Vision3 500T emulation LUT from Ground Control (free), then manually push shadows toward #2A1808 and highlights toward amber. Add 8% film grain via the Fusion compositor. This is what makes AI footage feel real.

🖼

Midjourney v7 / Firefly

Reference frame generation

Generate character reference frames for Runway Image-to-Video. Create one consistent "family" look: Maya (South Asian, 34, warm expression), Rahul (36, office attire, slightly tired eyes), Aanya (7, school uniform variant), Dev (2, round face, pajamas). Use Character Reference to maintain consistency.

🔊

ElevenLabs

Voiceover

Use the "Matilda" voice or "Rachel" voice — warm, slightly intimate, never announcer-style. Speak at 85% of default speed. Tiny room reverb (0.15s decay). The three VO lines should feel like someone sitting next to you, not a commercial. Generate multiple takes, use the most human one.

On consistency across shots

The biggest challenge with AI video is making the same character look the same shot-to-shot. The solution: generate a "character bible" of 12–15 reference images per person in Midjourney using Character Reference mode. Feed these consistently into Runway as the start frame. Accept slight variation — it actually reads as warmth and humanity, not error.

Programmatic overlays — production-ready TypeScript

This Remotion composition handles: phone UI overlays with OiMy chat bubbles, handwritten caption reveals, the logo close sequence, and the platform badge animation. Install with npm create video@latest then drop these components in.

src/OiMyVideo.tsx TypeScript · Remotion
// OiMy Explainer — Remotion composition
// Handles: phone overlays, caption reveals, logo close
// npm create video@latest && npm i @remotion/player

import { AbsoluteFill, Sequence, Video, Img, useCurrentFrame, interpolate, spring, useVideoConfig, Audio } from 'remotion';
import { CSSProperties } from 'react';

// ── Brand tokens ────────────────────────────────────────
const BRAND = {
  amber:   '#C8722A',
  amberLt: '#E8A86A',
  sage:    '#5D8A5E',
  cream:   '#FDF9F4',
  ink:     '#2A2018',
  inkMid:  '#5C4E3A',
};

// ── Utility: spring-eased opacity ───────────────────────
function useFadeIn(startFrame: number, duration = 18) {
  const frame = useCurrentFrame();
  return interpolate(frame, [startFrame, startFrame + duration], [0, 1], {
    extrapolateLeft:  'clamp',
    extrapolateRight: 'clamp',
  });
}

// ── OiMy message bubble ─────────────────────────────────
function MessageBubble({
  text, from, startFrame, width = 300,
}: {
  text: string; from: 'oimy' | 'user';
  startFrame: number; width?: number;
}) {
  const frame = useCurrentFrame();
  const { fps } = useVideoConfig();
  const opacity = useFadeIn(startFrame);
  const translateY = interpolate(
    frame, [startFrame, startFrame + 20], [14, 0],
    { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' }
  );

  const isOiMy = from === 'oimy';
  const style: CSSProperties = {
    background:   isOiMy ? 'rgba(253,249,244,0.96)' : 'rgba(200,114,42,0.85)',
    color:        isOiMy ? BRAND.ink : '#fff',
    borderRadius: isOiMy ? '18px 18px 18px 4px' : '18px 18px 4px 18px',
    padding:      '14px 18px',
    maxWidth:     width,
    fontFamily:   'Lora, Georgia, serif',
    fontSize:     14,
    lineHeight:   1.6,
    boxShadow:    '0 4px 24px rgba(0,0,0,0.18)',
    alignSelf:    isOiMy ? 'flex-start' : 'flex-end',
    opacity,
    transform:    `translateY(${translateY}px)`,
  };

  return (
    <div style={style}>
      {isOiMy && (
        <div style={{ fontSize: 10, fontWeight: 700, letterSpacing: '0.1em',
          textTransform: 'uppercase', color: BRAND.amber, marginBottom: 5 }}>
          OiMy
        </div>
      )}
      {text}
    </div>
  );
}

// ── Phone frame overlay ─────────────────────────────────
function PhoneOverlay({ startFrame, children }: { startFrame: number; children: React.ReactNode }) {
  const frame = useCurrentFrame();
  const opacity = useFadeIn(startFrame, 12);
  const scale = interpolate(
    frame, [startFrame, startFrame + 14], [0.95, 1],
    { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' }
  );

  return (
    <div style={{
      position:     'absolute',
      bottom:       '12%',
      right:        '8%',
      width:        280,
      background:   'rgba(26,18,8,0.92)',
      borderRadius: 24,
      padding:      '20px 16px',
      border:       '1px solid rgba(200,114,42,0.3)',
      boxShadow:    '0 24px 60px rgba(0,0,0,0.55), 0 0 0 1px rgba(255,255,255,0.05)',
      display:      'flex',
      flexDirection:'column',
      gap:          10,
      transform:    `scale(${scale}) rotate(-2deg)`,
      opacity,
      backdropFilter: 'blur(8px)',
    }}>
      {/* Status bar */}
      <div style={{ display: 'flex', justifyContent: 'space-between',
        fontSize: 11, color: 'rgba(253,245,236,0.4)', marginBottom: 4 }}>
        <span>9:23</span><span>●●●●●</span>
      </div>
      {children}
    </div>
  );
}

// ── Handwritten caption ─────────────────────────────────
// Uses SVG stroke-dashoffset trick for ink-draw effect
function HandwrittenCaption({ text, startFrame }: { text: string; startFrame: number }) {
  const frame = useCurrentFrame();
  const opacity = useFadeIn(startFrame, 24);
  const clipProgress = interpolate(
    frame, [startFrame, startFrame + 36], [0, 100],
    { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' }
  );

  return (
    <div style={{
      position:   'absolute',
      bottom:     '8%',
      left:       '7%',
      fontFamily: 'Caveat, cursive',
      fontSize:   34,
      color:      '#FDF5EC',
      textShadow: '0 2px 24px rgba(0,0,0,0.75)',
      opacity,
      // Clip reveal left-to-right for ink draw feel
      clipPath:   `inset(0 ${100 - clipProgress}% 0 0)`,
      letterSpacing: '0.02em',
    }}>
      {text}
    </div>
  );
}

// ── Logo close sequence ─────────────────────────────────
function LogoClose() {
  const frame = useCurrentFrame();
  const { fps } = useVideoConfig();

  const logoOpacity = interpolate(frame, [12, 30], [0, 1], { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' });
  const logoScale = spring({ fps, frame, from: 0.96, to: 1.0, delay: 12, durationInFrames: 24 });
  const taglineOpacity = interpolate(frame, [36, 54], [0, 1], { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' });
  const taglineClip = interpolate(frame, [36, 72], [0, 100], { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' });
  const badgesOpacity = interpolate(frame, [72, 90], [0, 1], { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' });
  const badgesY = interpolate(frame, [72, 90], [12, 0], { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' });

  // Breathing scale (heartbeat feel)
  const breathe = 1 + 0.008 * Math.sin((frame / fps) * 2 * Math.PI * 0.4);

  return (
    <AbsoluteFill style={{ background: '#1A1208', display: 'flex',
      flexDirection: 'column', alignItems: 'center', justifyContent: 'center', gap: 24 }}>

      {/* OiMy wordmark */}
      <div style={{
        fontFamily:    'Lora, Georgia, serif',
        fontSize:      64,
        fontWeight:    500,
        color:         BRAND.cream,
        letterSpacing: '-0.02em',
        opacity:       logoOpacity,
        transform:     `scale(${logoScale * breathe})`,
      }}>
        OiMy
      </div>

      {/* Tagline — ink draw reveal */}
      <div style={{
        fontFamily:    'Caveat, cursive',
        fontSize:      24,
        color:         BRAND.amberLt,
        opacity:       taglineOpacity,
        clipPath:      `inset(0 ${100 - taglineClip}% 0 0)`,
        letterSpacing: '0.02em',
        maxWidth:      520,
        textAlign:     'center',
        lineHeight:    1.4,
      }}>
        For families who already have enough to worry about.
      </div>

      {/* Platform badges */}
      <div style={{
        display:    'flex', gap: 20, opacity: badgesOpacity,
        transform:  `translateY(${badgesY}px)`, marginTop: 16,
      }}>
        {['Telegram', 'WhatsApp', 'iOS'].map(p => (
          <div key={p} style={{
            padding:      '8px 20px',
            border:       '1px solid rgba(253,249,244,0.2)',
            borderRadius: 100,
            color:        'rgba(253,249,244,0.6)',
            fontSize:     13,
            fontFamily:   'Inter, sans-serif',
            fontWeight:   500,
          }}>{p}</div>
        ))}
      </div>

    </AbsoluteFill>
  );
}

// ── Amber glow pulse (OiMy "alive" indicator) ───────────
function AmberPulse({ startFrame }: { startFrame: number }) {
  const frame = useCurrentFrame();
  const { fps } = useVideoConfig();
  const progress = Math.max(0, frame - startFrame);
  const scale = 1 + 0.3 * Math.sin((progress / fps) * 2 * Math.PI * 1.2);
  const opacity = interpolate(progress, [0, 8, 16], [0, 0.4, 0],
    { extrapolateLeft: 'clamp', extrapolateRight: 'clamp' });

  return (
    <div style={{
      position:     'absolute',
      right:        '9%',
      bottom:       '13%',
      width:        300,
      height:       200,
      borderRadius: 50,
      background:   BRAND.amber,
      filter:       'blur(60px)',
      opacity,
      transform:    `scale(${scale})`,
      pointerEvents:'none',
    }} />
  );
}

// ── Root composition ────────────────────────────────────
export function OiMyExplainer() {
  const { fps } = useVideoConfig();
  const f = (sec: number) => Math.round(sec * fps); // seconds → frames at 30fps

  return (
    <AbsoluteFill style={{ background: '#1A1208' }}>

      {/* ── Scene 1: Alarm (0:00–0:04) */}
      <Sequence from={f(0)} durationInFrames={f(4)}>
        <Video src="./footage/shot-01-alarm.mp4" />
      </Sequence>

      {/* ── Scene 2: Kitchen chaos (0:04–0:14) */}
      <Sequence from={f(4)} durationInFrames={f(10)}>
        <Video src="./footage/shot-02-kitchen.mp4" />
      </Sequence>

      {/* ── Scene 3: OiMy first message (0:14–0:22) */}
      <Sequence from={f(14)} durationInFrames={f(8)}>
        <Video src="./footage/shot-03-maya-phone.mp4" />
        <AmberPulse startFrame={0} />
        <PhoneOverlay startFrame={6}>
          <MessageBubble
            from="oimy"
            text="School pickup at 2:30 today. Want me to remind you at 2:10? 🌿"
            startFrame={8}
          />
        </PhoneOverlay>
      </Sequence>

      {/* ── Scene 4: Dad at work (0:22–0:34) */}
      <Sequence from={f(22)} durationInFrames={f(12)}>
        <Video src="./footage/shot-04-dad-office.mp4" />
        <PhoneOverlay startFrame={4}>
          <MessageBubble from="user" text="Did Dad take his pills today?" startFrame={6} />
          <MessageBubble
            from="oimy"
            text="Yes ✓ — marked at 9:15am. He also asked me to tell you: "I'm feeling good today.""
            startFrame={18}
          />
        </PhoneOverlay>
      </Sequence>

      {/* ── Scene 5: The meltdown (0:34–0:46) */}
      <Sequence from={f(34)} durationInFrames={f(12)}>
        <Video src="./footage/shot-05-meltdown.mp4" />
        <PhoneOverlay startFrame={4}>
          <MessageBubble from="user" text="she won't stop crying and I don't know what to do" startFrame={6} width={240} />
          <MessageBubble
            from="oimy"
            text="That sounds really exhausting. You're doing great, even when it doesn't feel like it. Is this a hunger cry, or overtired? — Last Tuesday she calmed down with music. Want me to start it?"
            startFrame={22}
          />
        </PhoneOverlay>
      </Sequence>

      {/* ── Scene 6: Evening dinner (0:46–0:58) */}
      <Sequence from={f(46)} durationInFrames={f(12)}>
        <Video src="./footage/shot-06-dinner.mp4" />
        <HandwrittenCaption text="Dinner happened." startFrame={f(10) - f(46)} />
      </Sequence>

      {/* ── Scene 7: Night / couch (0:58–1:06) */}
      <Sequence from={f(58)} durationInFrames={f(8)}>
        <Video src="./footage/shot-07-night.mp4" />
        <PhoneOverlay startFrame={4}>
          <MessageBubble
            from="oimy"
            text="Tomorrow: Aanya's school project is due. Dentist at 9. I'll remind you in the morning. Rest up. 🌙"
            startFrame={6}
          />
        </PhoneOverlay>
      </Sequence>

      {/* ── Scene 8: Logo close (1:06–1:15) */}
      <Sequence from={f(66)} durationInFrames={f(9)}>
        <LogoClose />
      </Sequence>

      {/* ── Audio: voiceover */}
      <Audio src="./audio/voiceover.mp3" />
      <Audio src="./audio/score.mp3" volume={0.55} />

    </AbsoluteFill>
  );
}

// ── Register composition in Root.tsx ────────────────────
// <Composition
//   id="OiMyExplainer"
//   component={OiMyExplainer}
//   durationInFrames={75 * 30}  // 75 seconds at 30fps
//   fps={30}
//   width={1080}   // 9:16 primary
//   height={1920}
// />

Rendering for both formats

Render 1080×1920 (9:16) as the primary — this is what gets shared on WhatsApp and Telegram. Then re-render at 1920×1080 (16:9) for the website hero. In the 16:9 version, the phone overlay moves to the right third of frame. Adjust the right and bottom positioning in PhoneOverlay accordingly. Use npx remotion render OiMyExplainer --codec=h264 for both.

Sound as emotional architecture

The score does as much emotional work as the visuals. It must feel like it was composed specifically for this family — not licensed background music, not corporate uplift. Intimate. Slightly imperfect. Human.

Tempo & Key

72 BPM · D major

Slow enough to breathe. D major for warmth without saccharine. The score "warms up" as the day progresses — first chord at 0:14, full arrangement by 0:46.

Instruments by layer

Piano → Guitar → Cello

Layer 1 (0:14): Solo Rhodes piano — warm, slightly worn. Layer 2 (0:28): Acoustic guitar fingerpicking enters, no plectrum. Layer 3 (0:46): Single cello joins — not dramatic, just present. Dissolves at 1:06 back to solo piano for the logo.

The meltdown pause

Moment of silence

At 0:34 (the meltdown scene), the music drops to pure room tone for 3 seconds. Then a single cello note enters — not a melody, just a held note, like a breath. This is the most important sound design decision in the entire video.

Reference pieces

Emotional North Stars

"Arrival in Nara" by Ólafur Arnalds (warmth without sweetness). "On the Nature of Daylight" by Max Richter (emotional weight). "Comptine d'un autre été" — but slower, less precious. Commission from Artlist.io or Musicbed using "intimate piano family warmth" as search terms.

Ambient sound design

Underneath the score for the first 14 seconds: coffee percolator, a child's unintelligible chatter in another room, the scrape of a chair. These sounds ground the viewer before the music begins. They are not mixed low — they are present. Real kitchens are loud in the morning.

At the dinner scene: the sound of a wooden spoon against a pot, a child's laugh (unscripted-sounding), cutlery. These sounds should barely peek above the music mix — they live in the background, not the foreground. They make the visuals true.

The one sound that must be perfect

The OiMy notification sound — heard once, at 0:14 when the first message arrives. It must NOT be a standard phone ping. It should be a single, warm piano note — D4, soft attack, 0.8 second decay. This is the "voice" of OiMy. Commission this as a custom sound asset. Budget $50 from a sound designer on Fiverr or SoundSnap. It will be used across all OiMy product touchpoints.

Shot-level Runway & Sora prompts

Use these as Image-to-Video prompts in Runway Gen-3, or text-to-video in Sora. Generate 3–5 variants per shot and select the one with the most natural human movement. Do not use the first generation.

Shot 1 — Alarm: Extreme close-up macro of a smartphone screen showing 6:47am in warm amber night-shift display light. The phone rests on a wooden nightstand with visible grain. Morning sunlight cuts a single warm stripe across the frame. 35mm prime lens bokeh. Slight film grain overlay. Color grade: warm shadows, cream highlights. The phone vibrates once, very subtle. Hold for 4 seconds. No people visible. Cinematic, intimate, documentary feel. Aspect ratio 9:16.
Shot 2 — Kitchen chaos: Medium-wide shot of a warm, cluttered family kitchen at 7am. A South Asian woman in her mid-30s, dark hair slightly disheveled, moves through the frame simultaneously making two lunches, scanning the counter for something lost, glancing at the clock. A school-age girl in the background can't find her shoe. A toddler cries softly at the table. Morning light through a window behind. Handheld camera, gentle sway. Warm Kodak Vision3 color grade. Shot on 35mm lens. The scene is chaotic but loving — not staged, not advertising-perfect. Real family morning energy.
Shot 3 — Maya reads OiMy: Close-up on a South Asian woman in her mid-30s, face slightly tired but warm, reading her phone. Her expression shifts from mild overwhelm to a tiny, private exhale of relief — not dramatic, barely perceptible. The kind of relief you only see in the eyes. Kitchen background, soft focus. Shallow depth of field, 35mm. Warm amber color grade. The emotional register is: someone who was carrying something alone, and for one moment, isn't.
Shot 4 — Rahul, office: Medium close-up. A South Asian man in his mid-30s, office shirt with collar loosened, sits in a meeting but is clearly distracted. He glances around, then slips his phone below the table and types with one thumb. His face as he reads a reply: eyes close for one second, jaw releases, shoulders drop slightly. The relief of a son who was quietly worried all morning. Office environment background, soft focus. 50mm feel. Warm but slightly cooler than the home scenes.
Shot 5 — The meltdown: South Asian woman in her mid-30s sitting on a kitchen floor, back against lower cabinet, knees up. A toddler is visible at the edge of frame, crying. The woman looks depleted — not broken, but at her edge. She picks up her phone with slightly shaking hands and types. Then she reads something. A tear comes — not from sadness, from the relief of being seen and not judged. The emotional register must be authentic, not performative. Hold on her face for three full seconds after the tear. 35mm, film grain, warm grade.
Shot 6 — Dinner: Golden hour light through a kitchen window. A family of four around a wooden kitchen table — South Asian parents, a 7-year-old girl, a toddler in a high chair. Steam from a pot at center. The father is at the stove, still in his work shirt. The mother is sitting, watching, not doing anything — the first time today. Natural laughter, a child throwing something small and harmless. The lighting is warm, amber, like the inside of a memory. Slow push-in. 35mm. This shot should feel like home.
Shot 7 — Night, couch: Woman in her mid-30s on a couch in a dimly lit living room. House quiet. She reads a phone message, then slowly places the phone face-down on the cushion beside her. Closes her eyes. She is still. There is the faintest suggestion of a smile — not happiness exactly, more like the feeling of being okay. Camera on a long lens, slightly pulled back. Hold for four seconds after she closes her eyes.

What to hand off

📁

Primary deliverable

For Telegram & WhatsApp

1080×1920 (9:16). H.264, CRF 18. Under 50MB for WhatsApp. Under 2GB for Telegram. 30fps. 75-second cut. AAC audio, stereo, 48kHz. Color space: BT.709.

🖥

Secondary deliverable

For website hero

1920×1080 (16:9). Same specs. The Remotion composition needs a layout variant — the phone overlay shifts to the right third. 90-second extended cut adds 15 seconds to the dinner scene.

🔇

Silent variant

For autoplay embeds

Render a version with subtitles burned in (white Caveat font, amber shadow) and music only — no voiceover dialogue. Autoplay loops on websites without audio. The visual story must still work completely silently.

🎬

Remotion export

Overlay elements only

Export the Remotion composition as a transparent ProRes 4444 with alpha — this lets the video editor drop the phone overlays, captions, and logo close over the color-graded footage in Resolve without re-rendering Remotion for each grade pass.