|
|
|
@@ -1,218 +1,43 @@
|
|
|
|
|
# GroomBook
|
|
|
|
|
# GroomBook Monorepo — Archived
|
|
|
|
|
|
|
|
|
|
> **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.
|
|
|
|
|
> **This repository has been archived and replaced by standalone repositories.**
|
|
|
|
|
|
|
|
|
|
**Built for groomers, not corporations.**
|
|
|
|
|
## Successor Repositories
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Key Features
|
|
|
|
|
|
|
|
|
|
**Stop chasing confirmations**
|
|
|
|
|
- **Customer portal** — Clients confirm or cancel appointments on their own. Reduce no-shows with an automated waitlist.
|
|
|
|
|
|
|
|
|
|
**Your calendar, your way**
|
|
|
|
|
- **iCal calendar feed** — Push GroomBook appointments directly into Google Calendar or Apple Calendar. No app switching.
|
|
|
|
|
|
|
|
|
|
**Know every pet at a glance**
|
|
|
|
|
- **Client & pet records** — Detailed profiles with grooming history, preferences, and breed-specific notes. Full appointment notes for context on every regular.
|
|
|
|
|
- **Quick-find search** — Find clients and pets instantly without digging through spreadsheets.
|
|
|
|
|
|
|
|
|
|
**Staff access without stress**
|
|
|
|
|
- **Role-based access control (RBAC)** — Front desk sees bookings; only you see financials. Right access for every role.
|
|
|
|
|
|
|
|
|
|
**Everything else**
|
|
|
|
|
- **Appointment scheduling** — Calendar management for single or multiple groomers
|
|
|
|
|
- **Service management** — Pricing, duration, and service catalog
|
|
|
|
|
- **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
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 🚀 Try the Demo
|
|
|
|
|
|
|
|
|
|
[**Live Demo**](https://demo.groombook.app) — explore GroomBook without installing anything.
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Quick Start
|
|
|
|
|
|
|
|
|
|
### Docker Compose (recommended for indie groomers)
|
|
|
|
|
|
|
|
|
|
Run GroomBook on your own hardware in minutes. Everything you need is in the box — no subscription, no vendor lock-in.
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
git clone https://github.com/groombook/groombook.git
|
|
|
|
|
cd groombook
|
|
|
|
|
|
|
|
|
|
# Start everything (Postgres + database migrations + API + web UI)
|
|
|
|
|
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. **Important:** Disable this in any internet-facing deployment.
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Tech Stack
|
|
|
|
|
|
|
|
|
|
| Layer | Technology |
|
|
|
|
|
| Repository | Description |
|
|
|
|
|
|---|---|
|
|
|
|
|
| Backend | [Hono](https://hono.dev/) (TypeScript, Node.js) |
|
|
|
|
|
| Frontend | React 19 + Vite + [vite-plugin-pwa](https://vite-pwa-org.netlify.app/) |
|
|
|
|
|
| Database | PostgreSQL via [CNPG](https://cloudnative-pg.io/) + [Drizzle ORM](https://orm.drizzle.team/) |
|
|
|
|
|
| Auth | OIDC via [Authentik](https://goauthentik.io/) |
|
|
|
|
|
| Infra | Kubernetes (namespace: `groombook`), Flux GitOps |
|
|
|
|
|
| CI | GitHub Actions (self-hosted `groombook-runners`) |
|
|
|
|
|
| [groombook/api](https://github.com/groombook/api) | Hono REST API (TypeScript, Node.js) |
|
|
|
|
|
| [groombook/web](https://github.com/groombook/web) | React PWA frontend |
|
|
|
|
|
| [groombook/charts](https://github.com/groombook/charts) | Helm charts for Kubernetes deployment |
|
|
|
|
|
|
|
|
|
|
## Repository Structure
|
|
|
|
|
## What Changed
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
groombook/
|
|
|
|
|
├── apps/
|
|
|
|
|
│ ├── api/ # Hono REST API
|
|
|
|
|
│ └── web/ # React PWA
|
|
|
|
|
├── packages/
|
|
|
|
|
│ ├── db/ # Drizzle schema + migrations
|
|
|
|
|
│ └── types/ # Shared TypeScript types
|
|
|
|
|
├── .github/
|
|
|
|
|
│ └── workflows/ # CI/CD pipelines
|
|
|
|
|
└── docker-compose.yml
|
|
|
|
|
```
|
|
|
|
|
- **Monorepo split complete** — The former `apps/api`, `apps/web`, and `packages/*` are now standalone repos
|
|
|
|
|
- **`@groombook/types`** — Inlined directly into `groombook/api` and `groombook/web`
|
|
|
|
|
- **E2E testing** — Now via Playwright MCP, no standalone repo needed
|
|
|
|
|
- **CI/CD** — Each repo has its own pipeline; see individual repos for status
|
|
|
|
|
|
|
|
|
|
## Getting Started
|
|
|
|
|
## Migration Notes
|
|
|
|
|
|
|
|
|
|
### Prerequisites
|
|
|
|
|
|
|
|
|
|
- Node.js >= 20
|
|
|
|
|
- pnpm >= 9 (`npm install -g pnpm`)
|
|
|
|
|
- Docker & Docker Compose (for local Postgres)
|
|
|
|
|
|
|
|
|
|
### Local Development
|
|
|
|
|
If you were cloning `groombook/groombook` for local development:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# Clone the repo
|
|
|
|
|
git clone https://github.com/groombook/groombook.git
|
|
|
|
|
cd groombook
|
|
|
|
|
# API
|
|
|
|
|
git clone https://github.com/groombook/api.git
|
|
|
|
|
cd api && pnpm install && pnpm dev
|
|
|
|
|
|
|
|
|
|
# Install dependencies
|
|
|
|
|
pnpm install
|
|
|
|
|
|
|
|
|
|
# Start local Postgres
|
|
|
|
|
docker compose up postgres -d
|
|
|
|
|
|
|
|
|
|
# Run database migrations
|
|
|
|
|
DATABASE_URL=postgres://groombook:groombook@localhost:5432/groombook pnpm db:migrate
|
|
|
|
|
|
|
|
|
|
# Start API and Web in parallel
|
|
|
|
|
pnpm dev
|
|
|
|
|
# Web (in a new terminal)
|
|
|
|
|
git clone https://github.com/groombook/web.git
|
|
|
|
|
cd web && pnpm install && pnpm dev
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
API will be available at http://localhost:3000
|
|
|
|
|
Web will be available at http://localhost:5173
|
|
|
|
|
For full Docker Compose setup, see each repo's README.
|
|
|
|
|
|
|
|
|
|
### Environment Variables
|
|
|
|
|
## Archive Info
|
|
|
|
|
|
|
|
|
|
#### 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
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# Unit tests (vitest)
|
|
|
|
|
pnpm test
|
|
|
|
|
|
|
|
|
|
# E2E tests (Playwright) — requires the full Docker Compose stack to be running
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
### 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.
|
|
|
|
|
|
|
|
|
|
Groom Book is deployed in the `groombook` Kubernetes namespace using:
|
|
|
|
|
- **CNPG** for PostgreSQL
|
|
|
|
|
- **Authentik** for OIDC authentication
|
|
|
|
|
- **Flux** for GitOps-managed deployments
|
|
|
|
|
This repository was archived on 2026-05-14 as part of the monorepo decommission ([GRO-1081]).
|
|
|
|
|
The history is preserved but the repo is read-only.
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Contributing
|
|
|
|
|
|
|
|
|
|
GroomBook thrives on contributions from the grooming community. Whether you're a groomer with a feature request, a developer fixing a bug, or someone improving docs — we'd love your help.
|
|
|
|
|
|
|
|
|
|
1. Fork the repository
|
|
|
|
|
2. Create a feature branch (`git checkout -b feature/my-feature`)
|
|
|
|
|
3. Commit your changes
|
|
|
|
|
4. Open a pull request
|
|
|
|
|
|
|
|
|
|
All PRs require CI to pass before merge. See [CONTRIBUTING.md](./CONTRIBUTING.md) for details.
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Why GroomBook?
|
|
|
|
|
|
|
|
|
|
- **Open source** — You own your data. No vendor lock-in.
|
|
|
|
|
- **Purpose-built** — Features designed for grooming workflows, not generic scheduling.
|
|
|
|
|
- **Self-hosted or managed** — Run it yourself for free, or pay for hosted support (coming soon).
|
|
|
|
|
- **Community-driven** — Used and built by actual groomers.
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## License
|
|
|
|
|
|
|
|
|
|
AGPL-3.0
|
|
|
|
|
|
|
|
|
|
*For Kubernetes deployments, see [groombook/infra](https://github.com/groombook/infra) (private).*
|