Endpoints limpios con Spring Boot, validaciones, autenticación, roles, documentación y tests.
package com.kevinhenriquez.portfolio; import org.springframework.web.bind.annotation.*; @RestController@RequestMapping("/api")public class Inicio { sealed interface Proyecto permits Saas, Libreria {} record Saas(String nombre, int clientes) implements Proyecto {} record Libreria(String nombre, String coords) implements Proyecto {} @GetMapping("/perfil") public String presentacion(Proyecto p) { return switch (p) { case Saas s -> "SaaS en producción: " + s.nombre(); case Libreria l -> "Maven Central: " + l.coords(); }; }} // Java 21 · Spring Boot 4.1 · freelance backend developerKevin Henriquez
Java Backend Developer
Backend Java/Spring Boot para APIs, sistemas internos y automatizaciones con despliegue real.
// Servicios
Qué puedo hacer por ti
Construyo backend útil para negocio y también entro en bases a medio hacer para dejarlas claras, mantenibles y funcionando.
Paneles, flujos de trabajo y herramientas privadas para operar mejor el negocio.
Procesos repetitivos conectados a bases de datos, APIs externas, ficheros o paneles existentes.
Entro en código roto o a medio hacer, lo entiendo, lo ordeno y lo dejo funcionando.
// Proyectos
Backend Java primero: LogForge, ProGestor y API REST; después webs de clientes y demos.
LogForge
Open SourceLibrería Java de logging para DX: consola limpia, colores ANSI, hints de errores, frames de código, tablas y timers.
- Java 17
- Maven
- MIT

DAB Center
Cliente realWeb audiovisual y plataforma privada para gestionar matrículas, alumnado, asistencia, mensualidades, tienda, cuentas y seguridad.
- Astro + React
- Spring Boot
- PostgreSQL

ProGestor
Producto propioPlataforma de gestión empresarial documentada dentro del IDE con información y capturas reales.
- Java
- Spring Boot
- PostgreSQL
API REST Spring Boot
API RESTAPI REST documentada con Spring Security, JWT, roles, validaciones, tests y separación por capas.
- Java 21
- Spring Boot
- JUnit

PvP Client
Java ClientCliente para Minecraft PvP con módulos, HUD editable, menús propios y ajustes guardados dentro del juego.
- Java 21
- Fabric API
- UI Engine
ComandaGo
RetiradoSistema para hostelería que ya no está disponible públicamente; queda como proyecto realizado.
- Java
- Spring Boot
- PWA
ProRecon Canarias S.L
ClienteWeb corporativa para empresa de reformas y construcción: servicios, FAQ, presupuestos y contacto directo.
- Astro
- CSS
- JavaScript

