Skip to content

Latest commit

 

History

85 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 

Repository files navigation

VidChemy 🎬⚗️

From Video to Amazon Best-Seller - in Minutes.

VidChemy is an AI-powered pipeline that transforms short-form influencer promotional videos (Instagram Reels) into fully optimized, marketplace-ready e-commerce product listings - automatically.

No manual photo shoots. No hours of copywriting. No fragmented tools. Just paste a Reel URL, pick a product category, and let the AI do the rest.


Demo


📌 Table of Contents


The Problem

The global influencer marketing space is projected to hit $40 billion USD by 2026 (30%+ CAGR), yet only 7–10% of creators effectively monetize their content through merchandise.

Why? Because turning a great promo video into a live product listing is painfully slow:

  • 3–5 hours per product photo (shooting + editing)
  • 2–3 hours writing descriptions manually
  • 90% of sellers fail on Amazon/Flipkart without proper SEO
  • 4–6 fragmented tools needed to complete one listing
  • Delays cost creators their viral momentum - and their revenue

The Solution

VidChemy collapses the entire listing creation workflow into a single AI-powered pipeline:

Instagram Reel URL  ──►  AI Pipeline  ──►  Marketplace-Ready Listing
     (seconds)                                  (titles, images, SEO)

What used to take 5+ hours now takes under 5 minutes.


Key Features

Feature Description
Video Analysis Pipeline Detects products, extracts optimal frames, transcribes narration via speech-to-text
Automated Image Enhancement AI background removal produces clean, studio-quality 1:1 product images
NLP Listing Generation SEO-optimized titles, bullet points, descriptions, and A+ content tuned for the Amazon A9 algorithm
Competitor & Sentiment Analysis Scrapes top Amazon/Flipkart listings and analyzes review sentiment to inform your copy
Multi-Language Support Handles Hindi and English audio natively
Marketplace Export Structured listing data ready for instant publishing to Amazon or Flipkart Seller Central

How It Works

VidChemy Process Flow Diagram
A high-level view of how a video is ingested, analyzed, and transformed into a final e-commerce listing.


Tech Stack

Frontend

React TypeScript Vite TailwindCSS Redux

Backend

NodeJS Express MongoDB Redis Docker FFmpeg

AWS Services

Bedrock S3 EC2 Transcribe CloudFront

External APIs

  • Perplexity AI - Product research & context gathering
  • RapidAPI (Instagram) - Reel metadata scraping
  • HasData API - Amazon listing scraping
  • BullMQ - Distributed worker queue management

Architecture

VidChemy runs on a distributed worker architecture fully hosted on AWS:

VidChemy System Architecture Diagram


Getting Started

Prerequisites

  • Node.js v18+
  • Docker & Docker Compose
  • AWS account with access to: S3, EC2, Bedrock (Nova Pro + Titan), Transcribe, CloudFront
  • API keys for: RapidAPI (Instagram), HasData, Perplexity

Clone the Repository

git clone -b new-ui https://github.com/aayushsingh7/vidchemy.git
cd vidchemy

Frontend Setup

cd frontend

Create a .env file in the frontend/ directory:

VITE_API_URL=http://localhost:4000
VITE_SOCKET_URL=http://localhost:4000

Install dependencies and run:

npm install

# Development
npm run dev

# Production preview
npm run build
npm run preview

Backend Setup

cd backend

Create a .env file in the backend/ directory:

NODE_ENV="development"

PORT=4000
MONGO_URI=your_mongodb_connection_string

# Use redis://localhost:6379 for local, redis://redis:6379 for Docker
REDIS_URI=redis://redis:6379

# AWS Credentials
AWS_ACCESS_KEY_ID=your_access_key_id
AWS_SECRET_ACCESS_KEY=your_secret_access_key
AWS_S3_BUCKET_NAME=your_s3_bucket_name
AWS_REGION=your_aws_region

