All frameworks
Remix
Use NBForms with Remix
With Remix's built-in form handling, you can proxy form data directly to NBForms from your action function. No client-side JavaScript required for basic submission, no state management boilerplate — just a clean, progressively enhanced contact form.
Official Remix docsRemix
import { Form, useActionData } from '@remix-run/react'
import { redirect } from '@remix-run/node'
export async function action({ request }) {
const formData = await request.formData()
const res = await fetch('https://api.nbforms.com', { method: 'POST', body: formData })
if (res.redirected) return redirect(res.url)
const data = await res.json()
return { success: res.ok, message: data.message }
}
export default function ContactForm() {
const data = useActionData()
if (data?.success) return <p>Thanks — we'll be in touch!</p>
return (
<Form method="post">
<input type="hidden" name="_token" value="YOUR_TOKEN" />
<label>Name</label>
<input type="text" name="name" required />
<label>Email</label>
<input type="email" name="email" required />
<label>Message</label>
<textarea name="message" required />
<button type="submit">Send</button>
</Form>
)
}Why NBForms?
- Integrates with Remix actions for progressive enhancement
- Works server-side — no client JavaScript required for basic submission
- Handles redirects natively via the action function
- Clean separation of form logic from your app routes
Add to your Remix app in minutes
Free tier included. No credit card. No backend setup — just copy the snippet above and go.
Get started free