Web portal for the co-owners of Les Dauphins sur le Parc, a 28-storey, 417-unit condominium at 3535 avenue Papineau, Montréal.
Live site: https://portal-lesdauphins.netlify.app
Repo: https://github.com/Data-ScienceTech/portal-lesdauphins
# 1. Clone
git clone https://github.com/Data-ScienceTech/portal-lesdauphins.git
cd portal-lesdauphins
# 2. Install
npm install
# 3. Configure environment
cp .env.example .env
# Edit .env with your Supabase credentials (see below)
# 4. Run
npm run devOpen http://localhost:5173 — the landing page should load.
| Field | Value |
|---|---|
test@lesdauphins.ca |
|
| Password | DauphinsTest2026! |
| Layer | Technology |
|---|---|
| Framework | React 18 + TypeScript |
| Build | Vite 5 |
| Styling | Tailwind CSS 3.4 |
| Backend | Supabase (Postgres + Auth + RLS) |
| Routing | React Router 6 |
| Forms | React Hook Form + Zod |
| Data | TanStack React Query |
| Icons | Lucide React |
| Hosting | Netlify |
| CI/CD | GitHub Actions → Netlify |
Portal-LesDauphins/
├── .github/workflows/
│ └── deploy.yml # CI/CD: build → deploy to Netlify
├── src/
│ ├── pages/
│ │ ├── LandingPage.tsx # Public bilingual landing page
│ │ ├── LoginPage.tsx # Supabase auth login
│ │ └── MemberDashboard.tsx # Protected member portal
│ ├── contexts/
│ │ ├── AuthContext.tsx # Supabase auth provider
│ │ └── LanguageContext.tsx # FR/EN i18n system
│ ├── lib/
│ │ └── supabase.ts # Supabase client init
│ ├── App.tsx # Router + providers
│ ├── main.tsx # Entry point
│ └── index.css # Global styles + ocean theme
├── docs/ # Project documentation
│ ├── project-spec.md # Full ERP specification
│ ├── user-stories.md # User stories by role
│ ├── api-endpoints.md # REST API design
│ └── design.md # Design system reference
├── supabase_complete_setup.sql # Full DB schema + seed data
├── rls_policies.sql # Row-level security policies
├── netlify.toml # Netlify build & redirect config
├── .env.example # Env var template
└── package.json
| Variable | Description |
|---|---|
VITE_SUPABASE_URL |
Supabase project URL (https://xxx.supabase.co) |
VITE_SUPABASE_ANON_KEY |
Supabase public/anon JWT key |
These are set in:
- Local dev:
.envfile (not committed) - Netlify production: Environment variables in site settings
- GitHub Actions: Repository secrets (used at build time)
npm run dev # Start dev server (Vite HMR)
npm run build # TypeScript check + production build
npm run preview # Preview production build locally
npm run lint # ESLint check- Create component in
src/pages/ - Add route in
src/App.tsx - Add translations in
src/contexts/LanguageContext.tsx
All UI text uses the translation function t() from LanguageContext:
const { t, language, setLanguage } = useLanguage();
return <h1>{t('hero.title')}</h1>;Translation keys are defined in src/contexts/LanguageContext.tsx.
Supabase project: dauphins-portal-v2 (region: Canada Central)
| Table | Description |
|---|---|
users |
User profiles linked to auth.users |
units |
Condo units (Tour Sud / Tour Nord) |
owners |
Ownership records (user ↔ unit) |
accounts_receivable |
Invoices (FAG, FAA, FDP funds) |
service_requests |
Maintenance requests with status tracking |
documents |
Document library with visibility controls |
communications |
Announcements and messages |
parking_spaces |
Parking space assignments |
lockers |
Storage locker assignments |
All tables have Row Level Security enabled. See rls_policies.sql.
To set up a fresh Supabase project:
- Create the project on supabase.com
- Create a test user via Authentication → Users (
test@lesdauphins.ca) - Update the user UUID in
supabase_complete_setup.sql - Run the SQL in the Supabase SQL Editor
- Update
.envwith the new project URL and anon key
Every push to main triggers the GitHub Actions workflow:
- Build —
npm ci→npm run build(with env secrets) - Deploy — uploads
dist/to Netlify production
A weekly keepalive job pings Supabase to prevent project pausing.
| Secret | Purpose |
|---|---|
VITE_SUPABASE_URL |
Supabase URL (build-time) |
VITE_SUPABASE_ANON_KEY |
Supabase anon key (build-time) |
NETLIFY_AUTH_TOKEN |
Netlify personal access token |
NETLIFY_SITE_ID |
Netlify site ID |
npm run build
npx netlify deploy --prod --dir=distTo set up lesdauphins.datasciencetech.ca:
- In Netlify → Site settings → Domain management → Add custom domain
- Add a CNAME DNS record:
lesdauphins→portal-lesdauphins.netlify.app - Netlify auto-provisions the SSL certificate
- Bilingual (FR/EN) landing page with ocean theme
- Supabase authentication (email/password)
- Protected member dashboard route
- Dashboard overview with stats (hardcoded pending real queries)
- Full database schema with RLS policies
- Seed data (1 owner, 6 units, 5 invoices, 3 service requests)
- CI/CD: GitHub Actions → Netlify
- Invoice list / detail pages (real data queries)
- Service request form with file upload
- Document library with search/filter
- Profile management page
- Admin panel for board members
- Email notifications (Resend / SendGrid)
- Payment integration
See docs/project-spec.md for the full ERP specification and docs/user-stories.md for the complete feature backlog.
See CONTRIBUTING.md for guidelines on branching, commits, and pull requests.
Private — Les Dauphins Copropriété / Data Science Tech.