Feedback Technical Details

How the Feedback Platform is built — the modules, data model, links between feedback, roadmap and changelog, endpoints and notifications — for developers working on it after deployment.

Building Blocks

The platform is two packages on top of nuxt-auto-api:

PackageWhat it adds
@websideproject/module-auto-feedbackThe database tables, their access rules, the admin pages under /admin/feedback, and the custom endpoints (voting, publishing, analytics).
@websideproject/layer-auto-feedbackThe 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:

nuxt.config.ts
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

TableHolds
feedback_itemsPosts: 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_commentsOne vote per user per post; threaded comments with approval.
feedback_categories / feedback_statusesThe boards and the feedback lifecycle.
feedback_roadmap_items / feedback_roadmap_statusesRoadmap items with target version and quarter, dates, progress, milestones and tags.
feedback_changelog_entriesRelease 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.

Each link has one owner — the other side is derived for display, so the two can never disagree:

LinkStored onEdited in
Feedback → roadmap itemfeedback_items.roadmap_item_idInbox → triage panel → Roadmap item
Roadmap item → changelog entriesfeedback_roadmap_items.changelog_entriesRoadmap → item → Changelog entries
Changelog entry → shipped feedbackfeedback_changelog_entries.feedback_itemsChangelog → 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 internal posts; 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:

EndpointPurpose
POST /api/feedback/voteUpvote/downvote; voting again removes the vote. Keeps the post's counters in step.
GET /api/feedback/my-votesWhich posts the current visitor has upvoted (drives the filled heart).
GET /api/feedback/myThe current user's own posts, in every state.
POST /api/admin/feedback/changelog/:id/publishPublish now, or publish with a future release date; saves the shipped feedback and notifies its upvoters.
POST /api/admin/feedback/bulkBulk approve, reject, status, priority, visibility, type, assign, tag, trash, restore.
POST /api/admin/feedback/:id/mergeMerge a duplicate into the original.
GET /api/admin/feedback/analytics/dashboardTotals, funnel, top requested, the 30-day trend and recent activity.

Composables

ComposableUse
useFeedbackItems, useFeedbackItem, useFeedbackCommentsRead posts and comments.
useRoadmapItems, useRoadmapStatuses, useChangelogEntriesRead the roadmap and changelog.
useMyFeedbackItems, useMyFeedbackVotesThe 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:

EventWho is notified
feedback:submittedAdmins, for private and internal posts (support and team items).
feedback:status-changed, feedback:respondedThe post's author.
feedback:changelog-shippedEveryone who upvoted a post, when a release that shipped it is published.

Need a Landing Page?

Modern landing pages with optional modules (blog, docs, forms, i18n). Let's discuss your project.

Build Your MVP

Full-stack SaaS development. Expert in database design, multi-tenancy, and scalable architecture.

Deployment Help

Dockerize your backend, set up CI/CD pipelines, deploy to Cloudflare or Hetzner. Early-stage setup.

Suggest a SaaS Tool

Missing a calculator or tool? Suggest what you'd like to see on our site.