chat-IA nació de una idea simple: quería un chat con IA que pudiera analizar mis documentos. Terminar construyendo un sistema completo con autenticación, historial de conversaciones, streaming, y soporte de PDFs fue todo un viaje.
##El stack elegido
Para este proyecto usé Next.js 15 con App Router, React 19, TypeScript strict, Tailwind CSS v4, Prisma con PostgreSQL, y NextAuth v5. Todo en un solo repositorio. La elección de Next.js fue natural: maneja el frontend y el backend en el mismo repo, tiene soporte nativo para streaming, y el App Router facilita mucho la arquitectura de layouts y rutas.
##El mayor desafío: streaming
Implementar el streaming de respuestas de la IA fue lo más complejo. No podía hacer un simple fetch y esperar la respuesta completa, porque con respuestas largas el usuario esperaría mucho tiempo sin feedback. La solución fue usar Server-Sent Events (SSE) desde el API route y leerlos con ReadableStream en el cliente.
// app/api/chat/route.ts
const stream = new ReadableStream({
async start(controller) {
for await (const chunk of completion) {
const text = chunk.choices[0]?.delta?.content ?? '';
controller.enqueue(encoder.encode(text));
}
controller.close();
},
});
return new Response(stream, {
headers: { 'Content-Type': 'text/event-stream' },
});##Autenticación con NextAuth v5
NextAuth v5 cambió bastante respecto a v4. La configuración es más explícita y el sistema de adapters es más limpio. Integrar el Prisma Adapter para persistir sesiones y usuarios fue directo, aunque la documentación de la beta tiene algunos huecos que tuve que resolver leyendo issues en GitHub.
##Lo que haría diferente
- ›Extraería el sistema de design tokens a un archivo separado desde el día uno
- ›Agregaría tests end-to-end con Playwright desde el inicio
- ›Usaría un job queue para el procesamiento de documentos pesados
- ›Implementaría rate limiting en los API routes desde el principio
"El diseño del sistema importa más que la implementación. Es más fácil reescribir código que cambiar la arquitectura."