Ecommerce Template
Next.js·React 등으로 만든 최신 전자상거래 템플릿
Spooky Threads에서 할로윈 스웨터·티·모자·머그·홈데코 등 포근하고 귀여운 아이템을 시즌 내내 구매하세요
Halloween sweaters, tees, hats, mugs, and home decor. Shop Spooky Threads for cozy, spooky-cute apparel and gifts all season long.
커머스TypeScript · CSSGitHub @SuzanneV0온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Halloween apparel shop — practice project for a course on AI chatbot + Stripe integration
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A Halloween-themed apparel and home goods shop, built as a practice project for a course on integrating AI chatbots and Stripe payments into an online store. This is a dry run before the real store launches.
• Next.js (App Router, TypeScript)
• Supabase — database, auth, and admin backend
• Stripe Checkout for payments
• Anthropic API (@anthropic-ai/sdk, Claude Haiku 4.5) for the shopping assistant chatbot
• Resend for transactional email (welcome, order confirmation, password reset)README 전문 보기 ↗A Halloween-themed apparel and home goods shop, built as a practice project for a course on integrating AI chatbots and Stripe payments into an online store. This is a dry run before the real store launches.
@anthropic-ai/sdk, Claude Haiku 4.5) for the shopping assistant chatbotnpm install
npm run db:migrate # create the tables in your Turso database
npm run db:seed # load the product catalog from db/catalog.json
npm run dev
.env.local needs these to run at all:
TURSO_DATABASE_URL / TURSO_AUTH_TOKEN — from the Turso dashboard: open the database, copy its URL (libsql://…) and click Create Token. The token is server-only; the browser never talks to the database directly, only through the app's API routes.NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY / CLERK_SECRET_KEY — from the Clerk dashboard → API keys (clerk init writes these for you).Add your own ANTHROPIC_API_KEY (create one at console.anthropic.com — new accounts get a small free credit) to turn on the chat assistant.
Checkout needs three more values in .env.local:
STRIPE_SECRET_KEY / STRIPE_PUBLISHABLE_KEY — from the Stripe dashboard (test mode)STRIPE_WEBHOOK_SECRET — run stripe listen --forward-to localhost:3000/api/webhooks/stripe locally to get one, or add a webhook endpoint in the Stripe dashboard pointing at <your-deployed-url>/api/webhooks/stripe (subscribed to checkout.session.completed) and use the signing secret it gives youTransactional email needs one more value:
RESEND_API_KEY — from the Resend dashboard. Sending also requires verifying a domain in Resend (Domains → Add Domain) and adding the SPF/DKIM records it gives you at your DNS provider — until that's done, lib/email/send.ts logs a warning and skips sending instead of failing the request. Emails are currently sent from [email protected] (EMAIL_FROM in lib/site.ts).The contact form's spam protection needs two more values:
NEXT_PUBLIC_RECAPTCHA_SITE_KEY / RECAPTCHA_SECRET_KEY — register the site (v2 "I'm not a robot" checkbox) at the reCAPTCHA admin console. Without these, /contact skips rendering the widget and the API route skips verification — fine for local dev, but set them in production.Error monitoring needs four more values, all provisioned automatically in Vercel by the Sentry integration (Vercel dashboard → Project → Integrations → Sentry → Connect to Project) — pull them into .env.local with vc env pull if you want errors reported locally too:
NEXT_PUBLIC_SENTRY_DSN — where the SDK sends events. Safe to expose client-side; it's a write-only ingestion address, not a secret.SENTRY_ORG / SENTRY_PROJECT / SENTRY_AUTH_TOKEN — used at build time to upload source maps so stack traces in Sentry show real code instead of minified output.public/products/, components/ProductPhoto.tsx) — falling back to hand-illustrated SVG art in the brand color palette (components/ProductArt.tsx, lib/productArt.ts) if a photo fails to load.components/CartProvider.tsx). Checkout requires being logged in, creates a Stripe Checkout Session (app/api/checkout/route.ts) with prices looked up server-side (never trusts the client), and a webhook (app/api/webhooks/stripe/route.ts) creates the orders/order_items rows once payment completes./sign-in, /sign-up; the old /login and /signup URLs redirect there), with an account area for saved items, wishlist, addresses, and order history (app/account/*)./admin (gated to accounts with is_admin = true on their profile) for managing products and order statuses./whimsical-goth is a pillar page targeting "whimsical goth year round", linking out to four hand-written seasonal pages (/whimsical-goth/spring|summer|fall|winter) that each pull a real product row from a matching collection. All five are in app/sitemap.ts and linked from the footer.components/ChatWidget.tsx) backed by the Anthropic API (app/api/chat/route.ts), grounded in the live product catalog so it only recommends real products and links to them. Rate-limited to 5 messages/day per visitor./quiz matches shoppers to one of five tropes, saves the result to their profile if logged in, and recommends products from the matching collection. Rate-limited to 2 completions/day per visitor — unlimited for subscribers.Sign up for an account on the site, then find your user id (user_…) in the Clerk dashboard → Users, and run this in the Turso dashboard's SQL console (or ask Claude):
UPDATE profiles SET is_admin = 1 WHERE id = 'user_...';
app/ — pages (App Router)components/ — shared UI, providers (auth, cart), product artdb/schema.sql — the database tables; db/catalog.json — the product catalog (npm run db:seed)lib/db/client.ts — the server-only Turso client; lib/queries.ts — catalog queries; lib/auth.ts — Clerk session + profile helpersapp/api/ — every database write from the browser goes through a route here, scoped to the signed-in userlib/nav.ts — the site's nav/footer link structurelib/productArt.ts — per-product illustration color + motif mappingapp/api/chat/route.ts)app/api/checkout/route.ts) and move the cart to real checkoutorders rowsRESEND_API_KEY above/contact) — needs NEXT_PUBLIC_RECAPTCHA_SITE_KEY / RECAPTCHA_SECRET_KEY in production, see above/subscriptionsmode: "subscription"app/api/subscribe/route.tscheckout.session.completedprofiles.subscription_tierprevious_subscription_idapp/api/subscribe/cancel/route.tslib/rateLimit.ts and a single atomic upsert on the feature_usage table enforce the AI-feature daily limits server-side, keyed by account (logged in) or an anonymous cookie (guests) — so it can't be bypassed by clearing client state.lib/email/layout.ts) in the site's own color palette. Two emails: a welcome email the first time a new account is seen (getOrCreateProfile in lib/auth.ts), and an order confirmation sent from the Stripe webhook once an order is created. Password resets are handled by Clerk. Sending is best-effort: if RESEND_API_KEY isn't set or a domain isn't verified yet, it logs and moves on rather than blocking signup or checkout./contact (components/ContactForm.tsx), linked only from the footer. Name, email, a topic dropdown (general inquiry, orders, subscriptions, other), and a message — gated by a reCAPTCHA v2 checkbox verified server-side (app/api/contact/route.ts) before the message is emailed to CONTACT_EMAIL (lib/site.ts) via the same Resend layout used elsewhere.instrumentation.ts + instrumentation-client.ts capture unhandled errors from server, edge (middleware.ts), and client code; app/error.tsx and app/global-error.tsx catch React rendering errors and report them via Sentry.captureException while showing a branded fallback instead of a blank crash screen. next.config.ts uploads source maps at build time so stack traces show real code.