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.
- The Problem
- The Solution
- Key Features
- How It Works
- Tech Stack
- Architecture
- Getting Started
- Project Structure
- Performance Benchmarks
- Cost Overview
- Roadmap
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
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.
| 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 |
A high-level view of how a video is ingested, analyzed, and transformed into a final e-commerce listing.
- Perplexity AI - Product research & context gathering
- RapidAPI (Instagram) - Reel metadata scraping
- HasData API - Amazon listing scraping
- BullMQ - Distributed worker queue management
VidChemy runs on a distributed worker architecture fully hosted on AWS:
- 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
git clone -b new-ui https://github.com/aayushsingh7/vidchemy.git
cd vidchemycd frontendCreate a .env file in the frontend/ directory:
VITE_API_URL=http://localhost:4000
VITE_SOCKET_URL=http://localhost:4000Install dependencies and run:
npm install
# Development
npm run dev
# Production preview
npm run build
npm run previewcd backendCreate 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_urlCreate 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.
From the backend/ directory, start all services (API server, ingestion worker, process worker, Redis) with a single command:
docker compose up --buildThis spins up:
api— Express REST + WebSocket serveringestion-worker— Handles video upload queueprocess-worker— Handles AI processing pipelineredis— Message queue broker
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
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.
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.
| 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.
- 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
This project was built for a hackathon powered by AWS.
Built with ❤️ by aayushsingh7


