Plain HTML
Plain HTML needs no integration: one attribute is the whole job.
No build step, no JavaScript, no dependency. Change the action and the form works.
Open the pageLibrary · 21 entries
The endpoint is the same everywhere. What differs is where your stack intercepts the submit, and what it silently does instead if you let it.
Every page in this section answers one question: when the button is pressed, who takes over? There are only three answers, and the failure on each stack follows from picking the wrong one.
preventDefault and posts with fetch. Needed when the result must appear inline or feed a UI state.The action URL is always the same shape, and files always need enctype="multipart/form-data". Everything else is local dialect. If a page below does not cover your exact setup, those two facts plus the endpoint reference are enough to finish the job.
Plain HTML
No build step, no JavaScript, no dependency. Change the action and the form works.
Open the pageReact
Call fetch, read the JSON, render the outcome. The endpoint is not part of your component tree.
Open the pageNext.js
A public form endpoint removes the route handler you were about to write for no reason.
Open the pageVue
@submit.prevent, FormData, one status ref. Vue needs nothing more for a form that just has to send.
Open the pageSvelte
Leave the action on the form, enhance only if you want inline text. Svelte and SvelteKit both allow that.
Open the pageAstro
Put the form in a component, point it at the endpoint, ship zero bytes of JavaScript.
Open the pagehtmx
hx-post plus hx-target replaces the whole navigation. The endpoint already returns HTML for exactly this case.
Open the pageWebflow
A Webflow form posts to Webflow by default. Changing that is a custom attribute, not a setting.
Open the pageWordPress
A form that only has to send does not need a plugin, a shortcode table, or a settings page.
Open the pageFramer
The built-in form posts to Framer. An embed or a code component is how the endpoint gets the data.
Open the pageSquarespace
A form block stores in Squarespace. A code block posts wherever you point it.
Open the pageShopify
Liquid writes the form tag. Edit the section, not the compiled page, and the endpoint takes over.
Open the pageGitHub Pages
Static files cannot receive a post. The endpoint receives it instead, and nothing else changes.
Open the pageCloudflare Pages
You can write a Function. You do not have to, and the form is more reliable if you do not.
Open the pageNetlify
Netlify Forms registers your form at build time. The endpoint needs no build at all.
Open the pageVercel
A form that posts outside your deployment cannot be broken by a deploy.
Open the pageAngular
ngSubmit, FormData from the native element, one status flag. The endpoint is not part of the component tree.
Open the pageGatsby
A plain form element in a component. Gatsby builds the page; the endpoint receives the post.
Open the pageEleventy
An include plus a data file. Eleventy renders the form once and never sees a submission.
Open the pageJekyll
An include and a config value. Jekyll renders the form once and never sees a submission.
Open the pageGitBook
A hosted docs builder is not a form builder. Ask whether the page helped, and what was missing.
Open the pageMachine-readable summary
FreelyForm works the same way in every stack: the form posts to /f/FORM_ID on the form host, and the framework either lets the browser do it or intercepts it. Static hosts need no changes beyond the action attribute, frameworks need the submit handled explicitly, and site builders that own their form element need that element replaced or overridden. Each stack page names its own failure first.
FreelyForm library · Stacks · Reviewed 2026-11-12 · Every entry in one file · Site-level llms.txt
Create a form, verify your inbox, and point your existing HTML at the endpoint. No server, no SDK, no rewrite.
POST https://freelyform.com/f/FORM_ID