SoleStudio Pro transforms amateur shoe photos into professional, studio-quality product shots in a single step: your photo and a locked commercial-photography prompt are sent to a Google Nano Banana image model via OpenRouter.
- One-Click Studio Render — Upload a shoe photo, pick a model, generate. No multi-step pipeline to babysit.
- Model Choice — Switch between Nano Banana 2 (fast,
gemini-3.1-flash-image-preview) and Nano Banana Pro (best quality,gemini-3-pro-image-preview). - Quality Control — Pick 1K, 2K, or 4K output (defaults to 1K).
- Exact Product Preservation — The locked system prompt instructs the model to keep design, proportions, colors, materials, and branding identical to the source photo.
- Local Auth — Credential-based sign-up / sign-in backed by a local CSV store with bcrypt hashing and JWT session cookies. No third-party auth service required.
Single Next.js (App Router) process — pages and API live in the same server.
Next.js (:3000)
├── / landing page
├── /auth sign in / sign up
├── /app studio (protected by AuthGuard)
│
├── POST /api/auth/signup bcrypt(12) → data/users.csv → JWT cookie
├── POST /api/auth/signin constant-time compare → JWT cookie
├── GET /api/auth/session verify JWT cookie
├── POST /api/auth/signout clear cookie
└── POST /api/generate → OpenRouter chat/completions (modalities: image+text, image_config.image_size)
→ google/gemini-3.1-flash-image-preview | google/gemini-3-pro-image-preview
(OPENROUTER_API_KEY stays server-side; -preview slugs required for 4K)
| Layer | Technology |
|---|---|
| Framework | Next.js 16 (App Router), React 19, TypeScript |
| Styling | Tailwind CSS v4, Framer Motion |
| Animations | GSAP (auth loading sequence) |
| Auth | Route Handlers + bcryptjs + JWT httpOnly cookie |
| AI | Nano Banana 2 / Pro (google/gemini-3.1-flash-image-preview, google/gemini-3-pro-image-preview) via OpenRouter |
- Node.js LTS
- An OpenRouter API key
git clone https://github.com/Yassiinee/sole-studio.git
cd sole-studio
npm install
cp .env.example .envEdit .env:
OPENROUTER_API_KEY=sk-or-v1-...
JWT_SECRET=<generate: node -e "require('crypto').randomBytes(32).toString('hex')|console.log()">npm run dev # Next.js dev server on :3000Open http://localhost:3000.
For production:
npm run build
npm run startApache-2.0 — see LICENSE.
Author: Yassine Zakhama — zakhamayassine@gmail.com
