A contact form with somewhere to put the answers.
Most contact forms mail one person and stop. The message lands in an individual’s inbox, the reply goes out from an individual’s address, and nobody else on the project ever sees either. A Kontacts form writes into the project’s shared inbox instead — same place as the mail, same thread view, same people.
Three ways to put a form on the internet, no backend for any of them
Every form gets a hosted page at its own URL. Send somebody that link and you are done — it renders on its own, on any device, with nothing to deploy. If you would rather it sat inside your own site, the same page drops in as an <iframe>, and the settings screen hands you the snippet with the URL already filled in.
And if you want your own markup, point a plain <form action=… method=“POST”> at the endpoint. It accepts an ordinary browser form post as readily as JSON, so a static site with no JavaScript at all can use it. Three routes, one form behind them, one place the answers arrive.
Build the form, not the form builder
A new form starts with the three fields every contact form has — Name, Email and Message — and you edit from there. Nine field types are available: short and long text, email, phone, a number, a date, single-choice and multiple-choice, and a hidden field for the campaign or page identifier you want carried along with the answer. Up to forty fields on one form, and as many separately named forms per project as you need, so “Report a bug” and “Book a demo” do not have to be the same questionnaire.
There are no file uploads. The field types above are the whole set, and none of them takes an attachment — a form here collects answers, not documents.
What happens to a submission
It becomes an entry in the project inbox, marked as having come from a form and carrying every field exactly as it was filled in. It sits beside the email, under the same labels, in front of the same team.
It arrives held. A form submission carries no sender authentication of its own — nobody signed it, and there is no sending domain to check it against — so it is held exactly as mail failing SPF, DKIM or DMARC is, and shown under the Quarantined label with the reason named. That hold is not the inbox’s address rules at work. Which addresses may open a GitHub issue is a list you write, and the optional catch-all counts every address as declared; neither decides anything about a form. A submission is held on arrival either way.
Releasing it is what changes that, and it is one click by anyone on the project. Release clears the hold. Where the project has a repository linked, that same click also opens a GitHub issue carrying the whole message. Read it before you click: the body goes to GitHub as the submitter wrote it. With no repository linked, release simply clears the hold and publishes nothing.
Replying waits for the same click — a held message has no reply box, on purpose. Once released, you answer it from the project address like anything else in the inbox.
What else a submission sets off
If the form has an email-typed field, whoever filled it in is added to the project’s contacts, so the next time they write you already know who they are. If you have a webhook endpoint configured, a form.submitted event fires — a different event from an inbound email, so your handler can tell the two apart.
Two notifications are available and both start switched off: an alert to the project’s owners and admins when a submission arrives, and a confirmation back to the person who filled the form in. Turn on whichever you want. Neither is on by default, because a form endpoint that starts mailing people the moment you create it is a bad surprise.
Spam, without making a human prove they are one
There is no CAPTCHA and nothing for a visitor to click. A hidden field no real person can fill catches the bots that fill everything; a submission completed in under three seconds is treated as automation rather than typing; and one form accepts at most ten submissions an hour from any one address, which is generous for a human and useless for a flood.
Bodies over 64 KB are refused outright. A repeated submission carrying the same idempotency key is recognised as the retry it is rather than stored twice. And if you only want the form answered from your own site, give it a list of origins and anything posting from elsewhere is dropped.
What a caught submission gets back is an ordinary success response. Telling a spammer which of these tripped is telling them what to change.
What a Kontacts form is not
It is not a survey tool. There is no branching logic, no scoring, no payment step and no file upload; the nine field types above are all of it. It is not a standalone product either — the whole point is that the answers land where the project’s mail already lands.
And there is no bulk release. Submissions are released one at a time, deliberately, because release can put a stranger’s words into a public repository and that is not an action to perform on fifty things you have not read.
What it costs
Signing up puts you on Free, with no card. Forms are not separately metered and no plan caps how many you create; what a plan limits is the organisation around them — how many projects it may hold, how many people, and how much mail it sends. Nobody is converted into a paid plan by silence.