
Company News
Free Business Plan Upgrades for Open Source Maintainers
Open source maintainers are under more pressure than ever. We're raising our open source program from the Team plan to the Business plan, free.
@insforge/react
Advanced tools
Framework-agnostic React authentication UI components for Insforge - reusable across all frameworks
Framework-agnostic authentication solution for React applications. Production-ready components with full business logic included.
✨ CSS-in-JS: All components now use Emotion CSS-in-JS for zero FOUC in SSR environments. No CSS imports needed!
✅ Framework Agnostic - Works with any React setup (Vite, CRA, or no bundler)
✅ Zero Router Dependencies - Built-in navigation abstraction works with any routing solution
✅ Route Protection - Built-in RouteGuard for vanilla React apps
✅ Production Ready - Complete auth flows with business logic included
✅ Full TypeScript - Complete type safety out of the box
Get authentication working in your React app in 5 minutes.
npm install @insforge/react
# or
yarn add @insforge/react
# or
pnpm add @insforge/react
# .env
VITE_INSFORGE_BASE_URL=https://your-project.insforge.app/
Wrap your app with InsforgeProvider:
// src/main.tsx (Vite) or src/index.tsx (CRA)
import { StrictMode } from 'react';
import { createRoot } from 'react-dom/client';
import { InsforgeProvider } from '@insforge/react';
import App from './App';
createRoot(document.getElementById('root')!).render(
<StrictMode>
<InsforgeProvider baseUrl={import.meta.env.VITE_INSFORGE_BASE_URL}>
<App />
</InsforgeProvider>
</StrictMode>
);
Now you can use authentication components and hooks anywhere in your app:
// src/App.tsx
import { SignInButton, SignUpButton, SignedIn, SignedOut, UserButton } from '@insforge/react';
export default function App() {
return (
<div>
<SignedOut>
<SignInButton />
<SignUpButton />
</SignedOut>
<SignedIn>
<nav>
<UserButton />
</nav>
<h1>Welcome to your dashboard!</h1>
</SignedIn>
</div>
);
}
That's it! 🎉 Your app is now protected with authentication.
Use complete auth flows with built-in UI and logic:
import { SignIn, SignUp, ForgotPassword, ResetPassword } from '@insforge/react';
// In your app
<SignIn /> // Complete sign-in flow
<SignUp /> // Complete sign-up flow with email verification
<ForgotPassword /> // Password reset request + verification
<ResetPassword /> // Reset password with token (from URL params)
Use UI components and add your own logic:
import { SignInForm, useAuth } from '@insforge/react';
import { useState } from 'react';
function CustomSignIn() {
const { signIn } = useAuth();
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const [error, setError] = useState('');
const [loading, setLoading] = useState(false);
const handleSubmit = async (e) => {
e.preventDefault();
setLoading(true);
const result = await signIn(email, password);
if ('error' in result) {
setError(result.error);
}
setLoading(false);
};
return (
<SignInForm
email={email}
password={password}
onEmailChange={setEmail}
onPasswordChange={setPassword}
onSubmit={handleSubmit}
error={error}
loading={loading}
/>
);
}
Build completely custom UI using authentication hooks:
import { useAuth } from '@insforge/react';
function CustomAuthForm() {
const { signIn, signUp, isLoaded } = useAuth();
const handleLogin = async (email: string, password: string) => {
const result = await signIn(email, password);
if ('error' in result) {
console.error(result.error);
} else {
console.log('Signed in!');
}
};
return <form>...your custom UI...</form>;
}
Pre-built with Business Logic:
<SignIn /> - Complete sign-in with email/password & OAuth<SignUp /> - Registration with password validation & email verification<ForgotPassword /> - Request password reset with email validation<ResetPassword /> - Reset password with token validation<VerifyEmail /> - Verify email with automatic token handling<UserButton /> - User dropdown with sign-out<RouteGuard /> - NEW: App-level route protection for vanilla React<Protect /> - Component-level protection wrapper<SignedIn> / <SignedOut> - Conditional renderingForm Components (Pure UI):
<SignInForm /> - Sign-in UI without logic<SignUpForm /> - Sign-up UI without logic<ForgotPasswordForm /> - Password reset request UI<ResetPasswordForm /> - Password reset with token UI<VerifyEmailStatus /> - Email verification status UIAtomic Components (14 total):
<AuthContainer />, <AuthHeader />, <AuthFormField />, <AuthPasswordField />, <AuthEmailVerificationStep />, etc.// Authentication state and methods
const {
signIn,
signUp,
signOut,
isSignedIn,
isLoaded,
baseUrl, // From provider
afterSignInUrl, // From provider
} = useAuth();
// Or use useInsforge (same as useAuth)
const context = useInsforge();
// User information
const { user, updateUser, isLoaded } = useUser();
// Public auth configuration (OAuth providers, password requirements, etc.)
const { oauthProviders, authConfig, isLoaded } = usePublicAuthConfig();
All components support full text customization:
<SignIn
title="Welcome Back!"
subtitle="We're happy to see you again"
emailLabel="Your Email Address"
emailPlaceholder="you@company.com"
passwordLabel="Your Password"
submitButtonText="Login Now"
loadingButtonText="Signing you in..."
signUpText="New to our platform?"
signUpLinkText="Create an account"
dividerText="or continue with"
/>
<ForgotPassword
title="Reset Your Password"
subtitle="Enter your email to receive a reset code"
emailLabel="Email Address"
submitButtonText="Send Reset Code"
backToSignInText="Remember your password?"
successTitle="Check Your Email"
successMessage="We've sent a reset code to your inbox"
/>
Control what users see based on auth state:
import { SignedIn, SignedOut, Protect } from '@insforge/react';
function App() {
return (
<>
<SignedOut>
<SignIn />
</SignedOut>
<SignedIn>
<Dashboard />
</SignedIn>
{/* Or use Protect for specific sections */}
<Protect redirectTo="/sign-in">
<ProtectedContent />
</Protect>
</>
);
}
import {
AuthContainer,
AuthHeader,
AuthFormField,
AuthPasswordField,
AuthSubmitButton,
AuthErrorBanner,
AuthDivider,
AuthOAuthProviders,
AuthLink,
} from '@insforge/react';
function CompletelyCustomAuth() {
return (
<AuthContainer>
<AuthHeader title="Welcome to MyApp" subtitle="Sign in to continue" />
<AuthErrorBanner error={error} />
<form onSubmit={handleSubmit}>
<AuthFormField
id="email"
type="email"
label="Email"
value={email}
onChange={(e) => setEmail(e.target.value)}
/>
<AuthPasswordField
id="password"
label="Password"
value={password}
onChange={(e) => setPassword(e.target.value)}
authConfig={config}
showStrengthIndicator
/>
<AuthSubmitButton isLoading={loading}>Sign In</AuthSubmitButton>
</form>
<AuthDivider text="or" />
<AuthOAuthProviders
providers={['google', 'github', 'discord']}
onClick={handleOAuth}
loading={oauthLoading}
/>
<AuthLink text="Don't have an account?" linkText="Sign up" href="/sign-up" />
</AuthContainer>
);
}
Protect specific content or sections:
import { Protect } from '@insforge/react';
function Dashboard() {
return (
<div>
<h1>Dashboard</h1>
{/* Simple protection - shows nothing if not signed in */}
<Protect>
<UserContent />
</Protect>
{/* With redirect */}
<Protect redirectTo="/sign-in">
<UserContent />
</Protect>
{/* Custom condition - e.g., role-based */}
<Protect condition={(user) => user.email.endsWith('@admin.com')} redirectTo="/unauthorized">
<AdminPanel />
</Protect>
</div>
);
}
Note:
<Protect>is for component-level conditional rendering. For app-level route protection, use<RouteGuard>
RouteGuard provides app-level authentication protection without requiring any routing library.
Redirects to your deployed Insforge Auth pages:
import { InsforgeProvider, RouteGuard } from '@insforge/react';
createRoot(document.getElementById('root')!).render(
<InsforgeProvider baseUrl={import.meta.env.VITE_INSFORGE_BASE_URL} afterSignInUrl="/dashboard">
<RouteGuard
builtInAuth
publicRoutes={['/', '/about', '/pricing']}
loadingFallback={<div>Loading...</div>}
>
<App />
</RouteGuard>
</InsforgeProvider>
);
Behavior:
/sign-in → Redirects to baseUrl/auth/sign-in/sign-up → Redirects to baseUrl/auth/sign-up/dashboard (protected) → Redirects to baseUrl/auth/sign-in/ (public) → ✅ Renders normallyUse @insforge/react components in your own app:
import { InsforgeProvider, RouteGuard, SignIn, SignUp } from '@insforge/react';
// Simple hash-based routing
function App() {
const path = window.location.hash.slice(1) || '/';
return (
<>
{path === '/login' && <SignIn />}
{path === '/register' && <SignUp />}
{path === '/dashboard' && <Dashboard />}
{path === '/' && <HomePage />}
</>
);
}
createRoot(document.getElementById('root')!).render(
<InsforgeProvider baseUrl={import.meta.env.VITE_INSFORGE_BASE_URL}>
<RouteGuard
builtInAuth={false}
publicRoutes={['/login', '/register', '/forgot-password', '/']}
paths={{ signIn: '/login', signUp: '/register' }}
loadingFallback={<div>Loading...</div>}
>
<App />
</RouteGuard>
</InsforgeProvider>
);
Behavior:
/login → ✅ Renders <SignIn /> (in publicRoutes)/dashboard (protected) → Redirects to /login?redirect=/dashboard/dashboard| Prop | Type | Required | Default | Description |
|---|---|---|---|---|
builtInAuth | boolean | No | true | Use external auth pages (true) or custom pages (false) |
publicRoutes | string[] | No | [] | Routes accessible without authentication |
paths | object | No | { signIn: '/sign-in', ... } | Custom auth page paths (when builtInAuth=false) |
paths.signIn | string | No | '/sign-in' | Custom sign-in page path |
paths.signUp | string | No | '/sign-up' | Custom sign-up page path |
paths.forgotPassword | string | No | '/forgot-password' | Custom forgot password page path |
loadingFallback | ReactNode | Yes | - | Loading UI displayed while checking authentication |
Public Routes with Wildcards:
<RouteGuard
publicRoutes={[
'/', // Home page
'/about', // About page
'/blog/*', // All blog routes
'/docs/*', // All documentation routes
]}
>
<App />
</RouteGuard>
Note: When
builtInAuth=true, auth paths (/sign-in,/sign-up,/forgot-password) are automatically redirected. Don't include them inpublicRoutes.
For React Router apps, use the dedicated adapter:
npm install @insforge/react-router
import { InsforgeProvider } from '@insforge/react-router';
import { getInsforgeRoutes } from '@insforge/react-router/router';
import { createBrowserRouter, RouterProvider } from 'react-router-dom';
const router = createBrowserRouter([
{ path: '/', element: <Home /> },
{ path: '/dashboard', element: <Dashboard /> },
...getInsforgeRoutes({
baseUrl: import.meta.env.VITE_INSFORGE_BASE_URL,
builtInAuth: true,
}),
]);
function App() {
return (
<InsforgeProvider baseUrl={import.meta.env.VITE_INSFORGE_BASE_URL}>
<RouterProvider router={router} />
</InsforgeProvider>
);
}
Features:
Link and useSearchParams integrationDocs: @insforge/react-router
For Next.js App Router with SSR:
npm install @insforge/nextjs
// app/layout.tsx
import { InsforgeProvider } from '@insforge/nextjs';
export default function RootLayout({ children }) {
return (
<html>
<body>
<InsforgeProvider baseUrl={process.env.NEXT_PUBLIC_INSFORGE_BASE_URL}>
{children}
</InsforgeProvider>
</body>
</html>
);
}
Features:
Link and useSearchParams integrationDocs: @insforge/nextjs
Built-in support for 10+ OAuth providers:
Providers are auto-detected from your backend configuration.
Low-level building blocks for complete customization:
<AuthBranding /> - Insforge branding footer<AuthContainer /> - Main container wrapper<AuthHeader /> - Title and subtitle display<AuthErrorBanner /> - Error message display<AuthFormField /> - Standard input field<AuthPasswordField /> - Password input with features<AuthPasswordStrengthIndicator /> - Password checklist<AuthSubmitButton /> - Submit button with states<AuthLink /> - Call-to-action link<AuthDivider /> - Visual separator<AuthOAuthButton /> - Single OAuth provider button<AuthOAuthProviders /> - Smart OAuth grid<AuthVerificationCodeInput /> - 6-digit OTP input<AuthEmailVerificationStep /> - Email verification step with countdown and resendThe root provider component that manages authentication state.
Props:
| Prop | Type | Required | Default | Description |
|---|---|---|---|---|
baseUrl | string | Yes | - | Your Insforge backend URL |
afterSignInUrl | string | No | '/' | Redirect URL after successful sign-in |
onAuthChange | (user: InsforgeUser | null) => void | No | - | Callback when auth state changes |
onSignIn | (authToken: string) => Promise<void> | No | - | Custom handler after sign-in (e.g., cookie sync) |
onSignOut | () => Promise<void> | No | - | Custom handler after sign-out (e.g., clear cookies) |
Example:
<InsforgeProvider
baseUrl={import.meta.env.VITE_INSFORGE_BASE_URL}
afterSignInUrl="/dashboard"
onAuthChange={(user) => {
console.log('Auth changed:', user);
}}
>
{children}
</InsforgeProvider>
App-level route protection for vanilla React apps (no router library needed).
See Route Protection (Detailed) for full documentation.
Quick Props:
builtInAuth (default: true) - Use external auth or custom pagespublicRoutes - Array of paths accessible without authpaths - Custom auth page paths (when builtInAuth=false)loadingFallback (required) - Loading UIPrimary hook for authentication. Both are aliases for the same hook.
Returns:
{
// Auth state
user: InsforgeUser | null;
isLoaded: boolean;
isSignedIn: boolean;
// Auth methods
signIn: (email: string, password: string) => Promise<...>;
signUp: (email: string, password: string) => Promise<...>;
signOut: () => Promise<void>;
updateUser: (data: Partial<InsforgeUser>) => Promise<...>;
reloadAuth: () => Promise<...>;
// Email verification
resendVerificationEmail: (email: string) => Promise<...>;
verifyEmail: (otp: string, email?: string) => Promise<...>;
// Password reset
sendResetPasswordEmail: (email: string) => Promise<...>;
resetPassword: (token: string, newPassword: string) => Promise<...>;
exchangeResetPasswordToken: (email: string, code: string) => Promise<...>;
// OAuth
loginWithOAuth: (provider: OAuthProvider, redirectTo: string) => Promise<void>;
// Config (from provider)
baseUrl: string;
afterSignInUrl: string;
// Public config
getPublicAuthConfig: () => Promise<...>;
}
Simplified hook for user data only.
Returns:
{
user: InsforgeUser | null;
isLoaded: boolean;
}
Hook for fetching public auth configuration (OAuth providers, password requirements, etc.).
Returns:
{
oauthProviders: OAuthProviderConfig[];
authConfig: AuthConfig;
isLoaded: boolean;
}
MIT © Insforge
FAQs
Framework-agnostic React authentication UI components for Insforge - reusable across all frameworks
The npm package @insforge/react receives a total of 298 weekly downloads. As such, @insforge/react popularity was classified as not popular.
We found that @insforge/react demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Company News
Open source maintainers are under more pressure than ever. We're raising our open source program from the Team plan to the Business plan, free.

Security News
The supply chain control that delays freshly published gems now covers lockfile generation and gem vendoring in Ruby projects.

Security News
During a UK cyber test, a Mythos 5 agent used sockpuppets, social engineering, and prompt injection to try to get a maintainer to merge malware.