Easy-to-manage touch screens
Free, open-source touch screens. Guided USB setup, a drag-and-drop editor and local control. Made for Home Assistant.
7jez rendez-vous dyalk 3end Nizar.
Translation pending
LifestyleTypeScript · PLpgSQLGitHub @medjouirOnlineOwner 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
Loading the full README. The saved excerpt is shown below.
Mobile-first booking app for Nizar (barber). Clients book from a shared link without an account; Nizar manages appointments from an authenticated dashboard.
Standalone repository, independent from any other project.
• Next.js (App Router) + React + TypeScript (strict)
• Tailwind CSS v4 (design tokens in src/app/globals.css)
• Supabase (PostgreSQL, Auth, RLS) via @supabase/ssr
• Geist font (self-hosted through the geist package)
Requires Node.js 24 (see .nvmrc). A current Node matters: Morocco's clock rules come from the runtime's timezone data.Read the full README ↗Mobile-first booking app for Nizar (barber). Clients book from a shared link without an account; Nizar manages appointments from an authenticated dashboard.
Standalone repository, independent from any other project.
src/app/globals.css)@supabase/ssrgeist package)Requires Node.js 24 (see .nvmrc). A current Node matters: Morocco's clock rules come from the runtime's timezone data.
npm ci
cp .env.example .env.local # then fill in the values
npm run dev # http://localhost:3000
Checks:
npm run typecheck
npm run lint
npm test # unit tests: availability engine, booking service, clients, settings…
npm run build
npm run test:e2e # Playwright, definition of done (needs `npx playwright install chromium`)
| Variable | Where | Purpose |
|---|---|---|
NEXT_PUBLIC_SUPABASE_URL | public | Supabase project URL |
NEXT_PUBLIC_SUPABASE_ANON_KEY | public | Anon/publishable key — protected by RLS |
NEXT_PUBLIC_SITE_URL | public | Canonical URL used for the booking link and QR code |
SUPABASE_SERVICE_ROLE_KEY | server only | Used only in server code for validated public operations. Never prefix with NEXT_PUBLIC_. |
Until Supabase is connected (NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_ANON_KEY
unset), the app runs on built-in example data (src/lib/booking/demo-data.ts, mirroring
supabase/seed.sql). Bookings a visitor makes are kept in an httpOnly cookie in their own
browser, so each tester sees the example data plus their own bookings. /login lets anyone
in and /dashboard shows the example barber. Never ship real clients on demo mode.
Public routes: / → /nizar (landing) → /nizar/7jez (booking flow) →
/manage/[token] (confirmation, reschedule, cancel; .../calendar downloads an .ics).
Barber routes (/dashboard): Lyouma, Planning (Nhar / Simana + appointment sheet),
Clients (search, profile), Reglages (Profil, Services, Aw9at lkhedma, Ma disponiblech,
Parametres reservation, Lien dyal reservation + QR, Compte).
Demo settings changes are kept in a second cookie (nizar_demo_cfg), re-validated on
every read. To stay under the browser's 4 KB cookie limit the demo keeps the visitor's
6 most recent bookings and trims notes to 140 characters (demo only).
Project: cuunoajwxymacyfmnatm. Run once, in order, in Supabase → SQL Editor:
supabase/migrations/20261001120000_core_schema.sqlsupabase/migrations/20261001120100_security.sqlsupabase/seed.sql — first set v_owner_email to Nizar's login email.Then in Authentication:
nizar barber automatically.<site>/auth/confirm to Redirect URLs.Sample data can be removed with supabase/seed-reset.sql and recreated by re-running seed.sql.
npm run test:db applies a Supabase stub, the migrations and the seed to a throwaway
local PostgreSQL database and checks constraints, double-booking protection and RLS.
Needs PostgreSQL 16 with btree_gist/pgcrypto and PGHOST/PGPORT/PGUSER set.
See docs/architecture.md for the scheduling and security decisions and docs/qa.md for the V0.1 QA report and known limits.
src/
app/ routes (App Router), global tokens, root layout
components/ui/ Button, Card, Progress, PageShell, Spinner
app/login/ Nizar's sign-in, password reset
app/dashboard/ private area (guarded by requireBarber)
proxy.ts session refresh + /dashboard redirect
lib/auth.ts getCurrentBarber / requireBarber
lib/database.types.ts typed schema for the Supabase client
lib/env.ts typed env access
lib/supabase/
client.ts browser client (anon key, RLS)
server.ts server client bound to Nizar's auth cookies (RLS)
admin.ts service-role client, server-only
proxy.ts session refresh helper
supabase/
migrations/ schema, constraints, RLS
seed.sql dev seed (re-runnable), seed-reset.sql removes sample data
tests/db/ database test suite
| Token | Value | Use |
|---|---|---|
canvas | #000000 | page background |
surface | #1D1D1D | cards, secondary surfaces |
gold | #DDB361 | primary CTA, selected, active nav, key time |
gold-pressed | #D8A94C | pressed / selected variation |
gold-deep | #C6922B | deeper accent |
fg / muted | #F5F5F2 / #9A9A9A | main / secondary text |
Utilities: px-page (20px), p-card (16px), rounded-card (16px), h-control (56px), h-nav (76px), text sizes text-hero, text-title, text-section, text-body, text-secondary, text-time, animations animate-enter-forward / animate-enter-back (220ms, disabled under reduced motion).
Vercel project nizar-barber (framework: Next.js, root directory: repository root). Set the environment variables above for Preview and Production.