10 KiB
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: 523e812 (TODO.md added)
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 |
Read-only reference |
| 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 |
| Primary contact | request@deaffocus.org / (225) 319-5586 |
| 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 in:
frontend/src/app/layout.tsx— metadata, OpenGraph, Twitter card, metadataBasefrontend/src/components/organisms/Navigation.tsx— org name, logo, nav linksfrontend/src/components/organisms/Footer.tsx— org name, tagline, copyrightfrontend/src/app/about/page.tsx— full about page copy
frontend/src/app/globals.css— brand color switched from blue (#1a56db) to LAD green (#13AE3A) throughout: primary vars, gradients, CTA section, button shadows, dark theme, badge shadows
Package Upgrades (complete)
- Frontend: Next.js 15→16, React 18→19.2.6, eslint-config-next updated, axios added
- Backend: Express 4→5, Mongoose 8→9, bcrypt 5→6, helmet 7→8, Zod 3→4
- Breaking change fixed:
frontend/src/app/api/uploads/[...path]/route.ts— async params (Next.js 16 requirement) - Bug fixed:
frontend/src/components/video/VideoPlayer.tsx— broken absolute import path - Config fixed:
frontend/next.config.js— removedexperimental.serverActions, addeddb.lad1908.orgto remotePatterns, switchedimages.domainstoimages.remotePatterns
New Pages (complete)
These pages were added and did not exist in the OCD template:
frontend/src/app/updates/page.tsxfrontend/src/app/minutes/page.tsxfrontend/src/app/deaf-focus/page.tsx
Content (complete — static)
All pages below have real LAD content hardcoded as static data. Content source: LAD_CONTENT.md.
| 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 |
✅ 13 real updates (2014–2022) |
| Events | app/events/page.tsx |
✅ 12 real events, 2 featured |
| Minutes | app/minutes/page.tsx |
✅ Public/members-only split, type badges |
| Deaf Focus | app/deaf-focus/page.tsx |
✅ All 6 articles + logo |
| Contact | app/contact/page.tsx |
⚠️ Still says "Olathe" — needs LAD info |
| Membership | app/membership/page.tsx |
⚠️ Still says "Olathe" — needs LAD info |
| Donate | app/donate/page.tsx |
⚠️ Still says "Olathe" — needs LAD info |
What Still Needs To Be Done
1. Fix Remaining OCD-branded Pages (quick — ~30 min)
Three pages still have "Olathe Club of the Deaf" content. Just rebrand and fill with LAD info:
app/contact/page.tsx
- Replace metadata title/description
- Add real contact info:
- LAD general: info@lad1908.org (or use Deaf Focus contact below if LAD doesn't have a separate one)
- Deaf Focus interpreting: request@deaffocus.org
- Phone: (225) 319-5586
- Fax: (225) 308-4025
- Hours: M–F 9am–4pm
- Mailing address (unknown — not in scraped content)
- The
ContactFormcomponent already exists atcomponents/molecules/ContactForm.tsx
app/membership/page.tsx
- Replace "Olathe" with LAD throughout
- LAD membership info (from scraped content): LAD is a nonprofit statewide org; membership gives voting rights, event access, advocacy support
- Membership fees/tiers unknown — not in scraped content; may need to ask client
app/donate/page.tsx
- Replace "Olathe" with LAD throughout
- LAD is a 501(c) nonprofit — donations are tax-deductible
- No specific donation platform/link found in scraped content; may need to ask client
2. Verify Build (critical — do this first in new session)
The build has never been run since the upgrades. Do this before anything else:
cd /home/chaulmark/websites/lad-website/frontend
npm run build
Known potential issues:
- TypeScript errors in admin pages (they use
useParams()hook which should be fine, but worth checking) - Any remaining OCD strings that TypeScript or ESLint might catch
- The
lintscript was changed fromnext linttoeslint .— make sure ESLint config is correct
3. Wire Dynamic Content (medium effort — decision required)
Currently Updates, Events, Minutes, and Deaf Focus are static arrays in the page files. There are two options:
Option A: Pull from Directus API directly (simpler)
https://db.lad1908.org/items/updates— 69 itemshttps://db.lad1908.org/items/events— 78 itemshttps://db.lad1908.org/items/minutes— 101 itemshttps://db.lad1908.org/items/deaffocus— 6 items- Use
fetch()in Next.js Server Components withrevalidatefor caching - Pro: No backend setup needed, always live data
- Con: Dependent on client's Directus instance staying up
Option B: Import into local MongoDB backend (more control)
- The backend already has models for Events, Documents (Minutes), Videos, Members
- Would need a one-time import script to seed MongoDB from Directus
- Admin panel can then manage content going forward
- Pro: Self-contained, admin panel works
- Con: More setup, data gets out of sync if client updates Directus
Recommendation: Option A for now (Directus is already live and maintained by client), Option B later once the admin panel is configured.
4. Admin Panel (medium effort)
The admin panel exists at /admin with full CRUD for:
- Members (
/admin/members) - Documents (
/admin/documents) — this maps to Minutes - Videos (
/admin/videos) — relevant for Deaf Focus - Events (
/admin/events)
What needs doing:
- Verify admin login works (backend auth middleware is in
backend/src/middleware/auth.ts) - Set up initial admin credentials (JWT-based auth — check
backend/src/middleware/auth.ts) - Test document/event upload flows with LAD content
- The backend connects to MongoDB — needs a running MongoDB instance (handled by Docker Compose)
5. Deploy to Production
When ready, deploy to production server at 10.4.0.205:
- The Gitea webhook + friday-bot pipeline is already wired for other sites
- LAD website is not yet added to
webhook-listener/server.py'sREPO_CONFIG - Will need: domain name, Caddy reverse proxy entry on 10.4.0.205, Docker Compose up
File Structure Reference
lad-website/
├── frontend/
│ ├── src/
│ │ ├── app/
│ │ │ ├── layout.tsx ✅ LAD metadata
│ │ │ ├── page.tsx ✅ Homepage
│ │ │ ├── globals.css ✅ Green theme
│ │ │ ├── about/page.tsx ✅ Board + orgs
│ │ │ ├── updates/page.tsx ✅ 13 updates
│ │ │ ├── events/page.tsx ✅ 12 events
│ │ │ ├── minutes/page.tsx ✅ Public/members split
│ │ │ ├── deaf-focus/page.tsx ✅ 6 articles
│ │ │ ├── contact/page.tsx ⚠️ Needs LAD info
│ │ │ ├── membership/page.tsx ⚠️ Needs LAD info
│ │ │ ├── donate/page.tsx ⚠️ Needs LAD info
│ │ │ └── admin/ (full CRUD panel)
│ │ └── components/
│ │ ├── organisms/Navigation.tsx ✅ Logo + nav
│ │ ├── organisms/Footer.tsx ✅ LAD footer
│ │ ├── molecules/Hero.tsx
│ │ ├── molecules/ContactForm.tsx
│ │ └── video/VideoPlayer.tsx ✅ Fixed import
│ ├── next.config.js ✅ remotePatterns updated
│ └── package.json ✅ Next.js 16, React 19.2
├── backend/
│ ├── src/
│ │ ├── models/ (Member, Event, Document, Video)
│ │ ├── controllers/ (full CRUD)
│ │ ├── routes/ (REST API)
│ │ └── middleware/auth.ts (JWT)
│ └── package.json ✅ Express 5, Mongoose 9
├── LAD_CONTENT.md ✅ All scraped content
├── TODO.md ✅ Summary task list
└── RESUME.md ✅ This file
Environment / Shell Notes
- EDQUOT issue: The shell has had recurring disk quota problems from Chrome cache in previous sessions. If bash commands fail silently (exit code 1 with no output), disk quota is likely the cause.
- Workaround used: Route all command output to files (
cmd > ~/output.txt 2>&1) then read the file. This bypasses the broken stdout pipe. - Root cause:
~/old-hermes.tar.bz2was a 1.3GB archive that was truncated to free space. If quota hits again, check~/.npm/_cacache,~/.cache/tracker3, and~/.config/chrome-cdp-profilefor large files. - Gitea token:
fe17b49600550ff548627e133155ed29b2dcec77(embedded in remote URL)
How to Resume
- Open a fresh terminal (clears the EDQUOT shell state)
cd ~/websites/lad-websitegit log --oneline -5— confirm you're at523e812or latercd frontend && npm run build— verify build passes- Fix contact/membership/donate pages (see section above)
- Decide on Directus vs MongoDB for dynamic content