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