Feedback Technical Details
Building Blocks
The platform is two packages on top of nuxt-auto-api:
| Package | What it adds |
|---|---|
@websideproject/module-auto-feedback | The database tables, their access rules, the admin pages under /admin/feedback, and the custom endpoints (voting, publishing, analytics). |
@websideproject/layer-auto-feedback | The public pages — /feedback, /feedback/<id>, /feedback/my-feedback, /roadmap, /changelog — and the feedback composer that opens from anywhere in the app. |
The layer installs the module, so extending the layer is all an app needs:
export default defineNuxtConfig({
extends: ['@websideproject/layer-auto-feedback'],
})
Image and video uploads in the changelog editor go through module-auto-storage (the public bucket — R2 in production).
Data Model
| Table | Holds |
|---|---|
feedback_items | Posts: title, description, board (category), status, priority, type (feature, bug, question), visibility (public, private, internal), votes and comment counters, tags, the admin's reply and notes. |
feedback_votes / feedback_comments | One vote per user per post; threaded comments with approval. |
feedback_categories / feedback_statuses | The boards and the feedback lifecycle. |
feedback_roadmap_items / feedback_roadmap_statuses | Roadmap items with target version and quarter, dates, progress, milestones and tags. |
feedback_changelog_entries | Release notes (markdown), category, tags, gallery (images), link cards (links), publish state and an optional future release date (scheduled_for). |
Posts, comments, boards, statuses, roadmap items and changelog entries are soft-deleted and audited, so a deleted post can be restored from the inbox's trash.
How the Three Parts Link
Each link has one owner — the other side is derived for display, so the two can never disagree:
| Link | Stored on | Edited in |
|---|---|---|
| Feedback → roadmap item | feedback_items.roadmap_item_id | Inbox → triage panel → Roadmap item |
| Roadmap item → changelog entries | feedback_roadmap_items.changelog_entries | Roadmap → item → Changelog entries |
| Changelog entry → shipped feedback | feedback_changelog_entries.feedback_items | Changelog → entry → Shipped feedback, or when publishing |
Access Rules
Access is declared per resource with nuxt-auto-api's deny-by-default rules:
- Visitors read approved public posts, public statuses, published roadmap items and published changelog entries. They can post feedback and comment (signed in or anonymously); voting requires an account.
- A signed-in user also sees their own posts in any state on My Feedback, including private support tickets.
- Team members see their organisation's
internalposts; org owners and admins can triage them. - Site operators (platform admins) manage everything.
Endpoints
Most reads and writes use the generated REST API (/api/feedbackItems, /api/roadmapItems, /api/changelogEntries, …). The custom endpoints are:
| Endpoint | Purpose |
|---|---|
POST /api/feedback/vote | Upvote/downvote; voting again removes the vote. Keeps the post's counters in step. |
GET /api/feedback/my-votes | Which posts the current visitor has upvoted (drives the filled heart). |
GET /api/feedback/my | The current user's own posts, in every state. |
POST /api/admin/feedback/changelog/:id/publish | Publish now, or publish with a future release date; saves the shipped feedback and notifies its upvoters. |
POST /api/admin/feedback/bulk | Bulk approve, reject, status, priority, visibility, type, assign, tag, trash, restore. |
POST /api/admin/feedback/:id/merge | Merge a duplicate into the original. |
GET /api/admin/feedback/analytics/dashboard | Totals, funnel, top requested, the 30-day trend and recent activity. |
Composables
| Composable | Use |
|---|---|
useFeedbackItems, useFeedbackItem, useFeedbackComments | Read posts and comments. |
useRoadmapItems, useRoadmapStatuses, useChangelogEntries | Read the roadmap and changelog. |
useMyFeedbackItems, useMyFeedbackVotes | The current user's posts and votes. |
useFeedbackComposer() | Open the feedback composer (open('feature' | 'bug' | 'question')) from anywhere. |
renderChangelogHtml(markdown) | Render release notes the way the public changelog does (raw HTML in the source is escaped). |
Notifications
The module emits events that the notifications module turns into in-app messages and emails:
| Event | Who is notified |
|---|---|
feedback:submitted | Admins, for private and internal posts (support and team items). |
feedback:status-changed, feedback:responded | The post's author. |
feedback:changelog-shipped | Everyone who upvoted a post, when a release that shipped it is published. |
Admin
The feedback platform includes a complete admin for triaging feedback, running the roadmap, publishing the changelog and reading the numbers — with the three parts linked to each other.
Compare vs SaaS
Choosing the right feedback tool is critical for your product's growth. While SaaS platforms like Featurebase, Canny, or Upvoty are popular, they often come with high recurring costs and disjointed user experiences.