The End-to-End Typesafe Full-stack TypeScript Framework
Built for Humans and Code Agents
Igniter.js is a modern, full-stack TypeScript framework that eliminates the friction between your backend and frontend. Define your API once, get fully-typed clients everywhereβno code generation, no manual synchronization, just pure end-to-end type safety.
Perfect for building scalable APIs, real-time applications, and modern web services.
Get up and running in seconds:
# Create a new project
npx @igniter-js/cli@latest init my-app
# Or add to existing project
npm install @igniter-js/core zod- π End-to-End Type Safety - Define once, use everywhere with full TypeScript inference
- β‘ Zero Code Generation - No build steps, no schemas to sync
- π Framework Agnostic - Works with Next.js, Express, Bun, and more
- ποΈ Built-in Features - Queues, Real-time, Caching, and Telemetry
- π€ Code Agent Optimized - Optimized for code agents and AI assistance
- π¦ Plugin System - Extensible and modular architecture
- π Official Documentation - Complete guides and API reference
- π― Getting Started - Your first Igniter.js app
- π Blog - Latest updates and tutorials
- π¨ Templates - Starter templates and examples
- π Changelog - What's new in each release
# Interactive development dashboard
npx @igniter-js/cli@latest dev
# Build your project
npm run build
# Run tests
npm test// Define your API
// features/users/controllers/users.controller.ts
export const userController = igniter.controller({
path: '/users',
actions: {
getUser: igniter.query({
path: '/:id' as const,
handler: async ({ request, response, context, query }) => {
const user = await context.db.user.findUnique({
where: { id: input.id }
});
if (!user) {
throw new Error('User not found');
}
return user;
},
}),
createUser: igniter.muate({
path: '/' as const,
body: z.object({
name: z.string(),
email: z.string().email()
})
handler: async ({ request, response, context, query }) => {
return await context.db.user.create({
data: input
});
},
}),
}
})
// Use in your React app with full type safety
import { api } from './igniter.client';
function UserProfile({ userId }: { userId: string }) {
const currentUser = api.user.getUser.useQuery({
enabled: !!userId,
staleTime: 5000,
refetchOnWindowFocus: false,
params: {
id: userId
},
onSuccess: (data) => {
console.log('Successfully fetched current user:', data);
},
onError: (error) => {
console.error('Error fetching current user:', error);
},
});
if (currentUser.isLoading) return <div>Loading user...</div>;
if (currentUser.isError) return <div>Error to load user: {postsQuery.error.message}</div>;
return (
<div>
<h1>{currentUser?.name}</h1>
<p>{currentUser?.email}</p>
</div>
);
}- π Issues - Report bugs and request features
- π¬ Discussions - Ask questions and share ideas
- π€ Contributing - Help make Igniter.js better
MIT License - see the LICENSE file for details.
Made with β€οΈ by the Igniter.js team
igniterjs.com β’ GitHub β’ npm