Contact forms, by stack
The same endpoint works everywhere, but every stack has its own constraint: a static build with no server, a framework that wants an API route, a template engine with no JavaScript at all. One page each, with the code and the constraint.
React contact form without a form library
A three-field contact form needs one piece of state, and it is not the field values. On React 19 it needs none at all.
Next.js contact form without an API route
You do not need an API route. A Next.js contact form can post straight to an endpoint, or go through a Server Action if the request has to leave your server.
Vanilla JavaScript contact form, no build step
No framework, no bundler, no dependencies. Start with a form that already posts, then add about twenty-five lines so the visitor stays on the page.
Vue contact form with script setup
Vue keeps the submit modifier that Svelte 5 removed. Here is a contact form that uses it, without turning three fields into a state management problem.
Svelte 5 contact form after the event modifiers
Svelte 5 removed the event modifiers, so the contact form you copied from an older tutorial no longer prevents anything. Here is the runes version.
Astro contact form with no client JavaScript
Astro ships zero JavaScript by default, and a working contact form does not change that. Point the form at an endpoint and the browser handles the request.
Hugo contact form with a reusable partial
Write the form once as a partial, keep the endpoint in your config, and wrap it in a shortcode so it drops into any markdown file with its own button label.
Jekyll contact form with an include
One include, one line in _config.yml, and Liquid parameters so the same file serves a contact form and a quote form. No plugin required.
GitHub Pages contact form, no server required
GitHub Pages serves files and runs nothing. That rules out every server-side form handler, and it is why pointing the form at an endpoint is the whole solution.