# The ImuTechz explainer, rebuilt from the scene library.
# YouTube: every scene (about 2:40). LinkedIn 4:5: the scenes tagged [youtube, linkedin] (about 1:15).
# Pronunciations come from brief.voice.pronunciations, so the text below is written as shown.
title: "IMURUN: local-first AI with its own engine"
bpm: 120
hud: {chapter: true, rail: true}
scenes:
  - id: hook
    type: tour
    platforms: [youtube, linkedin]
    params: {shot: intro, url: imutechz.in, from: 0, speed: 1.0, full: true, cursor: false, cam: [{f: 0, z: 1.0}, {f: 90, z: 1.06, x: 720, y: 330}]}
    say: ["Grain by grain… this is imutechz.in."]
  - id: hook2
    type: kinetic
    platforms: [youtube, linkedin]
    params: {lines: ["AI that lives", "~on your machine.~"], sub: "IMURUN · v0.3.0 · open source, MIT"}
    say: "AI that lives on your own machine."
  - id: title
    type: title
    platforms: [youtube, linkedin]
    params: {kicker: "IMURUN", title: "IMURUN", subtitle: "local-first AI chat, with its own inference engine.", chips: ["v0.3.0", "MIT licence", "Windows · macOS · Linux", "one process · no cloud"]}
    say: ["Meet IMURUN, local-first AI chat with its own inference engine.", "{v0.3|Version zero point three}: Windows, macOS, Linux."]

  - id: process
    platforms: [youtube]
    type: diagram
    chapter: "01 · What IMURUN is"
    transition: wipe
    params:
      title: "One process, on your machine."
      nodes:
        - {label: FISH, sub: "C++ engine · GGUF on the CPU", hi: true}
        - {label: Server, sub: "Python · sessions, tools, connectors"}
        - {label: Liquid Paper, sub: "native window or your browser"}
      caption: "No cloud. Your data stays with you."
    say: ["One process: the FISH engine, a Python server, and the UI.", "No cloud. Your data stays with you."]

  - id: inside
    platforms: [youtube]
    type: kinetic
    chapter: "02 · Inside FISH"
    transition: wipe
    params: {kicker: "Inside FISH", lines: ["Our own", "~C++ inference engine.~"]}
    say: "Let’s look inside FISH, our own C++ engine."
  - id: mmap
    type: whiteboard
    platforms: [youtube, linkedin]
    params:
      step: 1
      tag: "Inside FISH · step 1 of 5"
      title: Memory-map the GGUF
      take: "The file is *mapped*, not copied: the OS pages weights in as needed."
      items:
        - {path: "M60 60 L330 60 L400 130 L400 640 L60 640 Z M330 60 L330 130 L400 130", at: 0.4, dur: 1.4}
        - {note: "model.gguf", x: 96, y: 86, size: 40, at: 1.6, dur: 1}
        - {rect: [800, 80, 740, 560], at: 2.4, dur: 1.4}
        - {note: "memory", x: 820, y: 6, size: 46, at: 3.2, dur: 0.8}
        - {arrow: [440, 350, 760, 350], at: 4.0, dur: 0.9}
        - {note: "mmap", x: 540, y: 236, size: 64, acc: true, at: 4.4, dur: 0.8}
        - {note: "read-only · bounds-checked", x: 450, y: 420, size: 32, at: 5.2, dur: 1.2}
        - {cells: {x: 840, y: 120, cols: 9, rows: 6, w: 62, h: 66, gap: 14}, at: 6, dur: 4.4}
    say: ["Step one: memory-map the GGUF file.", "Nothing is copied; weights load as needed."]
  - id: quant
    platforms: [youtube]
    type: whiteboard
    params:
      step: 2
      tag: "Inside FISH · step 2 of 5"
      title: Weights stay quantised
      flow: ["Q4_K block", "SIMD unpack", "never f32"]
      notes: ["≈ 4.5 bits a weight", "inside registers", ""]
      take: "No matrix is ever expanded to *f32*."
    say: ["Step two: the weights stay quantised.", "No matrix is expanded to f32."]
  - id: int8
    platforms: [youtube]
    type: whiteboard
    params:
      step: 3
      tag: "Inside FISH · step 3 of 5"
      title: "Activations → int8, once per matmul"
      flow: ["x (f32)", "÷ scale, round", "int8 × every row"]
      take: "Quantised *once*, reused by every row."
    say: ["Step three: activations become int8…", "once per matmul, for every row."]
  - id: avx
    type: stat
    platforms: [youtube, linkedin]
    params: {kicker: "Inside FISH · step 4 of 5 · AVX2", value: 2.1, decimals: 1, suffix: "×", label: "AVX2 integer dot products vs the f32 path, per Q4_K row", source: "FISH benchmark, Ryzen 7 7435HS (imutechz.in/imu)"}
    say: "Step four: AVX2 integer maths, {2.1|two point one} times the f32 path."
  - id: tokens
    platforms: [youtube]
    type: steps
    params: {kicker: "Inside FISH · step 5 of 5", title: "One token at a time.", items: [{t: "Pick a token"}, {t: "Feed it back"}, {t: "Repeat"}]}
    say: "Step five: pick a token, feed it back, one at a time."
  - id: kv
    type: whiteboard
    platforms: [youtube, linkedin]
    params:
      tag: "Inside FISH"
      title: The KV prefix cache
      flow: ["system prompt", "cached", "only the new part"]
      take: "A repeated system prompt is *free*."
    say: ["The KV prefix cache skips what you’ve already sent…", "so a repeated system prompt is free."]
  - id: prefetch
    platforms: [youtube]
    type: whiteboard
    params:
      tag: "Inside FISH"
      title: Bigger than free RAM?
      flow: ["layer n: compute", "layer n+1: prefetch"]
      take: "The next layer loads *while* this one computes."
    say: "Model bigger than free RAM? FISH prefetches the next layer during compute."
  - id: models
    platforms: [youtube]
    type: bullets
    params: {kicker: "Models", title: "GGUF models, on the CPU.", items: ["Llama family", "Qwen · Phi · Gemma", "Vulkan GPU offload: *in progress*"]}
    say: "Llama-family models, Qwen, Phi and Gemma. Vulkan offload is in progress."

  - id: agents
    type: steps
    platforms: [youtube, linkedin]
    chapter: "03 · Agents"
    transition: wipe
    params:
      kicker: Agents
      title: "Tools that *ask first*."
      items:
        - {t: "Approval card", d: "anything that runs or writes"}
        - {t: "8 connectors", d: "plus any MCP server"}
        - {t: "LoRA tuning", d: "on your device, with consent"}
    say: ["Agents use tools, but ask before they act.", "Anything that runs or writes shows an approval card.", "Eight connectors, plus any MCP server.", "LoRA tuning, only with your consent."]

  - id: look
    platforms: [youtube]
    type: kinetic
    chapter: "04 · The new imutechz.in"
    transition: wipe
    params: {kicker: "imutechz.in · the new look", lines: ["Cream, ink,", "~and one orange.~"]}
    say: "The new imutechz.in: cream, ink and one orange."
  - id: tourHome
    type: tour
    platforms: [youtube, linkedin]
    params:
      shot: intro
      url: imutechz.in
      from: hero
      speed: 1.35
      eyebrow: The home page
      title: "Grains that form the logo, and *every room*."
      bullets: ["a particle hero, drawn live", "hover a room: the grains re-form"]
      cam: [{m: hero, z: 1}, {m: room1, d: 20, z: 1.18, x: 900, y: 470}, {m: grains, z: 1.25}]
      callouts: [{text: "Hover a room → the grains *re-form*", m: room1, d: 10, len: 4.0, page: {x: 1000, y: 690}, align: center}]
    say: ["The home page: a particle hero that forms our logo…", "then re-forms into each room of the site as you hover."]
  - id: tourImu
    platforms: [youtube]
    type: tour
    params:
      shot: imu
      url: imutechz.in/imu
      from: 10
      speed: 1.65
      eyebrow: The IMURUN page
      title: "AI that lives on your machine."
      bullets: ["the engine, explained", "seven parts, one window"]
      cam: [{m: hero, z: 1}, {m: parts, z: 1}, {m: parts, d: 60, z: 1.08, x: 720, y: 400}]
    say: "The IMURUN page: what it is, how FISH works, and the seven parts in one window."
  - id: tourDocs
    type: tour
    platforms: [youtube, linkedin]
    params:
      shot: docs
      url: imutechz.in/imu/docs
      from: index
      speed: 1.0
      eyebrow: Documentation
      title: "23 guides, and *one search*."
      bullets: ["Ctrl K from any page", "typo-tolerant", "deep links to headings"]
      cam: [{m: index, z: 1}, {m: ctrlk, d: 24, z: 1.32, x: 720, y: 300}, {m: landed, d: 10, z: 1.0}]
      callouts: [{text: "“streming”: a typo, *still found*", m: type, d: 30, len: 2.6, page: {x: 1060, y: 120}, align: right}]
    say: ["The docs: twenty-three guides, one search for the whole site.", "Press {Ctrl K|Control K} anywhere and type, even with a typo.", "Pick a result, and it jumps right to that heading."]
  - id: tourDir
    platforms: [youtube]
    type: tour
    params:
      shot: dir
      url: imutechz.in/agents
      from: index
      speed: 1.12
      eyebrow: "Agents & Skills"
      title: "10,631 open-source agents and skills."
      bullets: ["search in plain language", "every entry has its own page"]
      cam: [{m: index, z: 1}, {m: type, d: 10, z: 1.3, x: 640, y: 420}, {m: entry, z: 1.0}]
    say: ["The directory: {10,631|ten thousand, six hundred and thirty-one} open-source agents and skills.", "Search in plain language, and every entry has its own page."]

  - id: install
    type: terminal
    platforms: [youtube, linkedin]
    chapter: "05 · Get it"
    transition: wipe
    params:
      kicker: Get it
      title: "One command, then just *imurun*."
      lines: [{cmd: "pip install imurun"}, {comment: "then, any time:"}, {cmd: "imurun"}, {comment: "or, with Node:"}, {cmd: "npx imurun"}]
      chips: ["Windows · macOS · Linux", "MIT licence", "data stays in ~/.imurun"]
    say: ["Get it with pip install imurun.", "Then run imurun, or npx imurun.", "Your data stays on your machine."]
  - id: end
    type: end
    platforms: [youtube, linkedin]
    params: {name: "ImuTechz", tagline: "Open-source R&D, built in public.", links: [imutechz.in, github.com/shubham001312/imurun], cta: "pip install imurun"}
    say: ["ImuTechz: open-source R&D, built in public.", "imutechz.in."]

