/* VideoGen AI — landing page */ const { useState, useEffect, useRef, useMemo } = React; const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "accent": "#2F5BFF", "headline": "Make once.", "headlineTail": "everywhere.", "rotatingPlatforms": true }/*EDITMODE-END*/; const BILLING_URL = "https://video.vangogodesign.com/billing"; // ── Data ──────────────────────────────────────────────────────────────────── const PLATFORMS = [ { name: "TikTok", short: "TT", spec: "9:16 · 15–60s" }, { name: "Reels", short: "IG", spec: "9:16 · ≤90s" }, { name: "Shorts", short: "YT", spec: "9:16 · ≤60s" }, { name: "LinkedIn", short: "LI", spec: "1:1 · ≤3min" }, { name: "X", short: "X", spec: "16:9 · ≤2:20" }, { name: "Facebook", short: "FB", spec: "1:1 · ≤90s" }, { name: "Pinterest", short: "PI", spec: "9:16 · ≤60s" }, { name: "YouTube", short: "YT", spec: "16:9 · long-form" }, ]; const TIERS = [ { name: "Starter", tag: "Slider clips", desc: "Slider videos up to 1 minute. Social-media posts only — Reels, TikTok, Shorts.", priceMo: 19, priceYr: 15, features: [ "Slider clips up to 60 seconds", "Auto-publish to social platforms", "Per-platform captions + hashtags", "Music, transitions, templates", "Download to edit yourself", ], }, { name: "Creator", tag: "Real animation", desc: "Real animation rendered on professional engines. Up to 3 minutes. The growth tier.", priceMo: 49, priceYr: 39, featured: true, badge: "Most popular", features: [ "Up to 3-minute animated videos", "Professional animation engines", "AI script, voiceover, motion", "Product placement in every shot", "All social platforms, every aspect", "Scheduled drops + A/B titles", "Upload your own images & clips", ], }, { name: "Pro", tag: "Unlimited length", desc: "Unlimited length — up to 60 minutes. Consistent characters, cinematic camera, lip-sync.", priceMo: 129, priceYr: 99, features: [ "Long-form up to 60 minutes", "Voice clone — your voice, any script", "Multi-character support", "Consistent characters & locations", "Cinematic camera + action moves", "AI presenter with lip-sync", "Brand kit, fonts, templates", "Team seats (5) + API", ], }, ]; const FEATURES = [ ["One brief →", "ten platforms", "Drop an idea or upload a clip. We re-cut, re-caption, and re-format it for every feed. You approve once."], ["Caption rewrites", "for each algorithm", "Same idea, ten different captions. Hooks tuned to each platform's ranking signals — not a copy-paste."], ["Hashtags &", "keywords on autopilot", "We pull trending tags hourly, score them by reach + competition, and slot the right mix per platform."], ["AI voiceover", "in 32 voices", "Pick a voice, paste a script, or let the AI write it. Lip-sync on Creator and Pro."], ["Best-time", "scheduling", "Per-platform drop windows trained on your audience. Queue a week in three minutes."], ["Analytics", "that compare apples", "One dashboard. Cross-platform views, retention, and ROI — normalized so you can compare what's actually winning."], ]; const FAQ = [ ["Do you actually publish, or just export?", "Both. Connect your platform accounts and VideoGen AI publishes on schedule. Prefer to download? Every video exports as MP4 in all aspect ratios."], ["Which platforms does the auto-publish cover?", "TikTok, Instagram Reels, YouTube Shorts & Long-form, LinkedIn, Facebook, X, Pinterest, Threads, and Snapchat. New platforms are added monthly."], ["How is each platform 'optimized'?", "Same idea, ten outputs: aspect ratio, length, hook timing, caption length, hashtag density, and the title/description structure each algorithm rewards. We rewrite — not resize."], ["What's the difference between Creator and Pro?", "Creator is animation, AI voiceover, and motion graphics up to 3 minutes. Pro adds AI presenters with lip-sync and long-form (20+ min) — built for YouTube, sales, and webinars."], ["Can I keep my brand consistent?", "Yes. Upload your brand kit (logos, colors, fonts, intros, outros, lower-thirds). Every export uses your kit by default."], ["What happens to my data and accounts?", "Your raw assets are yours. Platform tokens are encrypted and revocable. We never post without your queue's approval."], ["Is there a free trial?", "Get Early Access for free during the beta. No card required — you'll only see billing after the public launch."], ]; const SAMPLES = [ { tag: "Starter", title: "Local bakery", platform: "Reels · 28s" }, { tag: "Creator", title: "SaaS feature drop", platform: "Shorts · 1:42" }, { tag: "Creator", title: "Real-estate tour", platform: "TikTok · 0:58" }, { tag: "Pro", title: "Founder interview", platform: "YouTube · 12:08" }, ]; // ── Hooks ─────────────────────────────────────────────────────────────────── function useRotator(items, interval = 1800, enabled = true) { const [i, setI] = useState(0); useEffect(() => { if (!enabled) return; const id = setInterval(() => setI((x) => (x + 1) % items.length), interval); return () => clearInterval(id); }, [items.length, interval, enabled]); return [i, items[i]]; } function useReveal() { useEffect(() => { const els = document.querySelectorAll('[data-reveal]'); const io = new IntersectionObserver((entries) => { entries.forEach((e) => { if (e.isIntersecting) { e.target.classList.add('in'); io.unobserve(e.target); } }); }, { threshold: 0.12 }); els.forEach((el) => io.observe(el)); return () => io.disconnect(); }, []); } // ── Atoms ─────────────────────────────────────────────────────────────────── const Arrow = ({ size = 14 }) => ( ); const Play = () => ( ); // ── Sections ──────────────────────────────────────────────────────────────── function Nav() { return ( ); } function Hero({ headline, tail, rotating }) { const [idx] = useRotator(PLATFORMS, 1800, rotating); return (
Now in private beta · Get Early Access

