Feedback Board¶
Overview¶
The Feedback Board is a public product-feedback forum at /feedback — a place for anyone using Otera Health to post feature requests and bug reports, vote on other people's posts, discuss them in comments, and follow their status as the team works through them.
Key design decisions:
- Public and unauthenticated. The board is reachable without logging in. Therapists, patients, and anonymous visitors can all read, post, vote, and comment.
- Cross-tenant. Unlike almost everything else in the platform, feedback posts are not scoped to a tenant. Everyone sees the same board, so duplicate requests from different clinics converge on one thread. The originating tenant and domain are recorded on each post for the team's context only, and are never shown publicly.
- No feature flag. The board is live for every deployment; there is nothing to enable per tenant.
- Attribution is by display name, not account. Posts carry a free-text author name (prefilled for logged-in users). Emails are optional and only used to notify the author of status changes.
Not the same as patient–therapist feedback
Patient–Therapist Feedback is a separate feature — structured feedback cards exchanged inside a patient's message thread. This page is about the public product feedback forum.
For the data model, endpoints, storage pipeline, and abuse controls, see Feedback Board internals.
Browsing the Board¶
The board index (/feedback) lists posts with:
- Sort tabs — Trending (default), Top, New. Trending ranks the most recent 500 posts by a decay formula,
(score + 1) / (ageDays + 2)^1.5, so a post with a burst of recent votes outranks an older post with a higher raw total. Top sorts by net score; New sorts by creation date. - Category filter — Feature request, Bug, General.
- Status filter — Open, Planned, In progress, Completed, Declined.
- Search — a debounced (300 ms) text search over post titles and bodies.
- Pagination — 20 posts at a time with a Load more button.
Pinned posts always float to the top regardless of sort. Hidden and deleted posts never appear.
Posting¶
The New post button opens a composer with:
| Field | Rules |
|---|---|
| Category | Feature request / Bug / General |
| Title | 3–120 characters |
| Body | 10–5,000 characters |
| Display name | 1–50 characters |
| Optional, up to 255 characters | |
| Notify me about updates | Checkbox, only meaningful when an email is given |
| Attachments | Up to 5 files |
For logged-in users the display name is prefilled as FirstName L. and the email is taken from the session. Anonymous visitors have their chosen name remembered in the browser so they don't retype it on the next post.
Voting¶
Every post can be voted up or down, from both the list and the detail page. The interaction is a toggle:
- Voting the same direction again removes your vote.
- Voting the opposite direction switches it.
The UI updates optimistically and reconciles with the server response. Logged-in users vote as their account; anonymous visitors are identified by a persistent per-browser device key. If a visitor later logs in, their account identity takes precedence.
Comments¶
Each post has a comment thread — up to 100 comments, oldest first, with an inline composer below. Comments from the Otera Health team are badged as official. Admins can delete individual comments directly from the post page.
Attachments¶
Screenshots and screen recordings are usually the fastest way to describe a bug, so posts accept up to five attachments:
| Type | Formats | Max size |
|---|---|---|
| Images | JPEG, PNG, GIF, WebP | 10 MB |
| Documents | PDF, DOC, DOCX, XLS, XLSX, TXT | 25 MB |
| Video | MP4, QuickTime, WebM | 100 MB |
Uploads show a per-file progress bar. On the post page, images render as a gallery grid, videos play inline, and documents appear as download links. Files are stored privately and served through short-lived signed links, so an attachment URL cannot be shared or indexed.
Statuses and Official Responses¶
The team moves each post through a status:
| Status | Meaning |
|---|---|
| Open | Received, not yet triaged |
| Planned | Accepted and scheduled |
| In progress | Being built |
| Completed | Shipped |
| Declined | Not something we plan to do |
A post can also carry an official response — a written reply from the team, shown in a highlighted block above the comment thread. When an author supplied an email and opted into updates, a status change or a new/edited official response sends them an email with the current status and the response text, linking back to the post. The email arrives in Russian on the Okta Health deployment and in English on Otera Health.
Where to Find It¶
| Surface | Entry point |
|---|---|
| Web header | Avatar dropdown → Feedback |
| Web header (mobile) | Mobile menu → Feedback |
| Marketing site | Footer → Feedback & Feature Requests |
| Profile page | Give feedback card |
| Contact page | Callout routing product ideas and bugs to the board |
Individual post pages are server-rendered so that links shared in Slack or email unfurl with the post title and body.
Admin Moderation¶
Admins get a dedicated management page at /admin/feedback — see Admin Panel and Feedback Board internals for details. In short, admins can filter across live/hidden/deleted posts, change category and status inline, pin posts, write official responses (optionally emailing the author), hide posts from public view, and soft-delete posts and comments.
Key Files¶
| File | Role |
|---|---|
OktaPT-FE/pages/feedback/index.tsx |
Board index — filters, sorting, pagination, optimistic voting |
OktaPT-FE/pages/feedback/[id].tsx |
Post detail — attachments, official response, comment thread |
OktaPT-FE/pages/admin/feedback.tsx |
Admin moderation table and response modal |
OktaPT-FE/components/feedback/NewPostModal.tsx |
Post composer |
OktaPT-FE/components/feedback/AttachmentUploader.tsx |
Multi-file upload with progress and previews |
OktaPT-FE/components/feedback/AttachmentGallery.tsx |
Image grid, inline video player, document links |
OktaPT-FE/components/feedback/PostCard.tsx |
List row |
OktaPT-FE/components/feedback/VoteButton.tsx |
Up/down vote control |
OktaPT-FE/components/feedback/FeedbackFilterBar.tsx |
Sort tabs, category/status filters, search |
OktaPT-FE/components/feedback/CommentList.tsx, CommentComposer.tsx |
Comment thread |
OktaPT-FE/components/feedback/AdminResponseBlock.tsx |
Official response block |
OktaPT-FE/components/profile/GiveFeedback.tsx |
Profile entry card |
OktaPT-FE/lib/api/feedbackApi.ts |
Typed API client |
OktaPT-FE/lib/utils/feedbackUpload.ts |
Client-side validation and upload with progress |
OktaPT-FE/lib/utils/feedbackDevice.ts |
Anonymous device key and remembered author name |
OktaPT-API/src/routes/feedback/ |
Router, public and admin controllers, validators |
OktaPT-API/src/services/feedbackBoardService.ts |
All database access, trending ranking, vote transactions |
OktaPT-API/src/services/feedbackForumNotifier.ts |
Team alert on new posts, status email to authors |