Go to file
Timo 0b5ea28fb6 feat: Add initial global CSS styles, including Tailwind directives, custom animations, and utility classes for common UI components. 2026-01-04 22:56:48 +01:00
.claude qrmaster.net 2025-12-09 22:22:36 +01:00
.github/workflows Initial commit - QR Master application 2025-10-13 20:19:18 +02:00
.vscode Initial commit - QR Master application 2025-10-13 20:19:18 +02:00
blog-posts-improved MVP ready to test 2025-10-28 17:20:37 +01:00
docker Initial commit - QR Master application 2025-10-13 20:19:18 +02:00
prisma Nextr.js 2026-01-01 15:59:08 +01:00
public qrmaster.net 2025-12-09 22:22:36 +01:00
scripts Initial commit - QR Master application 2025-10-13 20:19:18 +02:00
src feat: Add initial global CSS styles, including Tailwind directives, custom animations, and utility classes for common UI components. 2026-01-04 22:56:48 +01:00
..md . 2025-12-11 16:47:40 +01:00
.dockerignore Initial commit - QR Master application 2025-10-13 20:19:18 +02:00
.editorconfig Initial commit - QR Master application 2025-10-13 20:19:18 +02:00
.env.example Initial commit - QR Master application 2025-10-13 20:19:18 +02:00
.gitignore Fix: Add dynamic export to analytics route and exclude dev-server from deploy 2025-10-13 21:17:58 +02:00
.npmrc Initial commit - QR Master application 2025-10-13 20:19:18 +02:00
.prettierrc Initial commit - QR Master application 2025-10-13 20:19:18 +02:00
.vercelignore Update Next.js to 14.2.18 to fix build stack overflow 2025-10-14 11:35:55 +02:00
CHANGELOG.md Initial commit - QR Master application 2025-10-13 20:19:18 +02:00
DEPLOYMENT_CHECKLIST.md Final 2025-12-31 17:45:49 +01:00
DOCKER_SETUP.md Initial commit - QR Master application 2025-10-13 20:19:18 +02:00
Dockerfile chore: Update Dockerfile URLs to HTTPS and add `test.md`. 2026-01-01 20:28:36 +01:00
LICENSE MVP 2025-10-18 17:55:32 +02:00
MIGRATION_FROM_SUPABASE.md Wichige änderung an DB 2025-11-05 12:02:59 +01:00
README.md qrmaster.net 2025-12-09 22:22:36 +01:00
SETUP_COMPLETE.md Initial commit - QR Master application 2025-10-13 20:19:18 +02:00
blog-posts-seo-guide.md MVP ready to test 2025-10-28 17:20:37 +01:00
dev-server.js vercel 2025-10-13 21:05:50 +02:00
docker-compose.dev.yml Initial commit - QR Master application 2025-10-13 20:19:18 +02:00
docker-compose.yml Final 2025-12-31 17:45:49 +01:00
env.example Wichige änderung an DB 2025-11-05 12:02:59 +01:00
next-sitemap.config.js qrmaster.net 2025-12-09 22:22:36 +01:00
next.config.mjs Final 2025-12-31 17:45:49 +01:00
package-lock.json 0 vulnerability 2026-01-01 16:17:14 +01:00
package.json 0 vulnerability 2026-01-01 16:17:14 +01:00
postcss.config.js Initial commit - QR Master application 2025-10-13 20:19:18 +02:00
tailwind.config.js Initial commit - QR Master application 2025-10-13 20:19:18 +02:00
test.md chore: Update Dockerfile URLs to HTTPS and add `test.md`. 2026-01-01 20:28:36 +01:00
tsconfig.json Initial commit - QR Master application 2025-10-13 20:19:18 +02:00
vercel.json Initial commit - QR Master application 2025-10-13 20:19:18 +02:00

README.md

QR Master - Create Custom QR Codes in Seconds

A production-ready SaaS application for creating and managing QR codes with advanced tracking, analytics, and Stripe payment integration.

Features

  • 🎨 Custom QR Codes - Create static and dynamic QR codes with full customization
  • 📊 Advanced Analytics - Track scans, locations, devices, and user behavior
  • 🔄 Dynamic Content - Edit QR code destinations anytime without reprinting
  • 📦 Bulk Operations - Import CSV/Excel files to create up to 1,000 QR codes at once
  • 💳 Stripe Integration - FREE, PRO, and BUSINESS subscription plans with secure billing
  • 🎨 Custom Branding - Logo upload, custom colors (PRO+ plans)
  • 🌍 SEO Optimized - Schema.org structured data, meta tags, breadcrumbs
  • 🔒 Privacy-First - GDPR-compliant, hashed IPs, DNT headers respected
  • 📱 Responsive Design - Works perfectly on all devices

Tech Stack

  • Frontend: Next.js 14 (App Router), TypeScript, Tailwind CSS
  • Backend: Next.js API Routes, Prisma ORM
  • Database: PostgreSQL (with Prisma migrations)
  • Cache: Redis (optional)
  • Auth: NextAuth.js (Credentials + Google OAuth)
  • Payments: Stripe (Subscriptions & Webhooks)
  • QR Generation: qrcode library
  • Bulk Processing: Papa Parse (CSV), XLSX, JSZip
  • Analytics: PostHog (optional)
  • SEO: next-sitemap, Schema.org structured data

