retake-demos 0.2.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/site/index.html DELETED
@@ -1,158 +0,0 @@
1
- <!doctype html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1" />
6
- <title>Retake — rerun the demo, don't re-record it</title>
7
- <meta name="description" content="Retake turns a plain-English walkthrough into a repeatable video of your real app. Your agent writes the flow; Retake checks it, records it, and keeps it rerunnable." />
8
- <style>
9
- :root { --paper:#edefe8; --card:#f8f9f5; --ink:#191d19; --muted:#767e74; --rule:#dbdfd3; --rule2:#c9cec0; --accent:#1a1c1e; --amber:#e8b04b; }
10
- * { box-sizing:border-box; }
11
- body { margin:0; background:var(--paper); color:var(--ink); font:16px/1.7 -apple-system, BlinkMacSystemFont, "SF Pro Text", "Helvetica Neue", Inter, Arial, sans-serif; -webkit-font-smoothing:antialiased; }
12
- .top { display:flex; align-items:center; gap:10px; padding:18px 26px; max-width:880px; margin:0 auto; }
13
- .mark { width:26px; height:26px; border-radius:8px; background:var(--accent); position:relative; flex:none; }
14
- .mark i { position:absolute; left:6.5px; height:3px; border-radius:2px; background:#eceee9; }
15
- .mark i:nth-child(1){top:5px;width:5px;opacity:.55} .mark i:nth-child(2){top:10px;width:8px;opacity:.8} .mark i:nth-child(3){top:15px;width:13px;background:var(--amber)} .mark i:nth-child(4){top:20px;width:8px;opacity:.8}
16
- .top b { font-size:17px; letter-spacing:-.01em; }
17
- .top .sp { flex:1; }
18
- .top a { color:var(--muted); text-decoration:none; font-size:14px; margin-left:18px; }
19
- .top a:hover { color:var(--ink); }
20
- main { max-width:880px; margin:0 auto; padding:30px 26px 90px; }
21
- .hero { padding:40px 0 30px; }
22
- .kicker { font:12px ui-monospace, Menlo, monospace; letter-spacing:.09em; text-transform:uppercase; color:var(--muted); margin:0 0 14px; }
23
- h1 { font-size:clamp(34px, 6vw, 54px); line-height:1.08; letter-spacing:-.025em; margin:0 0 18px; }
24
- h1 em { font-style:normal; color:var(--muted); }
25
- .lede { font-size:19px; color:var(--muted); max-width:620px; margin:0 0 28px; }
26
- .actions { display:flex; gap:10px; flex-wrap:wrap; }
27
- .btn { display:inline-block; text-decoration:none; border-radius:12px; padding:12px 22px; font-size:15px; }
28
- .btn.dark { background:var(--accent); color:#eceee9; }
29
- .btn.dark:hover { opacity:.9; }
30
- .btn.light { border:1px solid var(--rule2); color:var(--ink); background:#fff; }
31
- .btn.light:hover { border-color:var(--ink); }
32
- .say { background:var(--card); border:1px solid var(--rule); border-radius:14px; padding:16px 20px; margin:46px 0 10px; font-size:17px; }
33
- .say .who { font:11px ui-monospace, Menlo, monospace; letter-spacing:.07em; text-transform:uppercase; color:var(--muted); display:block; margin-bottom:6px; }
34
- .say i { font-style:normal; }
35
- .arrow { text-align:center; color:var(--muted); margin:8px 0; }
36
- .videos { display:grid; gap:26px; margin:14px 0 0; }
37
- .shot { border:1px solid var(--rule2); border-radius:14px; overflow:hidden; background:#111; box-shadow:0 14px 40px rgba(24,28,24,.12); }
38
- .shot video { width:100%; height:auto; display:block; }
39
- .shot figcaption { background:var(--card); padding:12px 18px 14px; font-size:14px; color:var(--muted); }
40
- .shot figcaption b { color:var(--ink); font-weight:600; }
41
- section { margin-top:72px; }
42
- h2 { font-size:24px; letter-spacing:-.015em; margin:0 0 8px; }
43
- .sub { color:var(--muted); margin:0 0 26px; max-width:560px; }
44
- .grid { display:grid; grid-template-columns:repeat(auto-fit, minmax(240px, 1fr)); gap:14px; }
45
- .cell { background:var(--card); border:1px solid var(--rule); border-radius:14px; padding:18px 20px; }
46
- .cell b { display:block; margin-bottom:6px; font-size:15px; }
47
- .cell p { margin:0; font-size:14px; color:var(--muted); line-height:1.6; }
48
- .how { counter-reset:step; }
49
- .step { display:flex; gap:16px; padding:14px 0; border-bottom:1px solid var(--rule); }
50
- .step:last-child { border-bottom:0; }
51
- .step::before { counter-increment:step; content:counter(step); flex:none; width:28px; height:28px; border-radius:50%; background:var(--accent); color:#eceee9; display:flex; align-items:center; justify-content:center; font-size:13px; margin-top:2px; }
52
- .step b { display:block; }
53
- .step p { margin:2px 0 0; color:var(--muted); font-size:14.5px; }
54
- pre { background:var(--card); border:1px solid var(--rule); border-radius:12px; padding:16px 20px; overflow-x:auto; font:14px/1.8 ui-monospace, Menlo, monospace; }
55
- pre .c { color:var(--muted); }
56
- .foot { margin-top:80px; padding-top:22px; border-top:1px solid var(--rule); color:var(--muted); font-size:13.5px; display:flex; gap:18px; flex-wrap:wrap; }
57
- .foot a { color:inherit; }
58
- </style>
59
- </head>
60
- <body>
61
- <div class="top">
62
- <div class="mark"><i></i><i></i><i></i><i></i></div>
63
- <b>Retake</b>
64
- <span class="sp"></span>
65
- <a href="https://github.com/glebbogachev00/retake">GitHub</a>
66
- </div>
67
- <main>
68
- <div class="hero">
69
- <p class="kicker">Product demos, as code</p>
70
- <h1>Rerun the demo.<br><em>Don't re-record it.</em></h1>
71
- <p class="lede">Retake turns a plain-English walkthrough into a repeatable video of your real app. Your coding agent writes the flow. Retake checks it, drives the browser, records in 1080p, and lets you rerun the same demo when the UI changes.</p>
72
- <div class="actions">
73
- <a class="btn dark" href="#start">Paste the prompt</a>
74
- <a class="btn light" href="#proof">Watch a demo</a>
75
- </div>
76
- </div>
77
-
78
- <div class="say"><span class="who">You, to the agent you already use</span><i>“Record a demo of my app at localhost:3000 showing the sign-up flow.”</i></div>
79
- <p class="arrow">↓</p>
80
- <div class="videos" id="proof" style="scroll-margin-top:20px"></div>
81
-
82
- <section id="start">
83
- <h2>Paste this to your agent</h2>
84
- <p class="sub">Ask from the coding agent you already use. It installs Retake, registers the tools, and produces the first take. Or do the two commands yourself and just ask for the demo.</p>
85
- <div class="say" style="margin-top:0"><span class="who">In Claude Code, Codex, Hermes, or another coding agent</span><i>“Install retake-demos from npm (npm i -g retake-demos, then retake install in a new folder), then record a demo of my app at localhost:3000 showing the checkout flow.”</i></div>
86
- <p class="sub" style="margin:14px 0 0">After setup, each demo starts as a sentence and ends as files you can inspect, rerender, or rerun.</p>
87
- </section>
88
-
89
- <section id="how">
90
- <h2>How it works</h2>
91
- <p class="sub">You provide intent. The agent writes the flow. Retake verifies, records, and renders it.</p>
92
- <div class="how">
93
- <div class="step"><div><b>You ask</b><p>"Record a demo of checkout." That sentence is the brief for the agent you already use.</p></div></div>
94
- <div class="step"><div><b>Your agent builds and checks the flow</b><p>It reads your app, writes a small YAML demo, and dry-runs every selector and wait. Nothing records until the walkthrough works.</p></div></div>
95
- <div class="step"><div><b>Retake records the real interaction</b><p>Real typing, real clicks, real waits. The result is demo.mp4, a still for each scene, and a proof log of what happened.</p></div></div>
96
- <div class="step"><div><b>You revise without starting over</b><p>Change captions, zoom, layout, or format in seconds. When the UI changes, rerun the same flow instead of recording by hand.</p></div></div>
97
- </div>
98
- </section>
99
-
100
- <section>
101
- <h2>What people record</h2>
102
- <p class="sub">One engine, different audiences. Because the demo is a file, each version is a rerun, not a fresh recording session.</p>
103
- <div class="grid">
104
- <div class="cell"><b>Client walkthroughs</b><p>Show the flow they asked about without booking a call. When the question changes, adjust the file and send a fresh take.</p></div>
105
- <div class="cell"><b>Launches and social</b><p>Render the same interaction as landscape, square, or vertical. Ship the feature, then post the 20 seconds that show it.</p></div>
106
- <div class="cell"><b>Docs and onboarding</b><p>README GIFs, first-run walkthroughs, and help-page clips can be regenerated when the UI changes.</p></div>
107
- <div class="cell"><b>Regression proof</b><p>The dry run walks every step in seconds. A demo that fails when your app breaks is both a visible repro and a useful check.</p></div>
108
- </div>
109
- </section>
110
-
111
- <section>
112
- <h2>What's in the box</h2>
113
- <p class="sub">Everything required to produce the same clean take again.</p>
114
- <div class="grid">
115
- <div class="cell"><b>Scenes with captions</b><p>Captions are timed from the actual run and placed outside the product frame.</p></div>
116
- <div class="cell"><b>Render-time camera</b><p>Zoom and framing applied after recording. Change your mind in seconds, no browser involved.</p></div>
117
- <div class="cell"><b>Presets that post well</b><p>1080p landscape, square, vertical, docs GIF. Pick the publishing format, not the browser window.</p></div>
118
- <div class="cell"><b>A still for every scene</b><p>Each scene yields a crisp PNG. A video usually ships with a picture next to it.</p></div>
119
- <div class="cell"><b>Secrets stay secret</b><p>Credentials live in .env, redacted from logs, warned about if they'd appear on camera.</p></div>
120
- <div class="cell"><b>Stubs and seeds</b><p>Stub the backend and reset state so demos stay repeatable.</p></div>
121
- </div>
122
- </section>
123
-
124
-
125
-
126
- <div class="foot">
127
- <span>MIT licensed.</span>
128
- <a href="https://github.com/glebbogachev00/retake">Source</a>
129
- <span>Built on Playwright, testreel, and ffmpeg.</span>
130
- <a href="https://github.com/glebbogachev00/retake/issues/new?template=gremlin.md">Report a bug</a>
131
- </div>
132
- </main>
133
- <script>
134
- // The proof section fills itself from whatever clean renders exist in
135
- // site/media/. Committed pages carry no product footage; media is local.
136
- const CANDIDATES = [
137
- { file: 'todo-basics', cap: '<b>Written by an agent, performed by a browser.</b> Real typing, real clicks, captions timed from the actual run — 22 seconds, every step passed.' },
138
- { file: 'store-checkout', cap: '<b>The login is handled properly.</b> Credentials from .env, marked secret, signed in before the camera rolls — then a checkout, end to end.' },
139
- { file: 'distill-messy', cap: '<b>A conversation, recorded end to end.</b> Drafted, dry-run, and performed by an agent against a live model — 33 seconds.' },
140
- ];
141
- (async () => {
142
- const host = document.getElementById('proof');
143
- for (const c of CANDIDATES) {
144
- const url = (location.pathname.startsWith('/landing') ? '/landing/media/' : 'media/') + c.file + '.mp4';
145
- try {
146
- const r = await fetch(url, { method: 'HEAD' });
147
- if (!r.ok) continue;
148
- } catch { continue; }
149
- const f = document.createElement('figure');
150
- f.className = 'shot'; f.style.margin = 0;
151
- f.innerHTML = '<video src="' + url + '" poster="' + url.replace('.mp4', '.jpg') + '" controls muted playsinline preload="metadata"></video><figcaption>' + c.cap + '</figcaption>';
152
- host.appendChild(f);
153
- }
154
- if (!host.children.length) host.innerHTML = '<div class="say" style="margin-top:0"><span class="who">Proof pending</span>Record a demo and drop its render into <code>site/media/</code> — this section fills itself.</div>';
155
- })();
156
- </script>
157
- </body>
158
- </html>