Nelson Karlsson

Desarrollador backend junior

Java · Sistemas Linux · Docker

De Canarias, en Málaga · de sistemas hacia backend y bajo nivel

Busco empresa para la FP Dual de 2º DAM

Mañanas desde ya · jornada completa desde junio 2027 · PTA Málaga o remoto

NUXX-TERMINAL

NUXX-OS 1.0 · tty1 · sin cookies ni trackers

Pregúntame por Nelson (te responde una IA) o escribe un comando. Prueba: help

Respuestas generadas por IA a partir de mi perfil; pueden contener errores. Las preguntas las procesan Groq o Google: no escribas datos personales.Máximo 500 caracteres. 0/500

Sobre mí

No fui por la universidad: hice SMR, me pasé dos años metido hasta el codo en redes, servidores y sistemas, y acabé pensando «quiero escribir el código que corre encima de todo esto». Así que aquí estoy. Ahora hago DAM y construyo cosas por mi cuenta, porque esperar a que en clase me lo enseñen todo no va conmigo.

Me gusta el backend porque es donde vive la lógica de verdad: arquitectura limpia, sistemas bien pensados, código que hace lo que tiene que hacer sin drama. Rust es el lenguaje al que siempre vuelvo: razonar sobre memoria y ownership en tiempo de compilación me cuadra.

Cuando no programo: videojuegos, anime, cacharrear con hardware, distro-hopping o leer sobre cosas que todavía no necesito saber. Siempre con un proyecto en marcha.

Soy de Canarias y vivo en Málaga. Mi homelab une un servidor aquí con un NAS en Fuerteventura.

Español nativo · Inglés B1

Proyectos

Hechos a mano, sin código generado por IA. Cada uno como un caso técnico: el problema, lo que construí, lo que decidí y lo que haría distinto.

PortableFlix

en producción 2026

Mi homelab: un servidor en Málaga y un NAS en Fuerteventura, unidos por VPN. Ningún puerto abierto en el router.

  • Ubuntu Server 24.04
  • Docker Compose
  • Jellyfin
  • Tailscale / WireGuard
  • NFS
  • LVM
  • SSH
Ver caso técnico

// Problema

Quería un servidor multimedia propio y acceso al NAS que está en otra isla, sin exponer nada a internet y sin pagar por ello. Tenía un portátil viejo y tiempo.

// Qué construí

  • Monté Ubuntu Server 24.04 sobre un portátil reutilizado.
  • Jellyfin en Docker Compose, con usuario sin privilegios (UID 1000).
  • VPN Tailscale/WireGuard entre el servidor de Málaga y el NAS de Fuerteventura: acceso remoto y SSH sin abrir puertos en el router.
  • Monté el NAS por NFS en solo lectura, restringido por IP, con automount y nofail.
  • Un volumen LVM aparte para la biblioteca y los temporales de transcodificación.
  • SSH solo con clave.

// Decisiones técnicas

VPN en malla en lugar de abrir puertos
Así no hay nada expuesto a internet. El router no tiene ni una redirección.
LVM separado para los datos
Si se llena el disco de media, el sistema sigue vivo.
NFS en solo lectura y con nofail
El servidor arranca aunque el NAS esté apagado y el contenedor no puede tocar la biblioteca.
Contenedor sin root y configuración en Git
Mínimo privilegio. Usuarios, tokens y base de datos se quedan fuera del repo.

// Qué aprendí / qué haría distinto

  • La documentación se queda atrás si no la actualizo en cada cambio: el README seguía diciendo que Jellyfin era solo local después de abrirlo a la red de casa para la tele.
  • LVM y NFS los configuré a mano. La próxima vez también los dejo como código (fstab, exports) para poder reconstruir el servidor desde cero.

JuegoRPG

terminado 2026 · 1º DAM

Mi proyecto de 1º de DAM para aprender Java y POO a base de picar código: un RPG por turnos con interfaz Swing, hecho a mano.

  • Java 21
  • Swing
  • Serialización (Java I/O)
  • Javadoc
  • NetBeans
Ver caso técnico

// Problema

