Rodrigo Ortega commited on
Commit
724c33d
Β·
1 Parent(s): 11c9fce

feat: rewrite landing page for hackathon demo

Browse files

- Hero: 'Put Yourself In the Film' β€” human-centered, punchy hook
- Embed autoplay Iron Man I2V clip right under headline (square 1:1)
- Stacked CTA: Launch Studio primary, GitHub as subtle text link
- Feature Film section: human + agent co-directing narrative
- Drop 'Examples' section β€” keep flow tight, push into studio
- Add demo videos (iron-man-flight, feature-film) to public/demos
- Build clean, dist updated

Files changed (2) hide show
  1. .gitignore +1 -0
  2. studio/src/LandingPage.tsx +174 -12
.gitignore CHANGED
@@ -44,3 +44,4 @@ training/
44
 
45
  # Local/generated Hugging Face Space preview artifacts
46
  outputs/
 
 
44
 
45
  # Local/generated Hugging Face Space preview artifacts
46
  outputs/
47
+ studio/public/demos/*.mp4
studio/src/LandingPage.tsx CHANGED
@@ -5,6 +5,7 @@ import {
5
  Cpu,
6
  Film,
7
  Lock,
 
8
  Server,
9
  Sparkles,
10
  Users,
@@ -76,24 +77,44 @@ function Hero() {
76
  variant="outline"
77
  >
78
  <Cpu className="w-3.5 h-3.5" />
79
- AMD MI300X Β· 192 GB VRAM Β· ROCm Β· Open Source
80
  </Badge>
81
 
82
  <h1 className="text-5xl md:text-7xl font-bold leading-tight tracking-tight mb-6 text-white">
83
- AI Visual Studio
84
  <br />
85
  <span className="bg-gradient-to-r from-rose-400 via-fuchsia-400 to-amber-400 bg-clip-text text-transparent">
86
- Built for Agents.
87
  </span>
88
  </h1>
89
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
90
  <p className="text-xl text-gray-400 max-w-2xl mx-auto mb-10 leading-relaxed">
91
- Train character LoRAs on AMD MI300X in ~90 minutes. Generate
92
- photorealistic images. Animate to video. Your AI agent controls the
93
- whole pipeline through a simple HTTP API.
94
  </p>
95
 
96
- <div className="flex items-center justify-center gap-3 flex-wrap">
97
  <Link to="/studio" className={btnPrimary}>
98
  <Sparkles className="w-4 h-4" />
99
  Launch Studio
@@ -102,15 +123,14 @@ function Hero() {
102
  href="https://github.com/ortegarod/nemoflix"
103
  target="_blank"
104
  rel="noopener noreferrer"
105
- className={btnOutline}
106
  >
107
- <GitHubIcon className="w-4 h-4" />
108
- View on GitHub
109
  </a>
110
  </div>
111
 
112
  <p className="mt-8 text-xs text-gray-700">
113
- ComfyUI-native Β· PostgreSQL Β· Python 3.11+
114
  </p>
115
  </div>
116
  </section>
@@ -170,6 +190,108 @@ function Pillars() {
170
  );
171
  }
172
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
173
  /* ── How It Works ── */
174
  function HowItWorks() {
175
  const steps = [
@@ -273,6 +395,45 @@ function HowItWorks() {
273
  </Card>
274
  ),
275
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
276
  ];
277
 
278
  return (
@@ -281,7 +442,7 @@ function HowItWorks() {
281
  <div className="text-center mb-20">
282
  <h2 className="text-4xl font-bold text-white mb-4">How It Works</h2>
283
  <p className="text-gray-500 text-lg">
284
- From reference photos to animated video in three steps.
285
  </p>
286
  </div>
287
 
@@ -421,6 +582,7 @@ export default function LandingPage() {
421
  <Navbar />
422
  <Hero />
423
  <Pillars />
 
424
  <HowItWorks />
425
  <Features />
426
  <CTA />
 
5
  Cpu,
6
  Film,
7
  Lock,
8
+ Play,
9
  Server,
10
  Sparkles,
11
  Users,
 
77
  variant="outline"
78
  >
79
  <Cpu className="w-3.5 h-3.5" />
80
+ AMD MI300X Β· 192 GB VRAM Β· Open Source
81
  </Badge>
82
 
83
  <h1 className="text-5xl md:text-7xl font-bold leading-tight tracking-tight mb-6 text-white">
84
+ Put Yourself
85
  <br />
86
  <span className="bg-gradient-to-r from-rose-400 via-fuchsia-400 to-amber-400 bg-clip-text text-transparent">
87
+ In the Film.
88
  </span>
89
  </h1>
90
 
91
+ {/* Hero video β€” phone-sized preview right under headline */}
92
+ <div className="mx-auto max-w-xs sm:max-w-sm md:max-w-md mb-10">
93
+ <div className="rounded-[1.5rem] overflow-hidden border border-gray-800/60 bg-gray-950 shadow-2xl shadow-rose-500/10 ring-1 ring-white/5 aspect-square">
94
+ <video
95
+ src="/demos/iron-man-flight.mp4"
96
+ controls
97
+ poster=""
98
+ className="w-full h-full object-cover"
99
+ preload="metadata"
100
+ autoPlay
101
+ muted
102
+ loop
103
+ playsInline
104
+ />
105
+ </div>
106
+ <div className="flex items-center justify-center gap-2 mt-2">
107
+ <span className="text-[10px] text-gray-600 uppercase tracking-wider">Wan 2.2 I2V Β· AMD MI300X</span>
108
+ </div>
109
+ </div>
110
+
111
  <p className="text-xl text-gray-400 max-w-2xl mx-auto mb-10 leading-relaxed">
112
+ Upload a few photos. Build a model of yourself. Generate photorealistic
113
+ images in any scene you can imagine. Animate them into short films.
114
+ <span className="text-white font-medium"> What used to take days now takes minutes.</span>
115
  </p>
116
 
117
+ <div className="flex flex-col items-center gap-3">
118
  <Link to="/studio" className={btnPrimary}>
119
  <Sparkles className="w-4 h-4" />
120
  Launch Studio
 
123
  href="https://github.com/ortegarod/nemoflix"
124
  target="_blank"
125
  rel="noopener noreferrer"
126
+ className="text-xs text-gray-500 hover:text-gray-300 transition"
127
  >
128
+ View on GitHub β†’
 
129
  </a>
130
  </div>
131
 
132
  <p className="mt-8 text-xs text-gray-700">
133
+ Self-hosted Β· Agent-native Β· MIT License
134
  </p>
135
  </div>
136
  </section>
 
190
  );
191
  }
192
 
193
+ /* ── Feature Film Showcase ── */
194
+ function FeatureFilmShowcase() {
195
+ return (
196
+ <section className="py-28 px-6 border-y border-gray-800/40 bg-gradient-to-b from-black via-gray-950/30 to-black">
197
+ <div className="max-w-6xl mx-auto">
198
+ {/* Header */}
199
+ <div className="text-center mb-16">
200
+ <Badge className="mb-4 gap-1.5 border-fuchsia-500/20 bg-fuchsia-500/5 text-fuchsia-300 h-7 px-3" variant="outline">
201
+ <Film className="w-3.5 h-3.5" />
202
+ Built in One Week
203
+ </Badge>
204
+ <h2 className="text-4xl md:text-5xl font-bold text-white mb-5">
205
+ You and Your Agent.
206
+ <br />
207
+ <span className="bg-gradient-to-r from-rose-400 via-fuchsia-400 to-amber-400 bg-clip-text text-transparent">
208
+ Co-Directing a Film.
209
+ </span>
210
+ </h2>
211
+ <p className="text-lg text-gray-500 max-w-2xl mx-auto leading-relaxed">
212
+ This is what a human and their AI agent can build together in a week.
213
+ You bring the vision. The agent handles the technical heavy lifting β€”
214
+ scene planning, shot management, generation queues, and final assembly.
215
+ Like having a creative partner who knows every button in Photoshop,
216
+ but for the entire film pipeline.
217
+ </p>
218
+ </div>
219
+
220
+ {/* The Film */}
221
+ <div className="max-w-4xl mx-auto">
222
+ <div className="rounded-2xl overflow-hidden border border-gray-800/60 bg-gray-950 shadow-2xl shadow-fuchsia-500/5 aspect-video">
223
+ <video
224
+ src="/demos/feature-film.mp4"
225
+ controls
226
+ poster=""
227
+ className="w-full h-full object-cover"
228
+ preload="metadata"
229
+ />
230
+ </div>
231
+
232
+ <div className="mt-6 flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 px-1">
233
+ <div>
234
+ <div className="flex items-center gap-2 mb-2">
235
+ <Badge className="gap-1 border-fuchsia-500/20 bg-fuchsia-500/5 text-fuchsia-300 text-[10px]" variant="outline">
236
+ <Film className="w-3 h-3" /> Full Project Render
237
+ </Badge>
238
+ <span className="text-xs text-gray-500">Multi-shot Β· assembled Β· AMD MI300X</span>
239
+ </div>
240
+ <h3 className="text-base font-semibold text-white">Hackathon Feature Film</h3>
241
+ <p className="text-sm text-gray-500 mt-1 leading-relaxed max-w-xl">
242
+ Script β†’ scenes β†’ shots β†’ generated images β†’ animated clips β†’ stitched final cut.
243
+ The agent directed the pipeline. The human directed the vision.
244
+ </p>
245
+ </div>
246
+ <Link
247
+ to="/studio"
248
+ className="inline-flex items-center gap-1.5 rounded-lg border border-gray-700 hover:border-rose-500/50 px-4 py-2 text-xs font-medium text-gray-300 hover:text-white transition shrink-0"
249
+ >
250
+ Try It Yourself <ArrowRight className="w-3.5 h-3.5" />
251
+ </Link>
252
+ </div>
253
+ </div>
254
+
255
+ {/* Human + Agent narrative */}
256
+ <div className="mt-20 grid md:grid-cols-3 gap-5 max-w-5xl mx-auto">
257
+ {[
258
+ {
259
+ icon: Users,
260
+ color: "text-rose-400",
261
+ border: "border-rose-500/20",
262
+ title: "You bring the vision",
263
+ body: "Describe the film you want. Your character, the scenes, the mood. The agent listens and structures it into a real production pipeline.",
264
+ },
265
+ {
266
+ icon: Bot,
267
+ color: "text-fuchsia-400",
268
+ border: "border-fuchsia-500/20",
269
+ title: "The agent handles execution",
270
+ body: "It plans shots, writes prompts, queues generations, tracks renders, and assembles the final cut. No manual clicking through ComfyUI nodes.",
271
+ },
272
+ {
273
+ icon: Sparkles,
274
+ color: "text-amber-400",
275
+ border: "border-amber-500/20",
276
+ title: "You iterate together",
277
+ body: "Review each shot. Regenerate what doesn't land. Adjust the script. The agent adapts instantly. You're co-directors, not operator and tool.",
278
+ },
279
+ ].map((item) => (
280
+ <div
281
+ key={item.title}
282
+ className={`rounded-2xl border ${item.border} bg-gradient-to-b from-gray-950/80 to-black p-6`}
283
+ >
284
+ <item.icon className={`w-5 h-5 ${item.color} mb-3`} />
285
+ <h3 className="text-sm font-semibold text-white mb-2">{item.title}</h3>
286
+ <p className="text-xs text-gray-500 leading-relaxed">{item.body}</p>
287
+ </div>
288
+ ))}
289
+ </div>
290
+ </div>
291
+ </section>
292
+ );
293
+ }
294
+
295
  /* ── How It Works ── */
296
  function HowItWorks() {
297
  const steps = [
 
395
  </Card>
396
  ),
397
  },
398
+ {
399
+ n: "04",
400
+ color: "text-emerald-400",
401
+ ring: "ring-emerald-500/30",
402
+ title: "Build Films Scene by Scene",
403
+ body: "Projects hold Scenes, Scenes hold Shots β€” each with its own generated image and video. When every shot is animated, hit render and Nemoflix stitches the whole thing together into one finished video. Your agent wrote, directed, and rendered a short film, start to finish.",
404
+ aside: (
405
+ <Card className="border-emerald-500/20 bg-gradient-to-b from-emerald-950/20 to-gray-950/60 ring-0">
406
+ <CardHeader>
407
+ <Badge className="w-fit gap-1.5 border-emerald-500/20 bg-emerald-500/5 text-emerald-400" variant="outline">
408
+ <Film className="w-3 h-3" /> Projects
409
+ </Badge>
410
+ <CardTitle className="text-white text-sm mt-2">Film Structure</CardTitle>
411
+ </CardHeader>
412
+ <CardContent>
413
+ <div className="font-mono text-xs space-y-2">
414
+ <div className="text-emerald-300/80">
415
+ Project <span className="text-emerald-500">"Neon Nights"</span>
416
+ </div>
417
+ <div className="pl-4 border-l border-gray-800 space-y-1.5">
418
+ <div className="text-gray-400">
419
+ Scene 1 <span className="text-gray-600">"Alley Chase"</span>
420
+ </div>
421
+ <div className="pl-4 text-gray-600 space-y-0.5">
422
+ <div>Shot 1A β†’ image + video</div>
423
+ <div>Shot 1B β†’ image + video</div>
424
+ </div>
425
+ <div className="text-gray-400 pt-1">
426
+ Scene 2 <span className="text-gray-600">"Rooftop"</span>
427
+ </div>
428
+ </div>
429
+ </div>
430
+ <p className="text-[11px] text-emerald-300/50 mt-4">
431
+ One API. Train β†’ generate β†’ animate β†’ render.
432
+ </p>
433
+ </CardContent>
434
+ </Card>
435
+ ),
436
+ },
437
  ];
438
 
439
  return (
 
442
  <div className="text-center mb-20">
443
  <h2 className="text-4xl font-bold text-white mb-4">How It Works</h2>
444
  <p className="text-gray-500 text-lg">
445
+ From reference photos to a finished film in four steps.
446
  </p>
447
  </div>
448
 
 
582
  <Navbar />
583
  <Hero />
584
  <Pillars />
585
+ <FeatureFilmShowcase />
586
  <HowItWorks />
587
  <Features />
588
  <CTA />