# External APIs
RAPID_API_KEY=your_rapidapi_key
RAPID_API_INSTAGRAM_HOST=instagram-reels-downloader-api.p.rapidapi.com

HAS_DATA_API_KEY=your_hasdata_key
HAS_DATA_API_URL=https://api.hasdata.com/scrape/amazon

PERPLEXITY_API_KEY=your_perplexity_key

CLOUD_FRONT_URL=your_cloudfront_distribution_url

AI Prompts Configuration

Create an ai-prompts.private.js file in the backend/ root directory. This is the brain of the AI pipeline — it defines the system/user prompts and response schemas for each AI stage.

// backend/ai-prompts.private.js

export const BEDROCK_VIDEO_ANALYSIS = {
  system: "System Prompt Here",
  user: ({ productType, title, description }) => {
    return "User Prompt Here";
  },
  responseSchema: {
        type: "object",
        properties: {
            isRejected: {
                type: "boolean",
                description:
                    "True if the video is unsafe, lacks a product, lacks brand/model info, or contains multiple different products.",
            },
            reasons: {
                type: "array",
                items: {type: "string"},
                description: "Reasons for rejection. Empty if isRejected is false.",
            },
            hasTopProductMoments: {
                type: "boolean",
                description: "True if there is at least one pristine moment of the product.",
            },
            topProductMoments: {
                type: "array",
                items: {type: "integer"},
                description:
                    "Array of exact timestamps (in milliseconds) showing the product in focus. Aim for 6-7 timestamps. Backgrounds, shadows, and holding hands are acceptable as long as the product itself is not obstructed.",
            },
            productLabel: {
                type: "string",
                description: "A generic category label for AWS Rekognition.",
            },
            brand: {type: "string"},
            productModel: {type: "string"},
        },
        required: [
            "isRejected",
            "reasons",
            "hasTopProductMoments",
            "topProductMoments",
            "productLabel",
            "brand",
            "productModel",
        ],
    },
};

export const PERPLEXITY_PRODUCT_RESEARCH = {
  system: "System Prompt Here",
  user: ({ website, productName, additionalContext }) => {
    return "User Prompt Here";
  },
  responseSchema: {
        type: "json_schema",
        json_schema: {
            name: "universal_product_details",
            strict: true,
            schema: {
                type: "object",
                properties: {
                    product_name: {type: "string"},
                    brand: {type: "string"},
                    model_or_style_code: {
                        type: "string",
                        description:
                            "Model number for tech/appliances, or style code for clothing/shoes. Empty if not applicable.",
                    },
                    category: {type: "string"},
                    description: {type: "string"},
                    key_features: {
                        type: "array",
                        items: {type: "string"},
                        minItems: 3,
                    },
                    specifications: {
                        type: "array",
                        items: {
                            type: "object",
                            properties: {
                                attribute_name: {
                                    type: "string",
                                    description: "e.g., Material, Battery Life, Fit, Recommended Age",
                                },
                                attribute_value: {
                                    type: "string",
                                    description: "e.g., 100% Cotton, 40 hours, Slim Fit, 8-12 Years",
                                },
                            },
                            required: ["attribute_name", "attribute_value"],
                            additionalProperties: false,
                        },
                    },
                    physical_details: {
                        type: "object",
                        properties: {
                            weight: {type: "string"},
                            dimensions: {type: "string"},
                            primary_material: {
                                type: "string",
                                description: "e.g., Cotton, Plastic, Stainless Steel, Mixed",
                            },
                        },
                        additionalProperties: false,
                    },
                    care_instructions: {
                        type: "string",
                        description:
                            "How to clean/maintain. e.g., 'Machine wash cold' or 'Wipe with damp cloth'. Empty if n/a.",
                    },

                    price: {
                        type: "object",
                        properties: {
                            current_price: {type: "number"},
                            original_price: {type: "number"},
                            currency: {type: "string"},
                            discount_percent: {type: "number"},
                        },
                        required: ["current_price", "currency"],
                        additionalProperties: false,
                    },
                    variants: {
                        type: "object",
                        properties: {
                            colors_available: {type: "array", items: {type: "string"}},
                            sizes_available: {type: "array", items: {type: "string"}},
                        },
                        additionalProperties: false,
                    },

                    images: {type: "array", items: {type: "string"}},
                    warranty_or_guarantee: {type: "string"},

                    marketplace_links: {
                        type: "object",
                        properties: {
                            amazon: {type: "string"},
                            flipkart: {type: "string"},
                            official: {type: "string"},
                            other: {type: "string"},
                        },
                        additionalProperties: false,
                    },
                },
                required: [
                    "product_name",
                    "brand",
                    "category",
                    "description",
                    "key_features",
                    "specifications",
                    "price",
                ],
                additionalProperties: false,
            },
        },
    },
};

