Generate a theme, build a mini-site, publish it.
A full-stack web application where users can pick a design theme, build a mini-site using a page editor, and publish it to a public URL.
Live URL: https://vibe-kit-studio.netlify.app/
- Frontend: React + Vite + Tailwind CSS
- Backend: Netlify Functions (serverless Node.js)
- Database: PostgreSQL (Neon)
- Auth: JWT via httpOnly cookies + bcrypt password hashing
- Deployment: Netlify
git clone https://github.com/mdtaha-dev/Vibekit-Studio
cd vibekit-studionpm installcd netlify/functions
npm install
cd ../..Create a .env file in the project root:
DATABASE_URL=postgresql://your-neon-connection-string?sslmode=require
JWT_SECRET=your-jwt-secret-min-32-chars
APP_URL=http://localhost:5173
Run the SQL schema in your Neon SQL editor:
-- schema is in supabase/migrations/001_initial_schema.sqlnetlify devApp runs at http://localhost:8888
| Variable | Description |
|---|---|
DATABASE_URL |
PostgreSQL connection string |
JWT_SECRET |
Secret key for signing JWTs |
APP_URL |
Frontend URL for CORS |
You can sign up directly on the live site, or use:
- Email: test@example.com
- Password: password123
- Email and password authentication with JWT session via httpOnly cookie
- 6 design themes: Minimal, Neo-Brutal, Neon, Pastel, Luxury, Retro
- Page builder with Hero, Features, Gallery, and Contact sections
- Live preview with Desktop, Tablet, and Mobile toggle
- Auto-save while editing
- Publish and unpublish pages
- Public pages at
/p/:slugwith view counter - Contact form submissions stored in database
- Duplicate pages
- Section reordering
-
No drag and drop reordering — sections are reordered with up/down buttons. A proper drag and drop library like dnd-kit would significantly improve the editor UX.
-
Preview is inline not an iframe — the live preview renders React components directly rather than an isolated iframe. This means theme fonts from the published page may not fully match in the editor preview.
-
No image upload — gallery images require a URL. Integrating Cloudinary or an S3 bucket for direct image uploads would make the product significantly more usable.
-
Contact form does not send email — submissions are stored in the database only. Integrating Resend or Nodemailer would complete the contact flow end to end.
-
No custom slug editing — slugs are auto-generated from the page title. Allowing users to manually set a custom slug would improve the publishing experience.
Sessions are managed via JWT stored in an httpOnly cookie named vk_session. The token is signed with JWT_SECRET and expires in 7 days. All authenticated API endpoints verify the token server-side via the requireAuth utility in netlify/functions/_auth.js. Publish and unpublish actions are enforced server-side — the client cannot manipulate page status directly.