Nelson Karlsson

Junior backend developer

Java · Linux systems · Docker

From the Canary Islands, in Málaga · from systems towards backend and low level

Looking for a company for my 2nd-year DAM dual placement

Mornings from now · full-time from June 2027 · PTA Málaga or remote

NUXX-TERMINAL

NUXX-OS 1.0 · tty1 · no cookies, no trackers

Ask me about Nelson (an AI answers) or type a command. Try: help

AI-generated answers based on my profile; they may contain mistakes. Questions are processed by Groq or Google: don't share personal data.500 characters max. 0/500

About me

I didn't take the university route: I did SMR (IT systems and networking), spent two years elbow-deep in networks, servers and systems, and ended up thinking "I want to write the code that runs on top of all this". So here I am. Now I'm doing DAM and building things on my own, because waiting for class to teach me everything isn't my style.

I like backend because that's where the real logic lives: clean architecture, well-designed systems, code that does what it's supposed to without drama. Rust is the language I keep coming back to: reasoning about memory and ownership at compile time just makes sense to me.

When I'm not coding: video games, anime, tinkering with hardware, distro-hopping, or reading about things I don't need to know yet. Always with a project running.

I'm from the Canary Islands and live in Málaga. My homelab links a server here with a NAS in Fuerteventura.

Spanish (native) · English B1

Projects

Written by hand, with no AI-generated code. Each one as a technical case: the problem, what I built, what I decided and what I'd do differently.

PortableFlix

in production 2026

My homelab: a server in Málaga and a NAS in Fuerteventura, joined by a VPN. No ports open on the router.

  • Ubuntu Server 24.04
  • Docker Compose
  • Jellyfin
  • Tailscale / WireGuard
  • NFS
  • LVM
  • SSH
Read the case study

// Problem

I wanted my own media server and access to the NAS on another island, without exposing anything to the internet or paying for it. I had an old laptop and time.

// What I built

  • I set up Ubuntu Server 24.04 on a repurposed laptop.
  • Jellyfin on Docker Compose, running as an unprivileged user (UID 1000).
  • Tailscale/WireGuard VPN between the Málaga server and the Fuerteventura NAS: remote access and SSH with no port forwarding.
  • I mounted the NAS over NFS, read-only and restricted by IP, with automount and nofail.
  • A separate LVM volume for the library and transcoding temp files.
  • Key-only SSH.

// Technical decisions

Mesh VPN instead of opening ports
Nothing is exposed to the internet. The router has no forwarding rules at all.
Separate LVM volume for data
If the media disk fills up, the system keeps running.
Read-only NFS with nofail
The server boots even when the NAS is off, and the container can't touch the library.
Non-root container and config in Git
Least privilege. Users, tokens and database stay out of the repo.

// What I learned / would do differently

  • Docs fall behind unless I update them with every change: the README still said Jellyfin was local-only after I opened it to the home network for the TV.
  • I set up LVM and NFS by hand. Next time I'll keep them as code too (fstab, exports) so I can rebuild the server from scratch.

JuegoRPG

finished 2026 · DAM year 1

My first-year DAM project to learn Java and OOP by writing a lot of code: a turn-based RPG with a Swing UI, written by hand.

  • Java 21
  • Swing
  • Serialization (Java I/O)
  • Javadoc
  • NetBeans
Read the case study

// Problem

I wanted to practise Java and OOP on something bigger than class exercises, where inheritance and polymorphism actually do something.

// What I built

  • I made 4 playable classes (Warrior, Mage, Archer, Thief) on an Entity → Character hierarchy, each with its own mechanic and 2 skills.
  • Turn-based combat against Goblin, Orc and Dragon, plus a two-phase final boss: it enrages below 50 % health.
  • 20-slot inventory with weapons, armour and consumables, random loot and trading.
  • Branching story as a 12-node tree with two endings.
  • Save and load through serialization, with date and time.
  • 6 Swing screens and Javadoc on every class (about 3,800 lines).

// Technical decisions

Abstract classes and polymorphism
Each class computes its damage its own way (calcularDanioAtaque) and combat doesn't need to know which one it is.
Node tree for the story
Adding a scene means adding a node. The logic stays untouched.
Serialization for saves
The quickest way to save the whole state without a database.

// What I learned / would do differently

  • Serialization is convenient, but any change to the classes breaks existing saves.
  • It has no tests. Today I'd separate the logic from the Swing screens so I could test it with JUnit.

