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 <noreply@paperclip.ing>
This commit is contained in:
committed by
GitHub
parent
d576876f56
commit
aca1a69900
@@ -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
|
## Features
|
||||||
|
|
||||||
- **Appointment scheduling** — calendar management for single or multiple groomers
|
- **iCal calendar feed** — push GroomBook appointments directly into Google Calendar or Apple Calendar. No app switching, works with the tools you already use.
|
||||||
- **Client & pet records** — detailed profiles with grooming history and preferences
|
- **Waitlist system** — automatically fill cancelled slots from your waitlist. Reduce no-show revenue loss without lifting a finger.
|
||||||
- **Service management** — pricing, duration, and service catalog
|
- **Quick-find client & pet search** — instantly surface any client or pet by name. Never lose context on a regular — full history at a glance.
|
||||||
- **Online booking portal** — customer-facing self-service booking
|
- **Customer portal** — clients confirm or cancel appointments on their own without calling the shop. Less phone tag, fewer no-shows.
|
||||||
- **POS & invoicing** — payments, tips, and receipt generation
|
- **Appointment notes** — add per-appointment notes for breed quirks, grooming preferences, or anything your staff needs to know next time.
|
||||||
- **Automated reminders** — SMS and email notifications
|
- **RBAC (role-based access control)** — front desk sees bookings; only you see financials. Right access for every role in your shop.
|
||||||
- **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
|
|
||||||
|
## 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
|
## Tech Stack
|
||||||
|
|
||||||
@@ -40,7 +102,9 @@ groombook/
|
|||||||
└── docker-compose.yml
|
└── docker-compose.yml
|
||||||
```
|
```
|
||||||
|
|
||||||
## Getting Started
|
---
|
||||||
|
|
||||||
|
## Local Development
|
||||||
|
|
||||||
### Prerequisites
|
### Prerequisites
|
||||||
|
|
||||||
@@ -48,8 +112,6 @@ groombook/
|
|||||||
- pnpm >= 9 (`npm install -g pnpm`)
|
- pnpm >= 9 (`npm install -g pnpm`)
|
||||||
- Docker & Docker Compose (for local Postgres)
|
- Docker & Docker Compose (for local Postgres)
|
||||||
|
|
||||||
### Local Development
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Clone the repo
|
# Clone the repo
|
||||||
git clone https://github.com/groombook/groombook.git
|
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
|
pnpm dev
|
||||||
```
|
```
|
||||||
|
|
||||||
API will be available at http://localhost:3000
|
API: http://localhost:3000 | Web: http://localhost:5173
|
||||||
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
|
|
||||||
```
|
|
||||||
|
|
||||||
### Running Tests
|
### Running Tests
|
||||||
|
|
||||||
@@ -89,76 +138,24 @@ PORT=3000
|
|||||||
# Unit tests (vitest)
|
# Unit tests (vitest)
|
||||||
pnpm test
|
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
|
docker compose up -d --wait
|
||||||
pnpm --filter @groombook/e2e test
|
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
|
### Building
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
pnpm build
|
pnpm build
|
||||||
```
|
```
|
||||||
|
|
||||||
## Self-Hosting
|
---
|
||||||
|
|
||||||
### Docker Compose (recommended for single-server deployments)
|
## Self-Hosting on Kubernetes
|
||||||
|
|
||||||
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)
|
|
||||||
|
|
||||||
See the [groombook/infra](https://github.com/groombook/infra) repository for Kubernetes manifests and Flux configuration.
|
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
|
## Contributing
|
||||||
|
|
||||||
@@ -167,7 +164,7 @@ Groom Book is deployed in the `groombook` Kubernetes namespace using:
|
|||||||
3. Commit your changes
|
3. Commit your changes
|
||||||
4. Open a pull request
|
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
|
## License
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user