Feedback
In-app feedback capture from any signed-in user, triaged by platform operators — message plus page, device, and screenshot context.
Feedback lets any signed-in user report a problem or suggestion from inside the app. The row captures the message plus debugging context: currentPage, browser / os / device, location, an optional screenshotStorageId, and a free-form metadata jsonb.
| Route | Guard |
|---|---|
POST feedback | Any signed-in user type — students, staff, guardians |
GET feedback, GET :id, GET :id/screenshot-url, DELETE :id | PLATFORM_ADMIN only — feedback is triaged by operators, not schools |
Two things that make it unusual in this codebase:
- The entity carries a
schoolIdcolumn but is not@TenantScoped()— reads happen platform-side, across tenants, so the school is recorded as context rather than used as a filter. - The screenshot lives in storage;
screenshot-urlmints a signed URL on demand rather than exposing the file.
Where to go next
Notice Board
Staff-managed notices for guardians — campus-targeted or school-wide, with fire-and-forget guardian notification on publish.
Knowledge Base
Staff-authored docs with pgvector + full-text hybrid search — chunked and embedded off the request path, fused with reciprocal rank fusion, consumed by Rover and the social agent.