A feature request widget that is only a form is a hole you drop things into. Somebody writes an idea, presses send, and never finds out whether anybody read it or whether four other people had already asked for the same thing.
This widget shows the board instead. A visitor sees what has already been suggested, votes on the ones they agree with, and only writes something new when nothing there matches.
What does the visitor see?
The full feedback board, drawn inside your page with VoteFirst.board: the cards, the vote counts, and a control to add to any of them.
Twenty cards load per column and a button at the foot of each one fetches the next twenty, so a column holding four hundred requests does not arrive as four hundred cards.
If a visitor wants to write something new, VoteFirst.suggest opens a form over the page rather than sending them anywhere else, so they never leave the thing they were doing.
How can a visitor order the board?
Seven ways: the order you arranged yourself, top (the weighted score), votes (the plain headcount), newest, oldest, most discussed, or trending, which counts only the votes cast in the last seven days. Whatever the sort, anything you have pinned comes first. Search matches the heading and the description together, and tag filtering works alongside it.
Does the visitor need an account?
No. The first time a signed out visitor votes, comments or suggests something, an anonymous identity is minted and kept in their browser's own local storage. No cookies are used and no credentials are sent. The identity is signed and bound to your project, so it cannot be reused on a different board.
If you want your own signed in users to appear as themselves, signing them in with a token is on the PRO plan.
What happens to a new suggestion?
It is held for review and does not appear on the board until you approve it. That is true of every route into the product, including this widget. A comment is public the moment it is posted.
When a suggestion arrives, the project owner is emailed, once a day at most: a hundred suggestions on one Monday is still one email, not a hundred.
What is the line you paste?
<link rel="stylesheet" href="https://app.votefirst.app/embed/votefirst.css">
<script src="https://app.votefirst.app/embed/votefirst.js"></script>
<script>
VoteFirst.init({ project: 'your-project-slug', key: 'your-embed-key' });
VoteFirst.board('#votefirst-board', { board: 'ideas' });
</script>
<div id="votefirst-board"></div>
The board option is the slug of the board you want drawn. Every widget the script can draw is documented with its exact call, and the options each one accepts are listed with the events they emit. Calls made before the script has loaded queue rather than fail.
What does it cost?
Nothing beyond your plan. No widget is held back for the higher plan, so this feature request widget runs on the nine dollar plan the same as on the thirty nine dollar one. 14 days, a card at signup, then $9 or $39 a month.
What it cannot do
It cannot show a board that is not public. There is no private board at any price, so a widget on an internal page still draws something anybody holding the public key can read.
Can I stop it loading on somebody else's domain?
Yes. The origin allowlist names which origins may use your public key, with exact matching or a subdomain wildcard that deliberately leaves out the bare domain. An empty list allows every origin, which is what makes the widget work the moment you paste it in.
Which widget is this, exactly?
This page describes two of the nine things the embed can draw together: the board, and the suggestion form modal that opens from it, because in practice nobody uses one without the other.
If what you want is a single form with no board behind it, for a checkout flow or an onboarding step where showing a board would be the wrong move, that is the suggestion form on its own.