Quick Start

Prerequisites

  • Node.js 18+
  • Docker and Docker Compose V2
  • Git

Installation

Run database in Docker, app on host machine:

  1. Clone the repository:
git clone https://github.com/yourusername/qr-master.git
cd qr-master
  1. Install dependencies:
npm install
  1. Copy and configure environment:
cp env.example .env

Edit .env and set:

  • NEXTAUTH_SECRET (generate: openssl rand -base64 32)
  • IP_SALT (generate: openssl rand -base64 32)
  • (Optional) Google OAuth credentials
  1. Start database services:
npm run docker:dev
  1. Run database migrations and seed:
npx prisma migrate dev
npm run db:seed

Note: If you get migration errors, you can reset the database:

npx prisma migrate reset

This will drop the database, recreate it, run all migrations, and seed data.

  1. Start development server:
npm run dev
  1. Access the application:

Option 2: Full Docker (Production)

Run everything in Docker:

  1. Clone and setup:
git clone https://github.com/yourusername/qr-master.git
cd qr-master
cp env.example .env
# Edit .env with your configuration
  1. Build and start:
npm run docker:prod
  1. Run migrations:
docker-compose exec web npx prisma migrate deploy
  1. Access at http://localhost:3050

📚 For detailed Docker setup, see DOCKER_SETUP.md

Demo Account

After running npm run db:seed, use these credentials to test the application:

The seed script also creates sample QR codes for testing.

Development

Available Scripts

# Development
npm run dev                    # Start Next.js dev server (port 3050)
npm run build                  # Build for production
npm run start                  # Start production server

# Database
npm run db:generate            # Generate Prisma Client
npm run db:migrate             # Run migrations (dev mode)
npm run db:deploy              # Deploy migrations (production)
npm run db:seed                # Seed database with demo data
npm run db:studio              # Open Prisma Studio UI
npx prisma migrate reset       # Reset database (drop, recreate, migrate, seed)

# Docker
npm run docker:dev             # Start DB & Redis only
npm run docker:dev:stop        # Stop dev services
npm run docker:dev:clean       # Stop and clean containers
npm run docker:prod            # Start full stack (production)
npm run docker:stop            # Stop all services
npm run docker:logs            # View container logs
npm run docker:db              # PostgreSQL CLI
npm run docker:redis           # Redis CLI
npm run docker:backup          # Backup database to SQL file

Local Development (without Docker)

  1. Install dependencies:
npm install
  1. Set up PostgreSQL and Redis locally

  2. Configure .env with local database URL:

DATABASE_URL=postgresql://postgres:postgres@localhost:5435/qrmaster?schema=public
  1. Run migrations and seed:
npx prisma migrate dev
npm run db:seed
  1. Start dev server:
npm run dev

Resetting the Database

If you need to reset your database (drop all tables, recreate, and reseed):

# Full reset (drops database, reruns migrations, seeds data)
npx prisma migrate reset

# Or manually:
npx prisma migrate reset --skip-seed  # Reset without seeding
npm run db:seed                        # Then seed manually

This is useful when:

  • Schema has changed significantly
  • You have migration conflicts
  • You want to start fresh with clean data

Project Structure

qr-master/
├── src/
│   ├── app/                    # Next.js app router pages
│   ├── components/             # React components
│   ├── lib/                   # Utility functions and configurations
│   ├── hooks/                 # Custom React hooks
│   ├── styles/                # Global styles
│   └── i18n/                  # Translation files
├── prisma/                    # Database schema and migrations
├── docker/                    # Docker initialization scripts
│   ├── init-db.sh            # PostgreSQL initialization
│   └── README.md             # Docker documentation
├── public/                    # Static assets
├── docker-compose.yml         # Production Docker setup
├── docker-compose.dev.yml     # Development Docker setup
├── Dockerfile                # Container definition
├── DOCKER_SETUP.md           # Complete Docker guide
└── env.example               # Environment template

API Endpoints

Authentication

  • POST /api/auth/signin - Sign in with credentials
  • POST /api/auth/signout - Sign out
  • GET /api/auth/session - Get current session

QR Codes

  • GET /api/qrs - List all QR codes
  • POST /api/qrs - Create a new QR code (dynamic or static)
  • POST /api/qrs/static - Create a static QR code
  • GET /api/qrs/[id] - Get QR code details
  • PATCH /api/qrs/[id] - Update QR code
  • DELETE /api/qrs/[id] - Delete QR code
  • DELETE /api/qrs/delete-all - Delete all user's QR codes

Analytics

  • GET /api/analytics/summary - Get analytics summary for a QR code

User & Settings

  • GET /api/user/plan - Get current user plan
  • GET /api/user/stats - Get user statistics
  • POST /api/user/password - Update password
  • POST /api/user/profile - Update profile
  • DELETE /api/user/delete - Delete account

