Saleor Store
우리 컬렉션을 쇼핑하세요
셀카 몇 장 업로드하면 2시간 이내 스튜디오 퀄리티 AI 헤드샷 제공, 전문·창의·비즈니스 스타일, 14일 환불 보장
Upload a few selfies, get studio-quality AI headshots in under 2 hours. Professional, creative & business styles. 14-day money-back guarantee.
커머스TypeScript · PLpgSQLGitHub @marblesinkco-source온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Professional AI-powered headshot generator -- a complete SaaS platform that lets users upload selfies and receive studio-quality professional headshots in minutes.README 전문 보기 ↗Professional AI-powered headshot generator -- a complete SaaS platform that lets users upload selfies and receive studio-quality professional headshots in minutes.
| Layer | Technology |
|---|---|
| Framework | Next.js 14 (App Router) |
| Language | TypeScript |
| Styling | Tailwind CSS |
| Auth & DB | Supabase (PostgreSQL + RLS) |
| Payments | Paddle (Merchant of Record) |
| AI Generation | Replicate |
| Resend | |
| Storage | Supabase Storage |
| Hosting | Vercel / Docker / VPS |
# 1. Clone the repository
git clone <your-repo-url> ai-headshot-pro
cd ai-headshot-pro
# 2. Run the setup script
./scripts/setup.sh
# 3. Fill in .env.local with your API keys (see Environment Variables below)
# 4. Run the database migration in Supabase SQL Editor
# (paste contents of src/database/migrations/001_initial.sql)
# 5. Start the dev server
npm run dev
Open http://localhost:3000 in your browser.
Copy .env.example to .env.local and fill in each value:
| Variable | Required | Description |
|---|---|---|
NEXT_PUBLIC_APP_URL | Yes | Your app URL (e.g. https://yourapp.com) |
NEXT_PUBLIC_SUPABASE_URL | Yes | Supabase project URL |
NEXT_PUBLIC_SUPABASE_ANON_KEY | Yes | Supabase anonymous/public key |
SUPABASE_SERVICE_ROLE_KEY | Yes | Supabase service role key (server only) |
PADDLE_API_KEY | Yes | Paddle API key |
PADDLE_WEBHOOK_SECRET | Yes | Paddle webhook signing secret |
NEXT_PUBLIC_PADDLE_CLIENT_TOKEN | Yes | Paddle client-side token |
NEXT_PUBLIC_PADDLE_ENV | No | sandbox or production (default: sandbox) |
REPLICATE_API_TOKEN | Yes | Replicate API token |
RESEND_API_KEY | Yes | Resend API key for transactional email |
EMAIL_FROM | No | Sender address (default: noreply@...) |
src/database/migrations/001_initial.sql and run it.uploads and headshots..env.local.The migration creates:
profiles -- user profile data, auto-created on signuporders -- purchase orders with status trackinguploaded_photos -- user-uploaded training photosgenerated_headshots -- AI-generated resultsAll tables have Row Level Security (RLS) policies so users can only access their own data.
# Install Vercel CLI
npm i -g vercel
# Deploy
./scripts/deploy.sh
Or connect the repo to Vercel via the dashboard. The included vercel.json configures the build and sets the region to fra1 (Frankfurt).
Set all environment variables in Vercel Dashboard > Settings > Environment Variables.
# Build and run
docker compose up -d --build
# View logs
docker compose logs -f
# Stop
docker compose down
Set environment variables in a .env file in the project root.
# Build standalone output
npm run build
# The standalone build is in .next/standalone
# Copy .next/standalone, .next/static, and public to your server
# Run
NODE_ENV=production node .next/standalone/server.js
Use a reverse proxy (nginx, Caddy) to terminate TLS and forward to port 3000.
src/
app/ # Next.js App Router pages and API routes
api/
ai/ # AI generation + webhook endpoints
payments/ # Paddle checkout session creation
webhooks/paddle/ # Paddle webhook handler (active)
webhooks/stripe/ # Legacy Stripe webhook handler (deprecated)
gallery/ # Gallery data + download + favorites
upload/ # Photo upload endpoint
auth/ # Login, register, OAuth callback
dashboard/ # Protected user dashboard pages
components/
dashboard/ # Dashboard-specific components
marketing/ # Landing page sections
ui/ # Reusable UI primitives (Button, Card, Badge)
config/ # Site metadata, packages, AI prompt config
core/ # Provider-pattern service layer
ai/ # AI provider interface + Replicate implementation
email/ # Email provider interface + Resend implementation
payments/ # Payment provider interface + Paddle implementation
storage/ # Storage provider interface + Supabase implementation
database/
migrations/ # SQL migration files for Supabase
lib/
supabase/ # Supabase client (browser, server, middleware)
utils.ts # Shared utilities (cn, formatters)
types/ # Shared TypeScript types
Each external service (AI, payments, email, storage) follows the same pattern:
core/<service>/
types.ts # Interface definition
index.ts # Factory function that returns the active provider
providers/
<name>.ts # Concrete implementation
This makes it straightforward to swap providers without modifying business logic.
src/core/ai/providers/<name>.ts:import type { AIProvider } from '../types';
export const myProvider: AIProvider = {
async generateHeadshots(input) {
// Call your AI API here
// Return an array of image URLs
},
async checkStatus(jobId) {
// Return the current job status
},
};
src/core/ai/index.ts:import { myProvider } from './providers/my-provider';
export function getAIProvider(): AIProvider {
if (process.env.AI_PROVIDER === 'my-provider') {
return myProvider;
}
return replicateProvider; // default
}
Follow the same pattern under src/core/payments/:
PaymentProvider interface in providers/<name>.ts.index.ts to return it based on config..env.example.| Command | Description |
|---|---|
npm run dev | Start development server |
npm run build | Production build |
npm run start | Start production server |
npm run lint | Run ESLint |
npm run paddle:listen | Info on local Paddle webhook testing |
./scripts/setup.sh | Interactive first-time setup |
./scripts/deploy.sh | Type-check, build, and deploy |
This software is proprietary. Unauthorized copying, distribution, or modification is strictly prohibited. See your license agreement for permitted use.