A public feedback board: users post ideas, vote on each other's, and follow a roadmap showing what is planned, in progress and shipped.
Build me a public feedback board that replaces Canny: users post ideas, vote on them, and watch what happens to the ones that win. STACK - Node 20+ with Fastify, server-rendered HTML, a little vanilla JavaScript - SQLite through better-sqlite3, WAL mode, one file - Caddy in front for TLS and static files - One process, one small VPS, no queue and no cache layer THE DATA MODEL - boards: id, slug, name, description, is_private, created_at - posts: id, board_id, title, body, status, author_id, created_at, edited_at, merged_into_id, pinned - votes: id, post_id, user_id, weight, created_at — unique on (post_id, user_id) - comments: id, post_id, user_id, body, created_at, is_internal, parent_id - users: id, email, name, avatar_url, role, company, mrr, created_at - status_changes: id, post_id, from_status, to_status, note, changed_by, created_at - subscriptions: id, post_id, user_id — who hears when a post moves - Statuses are open, under review, planned, in progress, complete, closed. Store the key, never the label VOTING, WHICH IS THE POINT - One vote per person per post, and a vote can be withdrawn - Weight is a column because a vote from a customer paying you 500 a month is not the same signal as one from a stranger. Default 1; the admin can set weight per user or per company - Show both numbers: the raw count and the weighted one, labelled. Never blend them into one figure - Sort by votes, by recent activity, by trending — trending is votes in the last 14 days over the age of the post, and the formula is in a comment because somebody will ask - Never let an admin vote silently: an admin vote is a vote with a badge POSTING AND DUPLICATES - A new post searches as you type and shows near-matches before the submit button, because half the value of a board is not having the same idea forty times - Merge: an admin merges post B into post A, votes and subscribers move across, B redirects to A forever and says it was merged - Edit history kept, not overwritten - Rate limit per user and per IP hash, with a friendly refusal rather than a silent drop MODERATION AND ADMIN - Roles: admin, member, guest. Guests can vote and comment only if the board allows it - Private boards behind login; public boards readable by anyone, with posting optional - Internal comments visible only to admins, on the same thread as the public ones and clearly marked - Bulk actions: change status, tag, merge, delete spam - A changelog view generated from posts that reached complete, with the date they got there TELLING PEOPLE WHAT HAPPENED - Anybody who voted or commented is subscribed to that post by default, with one click to stop - A status change sends one email, with the admin's note if there is one - A weekly digest per board, off by default - Every email carries an unsubscribe link that works without logging in, signed with a secret THE ROADMAP - Three columns — planned, in progress, complete — fed from post status, drag to move if you are an admin - Each card shows title, votes, and the number of comments - A public URL that can be embedded in an iframe, and a JSON feed of the same thing IDENTIFYING WHO IS ASKING - Single sign-on from your own app: a signed token in the URL creates or matches a user, so customers do not make a second account - Store company and monthly value against a user when the token carries them, and let the board be filtered by both - Nothing about a user is public except their name and avatar THE INTERFACE - Two columns on desktop, one on a phone: the list, and the post being read - The vote control is the biggest thing on a row and works without a page load - Search covers titles, bodies and comments - Dark and light, one accent colour, no modal dialogs for anything that could be a page OPERATIONS - .env: DATABASE_PATH, SESSION_SECRET, SSO_SECRET, SMTP_URL, BASE_URL - Migrations applied on boot, each once, recorded in a table - Nightly backup: VACUUM INTO, gzip, off-server upload, plus a restore script that has been run at least once - Structured logs, and a health endpoint that touches the database WHAT MATTERS MOST The board lives or dies on whether the votes mean anything. Build posting, voting and duplicate-merging first and prove them with a hundred posts and a thousand votes; the roadmap and the emails can wait a week. An admin who cannot trust the ranking will stop looking at it, and a board nobody looks at is a board nobody posts on. Give me the repository, the migrations, a seed script with a demo board, the .env.example, and a README with deploy steps for a fresh Ubuntu VPS behind Caddy.
What you lose
- Votes weighted by account value, so the loudest customer is not automatically the most important one
- Deduplication of near-identical requests, which is most of the work on a busy board
- Automatic notification of everyone who voted when a request ships
If you would rather not build
- GitHub Discussions, which is free and already there
What it costs
read from their page 15 Aug 2026
| Plan | Billed monthly | Billed yearly | Last read |
|---|---|---|---|
| Pro | $79/mo | — | 15 Aug 2026 |
Their pricing page is where these came from. Seeing a different price? Tell us.
The escape hatch
open source · no votes, no paid placement
Why this verdict
our own opinion · changed only by a person
76/100
Verdict yes at 76. The board is easy; deduplication and the merge that keeps old URLs alive are what make it survive a year of use.
History
tracked since 10 Aug 2026 · nothing is ever overwritten
Questions about Canny
answered from the record above
Is Canny free?
No — the plan we track is $79 a month. Starter from around $79/month billed monthly, cheaper annually.
Can you replace Canny by building your own?
YES. Replaceable in one session with an AI coding agent. Replacement score 76 out of 100, build time one session. Read what you lose before you decide.
How much does Canny cost?
$79 a month on Starter — $948 a year. Recorded 10 Aug 2026.
What do you lose by replacing Canny?
Votes weighted by account value, so the loudest customer is not automatically the most important one; Deduplication of near-identical requests, which is most of the work on a busy board; Automatic notification of everyone who voted when a request ships. If any of those carry weight for you, keep paying.
Is there an open-source alternative to Canny?
Yes: Fider, Astuto. The prompt on this page is for when you want it your way instead.
Related entries
same category first, most replaced first
Every week, something stops being worth paying for.
New verdicts, prices that moved, entries added. One email a week. Unsubscribe in one click. Nothing is being sent yet — your address is kept here, and the first issue is the first thing it is used for.
free forever · no tracking pixel · stored here, never passed to anyone

