jgvilchezc.dev
← Back to work
/productreelLive

ProductReel

Paste a Shopify product URL. Get a 36-second video in under 60 seconds.

Role
Solo founder · Lead engineer
Year
2026
Status
Live
Product URL → MP4 · 30s
Bold & Dynamic
Playing
Clean & Minimal
Story Mode
José Gabriel Vilchez Carrasquero
At a glance
Time to render
< 60s
Entry points
3
Pipeline
1 orchestrator
Render template
Cinematic
01Overview

Overview

Shopify merchants need vertical video for TikTok, Reels and Shorts. The normal way to get one runs $200 to $2,000 and takes days. ProductReel takes the product URL and ships a 36-second MP4 in under 60 seconds. The merchant pastes one link. That's it.

It's built for the segment Shopify usually doesn't talk about: stores under 1,000 SKUs with no creative team. The goal is the smallest thing that gets that merchant to a first finished render.

Render state lives in the callback, not the client. The function exits clean in 60s. The MP4 URL lands when Shotstack is actually done.

02Architecture

Architecture

Steps 01–04 fit inside Vercel's 60-second function cap. Steps 05–06 land later, when Shotstack finishes the render and fires the callback.

submit ≤ 60s
01Entryscrape · backfill · webhook (HMAC)
02Orchestratorlib/pipeline.ts (single source of truth)
03AI passGemini 2.5 Flash + Nano Banana (parallel enhance)
04Ingest + submitShotstack Ingest → Shotstack Edit (job ID)
60s function wall
callback (async)
05Callback sinkShotstack → /api/shotstack-callback
06Store + notifyVercel KV · Resend · /stats live feed

Steps 01–04 fit inside Vercel's 60-second function cap. Steps 05–06 land later, when Shotstack finishes the render and fires the callback.

03Key features

Key features

  • /01

    Three entry points, one pipeline

    /api/scrape, /api/backfill and /api/webhook all converge on lib/pipeline.ts. Same contract, different triggers.

  • /02

    Submit-then-callback

    Renders submit and return in under 60s. Enhanced images go up through Shotstack Ingest as HTTPS URLs, then Shotstack Edit renders. When it finishes, the callback writes the MP4 URL to KV. The function never polls and never times out.

  • /03

    AI-ranked hero shot

    Gemini returns an image_priority ranking that reorders the product images, so the strongest shot opens the video instead of whatever order Shopify listed them in.

  • /04

    HMAC-verified webhooks

    The pipeline validates each Shopify product.created webhook against SHOPIFY_WEBHOOK_SECRET before doing any work. The /stats dashboard reads Vercel KV sorted-sets, tracking renders per active store as the north-star metric.

  • /05

    Fail-soft enhancement

    Nano Banana image upgrades run best-effort. If the enhancement fails, the pipeline uses the original Shopify image. A blurry render beats no render.

04Technical decisions

Technical decisions

05What I'd do differently

What I'd do differently

  • /01

    Build the reconciliation cron up front. If a Shotstack callback never arrives, the job sits in KV forever. A 5-minute cron that re-checks submitted jobs older than 10 minutes would catch the orphans without touching the happy path.

  • /02

    Pick structured logging before /stats matters. By the time the dashboard needed real error data, the logs were plain text. Migrating mid-flight is way harder than starting structured.

ProductReel scrape interface: a public Shopify product URL field, sample store chips, and a coral 'Scrape & generate' CTA over a dark mockup terminal.
AI Director panel (coming soon): a chat-based brief where the user describes mood and pacing, the agent restates it back as direction, and a 'Generate custom video' button kicks off a single-cut render.