Synaplan
Open-source AI platform for companies: self-hosted AI agents, GDPR-compliant chatbot widget, RAG knowledge base, WhatsApp and Outlook AI, MCP, multi-model routing. Docker, Kubernetes or hosted in Germ
Manage car park bookings, analytics, and access control from one dashboard
AI summary · website content
BusinessTypeScript · PLpgSQLGitHub @EcroydOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗A multi-tenant parking management system built with Next.js 14, Supabase, and TypeScript.
src/
├── app/ # Next.js App Router pages
│ ├── (marketing)/ # Landing pages (optional)
│ ├── login/ # Authentication
│ ├── signup/
│ ├── onboarding/ # Tenant setup flow
│ ├── admin/ # Admin dashboard
│ │ ├── today/ # Today's operations
│ │ ├── bookings/ # Booking management
│ │ ├── uploads/ # Bulk upload wizard
│ │ ├── integrations/ # Third-party integrations
│ │ ├── devices/ # Gate device management
│ │ └── settings/ # Tenant settings
│ └── api/ # API routes
│ ├── tenant/ # Tenant resolution
│ ├── bookings/ # Booking CRUD
│ ├── anpr/ # ANPR hardware endpoint
│ ├── qr/ # QR code hardware endpoint
│ ├── webhooks/ # Third-party webhooks
│ └── cron/ # Scheduled jobs
├── lib/ # Core utilities
│ ├── supabase/ # Supabase clients
│ ├── auth/ # Authentication helpers
│ ├── tenant/ # Tenant resolution
│ ├── rls/ # Row Level Security
│ └── validation/ # Zod schemas
└── components/ # React components
├── ui/ # Base UI components
└── admin/ # Admin-specific components
Create a .env.local file:
# Supabase
NEXT_PUBLIC_SUPABASE_URL=your_supabase_url
NEXT_PUBLIC_SUPABASE_ANON_KEY=your_supabase_anon_key
SUPABASE_SERVICE_ROLE_KEY=your_supabase_service_role_key
# App Configuration
APP_BASE_DOMAIN=yourdomain.com
ENCRYPTION_KEY=your_32_character_encryption_key
# Stripe Connect (Required for payments)
# For development (test mode)
STRIPE_SECRET_KEY_TEST=sk_test_***
STRIPE_PUBLISHABLE_KEY_TEST=pk_test_***
# For production (live mode)
STRIPE_SECRET_KEY_LIVE=sk_live_***
STRIPE_PUBLISHABLE_KEY_LIVE=pk_live_***
# App configuration
NEXT_PUBLIC_ROOT_URL=https://yourdomain.com
STRIPE_API_VERSION=2025-09-30.clover
# Optional: For development
NEXT_PUBLIC_APP_BASE_DOMAIN=localhost:3000
# Copy the contents of supabase-schema.sql and run in Supabase
npm install
npm run dev
Visit http://localhost:3000 to start the application.
{slug}.localhost:3000For payment processing, set up Stripe Connect:
/admin/payments to connect Stripe accountsThe system integrates with your existing pricing engine - no product duplication required.
See STRIPE_INTEGRATED_SETUP.md for detailed instructions.
GET /api/tenant/resolve - Resolve tenant from domain or query parameterPOST /api/bookings/list - List bookings with filtersPOST /api/bookings/create - Create new bookingPOST /api/bookings/update - Update existing bookingPOST /api/bookings/delete - Cancel bookingPOST /api/bookings/upload - Bulk upload bookingsPOST /api/anpr - ANPR gate system endpointPOST /api/qr - QR code gate system endpointPOST /api/webhooks/parkvia - ParkVia webhook handlerPOST /api/webhooks/holidayextras - Holiday Extras webhook handlerPOST /api/stripe/webhook - Stripe webhook handlerPOST /api/payments/connect/onboard - Create/onboard connected accountGET /api/payments/connect/status - Get connection statusPOST /api/payments/checkout - Create checkout for bookingPOST /api/payments/booking-extension - Pay for booking extensionGET /api/cron/pull-parkvia - Sync ParkVia dataGET /api/cron/pull-holidayextras - Sync Holiday Extras dataPOST /api/internal/cron/ingest-canary - Ingest canary (Cloudflare Email Routing + Worker + /api/ingest/email). See INGEST_CANARY_README.md.NEXT_PUBLIC_SUPABASE_URL=your_production_supabase_url
NEXT_PUBLIC_SUPABASE_ANON_KEY=your_production_anon_key
SUPABASE_SERVICE_ROLE_KEY=your_production_service_role_key
APP_BASE_DOMAIN=yourdomain.com
ENCRYPTION_KEY=your_production_encryption_key
Set up Vercel Cron functions for data synchronization:
{
"crons": [
{
"path": "/api/cron/pull-parkvia",
"schedule": "0 */6 * * *"
},
{
"path": "/api/cron/pull-holidayextras",
"schedule": "0 */6 * * *"
}
]
}
The system resolves tenants through:
tenant_domains table?tenant=slug query parameterAll data access is protected by RLS policies that:
user_tenants tabletenant_id automaticallyThird-party API credentials are encrypted using the ENCRYPTION_KEY environment variable.
This project is licensed under the MIT License.