Quería practicar Java y POO con algo más grande que los ejercicios de clase, donde herencia y polimorfismo sirvieran para algo de verdad.

// Qué construí

  • Hice 4 clases jugables (Guerrero, Mago, Arquero, Ladrón) sobre una jerarquía Entidad → Personaje, cada una con su mecánica y 2 habilidades.
  • Combate por turnos contra Goblin, Orco y Dragón, y un jefe final con dos fases: se enfurece al bajar del 50 % de vida.
  • Inventario de 20 huecos con armas, armaduras y consumibles, botín aleatorio y compraventa.
  • Historia ramificada con un árbol de 12 nodos y dos finales.
  • Guardado y carga de partidas por serialización, con fecha y hora.
  • 6 pantallas en Swing y Javadoc en todas las clases (unas 3.800 líneas).

// Decisiones técnicas

Clases abstractas y polimorfismo
Cada clase calcula su daño a su manera (calcularDanioAtaque) y el combate no tiene que saber cuál es.
Árbol de nodos para la historia
Añadir una escena es añadir un nodo. La lógica no se toca.
Serialización para guardar
Lo más rápido para guardar el estado entero sin base de datos.

// Qué aprendí / qué haría distinto

  • La serialización es cómoda, pero cualquier cambio en las clases rompe las partidas guardadas.
  • No tiene tests. Hoy separaría la lógica de las pantallas Swing para probarla con JUnit.

// Capturas del juego

Menú principal de JuegoRPGPantalla de selección de personaje con las cuatro clasesPantalla de combate por turnosPantalla de inventario con objetos equipables

Gorin 五輪

en desarrollo 2026 –

Tracker de entrenamiento, nutrición y hábitos con niveles y misiones, para montar en tu propio servidor. Ahora mismo: idea, stack y roadmap. Código, todavía no.

  • Java 21
  • Spring Boot 3
  • Spring Security (JWT)
  • JPA
  • PostgreSQL
  • Flyway
  • Testcontainers
  • Angular
  • Docker Compose
  • GitHub Actions
Ver caso técnico

// Problema

Quiero apuntar entrenos, comidas y hábitos en un servidor mío y convertirlos en niveles y misiones diarias. La idea: tu rango vale lo que tu pilar más débil. El nombre y los cinco pilares vienen de El libro de los cinco anillos, de Miyamoto Musashi.

// Qué construí

  • Definí el proyecto: cinco pilares (tierra, agua, fuego, viento y vacío: fuerza, resistencia, nutrición, versatilidad y mente).
  • Elegí el stack y escribí el roadmap por fases.
  • Repositorio con licencia MIT. El primer paso del roadmap es la autenticación y los usuarios.

// Decisiones técnicas

Spring Boot + PostgreSQL con migraciones Flyway
Es el stack backend que quiero dominar, y las migraciones versionan el esquema desde el primer día.
Testcontainers para los tests de integración
Probar contra un PostgreSQL real, no contra una base en memoria.
Self-hosted con Docker Compose
Los datos de salud se quedan en el servidor de cada uno.

// Roadmap

  1. Autenticación, usuarios y administración
  2. Ejercicios, rutinas y sesiones
  3. Alimentos y comidas
  4. Hábitos, pasos y peso corporal
  5. XP, niveles y misiones diarias
  6. Exportación de datos (JSON / CSV)
  7. Web en Angular
  8. Docker, CI y despliegue
El camino: de «no sé» a «ya lo hice».

Experiencia y formación

  1. 2025 – 2027 · Formación · en curso

    CFGS Desarrollo de Aplicaciones Multiplataforma (DAM), modalidad dual

    CPIFP Alan Turing · Málaga

    • Ahora en 2º. Busco empresa para la FP Dual de este curso.
  2. 2026 · Certificación

    AWS Academy Graduate – Cloud Foundations

    Amazon Web Services · AWS Academy

    • Fundamentos de AWS con laboratorios prácticos: EC2, VPC y RDS.
  3. 04/2026 – 05/2026 · Prácticas

    Prácticas FP Dual (DAM)

    Altaid Formación · Remoto

    • Administré Moodle y WordPress: usuarios, roles, permisos y actualizaciones.
  4. 02/2025 – 05/2025 · Prácticas

    Técnico informático en prácticas (FCT de SMR)

    Bokanet Servicios Informáticos · Las Palmas · presencial

    • Soporte técnico: incidencias de hardware, software y red.
    • Instalé Windows, Linux y VMware.
  5. 2023 – 2025 · Formación

    CFGM Sistemas Microinformáticos y Redes (SMR)

    IES Vigán · Las Palmas

    • Redes, Windows Server, Active Directory, Linux y hardware.