export const BEDROCK_LISTING_GENERATION = {
  system: "System Prompt Here",
  user: ({ referenceProducts, originalProduct }) => {
    return "User Prompt Here";
  },
  responseSchema: {
        type: "object",
        properties: {
            title: {
                type: "string",
                description: "SEO-optimized title. Min 150 chars, max 200 chars. Primary keyword in first 5 words.",
            },
            description: {
                type: "string",
                description: "Persuasive plain-text description. Min 1800 chars, max 2000 chars. No HTML.",
            },
            bulletPoints: {
                type: "array",
                items: {
                    type: "string",
                    minLength: 200,
                    maxLength: 256,
                    description:
                        "Each bullet: ALL-CAPS HOOK (4-6 words) — full benefit explanation with secondary keywords, emotional trigger, and use case. 200-256 characters.",
                },
                minItems: 5,
                maxItems: 5,
            },
            searchTerms: {
                type: "array",
                items: {type: "string"},
                minItems: 15,
                maxItems: 20,
                description:
                    "Backend search terms. Zero overlap with title words. Total ≤250 bytes. Include misspellings, colloquialisms, use-case terms, demographic terms.",
            },
            suggestedCategory: {
                type: "string",
                description: "Full Amazon browse node path. Format: Top > Sub > Leaf Category.",
            },
            specifications: {
                type: "array",
                minItems: 10,
                items: {
                    type: "object",
                    properties: {
                        key: {
                            type: "string",
                            description:
                                "Amazon standard attribute name (e.g., 'Connectivity Technology', 'Battery Life', 'Item Weight')",
                        },
                        value: {
                            type: "string",
                            description: "Precise technical value (e.g., 'Bluetooth 5.3', '40 Hours', '250 Grams')",
                        },
                    },
                    required: ["key", "value"],
                },
                description:
                    "Minimum 10 technical spec pairs using Amazon standard attribute naming for backend filter indexing.",
            },
            attributes: {
                type: "object",
                properties: {
                    brand: {type: "string"},
                    color: {type: "string"},
                    material: {type: "string"},
                    targetAudience: {
                        type: "string",
                        description:
                            "Specific demographic description (e.g., 'Remote workers and frequent travelers aged 25-45'), not generic.",
                    },
                    price: {
                        type: "object",
                        properties: {
                            currencyCode: {
                                type: "string",
                                description:
                                    "Currency code matched EXACTLY from reference product pricing (e.g., INR, USD, GBP, EUR).",
                            },
                            currencyName: {
                                type: "string",
                                description: "Full currency name (e.g., Indian Rupee, US Dollar, British Pound).",
                            },
                            estimatedOriginalPrice: {
                                type: "number",
                                description:
                                    "MRP / anchor price. Set 40-60% above selling price to maximize perceived discount value.",
                            },
                            estimatedPrice: {
                                type: "number",
                                description:
                                    "Competitive selling price. Undercut top-rated competitor by 8-15% to capture price-sensitive buyers.",
                            },
                            estimatedDiscountPercent: {
                                type: "number",
                                description:
                                    "Discount percentage. Target 30-50% range for maximum algorithm-boosted deal visibility.",
                            },
                        },
                        required: [
                            "currencyCode",
                            "currencyName",
                            "estimatedOriginalPrice",
                            "estimatedPrice",
                            "estimatedDiscountPercent",
                        ],
                    },
                },
                required: ["brand", "color", "material", "targetAudience", "price"],
            },
        },
        required: [
            "title",
            "description",
            "bulletPoints",
            "searchTerms",
            "suggestedCategory",
            "specifications",
            "attributes",
        ],
    },
};

