Stack technique
Construit sur des outils éprouvés
Fonctionnalités
Tout ce qu'il faut pour créer
Modules et fonctionnalités prêts à l'emploi pour accélérer le développement.
Authentication & Authorization
Complete auth system with session management, role-based access control, and social login.
Database & ORM
Type-safe database operations with Drizzle ORM, migrations, and PostgreSQL optimization.
API & Type Safety
End-to-end type safety with tRPC and seamless client-server communication.
File Management
Complete file handling with S3 integration, image processing, and CDN support.
Background Jobs
Robust job processing with BullMQ, scheduled tasks, and retry logic.
Email & Notifications
Multi-channel notifications with email templates and delivery tracking.
User Management
Complete user system with profiles, preferences, and activity tracking.
Monitoring & Logging
Comprehensive monitoring with Sentry, structured logging, and performance tracking.
Architecture
Évolutif par conception
Structure monorepo avec séparation nette et packages prêts pour les microservices.
Applications frontend
TanStack Start, React 19, SSR
API Gateway
Hono + tRPC, middleware, routage
Packages de services
Auth, base de données, cache, files d'attente
Expérience développeur
Type-safe de la base de données à l'UI
Écrivez la logique backend une fois, obtenez l'autocomplétion et la vérification des types côté frontend.
import { router, authProcedure } from '@repo/trpc';
import {
getFilesByUserIdPaginated,
deleteFile,
ListFilesPaginatedSchema
} from '@repo/file';
import { IdSchema } from '@repo/server-utils';
export const fileRouter = router({
getMyFiles: authProcedure
.input(ListFilesPaginatedSchema)
.query(({ ctx, input }) => {
return getFilesByUserIdPaginated(
ctx.user.user.id, input
);
}),
deleteFile: authProcedure
.input(IdSchema)
.mutation(({ ctx, input }) => {
return deleteFile(input.id, ctx.user.user.id);
}),
});import { useTRPC } from '@/lib/trpc-client';
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
export function FileList() {
const trpc = useTRPC();
const queryClient = useQueryClient();
const { data: files } = useQuery(
trpc.file.getMyFiles.queryOptions({
pagination: { page: 1, limit: 10 }
})
);
const { mutate: deleteFile } = useMutation(
trpc.file.deleteFile.mutationOptions({
onSuccess: () => {
queryClient.invalidateQueries({
queryKey: trpc.file.pathKey()
});
}
})
);
return <div>{files?.data.length} files</div>;
}