- Refactored navigation with grouped sections (Operations, Cultivation, Analytics, etc.)
- Added RBAC-based navigation filtering by user role
- Created DevTools panel for quick user switching during testing
- Added collapsible sidebar sections on desktop
- Mobile: bottom nav bar (4 items + More) with slide-up sheet
- Enhanced seed data with [DEMO] prefix markers
- Added multiple demo users: Owner, Manager, Cultivator, Worker
- Fixed domain to runfoo.run
- Added Audit Log and SOP Library pages to navigation
- Created usePermissions hook and RoleBadge component
Photo Management (per specs/photo-management.md):
- Sharp integration for 3-size compression (thumb/medium/full)
- WebP output with 80-90% quality
- Client-side compression with browser-image-compression
- PhotoUpload component with camera/drag-drop support
- Upload API with bulk support and stats endpoint
Testing:
- Backend: Jest tests for all major API endpoints
- Frontend: Vitest tests for utilities and API clients
- CI: Updated Forgejo workflow for test execution
Specs (100% coverage):
- visitor-management.md (Phase 8)
- messaging.md (Phase 9)
- audit-and-documents.md (Phase 10)
- accessibility-i18n.md (Phase 11)
- hardware-integration.md (Phase 12)
- advanced-features.md (Phase 13)
Documentation:
- OpenAPI 3.0 spec (docs/openapi.yaml)
- All endpoints documented with schemas
Added PlantTouchPoint and IPMSchedule models. Implemented touch-points and IPM controllers/routes. Updated frontend with Dashboard feed and IPM widgets.
📋 Documentation:
- ROADMAP.md (complete feature roadmap)
- QUICK-IMPLEMENTATION-PLAN.md (shopping list, touch points, tasks)
⚠️ CRITICAL ISSUE IDENTIFIED:
- ALL pages have hardcoded bg-white (not dark mode compatible)
- Need to fix: Dashboard, Batches, Rooms, Timeclock, Walkthrough
- Font stack reverting to Inter (CSS not syncing properly)
Next: Mass dark mode fix for all pages
✅ Backend API Implementation (Phase 1.5)
📁 Files Created:
- backend/src/controllers/walkthrough.controller.ts
- backend/src/routes/walkthrough.routes.ts
🔌 API Endpoints:
- POST /api/walkthroughs - Start new walkthrough
- GET /api/walkthroughs - List walkthroughs (with filters)
- GET /api/walkthroughs/:id - Get walkthrough detail
- POST /api/walkthroughs/:id/complete - Mark complete
- POST /api/walkthroughs/:id/reservoir-checks - Add reservoir check
- POST /api/walkthroughs/:id/irrigation-checks - Add irrigation check
- POST /api/walkthroughs/:id/plant-health-checks - Add plant health check
✨ Features:
- Full CRUD for walkthroughs
- Nested check creation
- User authentication required
- Query filters (status, date range, user)
- Includes related data (user, all checks)
- Error handling
- TypeScript types
🔐 Security:
- Requires authentication (userId from JWT)
- User attribution on creation
- Proper error responses
📊 Response Format:
- Includes user details (name, email, role)
- Includes all checks (reservoir, irrigation, plant health)
- Ordered by date (desc)
⏭️ Next: Frontend UI (4-5 hours)
Build: ✅ Successful
- Updated seed script: admin@runfoo.com → admin@runfoo.run
- Updated all documentation to reflect correct email
- Need to re-seed database on deployment
✅ Sprint 1 Complete:
- Changed health check from curl to wget (alpine compatible)
- Changed localhost to 127.0.0.1 (fixes DNS issues with Tailscale/Docker)
- Backend now shows (healthy) status
- Added CREDENTIALS.md with login info
- Documented solution in SPRINT-1-HEALTHCHECK.md
Login credentials:
- Email: admin@runfoo.com
- Password: password123
- URL: https://777wolfpack.runfoo.run
- Backend container uses node:20-alpine which doesn't include curl
- wget is available by default in alpine
- Health check endpoint is working, just the command was wrong
- Also added Sprint 1 documentation and credentials file