// Game screenshots

JuegoRPG main menuCharacter selection screen with the four classesTurn-based combat screenInventory screen with equippable items

Gorin 五輪

in progress 2026 –

A training, nutrition and habit tracker with levels and quests, to run on your own server. Right now: idea, stack and roadmap. Code, not yet.

  • Java 21
  • Spring Boot 3
  • Spring Security (JWT)
  • JPA
  • PostgreSQL
  • Flyway
  • Testcontainers
  • Angular
  • Docker Compose
  • GitHub Actions
Read the case study

// Problem

I want to log workouts, meals and habits on a server of my own and turn them into levels and daily quests. The idea: your rank is only as strong as your weakest pillar. The name and the five pillars come from The Book of Five Rings, by Miyamoto Musashi.

// What I built

  • I defined the project: five pillars (earth, water, fire, wind and void: strength, endurance, nutrition, versatility and mind).
  • I chose the stack and wrote the roadmap in phases.
  • MIT-licensed repo. The first roadmap step is authentication and users.

// Technical decisions

Spring Boot + PostgreSQL with Flyway migrations
It's the backend stack I want to master, and migrations version the schema from day one.
Testcontainers for integration tests
Test against a real PostgreSQL instead of an in-memory database.
Self-hosted with Docker Compose
Health data stays on each person's own server.

// Roadmap

  1. Authentication, users and admin
  2. Exercises, routines and sessions
  3. Foods and meals
  4. Habits, steps and body weight
  5. XP, levels and daily quests
  6. Data export (JSON / CSV)
  7. Angular web app
  8. Docker, CI and deployment
The path: from "no idea" to "done".

Experience and education

  1. 2025 – 2027 · Education · ongoing

    Higher Vocational Diploma in Multiplatform Application Development (DAM), dual mode

    CPIFP Alan Turing · Málaga

    • Currently in year 2. Looking for a company for this year's dual internship.
  2. 2026 · Certification

    AWS Academy Graduate – Cloud Foundations

    Amazon Web Services · AWS Academy

    • AWS fundamentals with hands-on labs: EC2, VPC and RDS.
  3. 04/2026 – 05/2026 · Internship

    Dual internship (DAM)

    Altaid Formación · Remote

    • I administered Moodle and WordPress: users, roles, permissions and updates.
  4. 02/2025 – 05/2025 · Internship

    IT technician intern (SMR work placement)

    Bokanet Servicios Informáticos · Las Palmas · on-site

    • Technical support: hardware, software and network incidents.
    • I installed Windows, Linux and VMware.
  5. 2023 – 2025 · Education

    Vocational Diploma in IT Systems and Networking (SMR)

    IES Vigán · Las Palmas

    • Networking, Windows Server, Active Directory, Linux and hardware.

Stack

Comfortable with

I can work with it on my own.

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

Have worked with

Used in internships, labs or on my own server.

  • Windows Server
  • Active Directory
  • AWS (EC2, VPC, RDS)
  • TCP/IP
  • DNS
  • DHCP
  • VPN
  • WireGuard
  • NFS
  • SSH
  • SSL/TLS
  • Apache
  • Nginx
  • Least privilege
  • Hardening
  • Secrets management

Learning now

Learning it on my own.

  • Rust

Lab: built with AI

Projects where I use AI assistants to write much of the code. My part here is the idea, the architecture, the review and the integration. I keep them apart so you know what's handwritten and what isn't. AI is one more tool; the projects above show I code without it too. Here I explain how each one is built.

Yomukai 読む会

finished 2026

An Android app to follow and read chapter-based content, with new-chapter notifications. Local-first, no accounts, no tracking.

  • Kotlin
  • Jetpack Compose
  • Material 3
  • Room
  • WorkManager
  • Media3 / ExoPlayer
  • OkHttp
  • Coil 3
  • Jsoup
Read the case study

// Problem

I was looking for an app that did this and couldn't find a good one. So I built it myself in under two hours with Claude, and practised Kotlin and Android along the way.

// My part

The idea, the architecture decisions and the code review are mine. Claude wrote most of the implementation. I use AI as a tool for specific things like this, not because I depend on it: the projects above show I code without it.

