From aca1a69900f288370516f8bdc295494eecfb71a1 Mon Sep 17 00:00:00 2001 From: "groombook-ceo[bot]" <269735724+groombook-ceo[bot]@users.noreply.github.com> Date: Fri, 27 Mar 2026 17:10:39 +0000 Subject: [PATCH] docs: update README with positioning, shipped features, and demo link - Add positioning statement and tagline ('Built for groomers, not corporations.') - Replace generic feature list with 6 shipped features: iCal feed, waitlist, quick-find search, customer portal, appointment notes, RBAC - Add live demo link (groombook.farh.net) prominently at top and in dedicated section - Restructure: demo and quick-start above the fold, tech stack secondary - Retain Docker Compose quick-start, local dev, and contributing sections Co-Authored-By: Paperclip --- README.md | 167 +++++++++++++++++++++++++++--------------------------- 1 file changed, 82 insertions(+), 85 deletions(-) diff --git a/README.md b/README.md index 5fec579..49c0a5d 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,80 @@ -# Groom Book +# GroomBook -Open source, self-hostable pet grooming business management and customer relationship platform. +> **Built for groomers, not corporations.** + +GroomBook is the open-source scheduling and client management platform built specifically for independent pet groomers — giving you the tools of enterprise software without the enterprise price tag or vendor lock-in. + +**[Try the Live Demo →](https://groombook.farh.net)** + +--- + +## Why GroomBook? + +Independent groomers are stuck using paper books, spreadsheets, or generic scheduling tools that weren't built for pet care. GroomBook is purpose-built for the way grooming shops actually work: managing pets and their owners, filling cancelled slots automatically, and giving clients a way to confirm without calling the shop. + +- **Open source** — you own your data, no vendor lock-in +- **Self-hostable** — run it yourself for free, or use low-cost hosting +- **Purpose-built for groomers** — pet records, appointment notes, breed-aware workflows + +--- ## Features -- **Appointment scheduling** — calendar management for single or multiple groomers -- **Client & pet records** — detailed profiles with grooming history and preferences -- **Service management** — pricing, duration, and service catalog -- **Online booking portal** — customer-facing self-service booking -- **POS & invoicing** — payments, tips, and receipt generation -- **Automated reminders** — SMS and email notifications -- **Reporting dashboard** — revenue, utilization, and trend analytics -- **Staff impersonation** — managers can view the customer portal as any client, with full audit logging and session controls -- **PWA** — installable on mobile devices, works offline +- **iCal calendar feed** — push GroomBook appointments directly into Google Calendar or Apple Calendar. No app switching, works with the tools you already use. +- **Waitlist system** — automatically fill cancelled slots from your waitlist. Reduce no-show revenue loss without lifting a finger. +- **Quick-find client & pet search** — instantly surface any client or pet by name. Never lose context on a regular — full history at a glance. +- **Customer portal** — clients confirm or cancel appointments on their own without calling the shop. Less phone tag, fewer no-shows. +- **Appointment notes** — add per-appointment notes for breed quirks, grooming preferences, or anything your staff needs to know next time. +- **RBAC (role-based access control)** — front desk sees bookings; only you see financials. Right access for every role in your shop. + +--- + +## Live Demo + +Try the full groomer and customer experience at **[groombook.farh.net](https://groombook.farh.net)**. Log in with demo credentials to explore the scheduler, customer portal, and staff views. + +--- + +## Quick Start (Docker Compose) + +The fastest way to run GroomBook is with Docker Compose. This starts PostgreSQL, runs database migrations, and serves both the API and web frontend. + +```bash +git clone https://github.com/groombook/groombook.git +cd groombook + +# Start everything (Postgres + migrate + API + web) +docker compose up --build +``` + +- **Web UI**: http://localhost:8080 +- **API**: http://localhost:3000 + +The default `docker-compose.yml` sets `AUTH_DISABLED=true` so you can explore the app without configuring an OIDC provider. **Disable this in any internet-facing deployment.** + +### Production configuration + +Copy `.env.example` to `.env` and configure: + +```bash +cp .env.example .env +``` + +Key variables to update for production: + +| Variable | Description | +|---|---| +| `DATABASE_URL` | PostgreSQL connection string | +| `AUTH_DISABLED` | Set to `false` in production | +| `OIDC_ISSUER` | Authentik issuer URL | +| `OIDC_AUDIENCE` | OAuth2 audience (default: `groombook`) | +| `CORS_ORIGIN` | Public URL of the web frontend | + +```bash +docker compose --env-file .env up --build +``` + +--- ## Tech Stack @@ -40,7 +102,9 @@ groombook/ └── docker-compose.yml ``` -## Getting Started +--- + +## Local Development ### Prerequisites @@ -48,8 +112,6 @@ groombook/ - pnpm >= 9 (`npm install -g pnpm`) - Docker & Docker Compose (for local Postgres) -### Local Development - ```bash # Clone the repo git clone https://github.com/groombook/groombook.git @@ -68,20 +130,7 @@ DATABASE_URL=postgres://groombook:groombook@localhost:5432/groombook pnpm db:mig pnpm dev ``` -API will be available at http://localhost:3000 -Web will be available at http://localhost:5173 - -### Environment Variables - -#### API (`apps/api/.env`) - -```env -DATABASE_URL=postgres://groombook:groombook@localhost:5432/groombook -OIDC_ISSUER=https://authentik.example.com -OIDC_AUDIENCE=groombook -CORS_ORIGIN=http://localhost:5173 -PORT=3000 -``` +API: http://localhost:3000 | Web: http://localhost:5173 ### Running Tests @@ -89,76 +138,24 @@ PORT=3000 # Unit tests (vitest) pnpm test -# E2E tests (Playwright) — requires the full Docker Compose stack to be running +# E2E tests (Playwright) — requires the full Docker Compose stack docker compose up -d --wait pnpm --filter @groombook/e2e test - -# Open the Playwright UI (interactive test runner) -pnpm --filter @groombook/e2e test:ui - -# View the last E2E test report -pnpm --filter @groombook/e2e test:report ``` -E2E tests target the Docker Compose stack (`http://localhost:8080`). They use API route mocking where needed so happy-path tests are deterministic without requiring seed data. - ### Building ```bash pnpm build ``` -## Self-Hosting +--- -### Docker Compose (recommended for single-server deployments) - -The fastest way to run Groom Book is with Docker Compose. This starts PostgreSQL, runs database migrations, and serves both the API and web frontend. - -```bash -git clone https://github.com/groombook/groombook.git -cd groombook - -# Start everything (Postgres + migrate + API + web) -docker compose up --build -``` - -- **Web UI**: http://localhost:8080 -- **API**: http://localhost:3000 - -The default `docker-compose.yml` sets `AUTH_DISABLED=true` so you can explore the app without configuring an OIDC provider. **Disable this in any internet-facing deployment.** - -#### Production configuration - -Copy `.env.example` to `.env` and configure: - -```bash -cp .env.example .env -``` - -Key variables to update for production: - -| Variable | Description | -|---|---| -| `DATABASE_URL` | PostgreSQL connection string | -| `AUTH_DISABLED` | Set to `false` in production | -| `OIDC_ISSUER` | Authentik issuer URL | -| `OIDC_AUDIENCE` | OAuth2 audience (default: `groombook`) | -| `CORS_ORIGIN` | Public URL of the web frontend | - -To use your `.env` file with Docker Compose: - -```bash -docker compose --env-file .env up --build -``` - -### Kubernetes (production-grade deployments) +## Self-Hosting on Kubernetes See the [groombook/infra](https://github.com/groombook/infra) repository for Kubernetes manifests and Flux configuration. -Groom Book is deployed in the `groombook` Kubernetes namespace using: -- **CNPG** for PostgreSQL -- **Authentik** for OIDC authentication -- **Flux** for GitOps-managed deployments +--- ## Contributing @@ -167,7 +164,7 @@ Groom Book is deployed in the `groombook` Kubernetes namespace using: 3. Commit your changes 4. Open a pull request -All PRs require CI to pass before merge. +All PRs require CI to pass before merge. See [CONTRIBUTING.md](CONTRIBUTING.md) for full guidelines. ## License