Stack

Lo uso con soltura

Puedo trabajar con ello sin ayuda.

  • Java
  • SQL
  • MySQL
  • PostgreSQL
  • SQL Server
  • Linux (Ubuntu Server)
  • Docker
  • Docker Compose
  • Git
  • GitHub

He trabajado con ello

Lo he usado en prácticas, en laboratorios o en mi servidor.

  • Windows Server
  • Active Directory
  • AWS (EC2, VPC, RDS)
  • TCP/IP
  • DNS
  • DHCP
  • VPN
  • WireGuard
  • NFS
  • SSH
  • SSL/TLS
  • Apache
  • Nginx
  • Mínimo privilegio
  • Hardening
  • Gestión de secretos

Aprendiendo ahora

Lo estoy aprendiendo por mi cuenta.

  • Rust

Laboratorio: construido con IA

Proyectos donde uso asistentes de IA para escribir buena parte del código. Lo mío aquí es la idea, la arquitectura, la revisión y la integración. Los separo para que sepas qué está escrito a mano y qué no. La IA es una herramienta más; los proyectos de arriba demuestran que también programo sin ella. Aquí cuento cómo está hecho cada uno.

Yomukai 読む会

terminado 2026

App Android para seguir y leer contenido por capítulos, con avisos de capítulos nuevos. Local-first, sin cuentas ni seguimiento.

  • Kotlin
  • Jetpack Compose
  • Material 3
  • Room
  • WorkManager
  • Media3 / ExoPlayer
  • OkHttp
  • Coil 3
  • Jsoup
Ver caso técnico

// Problema

Buscaba una app que hiciera esto y no encontré ninguna buena. Así que la hice yo en menos de dos horas con Claude, y de paso practiqué Kotlin y Android.

// Mi parte

La idea, las decisiones de arquitectura y la revisión del código son mías. Claude escribió casi toda la implementación. Uso la IA como herramienta para cosas concretas como esta, no porque dependa de ella: los proyectos de arriba demuestran que programo sin ella.

// Qué construí

  • App de un solo módulo con MVVM y un contenedor de dependencias manual (AppContainer).
  • Room como única fuente de verdad: las pantallas observan la base de datos con Flow y la red solo escribe en ella, así lo guardado aparece al instante y funciona sin conexión.
  • Worker de WorkManager que revisa la biblioteca en segundo plano y notifica los capítulos nuevos (frecuencia configurable, opción solo Wi-Fi).
  • Reproducción de vídeo HLS y MP4 con Media3/ExoPlayer.
  • Capa de red con OkHttp: límite de peticiones por host, reintentos, DNS sobre HTTPS y proxy HTTP/SOCKS5.
  • Cola de descargas persistente que sobrevive a que Android mate el proceso.
  • Parsers como funciones puras, con tests unitarios contra páginas reales capturadas.

// Decisiones técnicas

Local-first con Room + Flow
Una sola fuente de verdad: la interfaz no depende de que la red responda.
Un único cliente OkHttp compartido con Coil
La misma configuración de DNS, proxy y cookies para datos e imágenes.
Inyección de dependencias manual en lugar de Hilt
Para una app de un módulo es más simple y se entiende sin magia.

// Qué aprendí / qué haría distinto

  • Con IA se avanza muy rápido, pero revisar lo que escribe exige entender Android: los ciclos de vida, WorkManager y las migraciones de Room no se pueden aceptar a ciegas.

Diogenes

en desarrollo 2026

Equipo: Proyecto de clase con Yeray Trejo