Stripe Payments

  • POST /api/stripe/checkout - Create checkout session
  • POST /api/stripe/portal - Create customer portal session
  • POST /api/stripe/webhook - Handle Stripe webhooks
  • POST /api/stripe/cancel-subscription - Cancel subscription

Public Redirect

  • GET /r/[slug] - Redirect and track QR code scan

Environment Variables

Variable Description Required Default
DATABASE_URL PostgreSQL connection string Yes postgresql://postgres:postgres@localhost:5435/qrmaster?schema=public
NEXTAUTH_URL Application URL Yes http://localhost:3050
NEXTAUTH_SECRET Secret for JWT encryption Yes Generate with openssl rand -base64 32
IP_SALT Salt for IP hashing (privacy) Yes Generate with openssl rand -base64 32
GOOGLE_CLIENT_ID Google OAuth client ID No -
GOOGLE_CLIENT_SECRET Google OAuth client secret No -
STRIPE_SECRET_KEY Stripe secret key No -
STRIPE_WEBHOOK_SECRET Stripe webhook signing secret No -
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY Stripe public key No -
NEXT_PUBLIC_INDEXABLE Allow search engine indexing No false (set to true in production)
REDIS_URL Redis connection string No redis://redis:6379
NEXT_PUBLIC_POSTHOG_KEY PostHog analytics key No -
NEXT_PUBLIC_POSTHOG_HOST PostHog host URL No -

Note: Copy env.example to .env and update the values before starting.

Generating Secrets

# Generate NEXTAUTH_SECRET
openssl rand -base64 32

# Generate IP_SALT
openssl rand -base64 32

Security & Privacy

  • IP Hashing: IP addresses are hashed with salt before storage (GDPR-compliant)
  • DNT Respect: Honors Do Not Track browser headers
  • Rate Limiting: API endpoints protected against abuse
  • CSRF Protection: Token-based CSRF validation on mutations
  • Secure Sessions: NextAuth.js with encrypted JWT tokens
  • Stripe Security: PCI-compliant payment processing
  • SQL Injection Prevention: Prisma ORM parameterized queries

Database Schema

The application uses PostgreSQL with Prisma ORM. Key models:

  • User: User accounts with Stripe subscription data
  • QRCode: QR code records (static/dynamic, multiple content types)
  • QRScan: Scan analytics data (hashed IP, device, location, UTM params)
  • Integration: Third-party integrations (Zapier, etc.)
  • Account/Session: NextAuth authentication data

Supported QR Code Types

  • URL: Website links
  • VCARD: Contact cards (name, email, phone, company)
  • GEO: GPS locations
  • PHONE: Phone numbers (tel: links)
  • TEXT: Plain text
  • SMS: SMS messages
  • WHATSAPP: WhatsApp messages

Plans

  • FREE: 3 dynamic QR codes, unlimited static
  • PRO: 50 codes, custom branding, advanced analytics
  • BUSINESS: 500 codes, bulk upload, API access, priority support

Deployment

The application includes production-ready Docker configuration with PostgreSQL and Redis:

# Build and start all services
docker-compose up -d --build

# Run migrations
docker-compose exec web npx prisma migrate deploy

# View logs
docker-compose logs -f

For detailed deployment instructions, see DOCKER_SETUP.md.

Vercel

  1. Push your code to GitHub
  2. Import the project in Vercel
  3. Add a PostgreSQL database (Vercel Postgres, Supabase, or other)
  4. Add environment variables in Vercel dashboard
  5. Deploy

Note: For Vercel deployment, you'll need to set up a PostgreSQL database separately.

Troubleshooting

Database Issues

Problem: Migration errors or schema conflicts

# Solution: Reset the database
npx prisma migrate reset

Problem: "Error: P1001: Can't reach database server"

# Check if Docker containers are running
docker ps

# Restart database
npm run docker:dev:stop
npm run docker:dev

Problem: Prisma Client out of sync

# Regenerate Prisma Client
npx prisma generate

Problem: Need to start completely fresh

# Stop all Docker containers
npm run docker:dev:stop

# Remove volumes (⚠️ deletes all data)
docker volume prune

# Restart everything
npm run docker:dev
npx prisma migrate dev
npm run db:seed

Port Already in Use

If port 3050 is already in use:

# Find and kill the process (Windows)
netstat -ano | findstr :3050
taskkill /PID <PID> /F

# Or change the port in package.json
"dev": "next dev -p 3051"

Docker Issues

Problem: Permission denied errors

# Windows: Run PowerShell as Administrator
# Linux/Mac: Use sudo for docker commands

Problem: Out of disk space

# Clean up Docker
docker system prune -a

Contributing

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add some amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

License

This project is licensed under the MIT License - see the LICENSE file for details.

Support

For support, email support@qrmaster.net or open an issue on GitHub.

Acknowledgments

  • Next.js team for the amazing framework
  • Vercel for hosting and deployment
  • All open-source contributors

Built with ❤️ by QR Master Team