Guagua Demo Compañía
Demo webDemo para compañía de guaguas y transporte privado con reservas, flota, servicios e idiomas.
- Astro
- CSS
- JavaScript
Minecraft Plugins
PluginsPlugins Java y sistemas para servidores Minecraft: Spigot, Fabric, bases de datos, comandos, eventos y rendimiento.
- Java
- Spigot API
- MySQL
Webs para clientes
AstroWebs modernas para artistas, clínicas, asesorías y negocios locales con Astro y Tailwind.
- Astro
- Tailwind
- TypeScript
# Kevin Henriquez
Java Backend Developer · Spring Boot · Astro · Maven CentralREADME.md
Perfil vivoSoy Java developer autodidacta en Gran Canaria. Empecé con 13 años porque quería tener mi propio servidor de Minecraft, no solo jugar en el de otros. Desde entonces he aprendido arreglando, construyendo y mejorando sistemas reales.
// Mi camino
Mi entrada a la programación fue Minecraft: montar servidores, probar plugins, mirar código de proyectos gratuitos y entender por qué algo fallaba. Durante años mi mayor habilidad fue coger bases rotas, incompletas o mal optimizadas y dejarlas funcionando. No vengo de un camino académico lineal; me tocó trabajar y no pude estudiar programación como me habría gustado. Por eso este portfolio enseña proyectos, código y criterio técnico antes que títulos.
// Ahora mismo
- Seguir profundizando en Java: backend, herramientas, plugins y productos propios.
- Sacar a la luz proyectos privados con capturas, código y decisiones reales.
- Seguir puliendo ProGestor y LogForge con más automatización, tests y mejoras concretas.
// Stack principal
Experiencia y releases
Timeline- DAB CenterWeb audiovisual y plataforma full stack para matrículas, alumnado, asistencia, mensualidades, tienda y cuentas por roles.
- LogForgePublicación de librería Java para logging, hints de errores y DX en Maven Central.
- Portfolio IDERediseño del portfolio como entorno tipo IntelliJ con tabs, terminal y buscador.
- PvP ClientCliente Minecraft PvP con módulos, HUD editable y menús dentro del juego.
- ProRecon / Guagua DemoWebs Astro para negocio local, demos comerciales y páginas de conversión.
- ProGestorSaaS privado con dashboard, documentos, finanzas, alertas y arquitectura Spring Boot.
- Servidor PvP propioCon 15 años gestioné un servidor con más de 300 usuarios y plugins adaptados a necesidades reales.
- Minecraft / JavaEmpecé montando servidores, probando plugins, entendiendo Eclipse y tocando código hasta hacerlo funcionar.
Cosas comprobables
Enlaces, capturas y proyectos realesDAB Center combina una web pública audiovisual con una aplicación privada Astro, React, Spring Boot y PostgreSQL.
LogForge está publicado como artefacto Java consumible: io.github.devkevingg:logforge.
Jean Blazer, Pablo Batista y MAPS Asesores tienen enlaces públicos; ProRecon y Guagua están marcadas como demos.
ProGestor y PvP Client se enseñan con pantallas del proyecto, no solo con texto.
@Service
public class ProGestorService { // SaaS de gestión empresarialProGestor
Producto propioPlataforma de gestión empresarial construida como SaaS privado: dashboard, finanzas, documentación, fiscalidad, alertas, permisos y reporting. La presento aquí con el mismo lenguaje visual del portfolio: información directa y capturas reales dentro del IDE.
// Qué era
Un sistema modular para centralizar la operativa de una empresa: control financiero, documentos, tareas internas, alertas y administración.
- Centro de control con KPIs, avisos y tareas operativas
- Módulo financiero con movimientos, gastos y compras
- Gestión documental, fiscalidad y contabilidad
- Alertas, roles, permisos y trazabilidad
- Arquitectura Java / Spring Boot organizada por capas
- Paneles reales capturados del producto en desarrollo
// Stack
- Java
- Spring Boot
- Spring Security
- PostgreSQL
- MySQL
- Docker
Backend estructurado por capas, seguridad por roles y pantallas preparadas para lectura rápida de datos reales.
Capturas del producto
Click para ampliar@RestController
@RequestMapping("/api/v1")
public class ApiRestController { // API documentada y testeadaAPI REST Spring Boot
BackendTestsProyecto de referencia para APIs internas: controladores finos, servicios separados, DTOs, validación de entrada, autenticación JWT, roles y errores normalizados.
// Problema
Muchas APIs empiezan simples y terminan con lógica de negocio, seguridad, persistencia y validaciones mezcladas en el controlador. Eso encarece cualquier cambio.
// Arquitectura
Separación por capas: controlador, DTOs, servicios, repositorios, seguridad, manejador global de errores y tests de integración sobre base de datos real.
// Decisiones
- JWT y roles para proteger endpoints por caso de uso.
- DTOs de entrada y salida para no exponer entidades JPA.
- Validaciones con mensajes claros y errores consistentes.
- Flyway y configuración reproducible para despliegue real.
// Evidencia técnica
- Java 21
- Spring Boot
- Spring Security
- JWT
- PostgreSQL
- JUnit
La ficha completa resume problema, arquitectura, stack, decisiones, tests, despliegue y el tipo de API que puedo adaptar a un sistema real.
@ClientModInitializer
public final class PvPClientMod { // cliente PvP para MinecraftPvP Client
Java 21Fabric APIPvP Client es un cliente para Minecraft pensado para jugar PvP con herramientas propias: ver FPS y CPS, mostrar teclas, armadura, pociones, usar zoom, freelook y colocar el HUD como quieras dentro de la pantalla.

// Números
- Java files
- 106
- Líneas Java
- 17.8k
- Recursos
- 215
- Módulos
- 27
- Java 21
- Fabric API
- Gradle
- Mixins
- Shaders
- JSON
// Módulos y ajustes
- Módulos para PvP: FPS, CPS, Keystrokes, Armor Status, Potion Status, Zoom, Freelook y más
- HUD editable para mover, bloquear, redimensionar y ordenar elementos en pantalla
- Menús propios dentro de Minecraft para tocar ajustes sin salir del juego
- Colores, posiciones, perfiles y favoritos guardados para no configurarlo todo cada vez
- Pantallas reales del cliente funcionando dentro del juego
- Base preparada para seguir añadiendo módulos y ajustes nuevos
// Lo que tiene
La idea viene de cuando montaba servidores y siempre quería tener mis propias cosas, no depender solo de plugins o mods hechos por otros.
El jugador puede activar módulos, cambiar colores, mover elementos, guardar perfiles y dejar el cliente a su gusto. Todo se configura desde menús dentro del juego.
Capturas reales del cliente
Click para ampliar@RestController
public class ComandaGoArchive { // proyecto retiradoComandaGo
RetiradoComandaGo fue una aplicación para hostelería: mesas, comandas, cocina, tickets y métricas en una PWA conectada a backend Java. Ya no está disponible públicamente, así que queda documentado como proyecto realizado sin enlazar a un dominio muerto.
- Sistema para hostelería y restaurantes
- Gestión de mesas, salones y comandas
- Pantalla de cocina y flujo de tickets
- PWA instalable para móvil, tablet y ordenador
- Backend Java conectado a base de datos
- Proyecto retirado: ya no está disponible públicamente
- Java
- Spring Boot
- PostgreSQL
- PWA
- Docker
@PublishedLibrary("Maven Central")
public class LogForge { // Java logging toolkitLogForge
Open SourceMaven CentralLibrería Java centrada en experiencia de desarrollo: logs de consola más legibles, colores ANSI, placeholders, request logs, trazas de excepciones, frames de código, sugerencias para errores comunes y utilidades como timers y tablas.
✓ SUCCESS 03:40:23 Server started on port 8080
⚠ WARNING 03:40:23 User kevin tried to access /admin
→ API 03:40:23 POST /api/orders 201 42ms
✕ ERROR 03:40:23 Failed to connect to PostgreSQL
java.lang.RuntimeException: Database unavailable<dependency>
<groupId>io.github.devkevingg</groupId>
<artifactId>logforge</artifactId>
<version>0.2.0</version>
</dependency>
// Gradle (Kotlin DSL)
implementation("io.github.devkevingg:logforge:0.2.0")// Uso — API fluida, sin configuración
Log.success("Server started on port ", 8080);
Log.timer("import-csv", () -> importador.run()); // mide y loguea solo// Parte tecnica
No es solo otro proyecto de portfolio: es una librería Java empaquetada, documentada y preparada para consumirse como dependencia Maven.
- Logs de consola limpios con colores ANSI y formato legible
- Placeholders con {} para mensajes rápidos
- Helper para logs de API con método, ruta, estado y tiempo
- Trazas de excepciones con frames de código fuente
- Explicaciones de errores Java y sugerencias de arreglo
- Timers de ejecución, tablas en consola y configuración global
// Datos del paquete
- Artefacto
- io.github.devkevingg:logforge
- Runtime
- Java 17+
- Build
- Maven 3.8+
- Licencia
- MIT
El README del repo documenta versión 0.2.0 y la página de Sonatype confirma el artefacto público en Maven Central.
- Java 17
- Maven
- Logging
- Error hints
- ANSI
- Developer tools
@Configuration
public class PortfolioConfig { // stack completoStack tecnológico
Herramientas con las que trabajo a diario construyendo productos end-to-end: backend, datos, despliegue y frontend.
// Backend Java
Java
Spring Boot
Hibernate
Maven
Gradle
JUnit
JavaFX
// Backend adicional
PHP
NodeJS
WordPress
// Bases de datos
PostgreSQL
MySQL
MariaDB
MongoDB
Redis
// DevOps y servidores
Docker
Git
GitHub
Postman
SSH
Linux
Debian
Ubuntu
CentOS
Nginx
Apache
// Frontend
JavaScript
TypeScript
Astro
React
HTML
CSS
Tailwind CSS
Bootstrap
npm
Vite
// IDEs y herramientas
IntelliJ IDEA
WebStorm
PhpStorm
Visual Studio
Android Studio
JetBrains Rider
// Mobile y cloud
Flutter
Firebase
// IA y productividad
OpenAI (ChatGPT / Codex)
Claude
Junie (JetBrains AI)
@Controller
public class WebsClientes { // clientes reales y demosWebs para clientes
AstroWebs modernas para artistas, clínicas, asesorías y negocios locales. Rápidas, con SEO cuidado y diseño a medida.
Jean Blazer
Web oficial de Jean Blazer, cantante canario de Urban Soul: música, vídeos, conciertos, tienda y contrataciones.
- HTML
- CSS
- JavaScript
Pablo Batista
Plataforma oficial del artista Pablo Batista: música, videoclips, galería, eventos y contacto profesional.
- HTML
- CSS
- JavaScript
MAPS Asesores
Asesoría laboral en Maspalomas: nóminas, contratos, Seguridad Social, portal del empleado y trámites para empresas.
- Astro
- Tailwind
- TypeScript
Guagua Demo Compañía
Demo web para una compañía de guaguas y transporte privado: reservas, flota, servicios, idiomas y contacto.
- Astro
- CSS
- JavaScript
ProRecon Canarias S.L
Web corporativa para empresa de reformas y construcción: servicios, FAQ, presupuestos y WhatsApp directo.
- Astro
- CSS
- JavaScript
@Service
public class CaseStudies { // problema, solución, resultadoCasos de estudio
Proyectos realesCada proyecto queda explicado por lo que había que resolver, cómo lo construí y qué quedó funcionando. Prefiero enseñar decisiones reales, no solo capturas bonitas.
DAB Center
- Problema
- Unir captación, matrícula y gestión diaria de la escuela sin repartir los datos entre herramientas inconexas.
- Solución
- Landing audiovisual y plataforma por roles con Astro SSR, React, Spring Boot, sesiones seguras, Flyway y PostgreSQL.
- Resultado
- Producto desplegado con matrículas, alumnado, asistencia, mensualidades, tienda, usuarios y seguridad de cuenta.
- Java 21
- Spring Boot
- Astro
- React
- PostgreSQL
LogForge
- Problema
- Los logs Java suelen ser difíciles de leer cuando hay errores, trazas largas o contexto pobre.
- Solución
- Librería ligera con API estática, colores ANSI, placeholders, request logs, timers, tablas y explicaciones de errores con frames de código.
- Resultado
- Paquete Java documentado y consumible desde Maven Central, con una historia técnica clara para otros desarrolladores.
- Java 17
- Maven
- MIT
- Developer Tools
ProGestor
- Problema
- Centralizar finanzas, documentos, alertas y control operativo en una herramienta privada de gestión.
- Solución
- SaaS Java / Spring Boot por módulos, con dashboard, roles, trazabilidad, galería real y flujos internos.
- Resultado
- Base empresarial mantenible para seguir añadiendo módulos sin romper la estructura principal.
- Java
- Spring Boot
- PostgreSQL
- Docker
API REST Spring Boot
- Problema
- Exponer datos y operaciones internas sin mezclar controladores, seguridad, validaciones y persistencia en el mismo sitio.
- Solución
- API REST por capas con DTOs, Spring Security, JWT, roles, validación de entrada, errores normalizados y tests de integración.
- Resultado
- Base clara para paneles internos, integraciones y automatizaciones con documentación y despliegue reproducible.
- Java 21
- Spring Boot
- Spring Security
- JUnit
PvP Client
- Problema
- Crear un cliente para Minecraft PvP con módulos, HUD configurable y menús propios dentro del juego.
- Solución
- Cliente con módulos activables, editor de HUD, perfiles, colores, favoritos y ajustes guardados.
- Resultado
- Tiene 27 módulos y varias pantallas propias para configurar el cliente dentro de Minecraft.
- Java 21
- Fabric API
- Gradle
- Mixins
ProRecon Canarias S.L
- Problema
- Una empresa local necesitaba presencia digital clara para explicar servicios y generar contactos.
- Solución
- Web Astro con servicios, FAQ, contacto directo, copy comercial y estructura adaptada a reformas.
- Resultado
- Demo corporativa rápida y presentable, lista para enseñar como web de negocio local.
- Astro
- CSS
- JavaScript
- SEO
Guagua Demo Compañía
- Problema
- Mostrar cómo podría verse una compañía de transporte privado con reservas y comunicación multidioma.
- Solución
- Demo Astro con flota, servicios, reservas, contenido por idiomas y visuales pensados para transporte.
- Resultado
- Queda como demo reutilizable para empresas de guaguas, transfers o transporte turístico.
- Astro
- CSS
- JavaScript
- i18n
ComandaGo
- Problema
- Gestionar mesas, comandas y cocina en hostelería desde una PWA conectada a backend.
- Solución
- Aplicación con flujo de mesas, comandas, tickets y cocina, documentada ahora como proyecto retirado.
- Resultado
- Queda como experiencia real sin enlazar a dominios muertos ni prometer disponibilidad pública.
- Java
- Spring Boot
- PWA
- PostgreSQL
@Repository
public class OpenSource { // repos públicos en vivo desde GitHubOpen Source
github.com/DevKevinggRepositorios públicos destacados. Haz click en cualquier repo paranavegar su código desde GitHub aquí mismo, sin salir del IDE.
Selecciona un archivo para ver su código.
@PostMapping("/contacto")
public Respuesta contactar() { // respondo en menos de 24hContacto
¿Tienes un proyecto, una idea o necesitas backend en Java? Rellena el formulario y el mensaje llegará directamente a mi correo.
@SpringBootTest
@Testcontainers
class InicioTest {
@Container static PostgreSQLContainer<?> db = new PostgreSQLContainer<>("postgres:16-alpine");
@Test
void presentacion_conLibreria_devuelveCoordenadasMaven() {
var resultado = inicio.presentacion(new Libreria("LogForge", "io.github.devkevingg:logforge"));
assertThat(resultado).contains("Maven Central"); // AssertJ
}
}Testing en serio
14 / 14 passedJUnit 5, AssertJ y Testcontainers: los tests de integración levantan un PostgreSQL real en Docker, no un H2 que luego falla en producción. Así trabajo en todos mis proyectos.
- ✓ InicioTest 412 ms
- ✓ presentacion_conLibreria_devuelveCoordenadasMaven 38 ms
- ✓ presentacion_conSaas_incluyeNombre 21 ms
- ✓ FacturaServiceTest 1 s 204 ms
- ✓ emitirFactura_conIGIC_calculaTotalCorrecto 96 ms
- ✓ emitirFactura_concurrente_noDuplicaNumeracion 840 ms
- ✓ ContactoControllerTest 1 s 231 ms
> Task :test
InicioTest > presentacion_conLibreria_devuelveCoordenadasMaven() PASSED
FacturaServiceTest > emitirFactura_concurrente_noDuplicaNumeracion() PASSED
· Testcontainers: postgres:16-alpine started in 1.9s (reused container)
· 8 hilos emitiendo facturas a la vez — numeración secuencial sin huecos
BUILD SUCCESSFUL in 2s — 14 tests completed, 14 passedUn bug real, cazado con el debugger
ProGestorEn ProGestor dos usuarios emitiendo facturas a la vez podían obtener el mismo número. Breakpoint en la asignación, dos peticiones en paralelo, y en Variables se veía el mismo siguienteNumero en ambos hilos: condición de carrera. Solución: bloqueo pesimista (SELECT … FOR UPDATE) sobre el contador de la serie — y el test concurrente de arriba para que no vuelva.
- asignarNumero() FacturaService.java:87
- emitir() FacturaService.java:52
- crearFactura() FacturaController.java:34
- java.base — ThreadPoolExecutor$Worker.run()
factura = {Factura@11204} "Factura{serie='2026-A', total=1250.00, estado=PENDIENTE}"
siguienteNumero = 1042 ← mismo valor en el hilo http-nio-8080-exec-3
serie = {SerieFactura@11207} "2026-A"
this = {FacturaService@10981}build.gradle
Java 21 toolchainBuild real de un servicio Spring Boot 3: toolchain de Java 21, BOM de Spring, y solo las dependencias que se usan. Nada de copiar starters al azar.
plugins {
id 'java'
id 'org.springframework.boot' version '3.3.5'
id 'io.spring.dependency-management' version '1.1.6'
}
group = 'com.kevinhenriquez'
version = '1.4.2'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(21) // virtual threads, pattern matching
}
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.flywaydb:flyway-core'
implementation 'io.github.devkevingg:logforge:0.2.0' // mi librería, en mi build
runtimeOnly 'org.postgresql:postgresql'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.testcontainers:postgresql'
testImplementation 'org.testcontainers:junit-jupiter'
}
tasks.named('test') {
useJUnitPlatform()
maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1
}application.yml
Spring Boot 3Configuración con decisiones deliberadas, no defaults copiados: pool HikariCP dimensionado, open-in-view apagado y actuator sin exponer de más.
spring:
datasource:
url: jdbc:postgresql://localhost:5432/portfolio
hikari:
maximum-pool-size: 10 # conexiones = ((cores * 2) + discos), no 100 "por si acaso"
connection-timeout: 3000 # fallar rápido, no colgar el hilo 30s
jpa:
open-in-view: false # sesión fuera del controlador = lazy loading controlado
hibernate:
ddl-auto: validate # el esquema lo gestionan las migraciones Flyway, no Hibernate
flyway:
locations: classpath:db/migration
threads:
virtual:
enabled: true # Java 21: un virtual thread por request
management:
endpoints:
web:
exposure:
include: health,info,metrics # lo justo; nada de exponer env o heapdump
logging:
level:
org.hibernate.SQL: debug # solo en el perfil localADR-001 · Decisiones de arquitectura
ProGestorRegistro de decisiones (Architecture Decision Records) de ProGestor. Documentar el porqué vale más que el código: el código dice qué hace, el ADR dice por qué.
// ADR-001 · Monolito modular, no microservicios
Contexto: SaaS de facturación multi-tenant para pymes, un equipo de una persona.Decisión: monolito modular con paquetes por dominio (facturación, contabilidad, documentos) y límites estrictos entre módulos.Consecuencia: despliegue simple, transacciones locales, y si un módulo crece, sus límites ya están dibujados para extraerlo.
// ADR-002 · PostgreSQL con row-level tenancy
Contexto: cientos de tenants pequeños, presupuesto de infraestructura ajustado.Decisión: una base de datos, columna tenant_id con índices compuestos y filtro obligatorio a nivel de repositorio — frente a esquema o base por tenant.Consecuencia: operación y backups simples; el aislamiento se garantiza con tests.
// ADR-003 · Numeración de facturas con bloqueo pesimista
Contexto: la ley exige numeración correlativa sin huecos; hubo una condición de carrera real con emisión concurrente.Decisión: SELECT … FOR UPDATE sobre el contador de serie dentro de la transacción de emisión, en lugar de bloqueo optimista con reintentos.Consecuencia: serializa solo la asignación del número (~2 ms), corrección garantizada.
// ADR-004 · Flyway desde el día uno
Contexto: el esquema evoluciona cada semana y hay datos reales de clientes.Decisión: migraciones versionadas con Flyway y ddl-auto: validate; Hibernate nunca toca el esquema.Consecuencia: cada cambio de esquema queda en el historial de Git y es reproducible en local, staging y producción.