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
Share one link. Customers pick a service and a free time. You see every booking in one dashboard.
BusinessTypeScript · CSSGitHub @MohsinechOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
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 ↗The MilcodeUni reference SaaS (weeks 6–8). A barber, salon or coach shares one link; customers pick a service and a free time; the owner manages everything in a dashboard.
Stack: Next.js (App Router, Server Actions) · Supabase (Postgres, Auth, Row Level Security) · Vercel
Built to the MilcodeUni capstone spec:
| Required | Where |
|---|---|
| Landing page with a clear value proposition | / |
| Service listing and detail | /b/<link> and /b/<link>/services/<id> |
| Sign-up, sign-in, sign-out | /login |
| Booking form with validation | /b/<link>: service → day → free time → name + WhatsApp |
| Loading, empty, success and error feedback | loading.tsx, empty states, form errors, /done |
| Protected dashboard | /dashboard (signed-out visitors go to /login) |
| Create and view bookings | New requests, today's schedule, next 7 days, "Add a booking" |
| Update a status | Confirm, Decline, Done, Cancel |
| Delete with confirmation | Services and cancelled/done bookings ("Sure? Yes, delete") |
| Owner-only data with RLS | supabase/migrations/0001_mawid.sql |
| Responsive navigation | Dashboard menu stacks on phones |
How double-booking is prevented, in two simple layers:
src/lib/bookings.ts).How privacy works: customers can send a booking (always pending) but can't read any.
The booking page only reads public_busy_times, a view with the taken times and no names or phones.
supabase/migrations/0001_mawid.sql, then supabase/seed.sql
(creates the demo business Atlas Barbershop)..env.example to .env.local and fill in the URL and anon key
(Project Settings → API).npm install
npm run dev
Open http://localhost:3000 → "Try the demo booking page".update public.businesses
set owner_id = (select id from auth.users where email = '[email protected]')
where slug = 'atlas-barbershop';
Your dashboard now shows Atlas Barbershop. (Or create your own business from the setup screen.)Tip: for quick testing, turn off "Confirm email" in Supabase → Authentication → Providers → Email.
supabase/migrations/0001_mawid.sql tables, view, RLS policies
supabase/seed.sql demo business: Atlas Barbershop
src/app/page.tsx landing page
src/app/b/[slug]/ booking page, service detail, form, server action, confirmation
src/app/login/ sign in / sign up / sign out (server actions)
src/app/dashboard/ today, add booking, services & hours, first-time setup
src/lib/bookings.ts server-side checks: hours, past times, overlaps
src/lib/slots.ts which start times to show (every 30 minutes)
src/lib/time.ts "today" and "now" in Morocco, date formatting
src/proxy.ts keeps the login fresh, protects /dashboard (from Supabase's Next.js guide)
Dates and times are stored as the shop's local time (day + start_time), so the
only timezone code is "what's today in Morocco" in src/lib/time.ts.