// What I built

  • Single-module app with MVVM and a manual dependency container (AppContainer).
  • Room as the single source of truth: screens observe the database through Flow and the network only writes into it, so saved data shows instantly and works offline.
  • A WorkManager worker checks the library in the background and notifies about new chapters (configurable interval, Wi-Fi-only option).
  • HLS and MP4 video playback with Media3/ExoPlayer.
  • OkHttp networking layer: per-host rate limiting, retries, DNS-over-HTTPS and an HTTP/SOCKS5 proxy.
  • A persistent download queue that survives Android killing the process.
  • Parsers as pure functions, unit-tested against real captured pages.

// Technical decisions

Local-first with Room + Flow
One source of truth: the UI doesn't depend on the network answering.
One OkHttp client shared with Coil
Same DNS, proxy and cookie setup for data and images.
Manual dependency injection instead of Hilt
For a single-module app it's simpler and readable without magic.

// What I learned / would do differently

  • AI makes you move very fast, but reviewing its output requires understanding Android: lifecycles, WorkManager and Room migrations can't be accepted blindly.

Diogenes

in progress 2026

Team: Class project with Yeray Trejo

A personal agent with a local LLM, a €0 budget and no GPU required. The model proposes; the code decides what runs.

  • Docker Compose
  • Ollama
  • Python
  • Local LLM (qwen3:4b-instruct)
Read the case study

// Problem

An agent with access to email and calendar is a problem if it obeys any order hidden in an email. We wanted one that runs on an ordinary laptop and never acts without human confirmation.

// My part

My part: the Docker Compose setup with Ollama, the model test suite, the agent research and the model comparison. Some of the code is ours and some was written with Claude Code.

// What I built

  • I set up Ollama on Docker Compose with a pinned version, port bound to 127.0.0.1 only, a memory limit and a healthcheck.
  • I wrote a Python test suite (standard library only, with tests): 11 prompts × 3 runs × 3 models, with automatic checks and container RAM/CPU measurement.
  • I compared qwen3.5:4b, qwen3:4b-instruct and llama3.2:3b. We went with qwen3:4b-instruct: 30/33 correct, 15/15 on tool calling, and it didn't follow the order injected into an email when it had tools.
  • I researched agent platforms and we chose n8n + our own MCP server.

// Technical decisions

Measure on CPU only
Results have to hold for the classroom laptops, which have no GPU.
Two-layer confirmation enforced in code
No 4B model should be the only barrier against prompt injection: in our tests, one created an event following an order hidden in an email.
n8n + our own MCP server instead of an off-the-shelf agent
Permissions are controlled in a single place we write ourselves.

// What I learned / would do differently

  • An automated test suite has bugs too: we reviewed all 99 answers by hand and fixed four badly designed checks before trusting the numbers.

// Roadmap

  1. n8n agent answering on Telegram with the local model
  2. Our own MCP server: read-only Gmail and Calendar, tasks in SQLite and a home simulator
  3. Prompt-injection tests and risk analysis
  4. Final demo: 11 December 2026

NUXX-TERMINAL

in production 2026

This site's terminal: an assistant that answers questions about me, with its own backend, abuse limits and zero cost.

  • Java 21
  • Spring Boot
  • Bucket4j
  • Groq
  • Gemini
  • systemd
  • Apache
Read the case study

// Problem

I wanted recruiters to be able to ask me things without the chat costing money, leaking keys or being usable for anything else.

// My part

The requirements, the security limits and the review are mine. The code was written by Claude Code.

// What I built

  • Spring Boot API (POST /api/chat) that stores no conversations: the browser sends the history.
  • Groq as the main provider and Gemini as fallback; if both fail or the quota runs out, a fixed reply with my email.
  • Per-IP rate limit, a global daily cap below the free quota, 500-character messages max and a 15 s timeout.
  • systemd service under an unprivileged user, listening on localhost only behind Apache. Keys live outside the repository.
  • The terminal commands (help, whoami, ls, cat cv...) run in the browser from the site's JSON, with no AI involved.

// Technical decisions

Own backend instead of calling the LLM from the browser
Keys never reach the client and the limits can't be bypassed.
Two free providers with fallback
If one goes down or runs out of quota, the chat keeps working at no cost.

Contact

I'm looking for a company for the 2nd-year DAM dual placement. If I fit, write to me.

© 2026 Nelson Filipe Fardilha Karlsson · Built with Angular, with help from AI (see the Lab). No cookies, no trackers.