Agente personal con un LLM local, 0 € y sin GPU obligatoria. El modelo propone; el código decide qué se ejecuta.

  • Docker Compose
  • Ollama
  • Python
  • LLM local (qwen3:4b-instruct)
Ver caso técnico

// Problema

Un agente con acceso al correo y al calendario es un problema si obedece cualquier orden escondida en un correo. Queríamos uno que corriera en un portátil normal y no hiciera nada sin confirmación humana.

// Mi parte

Mi parte: el Docker Compose con Ollama, la batería de pruebas de modelos, la investigación de agentes y la comparativa de modelos. Parte del código está escrito por nosotros y parte con Claude Code.

// Qué construí

  • Monté Ollama en Docker Compose con la versión fijada, el puerto solo en 127.0.0.1, límite de memoria y healthcheck.
  • Escribí una batería de pruebas en Python (solo librería estándar, con tests): 11 prompts × 3 repeticiones × 3 modelos, con comprobación automática y medición de RAM y CPU del contenedor.
  • Comparé qwen3.5:4b, qwen3:4b-instruct y llama3.2:3b. Nos quedamos con qwen3:4b-instruct: 30/33 aciertos, 15/15 en tool calling y no obedeció la orden inyectada en un correo cuando tenía herramientas.
  • Investigué plataformas de agentes y elegimos n8n + un servidor MCP propio.

// Decisiones técnicas

Medir solo en CPU
Los resultados tienen que valer para los portátiles del aula, que no tienen GPU.
Confirmación en dos capas impuesta por código
Ningún modelo de 4B debe ser la única barrera contra la prompt injection: en las pruebas, uno llegó a crear un evento siguiendo una orden escondida en un correo.
n8n + servidor MCP propio en lugar de un agente hecho
Los permisos se controlan en un solo sitio que escribimos nosotros.

// Qué aprendí / qué haría distinto

  • Una batería automática también tiene bugs: tuvimos que revisar a mano las 99 respuestas y corregir cuatro comprobaciones mal planteadas antes de fiarnos de los números.

// Roadmap

  1. Agente en n8n respondiendo por Telegram con el modelo local
  2. Servidor MCP propio: Gmail y Calendar en solo lectura, tareas en SQLite y simulador doméstico
  3. Pruebas de prompt injection y análisis de riesgos
  4. Demo final: 11 de diciembre de 2026

NUXX-TERMINAL

en producción 2026

El terminal de esta web: un asistente que responde sobre mí, con backend propio, límites anti-abuso y coste cero.

  • Java 21
  • Spring Boot
  • Bucket4j
  • Groq
  • Gemini
  • systemd
  • Apache
Ver caso técnico

// Problema

Quería que un reclutador pudiera preguntarme cosas sin que el chat costara dinero, filtrara claves o sirviera para otra cosa.

// Mi parte

Los requisitos, los límites de seguridad y la revisión son míos. El código lo ha escrito Claude Code.

// Qué construí

  • API en Spring Boot (POST /api/chat) que no guarda conversaciones: el historial lo envía el navegador.
  • Groq como proveedor principal y Gemini de respaldo; si fallan los dos o se acaba la cuota, una respuesta fija con mi email.
  • Límite por IP, tope global diario por debajo de la cuota gratuita, mensajes de 500 caracteres como máximo y timeout de 15 s.
  • Servicio systemd con un usuario sin privilegios, escuchando solo en localhost detrás de Apache. Las claves viven fuera del repositorio.
  • Los comandos del terminal (help, whoami, ls, cat cv...) se resuelven en el navegador con los JSON de la web, sin gastar IA.

// Decisiones técnicas

Backend propio en lugar de llamar al LLM desde el navegador
Las claves nunca llegan al cliente y los límites no se pueden saltar.
Dos proveedores gratuitos con respaldo
Si uno cae o agota la cuota, el chat sigue funcionando sin coste.

Contacto

Busco empresa para la FP Dual de 2º DAM. Si encajo, escríbeme.

© 2026 Nelson Filipe Fardilha Karlsson · Web hecha con Angular y con ayuda de IA (ver Laboratorio). Sin cookies ni trackers.