All frameworks
RemixRemix

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 docs
Remix
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