Note: Render's Free tier has cold starts and may take up to 30 seconds to load at first.
- Live frontend: https://pblworkflow-1.onrender.com
- Live backend: https://pblworkflow.onrender.com/health
A two mode web app for project based learning orchestration:
- Student mode: milestones, artifacts, check ins, tagged comments
- Teacher mode: group dashboard, evidence timeline, ranked/color coded indicators
- Student workflow UI with collapsible navigation and group context
- Milestone board (title, description, goal date, status, definition of done)
- Artifact workflow (link upload, milestone tagging, optional revision tagging)
- Timeline grouped by date with expandable artifact/check in details
- Separate check in and comments panels
- Teacher dashboard home + group evidence view
- Teacher feedback on timeline items, visible on student side
- Indicator engine with ranking + severity coloring
- Event logging model on create/update actions
- Seeded demo groups for indicator coverage
progress_trajectoryhelp_seeking(over help / under help)milestone_driftrevision_frequencygamingwheel_spinning
Trigger reference: docs/architecture/05-indicator-triggers.md
- Frontend: React + TypeScript + Vite
- Backend: Node.js + Express + TypeScript + Zod
- Runtime data layer: in memory store (seeded for demo)
npm install
npm run dev- Frontend:
http://localhost:5173 - Backend:
http://localhost:4000
Build check:
npm run build- Root Directory:
apps/api - Build Command:
npm install && npm run build - Start Command:
npm start
- Root Directory:
apps/web - Build Command:
npm install && npm run build - Publish Directory:
dist - Environment Variable:
VITE_API_URL=https://pblworkflow.onrender.com
SPA fallback is configured via apps/web/public/_redirects.
GET /api/student/navigationPOST /api/student/groupsGET /api/student/groups/:groupId/boardPOST /api/student/milestonesPATCH /api/student/milestones/:idPOST /api/student/artifactsPATCH /api/student/artifacts/:idPOST /api/student/checkinsPATCH /api/student/checkins/:idPOST /api/student/commentsPATCH /api/student/comments/:id
GET /api/teacher/groupsGET /api/teacher/groups/:groupId/evidence