Product
Customer feedback board
A feedback board as one small app: coworkers or customers submit ideas, upvote the ones they want, and you triage by status. Shared workspace-wide or public.
Product feedback comes at you from ten directions and lands nowhere. A sticky note in a doc. A Slack message that scrolls away. A line in a sales call recap nobody reads. So the same three requests keep arriving as if new, you have no idea which one twenty people want and which one is a single loud voice, and "we hear you" is a thing you say instead of a thing you can show.
A feedback board fixes this, and every SaaS feedback tool wants a subscription and a per-seat price to run one. It is a classic small app: submit, upvote, triage. The reason you never built your own is that it needed auth, a database, and a way to share it with the right audience. That is the part fuast already did.
What it is on fuast
One capsule. People submit ideas, upvote the ones they care about (one vote each, because the app knows who they are), and you move each idea through a status like "under review", "planned", or "shipped". Because fuast lets you share like a doc, the same app can be workspace-only for internal feedback or public for your customers, just by changing its visibility. No new tool, no new login for anyone.
Steal this prompt
Paste this to your AI. It writes the capsule; you run fuast deploy.
Build a customer feedback board capsule on fuast. Signed-in people submit an idea with a title and description. Anyone can upvote an idea, but only once per person, enforced by their verified identity. Ideas have a status: "open", "under review", "planned", or "shipped"; only the owner can change it. Sort the board by vote count. Use built-in auth, read the voter from ctx.auth, and re-check ownership on the server before any status change. I will share it public for customers.
What makes it real
"One vote per person" is only enforceable because the app sees a verified voter. The
capsule stores a vote against ctx.auth.userId and checks for an existing one, using
built-in auth rather than trusting the browser. The
same identity is what lets you flip the board between a private
workspace tool and a public customer-facing one without
rebuilding anything. Deploy it, then run
fuast share <slug> --visibility public when you are ready for customers.
import { capsule, table, string, text, number, mutation } from "fuast/server";
export default capsule({
schema: {
ideas: table({ title: string(), body: text(), status: string(), votes: number() }),
votes: table({ ideaId: string(), voterId: string() }).index("by_idea_voter", ["ideaId", "voterId"]),
},
mutations: {
upvote: mutation(async (ctx, ideaId: string) => {
if (ctx.auth.isGuest) throw new Error("sign in first");
const existing = await ctx.db.votes.withIndex("by_idea_voter", (q) => q.eq("ideaId", ideaId).eq("voterId", ctx.auth.userId)).first();
if (existing) return;
await ctx.db.votes.insert({ ideaId, voterId: ctx.auth.userId });
const idea = await ctx.db.ideas.get(ideaId);
if (idea) await ctx.db.ideas.update(ideaId, { votes: idea.votes + 1 });
}),
},
});
One capsule: submit, vote, triage, shared with exactly the audience you choose. Stop losing feedback to ten inboxes. Build your board on fuast.