Skip to main content
Deno 2 is finally here ๐ŸŽ‰๏ธ
Learn more

React Turnstile

Cloudflare Turnstile widget

Cloudflare Turnstile integration for React.

npm version npm downloads install size bundle size powered by bundlejs.com

Features

  • ๐Ÿ•ต๏ธโ€โ™€๏ธ Privacy-first - No user tracking, no cookies, GDPR-friendly by design
  • ๐Ÿ“ฆ Lightweight - Only 6.3 KB minified
  • ๐Ÿ’ช Smart verification - Often invisible to users with minimal interaction
  • ๐Ÿ’‰ Zero config - Automatic script injection, works out of the box
  • ๐Ÿ“ Multiple widget sizes - normal, compact, flexible, invisible
  • ๐ŸŽฎ Imperative API - Control via ref: reset(), execute(), getResponse(), isExpired()
  • โšก๏ธ SSR ready - Works with Next.js, Remix, and any React SSR framework
  • ๐Ÿ’ป Full TypeScript support

๐Ÿ“– Read the docs โ†’ ย ย  ๐Ÿš€ See the demo โ†’

Getting started

  1. Follow these steps to obtain a free site key and secret key from Cloudflare.
  2. Install @marsidev/react-turnstile into your React project.
pnpm add @marsidev/react-turnstile

Usage

Basic

import { Turnstile } from '@marsidev/react-turnstile'

function Widget() {
  return <Turnstile siteKey='1x00000000000000000000AA' />
}

With form and imperative API

import { Turnstile } from '@marsidev/react-turnstile'
import type { TurnstileInstance } from '@marsidev/react-turnstile'
import { useRef } from 'react'

function LoginForm() {
  const turnstileRef = useRef<TurnstileInstance | null>(null)

  async function handleSubmit(e: FormEvent) {
    e.preventDefault()
    const token = turnstileRef.current?.getResponse()
    // Send token to your server...
    turnstileRef.current?.reset() // Reset after submission
  }

  return (
    <form onSubmit={handleSubmit}>
      <input type="email" placeholder="Email" />
      <input type="password" placeholder="Password" />
      <Turnstile
        ref={turnstileRef}
        siteKey='1x00000000000000000000AA'
      />
      <button type="submit">Login</button>
    </form>
  )
}

Contributing

Any contributions are greatly appreciated. If you have a suggestion that would make this project better, please fork the repo and create a Pull Request. You can also open an issue.

Development

  • Fork or clone this repository.
  • Install dependencies with pnpm install.
  • Run pnpm dev to start both the library (with HMR) and the Next.js demo app concurrently

For reference, the project structure is as follows:

.
โ”œโ”€โ”€ packages/lib/    # Library source code
โ”œโ”€โ”€ demos/nextjs/    # Next.js demo app
โ””โ”€โ”€ docs/            # Documentation

Support

If you find this library useful, you can buy me a coffee:

Buy Me a Coffee at ko-fi.com

Contributors

Contributors

License

Published under the MIT License.