2026-03-12 - 2026-06-12
Overview
280 Pull requests merged by 4 users
Merged
#434 GRO-1636: seed.ts creates Better Auth credential accounts for UAT personas
Merged
#433 promote: dev → uat (GRO-1489 lint fixes)
Merged
#429 fix(GRO-1489): resolve 7 lint errors blocking dev CI
Merged
#432 docs: add MCP-driven execution method to UAT playbook (GRO-1502)
Merged
#431 Promote dev → uat: fix(e2e) PLAYWRIGHT_BASE_URL + host.docker.internal (GRO-1496)
Merged
#430 fix(e2e): respect PLAYWRIGHT_BASE_URL env var and add host.docker.internal resolution
Merged
#428 promote: dev → uat (GRO-1369 types sync)
Merged
#427 fix(GRO-1369): add missing sizeCategory/coatType/bufferMinutes to @groombook/types
Merged
#426 fix(GRO-1368): remove unused getDb import from consent.ts
Merged
#423 fix(ci): Docker push auth + E2E DinD networking for Gitea
Merged
#425 promote: dev → uat (GRO-1248 path prefix fix)
Merged
#407 fix: correct apps/ path prefix in promote workflows (GRO-1248)
Merged
#424 fix(ci): use REGISTRY_TOKEN + E2E DinD networking on main
Merged
#411 docs: archive monorepo and link to successor repos (GRO-1081)
Merged
#422 chore: migrate .github/workflows to .gitea/workflows
Merged
#420 chore: promote dev → uat (GRO-1289 CI path fix)
Merged
#418 fix(GRO-1289): correct infra repo paths in ci.yml Update Infra Image Tags job
Merged
#419 chore: promote dev to uat (GRO-1287 ci.yml path fix)
Merged
#417 fix: correct infra repo paths in ci.yml Update Infra Image Tags job
Merged
#416 chore: promote dev to uat — VITE_API_URL fix (GRO-1280)
Merged
#414 fix: correct infra paths in promote-to-uat workflow
Merged
#415 fix: resolve VITE_API_URL hardcoding that breaks CI E2E (GRO-1280)
Merged
#413 promote: dev → uat (GRO-1236 OAuth callback fix)
Merged
#403 fix(GRO-1236): OAuth callback session not established for uat-tester
Merged
#408 promote: dev → uat (GRO-1207 portal Communication tab real backend)
Merged
#409 docs(UAT_PLAYBOOK): add §4.20 Staff Messages test cases
Merged
#405 feat(GRO-106): staff messages page
Merged
#406 fix(ci): correct infra repo paths in promote workflows
Merged
#398 feat(GRO-106): portal Communication tab — real backend
Merged
#404 chore: promote dev → uat (GRO-1212 portal test mock fix)
Merged
#402 fix(GRO-1212/GRO-1213): fix DB mock imports in portal and waitlist test files
Merged
#400 promote: dev → uat (GRO-1208 conversations API + GRO-1211 telnyx webhook fix)
Merged
#401 fix(GRO-1211): skip auth middleware for /api/webhooks/* routes
Merged
#399 feat(GRO-1208): conversations API route + staffReadAt migration
Merged
#393 chore: promote dev → uat (fix auth rate limits)
Merged
#392 fix(auth): override Better Auth sign-in rate limit defaults
Merged
#391 Promote dev → uat: TELNYX_WEBHOOK_SECRET .env.example
Merged
#390 Add TELNYX_WEBHOOK_SECRET to .env.example
Merged
#388 Promote dev → uat: inbound Telnyx webhook FK fix (GRO-1002)
Merged
#378 feat(GRO-106): inbound Telnyx webhook + persistence
Merged
#386 chore: promote dev → uat (GRO-1036 security fixes)
Merged
#385 fix(GRO-1036): secure stats endpoint + restore refund preconditions
Merged
#384 promote dev → uat: portal mobile overflow fix (GRO-730)
Merged
#372 fix: portal mobile overflow — hide scrollbar on tab rows (GRO-730)
Merged
#381 promote dev → uat: 10DLC pilot registration runbook (GRO-106)
Merged
#382 feat(GRO-984): outbound SMS persistence
Merged
#375 docs(GRO-106): 10DLC pilot registration runbook
Merged
#380 promote: dev → uat (GRO-693 E2E mock fixes)
Merged
#349 fix(E2E): add missing API mocks for invoices stats and portal billing
Merged
#376 promote: GRO-106 messaging schema → UAT
Merged
#374 feat(GRO-106): messaging schema + migrations
Merged
#373 promote: uat → main (GRO-887/GRO-958 chart hygiene)
Merged
#371 chore(uat): promote dev → uat (includes GRO-887 chart hygiene)
Merged
#369 fix(GRO-887): wire OIDC + BETTER_AUTH env vars into API deployment
Merged
#367 fix(GRO-818): UAT defects — refund button, cardLast4, manual refund, seed data
Merged
#366 fix(GRO-898): update CI to deploy on dev branch pushes
Merged
#365 promote: dev → uat (GRO-876 refund button fix)
Merged
#361 fix(GRO-876): wire up refund button in InvoiceDetailModal (cherry-pick to dev)
Merged
#364 promote: dev → uat (GRO-766 portal mobile overflow fix)
Merged
#362 fix(GRO-766): portal mobile overflow CSS fix at 390px viewport
Merged
#358 fix(gro-609): cherry-pick refund/stats fixes to dev
Merged
#359 fix(GRO-890): populate stripePaymentIntentId on paid seed invoices
Merged
#357 fix(gro-609): include stripePaymentIntentId in invoice list and wrap stats endpoint in try/catch
Merged
#356 promote: uat → main (GRO-865 logo proxy mixed content fix)
Merged
#354 promote: dev → uat (GRO-870 branding logo proxy fix)
Merged
#353 fix(GRO-870): /api/branding returns raw S3 URL — add public logo proxy
Merged
#352 fix(GRO-867): proxy logo download through API server — eliminate mixed content
Merged
#339 Promote dev → uat
Merged
#345 fix(e2e): mock /api/invoices/stats/summary to prevent Invoices page crash
Merged
#346 fix(GRO-816): fix PetProfiles crash from appointments response shape change
Merged
#341 feat(gro-609): add refund handling and payment stats to admin
Merged
#340 fix: allow groomer role to access invoices endpoint
Merged
#338 chore(GRO-720): harden .gitignore against agent runtime leaks
Merged
#312 fix(GRO-666): leave staff.user_id NULL in seed so middleware can auto-link by email
Merged
#335 Promote dev → uat: ARIA modal fix + tip split atomicity
Merged
#334 promote: uat → main (GRO-778, GRO-773, GRO-766, GRO-743)
Merged
#333 feat(GRO-785): validate tip split totals before marking invoice paid
Merged
#328 promote: GRO-766, GRO-743, GRO-773, GRO-778 fixes to UAT
Merged
#329 fix(GRO-778): exempt /dev-session from validatePortalSession middleware
Merged
#327 fix(GRO-772): raise auth rate-limit and exempt get-session
Merged
#323 fix(GRO-766): prevent horizontal overflow on portal mobile pages
Merged
#316 fix(GRO-743): client detail page fetches on direct URL navigation
Merged
#326 promote: dev → uat (GRO-769 S3 mixed content fix)
Merged
#325 fix(GRO-769): proxy logo uploads through API server to fix mixed content
Merged
#324 promote: dev → uat (GRO-642 modal a11y + GRO-751 tip split validation)
Merged
#321 fix(GRO-642): add ARIA dialog attributes to remaining modals
Merged
#320 fix(GRO-751): add server-side tip split validation to markPaid
Merged
#317 chore(uat): promote dev → uat (GRO-628 + batched)
Merged
#319 fix(GRO-749): use correct impersonation header in portal Appointments
Merged
#318 Promote dev → main: GRO-639, GRO-642, GRO-666, GRO-724
Merged
#306 fix(reminders): replace N+1 per-appointment queries with single JOIN query
Merged
#313 fix(GRO-628): implement frontend error handling and code quality fixes
Merged
#315 fix(GRO-643): add appointment indexes to schema and S3 error handling
Merged
#314 fix(GRO-666): leave staff.user_id NULL in seed so middleware can auto-link by email
Merged
#308 fix(GRO-724): rename dev hostname to dev.groombook.dev
Merged
#305 fix(GRO-624): input validation across 5 API routes
Merged
#300 feat(GRO-653): add portal session middleware and server-side audit logging
Merged
#304 docs: add CONTRIBUTING.md with branch strategy (GRO-702)
Merged
#299 fix(GRO-640): replace N+1 queries in sendConfirmationEmail with single JOIN query
Merged
#297 GRO-643: Add missing DB indexes, NOT NULL constraint on clients.email, and S3 error handling
Merged
#302 fix(GRO-689): only validate authorizationUrl hostname, add OIDC_INTERNAL_BASE in dev
Merged
#303 feat(GRO-690): add groomer persona seed support via env vars
Merged
#296 fix(seed): populate userId for UAT staff and SEED_ADMIN_EMAIL staff
Merged
#288 fix(GRO-634): implement auth & authorization security hardening (8 findings)
Merged
#278 Fix invoice status transitions, tip-split validation, refund idempotency, and tip-split response format
Merged
#295 fix(auth): add email-based staff auto-linking in resolveStaffMiddleware
Merged
#279 fix(GRO-638): appointment scheduling correctness and client deletion integrity
Merged
#294 fix(GRO-636): input validation fixes for 5 API routes
Merged
#289 fix(GRO-655): create corepack cache dir in builder stage
Merged
#292 feat(GRO-631): add graceful shutdown to API server
Merged
#291 fix: set Manager 1 as super user in UAT seed to resolve OOBE redirect
Merged
#290 fix(api): add server-side pagination to churn risk query (GRO-641)
Merged
#287 fix: add corepack cache dir to Dockerfile (GRO-655)
Merged
#285 fix(GRO-623): implement groomer data isolation in appointmentGroups, groomingLogs + batherStaffId conflict check
Merged
#284 fix(GRO-631): pin pnpm version and guard against duplicate CD PRs
Merged
#282 fix(GRO-631): add tag validation to promote-prod workflow
Merged
#281 feat(GRO-631): add security headers to nginx.conf
Merged
#275 feat(GRO-607): Stripe Elements payment UI replacing mock flow
Merged
#273 fix(GRO-574): switch rate limit to memory storage to unblock UAT
Merged
#268 feat(GRO-565): Better Auth Phase 3 - password change, OIDC discovery, session cleanup, email verification
Merged
#271 Add rate_limit table migration for Better Auth (GRO-574)
Merged
#266 fix(GRO-564): prevent admin nav logout button overflow
Merged
#265 feat(GRO-564): Better Auth Phase 2 Security Hardening
Merged
#264 fix(GRO-563): Better Auth Phase 1 - Stabilize OAuth Login
Merged
#263 fix(e2e): use domcontentloaded instead of networkidle in admin invoices test
Merged
#261 fix(gro-558): add paginated mock for /api/invoices
Merged
#260 fix(api): move Google/GitHub from plugins[] to socialProviders{} in Better-Auth config
Merged
#258 GRO-551: Add social auth env vars to UAT api-patch.yaml
Merged
#255 fix(GRO-395): Add demo pet images to seed data
Merged
#257 Fix GitHub/Google OAuth redirect URI configuration (GRO-546)
Merged
#256 fix(GRO-540): add missing OIDC env vars to prod API deployment
Merged
#253 feat(GRO-537): add UAT user personas to seed script
Merged
#251 feat(db): add UAT persona staff records to seed script (GRO-528)
Merged
#252 fix: remove hardcoded seed image in promote-to-uat workflow (GRO-534)
Merged
#250 Parameterize seed script with SEED_PROFILE env var
Merged
#249 feat: Add Google/GitHub social login providers for Demo environment (GRO-531)
Merged
#246 feat: implement SEED_ADMIN_EMAIL support for admin staff survival on demo resets
Merged
#245 fix: remove reset-demo-data CronJob from prod — move to dev/UAT only
Merged
#242 fix: set isSuperUser=false for Jordan Lee in full seed path
Merged
#240 chore: implement hourly reset CronJob for prod and UAT (GRO-507)
Merged
#241 GRO-505: Use paginated invoices API, eliminate over-fetching
Merged
#238 feat(invoices): add indexes, pagination, and client name enrichment (GRO-504)
Merged
#236 fix(web): resolve OOBE loop after setup completion (GRO-494)
Merged
#235 fix(web): redirect authenticated admin users to /admin
Merged
#234 fix(api): exempt OOBE setup from staff middleware and auto-create staff (GRO-485)
Merged
#233 fix(ci): remove dead kubectl steps from promote workflows (GRO-482)
Merged
#232 fix(ci): delete completed Jobs before Flux reconciles (GRO-481)
Merged
#231 fix(api): auto-link staff to Better-Auth user via email on first SSO login (GRO-480)
Merged
#230 fix(ci): rename base Jobs in promote-to-uat and promote-prod workflows (GRO-311)
Merged
#228 fix(GRO-472): exclude OAuth callback from service worker caching
Merged
#226 fix(api): remove duplicate authProviderRouter registration
Merged
#225 fix(db): generate unique random salt per encryptSecret call (GRO-453)
Merged
#223 fix(db): use random per-encryption salt in crypto.ts (GRO-453)
Merged
#224 fix(api): use correct schema in POST /admin/auth-provider/test (GRO-454)
Merged
#222 fix(GRO-451): re-seal UAT secrets with correct cluster certificate
Merged
#221 fix(api): wrap encryptSecret in try/catch to return proper JSON error (GRO-441)
Merged
#220 chore(GRO-429): add promote-to-uat workflow for CTO-triggered UAT promotion
Merged
#218 fix(GRO-392): reinitAuth on config change, SSRF timeout, and trailing-slash URL fix
Merged
#217 feat(GRO-390): restart-on-save for auth provider config
Merged
#216 feat(web): auth provider section in settings page (GRO-391)
Merged
#215 fix(api): needsSetup guard ordering in setup auth endpoints (GRO-392 UAT fix)
Merged
#214 feat(oobe): conditional auth provider bootstrap step (GRO-392)
Merged
#213 fix(api): correct authProvider unit test mocks
Merged
#211 fix(web): services toggle + devFetch guard (GRO-404, GRO-406)
Merged
#212 feat(api): DB-first auth config loading with env-var fallback (GRO-389)
Merged
#210 feat(db): auth_provider_config table + AES-256-GCM encryption helpers
Merged
#209 Add GroomBook logo and demo pet images
Merged
#206 fix(api): enforce requireSuperUser on settings PATCH and fix dev-mode auth bypass
Merged
#205 fix(web): clear server session on dev login user switch
Merged
#203 fix(db): move impersonation TRUNCATE before staff upsert to avoid FK violation
Merged
#202 fix(e2e): mock /api/setup/status to prevent redirect to /setup
Merged
#200 fix(db): add impersonation_sessions to seed TRUNCATE chain (GRO-372)
Merged
#201 fix: enable Go to Dashboard button on setup wizard final step
Merged
#198 fix(db): add migration 0020 UNIQUE(name) + align admin seed ON CONFLICT
Merged
#199 fix(db): seed staff_id FK fix (GRO-369)
Merged
#197 fix(db): truncate downstream tables before services dedup to avoid FK violation (GRO-365)
Merged
#196 fix(db): cast uuid to text for MIN() in services dedup query (GRO-364)
Merged
#187 feat(e2e): add Playwright E2E test suite for critical user journeys (GRO-306)
Merged
#185 fix(db): idempotent services seed — no more duplicate services
Merged
#195 fix(ci): replace yq //= with expanded form (.field // default)
Merged
#194 fix(portal): prevent /login redirect for client dev users (GRO-354)
Merged
#193 fix(ci): export SHORT_SHA + fix(db): deterministic staff IDs (GRO-355)
Merged
#191 fix(portal): redirect unauthenticated users to login — never show portal chrome (GRO-309)
Merged
#186 fix(api): use UTC in reports date helpers — reports show no data
Merged
#190 fix(ci): use unique Job names per deploy to prevent Flux immutability errors (GRO-311)
Merged
#183 fix(staff): count only active super users in last-super-user guardrail (GRO-206)
Merged
#184 fix(portal): wire dev client login to portal session
Merged
#182 fix(db): seed ON CONFLICT target uses clients.id instead of non-unique clients.email
Merged
#176 fix(db): guarantee 5 UAT test clients with pending invoices (GRO-290)
Merged
#178 ci: add workflow_dispatch trigger for manual CI runs
Merged
#173 fix(web): portal header fixes (GRO-286) + password/retry fixes (GRO-287)
Merged
#172 fix: show Pay Now button during impersonation
Merged
#168 fix: billing portal session header and response format mismatch
Merged
#166 fix: show login page before needsSetup guard for unauthenticated users
Merged
#167 fix(portal): wire Pay Now button with payment modal (GRO-261)
Merged
#162 fix(portal): wire Rebook Now button + date validation (GRO-265, GRO-266)
Merged
#148 fix: increase deployment rollout timeout to 300s (GRO-147)
Merged
#158 fix(web): set VITE_API_URL= empty for production builds
Merged
#157 ci: add production promotion workflow
Merged
#156 ci: update cd job to target dev overlay
Merged
#145 fix(db): make seed script idempotent (GRO-179)
Merged
#152 feat(portal): replace mock data with real session-driven API calls
Merged
#147 feat: add cd job to update groombook/infra image tags on main merge (GRO-178)
Merged
#144 fix(portal): implement Customer Portal reschedule button and modal
Merged
#150 feat(schema): add is_super_user to staff table
Merged
#142 fix(portal): disable non-functional stub buttons in customer portal
Merged
#136 feat(api): Better-Auth integration — sessions, auth middleware, staff resolution, RBAC tests (GRO-118)
Merged
#141 fix(gro-158): admin page blank — TypeError: b.filter is not a function
Merged
#140 fix(rbac): GRO-153 — resolveStaffMiddleware fallback for dev login
Merged
#138 fix(auth): dev login 403 — resolve staff by id, not oidcSub (GRO-150)
Merged
#137 fix(web): import App.tsx (not App.js) in App.test.tsx
Merged
#135 docs: update license reference in README to AGPL-3.0
Merged
#132 Add Helm chart scaffold with Chart.yaml, values.yaml, and helpers
Merged
#134 chore: add AGPL-3.0 license and update package.json license fields
Merged
#126 Update README with marketing positioning and key features
Merged
#129 fix(ci): use correct postgres secret for dev deploys
Merged
#128 fix(gro66): E2E selector ambiguity in impersonation.spec.ts
Merged
#120 feat: auto-select client from GlobalSearch highlight param (GRO-46)
Merged
#116 feat: iCal calendar feed (GRO-107)
Merged
#117 fix(gro-38): prod/demo auth and API-based seed
Merged
#109 feat: customer-facing appointment notes (GRO-106)
Merged
#113 feat: add PR preview deployment to groombook-dev
Merged
#112 chore: remove docs/ folder (migrated to groombook.github.io)
Merged
#108 Add marketing docs for GitHub Pages site
Merged
#104 feat: appointment confirmation and cancellation (GH #98)
Merged
#102 feat: pet photo upload via presigned S3 URLs (GH #93)
Merged
#101 test(e2e): add login and impersonation test coverage (GRO-77)
Merged
#103 feat: quick-find search for clients and pets (GH #97)
Merged
#100 feat: unify site theming via CSS custom properties (GH #91)
Merged
#99 test(db): add unit tests for test factories
Merged
#96 feat(db): add indexes on impersonation tables
Merged
#92 feat: deterministic seed, impersonation migration, test factories (GRO-110)
Merged
#89 feat: RBAC middleware and role-based route guards (Phase 1)
Merged
#85 test: Phase 1 unit tests for API routes and web components
Merged
#83 docs: add staff impersonation to README features list
Merged
#82 fix: redirect to /admin/clients after ending impersonation
Merged
#78 feat: Wire customer portal impersonation to real backend API
Merged
#75 feat: Staff Impersonation backend + frontend wiring
Merged
#73 ci: remove deploy job in favor of Flux Image Automation
Merged
#71 ci: switch Docker image tags to CalVer versioning
Merged
#70 ci: auto-update infra image tags after Docker push
Merged
#69 feat: client disable/deletion with soft-delete
Merged
#68 fix(e2e): block service workers to prevent route mock bypass
Merged
#64 feat: add View as Customer impersonation button on Clients page
Merged
#63 feat: customizable business branding (name, logo, colors)
Merged
#62 Add dev/demo login selector for quick user switching
Merged
#59 Improve admin UI visual design — polish look and feel
Merged
#57 feat: flip routing — customer portal at /, admin at /admin
Merged
#55 fix: render customer portal as full-page layout
Merged
#54 feat: customer portal with 7 sections and staff impersonation
Merged
#52 fix(packages): reorder exports conditions to fix API crash
Merged
#51 fix(reports): add error handler and improve error messages for diagnosis
Merged
#50 Fix reports crash on client churn risk query
Merged
#48 Add Renovate configuration for dependency management
Merged
#45 Fix API crash: reorder Dockerfile to copy dist before pnpm install
Merged
#47 fix(e2e): mock reports API with shaped responses in navigation tests
Merged
#44 Fix API crash: add exports field and clean runtime image
Merged
#43 Add Playwright E2E testing
Merged
#42 Set up unit testing infrastructure
Merged
#41 Fix tsconfig rootDir for correct dist output paths
Merged
#38 Fix Docker build: compile TS packages for runtime
Merged
#37 Add seed/migrate Docker stages and CI image push
Merged
#36 Add test data seed script
Merged
#35 Update CI to push Docker images to ghcr.io
Merged
#34 feat: tip and payment splitting between staff roles
Merged
#33 feat: multi-groomer calendar view with per-groomer filtering
Merged
#32 feat: detailed pet profile attributes and grooming visit history (closes #13)
Merged
#31 feat: multi-pet client group booking (closes #10)
Merged
#30 feat: reporting dashboard (closes #6)
Merged
#29 feat: automated appointment reminders via email
Merged
#28 feat: recurring appointments with cascading change propagation
Merged
#27 feat: online booking portal (closes #3)
Merged
#26 feat: basic POS & invoicing
Merged
#25 feat: pet health alerts field and delete actions (closes #2)
Merged
#24 fix: appointment conflict detection, soft-delete, and auth guardrail (#18-22)
Merged
#23 fix(ci): restore pnpm cache now that lockfile is on main
Merged
#16 feat: Docker self-hosting setup
Merged
#15 feat: appointment scheduling, client/pet/service/staff CRUD UI
Merged
#17 fix(ci): use GitHub-hosted runners until self-hosted are deployed
Merged
#14 Bootstrap monorepo: Hono API, React PWA, Drizzle DB, CI/CD
63 Issues closed from 1 user
Closed
#227 Service worker intercepts OAuth callback URL, blocking OIDC login
Closed
#237 Invoices page slow to load (performance)
Closed
#239 feat: Add hourly data reset CronJob for Prod (demo) and UAT
Closed
#247 Dev/UAT/Demo data seeding and authentication strategy
Closed
#149 OOBE/Super User — Engineering Implementation (GRO-198)
Closed
#139 [CRITICAL] App crashes with blank screen after login — all users affected (GRO-150)
Closed
#133 Change license from MIT to AGPL-3.0 across all repos
Closed
#131 Add Helm chart for Kubernetes deployment
Closed
#122 feat: customer appointment confirm/cancel in portal (GRO-47)
Closed
#118 Row-level data scoping for groomer role (RBAC Phase 2)
Closed
#107 Calendar export (iCal feed)
Closed
#114 GitHub Pages outage: docs/ removed, Pages still configured on groombook/groombook
Closed
#115 Disable GitHub Pages on groombook/groombook (docs migrated)
Closed
#119 Quick-find search: auto-select client from global search result
Closed
#105 Waitlist / cancellation backfill
Closed
#106 Customer-facing appointment notes
Closed
#84 Product Backlog: Prioritized feature roadmap after MVP
Closed
#111 Flea Flicker (UAT) needs GitHub App credentials
Closed
#80 Set up Playwright E2E tests via MCP
Closed
#98 Customer appointment confirmation and cancellation
Closed
#93 Pet photo upload: staff and customer portal
Closed
#97 Quick-find search for clients and pets
Closed
#91 Unify site theming: align staff site with customer portal design, add branding customization
Closed
#94 Add unit tests for test factories (packages/db/src/factories.ts)
Closed
#95 Add database indexes on impersonation tables
Closed
#90 Sample/dev data strategy: deterministic seed, test factories, E2E data
Closed
#88 Implement role-based API authorization
Closed
#87 Self-hosted runner missing docker compose plugin
Closed
#79 Add unit and integration tests for API routes and web components
Closed
#81 issue: ending impersonation session
Closed
#76 Wire customer portal impersonation to real backend API
Closed
#77 Impersonation routes: missing auth checks on 3 endpoints + expiry bug
Closed
#74 bug: Staff Impersonation Mode missing from customer portal
Closed
#72 Replace CI deploy job with Flux Image Automation
Closed
#67 feature: client disable/deletion
Closed
#65 E2E: booking flow test fails — time slot buttons not found
Closed
#61 Customizable colors, logo, and business name in admin settings
Closed
#60 Dev/demo login experience — quick-login and impersonation for demos
Closed
#58 Improve UI visual design — less bland, more polished
Closed
#56 Flip routing: customer portal at /, admin at /admin
Closed
#53 feature: customer portal
Closed
#49 issue: reports are failing
Closed
#46 E2E test failure: reports page loads
Closed
#40 Set up Playwright E2E testing
Closed
#39 Set up unit testing infrastructure
Closed
#12 Tip and payment splitting between staff roles
Closed
#11 Multi-groomer calendar management
Closed
#13 Detailed pet profile attributes and grooming preferences
Closed
#10 Multi-pet client group booking
Closed
#6 Reporting Dashboard
Closed
#4 Automated Reminders (SMS & Email)
Closed
#9 Recurring appointments with cascading change propagation
Closed
#3 Online Booking Portal
Closed
#5 Basic POS & Invoicing
Closed
#22 Security: AUTH_DISABLED has no production guardrail
Closed
#21 Bug: Staff DELETE has no FK protection for existing appointments
Closed
#20 Bug: Appointment DELETE permanently removes records instead of soft-delete
Closed
#19 Bug: PATCH appointment skips conflict detection when staffId omitted
Closed
#18 Bug: Appointment conflict detection race condition
Closed
#7 Docker Deployment & Self-Hosting Setup
Closed
#8 Service & Pricing Management
Closed
#2 Pet & Client Records
Closed
#1 Appointment & Schedule Management
63 Issues created by 0 users
Opened
#1 Appointment & Schedule Management
Opened
#2 Pet & Client Records
Opened
#3 Online Booking Portal
Opened
#4 Automated Reminders (SMS & Email)
Opened
#5 Basic POS & Invoicing
Opened
#6 Reporting Dashboard
Opened
#7 Docker Deployment & Self-Hosting Setup
Opened
#8 Service & Pricing Management
Opened
#9 Recurring appointments with cascading change propagation
Opened
#10 Multi-pet client group booking
Opened
#11 Multi-groomer calendar management
Opened
#12 Tip and payment splitting between staff roles
Opened
#13 Detailed pet profile attributes and grooming preferences
Opened
#18 Bug: Appointment conflict detection race condition
Opened
#19 Bug: PATCH appointment skips conflict detection when staffId omitted
Opened
#20 Bug: Appointment DELETE permanently removes records instead of soft-delete
Opened
#21 Bug: Staff DELETE has no FK protection for existing appointments
Opened
#22 Security: AUTH_DISABLED has no production guardrail
Opened
#39 Set up unit testing infrastructure
Opened
#40 Set up Playwright E2E testing
Opened
#46 E2E test failure: reports page loads
Opened
#49 issue: reports are failing
Opened
#53 feature: customer portal
Opened
#56 Flip routing: customer portal at /, admin at /admin
Opened
#58 Improve UI visual design — less bland, more polished
Opened
#60 Dev/demo login experience — quick-login and impersonation for demos
Opened
#61 Customizable colors, logo, and business name in admin settings
Opened
#65 E2E: booking flow test fails — time slot buttons not found
Opened
#67 feature: client disable/deletion
Opened
#72 Replace CI deploy job with Flux Image Automation
Opened
#74 bug: Staff Impersonation Mode missing from customer portal
Opened
#76 Wire customer portal impersonation to real backend API
Opened
#77 Impersonation routes: missing auth checks on 3 endpoints + expiry bug
Opened
#79 Add unit and integration tests for API routes and web components
Opened
#80 Set up Playwright E2E tests via MCP
Opened
#81 issue: ending impersonation session
Opened
#84 Product Backlog: Prioritized feature roadmap after MVP
Opened
#87 Self-hosted runner missing docker compose plugin
Opened
#88 Implement role-based API authorization
Opened
#90 Sample/dev data strategy: deterministic seed, test factories, E2E data
Opened
#91 Unify site theming: align staff site with customer portal design, add branding customization
Opened
#93 Pet photo upload: staff and customer portal
Opened
#94 Add unit tests for test factories (packages/db/src/factories.ts)
Opened
#95 Add database indexes on impersonation tables
Opened
#97 Quick-find search for clients and pets
Opened
#98 Customer appointment confirmation and cancellation
Opened
#105 Waitlist / cancellation backfill
Opened
#106 Customer-facing appointment notes
Opened
#107 Calendar export (iCal feed)
Opened
#111 Flea Flicker (UAT) needs GitHub App credentials
Opened
#114 GitHub Pages outage: docs/ removed, Pages still configured on groombook/groombook
Opened
#115 Disable GitHub Pages on groombook/groombook (docs migrated)
Opened
#118 Row-level data scoping for groomer role (RBAC Phase 2)
Opened
#119 Quick-find search: auto-select client from global search result
Opened
#122 feat: customer appointment confirm/cancel in portal (GRO-47)
Opened
#131 Add Helm chart for Kubernetes deployment
Opened
#133 Change license from MIT to AGPL-3.0 across all repos
Opened
#139 [CRITICAL] App crashes with blank screen after login — all users affected (GRO-150)
Opened
#149 OOBE/Super User — Engineering Implementation (GRO-198)
Opened
#227 Service worker intercepts OAuth callback URL, blocking OIDC login
Opened
#237 Invoices page slow to load (performance)
Opened
#239 feat: Add hourly data reset CronJob for Prod (demo) and UAT
Opened
#247 Dev/UAT/Demo data seeding and authentication strategy