diff --git a/README.md b/README.md index e1cb494..0fb8b2a 100644 --- a/README.md +++ b/README.md @@ -2,25 +2,28 @@ Visual screenshot testing is an excellent control surface for directing coding agents. Using renders inside the coding loop can increase render counts by 100x to 1000x, which is wildly unaffordable with existing centralized render services such as Chromatic. -Selfie is a visual review gate built for that loop. It runs on your machine beside your agent, in CI, and on GitHub, and it's piloting with StorybookJS. PRs to support other testing models are welcome. +Selfie is a visual review gate built for that loop. It runs on your machine beside your agent, in CI, and on GitHub, and when you want to know why something changed, you can ask Muse Spark. It's piloting with StorybookJS, and PRs to support other testing models are welcome. + +Go to [selfie.dev](https://selfie.dev) to follow development after the hackathon. ## Watch it -| [Why Selfie](https://youtu.be/8B3-v4DTwfU) | [Product demo](https://youtu.be/FiGuwfB13b0) | +| [Why Selfie](https://youtu.be/8B3-v4DTwfU) | [Product demo](https://youtu.be/ZrUv0Pn7yyc) | | --- | --- | -| [![Watch: Why Selfie](https://img.youtube.com/vi/8B3-v4DTwfU/maxresdefault.jpg)](https://youtu.be/8B3-v4DTwfU) | [![Watch: Selfie product demo](https://img.youtube.com/vi/FiGuwfB13b0/maxresdefault.jpg)](https://youtu.be/FiGuwfB13b0) | -| From Storybook to Chromatic to Selfie: why snapshot testing needs to change for coding agents. | The real app: a two-line CSS change touches all 124 stories, and a person and an agent work through it together. | +| Watch: Why Selfie | Watch: Selfie product demo | +| From Storybook to Chromatic to Selfie: why snapshot testing has to change for coding agents. | The real app: two lines of CSS touch all 142 stories, and Muse Spark finds what broke dark mode. | You can also look around the hosted review pages without signing in: here's [Selfie reviewing itself](https://hackathon.selfie.dev/diffplug/selfie-hackathon). ## What it does - **Fits an agent's loop.** `selfie review` prints one JSON document naming the diff images, with an exit code that says whether anything blocks. -- **Runs where the agent runs.** On an M4 MacBook Air, Selfie's own 124 stories render in about 25 seconds, with no cloud and no bill per image. A larger Storybook of 541 stories takes about 70 seconds. Reviewing a build that's already rendered takes under half a second. -- **Says what kind of change it is.** Selfie separates what moved or gained spacing from what really changed, so you can approve the harmless ones together. +- **Runs where the agent runs.** On an M4 MacBook Air, Selfie's own Storybook of about 140 stories renders in under 30 seconds, with no cloud and no bill per image. A larger Storybook of 541 stories takes about 70 seconds. Reviewing a build that's already rendered takes under half a second. +- **Says what kind of change it is.** Selfie separates what moved or gained spacing from what really changed, and finds one change repeated across stories, so you can accept it once. +- **Tells you why, with Muse Spark.** On a changed story in the cloud, ask what caused it. Muse Spark reads the before, after, and diff images and the code from GitHub, and it can point out what nobody asked for. - **Lets you point at the problem.** Write a note on an image, and your agent gets your words, the exact box, and a picture of what you saw. It answers on the same note, and you flip between before and after. - **Follows Git.** An approval counts wherever history reaches it, so it isn't repeated after a commit, a rebase, or a merge. -- **Gives the same pixels everywhere.** Stories render in a pinned container, and `selfie flakes` finds any that still vary between renders. +- **Keeps the pixels reproducible.** Stories render in a container pinned by digest, and `selfie flakes` finds any that still vary between renders. - **Reports on every commit.** A GitHub Action renders each push, and the commit gets a `selfie` status that links to its review. ## Quickstart @@ -47,7 +50,7 @@ You'll need Node 26 or later, pnpm, and Docker. Selfie isn't on npm yet, which i **To work together,** a person leaves notes on any story in `selfie ui`, and either copies them into any agent, or presses Send while the agent runs `selfie agent-await-feedback`. The agent acts on them, runs `selfie render`, and answers each with `selfie reply`. The person flips against the image they commented on, and resolves the note or answers back. -**In the cloud,** a GitHub Action renders every pushed branch and uploads its batch. Each commit gets a `selfie` status: red if a story failed or a person rejected a change, yellow if a change is undecided, and green if everything matches what's approved. +**In the cloud,** a GitHub Action renders every pushed branch and uploads its batch. Each commit gets a `selfie` status: red if a story failed or a person rejected a change, yellow if a change is undecided, and green if everything matches what's approved. On a changed story's page, anyone can ask Muse Spark about the change. A project needs a `selfie.config.json` at its Git top level, which says where its built Storybook is and how to build it, and may also set its environment, init script, and how close changed hunks join. @@ -65,6 +68,7 @@ From a checkout, `pnpm selfie ` runs these. | `notes`, `agent-await-feedback`, `reply` | How a person's notes on the images reach a coding agent, and how it answers | | `push`, `pull` | Sends a batch and its decisions to the cloud, and takes what a commit's history approved from it | | `flakes` | Renders a built Storybook several times, and says what wasn't the same each time. `selfie skill fix-flakes` is a guide for a coding agent to fix what it finds | +| `skill` | Prints a guide for a coding agent: `quickstart` to set Selfie up in a repository, and `fix-flakes` to make every story render the same way | ## What's built, and what isn't @@ -86,9 +90,23 @@ We previously launched [Selfie](https://lib.selfie.dev), a snapshot testing libr ### Meta models -Most of the event went on the foundation: rendering, storage, review, and sync. **Selfie calls a Meta model in one place so far.** On a changed story's page in the cloud service, anyone can ask Muse Spark about the change. It reads the before, after, and diff images, and the commits and code diff from GitHub between what was approved and this commit ([`docs/specs/chat.md`](docs/specs/chat.md)). +Most of the event went on the foundation: rendering, storage, review, and sync. **Selfie calls a Meta model in one place so far: asking Muse Spark about a change.** + +Selfie's own code can say exactly which pixels differ and whether content moved, but not why, or whether anyone wanted it. So on a changed story's page in the cloud service, anyone can ask. For each question, `muse-spark-1.3` reads: + +- the image last approved, the new image, and their diff +- the measurements of their differences +- the commits and code diff from GitHub, from what was approved to this commit + +In the [product demo](https://youtu.be/ZrUv0Pn7yyc), we asked it the page's own starter question, "What code caused this change?", about a commit whose request was only for more room in a top bar. Muse Spark found the CSS, and then raised the bug by itself: + +> What was not asked for in that message is the color: in this `--dark` story the old bar is dark and the new bar is white/light. The `background: #f6f8fa` line is fixed light instead of the theme variable, so check dark mode before accepting. + +We wrote that bug on purpose for the demo, and that answer is real and unedited. + +It's built to be safe to leave open on a public page. Each answer says which code it read and what it left out. The model has no tools, and its answer is plain text, so an instruction hidden in a branch's code has nothing to act with. An answer can never approve, reject, or block anything. See [`docs/specs/chat.md`](docs/specs/chat.md). -Selfie's own code can say exactly which pixels differ and whether content moved, but not why, or whether anyone wanted it. That matters at agent scale: one style tweak we measured changed 290 of a Storybook's 541 stories, which is why the next step, specified in [`docs/specs/system.md`](docs/specs/system.md) as `change-grouping`, is to group changed stories by the code change that caused them, and flag the changes nobody asked for. +That matters at agent scale: one style tweak we measured changed 290 of a Storybook's 541 stories. The next step, specified in [`docs/specs/system.md`](docs/specs/system.md) as `change-grouping`, is to ask about a whole batch, grouping changed stories by the code change that caused them, and flagging the changes nobody asked for. ## Architecture diff --git a/product-demo/README.md b/product-demo/README.md index bf352be..87f91ad 100644 --- a/product-demo/README.md +++ b/product-demo/README.md @@ -6,7 +6,7 @@ A [HyperFrames](https://hyperframes.heygen.com) film of the real product, review |---|---| | `SCRIPT.md` | The words. One paragraph is one scene, and the bold line under it is what's on screen. | | `scenes.json` | The scenes, in the same order, and how long the last one holds after its last word. | -| `assets/narration.mp3`, `assets/narration-timing.json` | The voiceover, and when each word of it happens, from ElevenLabs. | +| `assets/narration.mp3`, `assets/narration-timing.json` | The voiceover, and when each word of it happens, from ElevenLabs. Without them, timing is estimated. | | `compositions/.html` | Each scene. Beats are written as `w("word")`, so they follow the voice. | | `assets/ui/` | Screenshots of the real app, 2x, each one a state it was really in. `points.json` is where the pointer was. | | `assets/lib.js`, `assets/style.css` | The app window, its pointer and camera, and the terminal. | diff --git a/product-demo/REVIEW.md b/product-demo/REVIEW.md index c56fad4..f8f78b1 100644 --- a/product-demo/REVIEW.md +++ b/product-demo/REVIEW.md @@ -2,9 +2,10 @@ For whoever changes this film next, including an agent. -- **Real:** every screen is a screenshot of the real app in a state it really reached, running on an M4 MacBook Air against this repository's Storybook, in a throwaway clone: `selfie review`, the 124 changed, the 48 spacing-only, 85,143 pixels down to 13, the note, the reply, and the final review. Every terminal line is from those runs. GitHub and `hackathon.selfie.dev` are the live public pages, read only, for the real `main` commit, which isn't the commit in the story. +- **Real:** every screen is a screenshot of the real app in a state it really reached, on an M4 MacBook Air against this repository's Storybook, in a throwaway clone. That covers the 142 changed, the two repeated changes accepted (21 and 42 images, so 63 of 142), 85,143 pixels down to 13, the note, the reply, and the final review. Every terminal line is from those runs. +- **Real, in the cloud:** the buggy commit was pushed to a throwaway branch of this repository, so GitHub's status and `hackathon.selfie.dev` are the live pages for it. Muse Spark's answer is its real, unedited answer to the page's own starter question, "What code caused this change?". It raised the color and dark mode by itself. - **Staged:** the bug. The agent's change was written to hard-code a light color, so that dark mode would break. The request, the fix, and the reply were written for the film too, though each really ran. -- **Added on top:** the pointer, the camera moves, and the callouts. The render log is sped up, and ends on what it really took. JSON is trimmed, with `…` where it is. The note's typing is uncovered from its finished screenshot. +- **Added on top:** the pointer, the camera moves, the callouts, and the highlights on the answer. The render log and Muse Spark's answer are sped up, and the note's typing is uncovered from its finished screenshot. Terminal output is trimmed, with `…` where it is. - **Timing:** scenes, subtitles, and beats come from the word times ElevenLabs gave for this take. - **Not checked:** the sound was measured, not heard. - **Kept warnings:** `timeline_track_too_dense`, one clip per subtitle; `dead_stretch`, judged against freeze detection on the rendered file. diff --git a/product-demo/SCRIPT.md b/product-demo/SCRIPT.md index 35c4ac3..0fa0aec 100644 --- a/product-demo/SCRIPT.md +++ b/product-demo/SCRIPT.md @@ -1,55 +1,45 @@ ## THE ASK -I asked my coding agent for one small thing: give the top bar a bit more room. It changed two lines of CSS. Looks fine, right? -**[Terminal: the request, and the real two-line diff]** +I asked my coding agent to give the top bar a bit more room. Two lines of CSS. Then it runs selfie render. +**[Terminal: the request, the real two-line diff, and the command]** -So the agent runs selfie review. That renders every story in our Storybook, 124 of them, in a pinned container, right here on this MacBook Air. Twenty-five seconds, with no cloud and no bill per image. -**[Terminal: the real render log, ending on its real timings]** - -What comes back is one JSON document and an exit code, so any agent can read it. Exit 1, because that two-line change touched all 124 stories. -**[Terminal: the real JSON, trimmed, and the exit code]** +That renders all 142 stories in a pinned container, right here on this MacBook Air, in under 30 seconds, with no cloud and no bill per image. +**[Terminal: the real render log and its timings]** ## THE REVIEW -Now it’s my turn. The selfie ui command opens the same review for a person: 124 changed, and nothing decided yet. -**[Selfie UI: the batch, its counts]** +Now it’s my turn. The selfie ui command shows me what changed: those two lines touched every story. But Selfie has already found the changes repeated across them. I look through them, accept them, and 63 of the 142 are done. +**[Selfie UI: the batch and its Repeated changes. Look through the first, and accept the two biggest]** -That’s a lot to look at, but Selfie works out what kind of change each one is. 48 of them only moved or gained spacing, with nothing new in the image. -**[Show filter: Moved and spacing only, 48 of 124]** +But what about dark mode? I search for dark, and there it is: 85,000 changed pixels. Press F, and the images swap in place. The top bar went white. +**[Search for dark. The dark story, its numbers, and a flip between golden and current]** -Here’s one. Yellow is spacing that grew. Press F, and the two images flip in place, so you can see exactly what moved. -**[A spacing-only story. Stack it, and flip between golden and current]** +## ASKING MUSE SPARK -That looks right, so I approve those 48 together. -**[The bulk dialog, listing what it will approve]** +Selfie can tell me exactly which pixels changed, but not why. The commit is on GitHub, so I open the same story in the cloud, and ask Muse Spark what caused it. +**[The real GitHub status, the hosted story, and the question being asked]** -But what about dark mode? I search for dark, and there it is: 85,000 changed pixels. The agent hard-coded a light color, and the top bar went white. -**[Search for dark. The dark story, its numbers, and the white bar]** +It reads the before, the after, the diff, and the code, and it finds the line. Then it spots what I never asked for: a fixed light color, where the theme’s color used to be. It even tells me to check dark mode. +**[Muse Spark's real answer arriving, with the code it says it read]** ## THE LOOP -I don’t have to describe where. I click the change, write what’s wrong, and send it to the agent, which has been waiting. +So back in my review, I click the change, write a note, and send it to the agent, which has been waiting. **[Click the hunk, type the note, press Send to agent]** -The agent gets my words, the story, the exact box, and a picture of what I saw. -**[Terminal: the real note it received, beside the real image with the box drawn on it]** +It gets my words, the exact box, and a picture of what I saw. +**[Terminal: the real note it received, beside the image with the box on it]** It puts the theme’s color back, renders again, and answers my note. **[Terminal: the real fix, render, and reply]** -Selfie tells me there’s a newer batch, and the reply is right there on the story. The bar is dark again, and 85,000 changed pixels are down to 13. -**[The newer batch banner, the reply, the white and fixed images, and the new number]** - -I resolve the note, and approve the rest. The 48 I already approved are simply unchanged now, because an approval follows your Git history. -**[Resolve, Approve all, and the batch with nothing blocking and 48 unchanged]** - -The agent commits and reviews once more. It’s the exact same build, so nothing renders. A third of a second, and exit 0. -**[Terminal: the real commit and final review, reusing the images]** +The bar is dark again, and 85,000 changed pixels are down to 13. +**[The reply on the story, the white and fixed images, and the new number]** -## THE CLOUD +I approve the rest, and the agent commits and reviews once more. It’s the exact same build, so nothing renders. Under half a second, and exit 0. +**[Approve all, then the terminal: the real commit and final review, reusing the images]** -Push it, and Selfie renders in CI and puts a status on the commit. Click through, and it’s the same review, in the cloud. -**[The real GitHub commit list, its selfie status, and the hosted review]** +## THE END -Selfie works with any coding agent. If you have a Storybook, start locally today at selfie.dev, and join the waitlist for the cloud. +Selfie works with any coding agent. If you have a Storybook, you can start locally today, and the link’s in the description. **[End card]** diff --git a/product-demo/assets/narration-timing.json b/product-demo/assets/narration-timing.json index 23a21eb..d28a410 100644 --- a/product-demo/assets/narration-timing.json +++ b/product-demo/assets/narration-timing.json @@ -2,9 +2,9 @@ "language_code": null, "segments": [ { - "text": "I asked my coding agent for one small thing: give the top bar a bit more room. It changed two lines of CSS. Looks fine, right? So the agent runs Selfie review. That renders every story in our storybook, 124 of them, in a pinned container right here on this MacBook Air. 25 seconds with no cloud and no bill per image. What comes back is one JSON document and an exit code, so any agent can read it. Exit one, because that two-line change touched all 124 stories. Now it's my turn. The Selfie UI command opens the same review for a person. 124 changed and nothing decided yet. That's a lot to look at, but Selfie works out what kind of change each one is. 48 of them only moved or gained spacing with nothing new in the image. Here's one. Yellow is spacing that grew. Press F and the two images flip in place so you can see exactly what moved. That looks right, so I approve those 48 together. But what about dark mode? I search for dark, and there it is, 85,000 changed pixels. The agent hardcoded a light color, and the top bar went white. I don't have to describe where. I click the change, write what's wrong, and send it to the agent, which has been waiting. The agent gets my words, the story, the exact box, and a picture of what I saw. It puts the theme's color back, renders again, and answers my note. Selfie tells me there's a newer batch, and the reply is right there on the story. The bar is dark again, and 85,000 changed pixels are down to 13. I resolve the note and approve the rest. The 48 I already approved are simply unchanged now, because an approval follows your Git history. The agent commits and reviews once more. It's the exact same build, so nothing renders. A third of a second and exit zero. Push it, and Selfie renders in CI and puts a status on the commit. Click through, and it's the same review in the cloud. Selfie works with any coding agent. If you have a storybook, start locally today at selfie.dev and join the waitlist for the cloud.", - "start_time": 0.22, - "end_time": 133.36, + "text": "I asked my coding agent to give the top bar a bit more room. Two lines of CSS. Then it runs Selfie render. That renders all 142 stories in a pinned container right here on this MacBook Air in under 30 seconds with no cloud and no bill per image. Now it's my turn. The Selfie UI command shows me what changed. Those two lines touched every story, but Selfie has already found the changes repeated across them. I look through them, accept them, and 63 of the 142 are done. But what about dark mode? I search for dark, and there it is, 85,000 changed pixels. Press F and the images swap in place. The top bar went white. Selfie can tell me exactly which pixels changed, but not why. The commit is on GitHub, so I open the same story in the cloud and ask Muse Spark what caused it. It reads the before, the after, the diff, and the code, and it finds the line. Then it spots what I never asked for, a fixed light color where the theme's color used to be. It even tells me to check dark mode. So, back in my review, I click the change, write a note, and send it to the agent, which has been waiting. It gets my words, the exact box, and a picture of what I saw. It puts the theme's color back, renders again, and answers my note. The bar is dark again, and 85,000 changed pixels are down to 13. I approve the rest, and the agent commits and reviews once more. It's the exact same build, so nothing renders. Under half a second and exit zero. Selfie works with any coding agent. If you have a storybook, you can start locally today, and the link's in the description.", + "start_time": 0.16, + "end_time": 105.96, "speaker": { "id": "speaker_0", "name": "Speaker 0" @@ -12,3758 +12,3048 @@ "words": [ { "text": "I", - "start_time": 0.22, - "end_time": 0.28 + "start_time": 0.16, + "end_time": 0.2 }, { "text": " ", - "start_time": 0.28, - "end_time": 0.34 + "start_time": 0.2, + "end_time": 0.26 }, { "text": "asked", - "start_time": 0.34, - "end_time": 0.54 + "start_time": 0.26, + "end_time": 0.46 }, { "text": " ", - "start_time": 0.54, - "end_time": 0.58 + "start_time": 0.46, + "end_time": 0.5 }, { "text": "my", - "start_time": 0.58, - "end_time": 0.74 + "start_time": 0.5, + "end_time": 0.66 }, { "text": " ", - "start_time": 0.74, - "end_time": 0.8 + "start_time": 0.66, + "end_time": 0.72 }, { "text": "coding", - "start_time": 0.8, - "end_time": 1.1 + "start_time": 0.72, + "end_time": 1.04 }, { "text": " ", - "start_time": 1.1, - "end_time": 1.16 + "start_time": 1.04, + "end_time": 1.1 }, { "text": "agent", - "start_time": 1.16, - "end_time": 1.44 + "start_time": 1.12, + "end_time": 1.4 }, { "text": " ", - "start_time": 1.44, - "end_time": 1.48 + "start_time": 1.4, + "end_time": 1.44 }, { - "text": "for", - "start_time": 1.48, - "end_time": 1.56 + "text": "to", + "start_time": 1.44, + "end_time": 1.52 }, { "text": " ", - "start_time": 1.56, - "end_time": 1.72 + "start_time": 1.52, + "end_time": 1.54 }, { - "text": "one", - "start_time": 1.72, - "end_time": 1.9 + "text": "give", + "start_time": 1.54, + "end_time": 1.66 }, { "text": " ", - "start_time": 1.9, - "end_time": 2.04 + "start_time": 1.66, + "end_time": 1.7 }, { - "text": "small", - "start_time": 2.1, - "end_time": 2.32 + "text": "the", + "start_time": 1.7, + "end_time": 1.82 }, { "text": " ", - "start_time": 2.32, - "end_time": 2.5 + "start_time": 1.82, + "end_time": 1.88 }, { - "text": "thing:", - "start_time": 2.5, - "end_time": 2.78 + "text": "top", + "start_time": 1.88, + "end_time": 2.16 }, { "text": " ", - "start_time": 2.78, - "end_time": 2.78 + "start_time": 2.16, + "end_time": 2.2 }, { - "text": "give", - "start_time": 3.22, - "end_time": 3.34 + "text": "bar", + "start_time": 2.2, + "end_time": 2.38 }, { "text": " ", - "start_time": 3.34, - "end_time": 3.4 + "start_time": 2.38, + "end_time": 2.44 }, { - "text": "the", - "start_time": 3.4, - "end_time": 3.52 + "text": "a", + "start_time": 2.44, + "end_time": 2.48 }, { "text": " ", - "start_time": 3.52, - "end_time": 3.6 + "start_time": 2.48, + "end_time": 2.64 }, { - "text": "top", - "start_time": 3.6, - "end_time": 3.88 + "text": "bit", + "start_time": 2.64, + "end_time": 2.8 }, { "text": " ", - "start_time": 3.88, - "end_time": 3.92 + "start_time": 2.8, + "end_time": 2.84 }, { - "text": "bar", - "start_time": 3.92, - "end_time": 4.12 + "text": "more", + "start_time": 2.84, + "end_time": 3.0 }, { "text": " ", - "start_time": 4.12, - "end_time": 4.18 + "start_time": 3.0, + "end_time": 3.12 }, { - "text": "a", - "start_time": 4.18, - "end_time": 4.2 + "text": "room.", + "start_time": 3.12, + "end_time": 3.42 }, { "text": " ", - "start_time": 4.2, - "end_time": 4.38 + "start_time": 3.42, + "end_time": 3.42 }, { - "text": "bit", - "start_time": 4.38, - "end_time": 4.54 + "text": "Two", + "start_time": 3.86, + "end_time": 3.98 }, { "text": " ", - "start_time": 4.54, - "end_time": 4.6 + "start_time": 3.98, + "end_time": 4.059 }, { - "text": "more", - "start_time": 4.6, - "end_time": 4.76 + "text": "lines", + "start_time": 4.059, + "end_time": 4.36 }, { "text": " ", - "start_time": 4.76, - "end_time": 4.88 + "start_time": 4.36, + "end_time": 4.4 }, { - "text": "room.", - "start_time": 4.88, - "end_time": 5.18 + "text": "of", + "start_time": 4.4, + "end_time": 4.5 }, { "text": " ", - "start_time": 5.18, - "end_time": 5.18 + "start_time": 4.5, + "end_time": 4.56 }, { - "text": "It", - "start_time": 5.7, - "end_time": 5.78 + "text": "CSS.", + "start_time": 4.56, + "end_time": 5.16 }, { "text": " ", - "start_time": 5.78, - "end_time": 5.84 + "start_time": 5.16, + "end_time": 5.64 }, { - "text": "changed", - "start_time": 5.84, - "end_time": 6.18 + "text": "Then", + "start_time": 5.64, + "end_time": 5.76 }, { "text": " ", - "start_time": 6.18, - "end_time": 6.24 + "start_time": 5.76, + "end_time": 5.8 }, { - "text": "two", - "start_time": 6.24, - "end_time": 6.34 + "text": "it", + "start_time": 5.8, + "end_time": 5.9 }, { "text": " ", - "start_time": 6.34, - "end_time": 6.44 + "start_time": 5.9, + "end_time": 5.96 }, { - "text": "lines", - "start_time": 6.44, - "end_time": 6.72 + "text": "runs", + "start_time": 5.96, + "end_time": 6.26 }, { "text": " ", - "start_time": 6.72, - "end_time": 6.76 + "start_time": 6.26, + "end_time": 6.56 }, { - "text": "of", - "start_time": 6.76, + "text": "Selfie", + "start_time": 6.56, "end_time": 6.86 }, { "text": " ", "start_time": 6.86, - "end_time": 6.9 + "end_time": 6.94 }, { - "text": "CSS.", - "start_time": 6.9, - "end_time": 7.54 + "text": "render.", + "start_time": 6.94, + "end_time": 7.26 }, { "text": " ", - "start_time": 7.54, - "end_time": 7.54 + "start_time": 7.26, + "end_time": 7.26 }, { - "text": "Looks", - "start_time": 8.1, - "end_time": 8.28 + "text": "That", + "start_time": 7.82, + "end_time": 8.02 }, { "text": " ", - "start_time": 8.28, - "end_time": 8.38 + "start_time": 8.02, + "end_time": 8.06 }, { - "text": "fine,", - "start_time": 8.38, - "end_time": 8.68 + "text": "renders", + "start_time": 8.06, + "end_time": 8.48 }, { "text": " ", - "start_time": 8.68, - "end_time": 8.78 + "start_time": 8.48, + "end_time": 8.58 }, { - "text": "right?", - "start_time": 8.78, - "end_time": 9.0 + "text": "all", + "start_time": 8.58, + "end_time": 8.8 }, { "text": " ", - "start_time": 9.0, - "end_time": 9.0 + "start_time": 8.8, + "end_time": 9.04 }, { - "text": "So", - "start_time": 9.56, - "end_time": 9.66 + "text": "142", + "start_time": 9.04, + "end_time": 9.9 }, { "text": " ", - "start_time": 9.66, - "end_time": 9.72 + "start_time": 9.9, + "end_time": 9.98 }, { - "text": "the", - "start_time": 9.72, - "end_time": 9.8 + "text": "stories", + "start_time": 9.98, + "end_time": 10.42 }, { "text": " ", - "start_time": 9.8, - "end_time": 9.86 + "start_time": 10.42, + "end_time": 10.46 }, { - "text": "agent", - "start_time": 9.86, - "end_time": 10.2 + "text": "in", + "start_time": 10.46, + "end_time": 10.54 }, { "text": " ", - "start_time": 10.2, - "end_time": 10.26 + "start_time": 10.54, + "end_time": 10.58 }, { - "text": "runs", - "start_time": 10.26, - "end_time": 10.54 + "text": "a", + "start_time": 10.58, + "end_time": 10.7 }, { "text": " ", - "start_time": 10.54, - "end_time": 10.78 + "start_time": 10.7, + "end_time": 10.76 }, { - "text": "Selfie", - "start_time": 10.78, - "end_time": 11.1 + "text": "pinned", + "start_time": 10.76, + "end_time": 11.06 }, { "text": " ", - "start_time": 11.1, - "end_time": 11.2 + "start_time": 11.06, + "end_time": 11.1 }, { - "text": "review.", - "start_time": 11.2, + "text": "container", + "start_time": 11.1, "end_time": 11.56 }, { "text": " ", "start_time": 11.56, - "end_time": 11.56 + "end_time": 11.94 }, { - "text": "That", - "start_time": 12.06, - "end_time": 12.24 + "text": "right", + "start_time": 11.94, + "end_time": 12.14 }, { "text": " ", - "start_time": 12.24, - "end_time": 12.28 + "start_time": 12.14, + "end_time": 12.18 }, { - "text": "renders", - "start_time": 12.28, - "end_time": 12.7 + "text": "here", + "start_time": 12.18, + "end_time": 12.38 }, { "text": " ", - "start_time": 12.7, - "end_time": 12.76 + "start_time": 12.38, + "end_time": 12.44 }, { - "text": "every", - "start_time": 12.76, - "end_time": 13.0 + "text": "on", + "start_time": 12.44, + "end_time": 12.52 }, { "text": " ", - "start_time": 13.0, - "end_time": 13.14 + "start_time": 12.52, + "end_time": 12.56 }, { - "text": "story", - "start_time": 13.14, - "end_time": 13.46 + "text": "this", + "start_time": 12.56, + "end_time": 12.74 }, { "text": " ", - "start_time": 13.46, - "end_time": 13.5 + "start_time": 12.74, + "end_time": 12.78 }, { - "text": "in", - "start_time": 13.5, - "end_time": 13.58 + "text": "MacBook", + "start_time": 12.78, + "end_time": 13.18 }, { "text": " ", - "start_time": 13.58, - "end_time": 13.62 + "start_time": 13.18, + "end_time": 13.28 }, { - "text": "our", - "start_time": 13.62, - "end_time": 13.76 + "text": "Air", + "start_time": 13.28, + "end_time": 13.46 }, { "text": " ", - "start_time": 13.76, - "end_time": 13.84 + "start_time": 13.46, + "end_time": 13.74 }, { - "text": "storybook,", - "start_time": 13.84, - "end_time": 14.38 + "text": "in", + "start_time": 13.74, + "end_time": 13.86 }, { "text": " ", - "start_time": 14.38, - "end_time": 14.8 + "start_time": 13.86, + "end_time": 13.92 }, { - "text": "124", - "start_time": 14.86, - "end_time": 15.8 + "text": "under", + "start_time": 13.92, + "end_time": 14.12 }, { "text": " ", - "start_time": 15.8, - "end_time": 15.84 + "start_time": 14.12, + "end_time": 14.32 }, { - "text": "of", - "start_time": 15.84, - "end_time": 15.94 + "text": "30", + "start_time": 14.32, + "end_time": 14.58 }, { "text": " ", - "start_time": 15.94, - "end_time": 15.98 + "start_time": 14.58, + "end_time": 14.7 }, { - "text": "them,", - "start_time": 15.98, - "end_time": 16.1 + "text": "seconds", + "start_time": 14.7, + "end_time": 15.1 }, { "text": " ", - "start_time": 16.1, - "end_time": 16.379 + "start_time": 15.1, + "end_time": 15.36 }, { - "text": "in", - "start_time": 16.379, - "end_time": 16.44 + "text": "with", + "start_time": 15.36, + "end_time": 15.52 }, { "text": " ", - "start_time": 16.44, - "end_time": 16.5 + "start_time": 15.52, + "end_time": 15.58 }, { - "text": "a", - "start_time": 16.5, - "end_time": 16.62 + "text": "no", + "start_time": 15.58, + "end_time": 15.78 }, { "text": " ", - "start_time": 16.62, - "end_time": 16.66 + "start_time": 15.78, + "end_time": 15.82 }, { - "text": "pinned", - "start_time": 16.66, - "end_time": 16.9 + "text": "cloud", + "start_time": 15.82, + "end_time": 16.2 }, { "text": " ", - "start_time": 16.9, - "end_time": 16.98 + "start_time": 16.2, + "end_time": 16.4 }, { - "text": "container", - "start_time": 16.98, - "end_time": 17.48 + "text": "and", + "start_time": 16.4, + "end_time": 16.58 }, { "text": " ", - "start_time": 17.48, - "end_time": 17.8 + "start_time": 16.58, + "end_time": 16.64 }, { - "text": "right", - "start_time": 17.8, - "end_time": 18.0 + "text": "no", + "start_time": 16.64, + "end_time": 16.8 }, { "text": " ", - "start_time": 18.0, - "end_time": 18.04 + "start_time": 16.8, + "end_time": 16.92 }, { - "text": "here", - "start_time": 18.04, - "end_time": 18.28 + "text": "bill", + "start_time": 16.92, + "end_time": 17.16 }, { "text": " ", - "start_time": 18.28, - "end_time": 18.34 + "start_time": 17.16, + "end_time": 17.2 }, { - "text": "on", - "start_time": 18.34, - "end_time": 18.42 + "text": "per", + "start_time": 17.2, + "end_time": 17.32 }, { "text": " ", - "start_time": 18.42, - "end_time": 18.46 + "start_time": 17.32, + "end_time": 17.4 }, { - "text": "this", - "start_time": 18.46, - "end_time": 18.62 + "text": "image.", + "start_time": 17.4, + "end_time": 17.72 }, { "text": " ", - "start_time": 18.62, - "end_time": 18.68 + "start_time": 17.72, + "end_time": 17.72 }, { - "text": "MacBook", - "start_time": 18.68, - "end_time": 19.04 + "text": "Now", + "start_time": 18.36, + "end_time": 18.52 }, { "text": " ", - "start_time": 19.04, - "end_time": 19.12 + "start_time": 18.52, + "end_time": 18.56 }, { - "text": "Air.", - "start_time": 19.12, - "end_time": 19.32 + "text": "it's", + "start_time": 18.56, + "end_time": 18.68 }, { "text": " ", - "start_time": 19.32, - "end_time": 19.88 + "start_time": 18.68, + "end_time": 18.72 }, { - "text": "25", - "start_time": 19.88, - "end_time": 20.34 + "text": "my", + "start_time": 18.72, + "end_time": 18.92 }, { "text": " ", - "start_time": 20.34, - "end_time": 20.4 + "start_time": 18.92, + "end_time": 18.96 }, { - "text": "seconds", - "start_time": 20.4, - "end_time": 20.82 + "text": "turn.", + "start_time": 18.96, + "end_time": 19.22 }, { "text": " ", - "start_time": 20.82, - "end_time": 20.98 + "start_time": 19.22, + "end_time": 19.7 }, { - "text": "with", - "start_time": 20.98, - "end_time": 21.12 + "text": "The", + "start_time": 19.7, + "end_time": 19.8 }, { "text": " ", - "start_time": 21.12, - "end_time": 21.18 + "start_time": 19.8, + "end_time": 19.84 }, { - "text": "no", - "start_time": 21.2, - "end_time": 21.38 + "text": "Selfie", + "start_time": 19.84, + "end_time": 20.18 }, { "text": " ", - "start_time": 21.38, - "end_time": 21.42 + "start_time": 20.18, + "end_time": 20.36 }, { - "text": "cloud", - "start_time": 21.42, - "end_time": 21.8 + "text": "UI", + "start_time": 20.36, + "end_time": 20.6 }, { "text": " ", - "start_time": 21.8, - "end_time": 21.96 + "start_time": 20.6, + "end_time": 20.68 }, { - "text": "and", - "start_time": 21.96, - "end_time": 22.08 + "text": "command", + "start_time": 20.68, + "end_time": 21.12 }, { "text": " ", - "start_time": 22.08, - "end_time": 22.2 + "start_time": 21.12, + "end_time": 21.16 }, { - "text": "no", - "start_time": 22.2, - "end_time": 22.34 + "text": "shows", + "start_time": 21.16, + "end_time": 21.42 }, { "text": " ", - "start_time": 22.34, - "end_time": 22.46 + "start_time": 21.42, + "end_time": 21.46 }, { - "text": "bill", - "start_time": 22.46, - "end_time": 22.74 + "text": "me", + "start_time": 21.46, + "end_time": 21.56 }, { "text": " ", - "start_time": 22.74, - "end_time": 22.78 + "start_time": 21.56, + "end_time": 21.6 }, { - "text": "per", - "start_time": 22.78, - "end_time": 22.9 + "text": "what", + "start_time": 21.6, + "end_time": 21.76 }, { "text": " ", - "start_time": 22.9, - "end_time": 22.98 + "start_time": 21.76, + "end_time": 21.82 }, { - "text": "image.", - "start_time": 22.98, - "end_time": 23.3 + "text": "changed.", + "start_time": 21.82, + "end_time": 22.3 }, { "text": " ", - "start_time": 23.3, - "end_time": 23.76 + "start_time": 22.3, + "end_time": 22.3 }, { - "text": "What", - "start_time": 23.76, - "end_time": 23.9 + "text": "Those", + "start_time": 22.74, + "end_time": 23.02 }, { "text": " ", - "start_time": 23.9, - "end_time": 23.94 + "start_time": 23.02, + "end_time": 23.08 }, { - "text": "comes", - "start_time": 23.94, - "end_time": 24.2 + "text": "two", + "start_time": 23.08, + "end_time": 23.22 }, { "text": " ", - "start_time": 24.2, - "end_time": 24.24 + "start_time": 23.22, + "end_time": 23.34 }, { - "text": "back", - "start_time": 24.24, - "end_time": 24.52 + "text": "lines", + "start_time": 23.34, + "end_time": 23.76 }, { "text": " ", - "start_time": 24.52, - "end_time": 24.58 + "start_time": 23.76, + "end_time": 23.82 }, { - "text": "is", - "start_time": 24.58, - "end_time": 24.74 + "text": "touched", + "start_time": 23.82, + "end_time": 24.2 }, { "text": " ", - "start_time": 24.74, - "end_time": 24.8 + "start_time": 24.2, + "end_time": 24.28 }, { - "text": "one", - "start_time": 24.8, - "end_time": 25.04 + "text": "every", + "start_time": 24.28, + "end_time": 24.54 }, { "text": " ", - "start_time": 25.04, - "end_time": 25.08 + "start_time": 24.54, + "end_time": 24.68 }, { - "text": "JSON", - "start_time": 25.08, - "end_time": 25.5 + "text": "story,", + "start_time": 24.68, + "end_time": 25.06 }, { "text": " ", - "start_time": 25.5, - "end_time": 25.58 + "start_time": 25.06, + "end_time": 25.52 }, { - "text": "document", - "start_time": 25.58, - "end_time": 26.12 + "text": "but", + "start_time": 25.52, + "end_time": 25.66 }, { "text": " ", - "start_time": 26.12, - "end_time": 26.14 + "start_time": 25.66, + "end_time": 25.72 }, { - "text": "and", - "start_time": 26.14, - "end_time": 26.24 + "text": "Selfie", + "start_time": 25.72, + "end_time": 26.06 }, { "text": " ", - "start_time": 26.24, - "end_time": 26.28 + "start_time": 26.06, + "end_time": 26.1 }, { - "text": "an", - "start_time": 26.28, - "end_time": 26.34 + "text": "has", + "start_time": 26.1, + "end_time": 26.24 }, { "text": " ", - "start_time": 26.34, - "end_time": 26.4 + "start_time": 26.24, + "end_time": 26.3 }, { - "text": "exit", - "start_time": 26.4, + "text": "already", + "start_time": 26.3, "end_time": 26.66 }, { "text": " ", "start_time": 26.66, - "end_time": 26.74 + "end_time": 26.7 }, { - "text": "code,", - "start_time": 26.74, - "end_time": 27.02 + "text": "found", + "start_time": 26.7, + "end_time": 26.92 }, { "text": " ", - "start_time": 27.02, - "end_time": 27.3 + "start_time": 26.92, + "end_time": 26.96 }, { - "text": "so", - "start_time": 27.3, - "end_time": 27.46 + "text": "the", + "start_time": 26.96, + "end_time": 27.06 }, { "text": " ", - "start_time": 27.46, - "end_time": 27.54 + "start_time": 27.06, + "end_time": 27.1 }, { - "text": "any", - "start_time": 27.54, - "end_time": 27.72 + "text": "changes", + "start_time": 27.1, + "end_time": 27.48 }, { "text": " ", - "start_time": 27.72, - "end_time": 27.78 + "start_time": 27.48, + "end_time": 27.54 }, { - "text": "agent", - "start_time": 27.78, - "end_time": 28.06 + "text": "repeated", + "start_time": 27.54, + "end_time": 27.96 }, { "text": " ", - "start_time": 28.06, - "end_time": 28.08 + "start_time": 27.96, + "end_time": 28.0 }, { - "text": "can", - "start_time": 28.08, - "end_time": 28.22 + "text": "across", + "start_time": 28.0, + "end_time": 28.38 }, { "text": " ", - "start_time": 28.22, - "end_time": 28.28 + "start_time": 28.38, + "end_time": 28.42 }, { - "text": "read", - "start_time": 28.28, - "end_time": 28.44 + "text": "them.", + "start_time": 28.42, + "end_time": 28.58 }, { "text": " ", - "start_time": 28.44, - "end_time": 28.48 + "start_time": 28.58, + "end_time": 29.1 }, { - "text": "it.", - "start_time": 28.48, - "end_time": 28.6 + "text": "I", + "start_time": 29.1, + "end_time": 29.14 }, { "text": " ", - "start_time": 28.6, - "end_time": 29.08 + "start_time": 29.14, + "end_time": 29.18 }, { - "text": "Exit", - "start_time": 29.08, + "text": "look", + "start_time": 29.18, "end_time": 29.36 }, { "text": " ", "start_time": 29.36, - "end_time": 29.54 + "end_time": 29.38 }, { - "text": "one,", - "start_time": 29.54, - "end_time": 29.82 + "text": "through", + "start_time": 29.38, + "end_time": 29.58 }, { "text": " ", - "start_time": 29.82, - "end_time": 30.06 + "start_time": 29.58, + "end_time": 29.62 }, { - "text": "because", - "start_time": 30.06, - "end_time": 30.3 + "text": "them,", + "start_time": 29.62, + "end_time": 29.74 }, { "text": " ", - "start_time": 30.3, - "end_time": 30.36 + "start_time": 29.74, + "end_time": 30.04 }, { - "text": "that", - "start_time": 30.36, - "end_time": 30.54 + "text": "accept", + "start_time": 30.04, + "end_time": 30.4 }, { "text": " ", - "start_time": 30.54, - "end_time": 30.6 + "start_time": 30.4, + "end_time": 30.44 }, { - "text": "two-line", - "start_time": 30.6, - "end_time": 31.04 + "text": "them,", + "start_time": 30.44, + "end_time": 30.58 }, { "text": " ", - "start_time": 31.04, - "end_time": 31.16 + "start_time": 30.58, + "end_time": 30.96 }, { - "text": "change", - "start_time": 31.16, - "end_time": 31.54 + "text": "and", + "start_time": 30.96, + "end_time": 31.14 }, { "text": " ", - "start_time": 31.54, - "end_time": 31.66 + "start_time": 31.14, + "end_time": 31.4 }, { - "text": "touched", - "start_time": 31.66, - "end_time": 32.0 + "text": "63", + "start_time": 31.4, + "end_time": 31.88 }, { "text": " ", - "start_time": 32.0, - "end_time": 32.1 + "start_time": 31.88, + "end_time": 31.92 }, { - "text": "all", - "start_time": 32.1, - "end_time": 32.36 + "text": "of", + "start_time": 31.92, + "end_time": 32.0 }, { "text": " ", - "start_time": 32.36, - "end_time": 32.6 + "start_time": 32.0, + "end_time": 32.04 }, { - "text": "124", - "start_time": 32.6, - "end_time": 33.54 + "text": "the", + "start_time": 32.04, + "end_time": 32.08 }, { "text": " ", - "start_time": 33.54, - "end_time": 33.62 + "start_time": 32.08, + "end_time": 32.32 }, { - "text": "stories.", - "start_time": 33.62, - "end_time": 34.1 + "text": "142", + "start_time": 32.32, + "end_time": 33.28 }, { "text": " ", - "start_time": 34.1, - "end_time": 34.1 + "start_time": 33.28, + "end_time": 33.32 }, { - "text": "Now", - "start_time": 34.62, - "end_time": 34.78 + "text": "are", + "start_time": 33.32, + "end_time": 33.48 }, { "text": " ", - "start_time": 34.78, - "end_time": 34.82 + "start_time": 33.48, + "end_time": 33.52 }, { - "text": "it's", - "start_time": 34.82, - "end_time": 34.96 + "text": "done.", + "start_time": 33.52, + "end_time": 33.8 }, { "text": " ", - "start_time": 34.96, - "end_time": 35.02 + "start_time": 33.8, + "end_time": 34.32 }, { - "text": "my", - "start_time": 35.02, - "end_time": 35.2 + "text": "But", + "start_time": 34.32, + "end_time": 34.6 }, { "text": " ", - "start_time": 35.2, - "end_time": 35.26 + "start_time": 34.6, + "end_time": 34.62 }, { - "text": "turn.", - "start_time": 35.26, - "end_time": 35.52 + "text": "what", + "start_time": 34.62, + "end_time": 34.72 }, { "text": " ", - "start_time": 35.52, - "end_time": 35.96 + "start_time": 34.72, + "end_time": 34.78 }, { - "text": "The", - "start_time": 35.96, - "end_time": 36.06 + "text": "about", + "start_time": 34.78, + "end_time": 35.04 }, { "text": " ", - "start_time": 36.06, - "end_time": 36.12 + "start_time": 35.04, + "end_time": 35.08 }, { - "text": "Selfie", - "start_time": 36.12, - "end_time": 36.46 + "text": "dark", + "start_time": 35.08, + "end_time": 35.36 }, { "text": " ", - "start_time": 36.46, - "end_time": 36.58 + "start_time": 35.36, + "end_time": 35.4 }, { - "text": "UI", - "start_time": 36.58, - "end_time": 36.88 + "text": "mode?", + "start_time": 35.4, + "end_time": 35.68 }, { "text": " ", - "start_time": 36.88, - "end_time": 36.98 + "start_time": 35.68, + "end_time": 36.18 }, { - "text": "command", - "start_time": 36.98, - "end_time": 37.34 + "text": "I", + "start_time": 36.18, + "end_time": 36.24 }, { "text": " ", - "start_time": 37.34, - "end_time": 37.5 + "start_time": 36.24, + "end_time": 36.3 }, { - "text": "opens", - "start_time": 37.5, - "end_time": 37.82 + "text": "search", + "start_time": 36.3, + "end_time": 36.54 }, { "text": " ", - "start_time": 37.82, - "end_time": 37.86 + "start_time": 36.54, + "end_time": 36.56 }, { - "text": "the", - "start_time": 37.86, - "end_time": 37.98 + "text": "for", + "start_time": 36.56, + "end_time": 36.64 }, { "text": " ", - "start_time": 37.98, - "end_time": 38.06 + "start_time": 36.64, + "end_time": 36.74 }, { - "text": "same", - "start_time": 38.06, - "end_time": 38.28 + "text": "dark,", + "start_time": 36.74, + "end_time": 37.06 }, { "text": " ", - "start_time": 38.28, - "end_time": 38.34 + "start_time": 37.06, + "end_time": 37.36 }, { - "text": "review", - "start_time": 38.34, - "end_time": 38.72 + "text": "and", + "start_time": 37.36, + "end_time": 37.46 }, { "text": " ", - "start_time": 38.72, - "end_time": 38.76 + "start_time": 37.46, + "end_time": 37.52 }, { - "text": "for", - "start_time": 38.76, - "end_time": 38.86 + "text": "there", + "start_time": 37.52, + "end_time": 37.64 }, { "text": " ", - "start_time": 38.86, - "end_time": 38.9 + "start_time": 37.64, + "end_time": 37.68 }, { - "text": "a", - "start_time": 38.9, - "end_time": 39.0 + "text": "it", + "start_time": 37.68, + "end_time": 37.76 }, { "text": " ", - "start_time": 39.0, - "end_time": 39.06 + "start_time": 37.76, + "end_time": 37.84 }, { - "text": "person.", - "start_time": 39.06, - "end_time": 39.48 + "text": "is,", + "start_time": 37.84, + "end_time": 38.06 }, { "text": " ", - "start_time": 39.48, - "end_time": 39.48 + "start_time": 38.06, + "end_time": 38.64 }, { - "text": "124", - "start_time": 40.12, - "end_time": 41.04 + "text": "85,000", + "start_time": 38.64, + "end_time": 39.84 }, { "text": " ", - "start_time": 41.04, - "end_time": 41.1 + "start_time": 39.84, + "end_time": 39.9 }, { "text": "changed", - "start_time": 41.1, - "end_time": 41.56 + "start_time": 39.9, + "end_time": 40.26 }, { "text": " ", - "start_time": 41.56, - "end_time": 41.76 + "start_time": 40.26, + "end_time": 40.34 }, { - "text": "and", - "start_time": 41.76, - "end_time": 41.88 + "text": "pixels.", + "start_time": 40.34, + "end_time": 40.8 }, { "text": " ", - "start_time": 41.88, - "end_time": 42.04 + "start_time": 40.8, + "end_time": 41.24 }, { - "text": "nothing", - "start_time": 42.04, - "end_time": 42.38 + "text": "Press", + "start_time": 41.24, + "end_time": 41.54 }, { "text": " ", - "start_time": 42.38, - "end_time": 42.4 + "start_time": 41.54, + "end_time": 41.72 }, { - "text": "decided", - "start_time": 42.4, - "end_time": 42.92 + "text": "F", + "start_time": 41.72, + "end_time": 41.86 }, { "text": " ", - "start_time": 42.92, - "end_time": 42.96 + "start_time": 41.86, + "end_time": 42.06 }, { - "text": "yet.", - "start_time": 42.96, - "end_time": 43.16 + "text": "and", + "start_time": 42.06, + "end_time": 42.14 }, { "text": " ", - "start_time": 43.16, - "end_time": 43.16 + "start_time": 42.14, + "end_time": 42.18 }, { - "text": "That's", - "start_time": 43.58, - "end_time": 43.8 + "text": "the", + "start_time": 42.18, + "end_time": 42.28 }, { "text": " ", - "start_time": 43.8, - "end_time": 43.88 + "start_time": 42.28, + "end_time": 42.34 }, { - "text": "a", - "start_time": 43.88, - "end_time": 43.9 + "text": "images", + "start_time": 42.34, + "end_time": 42.74 }, { "text": " ", - "start_time": 43.9, - "end_time": 43.96 + "start_time": 42.74, + "end_time": 42.82 }, { - "text": "lot", - "start_time": 43.96, - "end_time": 44.14 + "text": "swap", + "start_time": 42.82, + "end_time": 43.08 }, { "text": " ", - "start_time": 44.14, - "end_time": 44.18 + "start_time": 43.08, + "end_time": 43.12 }, { - "text": "to", - "start_time": 44.18, - "end_time": 44.26 + "text": "in", + "start_time": 43.12, + "end_time": 43.18 }, { "text": " ", - "start_time": 44.26, - "end_time": 44.32 + "start_time": 43.18, + "end_time": 43.28 }, { - "text": "look", - "start_time": 44.32, - "end_time": 44.5 + "text": "place.", + "start_time": 43.28, + "end_time": 43.64 }, { "text": " ", - "start_time": 44.5, - "end_time": 44.58 + "start_time": 43.64, + "end_time": 44.0 }, { - "text": "at,", - "start_time": 44.58, - "end_time": 44.74 + "text": "The", + "start_time": 44.0, + "end_time": 44.1 }, { "text": " ", - "start_time": 44.74, - "end_time": 45.06 + "start_time": 44.1, + "end_time": 44.14 }, { - "text": "but", - "start_time": 45.06, - "end_time": 45.2 + "text": "top", + "start_time": 44.14, + "end_time": 44.34 }, { "text": " ", - "start_time": 45.2, - "end_time": 45.26 + "start_time": 44.34, + "end_time": 44.42 }, { - "text": "Selfie", - "start_time": 45.26, - "end_time": 45.58 + "text": "bar", + "start_time": 44.42, + "end_time": 44.6 }, { "text": " ", - "start_time": 45.58, - "end_time": 45.66 + "start_time": 44.6, + "end_time": 44.7 }, { - "text": "works", - "start_time": 45.66, - "end_time": 45.9 + "text": "went", + "start_time": 44.7, + "end_time": 44.88 }, { "text": " ", - "start_time": 45.9, - "end_time": 45.98 + "start_time": 44.88, + "end_time": 44.92 }, { - "text": "out", - "start_time": 45.98, - "end_time": 46.18 + "text": "white.", + "start_time": 44.92, + "end_time": 45.2 }, { "text": " ", - "start_time": 46.18, - "end_time": 46.22 + "start_time": 45.2, + "end_time": 45.2 }, { - "text": "what", - "start_time": 46.22, - "end_time": 46.4 + "text": "Selfie", + "start_time": 45.78, + "end_time": 46.06 }, { "text": " ", - "start_time": 46.4, - "end_time": 46.46 + "start_time": 46.06, + "end_time": 46.1 }, { - "text": "kind", - "start_time": 46.46, - "end_time": 46.7 + "text": "can", + "start_time": 46.1, + "end_time": 46.22 }, { "text": " ", - "start_time": 46.7, - "end_time": 46.74 + "start_time": 46.22, + "end_time": 46.28 }, { - "text": "of", - "start_time": 46.74, - "end_time": 46.84 + "text": "tell", + "start_time": 46.28, + "end_time": 46.42 }, { "text": " ", - "start_time": 46.84, - "end_time": 46.9 + "start_time": 46.42, + "end_time": 46.44 }, { - "text": "change", - "start_time": 46.9, - "end_time": 47.22 + "text": "me", + "start_time": 46.44, + "end_time": 46.58 }, { "text": " ", - "start_time": 47.22, - "end_time": 47.26 + "start_time": 46.58, + "end_time": 46.64 }, { - "text": "each", - "start_time": 47.26, - "end_time": 47.4 + "text": "exactly", + "start_time": 46.64, + "end_time": 47.36 }, { "text": " ", - "start_time": 47.4, - "end_time": 47.48 + "start_time": 47.36, + "end_time": 47.4 }, { - "text": "one", - "start_time": 47.48, + "text": "which", + "start_time": 47.4, "end_time": 47.64 }, { "text": " ", "start_time": 47.64, - "end_time": 47.74 + "end_time": 47.68 }, { - "text": "is.", - "start_time": 47.74, - "end_time": 48.0 + "text": "pixels", + "start_time": 47.68, + "end_time": 48.12 }, { "text": " ", - "start_time": 48.0, - "end_time": 48.0 + "start_time": 48.12, + "end_time": 48.16 }, { - "text": "48", - "start_time": 48.64, - "end_time": 48.98 + "text": "changed,", + "start_time": 48.16, + "end_time": 48.6 }, { "text": " ", - "start_time": 48.98, - "end_time": 49.0 + "start_time": 48.6, + "end_time": 48.82 }, { - "text": "of", - "start_time": 49.0, - "end_time": 49.08 + "text": "but", + "start_time": 48.82, + "end_time": 48.94 }, { "text": " ", - "start_time": 49.08, - "end_time": 49.12 + "start_time": 48.94, + "end_time": 48.98 }, { - "text": "them", - "start_time": 49.12, - "end_time": 49.32 + "text": "not", + "start_time": 48.98, + "end_time": 49.24 }, { "text": " ", - "start_time": 49.32, - "end_time": 49.4 + "start_time": 49.24, + "end_time": 49.3 }, { - "text": "only", - "start_time": 49.4, + "text": "why.", + "start_time": 49.3, "end_time": 49.7 }, { "text": " ", "start_time": 49.7, - "end_time": 49.78 + "end_time": 50.16 }, { - "text": "moved", - "start_time": 49.78, - "end_time": 50.1 + "text": "The", + "start_time": 50.16, + "end_time": 50.24 }, { "text": " ", - "start_time": 50.1, - "end_time": 50.14 + "start_time": 50.24, + "end_time": 50.28 }, { - "text": "or", - "start_time": 50.14, - "end_time": 50.2 + "text": "commit", + "start_time": 50.28, + "end_time": 50.54 }, { "text": " ", - "start_time": 50.2, - "end_time": 50.32 - }, - { - "text": "gained", - "start_time": 50.32, + "start_time": 50.54, "end_time": 50.6 }, { - "text": " ", + "text": "is", "start_time": 50.6, - "end_time": 50.7 - }, - { - "text": "spacing", - "start_time": 50.7, - "end_time": 51.12 + "end_time": 50.68 }, { "text": " ", - "start_time": 51.12, - "end_time": 51.28 + "start_time": 50.68, + "end_time": 50.74 }, { - "text": "with", - "start_time": 51.3, - "end_time": 51.44 + "text": "on", + "start_time": 50.74, + "end_time": 50.9 }, { "text": " ", - "start_time": 51.44, - "end_time": 51.5 + "start_time": 50.9, + "end_time": 50.92 }, { - "text": "nothing", - "start_time": 51.5, - "end_time": 51.76 + "text": "GitHub,", + "start_time": 50.92, + "end_time": 51.36 }, { "text": " ", - "start_time": 51.76, - "end_time": 51.86 + "start_time": 51.36, + "end_time": 51.64 }, { - "text": "new", - "start_time": 51.86, - "end_time": 52.02 + "text": "so", + "start_time": 51.64, + "end_time": 51.84 }, { "text": " ", - "start_time": 52.02, - "end_time": 52.06 + "start_time": 51.84, + "end_time": 51.94 }, { - "text": "in", - "start_time": 52.06, - "end_time": 52.12 + "text": "I", + "start_time": 51.96, + "end_time": 51.98 }, { "text": " ", - "start_time": 52.12, - "end_time": 52.16 + "start_time": 51.98, + "end_time": 52.04 }, { - "text": "the", - "start_time": 52.16, + "text": "open", + "start_time": 52.04, "end_time": 52.24 }, { "text": " ", "start_time": 52.24, - "end_time": 52.3 - }, - { - "text": "image.", - "start_time": 52.3, - "end_time": 52.6 - }, - { - "text": " ", - "start_time": 52.6, - "end_time": 53.0 - }, - { - "text": "Here's", - "start_time": 53.02, - "end_time": 53.22 - }, - { - "text": " ", - "start_time": 53.22, - "end_time": 53.3 - }, - { - "text": "one.", - "start_time": 53.3, - "end_time": 53.44 - }, - { - "text": " ", - "start_time": 53.44, - "end_time": 53.94 - }, - { - "text": "Yellow", - "start_time": 53.94, - "end_time": 54.34 - }, - { - "text": " ", - "start_time": 54.34, - "end_time": 54.4 - }, - { - "text": "is", - "start_time": 54.4, - "end_time": 54.52 - }, - { - "text": " ", - "start_time": 54.52, - "end_time": 54.62 - }, - { - "text": "spacing", - "start_time": 54.62, - "end_time": 55.02 - }, - { - "text": " ", - "start_time": 55.02, - "end_time": 55.06 - }, - { - "text": "that", - "start_time": 55.06, - "end_time": 55.2 - }, - { - "text": " ", - "start_time": 55.2, - "end_time": 55.24 - }, - { - "text": "grew.", - "start_time": 55.24, - "end_time": 55.56 - }, - { - "text": " ", - "start_time": 55.56, - "end_time": 55.96 - }, - { - "text": "Press", - "start_time": 55.96, - "end_time": 56.2 - }, - { - "text": " ", - "start_time": 56.2, - "end_time": 56.48 - }, - { - "text": "F", - "start_time": 56.48, - "end_time": 56.64 - }, - { - "text": " ", - "start_time": 56.64, - "end_time": 56.86 - }, - { - "text": "and", - "start_time": 56.86, - "end_time": 56.94 - }, - { - "text": " ", - "start_time": 56.94, - "end_time": 56.98 + "end_time": 52.28 }, { "text": "the", - "start_time": 56.98, - "end_time": 57.08 + "start_time": 52.28, + "end_time": 52.38 }, { "text": " ", - "start_time": 57.08, - "end_time": 57.12 + "start_time": 52.38, + "end_time": 52.44 }, { - "text": "two", - "start_time": 57.12, - "end_time": 57.28 - }, - { - "text": " ", - "start_time": 57.28, - "end_time": 57.34 - }, - { - "text": "images", - "start_time": 57.34, - "end_time": 57.78 + "text": "same", + "start_time": 52.44, + "end_time": 52.64 }, { "text": " ", - "start_time": 57.78, - "end_time": 57.82 + "start_time": 52.64, + "end_time": 52.76 }, { - "text": "flip", - "start_time": 57.84, - "end_time": 58.02 + "text": "story", + "start_time": 52.76, + "end_time": 53.04 }, { "text": " ", - "start_time": 58.02, - "end_time": 58.06 + "start_time": 53.04, + "end_time": 53.08 }, { "text": "in", - "start_time": 58.06, - "end_time": 58.14 + "start_time": 53.08, + "end_time": 53.14 }, { "text": " ", - "start_time": 58.14, - "end_time": 58.24 + "start_time": 53.14, + "end_time": 53.18 }, { - "text": "place", - "start_time": 58.26, - "end_time": 58.58 + "text": "the", + "start_time": 53.18, + "end_time": 53.26 }, { "text": " ", - "start_time": 58.58, - "end_time": 58.78 + "start_time": 53.26, + "end_time": 53.3 }, { - "text": "so", - "start_time": 58.78, - "end_time": 58.9 + "text": "cloud", + "start_time": 53.3, + "end_time": 53.7 }, { "text": " ", - "start_time": 58.9, - "end_time": 58.94 + "start_time": 53.7, + "end_time": 54.0 }, { - "text": "you", - "start_time": 58.94, - "end_time": 59.0 + "text": "and", + "start_time": 54.0, + "end_time": 54.12 }, { "text": " ", - "start_time": 59.0, - "end_time": 59.04 + "start_time": 54.12, + "end_time": 54.22 }, { - "text": "can", - "start_time": 59.04, - "end_time": 59.18 + "text": "ask", + "start_time": 54.22, + "end_time": 54.48 }, { "text": " ", - "start_time": 59.18, - "end_time": 59.22 + "start_time": 54.48, + "end_time": 54.52 }, { - "text": "see", - "start_time": 59.22, - "end_time": 59.34 + "text": "Muse", + "start_time": 54.52, + "end_time": 54.78 }, { "text": " ", - "start_time": 59.34, - "end_time": 59.38 + "start_time": 54.78, + "end_time": 54.94 }, { - "text": "exactly", - "start_time": 59.38, - "end_time": 59.98 + "text": "Spark", + "start_time": 54.94, + "end_time": 55.28 }, { "text": " ", - "start_time": 59.98, - "end_time": 60.02 + "start_time": 55.28, + "end_time": 55.3 }, { "text": "what", - "start_time": 60.02, - "end_time": 60.2 - }, - { - "text": " ", - "start_time": 60.2, - "end_time": 60.26 - }, - { - "text": "moved.", - "start_time": 60.26, - "end_time": 60.62 - }, - { - "text": " ", - "start_time": 60.62, - "end_time": 60.98 - }, - { - "text": "That", - "start_time": 60.98, - "end_time": 61.12 - }, - { - "text": " ", - "start_time": 61.12, - "end_time": 61.16 - }, - { - "text": "looks", - "start_time": 61.16, - "end_time": 61.36 - }, - { - "text": " ", - "start_time": 61.36, - "end_time": 61.4 - }, - { - "text": "right,", - "start_time": 61.4, - "end_time": 61.62 - }, - { - "text": " ", - "start_time": 61.62, - "end_time": 61.96 - }, - { - "text": "so", - "start_time": 61.96, - "end_time": 62.06 + "start_time": 55.3, + "end_time": 55.46 }, { "text": " ", - "start_time": 62.06, - "end_time": 62.16 + "start_time": 55.46, + "end_time": 55.52 }, { - "text": "I", - "start_time": 62.16, - "end_time": 62.18 - }, - { - "text": " ", - "start_time": 62.18, - "end_time": 62.24 - }, - { - "text": "approve", - "start_time": 62.24, - "end_time": 62.62 + "text": "caused", + "start_time": 55.52, + "end_time": 55.82 }, { "text": " ", - "start_time": 62.62, - "end_time": 62.64 + "start_time": 55.82, + "end_time": 55.86 }, { - "text": "those", - "start_time": 62.64, - "end_time": 62.9 + "text": "it.", + "start_time": 55.86, + "end_time": 55.98 }, { "text": " ", - "start_time": 62.9, - "end_time": 63.04 + "start_time": 55.98, + "end_time": 56.42 }, { - "text": "48", - "start_time": 63.04, - "end_time": 63.36 + "text": "It", + "start_time": 56.42, + "end_time": 56.52 }, { "text": " ", - "start_time": 63.36, - "end_time": 63.4 + "start_time": 56.52, + "end_time": 56.58 }, { - "text": "together.", - "start_time": 63.4, - "end_time": 63.8 + "text": "reads", + "start_time": 56.58, + "end_time": 56.84 }, { "text": " ", - "start_time": 63.8, - "end_time": 64.26 + "start_time": 56.84, + "end_time": 56.88 }, { - "text": "But", - "start_time": 64.26, - "end_time": 64.4 + "text": "the", + "start_time": 56.88, + "end_time": 56.94 }, { "text": " ", - "start_time": 64.4, - "end_time": 64.44 + "start_time": 56.94, + "end_time": 56.98 }, { - "text": "what", - "start_time": 64.44, - "end_time": 64.519 + "text": "before,", + "start_time": 56.98, + "end_time": 57.46 }, { "text": " ", - "start_time": 64.519, - "end_time": 64.58 + "start_time": 57.46, + "end_time": 57.74 }, { - "text": "about", - "start_time": 64.58, - "end_time": 64.92 + "text": "the", + "start_time": 57.74, + "end_time": 57.86 }, { "text": " ", - "start_time": 64.92, - "end_time": 64.959 + "start_time": 57.86, + "end_time": 58.0 }, { - "text": "dark", - "start_time": 64.959, - "end_time": 65.22 + "text": "after,", + "start_time": 58.0, + "end_time": 58.3 }, { "text": " ", - "start_time": 65.22, - "end_time": 65.319 + "start_time": 58.3, + "end_time": 58.54 }, { - "text": "mode?", - "start_time": 65.319, - "end_time": 65.62 + "text": "the", + "start_time": 58.54, + "end_time": 58.68 }, { "text": " ", - "start_time": 65.62, - "end_time": 65.62 + "start_time": 58.68, + "end_time": 58.72 }, { - "text": "I", - "start_time": 66.24, - "end_time": 66.24 + "text": "diff,", + "start_time": 58.72, + "end_time": 59.0 }, { "text": " ", - "start_time": 66.24, - "end_time": 66.28 + "start_time": 59.0, + "end_time": 59.18 }, { - "text": "search", - "start_time": 66.28, - "end_time": 66.52 + "text": "and", + "start_time": 59.18, + "end_time": 59.3 }, { "text": " ", - "start_time": 66.52, - "end_time": 66.56 + "start_time": 59.3, + "end_time": 59.34 }, { - "text": "for", - "start_time": 66.56, - "end_time": 66.64 + "text": "the", + "start_time": 59.34, + "end_time": 59.42 }, { "text": " ", - "start_time": 66.64, - "end_time": 66.78 + "start_time": 59.42, + "end_time": 59.48 }, { - "text": "dark,", - "start_time": 66.78, - "end_time": 67.12 + "text": "code,", + "start_time": 59.48, + "end_time": 59.8 }, { "text": " ", - "start_time": 67.12, - "end_time": 67.42 + "start_time": 59.8, + "end_time": 60.12 }, { "text": "and", - "start_time": 67.42, - "end_time": 67.52 - }, - { - "text": " ", - "start_time": 67.52, - "end_time": 67.58 - }, - { - "text": "there", - "start_time": 67.58, - "end_time": 67.72 + "start_time": 60.12, + "end_time": 60.2 }, { "text": " ", - "start_time": 67.72, - "end_time": 67.76 + "start_time": 60.2, + "end_time": 60.24 }, { "text": "it", - "start_time": 67.76, - "end_time": 67.84 - }, - { - "text": " ", - "start_time": 67.84, - "end_time": 67.92 - }, - { - "text": "is,", - "start_time": 67.92, - "end_time": 68.16 - }, - { - "text": " ", - "start_time": 68.16, - "end_time": 68.7 - }, - { - "text": "85,000", - "start_time": 68.7, - "end_time": 69.96 + "start_time": 60.24, + "end_time": 60.38 }, { "text": " ", - "start_time": 69.96, - "end_time": 70.02 + "start_time": 60.38, + "end_time": 60.44 }, { - "text": "changed", - "start_time": 70.02, - "end_time": 70.36 - }, - { - "text": " ", - "start_time": 70.36, - "end_time": 70.44 - }, - { - "text": "pixels.", - "start_time": 70.44, - "end_time": 70.92 - }, - { - "text": " ", - "start_time": 70.92, - "end_time": 71.32 - }, - { - "text": "The", - "start_time": 71.32, - "end_time": 71.42 + "text": "finds", + "start_time": 60.44, + "end_time": 60.76 }, { "text": " ", - "start_time": 71.42, - "end_time": 71.48 + "start_time": 60.76, + "end_time": 60.8 }, { - "text": "agent", - "start_time": 71.48, - "end_time": 71.74 + "text": "the", + "start_time": 60.8, + "end_time": 60.86 }, { "text": " ", - "start_time": 71.74, - "end_time": 71.86 + "start_time": 60.86, + "end_time": 60.92 }, { - "text": "hardcoded", - "start_time": 71.86, - "end_time": 72.5 + "text": "line.", + "start_time": 60.92, + "end_time": 61.24 }, { "text": " ", - "start_time": 72.5, - "end_time": 72.58 + "start_time": 61.24, + "end_time": 61.24 }, { - "text": "a", - "start_time": 72.58, - "end_time": 72.64 + "text": "Then", + "start_time": 61.74, + "end_time": 61.88 }, { "text": " ", - "start_time": 72.64, - "end_time": 72.7 + "start_time": 61.88, + "end_time": 61.92 }, { - "text": "light", - "start_time": 72.7, - "end_time": 72.88 + "text": "it", + "start_time": 61.92, + "end_time": 62.0 }, { "text": " ", - "start_time": 72.88, - "end_time": 72.98 + "start_time": 62.0, + "end_time": 62.06 }, { - "text": "color,", - "start_time": 72.98, - "end_time": 73.24 + "text": "spots", + "start_time": 62.12, + "end_time": 62.4 }, { "text": " ", - "start_time": 73.24, - "end_time": 73.42 + "start_time": 62.4, + "end_time": 62.44 }, { - "text": "and", - "start_time": 73.42, - "end_time": 73.5 + "text": "what", + "start_time": 62.44, + "end_time": 62.54 }, { "text": " ", - "start_time": 73.5, - "end_time": 73.52 + "start_time": 62.54, + "end_time": 62.6 }, { - "text": "the", - "start_time": 73.52, - "end_time": 73.64 + "text": "I", + "start_time": 62.6, + "end_time": 62.66 }, { "text": " ", - "start_time": 73.64, - "end_time": 73.68 + "start_time": 62.66, + "end_time": 62.72 }, { - "text": "top", - "start_time": 73.68, - "end_time": 73.92 + "text": "never", + "start_time": 62.72, + "end_time": 62.94 }, { "text": " ", - "start_time": 73.92, - "end_time": 73.94 + "start_time": 62.94, + "end_time": 63.02 }, { - "text": "bar", - "start_time": 73.94, - "end_time": 74.12 + "text": "asked", + "start_time": 63.02, + "end_time": 63.28 }, { "text": " ", - "start_time": 74.12, - "end_time": 74.2 + "start_time": 63.28, + "end_time": 63.32 }, { - "text": "went", - "start_time": 74.2, - "end_time": 74.38 + "text": "for,", + "start_time": 63.32, + "end_time": 63.54 }, { "text": " ", - "start_time": 74.38, - "end_time": 74.44 + "start_time": 63.54, + "end_time": 63.94 }, { - "text": "white.", - "start_time": 74.44, - "end_time": 74.7 + "text": "a", + "start_time": 63.94, + "end_time": 64.08 }, { "text": " ", - "start_time": 74.7, - "end_time": 74.7 + "start_time": 64.08, + "end_time": 64.14 }, { - "text": "I", - "start_time": 75.18, - "end_time": 75.22 + "text": "fixed", + "start_time": 64.14, + "end_time": 64.44 }, { "text": " ", - "start_time": 75.22, - "end_time": 75.26 + "start_time": 64.44, + "end_time": 64.519 }, { - "text": "don't", - "start_time": 75.26, - "end_time": 75.38 + "text": "light", + "start_time": 64.519, + "end_time": 64.76 }, { "text": " ", - "start_time": 75.38, - "end_time": 75.42 + "start_time": 64.76, + "end_time": 64.819 }, { - "text": "have", - "start_time": 75.42, - "end_time": 75.52 + "text": "color", + "start_time": 64.819, + "end_time": 65.08 }, { "text": " ", - "start_time": 75.52, - "end_time": 75.56 - }, - { - "text": "to", - "start_time": 75.56, - "end_time": 75.64 - }, - { - "text": " ", - "start_time": 75.64, - "end_time": 75.66 - }, - { - "text": "describe", - "start_time": 75.66, - "end_time": 76.16 - }, - { - "text": " ", - "start_time": 76.16, - "end_time": 76.22 - }, - { - "text": "where.", - "start_time": 76.22, - "end_time": 76.56 - }, - { - "text": " ", - "start_time": 76.56, - "end_time": 77.12 - }, - { - "text": "I", - "start_time": 77.12, - "end_time": 77.12 - }, - { - "text": " ", - "start_time": 77.12, - "end_time": 77.16 - }, - { - "text": "click", - "start_time": 77.16, - "end_time": 77.34 - }, - { - "text": " ", - "start_time": 77.34, - "end_time": 77.4 - }, - { - "text": "the", - "start_time": 77.4, - "end_time": 77.48 - }, - { - "text": " ", - "start_time": 77.48, - "end_time": 77.52 - }, - { - "text": "change,", - "start_time": 77.52, - "end_time": 77.94 - }, - { - "text": " ", - "start_time": 77.94, - "end_time": 78.22 - }, - { - "text": "write", - "start_time": 78.22, - "end_time": 78.44 - }, - { - "text": " ", - "start_time": 78.44, - "end_time": 78.46 - }, - { - "text": "what's", - "start_time": 78.46, - "end_time": 78.68 - }, - { - "text": " ", - "start_time": 78.68, - "end_time": 78.7 - }, - { - "text": "wrong,", - "start_time": 78.7, - "end_time": 79.0 - }, - { - "text": " ", - "start_time": 79.0, - "end_time": 79.28 - }, - { - "text": "and", - "start_time": 79.28, - "end_time": 79.36 - }, - { - "text": " ", - "start_time": 79.36, - "end_time": 79.48 - }, - { - "text": "send", - "start_time": 79.48, - "end_time": 79.66 - }, - { - "text": " ", - "start_time": 79.66, - "end_time": 79.68 - }, - { - "text": "it", - "start_time": 79.68, - "end_time": 79.76 - }, - { - "text": " ", - "start_time": 79.76, - "end_time": 79.8 - }, - { - "text": "to", - "start_time": 79.8, - "end_time": 79.86 - }, - { - "text": " ", - "start_time": 79.86, - "end_time": 79.9 - }, - { - "text": "the", - "start_time": 79.9, - "end_time": 79.98 - }, - { - "text": " ", - "start_time": 79.98, - "end_time": 80.06 - }, - { - "text": "agent,", - "start_time": 80.06, - "end_time": 80.36 - }, - { - "text": " ", - "start_time": 80.36, - "end_time": 80.52 - }, - { - "text": "which", - "start_time": 80.52, - "end_time": 80.62 - }, - { - "text": " ", - "start_time": 80.62, - "end_time": 80.66 - }, - { - "text": "has", - "start_time": 80.66, - "end_time": 80.76 - }, - { - "text": " ", - "start_time": 80.76, - "end_time": 80.8 - }, - { - "text": "been", - "start_time": 80.8, - "end_time": 80.94 - }, - { - "text": " ", - "start_time": 80.94, - "end_time": 80.98 - }, - { - "text": "waiting.", - "start_time": 80.98, - "end_time": 81.3 - }, - { - "text": " ", - "start_time": 81.3, - "end_time": 81.74 - }, - { - "text": "The", - "start_time": 81.74, - "end_time": 81.86 - }, - { - "text": " ", - "start_time": 81.86, - "end_time": 81.92 - }, - { - "text": "agent", - "start_time": 81.92, - "end_time": 82.2 - }, - { - "text": " ", - "start_time": 82.2, - "end_time": 82.22 - }, - { - "text": "gets", - "start_time": 82.22, - "end_time": 82.44 - }, - { - "text": " ", - "start_time": 82.44, - "end_time": 82.48 - }, - { - "text": "my", - "start_time": 82.48, - "end_time": 82.64 - }, - { - "text": " ", - "start_time": 82.64, - "end_time": 82.7 - }, - { - "text": "words,", - "start_time": 82.7, - "end_time": 83.1 - }, - { - "text": " ", - "start_time": 83.1, - "end_time": 83.34 - }, - { - "text": "the", - "start_time": 83.34, - "end_time": 83.44 - }, - { - "text": " ", - "start_time": 83.44, - "end_time": 83.52 - }, - { - "text": "story,", - "start_time": 83.52, - "end_time": 83.88 - }, - { - "text": " ", - "start_time": 83.88, - "end_time": 84.12 - }, - { - "text": "the", - "start_time": 84.12, - "end_time": 84.2 - }, - { - "text": " ", - "start_time": 84.2, - "end_time": 84.24 - }, - { - "text": "exact", - "start_time": 84.24, - "end_time": 84.68 - }, - { - "text": " ", - "start_time": 84.68, - "end_time": 84.76 - }, - { - "text": "box,", - "start_time": 84.76, - "end_time": 85.12 - }, - { - "text": " ", - "start_time": 85.12, - "end_time": 85.32 - }, - { - "text": "and", - "start_time": 85.32, - "end_time": 85.42 - }, - { - "text": " ", - "start_time": 85.42, - "end_time": 85.46 - }, - { - "text": "a", - "start_time": 85.46, - "end_time": 85.56 - }, - { - "text": " ", - "start_time": 85.56, - "end_time": 85.6 - }, - { - "text": "picture", - "start_time": 85.6, - "end_time": 85.9 - }, - { - "text": " ", - "start_time": 85.9, - "end_time": 85.96 - }, - { - "text": "of", - "start_time": 85.96, - "end_time": 86.04 - }, - { - "text": " ", - "start_time": 86.04, - "end_time": 86.06 - }, - { - "text": "what", - "start_time": 86.06, - "end_time": 86.16 - }, - { - "text": " ", - "start_time": 86.16, - "end_time": 86.26 - }, - { - "text": "I", - "start_time": 86.26, - "end_time": 86.34 - }, - { - "text": " ", - "start_time": 86.34, - "end_time": 86.4 - }, - { - "text": "saw.", - "start_time": 86.4, - "end_time": 86.7 - }, - { - "text": " ", - "start_time": 86.7, - "end_time": 87.14 - }, - { - "text": "It", - "start_time": 87.14, - "end_time": 87.24 - }, - { - "text": " ", - "start_time": 87.24, - "end_time": 87.28 - }, - { - "text": "puts", - "start_time": 87.28, - "end_time": 87.5 - }, - { - "text": " ", - "start_time": 87.5, - "end_time": 87.54 - }, - { - "text": "the", - "start_time": 87.54, - "end_time": 87.64 - }, - { - "text": " ", - "start_time": 87.64, - "end_time": 87.68 - }, - { - "text": "theme's", - "start_time": 87.68, - "end_time": 88.0 - }, - { - "text": " ", - "start_time": 88.0, - "end_time": 88.04 - }, - { - "text": "color", - "start_time": 88.04, - "end_time": 88.26 - }, - { - "text": " ", - "start_time": 88.26, - "end_time": 88.38 - }, - { - "text": "back,", - "start_time": 88.38, - "end_time": 88.64 - }, - { - "text": " ", - "start_time": 88.64, - "end_time": 88.96 - }, - { - "text": "renders", - "start_time": 88.96, - "end_time": 89.28 - }, - { - "text": " ", - "start_time": 89.28, - "end_time": 89.34 - }, - { - "text": "again,", - "start_time": 89.34, - "end_time": 89.66 - }, - { - "text": " ", - "start_time": 89.66, - "end_time": 89.9 - }, - { - "text": "and", - "start_time": 89.9, - "end_time": 90.0 - }, - { - "text": " ", - "start_time": 90.0, - "end_time": 90.08 + "start_time": 65.08, + "end_time": 65.28 }, { - "text": "answers", - "start_time": 90.08, - "end_time": 90.4 + "text": "where", + "start_time": 65.28, + "end_time": 65.4 }, { "text": " ", - "start_time": 90.4, - "end_time": 90.46 + "start_time": 65.4, + "end_time": 65.42 }, { - "text": "my", - "start_time": 90.46, - "end_time": 90.6 + "text": "the", + "start_time": 65.42, + "end_time": 65.54 }, { "text": " ", - "start_time": 90.6, - "end_time": 90.64 + "start_time": 65.54, + "end_time": 65.58 }, { - "text": "note.", - "start_time": 90.64, - "end_time": 90.86 + "text": "theme's", + "start_time": 65.58, + "end_time": 65.9 }, { "text": " ", - "start_time": 90.86, - "end_time": 91.38 + "start_time": 65.9, + "end_time": 65.94 }, { - "text": "Selfie", - "start_time": 91.38, - "end_time": 91.64 + "text": "color", + "start_time": 65.94, + "end_time": 66.14 }, { "text": " ", - "start_time": 91.64, - "end_time": 91.74 + "start_time": 66.14, + "end_time": 66.26 }, { - "text": "tells", - "start_time": 91.74, - "end_time": 91.96 + "text": "used", + "start_time": 66.26, + "end_time": 66.42 }, { "text": " ", - "start_time": 91.96, - "end_time": 92.0 + "start_time": 66.42, + "end_time": 66.46 }, { - "text": "me", - "start_time": 92.0, - "end_time": 92.1 + "text": "to", + "start_time": 66.46, + "end_time": 66.54 }, { "text": " ", - "start_time": 92.1, - "end_time": 92.12 + "start_time": 66.54, + "end_time": 66.58 }, { - "text": "there's", - "start_time": 92.12, - "end_time": 92.28 + "text": "be.", + "start_time": 66.58, + "end_time": 66.76 }, { "text": " ", - "start_time": 92.28, - "end_time": 92.32 + "start_time": 66.76, + "end_time": 67.2 }, { - "text": "a", - "start_time": 92.32, - "end_time": 92.36 + "text": "It", + "start_time": 67.2, + "end_time": 67.26 }, { "text": " ", - "start_time": 92.36, - "end_time": 92.42 + "start_time": 67.26, + "end_time": 67.3 }, { - "text": "newer", - "start_time": 92.42, - "end_time": 92.64 + "text": "even", + "start_time": 67.3, + "end_time": 67.52 }, { "text": " ", - "start_time": 92.64, - "end_time": 92.74 + "start_time": 67.52, + "end_time": 67.58 }, { - "text": "batch,", - "start_time": 92.74, - "end_time": 93.06 + "text": "tells", + "start_time": 67.58, + "end_time": 67.8 }, { "text": " ", - "start_time": 93.06, - "end_time": 93.24 + "start_time": 67.8, + "end_time": 67.82 }, { - "text": "and", - "start_time": 93.24, - "end_time": 93.32 + "text": "me", + "start_time": 67.82, + "end_time": 67.9 }, { "text": " ", - "start_time": 93.32, - "end_time": 93.36 + "start_time": 67.9, + "end_time": 67.94 }, { - "text": "the", - "start_time": 93.36, - "end_time": 93.42 + "text": "to", + "start_time": 67.94, + "end_time": 68.04 }, { "text": " ", - "start_time": 93.42, - "end_time": 93.46 + "start_time": 68.04, + "end_time": 68.1 }, { - "text": "reply", - "start_time": 93.46, - "end_time": 93.9 + "text": "check", + "start_time": 68.1, + "end_time": 68.3 }, { "text": " ", - "start_time": 93.9, - "end_time": 93.96 + "start_time": 68.3, + "end_time": 68.4 }, { - "text": "is", - "start_time": 93.96, - "end_time": 94.14 + "text": "dark", + "start_time": 68.4, + "end_time": 68.66 }, { "text": " ", - "start_time": 94.14, - "end_time": 94.22 + "start_time": 68.66, + "end_time": 68.7 }, { - "text": "right", - "start_time": 94.22, - "end_time": 94.4 + "text": "mode.", + "start_time": 68.7, + "end_time": 68.96 }, { "text": " ", - "start_time": 94.4, - "end_time": 94.46 + "start_time": 68.96, + "end_time": 69.46 }, { - "text": "there", - "start_time": 94.46, - "end_time": 94.62 + "text": "So,", + "start_time": 69.46, + "end_time": 69.62 }, { "text": " ", - "start_time": 94.62, - "end_time": 94.66 + "start_time": 69.62, + "end_time": 69.82 }, { - "text": "on", - "start_time": 94.66, - "end_time": 94.74 + "text": "back", + "start_time": 69.82, + "end_time": 70.0 }, { "text": " ", - "start_time": 94.74, - "end_time": 94.78 + "start_time": 70.0, + "end_time": 70.04 }, { - "text": "the", - "start_time": 94.78, - "end_time": 94.88 + "text": "in", + "start_time": 70.04, + "end_time": 70.12 }, { "text": " ", - "start_time": 94.88, - "end_time": 94.94 + "start_time": 70.12, + "end_time": 70.14 }, { - "text": "story.", - "start_time": 94.94, - "end_time": 95.28 + "text": "my", + "start_time": 70.14, + "end_time": 70.3 }, { "text": " ", - "start_time": 95.28, - "end_time": 95.68 + "start_time": 70.3, + "end_time": 70.34 }, { - "text": "The", - "start_time": 95.68, - "end_time": 95.76 + "text": "review,", + "start_time": 70.34, + "end_time": 70.7 }, { "text": " ", - "start_time": 95.76, - "end_time": 95.8 + "start_time": 70.7, + "end_time": 71.1 }, { - "text": "bar", - "start_time": 95.8, - "end_time": 96.0 + "text": "I", + "start_time": 71.1, + "end_time": 71.1 }, { "text": " ", - "start_time": 96.0, - "end_time": 96.06 + "start_time": 71.1, + "end_time": 71.14 }, { - "text": "is", - "start_time": 96.06, - "end_time": 96.2 + "text": "click", + "start_time": 71.14, + "end_time": 71.32 }, { "text": " ", - "start_time": 96.2, - "end_time": 96.22 + "start_time": 71.32, + "end_time": 71.36 }, { - "text": "dark", - "start_time": 96.22, - "end_time": 96.46 + "text": "the", + "start_time": 71.36, + "end_time": 71.46 }, { "text": " ", - "start_time": 96.46, - "end_time": 96.52 + "start_time": 71.46, + "end_time": 71.5 }, { - "text": "again,", - "start_time": 96.52, - "end_time": 96.82 + "text": "change,", + "start_time": 71.5, + "end_time": 71.94 }, { "text": " ", - "start_time": 96.82, - "end_time": 97.1 + "start_time": 71.94, + "end_time": 72.12 }, { - "text": "and", - "start_time": 97.1, - "end_time": 97.22 + "text": "write", + "start_time": 72.12, + "end_time": 72.3 }, { "text": " ", - "start_time": 97.22, - "end_time": 97.46 + "start_time": 72.3, + "end_time": 72.34 }, { - "text": "85,000", - "start_time": 97.46, - "end_time": 98.4 + "text": "a", + "start_time": 72.34, + "end_time": 72.4 }, { "text": " ", - "start_time": 98.4, - "end_time": 98.44 + "start_time": 72.4, + "end_time": 72.44 }, { - "text": "changed", - "start_time": 98.44, - "end_time": 98.76 + "text": "note,", + "start_time": 72.44, + "end_time": 72.64 }, { "text": " ", - "start_time": 98.76, - "end_time": 98.84 + "start_time": 72.64, + "end_time": 72.94 }, { - "text": "pixels", - "start_time": 98.84, - "end_time": 99.24 + "text": "and", + "start_time": 72.94, + "end_time": 73.04 }, { "text": " ", - "start_time": 99.24, - "end_time": 99.38 + "start_time": 73.04, + "end_time": 73.18 }, { - "text": "are", - "start_time": 99.38, - "end_time": 99.5 + "text": "send", + "start_time": 73.18, + "end_time": 73.34 }, { "text": " ", - "start_time": 99.5, - "end_time": 99.54 + "start_time": 73.34, + "end_time": 73.38 }, { - "text": "down", - "start_time": 99.54, - "end_time": 99.72 + "text": "it", + "start_time": 73.38, + "end_time": 73.46 }, { "text": " ", - "start_time": 99.72, - "end_time": 99.76 + "start_time": 73.46, + "end_time": 73.5 }, { "text": "to", - "start_time": 99.76, - "end_time": 99.86 + "start_time": 73.5, + "end_time": 73.56 }, { "text": " ", - "start_time": 99.86, - "end_time": 99.9 + "start_time": 73.56, + "end_time": 73.6 }, { - "text": "13.", - "start_time": 99.9, - "end_time": 100.48 + "text": "the", + "start_time": 73.6, + "end_time": 73.7 }, { "text": " ", - "start_time": 100.48, - "end_time": 100.98 + "start_time": 73.7, + "end_time": 73.76 }, { - "text": "I", - "start_time": 100.98, - "end_time": 101.04 + "text": "agent,", + "start_time": 73.76, + "end_time": 74.1 }, { "text": " ", - "start_time": 101.04, - "end_time": 101.08 + "start_time": 74.1, + "end_time": 74.22 }, { - "text": "resolve", - "start_time": 101.08, - "end_time": 101.48 + "text": "which", + "start_time": 74.22, + "end_time": 74.34 }, { "text": " ", - "start_time": 101.48, - "end_time": 101.5 + "start_time": 74.34, + "end_time": 74.38 }, { - "text": "the", - "start_time": 101.5, - "end_time": 101.6 + "text": "has", + "start_time": 74.38, + "end_time": 74.48 }, { "text": " ", - "start_time": 101.6, - "end_time": 101.62 + "start_time": 74.48, + "end_time": 74.5 }, { - "text": "note", - "start_time": 101.62, - "end_time": 101.84 + "text": "been", + "start_time": 74.5, + "end_time": 74.64 }, { "text": " ", - "start_time": 101.84, - "end_time": 102.06 + "start_time": 74.64, + "end_time": 74.68 }, { - "text": "and", - "start_time": 102.06, - "end_time": 102.14 + "text": "waiting.", + "start_time": 74.68, + "end_time": 75.0 }, { "text": " ", - "start_time": 102.14, - "end_time": 102.18 + "start_time": 75.0, + "end_time": 75.46 }, { - "text": "approve", - "start_time": 102.18, - "end_time": 102.54 + "text": "It", + "start_time": 75.46, + "end_time": 75.54 }, { "text": " ", - "start_time": 102.54, - "end_time": 102.56 + "start_time": 75.54, + "end_time": 75.58 }, { - "text": "the", - "start_time": 102.58, - "end_time": 102.64 + "text": "gets", + "start_time": 75.58, + "end_time": 75.78 }, { "text": " ", - "start_time": 102.64, - "end_time": 102.72 + "start_time": 75.78, + "end_time": 75.84 }, { - "text": "rest.", - "start_time": 102.72, - "end_time": 103.06 + "text": "my", + "start_time": 75.84, + "end_time": 76.0 }, { "text": " ", - "start_time": 103.06, - "end_time": 103.46 + "start_time": 76.0, + "end_time": 76.04 }, { - "text": "The", - "start_time": 103.46, - "end_time": 103.56 + "text": "words,", + "start_time": 76.04, + "end_time": 76.42 }, { "text": " ", - "start_time": 103.56, - "end_time": 103.72 + "start_time": 76.42, + "end_time": 76.62 }, { - "text": "48", - "start_time": 103.72, - "end_time": 104.04 + "text": "the", + "start_time": 76.62, + "end_time": 76.7 }, { "text": " ", - "start_time": 104.04, - "end_time": 104.18 + "start_time": 76.7, + "end_time": 76.74 }, { - "text": "I", - "start_time": 104.18, - "end_time": 104.18 + "text": "exact", + "start_time": 76.74, + "end_time": 77.22 }, { "text": " ", - "start_time": 104.18, - "end_time": 104.26 + "start_time": 77.22, + "end_time": 77.26 }, { - "text": "already", - "start_time": 104.26, - "end_time": 104.62 + "text": "box,", + "start_time": 77.26, + "end_time": 77.62 }, { "text": " ", - "start_time": 104.62, - "end_time": 104.66 + "start_time": 77.62, + "end_time": 77.88 }, { - "text": "approved", - "start_time": 104.66, - "end_time": 105.1 + "text": "and", + "start_time": 77.88, + "end_time": 78.04 }, { "text": " ", - "start_time": 105.1, - "end_time": 105.14 + "start_time": 78.04, + "end_time": 78.08 }, { - "text": "are", - "start_time": 105.14, - "end_time": 105.24 + "text": "a", + "start_time": 78.08, + "end_time": 78.18 }, { "text": " ", - "start_time": 105.24, - "end_time": 105.3 + "start_time": 78.18, + "end_time": 78.22 }, { - "text": "simply", - "start_time": 105.3, - "end_time": 105.64 + "text": "picture", + "start_time": 78.22, + "end_time": 78.54 }, { "text": " ", - "start_time": 105.64, - "end_time": 105.7 + "start_time": 78.54, + "end_time": 78.6 }, { - "text": "unchanged", - "start_time": 105.7, - "end_time": 106.3 + "text": "of", + "start_time": 78.6, + "end_time": 78.68 }, { "text": " ", - "start_time": 106.3, - "end_time": 106.34 + "start_time": 78.68, + "end_time": 78.72 }, { - "text": "now,", - "start_time": 106.34, - "end_time": 106.56 + "text": "what", + "start_time": 78.72, + "end_time": 78.84 }, { "text": " ", - "start_time": 106.56, - "end_time": 106.78 + "start_time": 78.84, + "end_time": 78.92 }, { - "text": "because", - "start_time": 106.78, - "end_time": 107.0 + "text": "I", + "start_time": 78.92, + "end_time": 79.0 }, { "text": " ", - "start_time": 107.0, - "end_time": 107.04 + "start_time": 79.0, + "end_time": 79.04 }, { - "text": "an", - "start_time": 107.04, - "end_time": 107.1 + "text": "saw.", + "start_time": 79.06, + "end_time": 79.36 }, { "text": " ", - "start_time": 107.1, - "end_time": 107.14 + "start_time": 79.36, + "end_time": 79.8 }, { - "text": "approval", - "start_time": 107.14, - "end_time": 107.6 + "text": "It", + "start_time": 79.8, + "end_time": 79.9 }, { "text": " ", - "start_time": 107.6, - "end_time": 107.76 + "start_time": 79.9, + "end_time": 79.94 }, { - "text": "follows", - "start_time": 107.76, - "end_time": 108.12 + "text": "puts", + "start_time": 79.94, + "end_time": 80.16 }, { "text": " ", - "start_time": 108.12, - "end_time": 108.16 + "start_time": 80.16, + "end_time": 80.2 }, { - "text": "your", - "start_time": 108.16, - "end_time": 108.24 + "text": "the", + "start_time": 80.2, + "end_time": 80.3 }, { "text": " ", - "start_time": 108.24, - "end_time": 108.34 + "start_time": 80.3, + "end_time": 80.34 }, { - "text": "Git", - "start_time": 108.34, - "end_time": 108.48 + "text": "theme's", + "start_time": 80.34, + "end_time": 80.64 }, { "text": " ", - "start_time": 108.48, - "end_time": 108.52 + "start_time": 80.64, + "end_time": 80.7 }, { - "text": "history.", - "start_time": 108.52, - "end_time": 108.92 + "text": "color", + "start_time": 80.7, + "end_time": 80.9 }, { "text": " ", - "start_time": 108.92, - "end_time": 109.3 + "start_time": 80.9, + "end_time": 81.0 }, { - "text": "The", - "start_time": 109.34, - "end_time": 109.42 + "text": "back,", + "start_time": 81.0, + "end_time": 81.28 }, { "text": " ", - "start_time": 109.42, - "end_time": 109.48 + "start_time": 81.28, + "end_time": 81.58 }, { - "text": "agent", - "start_time": 109.48, - "end_time": 109.76 + "text": "renders", + "start_time": 81.58, + "end_time": 81.9 }, { "text": " ", - "start_time": 109.76, - "end_time": 109.8 + "start_time": 81.9, + "end_time": 81.96 }, { - "text": "commits", - "start_time": 109.8, - "end_time": 110.32 + "text": "again,", + "start_time": 81.96, + "end_time": 82.26 }, { "text": " ", - "start_time": 110.32, - "end_time": 110.34 + "start_time": 82.26, + "end_time": 82.54 }, { "text": "and", - "start_time": 110.34, - "end_time": 110.44 + "start_time": 82.54, + "end_time": 82.72 }, { "text": " ", - "start_time": 110.44, - "end_time": 110.48 + "start_time": 82.72, + "end_time": 82.82 }, { - "text": "reviews", - "start_time": 110.48, - "end_time": 110.9 + "text": "answers", + "start_time": 82.82, + "end_time": 83.12 }, { "text": " ", - "start_time": 110.9, - "end_time": 111.0 + "start_time": 83.12, + "end_time": 83.18 }, { - "text": "once", - "start_time": 111.0, - "end_time": 111.14 + "text": "my", + "start_time": 83.18, + "end_time": 83.32 }, { "text": " ", - "start_time": 111.14, - "end_time": 111.26 + "start_time": 83.32, + "end_time": 83.36 }, { - "text": "more.", - "start_time": 111.26, - "end_time": 111.52 + "text": "note.", + "start_time": 83.36, + "end_time": 83.6 }, { "text": " ", - "start_time": 111.52, - "end_time": 111.92 + "start_time": 83.6, + "end_time": 84.0 }, { - "text": "It's", - "start_time": 111.92, - "end_time": 112.06 + "text": "The", + "start_time": 84.0, + "end_time": 84.14 }, { "text": " ", - "start_time": 112.06, - "end_time": 112.1 + "start_time": 84.14, + "end_time": 84.16 }, { - "text": "the", - "start_time": 112.1, - "end_time": 112.18 + "text": "bar", + "start_time": 84.16, + "end_time": 84.38 }, { "text": " ", - "start_time": 112.18, - "end_time": 112.22 + "start_time": 84.38, + "end_time": 84.44 }, { - "text": "exact", - "start_time": 112.22, - "end_time": 112.66 + "text": "is", + "start_time": 84.44, + "end_time": 84.58 }, { "text": " ", - "start_time": 112.66, - "end_time": 112.72 + "start_time": 84.58, + "end_time": 84.6 }, { - "text": "same", - "start_time": 112.72, - "end_time": 112.92 + "text": "dark", + "start_time": 84.6, + "end_time": 84.84 }, { "text": " ", - "start_time": 112.92, - "end_time": 113.0 + "start_time": 84.84, + "end_time": 84.9 }, { - "text": "build,", - "start_time": 113.0, - "end_time": 113.3 + "text": "again,", + "start_time": 84.9, + "end_time": 85.2 }, { "text": " ", - "start_time": 113.3, - "end_time": 113.56 + "start_time": 85.2, + "end_time": 85.44 }, { - "text": "so", - "start_time": 113.56, - "end_time": 113.7 + "text": "and", + "start_time": 85.44, + "end_time": 85.64 }, { "text": " ", - "start_time": 113.7, - "end_time": 113.72 + "start_time": 85.64, + "end_time": 85.78 }, { - "text": "nothing", - "start_time": 113.72, - "end_time": 114.02 + "text": "85,000", + "start_time": 85.78, + "end_time": 86.72 }, { "text": " ", - "start_time": 114.02, - "end_time": 114.08 + "start_time": 86.72, + "end_time": 86.78 }, { - "text": "renders.", - "start_time": 114.08, - "end_time": 114.48 + "text": "changed", + "start_time": 86.78, + "end_time": 87.1 }, { "text": " ", - "start_time": 114.48, - "end_time": 114.92 + "start_time": 87.1, + "end_time": 87.18 }, { - "text": "A", - "start_time": 114.92, - "end_time": 115.06 + "text": "pixels", + "start_time": 87.2, + "end_time": 87.66 }, { "text": " ", - "start_time": 115.06, - "end_time": 115.12 + "start_time": 87.66, + "end_time": 87.7 }, { - "text": "third", - "start_time": 115.12, - "end_time": 115.3 + "text": "are", + "start_time": 87.7, + "end_time": 87.84 }, { "text": " ", - "start_time": 115.3, - "end_time": 115.34 + "start_time": 87.84, + "end_time": 87.88 }, { - "text": "of", - "start_time": 115.34, - "end_time": 115.4 + "text": "down", + "start_time": 87.88, + "end_time": 88.14 }, { "text": " ", - "start_time": 115.4, - "end_time": 115.44 + "start_time": 88.14, + "end_time": 88.18 }, { - "text": "a", - "start_time": 115.44, - "end_time": 115.52 + "text": "to", + "start_time": 88.18, + "end_time": 88.34 }, { "text": " ", - "start_time": 115.52, - "end_time": 115.56 + "start_time": 88.34, + "end_time": 88.38 }, { - "text": "second", - "start_time": 115.56, - "end_time": 115.92 + "text": "13.", + "start_time": 88.38, + "end_time": 88.98 }, { "text": " ", - "start_time": 115.92, - "end_time": 116.16 + "start_time": 88.98, + "end_time": 89.5 }, { - "text": "and", - "start_time": 116.16, - "end_time": 116.26 + "text": "I", + "start_time": 89.5, + "end_time": 89.54 }, { "text": " ", - "start_time": 116.26, - "end_time": 116.42 + "start_time": 89.54, + "end_time": 89.58 }, { - "text": "exit", - "start_time": 116.44, - "end_time": 116.72 + "text": "approve", + "start_time": 89.58, + "end_time": 89.92 }, { "text": " ", - "start_time": 116.72, - "end_time": 116.84 + "start_time": 89.92, + "end_time": 89.96 }, { - "text": "zero.", - "start_time": 116.84, - "end_time": 117.2 + "text": "the", + "start_time": 89.96, + "end_time": 90.04 }, { "text": " ", - "start_time": 117.2, - "end_time": 117.6 + "start_time": 90.04, + "end_time": 90.08 }, { - "text": "Push", - "start_time": 117.6, - "end_time": 117.8 + "text": "rest,", + "start_time": 90.08, + "end_time": 90.4 }, { "text": " ", - "start_time": 117.8, - "end_time": 117.84 + "start_time": 90.4, + "end_time": 90.62 }, { - "text": "it,", - "start_time": 117.84, - "end_time": 117.96 + "text": "and", + "start_time": 90.62, + "end_time": 90.7 }, { "text": " ", - "start_time": 117.96, - "end_time": 118.2 + "start_time": 90.7, + "end_time": 90.74 }, { - "text": "and", - "start_time": 118.2, - "end_time": 118.28 + "text": "the", + "start_time": 90.74, + "end_time": 90.84 }, { "text": " ", - "start_time": 118.28, - "end_time": 118.42 + "start_time": 90.84, + "end_time": 90.92 }, { - "text": "Selfie", - "start_time": 118.42, - "end_time": 118.74 + "text": "agent", + "start_time": 90.92, + "end_time": 91.16 }, { "text": " ", - "start_time": 118.74, - "end_time": 118.84 + "start_time": 91.16, + "end_time": 91.26 }, { - "text": "renders", - "start_time": 118.84, - "end_time": 119.16 + "text": "commits", + "start_time": 91.26, + "end_time": 91.62 }, { "text": " ", - "start_time": 119.16, - "end_time": 119.18 + "start_time": 91.62, + "end_time": 91.66 }, { - "text": "in", - "start_time": 119.18, - "end_time": 119.32 + "text": "and", + "start_time": 91.66, + "end_time": 91.76 }, { "text": " ", - "start_time": 119.32, - "end_time": 119.38 + "start_time": 91.76, + "end_time": 91.82 }, { - "text": "CI", - "start_time": 119.38, - "end_time": 119.84 + "text": "reviews", + "start_time": 91.82, + "end_time": 92.22 }, { "text": " ", - "start_time": 119.84, - "end_time": 119.96 + "start_time": 92.22, + "end_time": 92.32 }, { - "text": "and", - "start_time": 119.96, - "end_time": 120.04 + "text": "once", + "start_time": 92.36, + "end_time": 92.52 }, { "text": " ", - "start_time": 120.04, - "end_time": 120.12 + "start_time": 92.52, + "end_time": 92.62 }, { - "text": "puts", - "start_time": 120.12, - "end_time": 120.28 + "text": "more.", + "start_time": 92.62, + "end_time": 92.86 }, { "text": " ", - "start_time": 120.28, - "end_time": 120.32 + "start_time": 92.86, + "end_time": 93.32 }, { - "text": "a", - "start_time": 120.32, - "end_time": 120.4 + "text": "It's", + "start_time": 93.32, + "end_time": 93.46 }, { "text": " ", - "start_time": 120.4, - "end_time": 120.48 + "start_time": 93.46, + "end_time": 93.5 }, { - "text": "status", - "start_time": 120.48, - "end_time": 120.84 + "text": "the", + "start_time": 93.5, + "end_time": 93.58 }, { "text": " ", - "start_time": 120.84, - "end_time": 120.9 + "start_time": 93.58, + "end_time": 93.62 }, { - "text": "on", - "start_time": 120.9, - "end_time": 120.96 + "text": "exact", + "start_time": 93.62, + "end_time": 94.06 }, { "text": " ", - "start_time": 120.96, - "end_time": 121.0 + "start_time": 94.06, + "end_time": 94.14 }, { - "text": "the", - "start_time": 121.0, - "end_time": 121.08 + "text": "same", + "start_time": 94.14, + "end_time": 94.34 }, { "text": " ", - "start_time": 121.08, - "end_time": 121.1 + "start_time": 94.34, + "end_time": 94.42 }, { - "text": "commit.", - "start_time": 121.1, - "end_time": 121.44 + "text": "build,", + "start_time": 94.42, + "end_time": 94.74 }, { "text": " ", - "start_time": 121.44, - "end_time": 121.86 + "start_time": 94.74, + "end_time": 94.96 }, { - "text": "Click", - "start_time": 121.86, - "end_time": 122.04 + "text": "so", + "start_time": 94.96, + "end_time": 95.18 }, { "text": " ", - "start_time": 122.04, - "end_time": 122.1 + "start_time": 95.18, + "end_time": 95.24 }, { - "text": "through,", - "start_time": 122.1, - "end_time": 122.38 + "text": "nothing", + "start_time": 95.24, + "end_time": 95.52 }, { "text": " ", - "start_time": 122.38, - "end_time": 122.62 + "start_time": 95.52, + "end_time": 95.56 }, { - "text": "and", - "start_time": 122.62, - "end_time": 122.7 + "text": "renders.", + "start_time": 95.56, + "end_time": 95.96 }, { "text": " ", - "start_time": 122.7, - "end_time": 122.74 + "start_time": 95.96, + "end_time": 96.44 }, { - "text": "it's", - "start_time": 122.74, - "end_time": 122.9 + "text": "Under", + "start_time": 96.44, + "end_time": 96.74 }, { "text": " ", - "start_time": 122.9, - "end_time": 122.94 + "start_time": 96.74, + "end_time": 96.8 }, { - "text": "the", - "start_time": 122.94, - "end_time": 123.08 + "text": "half", + "start_time": 96.8, + "end_time": 96.98 }, { "text": " ", - "start_time": 123.08, - "end_time": 123.16 + "start_time": 96.98, + "end_time": 97.04 }, { - "text": "same", - "start_time": 123.16, - "end_time": 123.4 + "text": "a", + "start_time": 97.04, + "end_time": 97.12 }, { "text": " ", - "start_time": 123.4, - "end_time": 123.44 + "start_time": 97.12, + "end_time": 97.16 }, { - "text": "review", - "start_time": 123.44, - "end_time": 123.84 + "text": "second", + "start_time": 97.16, + "end_time": 97.52 }, { "text": " ", - "start_time": 123.84, - "end_time": 124.14 + "start_time": 97.52, + "end_time": 97.74 }, { - "text": "in", - "start_time": 124.14, - "end_time": 124.22 + "text": "and", + "start_time": 97.74, + "end_time": 97.98 }, { "text": " ", - "start_time": 124.22, - "end_time": 124.28 + "start_time": 97.98, + "end_time": 98.02 }, { - "text": "the", - "start_time": 124.28, - "end_time": 124.36 + "text": "exit", + "start_time": 98.02, + "end_time": 98.32 }, { "text": " ", - "start_time": 124.36, - "end_time": 124.4 + "start_time": 98.32, + "end_time": 98.42 }, { - "text": "cloud.", - "start_time": 124.4, - "end_time": 124.8 + "text": "zero.", + "start_time": 98.42, + "end_time": 98.76 }, { "text": " ", - "start_time": 124.8, - "end_time": 124.8 + "start_time": 98.76, + "end_time": 98.76 }, { "text": "Selfie", - "start_time": 125.32, - "end_time": 125.6 + "start_time": 99.32, + "end_time": 99.62 }, { "text": " ", - "start_time": 125.6, - "end_time": 125.7 + "start_time": 99.62, + "end_time": 99.72 }, { "text": "works", - "start_time": 125.7, - "end_time": 125.94 + "start_time": 99.72, + "end_time": 99.98 }, { "text": " ", - "start_time": 125.94, - "end_time": 125.98 + "start_time": 99.98, + "end_time": 100.02 }, { "text": "with", - "start_time": 125.98, - "end_time": 126.18 + "start_time": 100.02, + "end_time": 100.26 }, { "text": " ", - "start_time": 126.18, - "end_time": 126.26 + "start_time": 100.26, + "end_time": 100.32 }, { "text": "any", - "start_time": 126.26, - "end_time": 126.42 + "start_time": 100.32, + "end_time": 100.48 }, { "text": " ", - "start_time": 126.42, - "end_time": 126.54 + "start_time": 100.48, + "end_time": 100.6 }, { "text": "coding", - "start_time": 126.54, - "end_time": 126.84 + "start_time": 100.6, + "end_time": 100.9 }, { "text": " ", - "start_time": 126.84, - "end_time": 126.9 + "start_time": 100.9, + "end_time": 100.98 }, { "text": "agent.", - "start_time": 126.9, - "end_time": 127.22 + "start_time": 100.98, + "end_time": 101.3 }, { "text": " ", - "start_time": 127.22, - "end_time": 127.64 + "start_time": 101.3, + "end_time": 101.7 }, { "text": "If", - "start_time": 127.64, - "end_time": 127.7 + "start_time": 101.7, + "end_time": 101.78 }, { "text": " ", - "start_time": 127.7, - "end_time": 127.76 + "start_time": 101.78, + "end_time": 101.82 }, { "text": "you", - "start_time": 127.76, - "end_time": 127.84 + "start_time": 101.82, + "end_time": 101.9 }, { "text": " ", - "start_time": 127.84, - "end_time": 127.88 + "start_time": 101.9, + "end_time": 101.94 }, { "text": "have", - "start_time": 127.88, - "end_time": 127.98 + "start_time": 101.94, + "end_time": 102.04 }, { "text": " ", - "start_time": 127.98, - "end_time": 128.02 + "start_time": 102.04, + "end_time": 102.08 }, { "text": "a", - "start_time": 128.02, - "end_time": 128.1 + "start_time": 102.08, + "end_time": 102.14 }, { "text": " ", - "start_time": 128.1, - "end_time": 128.18 + "start_time": 102.14, + "end_time": 102.22 }, { "text": "storybook,", - "start_time": 128.18, - "end_time": 128.68 + "start_time": 102.22, + "end_time": 102.74 }, { "text": " ", - "start_time": 128.68, - "end_time": 128.96 + "start_time": 102.74, + "end_time": 102.94 }, { - "text": "start", - "start_time": 128.96, - "end_time": 129.18 + "text": "you", + "start_time": 102.94, + "end_time": 103.0 }, { "text": " ", - "start_time": 129.18, - "end_time": 129.28 + "start_time": 103.0, + "end_time": 103.04 }, { - "text": "locally", - "start_time": 129.28, - "end_time": 129.66 + "text": "can", + "start_time": 103.04, + "end_time": 103.16 }, { "text": " ", - "start_time": 129.66, - "end_time": 129.699 + "start_time": 103.16, + "end_time": 103.22 }, { - "text": "today", - "start_time": 129.699, - "end_time": 130.08 + "text": "start", + "start_time": 103.22, + "end_time": 103.42 }, { "text": " ", - "start_time": 130.08, - "end_time": 130.139 + "start_time": 103.42, + "end_time": 103.52 }, { - "text": "at", - "start_time": 130.139, - "end_time": 130.28 + "text": "locally", + "start_time": 103.52, + "end_time": 103.94 }, { "text": " ", - "start_time": 130.28, - "end_time": 130.36 + "start_time": 103.94, + "end_time": 103.98 }, { - "text": "selfie.dev", - "start_time": 130.36, - "end_time": 131.38 + "text": "today,", + "start_time": 103.98, + "end_time": 104.32 }, { "text": " ", - "start_time": 131.38, - "end_time": 131.58 + "start_time": 104.32, + "end_time": 104.66 }, { "text": "and", - "start_time": 131.6, - "end_time": 131.76 - }, - { - "text": " ", - "start_time": 131.76, - "end_time": 131.82 - }, - { - "text": "join", - "start_time": 131.82, - "end_time": 132.04 + "start_time": 104.66, + "end_time": 104.74 }, { "text": " ", - "start_time": 132.04, - "end_time": 132.08 + "start_time": 104.74, + "end_time": 104.78 }, { "text": "the", - "start_time": 132.08, - "end_time": 132.18 + "start_time": 104.78, + "end_time": 104.86 }, { "text": " ", - "start_time": 132.18, - "end_time": 132.2 + "start_time": 104.86, + "end_time": 104.9 }, { - "text": "waitlist", - "start_time": 132.2, - "end_time": 132.68 + "text": "link's", + "start_time": 104.9, + "end_time": 105.16 }, { "text": " ", - "start_time": 132.68, - "end_time": 132.72 + "start_time": 105.16, + "end_time": 105.2 }, { - "text": "for", - "start_time": 132.72, - "end_time": 132.8 + "text": "in", + "start_time": 105.2, + "end_time": 105.26 }, { "text": " ", - "start_time": 132.8, - "end_time": 132.84 + "start_time": 105.26, + "end_time": 105.3 }, { "text": "the", - "start_time": 132.84, - "end_time": 132.92 + "start_time": 105.3, + "end_time": 105.38 }, { "text": " ", - "start_time": 132.92, - "end_time": 132.96 + "start_time": 105.38, + "end_time": 105.4 }, { - "text": "cloud.", - "start_time": 132.96, - "end_time": 133.36 + "text": "description.", + "start_time": 105.4, + "end_time": 105.96 } ] } diff --git a/product-demo/assets/narration.mp3 b/product-demo/assets/narration.mp3 index 6565cd0..f17e968 100644 Binary files a/product-demo/assets/narration.mp3 and b/product-demo/assets/narration.mp3 differ diff --git a/product-demo/assets/ui/a1-batch.png b/product-demo/assets/ui/a1-batch.png index 972e6dc..8911620 100644 Binary files a/product-demo/assets/ui/a1-batch.png and b/product-demo/assets/ui/a1-batch.png differ diff --git a/product-demo/assets/ui/a2-layout.png b/product-demo/assets/ui/a2-layout.png deleted file mode 100644 index de9a915..0000000 Binary files a/product-demo/assets/ui/a2-layout.png and /dev/null differ diff --git a/product-demo/assets/ui/a2-next.png b/product-demo/assets/ui/a2-next.png new file mode 100644 index 0000000..35d9735 Binary files /dev/null and b/product-demo/assets/ui/a2-next.png differ diff --git a/product-demo/assets/ui/a3-next.png b/product-demo/assets/ui/a3-next.png new file mode 100644 index 0000000..7d60239 Binary files /dev/null and b/product-demo/assets/ui/a3-next.png differ diff --git a/product-demo/assets/ui/a4-accepted1.png b/product-demo/assets/ui/a4-accepted1.png new file mode 100644 index 0000000..5519e48 Binary files /dev/null and b/product-demo/assets/ui/a4-accepted1.png differ diff --git a/product-demo/assets/ui/a5-after-first.png b/product-demo/assets/ui/a5-after-first.png new file mode 100644 index 0000000..732420a Binary files /dev/null and b/product-demo/assets/ui/a5-after-first.png differ diff --git a/product-demo/assets/ui/a8-dialog2.png b/product-demo/assets/ui/a8-dialog2.png new file mode 100644 index 0000000..34595c4 Binary files /dev/null and b/product-demo/assets/ui/a8-dialog2.png differ diff --git a/product-demo/assets/ui/a9-after2.png b/product-demo/assets/ui/a9-after2.png new file mode 100644 index 0000000..2def5d4 Binary files /dev/null and b/product-demo/assets/ui/a9-after2.png differ diff --git a/product-demo/assets/ui/b1-layout-story.png b/product-demo/assets/ui/b1-layout-story.png deleted file mode 100644 index 5786ef3..0000000 Binary files a/product-demo/assets/ui/b1-layout-story.png and /dev/null differ diff --git a/product-demo/assets/ui/b2-stacked-a.png b/product-demo/assets/ui/b2-stacked-a.png deleted file mode 100644 index 9401711..0000000 Binary files a/product-demo/assets/ui/b2-stacked-a.png and /dev/null differ diff --git a/product-demo/assets/ui/b3-stacked-b.png b/product-demo/assets/ui/b3-stacked-b.png deleted file mode 100644 index 5c437bc..0000000 Binary files a/product-demo/assets/ui/b3-stacked-b.png and /dev/null differ diff --git a/product-demo/assets/ui/c1-dialog.png b/product-demo/assets/ui/c1-dialog.png deleted file mode 100644 index 9785b17..0000000 Binary files a/product-demo/assets/ui/c1-dialog.png and /dev/null differ diff --git a/product-demo/assets/ui/c2-approved.png b/product-demo/assets/ui/c2-approved.png deleted file mode 100644 index 1fb30bc..0000000 Binary files a/product-demo/assets/ui/c2-approved.png and /dev/null differ diff --git a/product-demo/assets/ui/d1-search.png b/product-demo/assets/ui/d1-search.png index f05fd13..ea613d9 100644 Binary files a/product-demo/assets/ui/d1-search.png and b/product-demo/assets/ui/d1-search.png differ diff --git a/product-demo/assets/ui/d2-dark.png b/product-demo/assets/ui/d2-dark.png index 9dadee3..9ba3370 100644 Binary files a/product-demo/assets/ui/d2-dark.png and b/product-demo/assets/ui/d2-dark.png differ diff --git a/product-demo/assets/ui/d3-stacked.png b/product-demo/assets/ui/d3-stacked.png new file mode 100644 index 0000000..49d01c0 Binary files /dev/null and b/product-demo/assets/ui/d3-stacked.png differ diff --git a/product-demo/assets/ui/d4-dark-golden.png b/product-demo/assets/ui/d4-dark-golden.png deleted file mode 100644 index 802efb3..0000000 Binary files a/product-demo/assets/ui/d4-dark-golden.png and /dev/null differ diff --git a/product-demo/assets/ui/d4-golden.png b/product-demo/assets/ui/d4-golden.png new file mode 100644 index 0000000..917e390 Binary files /dev/null and b/product-demo/assets/ui/d4-golden.png differ diff --git a/product-demo/assets/ui/d5-current.png b/product-demo/assets/ui/d5-current.png new file mode 100644 index 0000000..49d01c0 Binary files /dev/null and b/product-demo/assets/ui/d5-current.png differ diff --git a/product-demo/assets/ui/d5-dark-current.png b/product-demo/assets/ui/d5-dark-current.png deleted file mode 100644 index e6eaa7e..0000000 Binary files a/product-demo/assets/ui/d5-dark-current.png and /dev/null differ diff --git a/product-demo/assets/ui/dark-before.png b/product-demo/assets/ui/dark-before.png index 11665cf..16a6733 100644 Binary files a/product-demo/assets/ui/dark-before.png and b/product-demo/assets/ui/dark-before.png differ diff --git a/product-demo/assets/ui/e0-stacked.png b/product-demo/assets/ui/e0-stacked.png new file mode 100644 index 0000000..5381fd7 Binary files /dev/null and b/product-demo/assets/ui/e0-stacked.png differ diff --git a/product-demo/assets/ui/e2-box.png b/product-demo/assets/ui/e2-box.png deleted file mode 100644 index da45ce4..0000000 Binary files a/product-demo/assets/ui/e2-box.png and /dev/null differ diff --git a/product-demo/assets/ui/e2-hunk.png b/product-demo/assets/ui/e2-hunk.png new file mode 100644 index 0000000..d03dc8c Binary files /dev/null and b/product-demo/assets/ui/e2-hunk.png differ diff --git a/product-demo/assets/ui/f1-note-typed.png b/product-demo/assets/ui/f1-note-typed.png deleted file mode 100644 index d77b548..0000000 Binary files a/product-demo/assets/ui/f1-note-typed.png and /dev/null differ diff --git a/product-demo/assets/ui/f1-typed.png b/product-demo/assets/ui/f1-typed.png new file mode 100644 index 0000000..bba0ade Binary files /dev/null and b/product-demo/assets/ui/f1-typed.png differ diff --git a/product-demo/assets/ui/f3-added.png b/product-demo/assets/ui/f3-added.png new file mode 100644 index 0000000..bc32812 Binary files /dev/null and b/product-demo/assets/ui/f3-added.png differ diff --git a/product-demo/assets/ui/f3-note-added.png b/product-demo/assets/ui/f3-note-added.png deleted file mode 100644 index f84e71a..0000000 Binary files a/product-demo/assets/ui/f3-note-added.png and /dev/null differ diff --git a/product-demo/assets/ui/g1-sent.png b/product-demo/assets/ui/g1-sent.png index 923f511..170fc3d 100644 Binary files a/product-demo/assets/ui/g1-sent.png and b/product-demo/assets/ui/g1-sent.png differ diff --git a/product-demo/assets/ui/h1-newer.png b/product-demo/assets/ui/h1-newer.png deleted file mode 100644 index 59b3d81..0000000 Binary files a/product-demo/assets/ui/h1-newer.png and /dev/null differ diff --git a/product-demo/assets/ui/h2-replied.png b/product-demo/assets/ui/h2-replied.png index 4e44237..520d65a 100644 Binary files a/product-demo/assets/ui/h2-replied.png and b/product-demo/assets/ui/h2-replied.png differ diff --git a/product-demo/assets/ui/i4-resolved.png b/product-demo/assets/ui/i4-resolved.png deleted file mode 100644 index a9bcde8..0000000 Binary files a/product-demo/assets/ui/i4-resolved.png and /dev/null differ diff --git a/product-demo/assets/ui/j1-batch.png b/product-demo/assets/ui/j1-batch.png deleted file mode 100644 index 27b3692..0000000 Binary files a/product-demo/assets/ui/j1-batch.png and /dev/null differ diff --git a/product-demo/assets/ui/j2-batch.png b/product-demo/assets/ui/j2-batch.png new file mode 100644 index 0000000..336bc50 Binary files /dev/null and b/product-demo/assets/ui/j2-batch.png differ diff --git a/product-demo/assets/ui/k0-before.png b/product-demo/assets/ui/k0-before.png new file mode 100644 index 0000000..e0fcd1a Binary files /dev/null and b/product-demo/assets/ui/k0-before.png differ diff --git a/product-demo/assets/ui/k1-dialog.png b/product-demo/assets/ui/k1-dialog.png index b0f6808..a11bcae 100644 Binary files a/product-demo/assets/ui/k1-dialog.png and b/product-demo/assets/ui/k1-dialog.png differ diff --git a/product-demo/assets/ui/k2-all-approved.png b/product-demo/assets/ui/k2-all-approved.png deleted file mode 100644 index 95e2533..0000000 Binary files a/product-demo/assets/ui/k2-all-approved.png and /dev/null differ diff --git a/product-demo/assets/ui/k2-done.png b/product-demo/assets/ui/k2-done.png new file mode 100644 index 0000000..28f664b Binary files /dev/null and b/product-demo/assets/ui/k2-done.png differ diff --git a/product-demo/assets/ui/m1-commits.png b/product-demo/assets/ui/m1-commits.png new file mode 100644 index 0000000..02fb837 Binary files /dev/null and b/product-demo/assets/ui/m1-commits.png differ diff --git a/product-demo/assets/ui/m1-github-commits.png b/product-demo/assets/ui/m1-github-commits.png deleted file mode 100644 index 23df096..0000000 Binary files a/product-demo/assets/ui/m1-github-commits.png and /dev/null differ diff --git a/product-demo/assets/ui/m1b-github-status.png b/product-demo/assets/ui/m1b-github-status.png deleted file mode 100644 index 2f8d7f9..0000000 Binary files a/product-demo/assets/ui/m1b-github-status.png and /dev/null differ diff --git a/product-demo/assets/ui/m2-hosted-batch.png b/product-demo/assets/ui/m2-hosted-batch.png deleted file mode 100644 index cda36b8..0000000 Binary files a/product-demo/assets/ui/m2-hosted-batch.png and /dev/null differ diff --git a/product-demo/assets/ui/m2-status.png b/product-demo/assets/ui/m2-status.png new file mode 100644 index 0000000..82ec534 Binary files /dev/null and b/product-demo/assets/ui/m2-status.png differ diff --git a/product-demo/assets/ui/n1-hosted-dark.png b/product-demo/assets/ui/n1-hosted-dark.png new file mode 100644 index 0000000..51d37e8 Binary files /dev/null and b/product-demo/assets/ui/n1-hosted-dark.png differ diff --git a/product-demo/assets/ui/n2-hover.png b/product-demo/assets/ui/n2-hover.png new file mode 100644 index 0000000..1f5592d Binary files /dev/null and b/product-demo/assets/ui/n2-hover.png differ diff --git a/product-demo/assets/ui/n3-stream01.png b/product-demo/assets/ui/n3-stream01.png new file mode 100644 index 0000000..59eff66 Binary files /dev/null and b/product-demo/assets/ui/n3-stream01.png differ diff --git a/product-demo/assets/ui/n3-stream02.png b/product-demo/assets/ui/n3-stream02.png new file mode 100644 index 0000000..983eed3 Binary files /dev/null and b/product-demo/assets/ui/n3-stream02.png differ diff --git a/product-demo/assets/ui/n3-stream03.png b/product-demo/assets/ui/n3-stream03.png new file mode 100644 index 0000000..d5b4093 Binary files /dev/null and b/product-demo/assets/ui/n3-stream03.png differ diff --git a/product-demo/assets/ui/n3-stream04.png b/product-demo/assets/ui/n3-stream04.png new file mode 100644 index 0000000..2188a3c Binary files /dev/null and b/product-demo/assets/ui/n3-stream04.png differ diff --git a/product-demo/assets/ui/n3-stream05.png b/product-demo/assets/ui/n3-stream05.png new file mode 100644 index 0000000..827904b Binary files /dev/null and b/product-demo/assets/ui/n3-stream05.png differ diff --git a/product-demo/assets/ui/n3-stream06.png b/product-demo/assets/ui/n3-stream06.png new file mode 100644 index 0000000..c5495c7 Binary files /dev/null and b/product-demo/assets/ui/n3-stream06.png differ diff --git a/product-demo/assets/ui/n3-stream07.png b/product-demo/assets/ui/n3-stream07.png new file mode 100644 index 0000000..c5495c7 Binary files /dev/null and b/product-demo/assets/ui/n3-stream07.png differ diff --git a/product-demo/assets/ui/points.json b/product-demo/assets/ui/points.json index f0ae5d9..04468d4 100644 --- a/product-demo/assets/ui/points.json +++ b/product-demo/assets/ui/points.json @@ -1,61 +1,97 @@ { -"a1-batch": [ +"a0-early": [ 1000, 500 ], -"a2-layout": [ +"a1-batch": [ 1000, 500 ], -"b1-layout-story": [ -200, -177 +"a2-next": [ +436, +272 ], -"b2-stacked-a": [ -200, -177 +"a3-next": [ +436, +272 ], -"b3-stacked-b": [ -200, -177 +"a4-accepted1": [ +1407, +234 +], +"a5-after-first": [ +948, +654 ], -"c1-dialog": [ -1078, -462 +"a6-dialog2": [ +1407, +234 ], -"c2-approved": [ +"a7-after2": [ +1407, +234 +], +"a6-dialog3": [ +1407, +234 +], +"a7-after3": [ +1407, +234 +], +"a6-dialog4": [ +1407, +234 +], +"a7-after4": [ +1407, +234 +], +"a8-dialog2": [ +800, +450 +], +"a9-after2": [ 947, -644 +654 ], "d1-search": [ -1000, -500 +947, +654 ], "d2-dark": [ 148, 177 ], -"d4-dark-golden": [ +"d3-stacked": [ 148, 177 ], -"d5-dark-current": [ +"d4-golden": [ 148, 177 ], -"e2-box": [ -1514, -677 +"d5-current": [ +148, +177 ], -"f1-note-typed": [ +"e0-stacked": [ 800, 450 ], -"f2-note-hover": [ +"e2-hunk": [ +922, +729 +], +"f1-typed": [ +922, +729 +], +"f2-hover": [ 1533, 565 ], -"f3-note-added": [ +"f3-added": [ 1533, 565 ], @@ -75,28 +111,72 @@ 648, 573 ], +"j0-batch": [ +1000, +500 +], "j1-batch": [ 1000, 500 ], -"k1-dialog": [ -1385, -612 +"n1-hosted-dark": [ +1000, +500 ], -"k2-all-approved": [ -948, -644 +"n2-hover": [ +422, +360 +], +"n3-stream01": [ +422, +360 +], +"n3-stream02": [ +422, +360 +], +"n3-stream03": [ +422, +360 +], +"n3-stream04": [ +422, +360 +], +"n3-stream05": [ +422, +360 ], -"m2-hosted-batch": [ +"n3-stream06": [ +422, +360 +], +"n3-stream07": [ +422, +360 +], +"m1-commits": [ +1000, +500 +], +"m2-status": [ +567, +389 +], +"j2-batch": [ 1000, 500 ], -"m1-github-commits": [ +"k0-before": [ 1000, 500 ], -"m1b-github-status": [ -454, -384 +"k1-dialog": [ +1385, +450 +], +"k2-done": [ +948, +644 ] -} +} \ No newline at end of file diff --git a/product-demo/build.mjs b/product-demo/build.mjs index 18c06f2..f50deac 100644 --- a/product-demo/build.mjs +++ b/product-demo/build.mjs @@ -1,6 +1,6 @@ // Generates index.html, compositions/captions.html and the subtitle files from SCRIPT.md, scenes.json and the voiceover. // SCRIPT.md owns the words, the voiceover's timing file owns when they happen, compositions/.html owns the pictures. -import { readFileSync, writeFileSync } from "node:fs"; +import { existsSync, readFileSync, writeFileSync } from "node:fs"; const AUDIO = "assets/narration.mp3"; const TIMING = "assets/narration-timing.json"; @@ -14,9 +14,24 @@ if (narration.length !== scenes.length) { } const plain = (w) => w.toLowerCase().replace(/[^a-z0-9]/g, ""); +// Until there's a voiceover, a word lasts by its length, and punctuation pauses. +function estimate() { + let clock = 0.12; + return narration.map((paragraph) => { + const words = paragraph.split(/\s+/).map((text) => { + const start = clock; + const end = start + ((text.length + 1) * (/\d/.test(text) ? 2.2 : 1)) / 18; + clock = end + (/[.?!:]$/.test(text) ? 0.32 : /,$/.test(text) ? 0.14 : 0); + return { text, start, end }; + }); + clock += 0.2; + return words; + }); +} + // Each word of the script takes its time from what the voice said, and a difference is an error. function fromVoice() { - const SPOKEN_AS = { "1": ["one"], "0": ["zero"], "13": ["thirteen"], twentyfive: ["25"] }; + const SPOKEN_AS = { "0": ["zero"], "13": ["thirteen"], "30": ["thirty"], "63": ["sixtythree"], "142": ["onefortytwo"] }; const spoken = JSON.parse(readFileSync(TIMING, "utf8")) .segments.flatMap((s) => s.words) .filter((w) => w.text.trim()) @@ -35,7 +50,9 @@ function fromVoice() { return words; } -const wordsByScene = fromVoice(); +const hasVoice = existsSync(TIMING); +const wordsByScene = hasVoice ? fromVoice() : estimate(); +if (!hasVoice) console.warn("No voiceover yet, so timing is estimated."); const timed = scenes.map((s, i) => { const start = i === 0 ? 0 : wordsByScene[i][0].start - LEAD_IN; @@ -120,8 +137,7 @@ writeFileSync(
${hosts}
- -
+${hasVoice ? ` \n` : ""} diff --git a/product-demo/compositions/approve.html b/product-demo/compositions/approve.html deleted file mode 100644 index 41127c4..0000000 --- a/product-demo/compositions/approve.html +++ /dev/null @@ -1,21 +0,0 @@ - diff --git a/product-demo/compositions/ask.html b/product-demo/compositions/ask.html index 5d7eeba..c2fe172 100644 --- a/product-demo/compositions/ask.html +++ b/product-demo/compositions/ask.html @@ -7,24 +7,21 @@ diff --git a/product-demo/compositions/batch.html b/product-demo/compositions/batch.html deleted file mode 100644 index a73b3ac..0000000 --- a/product-demo/compositions/batch.html +++ /dev/null @@ -1,20 +0,0 @@ - diff --git a/product-demo/compositions/captions.html b/product-demo/compositions/captions.html index ce8b0c2..a898a32 100644 --- a/product-demo/compositions/captions.html +++ b/product-demo/compositions/captions.html @@ -10,60 +10,51 @@ }
-
I asked my coding agent for one small thing:
-
give the top bar a bit more room.
-
It changed two lines of CSS.
-
Looks fine, right?
-
So the agent runs selfie review.
-
That renders every story in our Storybook,
-
124 of them, in a pinned container,
-
right here on this MacBook Air.
-
Twenty-five seconds, with no cloud and no bill per image.
-
What comes back is one JSON document and an exit code,
-
so any agent can read it.
-
Exit 1, because that two-line
-
change touched all 124 stories.
-
Now it’s my turn.
-
The selfie ui command opens the same review for a person:
-
124 changed, and nothing decided yet.
-
That’s a lot to look at,
-
but Selfie works out what kind of change each one is.
-
48 of them only moved or gained spacing,
-
with nothing new in the image.
-
Here’s one.
-
Yellow is spacing that grew.
-
Press F, and the two images flip in place,
-
so you can see exactly what moved.
-
That looks right, so I approve those 48 together.
-
But what about dark mode?
-
I search for dark, and there it is:
-
85,000 changed pixels.
-
The agent hard-coded a light color,
-
and the top bar went white.
-
I don’t have to describe where.
-
I click the change, write what’s wrong,
-
and send it to the agent, which has been waiting.
-
The agent gets my words, the story, the exact box,
-
and a picture of what I saw.
-
It puts the theme’s color back,
-
renders again, and answers my note.
-
Selfie tells me there’s a newer batch,
-
and the reply is right there on the story.
-
The bar is dark again, and 85,000
-
changed pixels are down to 13.
-
I resolve the note, and approve the rest.
-
The 48 I already approved are simply unchanged now,
-
because an approval follows your Git history.
-
The agent commits and reviews once more.
-
It’s the exact same build, so nothing renders.
-
A third of a second, and exit 0.
-
Push it, and Selfie renders in CI
-
and puts a status on the commit.
-
Click through, and it’s the same review, in the cloud.
-
Selfie works with any coding agent.
-
If you have a Storybook,
-
start locally today at selfie.dev,
-
and join the waitlist for the cloud.
+
I asked my coding agent to give
+
the top bar a bit more room.
+
Two lines of CSS.
+
Then it runs selfie render.
+
That renders all 142 stories in a pinned container,
+
right here on this MacBook Air, in under 30 seconds,
+
with no cloud and no bill per image.
+
Now it’s my turn.
+
The selfie ui command shows me what changed:
+
those two lines touched every story.
+
But Selfie has already found the
+
changes repeated across them.
+
I look through them, accept them,
+
and 63 of the 142 are done.
+
But what about dark mode?
+
I search for dark, and there it is:
+
85,000 changed pixels.
+
Press F, and the images swap in place.
+
The top bar went white.
+
Selfie can tell me exactly which
+
pixels changed, but not why.
+
The commit is on GitHub,
+
so I open the same story in the cloud,
+
and ask Muse Spark what caused it.
+
It reads the before, the after, the diff,
+
and the code, and it finds the line.
+
Then it spots what I never asked for:
+
a fixed light color, where the theme’s color used to be.
+
It even tells me to check dark mode.
+
So back in my review, I click the change, write a note,
+
and send it to the agent, which has been waiting.
+
It gets my words, the exact box,
+
and a picture of what I saw.
+
It puts the theme’s color back,
+
renders again, and answers my note.
+
The bar is dark again, and 85,000
+
changed pixels are down to 13.
+
I approve the rest, and the agent
+
commits and reviews once more.
+
It’s the exact same build, so nothing renders.
+
Under half a second, and exit 0.
+
Selfie works with any coding agent.
+
If you have a Storybook,
+
you can start locally today,
+
and the link’s in the description.
diff --git a/product-demo/compositions/dark.html b/product-demo/compositions/dark.html index 2acbc8b..467e8f6 100644 --- a/product-demo/compositions/dark.html +++ b/product-demo/compositions/dark.html @@ -7,22 +7,23 @@ diff --git a/product-demo/compositions/decide.html b/product-demo/compositions/decide.html deleted file mode 100644 index d2b47d1..0000000 --- a/product-demo/compositions/decide.html +++ /dev/null @@ -1,30 +0,0 @@ - diff --git a/product-demo/compositions/deltas.html b/product-demo/compositions/deltas.html new file mode 100644 index 0000000..4602124 --- /dev/null +++ b/product-demo/compositions/deltas.html @@ -0,0 +1,38 @@ + diff --git a/product-demo/compositions/end.html b/product-demo/compositions/end.html index 5946796..30c9178 100644 --- a/product-demo/compositions/end.html +++ b/product-demo/compositions/end.html @@ -11,11 +11,11 @@ const white = S.html(stage, `
`); stage.style.background = "var(--sun)"; tl.to(white, { opacity: 0, duration: 0.4, ease: "power2.out" }, 0.02); - const logo = S.html(stage, `
selfie.dev
`); - gsap.set(logo, { x: 110, y: 240 }); + const logo = S.html(stage, `
Selfie
`); + gsap.set(logo, { x: 110, y: 190 }); tl.fromTo(logo, { scale: 1.05, transformOrigin: "0 50%" }, { scale: 1, duration: 0.6, ease: "expo.out" }, 0.02); - [["Works with any coding agent.", 500, 0.25], ["Start locally today.", 580, w("start") - 0.05], ["Join the waitlist for the cloud.", 660, w("join") - 0.05]].forEach(([text, y, t]) => { - const line = S.html(stage, `
${text}
`); + [["Works with any coding agent.", 510, 0.25], ["Start locally today.", 590, w("start") - 0.05], ["github.com/diffplug/selfie-hackathon", 700, w("links") - 0.05]].forEach(([text, y, t], i) => { + const line = S.html(stage, `
${text}
`); gsap.set(line, { x: 120, y, opacity: 0 }); tl.to(line, { opacity: 1, duration: 0.18 }, t); }); diff --git a/product-demo/compositions/final.html b/product-demo/compositions/final.html deleted file mode 100644 index 7df6d04..0000000 --- a/product-demo/compositions/final.html +++ /dev/null @@ -1,30 +0,0 @@ - diff --git a/product-demo/compositions/finish.html b/product-demo/compositions/finish.html new file mode 100644 index 0000000..9f42542 --- /dev/null +++ b/product-demo/compositions/finish.html @@ -0,0 +1,36 @@ + diff --git a/product-demo/compositions/fix.html b/product-demo/compositions/fix.html index 36497dd..11d2aff 100644 --- a/product-demo/compositions/fix.html +++ b/product-demo/compositions/fix.html @@ -10,14 +10,12 @@ const { tl, w, stage, D } = S.begin("fix"); const t = S.term(stage); t.write(tl, [ - [0.15, `- background: #f6f8fa;`, { row: 0 }], - [0.15, `+ background: var(--bgColor-muted);`, { row: 1, hl: true }], - [w("renders") - 0.15, `$ selfie render --build`, { row: 3 }], - [w("again") - 0.2, `Recorded batch f070fed9-aa47-45f6-b2eb-f06c2a550093: 124 stories.`, { row: 4 }], - [w("again") - 0.2, `Timings: render 18943 ms, store 587 ms, total 22423 ms`, { row: 5 }], - [w("answers") - 0.1, `$ selfie reply 1 "That was me: I hard-coded the light theme's color.`, { row: 7 }], - [w("answers") - 0.1, ` It's back on the --bgColor-muted token, so it follows the theme."`, { row: 8 }], - [w("note") - 0.05, `{ "imageChanged": true … }`, { row: 9, hl: true }], + [0.1, `- background: #f6f8fa;`, { row: 0 }], + [0.1, `+ background: var(--bgColor-muted);`, { row: 1, hl: true }], + [w("renders") - 0.1, `$ selfie render --build`, { row: 3 }], + [w("again"), `Timings: render 23339 ms, store 913 ms, total 27179 ms`, { row: 4 }], + [w("answers") - 0.05, `$ selfie reply 1 "That was me: I hard-coded the light theme's color.`, { row: 6 }], + [w("answers") - 0.05, ` It's back on the --bgColor-muted token, so it follows the theme."`, { row: 7 }], ]); S.slideOut(tl, t.win, D); window.__timelines["fix"] = tl; diff --git a/product-demo/compositions/flip.html b/product-demo/compositions/flip.html deleted file mode 100644 index a314073..0000000 --- a/product-demo/compositions/flip.html +++ /dev/null @@ -1,27 +0,0 @@ - diff --git a/product-demo/compositions/json.html b/product-demo/compositions/json.html deleted file mode 100644 index 20f5714..0000000 --- a/product-demo/compositions/json.html +++ /dev/null @@ -1,34 +0,0 @@ - diff --git a/product-demo/compositions/layout.html b/product-demo/compositions/layout.html deleted file mode 100644 index eb9a4b5..0000000 --- a/product-demo/compositions/layout.html +++ /dev/null @@ -1,24 +0,0 @@ - diff --git a/product-demo/compositions/muse.html b/product-demo/compositions/muse.html new file mode 100644 index 0000000..19556ea --- /dev/null +++ b/product-demo/compositions/muse.html @@ -0,0 +1,35 @@ + diff --git a/product-demo/compositions/note.html b/product-demo/compositions/note.html index 2b43930..ec06073 100644 --- a/product-demo/compositions/note.html +++ b/product-demo/compositions/note.html @@ -8,27 +8,25 @@ diff --git a/product-demo/compositions/render.html b/product-demo/compositions/render.html index 6a3a11b..6841c75 100644 --- a/product-demo/compositions/render.html +++ b/product-demo/compositions/render.html @@ -7,25 +7,25 @@ diff --git a/product-demo/compositions/verify.html b/product-demo/compositions/verify.html index d59def8..3b0fb3f 100644 --- a/product-demo/compositions/verify.html +++ b/product-demo/compositions/verify.html @@ -8,20 +8,16 @@ - + -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+