2.6 KiB
2.6 KiB
Project Brief: OYS Borrow a Boat (oysqn.app)
Created: 2026-04-21 Owner: Patrick Toal
Identity
- App name: OYS Borrow a Boat (oysqn.app)
- Previous app: bab-app (Appwrite backend — retired)
- Purpose: Manage a Borrow a Boat program for a Yacht Club (OYS = Oakville Yacht Squadron)
- Club: Oakville Yacht Club, Oakville, ON Canada
- Target users: Club members enrolled in the Borrow a Boat program
Personas
| Persona | Description |
|---|---|
| BAB Member | Enrolled club member; can browse boats and make reservations |
| Certified Skipper | Credentialed to take boats without supervision |
| Program Administrator | Manages boats, intervals, rules, and member access |
| Boatswain | Responsible for boat maintenance and readiness |
| Volunteer | Assists with program logistics |
| Instructor | Delivers sailing instruction; may certify members |
Stack
| Layer | Technology |
|---|---|
| Framework | Nuxt 4 (SSR=false, SPA mode) |
| UI | Ionic Vue (@ionic/vue) + PrimeVue 4 |
| Language | TypeScript |
| Backend | Supabase (Auth, DB, Edge Functions, Storage) |
| Testing | Vitest (unit), Vitest (integration, hits real Supabase), Playwright (E2E) |
| Package manager | Yarn |
Architecture Highlights
app/app.vue— IonApp + IonMenu + IonRouterOutlet (no NuxtLayout/NuxtPage)- Auth: magic link + OTP only; no password auth; no self-service signup; admin-only invite
- Edge Functions: Bearer JWT →
adminClient.auth.getUser(token)pattern; all DB ops via service role - Icons: Ionicons only (
ionicons/icons)
CI/CD Pipeline
- Source control: Gitea
- CI: Gitea Actions (unit tests + build on PR)
- Deploy (dev): EDA (Event-Driven Ansible) → AAP → nginx artifact swap on bab1
- Deploy (prod): EDA → AAP (manual approval gate) → S3 sync
- E2E: Playwright, run post-deploy via AAP
- Supabase environments: Two projects — dev and prod (project IDs in Vault)
- Secrets: HashiCorp Vault at
http://nas.lan.toal.ca:8200, pathkv/oys/
Current Phase
[FILL: e.g., "Active development — reservations UI", "Beta testing", "Production"]
Key Constraints
- Deadline: April 30th (Launch Day)
- Four boats in the program
- Between 20 - 30 Members
Booking Rules (known so far)
- Weekly pre-booking limit enforced (exact number: 2)
- Overlap constraint: same boat cannot be double-booked
Open Items
- Are cancel-reservation and admin Edge Functions planned?
- What is the full set of admin pages needed?
- What is the club name for display in the app?
- What is the season start date / go-live target?