{headline}
Post to{" "} {PLATFORMS.map((p) => {p.name}.)}
And {tail}

VideoGen AI plans, scripts, and ships social video across every platform — each one rewritten for its own algorithm. One workflow, one subscription, zero tab-juggling.

Get Early Access Watch a 60-sec demo
Multiple platforms supported
One subscription
Cancel anytime
); } function DemoMock({ activePlatform }) { // Cycle through three "publish states" to feel alive. const [tick, setTick] = useState(0); useEffect(() => { const id = setInterval(() => setTick((t) => t + 1), 1800); return () => clearInterval(id); }, []); const states = ["queued", "live", "done"]; const rows = PLATFORMS.slice(0, 6).map((p, i) => { const offset = (tick + i) % 7; let st = "queued"; if (offset < 2) st = "queued"; else if (offset < 4) st = "live"; else st = "done"; return { ...p, st }; }); return (
app.videogen.ai / projects / spring-campaign
Project · Master cut
0:47
"3 ways our espresso saves you 20 min a day"
creator tier · ai voice: Mira · 9 outputs
POV: you're a small-business owner and you just got 20 minutes back.{"\n"} #smallbiz #productivity #coffee #foundermode
Publishing queue · Tonight 6:00 PM local
{rows.map((r) => (
{r.short}
{r.name}
{r.spec}
{r.st === 'queued' && 'queued'} {r.st === 'live' && 'publishing'} {r.st === 'done' && '✓ posted'}
))}
); } function Problem() { return (
The problem

Twelve tabs.
Four subscriptions.
One human.

Marketers and small-business owners didn't sign up to be video editors, copywriters, and social-media managers. They signed up to ship.

The old way

Cut in one tool. Caption in another. Rewrite for each feed. Schedule somewhere else. Forget what you posted where.

capcut.com descript canva.com buffer later notion chatgpt + 5 more
Tools open12
Monthly cost$214
Time per video3h 40m
Per-platform rewritesmanual

With VideoGen AI

One brief. One subscription. Every platform optimized — and posted — automatically.

VideoGen AI
videogen.ai · one tab
Tools open1
Monthly costfrom $19
Time per video12 min
Per-platform rewritesautomatic
); } function HowItWorks() { return (
How it works

Pick a tier.
Drop an idea.
Direct the film.

No prompts to engineer. No timeline to fight. You stay the director — VideoGen AI handles the production line.

Pick a tier

Starter for slider clips up to 1 min — social posts only. Creator for real animation on professional engines, up to 3 min. Pro for unlimited length.

Starter · ≤1 min Creator · 3 min Pro · ≤60 min

Drop an idea

Type a line. Get a real storyboard you can tweak shot-by-shot. Consistent characters and locations across every cut (Pro). Long-form up to 60 minutes.

> brief
"3 ways our espresso saves 20 min a day"
shot 03 / 06 · 4.2s · consistent character

Direct the film

Animate the action and camera moves like a film pro — push-ins, parallax, whip-pans, lip-sync. Approve once; we ship to every platform on its own best time.

Camerapush-in 1.4×
Actionhand-off → cup
Lip-syncMira · EN-US
Ship to8 platforms
); } function NotOneClick() { return (
For real creators

This is NOT one-click
trash
.
This is for creators
who care.

01

Storyboard you can tweak

Every shot is its own card. Reorder, replace, retime. The AI follows the storyboard — not the other way around.

02

Download any image

Pull any frame, key art, or generated image out as a layered file. Open it in Photoshop, Figma, or your editor of choice. Bring it back in.

03

Bring your own footage

Upload your own images, B-roll, voice, or product clips. VideoGen AI weaves them in alongside the generated shots.

04

Consistent characters & places

Lock a character, a brand, a location — then keep them on-model across every shot of a 60-minute long-form (Pro).

05

Film-pro camera moves

Push-ins, parallax, whip-pans, rack-focus. Animate the action and the camera, not just the subject.

06

Frame-level control

Trim by the frame. Adjust easing. Swap voices. The details that separate work from slop — they're all here.

); } // Tier output style — visual preview of what each tier produces. const TIER_PREVIEWS = { Starter: (
SLIDE 02 / 06
), Creator: (
{Array.from({length: 28}).map((_,i)=>( ))}
AI · MIRA · 02:47
), Pro: (
LIP-SYNC · 12:08
), }; function Tiers() { return (
Three tiers of creation

From slideshow
to lip-synced epic.

Start where you are. Upgrade when you outgrow it. Every tier publishes to every platform — they differ on the kind of video the AI can make.

{TIERS.map((t) => (
{t.badge && {t.badge}}
{t.tag}

{t.name}

{TIER_PREVIEWS[t.name]}

{t.desc}

    {t.features.slice(0,4).map((f) =>
  • {f}
  • )}
))}
); } function PlatformMarquee() { // Duplicate the list so the marquee can loop seamlessly with translateX(-50%). const doubled = [...PLATFORMS, ...PLATFORMS]; return (
Publishes everywhere your audience is
{doubled.map((p, i) => (
{p.short} {p.name}
/
))}
); } function Features() { return (
What's inside

The whole content
line, on one screen.

Hooks, scripts, motion, voiceover, captions, hashtags, scheduling, analytics. What used to be a stack is now a sidebar.

{FEATURES.map(([a, b, p], i) => (
F.{String(i+1).padStart(2,'0')}

{a}
{b}

{p}

))}
); } function Samples() { return (
Sample output

A taste of what
ships at each tier.

Real outputs from the beta. Each card is the same idea, ten platform cuts.

{SAMPLES.map((s, i) => (
{s.tag}
{s.title}
{s.platform}
))}
); } function Pricing({ yearly, setYearly }) { return (
Pricing

One subscription.
Replaces the rest.

Cancel anytime. Yearly saves you 20%. Beta pricing locks in for life.

{TIERS.map((t) => (
{t.badge && {t.badge}}
{t.tag}

{t.name}

{t.desc}

${yearly ? t.priceYr : t.priceMo} / {yearly ? 'mo · billed yearly' : 'month'}
    {t.features.map((f) =>
  • {f}
  • )}
Choose {t.name}
))}
); } function BillingToggle({ yearly, setYearly }) { const ref = useRef(null); return (
−20%
); } function FAQSection() { const [open, setOpen] = useState(0); return (
FAQ

Questions we get
every demo.

Anything else? Email hi@videogen.ai — a human gets back same-day.

{FAQ.map(([q, a], i) => (
setOpen(open === i ? -1 : i)}>
{q}

{a}

))}
); } function FinalCTA() { return (
Get Early Access — free during beta

Ship video, everywhere,
before your coffee's cold.

Beta seats are limited. Pricing locks in for life if you join now.

); } function Foot() { return ( ); } // ── App root ──────────────────────────────────────────────────────────────── function App() { const [t, setTweak] = useTweaks(TWEAK_DEFAULTS); const [yearly, setYearly] = useState(true); useReveal(); // Apply accent live useEffect(() => { document.documentElement.style.setProperty('--accent', t.accent); }, [t.accent]); return ( <>