Skip to main content
All notable changes to React Turnstile are documented here. The project follows Semantic Versioning.

Latest Releases

v1.4.2 - 2025-03-10

Fixed
  • Fixed feedbackEnabled option that could not be set to false (#120)
Security
  • Patched security vulnerabilities in dependencies:
    • minimatch: Fixed ReDoS vulnerability
    • rollup: Fixed path traversal vulnerability
    • ajv: Fixed ReDoS vulnerability
  • Total of 8 security vulnerabilities resolved (7 high, 1 moderate)
Dependencies
  • Updated minimatch to ^9.0.7 (via @typescript-eslint/typescript-estree)
  • Updated minimatch to ^3.1.4 (via eslint)
  • Updated rollup to ^4.59.0 (via tsup)
  • Updated ajv to ^6.14.0 (via eslint)

v1.4.1 - 2025-02

Fixed
  • Prevented race condition when loading Turnstile script (#118, #116)
    • Widget now polls for window.turnstile to handle:
      • Script manually injected without ?onload= callback parameter
      • Script executes before onload callback is registered (race condition)
Documentation
  • Added support for Bun package manager in getting started guide (#117)

v1.4.0 - 2025-01

Maintenance
  • Updated dependencies to latest versions
  • Updated CI configurations
  • Updated ESLint config
  • Updated Prettier config
  • Updated .gitignore

v1.3.1 - 2024

Fixed
  • Fixed getResponsePromise return type to correctly exclude undefined (#111)
Maintenance
  • Include README in npm package publication

v1.3.0 - 2024

Added
  • Added rerenderOnCallbackChange prop to fix stale callback closures (#108, #107)
    • When false (default): Callbacks are stable and don’t cause re-renders
    • When true: Widget re-renders when callback props change
    • Fixes issue where callbacks captured stale values from parent component closures
Usage:
const handleSuccess = useCallback((token) => {
  console.log('Success:', token)
}, [])

<Turnstile
  rerenderOnCallbackChange={true}
  onSuccess={handleSuccess}
/>

v1.2.0 - 2024

Fixed
  • Added missing dependencies to renderConfig useMemo dependencies array (#105)
    • Widget now properly re-renders when options change

v1.1.0 - 2024

Added
  • Support for React 19 (#94)
Dependencies
  • Updated peer dependencies to allow React 19:
    {
      "react": "^17.0.2 || ^18.0.0 || ^19.0",
      "react-dom": "^17.0.2 || ^18.0.0 || ^19.0"
    }
    

v1.0.2 - 2024

Fixed
  • Added default exports for better compatibility (#89, #88)
    • Fixes Jest test failures
    • Both named and default imports now work correctly

v1.0.1 - 2024

Fixed
  • Fixed 'use client' directive that was not being output in the build (#86)
    • Ensures proper client-side rendering in Next.js App Router

v1.0.0 - 2024

Breaking Changes
  • ESM Only: Library now ships only ESM code, CommonJS removed
  • Peer Dependencies: Updated minimum React version to 17.0.2
  • autoResetOnExpire Removed: Use refreshExpired option instead
Migration:
// Before
<Turnstile autoResetOnExpire={false} />

// After
<Turnstile options={{ refreshExpired: 'manual' }} />
Added
  • refreshExpired option with values: 'auto' | 'manual' | 'never'
  • Better ESM compatibility with modern bundlers

Older Releases

For releases prior to v1.0.0, please refer to the GitHub Releases page.

Release Notes Format

  • Added: New features
  • Changed: Changes in existing functionality
  • Deprecated: Soon-to-be removed features
  • Removed: Removed features
  • Fixed: Bug fixes
  • Security: Security vulnerability fixes

Stay Informed

GitHub Releases

Subscribe to get notified of new releases

npm Package

View package version history

Version Support

VersionStatusSupport
1.4.x✅ CurrentFull support
1.3.x⚠️ MaintenanceSecurity fixes only
1.2.x⚠️ MaintenanceSecurity fixes only
1.1.x⚠️ MaintenanceSecurity fixes only
1.0.x⚠️ MaintenanceSecurity fixes only
< 1.0.0❌ UnsupportedUpgrade required

Contributing

Found a bug or have a feature request? Please open an issue on GitHub.

Build docs developers (and LLMs) love