captures:
  - id: intro
    platforms: [youtube]
    url: http://localhost:3000/
    viewport: {w: 1440, h: 810}
    dpr: 2
    settle: 2500
    actions:
      - {hold: 100}
      - {mark: hero}
      - {hold: 60}
      - {move: {sel: ".hh-rooms li:nth-child(1) a", dx: -40}, frames: 26}
      - {mark: room1}
      - {hold: 54}
      - {move: {sel: ".hh-rooms li:nth-child(4) a", dx: -40}, frames: 16}
      - {hold: 54}
      - {move: {x: 1040, y: 300}, frames: 26}
      - {mark: grains}
      - {move: {x: 1180, y: 470}, frames: 30}
      - {hold: 20}
  - id: imu
    platforms: [youtube]
    url: http://localhost:3000/imu
    viewport: {w: 1440, h: 810}
    session: {imu-intro-played: "1"}
    actions:
      - {mark: hero}
      - {hold: 20}
      - {move: {x: 700, y: 330}, frames: 30}
      - {scroll: {text: "Seven parts"}, offset: 95, frames: 45}
      - {mark: parts}
      - {hold: 90}
  - id: docs
    platforms: [youtube]
    url: http://localhost:3000/imu/docs
    viewport: {w: 1440, h: 810}
    session: {imu-intro-played: "1"}
    actions:
      - {mark: index}
      - {hold: 20}
      - {mark: ctrlk}
      - {key: k, mods: [Control], after: 14}
      - {mark: type}
      - {type: "layer streming", per_char: 4}
      - {hold: 30}
      - {key: Enter}
      - {until: "/\\/imu\\/docs\\/.+/.test(location.pathname)", timeout: 30}
      - {mark: landed}
      - {hold: 80}
  - id: dir
    platforms: [youtube]
    url: http://localhost:3000/agents
    viewport: {w: 1440, h: 810}
    session: {imu-intro-played: "1"}
    settle: 3500
    actions:
      - {mark: index}
      - {hold: 24}
      - {move: {sel: "input[placeholder^='Search:']", dx: -300}, frames: 24}
      - {click: true, after: 6}
      - {mark: type}
      - {type: "make a website", per_char: 3}
      - {hold: 16}
      - {scroll: {y: 270}, frames: 40}
      - {move: {sel: ".dcard-link"}, frames: 22}
      - {click: true, after: 4}
      - {until: "/^\\/agents\\/[^/]+$/.test(location.pathname) && !!document.querySelector('h1')", timeout: 45}
      - {mark: entry}
      - {hold: 60}

thumbnail: {kicker: "IMURUN · v0.3.0 · OPEN SOURCE", title: "AI that lives on your machine", accent: machine, badge: "Inside FISH, our own C++ engine", shot: intro}
