# LAD Website — Session Resume Guide **Last updated:** 2026-05-24 **Repo:** `https://gitea.sigd.net/chaulmark/lad-website` **Local clone:** `/home/chaulmark/websites/lad-website` **Last commit:** `c9e042f` (Update/Article models, migration script, full rebrand) **Dev URL:** `https://lad.sigd.net` → Caddy on 10.8.0.10 → 10.8.0.165:3000 --- ## Stack | Layer | Technology | Notes | |-------|-----------|-------| | Frontend | Next.js 16, React 19.2, Tailwind CSS v4 | `/frontend/` | | Backend | Express 5, TypeScript, MongoDB, Redis | `/backend/` | | CMS (source) | Directus at `https://db.lad1908.org` | Being replaced — data migrated | | Infra | Docker Compose + Nginx | `/docker-compose.yml` | | Git host | Gitea at `gitea.sigd.net` | user: chaulmark | --- ## Brand Reference | Item | Value | |------|-------| | Organization | Louisiana Association of the Deaf (LAD) | | Founded | 1908 | | Brand color | `#13AE3A` (green) | | LAD logo | `https://db.lad1908.org/assets/5cdfa81d-ffc8-4cae-a178-5db3bfbaaeb8` | | Deaf Focus logo | `https://db.lad1908.org/assets/c15110fe-d25a-4863-8e9c-055bfad3c710` | | General contact | info@lad1908.org | | Deaf Focus interpreting | request@deaffocus.org / (225) 319-5586 / Fax (225) 308-4025 | | Hours | Mon–Fri 9am–4pm | | Scraped content | `LAD_CONTENT.md` in repo root | --- ## What Has Been Done ### Rebrand (complete) - All "Olathe Club of the Deaf" / "OCD" references replaced with LAD throughout entire codebase - Brand color switched from blue (`#1a56db`) to LAD green (`#13AE3A`) in `globals.css` - Navigation, Footer, layout metadata all updated ### Package Upgrades (complete) - Frontend: Next.js 15→16, React 18→19.2, axios added - Backend: Express 4→5, Mongoose 8→9, bcrypt 5→6, helmet 7→8, Zod 3→4 - Breaking changes fixed: async params, broken imports, next.config.js remotePatterns ### Pages (all complete) | Page | File | Status | |------|------|--------| | Home | `app/page.tsx` | ✅ Announcement banner, real events, LAD copy | | About | `app/about/page.tsx` | ✅ 2019–21 board, 10 affiliated orgs, history | | Updates | `app/updates/page.tsx` | ✅ Static — needs wiring to backend API | | Events | `app/events/page.tsx` | ✅ Static — needs wiring to backend API | | Minutes | `app/minutes/page.tsx` | ✅ Static — needs wiring to backend API | | Deaf Focus | `app/deaf-focus/page.tsx` | ✅ Static — needs wiring to backend API | | Contact | `app/contact/page.tsx` | ✅ Real LAD contact info | | Membership | `app/membership/page.tsx` | ✅ LAD copy, fees TBD (contact-us prompt) | | Donate | `app/donate/page.tsx` | ✅ LAD nonprofit info | ### Backend Models (all complete) | Model | File | Notes | |-------|------|-------| | Event | `models/Event.ts` | + directusId, photoUrl, photoCaption | | Document | `models/Document.ts` | + directusId, directusAssetId, 3 new minute types | | Member | `models/Member.ts` | Unchanged | | Video | `models/Video.ts` | Unchanged | | **Update** | `models/Update.ts` | NEW — news/update posts | | **Article** | `models/Article.ts` | NEW — Deaf Focus articles | All models have full CRUD routes at `/api/{collection}`. ### Data Migration (complete — local only) Migration script: `backend/scripts/migrate-directus.ts` Run with: `npx tsx scripts/migrate-directus.ts` from `/backend/` **Local migration results:** - 235 updates ✅ (photos are Directus URLs — 403 protected, used as fallback) - 148 events ✅ (same photo situation) - 201 public minutes PDFs downloaded to `uploads/documents/` ✅ - 6 Deaf Focus articles ✅ - **230 members-only PDFs** — skipped, need manual upload via admin panel - Full manifest in `scripts/migration-report.json` (gitignored, regenerated on re-run) ### Infrastructure (complete) - `mongo-init/01-init.js` — creates `lad_db` user from `MONGO_USER`/`MONGO_PASSWORD` env vars - `docker-compose.yml` — fully rebranded (lad_db, lad-mongo-data, lad-redis-data) - `backend/.env.example` — template for all production env vars - `backend/.gitignore` — excludes uploads/ contents, .env, migration-report.json --- ## What Still Needs To Be Done ### 1. Wire Frontend to Backend API (next up) Replace static arrays in 4 page files with Next.js Server Component `fetch()` calls: | Page | API endpoint | |------|-------------| | `app/updates/page.tsx` | `GET /api/updates?status=published` | | `app/events/page.tsx` | `GET /api/events?status=published` | | `app/minutes/page.tsx` | `GET /api/documents` (isPublic split) | | `app/deaf-focus/page.tsx` | `GET /api/articles?status=published` | Recommendation: use Next.js Server Components with `{ next: { revalidate: 3600 } }` for caching. ### 2. Production Deploy on 10.4.0.205 - Add LAD to `webhook-listener/server.py` `REPO_CONFIG` on 10.4.0.205 - Create `backend/.env` from `.env.example` with real credentials - Add Caddy entry on 10.4.0.205 for the real domain - `docker compose up -d` - `docker exec lad-backend npx tsx scripts/migrate-directus.ts` ### 3. Admin Panel - Verify JWT login at `/admin/login` - Auth middleware: `backend/src/middleware/auth.ts` - Test CRUD for all 6 collections - Upload the 230 members-only PDFs via `/admin/documents` ### 4. Minor Cleanup - Fix duplicate Mongoose index warnings in `Document` model (`documentType` and `isPublic` defined both inline and in `schema.index()`) --- ## File Structure Reference ``` lad-website/ ├── frontend/ │ └── src/app/ │ ├── page.tsx ✅ Homepage │ ├── about/page.tsx ✅ Board + orgs │ ├── updates/page.tsx ⚡ Static → needs API wiring │ ├── events/page.tsx ⚡ Static → needs API wiring │ ├── minutes/page.tsx ⚡ Static → needs API wiring │ ├── deaf-focus/page.tsx ⚡ Static → needs API wiring │ ├── contact/page.tsx ✅ LAD contact info │ ├── membership/page.tsx ✅ LAD copy │ ├── donate/page.tsx ✅ LAD nonprofit │ └── admin/ (full CRUD panel — needs auth verification) ├── backend/ │ ├── src/ │ │ ├── models/ (Event, Document, Member, Video, Update, Article) │ │ ├── controllers/ (full CRUD for all 6) │ │ ├── routes/ (REST API) │ │ └── middleware/auth.ts (JWT) │ ├── scripts/ │ │ └── migrate-directus.ts ✅ Directus→MongoDB migration │ ├── uploads/ (gitkeep stubs — populated by migration) │ ├── .env.example ✅ Production env template │ └── .gitignore ✅ ├── mongo-init/01-init.js ✅ Creates lad_db user ├── docker-compose.yml ✅ lad_db, lad-mongo-data ├── LAD_CONTENT.md (all scraped content) └── RESUME.md (this file) ``` --- ## Environment / Shell Notes - **EDQUOT issue:** Shell has had recurring disk quota problems from Chrome cache. If bash commands fail silently (exit code 1, no output), check `~/.npm/_cacache`, `~/.cache/tracker3`, `~/.config/chrome-cdp-profile` - **Dev server:** `cd ~/websites/lad-website/frontend && npm run dev -- --hostname 0.0.0.0` - **MongoDB (local dev):** `sudo mongod --dbpath /var/lib/mongodb --logpath /var/log/mongodb/mongod.log --fork` - **Always run build first:** `cd frontend && npm run build` before making changes - **Gitea token:** embedded in remote URL --- ## How to Resume 1. `cd ~/websites/lad-website` 2. `git log --oneline -3` — confirm at `c9e042f` or later 3. `cd frontend && npm run build` — verify build passes 4. Start dev server: `npm run dev -- --hostname 0.0.0.0` 5. Next task: wire the 4 static pages to the backend API (see section above)