// página · proyectosIssue 02

Portafolio de Proyectos

Proyectos reales: SaaS multi-tenant, plataformas full-stack con Next.js y APIs REST con NestJS.

Portada del proyecto Nexfit01

Nexfit

Beta
Full-Stack
Reto → Resultado

Entrenadores gestionando clientes en hojas de cálculo → plataforma multi-repo con app móvil offline-first que centraliza planes, check-ins y progreso.

SaaS multi-repo para entrenadores personales y nutricionistas: panel web, app móvil offline-first (WatermelonDB) y API REST. Gestión de clientes, planes de entreno y nutrición, check-ins y seguimiento de progreso. Desplegado en infra propia self-host (Coolify) con PostgreSQL + Cloudflare R2.

Cómo está montado

Tres repos contra una misma base PostgreSQL con Prisma: API en NestJS, panel en Next.js y app en Expo. La app escribe en local con WatermelonDB y sincroniza después, para que una sesión pueda registrarse sin cobertura. Los archivos van a Cloudflare R2, no al servidor.

NestJSNext.js 16Expo / React NativePostgreSQLPrismaCloudflare R2Redux ToolkitTypeScript
Ver capturas
Repositorio privado
Portada del proyecto Vereda02

Vereda

En desarrollo
Full-Stack
Reto → Resultado

Organizadores montando webs de eventos a mano → SaaS no-code multi-tenant con web pública y panel propio en minutos.

Plataforma SaaS no-code para organizadores de pruebas deportivas: web pública del evento, panel de administración, dominio propio y gestión multi-tenant. Sobre infra propia self-host con PostgreSQL + Cloudflare R2.

Cómo está montado

Multi-tenant desde el primer día: cada organizador tiene su evento, su panel y su dominio sobre la misma instancia. El enrutado se decide por el Host de la petición —ruta, subdominio o dominio propio—, así que dar de alta el dominio de un cliente no implica desplegar nada nuevo: es una entrada más apuntando al mismo sitio.

Next.js 16PostgreSQLCloudflare R2JWTTypeScriptTailwind 4React 19
Ver capturas
En Vivo Repositorio privado
Portada del proyecto Medina Roja BTT03

Medina Roja BTT

Demo en vivo
Full-Stack
Reto → Resultado

Un evento de BTT sin web propia → landing oficial en producción con recorridos GPX en mapa interactivo, información y contacto.

Landing oficial del II Desafío Medina Roja BTT (2 modalidades, 30 y 50 km, 4 jul 2026). Información del evento, recorridos GPX renderizados en mapa Leaflet interactivo, desplegado en Vercel.

Cómo está montado

Los recorridos son ficheros GPX reales renderizados sobre un mapa Leaflet interactivo, no imágenes: lo que ve el ciclista es el trazado que se va a rodar. Sitio estático, desplegado en Vercel.

Next.js 16LeafletGPXTailwind 4TypeScriptReact 19
Ver capturas
Portada del proyecto Accounting Suite04

Accounting Suite

Demo en vivo
Full-Stack
Reto → Resultado

Pequeños negocios sin visibilidad de su día a día contable → dashboard con demo en vivo: transacciones, informes, presupuestos y recurrentes.

App de contabilidad para pequeños negocios con demo en vivo (solo lectura) en demo.accounting.jjpg.dev. REST API en NestJS + dashboard Next.js con transacciones, informes diarios, presupuestos y movimientos recurrentes.

Cómo está montado

API y cliente separados —NestJS y Next.js— con Zod validando la entrada y JWT entre ambos. La demo pública corre en modo solo lectura contra su propia base con datos sintéticos: enseñar el producto no debería exponer los datos de nadie.

NestJSPostgreSQLPrismaNext.js 16Redux ToolkitChart.jsFramer MotionZodTypeScriptJWT
Portada del proyecto Curio05

Curio

Demo en vivo
Full-Stack
Reto → Resultado

Enseñar a programar, mates y ciencias a un niño de 3–14 años con material escrito para adultos → una plataforma donde la lección es un juego y el progreso se ve como en uno.

Plataforma educativa gamificada para niños de 3–14 años: programación, matemáticas y ciencias con lecciones interactivas, editor de código, desafíos, logros y progresión estilo videojuego.

Cómo está montado

El estado de la partida —nivel, XP, racha diaria— vive en cliente con Zustand, y los datos de servidor los leen los Server Components contra Prisma. La interfaz está traducida con next-intl, y el contenido se adapta por tramo de edad dentro del rango de 3 a 14 años.

Next.js 16PrismaZustandFramer Motionnext-intlTypeScriptPostgreSQL
Ver capturas
En Vivo Repositorio privado