A modern, regional craftsmen directory platform connecting customers with verified craftsmen in Bavaria, Germany.
- Framework: Next.js 15 (App Router, React Server Components)
- Language: TypeScript (strict mode)
- Styling: Tailwind CSS + shadcn/ui
- Backend: Supabase (PostgreSQL, Auth, Storage)
- Forms: React Hook Form + Zod
- Icons: Lucide React
- Deployment: Vercel
- Node.js 18.x or higher
- npm or yarn
- Supabase account
- Stripe account (for payments)
git clone https://github.com/yourusername/meisterfinder.git
cd meisterfindernpm installCopy .env.local.example to .env.local and fill in your credentials:
cp .env.local.example .env.localRequired environment variables:
NEXT_PUBLIC_SUPABASE_URL: Your Supabase project URLNEXT_PUBLIC_SUPABASE_ANON_KEY: Your Supabase anonymous keySUPABASE_SERVICE_ROLE_KEY: Your Supabase service role keySTRIPE_PUBLISHABLE_KEY: Your Stripe publishable keySTRIPE_SECRET_KEY: Your Stripe secret keyRESEND_API_KEY: Your Resend API key
npm run devOpen http://localhost:3000 with your browser.
├── app/ # Next.js App Router
│ ├── (routes)/ # Public routes
│ ├── dashboard/ # Protected dashboard
│ ├── api/ # API routes
│ └── layout.tsx # Root layout
├── components/
│ ├── ui/ # shadcn/ui components
│ ├── features/ # Feature-specific components
│ └── layout/ # Layout components
├── lib/
│ ├── supabase/ # Supabase clients
│ ├── actions/ # Server Actions
│ ├── utils/ # Utility functions
│ └── validations/ # Zod schemas
├── types/ # TypeScript types
├── config/ # Configuration files
└── public/ # Static assets
- Primary: Blue (#3B82F6) - Trust, professionalism
- Secondary: Orange (#F97316) - Energy, craftsmanship
- Font: Inter (system font)
- Scale: Tailwind default scale
Built with shadcn/ui for:
- Consistency
- Accessibility (WCAG 2.1 AA)
- Customizability
Using Supabase Auth with:
- Email/Password authentication
- Email verification
- Password reset
- Protected routes via middleware
Main tables:
profiles- User profileslistings- Business listingscategories- Craftsmen categoriesreviews- Customer reviewsleads- Customer inquiries
See types/database.ts for full schema.
- Push to GitHub
- Import project in Vercel
- Add environment variables
- Deploy
Make sure to add all environment variables from .env.local to your Vercel project settings.
- TypeScript strict mode
- Named exports preferred
- Server Components by default
- Client Components only when needed
- Zod for validation
- German for all user-facing text
- English for code and comments
- WCAG 2.1 AA compliance
- Semantic HTML
- ARIA labels where needed
- Keyboard navigation
# Run linter
npm run lint
# Format code
npm run formatMIT License - see LICENSE file for details
Contributions are welcome! Please read our contributing guidelines first.
For support, email support@meisterfinder.de or open an issue on GitHub.