AI virtual try-on: paste a supported retailer product link (or upload a cloth image), add a photo of yourself, and generate a try-on result.
Monorepo powered by Bun, Turborepo, Next.js (Vercel), Prisma/Postgres, Cloudflare R2, and SST (SQS + Lambda) for scrape + Vertex try-on jobs.
| Path | Package | Role |
|---|---|---|
apps/website |
@drized/website |
Next.js 16 app — landing, Clerk auth, server actions, API routes (payments webhook, Discord notify, uploads) |
packages/server |
@drized/server |
Domain logic — users, files/R2, driz CRUD, Dodo payments, SQS enqueue, scrapers, extract/try-on job handlers |
packages/db |
@drized/db |
Prisma schema, migrations, shared Postgres client |
packages/types |
@drized/types |
Shared TypeScript DTOs (plain types; runtime validation is zod in website actions) |
infra |
@drized/infra |
SST: ClothesExtractor Lambda, Extract/Generate queues + workers |
Browser (Clerk)
→ Next.js server actions / API routes
→ @drized/server
→ Postgres (Prisma) + R2 (private objects, signed GET URLs)
Async try-on:
createDriz
→ ExtractQueue → extract-worker → ClothesExtractor (Playwright)
→ GenerateQueue → tryon-worker → Google Vertex Virtual Try-On → R2
Supported product hosts (server allowlist): Myntra, Ajio, Flipkart, Amazon (and short links like a.co / amzn.to).
- Bun (see
packageManagerin rootpackage.json) - Node compatible with the repo
enginesfield - Docker (optional, for local Postgres via
docker-compose.yml) - AWS credentials (queues / Lambda invoke)
- Cloudflare R2, Clerk, Dodo Payments, Google Cloud (Vertex) for full flows
# Install
bun install
# Optional: local Postgres (port 5140)
docker compose up -d postgres
# Env — copy `.env.example` → `.env` and/or `apps/website/.env`
# Generate Prisma client / migrate as needed
bun run --filter @drized/db db:generate
# bun run --filter @drized/db db:migrate
# Dev (website + package watchers via Turbo)
bun run devWebsite defaults to port 5000 (next dev).
Useful scripts from the repo root:
bun run build # turbo build
bun run lint
bun run check-types
bun run deploy:infra # SST deploy (@drized/infra)Do not commit .env files. Start from .env.example. Typical variables:
Website / shared
DATABASE_URL,DIRECT_URLCLERK_SECRET_KEY,NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY,CLERK_WEBHOOK_SECRETDODO_PAYMENT_API_KEY,DODO_PAYMENT_PRODUCT_ID,DODO_WEBHOOK_SECRETR2_ENDPOINT,R2_ACCESS_KEY_ID,R2_SECRET_ACCESS_KEY,R2_BUCKET_NAMEAWS_REGION,AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEYEXTRACT_QUEUE_URL,GENERATE_QUEUE_URL,CLOTHES_EXTRACTOR_FUNCTION_NAMEGOOGLE_CLOUD_PROJECT,GOOGLE_SERVICE_ACCOUNT_JSON(workers; may also be needed for local try-on)DISCORD_WEBHOOK_URLNEXT_PUBLIC_WEBSITE_URL,NEXT_PUBLIC_MIXPANEL_API_KEY
Workers / scrape (SST deploy + ClothesExtractor)
- Above
DATABASE_URL,R2_*, Google vars SCRAPER_PROXY_SERVER,SCRAPER_PROXY_USERNAME,SCRAPER_PROXY_PASSWORD(optional residential proxy)
Ops / Wrangler (local only, not required on Vercel)
CLOUDFLARE_ACCOUNT_ID,CLOUDFLARE_API_TOKEN— manage R2 via Wrangler; keep separate fromR2_SECRET_ACCESS_KEY(S3 API secret)
Turbo lists many of these under globalEnv in turbo.json.
- Project points at
apps/website - Set production env vars (R2 signing keys required; public bucket access should stay off)
- Dodo webhook:
https://<your-domain>/api/payments/webhook
See infra/README.md. From repo root with AWS + env loaded:
cd infra
bun run deploy --stage productionWire SST outputs (EXTRACT_QUEUE_URL, GENERATE_QUEUE_URL, CLOTHES_EXTRACTOR_FUNCTION_NAME) into Vercel.
User photos and try-on results live in a private R2 bucket. The app serves short-lived signed GET URLs; do not re-enable public r2.dev / custom-domain public access without revisiting that design.
- Redis in
docker-compose.ymlis unused by the current Next + SQS architecture (leftover from the old Nest/BullMQ stack). - Runtime input validation for server actions uses zod in
apps/website/src/_actions.
See CONTRIBUTING.md. Security reports: SECURITY.md. Conduct: CODE_OF_CONDUCT.md.
MIT — see LICENSE.
