Free tool
Your modal, our board behind it
The board it posts to. Yours, once you have one.
Ask for an email
Optional for them, and how they hear that their idea shipped.
Styling and layout are the generated ones. The category list fills itself from your board at runtime, and submitting needs your own project — so this preview shows the modal, not a live post.
The endpoint
Two public routes, no key, CORS open. One reads the board's categories so your form can offer them; the other takes the submission.
# categories, project name, accent — cached 60s
GET https://feedfa.st/api/widget/your-project
# the submission
POST https://feedfa.st/api/widget/your-project/feedback
{
"title": "Slack integration for alerts",
"body": "Would rather not watch email.",
"categoryId": "…", // from the GET above
"authorEmail": "[email protected]" // optional
}A success comes back as { ok: true, postId, url }, a rejection as { ok: false, error } with a sentence you can show the person as-is.
What it enforces
The endpoint is public, so it defends itself. Worth knowing before you wonder why a submission bounced:
- Your domain only. The project's website is the one place its widget may post from, subdomains included; anywhere else gets a 403, so this modal works on your site and not on a copy of it. Loopback origins are the exception, for local development.
- Ten submissions a minute per IP, and a link limit, and the honeypot field the generated form already includes. Leave it in.
- The category must be the project's. Read them from the GET rather than hardcoding an id, and adding a category on the board adds it to your form.
localhost and 127.0.0.1 are always allowed, so you can build against your real board from your dev server without changing anything. A page on the open internet cannot claim to be localhost — the browser decides what Origin says — so this costs nothing and saves you a round trip.Or just use ours
This is the long way round, and it is the right one only if the design matters more than the maintenance. Our modal is one script tag and one attribute, and it already handles identity, prefilling from an error page, categories, spam and every browser you would rather not think about.
<script src="https://feedfa.st/embed.js" data-project="your-project" defer></script>
<button data-feedfast="feedback">Send feedback</button>Fifteen button designs for that route, and the docs for everything it can do.
The modal is yours. The board is free.
One project, unlimited feedback, votes and comments on the free plan — and the API this posts to needs no key.