Tip: The quality of your prompts directly determines listing quality. Tune the system prompts to be specific about the marketplace format (Amazon A9 vs Flipkart), SEO keyword density, and desired tone for your target audience.


Running with Docker

From the backend/ directory, start all services (API server, ingestion worker, process worker, Redis) with a single command:

docker compose up --build

This spins up:

  • api — Express REST + WebSocket server
  • ingestion-worker — Handles video upload queue
  • process-worker — Handles AI processing pipeline
  • redis — Message queue broker

Project Structure

vidchemy/
│
├── frontend/
│   ├── public/
│   └── src/
│       ├── components/        # Reusable UI components
│       ├── layouts/           # Page layout wrappers
│       ├── pages/             # Route-level page components
│       ├── context/           # React context providers
│       └── hooks/             # Custom React hooks
│   ├── .env
│   └── package.json
│
└── backend/
    ├── src/
    │   ├── api/               # Express server (controllers, services, routes)
    │   ├── worker/            # BullMQ workers + worker-internal services
    │   └── shared/            # Models, shared utils, configs, shared services
    ├── Dockerfile.api
    ├── Dockerfile.ingestion.worker
    ├── Dockerfile.process.worker
    ├── docker-compose.yaml
    ├── ai-prompts.private.js  # ⚠️ You must create this (not committed to git)
    ├── .env                   # ⚠️ You must create this (not committed to git)
    └── package.json

Performance Benchmarks

Processing Speed

Tested on a single AWS EC2 t3.medium (2 vCPU, 4GB RAM) with 10–20 simulated concurrent uploads:

Processing Stage Handled By Avg. Duration
Raw S3 Upload Ingestion Worker ~3s
Context Scraping Scraper Service ~15s
Frame Extraction FFmpeg Service ~20s
AI Processing External AI APIs ~70s
Total Job Time Worker Process ~108s

Note: AI/Scraper APIs were throttled to 1 concurrent request (p-limit: 1) to prevent rate-limiting on free-tier accounts. Production throughput scales linearly with worker nodes.

Output Quality

Output Quality

Vidchemy's AI-generated listings score 92/100 on SEO and 85/100 on Total Listing Score — with full marks on title optimization, keyword optimization, and bullet points, validating the effectiveness of the end-to-end pipeline.


Cost Overview

Component MVP (Monthly) Production (10k videos/mo)
Compute: AWS EC2 $0.00 (Free Tier) ~$120.00
Message Queue: Redis $0.00 (Local) ~$35.00
Database: MongoDB $0.00 (Atlas M0) ~$60.00
Storage: AWS S3 $0.00 (<5GB) ~$15.00
CDN: AWS CloudFront $0.00 (<1TB) ~$45.00
RapidAPI Instagram $0.00 (100 req/mo) $20.00
HasData Amazon $0.00 (1k credits) $49.00
AWS Bedrock & Titan $0.00 (Credits) ~$120.00
Total $0.00 / month ~$464.00 / month

~$0.04 per processed video at production scale.


Roadmap

  • TikTok & YouTube Shorts support
  • One-click publishing directly to Amazon, Flipkart, and Shopify Seller Central
  • Expanded product categories beyond apparel
  • Multilingual SEO — regional language to global marketplace listings

License

This project was built for a hackathon powered by AWS.


Built with ❤️ by aayushsingh7

About

Transmuting raw video reels into structured product data using AWS & Gen AI.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages