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
- .gitignore +1 -0
- 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 Β·
|
| 80 |
</Badge>
|
| 81 |
|
| 82 |
<h1 className="text-5xl md:text-7xl font-bold leading-tight tracking-tight mb-6 text-white">
|
| 83 |
-
|
| 84 |
<br />
|
| 85 |
<span className="bg-gradient-to-r from-rose-400 via-fuchsia-400 to-amber-400 bg-clip-text text-transparent">
|
| 86 |
-
|
| 87 |
</span>
|
| 88 |
</h1>
|
| 89 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 90 |
<p className="text-xl text-gray-400 max-w-2xl mx-auto mb-10 leading-relaxed">
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
|
| 94 |
</p>
|
| 95 |
|
| 96 |
-
<div className="flex
|
| 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=
|
| 106 |
>
|
| 107 |
-
|
| 108 |
-
View on GitHub
|
| 109 |
</a>
|
| 110 |
</div>
|
| 111 |
|
| 112 |
<p className="mt-8 text-xs text-gray-700">
|
| 113 |
-
|
| 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
|
| 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 />
|