BarberFlow is a modern SaaS manager backoffice for barber shops, delivered as a working application rather than a static mockup. It is built for the owner-manager of a barber shop in Tunisia who stands at the counter between clients, works in French, prices in Tunisian Dinar (TND), and needs to trust the day's numbers in three seconds and act on a booking in two taps.
The product intent is calm, competent, humane order: a booking ledger that reads like a transit timetable. The manager opens the tool at the start of the day, sees today's appointments, pending confirmations, completed bookings, cancellations and estimated revenue, then creates, edits, confirms, reschedules, cancels and completes appointments while keeping customers, barbers, services, prices, working hours, breaks and availability accurate. Overlapping bookings are prevented and time slots are validated so the chair-by-chair schedule stays conflict-free.
The audience is the Barber Shop Manager — the single accepted active human persona for this generation. The interface language is French, the default currency is TND, and the application is prepared for future backend integration, a React Native customer app, and a SaaS super-admin dashboard without building those now.
BarberFlow is a responsive, French-language dashboard with a dark sidebar (graphite chrome rail) and a clean light working surface. It is a client-side application built with React, TypeScript, Vite, Tailwind CSS, shadcn/ui and Lucide React, using realistic mock data with local persistence so the manager's work survives across sessions.
Current delivery covers the application layout, the Overview dashboard, the Reservations page, the Calendar, appointment details, the complete booking flow, and the administration of customers, barbers, services and prices, working hours, breaks and availability, plus Reports and Settings. All navigation and main actions are functional.
The accepted active human actor is the Barber Shop Manager. The application owns identity: a manager enrolls on first use and verifies on return before reaching protected pages. Local persistence keeps mock data across sessions. Multi-tenancy is prepared architecturally (tenant-scoped data and API service seams) but no super-admin surface, no customer mobile app, and no live backend are part of the current build.
BarberFlow is delivered as a first-party web application. The manager's working surfaces — Overview, Reservations, Calendar, appointment details, the booking flow, Customers, Barbers, Services & Pricing, Availability, Reports and Settings — are protected and require the manager to be signed in. Because the manager must privately own and resume durable shop state (appointments, customers, barbers, services, availability, settings) across sessions, the application owns identity: a public Landing explains the product, Sign Up establishes a manager's first-use access, and Login verifies a returning manager. These three entry surfaces are anonymously reachable; everything behind them is not.
The current build is entirely first-party and self-contained: data is realistic mock data persisted locally, and API service modules plus tenant-scoped structures are prepared as seams for a future backend. The React Native customer app and the SaaS super-admin dashboard are explicitly future scope and are not built, routed, or reachable now. No provider-owned or external destination carries accepted manager work in this generation.
Not applicable — no reference directive in this request declares a content_source.
FR-01 — Working application with functional navigation and main actions (explicit) As a Barber Shop Manager, I should use BarberFlow as a working application — not a static mockup — where all navigation and main actions are functional, so that every section I open and every action I take actually works.
FR-02 — Specified technology stack (explicit) As a Barber Shop Manager, I should use a backoffice built with React, TypeScript, Vite, Tailwind CSS, shadcn/ui and Lucide React, so that the tool is fast, consistent and maintainable.
FR-03 — Premium responsive dashboard, dark sidebar, light interface, French UI (explicit) As a Barber Shop Manager, I should see a premium, responsive dashboard with a dark sidebar, a clean light interface and a French-language UI, so that the tool reads like signage — legible from across the room and unambiguous.
FR-04 — Required sections (explicit) As a Barber Shop Manager, I should have Overview, Reservations, Calendar, Customers, Barbers, Services & Pricing, Availability, Reports and Settings, so that every part of running the shop's day has a place.
FR-05 — Reservation management priority: today's appointments, pending confirmations, completed bookings, cancellations, estimated revenue (explicit) As a Barber Shop Manager, I should see today's appointments, pending confirmations, completed bookings, cancellations and estimated revenue, so that I can trust the day's numbers in three seconds.
FR-06 — Searchable and filterable reservations (explicit) As a Barber Shop Manager, I should search and filter reservations, so that I can find the booking I need without scanning the whole day.
FR-07 — Calendar views (explicit) As a Barber Shop Manager, I should view appointments in calendar views, so that I can see the chair-by-chair schedule as a timetable.
FR-08 — Appointment details (explicit) As a Barber Shop Manager, I should view appointment details, so that I can see the customer, service, barber, date, time, price in TND and current state of one appointment.
FR-09 — Complete booking flow with customer, service, barber, date and available time selection (explicit) As a Barber Shop Manager, I should complete a booking flow selecting customer, service, barber, date and an available time, so that a new appointment is created correctly.
FR-10 — Create appointments (explicit) As a Barber Shop Manager, I should create appointments, so that walk-ins and phone bookings enter the schedule.
FR-11 — Edit appointments (explicit) As a Barber Shop Manager, I should edit appointments, so that corrected details are reflected in the schedule.
FR-12 — Confirm appointments (explicit) As a Barber Shop Manager, I should confirm appointments, so that pending bookings become committed.
FR-13 — Reschedule appointments (explicit) As a Barber Shop Manager, I should reschedule appointments, so that a booking moves to a new valid time.
FR-14 — Cancel appointments (explicit) As a Barber Shop Manager, I should cancel appointments, so that a booking that will not happen leaves the active schedule.
FR-15 — Complete appointments (explicit) As a Barber Shop Manager, I should complete appointments, so that finished bookings are recorded as done.
FR-16 — Manage customers (explicit) As a Barber Shop Manager, I should manage customers, so that the shop's customer records stay accurate.
FR-17 — Manage barbers (explicit) As a Barber Shop Manager, I should manage barbers, so that the shop's barber records stay accurate.
FR-18 — Manage services and prices (explicit) As a Barber Shop Manager, I should manage services and prices, so that bookings carry the right service and the right TND price.
FR-19 — Manage working hours, breaks and availability (explicit) As a Barber Shop Manager, I should manage working hours, breaks and availability, so that the slots offered to bookings match when the shop actually works.
FR-20 — Prevent overlapping bookings and validate time slots (explicit) As a Barber Shop Manager, I should have overlapping bookings prevented and time slots validated, so that the schedule stays conflict-free.
FR-21 — Realistic mock data with local persistence (explicit) As a Barber Shop Manager, I should work with realistic mock data that persists locally, so that my shop's state survives across sessions.
FR-22 — Reusable components, strict TypeScript, form validation, feature-based architecture (explicit) As a Barber Shop Manager, I should use an application built from reusable components with strict TypeScript, form validation and a clean feature-based architecture, so that the tool behaves consistently and reliably.
FR-23 — TND as the default currency (explicit) As a Barber Shop Manager, I should see TND as the default currency, so that every price and revenue figure matches how the shop prices its work.
FR-24 — API services and multi-tenant architecture prepared for future integration (explicit) As a Barber Shop Manager, I should have the application prepared for a future backend, a React Native customer app and a SaaS super-admin dashboard, so that today's tool can grow without being rebuilt.
FR-25 — Start with the application layout, Overview dashboard and Reservations page (explicit) As a Barber Shop Manager, I should have the application layout, Overview dashboard and Reservations page built first, so that the highest-frequency work is available immediately.
FR-26 — Manager self-service enrollment before first use (required_inference) As a Barber Shop Manager, I should establish my own access before first using the protected backoffice, so that the shop state I create belongs to me and can be resumed.
FR-27 — Returning manager verification before accessing protected pages (required_inference) As a Barber Shop Manager, I should verify myself on return before reaching protected pages, so that my shop's state stays private and correctly bound to me.
FR-28 — Local persistence of mock data across sessions (required_inference) As a Barber Shop Manager, I should have my shop's data persist locally across sessions, so that appointments, customers, barbers, services, availability and settings are still there when I return.
Product context. The manager runs a barber shop in Tunisia and uses BarberFlow as the shop's backoffice. They work in French, price in TND, and open the tool at the start of the day — often standing at the counter between clients. Their tool must read like signage: legible from across the room, unambiguous, warm inside its rigour. They are the only accepted active human persona for this generation; the shop's customers and barbers are records the manager maintains, not users of this backoffice.
Primary goal. A conflict-free, up-to-date booking schedule: every appointment in the right chair at the right time, with the day's numbers trustworthy at a glance.
Distinct accepted responsibilities.
Relevant inputs and decisions. Which appointment to act on next; whether a pending booking should be confirmed; whether a booking should be rescheduled, cancelled or completed; which customer, service, barber, date and slot a new booking uses; what the shop charges for each service; when each barber works and when they break; what the shop's settings and default currency are.
Interactions with other accepted participants. The manager is the sole active human actor in this backoffice. The customers and barbers whose records the manager maintains are represented as data, not as users of this application; the React Native customer app and the SaaS super-admin dashboard are future scope and are not participants now.
Observable success. The KPI band shows the day's five figures correctly; a pending booking becomes confirmé with its state rule wiping amber to green; a rescheduled appointment moves to a valid slot and frees its old one; a conflicting slot is refused with a clear French explanation; the calendar shows each barber's column without overlaps; the availability editor's slot count updates after a change; and the manager's data is still there on return.
Source-backed constraints. French-language UI; TND default currency; strict TypeScript; multi-tenant architecture prepared for future backend integration, a React Native customer app and a SaaS super-admin dashboard (future scope, not current build); the build starts with the application layout, Overview dashboard and Reservations page.
Muse and headline. Erik Spiekermann — typographic infrastructure for the barber's day: a booking ledger that reads like a transit timetable. The interface is built from rules, columns and signal colours rather than the generic rounded-card-on-white SaaS shell. The requested dark sidebar and clean light interface are honoured as two fixed grounds; everything else is drawn from Spiekermann's signal-colour logic.
Colour tokens (light mode).
| Role | Token | Hex |
|---|---|---|
| Background (working surface) | --bg | #F4F1EC |
| Surface (panels, tables, forms) | --surface | #FFFFFF |
| Text (body and data) | --text | #141414 |
| Primary (chrome rail, section headers) | --primary | #1F1D1B |
| Accent (signal red) | --accent | #D62B1F |
| Muted (secondary text) | --muted | #8A8378 |
| Hairline (separation) | --hairline | #E2DCD2 |
| Chrome rail type | --on-primary | #F4F1EC |
Appointment state hues (used only as a 4px left rule, a 6px dot, or a small-caps label chip — never as a filled card):
| State | Hex |
|---|---|
| En attente | #E0A100 (amber) |
| Confirmé | #1B6B4A (deep green) |
| Terminé | #3A5A8C (deep blue) |
| Annulé | #8A8378 (grey) |
| No-show | #7A1F1F (oxblood) |
Proportion. 70% paper/white, 22% graphite chrome, 6% state hues, 2% signal red. No gradients anywhere; every colour is flat and named.
Typography. One family, many weights — this is the point. Headings and body: Fira Sans. Headings at 600–700 with tight tracking (−0.015em), sentence case for page titles, ALL-CAPS with +0.08em tracking for micro-labels, table headers, section eyebrows and state chips. Numbers are the loudest thing on the page: revenue and counts set at 700 with tabular figures (font-feature-settings: 'tnum' 1), so columns of TND amounts align on the decimal. Secondary weights at 400 for reading, 500 for controls.
Type scale. 1.25 modular on a 16px base — 12 / 13 / 16 / 20 / 25 / 31 / 39 / 49. Page title 31→39 (clamp(1.75rem, 1.2rem + 1.6vw, 2.44rem)), KPI figure 39→49 (clamp(2.44rem, 1.6rem + 3vw, 3.06rem)), section heading 20, table body 13, label 12 caps. Numerals always tabular. Line-height 1.15 for display, 1.5 for body, 1.35 for table rows.
Shape language. Rectilinear and honest. 2px radii on buttons and inputs — enough to feel machined, never pill-shaped. 0px on panels, tables and the sidebar: corners are square because the grid is the shape. Separation comes from 1px hairlines (#E2DCD2) and from weight, not from shadow. The only softness is a 4px left rule on appointment rows and a 6px dot for state. Icons are Lucide at 16/18px with 1.5px stroke, optically aligned to the cap height of adjacent labels. No floating cards, no drop shadows, no glass.
Spacing rhythm. A strict 12-column grid, 24px gutters, 32px page margins at 1280px, 16px at 375px. Every page opens the same way: an ALL-CAPS eyebrow line, a page title, then a full-width horizontal rule — the page behaves like a sign board. Everything aligns to the same left edge; nothing floats.
Imagery style. The interface is the imagery. No photography inside the backoffice — no stock barbers, no mood shots. Visual interest comes from information design: the 24-hour appointment density strip, small schematic diagrams for the availability editor, and a Lucide pictogram set for services (scissors, razor, beard, hair-dryer) at 20px in single-weight line. The one place photography is allowed is the public Landing, where a single high-contrast black-and-white photograph of a chair and mirror is cropped to the grid and treated as a ruled panel — documentary, not lifestyle.
The ruled ledger as the first screen. The first screen the manager meets after signing in is not a marketing page — it is Overview, because this is a working tool opened at 8:50am. The composition is a sign board:
MARDI 12 NOVEMBRE — SALON CARTHAGE — in Fira Sans 500 at 12px with +0.08em tracking, then the page title Tableau de bord at clamp(1.75rem, 1.2rem + 1.6vw, 2.44rem), then a full-width 1px rule.clamp(2.44rem, 1.6rem + 3vw, 3.06rem) — 18 rendez-vous, 4 en attente, 11 terminés, 2 annulés, 1 240,000 TND estimé — separated by full-height vertical hairlines, each with a small-caps label above and a signed delta below. The pending figure carries a signal-red dot; the revenue figure is set in signal red. No cards, no icons in circles, no drop shadows.Confirmer action that opens the oldest unconfirmed booking.There is no centred headline, no subtext, no button in the middle of the screen — the first screen is a control panel and every number on it is live. On mobile the KPI band wraps to two rows of two-and-three with the rules rotating to horizontal, and the rail becomes a bottom sheet drawer.
Interaction Model: Static Motion Tempo: restrained Hero Dimensionality: flat
Landing Hero Motion Brief.
prefers-reduced-motion everything resolves instantly — no wipe, no roll, no crossfade — and the Landing renders as a static ruled composition with the entry controls fully usable.Signature motion moments (accepted behaviour only). A confirmed booking's state rule wipes from amber to green in 180ms, left to right, once. The live en attente counter in the rail increments with a 90ms number roll. Under prefers-reduced-motion both resolve instantly.
NFR-01 — French-language UI (explicit) All labels, messages, validation text and empty states are in French. Rationale: the manager works in French and must read the tool without translation.
NFR-02 — TND default currency (explicit) TND is the default currency for every price, revenue and estimated-revenue figure, rendered with tabular figures so columns align on the decimal. Rationale: the shop prices its work in Tunisian Dinar.
NFR-03 — Strict TypeScript (explicit) The codebase is strict TypeScript. Rationale: strict typing keeps the schedule and pricing logic reliable as the application grows.
NFR-04 — Reusable components and feature-based architecture (explicit) Shared components are reused across sections, and the code is organized by feature. Rationale: consistent behaviour across sections and a clean base for future integration.
NFR-05 — Form validation (explicit) Every form validates its input and shows French validation messages inline, preserving entered values on failure. Rationale: the manager must be able to correct and resubmit without re-entering data.
NFR-06 — Responsive at 375px, 768px and 1280px (explicit) The dashboard is responsive: the 248px rail collapses to a 64px icon rail at 768px and a bottom sheet drawer at 375px; the KPI band wraps to two rows with rules rotating to horizontal; page margins are 32px at 1280px and 16px at 375px. Readable text and controls stay whole inside the viewport and their container at every breakpoint. Rationale: the manager uses the tool at the counter, on a tablet and on a phone.
NFR-07 — Local persistence of mock data (explicit) Realistic mock data persists locally across sessions. Rationale: the manager's shop state must survive between sessions without a backend.
NFR-08 — Multi-tenant architecture prepared for future integration (explicit) API service modules and tenant-scoped structures are prepared for a future backend, a React Native customer app and a SaaS super-admin dashboard. Rationale: the tool must be able to grow without being rebuilt.
NFR-09 — Conflict-free scheduling (explicit) Overlapping bookings are prevented and time slots are validated before an appointment is created or rescheduled. Rationale: a barber cannot serve two clients in one chair at one time.
NFR-10 — Motion restraint and reduced-motion support (direction-derived)
Transitions are 120–160ms ease-out and never longer than 200ms; no parallax, no scroll-linked animation, no bouncing hovers, no particles. Under prefers-reduced-motion everything resolves instantly. Rationale: motion is functional, not decorative, and must never obstruct the manager's work.
NFR-11 — Accessible contrast and legibility (direction-derived)
Body and data text is #141414 on white/paper (contrast ≈15:1); chrome rail type is #F4F1EC on #1F1D1B. State is never encoded by colour alone — every state also carries a small-caps label. Rationale: the tool must be legible from across the room and unambiguous.
No backend service, database, container or orchestration layer is part of the current build; the application is client-side with local persistence and prepared API seams.
Assumptions.
Constraints.
No completed page designs yet.
Completed design pages will appear here when they are ready to preview.
No completed page designs yet.
Completed design pages will appear here when they are ready to preview.
No comments yet. Be the first!