World Vibe Web
The distributed app store for vibe-coded projects. Browse, discover, and install open-source apps from across GitHub.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Next.js marketplace for suppliers (catalog, API) and creators/affiliates (storefronts, margins). Buyers shop curated listings. EU-first defaults in lib/market-config.ts.
• Node 24+
• PostgreSQL (prisma/schema.prisma)
• Copy .env.example → .env
• Optional local overrides: .env.local.example → .env.local (PORT=3001, OAuth URLs)檢視完整 README ↗Next.js marketplace for suppliers (catalog, API) and creators/affiliates (storefronts, margins). Buyers shop curated listings. EU-first defaults in lib/market-config.ts.
prisma/schema.prisma).env.example → .env.env.local.example → .env.local (PORT=3001, OAuth URLs)npm install
npm run db:local:setup # optional local Docker DB
npm run dev # http://localhost:3001 (or next free port)
npm run dev:url # print current dev origin (respects PORT)
scripts/next-dev-port.mjs, Playwright). Set PORT, NEXT_PUBLIC_APP_URL, and NEXTAUTH_URL together (see .env.local.example).curl "http://localhost:3001/path?wizard=v2" — or use npm run dev:open:wizard-v2 (builds the URL in Node).| URL | Persona | Primary CTA |
|---|---|---|
/en, /fr | Buyer | Explore catalog → /marketplace |
/en/creators, /fr/creators | Creator | Create store → /signup/affiliate?role=creator |
/en/partners, /fr/partners | Supplier/brand | Become partner → /signup/supplier?role=supplier |
Legacy paths redirect: / → /en, /creators → /en/creators.
i18n/routing.ts — locales en | fr | de | es | it | nl | pl | zhi18n/request.ts — messages + cookie affisell_localemiddleware.ts — next-intl + auth (merged)messages/{locale}.json — full UI bundles (1722+ keys each)scripts/i18n-translate-locale.mjs — Groq batch translate + parity checkcomponents/LanguageSwitcher.tsx — 8-locale dropdowncomponents/HeroSection.tsx — persona herocomponents/BentoGrid.tsx — buyer bento (4 cards)components/FeatureCard.tsx — feature tilecomponents/AnimatedCounter.tsx — react-countupcomponents/CommandK.tsx — cmdk + fuzzy + product previewcomponents/TestimonialCarousel.tsx — embla carouselcomponents/MarketingFooter.tsx| Command | Purpose |
|---|---|
npm run dev | Prisma generate + Next dev |
npm run build | Production build |
npm run lint | ESLint |
npm run test | Vitest |
npm run test:e2e | Playwright |
cmdk — command paletteembla-carousel-react — carouselsreact-countup — animated numbers@vercel/analytics — CTA/page analyticsnext-intl, next-themes, framer-motion (already used)GET /api/og?title=...&subtitle=... — dynamic 1200×630 image.
Never edit applied migrations. Change schema.prisma then npx prisma migrate dev --name xxx. See .cursorrules.
Cascade IA temps réel pour le wizard v2 (mode InstantScan, ex-Guidé) : CLIP 200ms → GPT-4o-mini 800ms → GPT-4o 2sec.
| Métrique | Cible |
|---|---|
| Précision | 98.5% (top 100 SKUs 2024–2026) |
| Latence p95 | <2 s |
| Coût | ~0.003 $/analyse |
Flags : ENABLE_INSTANTSCAN=1 (prod). Retrocompat : ENABLE_AI_VISION_V2=1 + ENABLE_AI_VISION_CASCADE=1 si ENABLE_INSTANTSCAN=0.
Telemetry : PostHog instant_scan_result, instant_scan_gate_triggered — dashboard stub /admin/instantscan-performance.
npm run push:safe
When a marketplace order is paid, Affisell can place the matching dropship order on AliExpress Open API (DS).
Stripe checkout.session.completed (paid)
→ Order status=paid + shippingAddress snapshot
→ triggerAutoFulfillmentForStripeSession
├─ auto-buy queue (FulfillmentLog) → createAliExpressDsOrder
│ fallback: browser checkout + Stripe Issuing card
└─ universal auto-order batch → AliExpressSupplierAdapter.placeOrder
→ Order.supplierOrderId = AE order id, status=fulfilling
| Var | Role |
|---|---|
ALIEXPRESS_APP_KEY / APP_SECRET | Open Platform app (e.g. 534690) |
ALIEXPRESS_ACCESS_TOKEN / REFRESH_TOKEN | Bootstrap; auto-refresh → DB (PlatformOAuthCredential) |
CRON_SECRET | Auth for create/fulfill/refresh routes |
ENCRYPTION_KEY | Encrypt tokens at rest |
AE_DRY_RUN=true | Fake AE order ids (no real DS place) |
DISABLE_AUTO_BUY=true | Kill switch |
# 1) Place DS order directly (test product + SKU) — MUST pass CRON_SECRET
curl -sS -X POST "https://affisell-market.vercel.app/api/aliexpress/order/create" \
-H "Authorization: Bearer $CRON_SECRET" \
-H "Content-Type: application/json" \
-d '{
"supplierProductId":"100500123",
"skuId":"120000123",
"quantity":1,
"shippingAddress":{
"name":"Test Buyer",
"phone":"+33612345678",
"address1":"10 Rue de Rivoli",
"city":"Paris",
"zip":"75001",
"countryCode":"FR",
"state":"IDF"
}
}'
# → { "ok":true, "aliexpressOrderId":"…", "trackingPreview":null }
# Equivalent auth options:
# -H "x-cron-secret: $CRON_SECRET"
# "?secret=$CRON_SECRET" on the URL
# JSON field "secret":"$CRON_SECRET" in the body
# 2) Fulfill a paid Affisell order (idempotent)
curl -sS -X POST "https://affisell-market.vercel.app/api/orders/$ORDER_ID/fulfill" \
-H "Authorization: Bearer $CRON_SECRET"
# → { "ok":true, "aliexpressOrderId":"…", "status":"fulfilling" }
# Async (BullMQ / Inngest event order.paid, retry 3×):
curl -sS -X POST "https://affisell-market.vercel.app/api/orders/$ORDER_ID/fulfill" \
-H "Authorization: Bearer $CRON_SECRET" \
-H "Content-Type: application/json" \
-d '{"async":true}'
Auth alternatives: x-cron-secret, ?secret=, JSON secret, or HMAC-SHA256 of body in x-affisell-signature (secret = CRON_SECRET).
npm run worker:auto-order # REDIS_URL required — listens order.paid + auto-buy
lib/aliexpress-mapping.ts → mapAffisellAddressToAliExpress() builds AE logistics_address (contact_person, full_address, city, province, zip, country, mobile_no, phone_country). Logs only city + zip (never full street).
Place-order uses the official DTO (param_place_order_request4_open_api_d_t_o with logistics_address + product_items), signed with Open Platform HMAC-SHA256 on api-sg.aliexpress.com/sync (aliexpress.ds.order.create → fallback aliexpress.trade.buy.placeorder). Prefer a real AE sku_attr (ex. 14:200003699#Black), not a placeholder sku id.
Cron every 12h: GET /api/aliexpress/refresh (see vercel.json).
Virtual try-on for apparel listings (Replicate IDM-VTON). Feature flag OFF in production by default (TRY_ON_ENABLED=0). QA: append ?tryon=true on the PDP.
main includes /api/try-on/*).REPLICATE_API_TOKENBLOB_READ_WRITE_TOKENUPSTASH_REDIS_REST_URL + UPSTASH_REDIS_REST_TOKENTRY_ON_ENABLED=1 when ready (else QA with ?tryon=true)AZURE_CONTENT_SAFETY_*, REPLICATE_WEBHOOK_SECRETnpm run migrate:deploy): 20260618200000_try_on_ai.vercel.json runs /api/cron/try-on-retention daily (GDPR blob cleanup).TRYON_PILOT_GARMENT_URL="https://…/cutout.png" npm run tryon:pilot
Or supplier dashboard → product → AI Try-On → upload PNG → Save.curl -s "https://affisell.com/api/try-on?jobId=test&tryon=true"
# → {"error":"Job not found"} (route live, not HTML 404)
Product.tryOnGarmentUrl).tryOnEnabled + garment URL are set.app/api/try-on/openapi.jsonPOST /api/try-on/upload — shopper photo → Vercel Blob (WebP ≤1024px)POST /api/try-on — start async job (returns jobId)GET /api/try-on?jobId= — poll statusPOST /api/try-on/webhook — Replicate completion| Visitor | Limit |
|---|---|
| Anonymous | 1 lifetime try (tryon_anon_id cookie + IP hash) |
| Logged-in | 5/min, 10/day (Upstash) |
Affisell+ (User.isPro) | Unlimited |
Cron GET /api/cron/try-on-retention (Bearer CRON_SECRET): delete input blobs after 24h, output records after 30 days.
Sentry spans tagged feature: tryon, model: idm-vton. Business logs: [try-on] { jobId, productId, latencyMs }. Analytics table: TryOn + TryOnJob.
Native Virtual Try-On on Medusa v2 (medusa-backend/) — linked Product module, admin widget, store API whitelist. Existing Affisell /api/try-on is unchanged.
┌─────────────┐ GET /store/products?handle=x ┌──────────────────┐
│ Next.js │ ───────────────────────────────────►│ Medusa Store API │
│ /produits/* │ try_on_enabled, tryon_garment_url │ + try-on module │
└──────┬──────┘ └────────┬─────────┘
│ POST /api/try-on (selfie + garment_url) │
└──────────────────────────────────────────────────────►│ Replicate IDM-VTON
MEDUSA_BACKEND_URL="https://medusa.example.com"
NEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY="pk_…"
NEXT_PUBLIC_MEDUSA_BACKEND_URL="https://medusa.example.com" # optional client
TRY_ON_ENABLED=1
curl -s "$MEDUSA_BACKEND_URL/store/products?handle=leggings-demo&fields=try_on_enabled,tryon_garment_url" \
-H "x-publishable-api-key: $NEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY"
curl -X POST "$MEDUSA_BACKEND_URL/admin/products/$ID/try-on" \
-H "Authorization: Bearer $MEDUSA_ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"try_on_enabled":true,"tryon_garment_url":"https://….blob.vercel-storage.com/flat.png"}'
Front route: /produits/[handle] · Medusa docs: medusa-backend/README.md · E2E: MEDUSA_E2E_ENABLED=1 npm run test:e2e -- e2e/medusa-try-on.spec.ts
See .env.example — REPLICATE_API_TOKEN, BLOB_READ_WRITE_TOKEN, UPSTASH_REDIS_REST_*, optional Azure Content Safety.