Nico Ruedanicorueda.dev
EscríbemeEmail me

1.1 · Manacor, Mallorca Abierto a estudios, equipos pequeños y proyectos rarosOpen to studios, small teams and odd projects

Nico Rueda

Diseñador de juegos y desarrollador multiplataforma.Game designer and multiplatform developer.

Diseño antes de programar, a boli o en especificaciones, y luego escribo los sistemas: simulaciones deterministas en Rust, herramientas para el navegador y servidores en producción. I design before I code, in ballpoint or in specs, then I write the systems: deterministic simulations in Rust, browser tools and production servers.

  • ≈181.000líneas de Rust en Manager of Legendslines of Rust in Manager of Legends
  • 253tests en verde en Voxelizerpassing tests in Voxelizer
  • 2juegos jugables en el navegadorgames you can play in the browser
  • 1web local en producción: viumanacor.catlocal website in production: viumanacor.cat

Jugar yaPlay now Catpire Survivors (nueva pestaña)(new tab) Sapo Mafioso (nueva pestaña)(new tab) ≈58 MB y ≈32 MB≈58 MB and ≈32 MB

nico99rueda@gmail.com

Cargando voxel.js…Loading voxel.js…
FIG. 0 El sapo mafioso que dibujé en 2022 para un plataformas en Godot, convertido en vóxeles por Voxelizer, la herramienta que escribí en 2026. Arriba, el mismo sapo en otra página de mi cuaderno, a rotulador. No es un vídeo: es su código real ejecutándose ahora en tu navegador. Arrástralo o usa las flechas para girarlo. The mafia frog I drew in 2022 for a Godot platformer, turned into voxels by Voxelizer, the tool I wrote in 2026. Above, the same frog on another page of my notebook, in marker. It is not a video: it is the real code running in your browser right now. Drag it or use the arrow keys to rotate it. fuentesource · Platform_Godot/Sprites/UI/sapo.png → Voxelizer/voxelizer/voxel.js (MPL-2.0), sin cambiosunchanged
Nivel 1.1 · boceto a boli y rotulador, junio de 2022Level 1.1 · ballpoint and marker sketch, June 2022 Las secciones de esta web siguen su numeraciónThis site's sections follow its numbering

FichaQuick facts

Yo, según mi propio boceto de 2022: el muñeco del recuadro.Me, according to my own 2022 sketch: the stick figure in the frame.

AhoraNow
Desarrollador fullstack en Corsoft (software de gestión): Django y PostgreSQL, migraciones de PHP a Python, sistemas Linux y trato directo con clientes.Fullstack developer at Corsoft (business software): Django and PostgreSQL, PHP-to-Python migrations, Linux systems and direct client work.
EstudiosStudies
DAM (Desarrollo de Aplicaciones Multiplataforma) en modalidad dual, CIDE, Palma. Antes estudié Diseño y Desarrollo de Videojuegos en la Universitat de Girona y un año de Ingeniería Informática en la UIB.Multiplatform Application Development (DAM, a Spanish vocational diploma), work-study track, CIDE, Palma. Before that I studied Video Game Design and Development at the University of Girona and one year of Computer Engineering at the University of the Balearic Islands (UIB).
Motores y lenguajesEngines and languages
Rust · WASMC# · UnityGDScript · GodotJava · libGDXJS · TS · ReactPython · DjangoC++Phaser
AdemásAlso
Blender (modelado y rigging), Photoshop, Docker, GitHub Actions, Linux (Arch + Hyprland en casa).Blender (modelling and rigging), Photoshop, Docker, GitHub Actions, Linux (Arch + Hyprland at home).
IdiomasLanguages
Español y catalán nativos, inglés fluido, alemán y ruso básicos.Native Spanish and Catalan, fluent English, basic German and Russian.
BuscoLooking for
Estudios y equipos pequeños que necesiten a alguien que diseñe y programe los sistemas de un juego. También encargos web con sentido.Studios and small teams that need someone to design and program a game's systems. Web projects that need to work, too.
1.26 casos6 case studies

TrabajoWork

Cada caso tiene una figura que funciona con las reglas o los datos reales del proyecto. Donde es el código original lo digo; donde lo he portado a JavaScript, también.Each case has a figure that runs on the project's real rules or data. Where it is the original code I say so, and where I ported it to JavaScript, I say that too.

  1. 01Manager of LegendsSimulador de gestión de esports para MOBAsEsports management sim for MOBAsRUST · WASM · REACT · 2026
  2. 02Motor de partidaMatch engineSimulación MOBA determinista a 30 HzDeterministic 30 Hz MOBA simulationRUST · WASM · THREE.JS · 2026
  3. 03VoxelizerDe pixel art a vóxeles, en el navegadorPixel art to voxels, in the browserJS · THREE.JS · MPL-2.0 · 2026
  4. 04Sports FaceCaras procedurales y deterministasProcedural, deterministic facesCANVAS · WEBGL2 · 2026
  5. 05Tactical PrototypeRoguelite táctico con piezas de ajedrezTactical roguelite with chess piecesUNITY 6 · C# · 2024–2026
  6. 06Viu ManacorEl portal local de mi pueblo, en producciónMy town's local portal, in productionDJANGO · POSTGRES · DOCKER · 2026

01

2026 · beta v0.5.1, en desarrollo activobeta v0.5.1, in active development · con un colaboradorwith a collaborator

Manager of Legends

Un Football Manager para equipos de MOBA, que se juega en el navegador.A Football Manager for MOBA teams, played in the browser.

Ligas, fichajes, draft y partidas simuladas en directo. Todo el juego vive en un motor en Rust compilado a WebAssembly; la interfaz en React solo dibuja lo que el motor decide.Leagues, transfers, drafts and matches simulated live. The whole game lives in a Rust engine compiled to WebAssembly; the React interface only draws what the engine decides.

Vanta Jugador ficticio · rivalFictional player · rival margenmargin ±18 · 0 días de ojeoscouting days
Ojeador (ojo / criterio)Scout (eye / judgement)
FIG. 1 Lo que tu club sabe de un jugador que no es tuyo: una banda que siempre contiene el valor real. Sin ojear es de ±18; con un ojeador baja a su primera lectura (±14, ±11 u ±8 según su ojo), se reduce a la mitad cada 14 días y se detiene en el mínimo que permite su criterio. Nunca se ensancha. El valor real no está en el centro: su desplazamiento sale de un hash FNV-1a del jugador y del atributo, así que la misma partida se lee siempre igual. What your club knows about a player it does not own: a band that always contains the real value. Unscouted it is ±18; with a scout it drops to their first read (±14, ±11 or ±8 depending on their eye), halves every 14 days and stops at the floor their judgement allows. It never widens. The real value is not in the middle: its offset comes from an FNV-1a hash of player and attribute, so the same save always reads the same. fuentesource · engine/mobamanager_core/src/scouting_knowledge.rs · margin_after(), offset(), attribute_range() portados a JS línea a líneaported to JS line by line

Debajo hay más sistemas: A* en 8 direcciones sobre una rejilla de 196×196, simulación en directo en un Web Worker con paso fijo de 0,05 s, una IA de draft que puntúa counters y sinergias y un parche de equilibrio cada 14 días (4 campeones mejorados y 4 empeorados).Other systems underneath: 8-direction A* on a 196×196 grid, a live simulation in a Web Worker at a fixed 0.05 s step, a draft AI that scores counters and synergies, and a balance patch every 14 days (4 champions buffed and 4 nerfed).

≈181klíneas de Rustlines of Rust
≈127klíneas de TSlines of TS
1.069tests de Rust (núcleo)Rust tests (core)
30ligasleagues
9idiomaslanguages
21ADR
  1. origenoriginFork parcial de OpenFootManager (simulador de fútbol, GPL).Partial fork of OpenFootManager (a GPL football sim).
  2. v0.3.6App de escritorio con Tauri y un SQLite por partida.Desktop app with Tauri and one SQLite file per save.
  3. v0.4.0Migración a web: Rust → WASM, IndexedDB y guardado en la nube (junio de 2026).Move to the web: Rust → WASM, IndexedDB and cloud saves (June 2026).
  4. v0.5.1Beta publicada el 20 de septiembre de 2026.Beta released on 20 September 2026.
ProblemaProblem

Al principio, ojear a un rival devolvía un número con ruido aleatorio y sin semilla. Al recargar la partida, el mismo ojeador daba otro número. Y un número se lee como un hecho aunque sea una suposición.At first, scouting a rival returned a number with unseeded random noise. Reloading the save made the same scout report a different number. And a number reads as a fact even when it is a guess.

DecisiónDecision

Cambié el número por una banda (FIG. 1). La calidad del ojeador marca desde dónde empieza y hasta dónde puede cerrarla: un mal ojeador nunca llega a la certeza, por mucho tiempo que mire.I replaced the number with a band (FIG. 1). The scout's quality sets where it starts and how far it can close: a poor scout never reaches certainty, however long they watch.

ResultadoResult

Con ±18, las bandas de un jugador de 60 y de uno de 90 se solapan, así que no se puede fichar a ciegas: hay que mandar a un ojeador.At ±18 the bands of a 60-rated and a 90-rated player overlap, so you cannot sign players blind: you have to send a scout.

lo que aún no hacewhat it doesn't do yetLa profundidad del combate en directo (objetos y tipos de daño) sigue abierta; el backlog vive en un único documento de pendientes. Manager of Legends no está afiliado a Riot Games.Live-combat depth (items and damage types) is still open; the backlog lives in a single to-do document. Manager of Legends is not affiliated with Riot Games.

02

2026 · en desarrolloin development · Rust/WASM · React + Three.js

Motor de partidaMatch engine

Un simulador de entrenador MOBA: los héroes juegan solos y tú das las órdenes.A MOBA coach simulator: the heroes play on their own and you give the orders.

Porté a Rust Shotcaller, un MOBA hecho en Godot por el equipo Spicy Lobster y publicado con licencia no comercial, y lo convertí en un simulador de entrenador. Tú das órdenes de macro; un rival controlado por IA juega con la misma información que tú.I ported Shotcaller, a MOBA made in Godot by the Spicy Lobster team and published under a non-commercial licence, to Rust and turned it into a coach simulator. You give macro orders; an AI rival plays with the same information you have.

tick 0 / 9000
líderes azulesblue leaders líderes rojosred leaders edificio azulblue building edificio rojored building caídodown
FIG. 2 Una partida real grabada desde el motor: IA contra IA, semilla 20026, 9.000 ticks (5 minutos de juego a 30 Hz). En tinta, las trazas se desvanecen al envejecer; en papel ves el registro completo con marcas de minuto. Los tramos sin movimiento pasan en avance rápido. A real match recorded from the engine: AI versus AI, seed 20026, 9,000 ticks (5 minutes of play at 30 Hz). In ink mode the trails fade as they age; in paper mode you see the full record with minute marks. Stretches without movement fast-forward. fuentesource · crates/engine · MatchConfig::three_lane(20026) · muestreado cada 30 ticks · port de Shotcallersampled every 30 ticks · port of Shotcaller (Spicy Lobster team, PolyForm Noncommercial)
35klíneas de Rustlines of Rust
513teststests
30 Hztick fijofixed tick
10tipos de ordenorder types
del cuaderno · bolifrom the notebook · ballpointLa foto estaba del revés. Un plano dentro de un rectángulo de pantalla, «0,0» en una esquina y otra vez sobre el plano, y dos nombres de Godot: «global_position» y «get_local_mouse_position()», con «global» debajo.The photo was upside down. A plane inside a screen rectangle, “0,0” at one corner and again above the plane, and two Godot names: “global_position” and “get_local_mouse_position()”, with “global” underneath.
ProblemaProblem

El original, en GDScript, se apoyaba en corrutinas de Godot y en llamadas aleatorias repartidas por varios scripts, así que una partida no se podía reproducir tick a tick.The original GDScript relied on Godot coroutines and random calls spread across several scripts, so a match could not be replayed tick by tick.

DecisiónDecision

Un tick fijo de 30 Hz con un orden de fases estricto (entradas, plan GOAP, cola de eventos, movimiento, colisión, impacto, resolución), una sola RNG con semilla, un planificador GOAP con profundidad máxima 32 y búsqueda de caminos JPS con desempates estables. El rival solo ve lo que ve su equipo.A fixed 30 Hz tick with a strict phase order (inputs, GOAP plan, event queue, move, collide, hit, resolve), a single seeded RNG, a GOAP planner bounded at depth 32 and JPS pathfinding with stable tie-breaking. The rival only sees what its team sees.

ResultadoResult

Misma semilla, misma partida. 206 commits míos en unas cuatro semanas, 513 tests en Rust, órdenes tipadas con ciclo de vida propio y un HUD de entrenador en React y Three.js.Same seed, same match. 206 of my commits in about four weeks, 513 Rust tests, typed orders with their own lifecycle and a coach HUD in React and Three.js.

lo que aún no hacewhat it doesn't do yetLa jungla y la parte de producto siguen pendientes. El diseño original y todo el arte son de Shotcaller; mi parte es el port a Rust/WASM, la web y la capa de entrenador.The jungle and the product layer are still pending. The original design and all art belong to Shotcaller; my part is the Rust/WASM port, the web shell and the coaching layer.

03

2026 · v0.6 · JavaScript · three.js · Web Workers · MPL-2.0

Voxelizer

Sueltas un sprite de pixel art y sale un modelo 3D de vóxeles optimizado.Drop in a pixel-art sprite and get an optimised 3D voxel model.

Una herramienta sin instalación para quien hace juegos: exporta a MagicaVoxel, Blender o cualquier motor. Sin IA generativa, solo geometría determinista.A no-install tool for people who make games: it exports to MagicaVoxel, Blender or any engine. No generative AI, just deterministic geometry.

Interfaz de Voxelizer con un mago de pixel art convertido en vóxeles.
FIG. 3 La demo oficial: un sprite de 64×64 se convierte en 10.674 vóxeles y su malla pasa de 4.514 a 741 caras (−84 %) en 11 ms. En la FIG. 0 tienes el mismo motor funcionando con mi sapo. The official demo: a 64×64 sprite becomes 10,674 voxels and its mesh goes from 4,514 to 741 faces (−84%) in 11 ms. FIG. 0 runs the same engine on my frog.
253tests en verdepassing tests
−84 %caras (demo)faces (demo)
6perfiles de volumendepth profiles
4formatosformats
ProblemaProblem

Pasar pixel art a 3D a mano es lento, y las herramientas con IA inventan volumen y no respetan los píxeles.Turning pixel art into 3D by hand is slow, and AI tools invent volume and ignore the pixels.

DecisiónDecision

Todo es matemática: transformada de distancia de Felzenszwalb–Huttenlocher para el volumen, casco visual cuando hay vistas laterales, greedy meshing para fusionar caras y oclusión ambiental por esquina. Lo pesado va en Web Workers.It is all maths: a Felzenszwalb–Huttenlocher distance transform for volume, a visual hull when side views exist, greedy meshing to merge faces and per-corner ambient occlusion. The heavy work runs in Web Workers.

ResultadoResult

Exporta VOX, OBJ, GLB y FBX, con CI en GitHub Actions. Un colaborador externo añadió niveles de detalle en un PR que revisé y fusioné. Empezó como un script en Python (sprite2voxel.py) para el Tactical Prototype.It exports VOX, OBJ, GLB and FBX, with CI on GitHub Actions. An outside contributor added levels of detail in a PR that I reviewed and merged. It started as a Python script (sprite2voxel.py) for the Tactical Prototype.

lo que aún no hacewhat it doesn't do yetCon sprites reales llenos de accesorios finos (bastones, espadas) la reconstrucción aún no es del todo predecible; el mapa de confianza y la separación del código están en el roadmap.With real sprites full of thin props (staffs, swords) reconstruction is not fully predictable yet; the confidence map and a code split are on the roadmap.

04

2026 · prototipo técnicotechnical prototype v0.4 · JavaScript · Canvas 2D · SVG · WebGL2

Sports Face

Un código de texto es una cara: siempre la misma, en 2D o en 3D.A text code is a face: always the same one, in 2D or in 3D.

Retratos procedurales para un juego de gestión deportiva: el mismo código dibuja siempre al mismo jugador, con renderizadores intercambiables en Canvas 2D, SVG y WebGL2.Procedural portraits for a sports-management game: the same code always draws the same player, with interchangeable Canvas 2D, SVG and WebGL2 renderers.

FaceDNA
SF2~…
FIG. 4 El nombre pasa por un hash FNV-1a y un generador Mulberry32 por rasgo. La edad cambia la apariencia, nunca la identidad: sube o baja años y sigue siendo la misma persona. Es el código original del proyecto, sin tocar. The name goes through an FNV-1a hash and a Mulberry32 generator per feature. Age changes appearance, never identity: add or remove years and it is still the same person. This is the project's original code, untouched. fuentesource · face-generator/src/face-model.js + renderer.js (GPL-2.0), sin cambiosunchanged
Diez retratos de la línea base, cada uno con su edad y su código SF2.
Diez de las 100 identidades de la línea base congelada (renderizador Canvas 2D, arte propio).Ten of the 100 identities in the frozen baseline (Canvas 2D renderer, my own art).
ProblemaProblem

Un juego de gestión necesita miles de caras distintas y estables: un jugador tiene que ser reconocible temporada tras temporada, también cuando envejece.A management game needs thousands of distinct, stable faces: a player must stay recognisable season after season, including as they age.

DecisiónDecision

Identidad y apariencia empaquetadas en campos de bits (FaceDNA) con un código portable y suma de verificación. Un enrutador elige entre Canvas 2D, SVG toon, dos laboratorios de morphing y un renderizador WebGL2.Identity and appearance packed into bit fields (FaceDNA) with a portable code and a checksum. A router picks between Canvas 2D, SVG toon, two morph labs and a WebGL2 renderer.

ResultadoResult

100 identidades congeladas como línea base visual, un renderizador WebGL2 escrito desde cero con su propio lector GLB y un pipeline offline en Python que reduce 200 cabezas a 16 morph targets con PCA (95,26 % de la varianza).100 identities frozen as a visual baseline, a WebGL2 renderer written from scratch with its own GLB parser, and an offline Python pipeline that reduces 200 heads to 16 morph targets with PCA (95.26% of the variance).

lo que aún no hacewhat it doesn't do yetEs un prototipo técnico, no un producto. El estilo toon parte de ToonHead (Johan Melin, CC BY 4.0) y la cabeza 3D base (GNM, de Google) solo admite uso no comercial.It is a technical prototype, not a product. The toon style builds on ToonHead (Johan Melin, CC BY 4.0) and the base 3D head (Google's GNM) is non-commercial only.

05

2024–2026 · Unity 6 · C# · UI Toolkit · en desarrolloin development

Tactical Prototype

Roguelite táctico: piezas de ajedrez sobre un tablero de lógica hexagonal.A tactical roguelite: chess pieces on a hex-logic board.

En 2024 hice un prototipo de combate por hexágonos al estilo D&D, con iniciativa a 1d20. En 2026 llevé esa idea a un núcleo de reglas sin dependencias de Unity, con más líneas de test que de código.In 2024 I built a D&D-style hex combat prototype with 1d20 initiative. In 2026 I took that idea into a rules core with no Unity dependencies and more lines of tests than code.

19 casillas alcanzables con 20 puntos19 tiles reachable with 20 points
carreteraroad difícilrough murowall alcanzable, con su costereachable, with its cost caminopath
FIG. 5 El BFS con costes de terreno que escribí en 2024 para DnD Hex Combat (carretera 5, normal 10, difícil 15, 20 puntos de movimiento) sobre las coordenadas axiales del núcleo de 2026, que lo cita en un comentario: «adapted from DnDHexCombat's GraphSearch». Haz clic (o Enter) en una casilla para ver el camino y otra vez para mover; flechas para el cursor. El port corrige un detalle del original: si encuentra un camino más barato a una casilla ya visitada, la vuelve a propagar. The terrain-cost BFS I wrote in 2024 for DnD Hex Combat (road 5, default 10, rough 15, 20 movement points) on the axial coordinates of the 2026 core, which credits it in a comment: “adapted from DnDHexCombat's GraphSearch”. Click (or press Enter on) a tile to see the path and again to move; arrow keys move the cursor. The port fixes one detail of the original: when it finds a cheaper path to an already visited tile, it propagates it again. fuentesource · GraphSearch.cs (2024) + Game.Core/Pathfinding.cs, Axial.cs (2026), portados a JS con una correcciónported to JS with one fix
5.273líneas de testlines of tests
2.406líneas de núcleolines of core
14personajescharacters
Siete personajes de pixel art del proyecto extruidos a vóxeles.
Sprites del proyecto extruidos con sprite2voxel.py, el antecesor en Python de Voxelizer.Project sprites extruded with sprite2voxel.py, Voxelizer's Python ancestor.
del cuaderno · bolifrom the notebook · ballpointUn racimo de hexágonos numerados (3, 6, 12) y notas: «ficha / plane / efecto aleatorio → toda la mesa», «… → bufo / carta gratis, ej: contrahechizo».A cluster of numbered hexes (3, 6, 12) and notes: “piece / plane / random effect → the whole table”, “… → buff / free card, e.g. counterspell”.
del cuaderno · bolifrom the notebook · ballpointDos viñetas de un turno: «click», «área por donde te puedes mover», «click, se mueve», y, bajo «movimiento», dos flechas: una corta a la viñeta siguiente y otra larga marcada «habilidad».Two panels of a turn: “click”, “area where you can move”, “click, it moves”, and, under “movement”, two arrows: a short one to the next panel and a long one marked “ability”.
ProblemaProblem

En el prototipo de 2024 las reglas vivían dentro de managers singleton de Unity (CombatManager, UnitManager) y no había tests: para comprobar una regla había que darle al Play.In the 2024 prototype the rules lived inside Unity singleton managers (CombatManager, UnitManager) and there were no tests: checking a rule meant pressing Play.

DecisiónDecision

Un núcleo (Game.Core) sin referencias al motor, con coordenadas axiales, una sola fuente de verdad para la ocupación y un contrato de legalidad que comparten el HUD, los resaltados y la ejecución. Cada partida se reproduce con su semilla.A core (Game.Core) with no engine references, axial coordinates, a single source of truth for occupancy and one legality contract shared by the HUD, the highlights and execution. Every run replays from its seed.

ResultadoResult

230/230 tests EditMode y 31/31 PlayMode. Mapa de ruta con semilla al estilo Slay the Spire, recompensas de una entre tres, un jefe por fases y una build de Linux con prueba de humo automática.230/230 EditMode and 31/31 PlayMode tests. A seeded Slay-the-Spire-style route map, pick-one-of-three rewards, a phased boss and a Linux build with an automatic smoke test.

lo que aún no hacewhat it doesn't do yetEl tablero razona en hexágonos pero todavía se dibuja con casillas cuadradas, y los modelos en partida son provisionales.The board reasons in hexes but is still drawn with square tiles, and the in-game models are placeholders.

06

2026 · en producciónin production · Django 6 · PostgreSQL · Docker · Caddy

Viu Manacor

Directorio de comercios y noticias de Manacor, en catalán.A business directory and news portal for Manacor, in Catalan.

El portal local de mi pueblo, hecho de principio a fin por mí: datos, backend, diseño, SEO y el servidor donde corre.My town's local portal, built end to end by me: data, backend, design, SEO and the server it runs on.

…o prueba con una imagen tuya; no sale de tu navegador.…or try an image of your own; it never leaves your browser.
— — — — — — — —

FIG. 6 La extensión de una URL miente. Así se rompieron doce fotos: bytes de SVG guardados como .jpg, que el servidor entregaba como image/jpeg y ningún navegador podía abrir. Desde entonces solo se guarda lo que empieza por la firma de un JPEG o de un PNG. A URL's extension lies. Twelve photos broke this way: SVG bytes saved as .jpg, served as image/jpeg and impossible for any browser to decode. Since then only files that start with a JPEG or PNG signature get saved. fuentesource · comptes/management/commands/fetch_photos.py · SIGNATURES = (FF D8 FF → jpg, 89 50 4E 47 0D 0A 1A 0A → png)
«Un backup que nunca se restauró no es un backup, es una esperanza.»“A backup that was never restored is not a backup, it is a hope.”docs/estado.md · Viu Manacor
del cuaderno · bolifrom the notebook · ballpointEn la misma hoja que las pantallas: parejas de filas de ceros y unos con una raya y otra fila debajo; la primera pareja, tachada.On the same page as the screens: pairs of rows of ones and zeros with a line and another row underneath; the first pair crossed out.
ProblemaProblem

Un directorio local solo sirve si Google lo encuentra y si los datos son buenos. Partía de unas 4.070 filas de comercios sin limpiar.A local directory is only useful if Google finds it and the data is good. I started from about 4,070 uncleaned rows of businesses.

DecisiónDecision

Páginas renderizadas en servidor con URLs limpias y JSON-LD de LocalBusiness; formularios GET normales en vez de HTMX para que todo se indexe; analítica propia sin cookies (Umami); y una restricción en Postgres para que ningún comercio se publique sin foto.Server-rendered pages with clean URLs and LocalBusiness JSON-LD; plain GET forms instead of HTMX so everything gets indexed; self-hosted cookie-free analytics (Umami); and a Postgres constraint so no business goes live without a photo.

ResultadoResult

En producción, con despliegue automático en cada push a main: GitHub Actions construye la imagen, la publica en GHCR y el servidor la levanta detrás de Caddy. Tras un susto con un servidor anterior, el actual nació endurecido, y el backup diario se ha probado restaurándolo de verdad.In production, with automatic deploys on every push to main: GitHub Actions builds the image, pushes it to GHCR and the server runs it behind Caddy. After a scare with a previous server, the current one was hardened from day one, and the daily backup has been tested with a real restore.

lo que aún no hacewhat it doesn't do yetEstá en fase de carga de contenido: 67 comercios reales publicados por ahora, de los 100 preparados para el lanzamiento.It is in the content-loading phase: 67 real businesses published so far, out of the 100 prepared for launch.

1.32022–2026

Juegos y prototiposGames and prototypes

Plataformas, survivors, tácticos y MOBAs, a distintos niveles: Java sin motor (Java2D, terminal), frameworks (libGDX, Phaser) y motores (Godot, Unity). En cada uno digo qué hice yo y qué hizo el equipo.Platformers, survivors, tactics and MOBAs, at different levels: engine-less Java (Java2D, terminal), frameworks (libGDX, Phaser) and engines (Godot, Unity). For each one I say what I did and what the team did.

del cuaderno · rotuladorfrom the notebook · markerControles apuntados en la misma página que «LVL 2»: «↑ SALTAR», «BAJAR», «← IZ.», «→ DER», «2↑ DOBLE SALTO» y «Doble salto o si mantienes salt… más (Hollow Knight)».Controls noted on the same page as “LVL 2”: “↑ SALTAR” (jump), “BAJAR” (down), “← IZ.” (left), “→ DER” (right), “2↑ DOBLE SALTO” (double jump) and “Doble salto o si mantienes salt… más (Hollow Knight)” (double jump, or hold jump… for more).
del cuaderno · lápizfrom the notebook · pencilUn cocodrilo con traje, sombrerito y la lengua fuera. Al lado, «ARQU…» con una flecha que apunta al cocodrilo.A crocodile in a suit and a tiny hat, sticking its tongue out. Beside it, “ARQU…” with an arrow pointing at the crocodile.
Godot 32022–2026Solo · arte propioSolo · my own art

Sapo Mafioso

Un sapo con sombrero y puro caza moscas a lengüetazos en un puerto de grúas hasta llegar al Rey Mosca, un jefe hecho de moscas. Dibujé todo el arte en Photoshop. Doble salto, salto variable, gravedad ×1,5 al caer y una máquina de estados de animación con 6 estados.A frog in a fedora with a cigar lashes flies with his tongue across a harbour of cranes until he reaches the Fly King, a boss made of flies. I drew all the art in Photoshop. Double jump, variable jump, ×1.5 fall gravity and a 6-state animation state machine.

Partida de Catpire Survivors: el mago rodeado de enemigos, con corazones y experiencia en el HUD.
Java 17 · libGDX2025–2026Solo

Catpire Survivors

Un roguelike al estilo Vampire Survivors con build de escritorio y web (GWT). En cada subida de nivel el juego se pausa y reparte tres mejoras al azar de un registro de efectos con patrón Strategy: disparo en abanico, bola eléctrica orbital, velocidad, vida.A Vampire Survivors-style roguelike with desktop and web (GWT) builds. Each level-up pauses the game and deals three random upgrades from a Strategy-pattern effect registry: fan shot, orbiting electro-ball, speed, health.

Tablero isométrico de 8×8 rodeado de lava con dos ejércitos de pixel art.
Godot 32022–2026Equipo 4BitsTeam 4Bits

Isometric Tactics

Táctico por turnos para dos jugadores en un tablero isométrico de 8×8 rodeado de lava. En el repositorio, mi parte es el núcleo de juego (rejilla, AStar2D, actores, habilidades como datos, turnos) y su refactorización en 2026.Two-player turn-based tactics on an 8×8 isometric board ringed by lava. In the repository, my part is the gameplay core (grid, AStar2D, actors, data-driven abilities, turns) and its 2026 refactor.

Plataformas con el campus del colegio CIDE como fondo en parallax.
Java2D2026Solo

Super Cide Bros

Para la fiesta del CIDE 2026. Sobre la base de «My Super Mario Java 2D Game», de Mohamed Talaat (TETOSOFT), separé sistemas y afiné el tacto: gravedad asimétrica (0,002 al subir, 0,005 al caer), salto variable, 4 niveles escritos en ASCII y el campus en parallax de 4 capas.For the CIDE 2026 school party. Building on “My Super Mario Java 2D Game” by Mohamed Talaat (TETOSOFT), I split the systems and tuned the feel: asymmetric gravity (0.002 rising, 0.005 falling), variable jump, 4 levels written in ASCII and the campus as 4-layer parallax.

Sprite de un templario atacando con la espada.
Unity 20222024EquipoTeam

U.Roguelike

Dungeon crawler en pixel art hecho en equipo. Programé los enemigos y el jefe: cada enemigo se compone de cerebro, puños y cara (IA, ataque, animación), con seis arquetipos de IA y un jefe de 13 estados y 2 fases que decide con tiradas ponderadas. El arte y la música no son míos.A team-made pixel-art dungeon crawler. I programmed the enemies and the boss: each enemy is built from a brain, fists and a face (AI, attack, animation), with six AI archetypes and a 13-state, 2-phase boss that decides with weighted rolls. The art and music are not mine.

daño = bruto × 100 / (100 + armadura)
Unity 6 · C#2026Solo

Mobalike

Sandbox de combate MOBA: habilidades definidas como datos (ScriptableObject + fábrica), IA enemiga de 6 estados, daño físico, mágico y verdadero, y disparos cargados. 93 tests unitarios. Arte provisional.A MOBA combat sandbox: data-driven abilities (ScriptableObject + factory), a 6-state enemy AI, physical, magic and true damage, and charged shots. 93 unit tests. Placeholder art.

Java · Hytale2026Solo · mod privadoSolo · private mod

PlayableRaces

Mod de servidor para Hytale con razas de fantasía jugables y compensaciones (el elfo gana maná y velocidad; el monstruo, vida y armadura a cambio de velocidad), un selector dentro del juego y curación invertida para los no muertos: el veneno cura y las pociones hacen daño.A Hytale server mod with playable fantasy races and trade-offs (elves gain mana and speed; monsters gain health and armour at the cost of speed), an in-game picker and inverted healing for the undead: poison heals and potions hurt.

Portada de Animal Expirement: un cerdo, un ratón y un conejo sobre un fondo morado estrellado.
Phaser 32022Equipo de 2Team of 2

Animal Expirement

Tres animales de laboratorio escapan de un científico loco. Programé las tres escenas de juego: una persecución que se acelera con cada poción, un matamarcianos con queso y una subida por plataformas móviles.Three lab animals escape a mad scientist. I programmed all three game scenes: a chase that speeds up with every potion, a cheese-firing shooter and a climb across moving platforms.

PIRATAPIRATE
Java · terminalJava · terminal2025–2026Práctica de claseCoursework

Duelo de insultosInsult duel

Homenaje a Monkey Island para la clase de programación: sprites de bloques ANSI en color, texto a máquina de escribir, sonido y una isla aleatoria de 3 a 7 piratas. Aquí tienes una versión con insultos nuevos, sobre programar.A Monkey Island tribute for programming class: colour ANSI block sprites, typewriter text, sound and a random island of 3 to 7 pirates. Here is a version with new insults, about programming.

1.4fuera de clase y en clasein and out of class

Del cuadernoFrom the notebook

Robots, criaturas, personajes, estudios de anatomía, apuntes de clase e ideas de juego. Son fotos de mis cuadernos, recortadas y recoloreadas según el tema; no he retocado ningún trazo.Robots, creatures, characters, anatomy studies, class notes and game ideas. They are photos of my notebooks, cropped and recoloured for the theme; no stroke has been retouched.

rotuladormarkerRobots a rotulador negro y rojo: de lado, de frente con una cúpula roja y una placa con signos, desde arriba y en perspectiva sobre dos cilindros.Robots in black and red marker: from the side, from the front with a red dome and a plate of glyphs, from above, and in perspective on two cylinders.
lápizpencilArriba, «dia 7» y «tu signo zodiaco»; debajo, un cangrejo mecánico con ojos de prismáticos y patas por segmentos.At the top, “dia 7” and “tu signo zodiaco” (day 7, your star sign); below, a mechanical crab with binocular eyes and segmented legs.
rotuladormarkerRobots de caja con piernas y manos, de una página llena de ellos: son los que andan por los márgenes de esta web.Box robots with legs and hands, from a page full of them: they are the ones walking around this site’s margins.
boliballpointUn robot con gorra junto a una encimera, con algo en la mano; al fondo, una ventana con un gato negro en el alféizar, el mismo que se sienta al pie de esta web.A robot in a cap by a counter, holding something; behind it, a window with a black cat on the sill, the same one that sits at the foot of this site.
lápizpencilUna criatura dentro de una flor abierta; debajo, un capullo tumbado con púas, dos ojos y un zarcillo en espiral.A creature inside an open flower; below, a bud lying on its side with spines, two eyes and a spiral tendril.
lápizpencilUn huevo con alas, el cascarón cuarteado en celdas y una esfera sombreada dentro; arriba, un aro unido con trazos finos.A winged egg, its shell cracked into cells with a shaded sphere inside; above it, a ring joined by thin strokes.
lápizpencilCriaturas-flor: un capullo cerrado, una flor de tres pétalos con pico y ojos, y una flor con cabeza de pájaro sobre un tallo largo.Flower creatures: a closed bud, a three-petal flower with a beak and eyes, and a flower with a bird’s head on a long stem.
lápizpencilDos más: un capullo tumbado con tallos de espinas y una cabeza redonda con cara entre cuatro hojas espinosas en X.Two more: a bud lying on its side with thorny stems, and a round head with a face between four spiny leaves in an X.
rotuladoresmarkersUn ala coloreada con rotuladores rojo, magenta, violeta y verde azulado.A wing coloured with red, magenta, violet and teal markers.
boliballpointUna ranchera de lado y, pegado al morro, un vehículo pequeño y redondeado con una figura con gorra encima.An estate car from the side and, pressed against its front, a small rounded vehicle with a figure in a cap on top.
rotulador fino y lápizfineliner and pencilUn personaje mío: una figura encapuchada con el torso al aire, un cinturón con un medallón y una lanza larga cruzada; sobre su mano abierta flotan unas gotas y el cuerpo acaba en una cola larga que se enrosca. El contorno está pasado a rotulador; la cara, el torso y la lanza siguen a lápiz.One of my characters: a hooded figure with a bare torso, a belt with a medallion and a long spear held across; drops float above the open hand and the body ends in a long curling tail. The outline is inked in fineliner; the face, torso and spear are still in pencil.
lápizpencilCabezas construidas a partir de una esfera, con el plano lateral en círculo y los trazos del cuello.Heads built from a sphere, with the side plane drawn as a circle and the neck strokes.
lápizpencilEstudio de anatomía: una figura de frente, una espalda y dos brazos.Anatomy study: a figure from the front, a back and two arms.
boliballpointDos figuras musculosas, una de frente y otra girada.Two muscular figures, one from the front and one turned.
rotulador, boli y lápizmarker, ballpoint and pencilApuntes de clase, un ejercicio de árboles AVL: el mismo árbol dibujado cinco veces entre flechas, con lazos alrededor de las ramas que se mueven, uno tachado con una X y, a lápiz, «unico elemento». Las cifras de los números de esta web salen de esta página.Class notes, an AVL tree exercise: the same tree drawn five times between arrows, with loops around the branches that move, one crossed out with an X and, in pencil, “unico elemento” (single element). The digits in this site’s numbers come from this page.

ideas de juego · dibujadas a mano en el ordenador · archivos de 2021game ideas · drawn by hand on the computer · 2021 files

«TasioGame»: «rol -> gestión», «comienzas como esbirro», «proteger dungeon», «llegar a boss -> gestionar».“TasioGame”: “rol -> gestión” (role-playing -> management), “comienzas como esbirro” (you start as a minion), “proteger dungeon”, “llegar a boss -> gestionar” (reach boss -> manage).
«BAD ROLE»: «minion -> jefe», una «(mazmorra)» de la que «salir», un mundo de fantasía medieval y «por turnos» subrayado en rojo.“BAD ROLE”: “minion -> jefe” (minion -> boss), a “(mazmorra)” (dungeon) to “salir” (get out of), a medieval fantasy world and “por turnos” (turn-based) underlined in red.
La mazmorra por niveles y lo que se hace en cada sala: «explorar -> atacar -> saquear», «compra-venta», «ranking reputación», «victoria pacifista».The dungeon floor by floor and what you do in each room: “explorar -> atacar -> saquear” (explore -> attack -> loot), “compra-venta” (trading), “ranking reputación”, “victoria pacifista” (pacifist victory).
1.5Herramientas, datos, webTools, data, web

Herramientas y datosTools and data

Herramientas que hice para mí, análisis de datos y plataformas web.Tools I built for myself, data analyses and web platforms.

del cuaderno · bolifrom the notebook · ballpointApuntes de Sistemas Operativos: una tubería con «pid, redirecciona», la tabla de descriptores 0, 1, 2 («standard error») y la palabra «consola» en una caja.Operating Systems notes: a pipe with “pid, redirects”, the file descriptor table 0, 1, 2 (“standard error”) and the word “console” in a box.
  • IA Hub

    Electron · React 19 · TypeScript · 2026

    Uso varias suscripciones de IA para programar y quería ver todos sus límites de uso en un solo sitio. Esta app de escritorio local lee los mismos paneles de uso que ya ves en cada servicio (Claude, Codex, Gemini, OpenCode Go) y muestra cuentas atrás de reinicio y niveles de riesgo: normal por debajo del 60 %, vigilar desde el 60 %, alto desde el 80 %.I use several AI subscriptions for coding and wanted all their usage limits in one place. This local desktop app reads the same usage pages you already see on each service (Claude, Codex, Gemini, OpenCode Go) and shows reset countdowns and risk levels: normal under 60%, watch from 60%, high from 80%.

    Arquitectura por capas, persistencia detrás de un puerto de repositorio y un token de generación que descarta las respuestas obsoletas que llegan tarde. Un colaborador rediseñó la interfaz en un PR que revisé y fusioné.Layered architecture, persistence behind a repository port and a generation token that discards stale responses arriving out of order. A collaborator redesigned the UI in a PR that I reviewed and merged.

    Ventana de IA Hub en modo oscuro con cuatro proveedores y sus medidores de uso.
    Captura real, dentro de una ventana de Hyprland.Real screenshot, inside a Hyprland window.
  • Omarchy plugins

    QML · Quickshell · Python · 2026 · MIT

    Widgets para la barra de mi escritorio (Arch Linux + Hyprland). Git Projects muestra los últimos commits y el estado de CI de mis repos en GitHub y GitLab, con consultas en paralelo y un fichero de estado que se escribe de forma atómica para que el widget nunca lea algo a medias. El segundo es una versión personalizada del widget de agentes de Omarchy.Widgets for my desktop bar (Arch Linux + Hyprland). Git Projects shows the latest commits and CI status of my GitHub and GitLab repos, with parallel queries and a status file written atomically so the widget never reads a half-written file. The second one is a customised version of Omarchy's agents widget.

    Maqueta con la paleta real del plugin.Mock-up using the plugin's real palette.

  • MTG Price Prediction

    Python · pandas · scikit-learn · 2026

    ¿Se puede predecir el precio de una carta de Magic: The Gathering por sus estadísticas? Con 112.632 cartas de Scryfall filtradas a 19.952 criaturas, un Random Forest sobre todo el mercado no sirve: los precios de coleccionista lo rompen. Recortar a cartas de hasta 30 $ baja el error medio de 3,65 $ a 1,11 $, pero el modelo sigue explicando poco del precio (R² 0,22): depende más de la escasez, el arte y la moda que de las estadísticas.Can you predict a Magic: The Gathering card's price from its stats? With 112,632 Scryfall cards filtered to 19,952 creatures, a Random Forest over the whole market fails: collector prices break it. Clipping to cards up to $30 cuts the mean error from $3.65 to $1.11, but the model still explains little of the price (R² 0.22): it depends on scarcity, art and hype more than on stats.

    MAE1,11 $
    R²0,22
    Carta inventada: 4 de maná, 5/5, raraMade-up card: 4 mana, 5/5, rare2,56 $
  • Spawn

    MVP · Node 24 · Express 5 · React 19 · SQLite · 2026

    Un MVP, aún sin abrir al público, de una plataforma gratuita para que equipos pequeños publiquen juegos y herramientas hechos con ayuda de IA importándolos desde GitHub. La diseñé con la seguridad por delante: contraseñas con scrypt y comparación en tiempo constante, OAuth con PKCE que descarta el token tras identificar al usuario, límites por ruta y un contenedor Docker de solo lectura sin privilegios. Las portadas de ejemplo se generan con fórmulas.An MVP, not yet open to the public, of a free platform where small teams publish games and tools made with AI help, imported from GitHub. I designed it security-first: scrypt passwords with constant-time comparison, PKCE OAuth that discards the token after identifying the user, per-route rate limits and a read-only, unprivileged Docker container. The sample covers are generated from formulas.

    Seis portadas procedurales: montañas, forja, bosque, ciudad de neón, hábitat espacial.
    Portadas procedurales en SVG, deterministas.Deterministic procedural SVG covers.
  • Y ademásAlso

    Python · Django · OpenCV

    Portraits AI · pipeline en Python que descarga retratos históricos de 131 monarcas de 11 dinastías, detecta la cara con varios clasificadores Haar y recorta a 512×768 para mods de Crusader Kings III y Europa Universalis. 89 tests.a Python pipeline that downloads historical portraits of 131 monarchs from 11 dynasties, finds the face with several Haar classifiers and crops to 512×768 for Crusader Kings III and Europa Universalis mods. 89 tests. GitHub (nueva pestaña)(new tab)

    ProjectLite · gestor de obras multiempresa en Django para constructoras: clientes, obras, partes de trabajo con importes calculados solos e informes imprimibles.a multi-company Django works manager for builders: clients, sites, time sheets with automatic totals and printable reports.

    Automatización de un ERP heredadoLegacy ERP automation · investigación profesional para automatizar con agentes un ERP antiguo de Windows (UI Automation, OCR y lectura de ficheros binarios).professional research into automating an old Windows ERP with agents (UI Automation, OCR and binary file parsing).

1.6Reglas de la casaHouse rules

Cómo trabajoHow I work

Seis costumbres y dónde se ven.Six habits and where to see them.

del cuaderno · bolifrom the notebook · ballpointControles de dos personajes: «Flamenco → crashlike» y «Tortuga → ratchetlike + lento?», con ×, □, ○ y △ para salto, doble salto, planear o disparo en el aire.Controls for two characters: “Flamingo → Crash-like” and “Turtle → Ratchet-like + slow?”, with ×, □, ○ and △ for jump, double jump, glide or mid-air shot.
01

Primero el papelPaper first

Un nivel a boli (Sapo Mafioso, 2022), mapas y turnos en el cuaderno, especificaciones antes del código (OpenSpec) y decisiones escritas: 21 ADR en Manager of Legends. Lo dibujado a mano en esta web sale de ese cuaderno y de ese nivel; lo demás lo traza el código.A level in ballpoint (Sapo Mafioso, 2022), maps and turns in the notebook, specs before code (OpenSpec) and written decisions: 21 ADRs in Manager of Legends. What is hand-drawn on this site comes from that notebook and that level; the rest is drawn by code.

del cuaderno · boli negro y granatefrom the notebook · black and garnet ballpointUn mapa de salas con puertas y, en granate, la lógica de selección: «puerta 1», «bool esprimera», «seleccionado 2 └> desactivar resto». Hay cruces verdes sobre algunos huecos de las paredes.A map of rooms with doors and, in garnet, the selection logic: “puerta 1” (door 1), “bool esprimera” (is first), “seleccionado 2 └> desactivar resto” (selected 2 └> disable the rest). Green crosses sit on some of the gaps in the walls.
02

Misma semilla, misma partidaSame seed, same match

Mis simulaciones usan una sola RNG con semilla y paso fijo. Si algo falla, se puede repetir; si se puede repetir, se puede testear.My simulations use a single seeded RNG and a fixed step. If something breaks it can be replayed; if it can be replayed it can be tested.

«Un número se lee como un hecho cuando es una suposición.»“A number reads as a fact when it is a guess.”scouting_knowledge.rs
03

Los tests son el contratoTests are the contract

En el Tactical Prototype hay más líneas de test (5.273) que de núcleo (2.406). En Voxelizer, 253 tests; en el motor de partida, 513.The Tactical Prototype has more lines of tests (5,273) than of core (2,406). Voxelizer has 253 tests; the match engine, 513.

04

La IA, como herramientaAI as a tool

Trabajo con agentes de programación, con reglas escritas (AGENTS.md), tests como barrera y revisión humana. Los algoritmos de mis herramientas no usan IA generativa: en Voxelizer lo dice el README.I work with coding agents, with written rules (AGENTS.md), tests as a gate and human review. The algorithms in my tools use no generative AI: Voxelizer’s README says so.

“No generative AI. No hallucinations. Only mathematics and advanced algorithms.”Voxelizer/README.md
05

Decir lo que aún no haceSay what it doesn't do yet

Roadmaps con criterios de salida, listas honestas de deuda técnica y un único documento de pendientes. Por eso cada caso de esta web termina con su interrogante: lo que aún no hace.Roadmaps with exit criteria, honest tech-debt lists and a single backlog document. That is why every case on this site ends with its question mark: what it doesn’t do yet.

06

Producción de verdadReal production

Despliegue continuo, backups probados restaurándolos y lecciones apuntadas cuando algo sale mal.Continuous deployment, backups tested with a real restore and lessons written down when something goes wrong.

«"Deploy verde" ≠ "es lo que corre" si el tag no está pinneado.»“A green deploy ≠ what is running if the tag isn’t pinned.”docs/estado.md · Viu Manacor
1.7hasta 2026to 2026

TrayectoriaPath

  1. AhoraNowFullstack en CorsoftFullstack at Corsoft · DAM dual en el CIDE (Palma). Manager of Legends en beta.DAM work-study diploma at CIDE (Palma). Manager of Legends in beta.
  2. 2026El año de publicarThe shipping year · Viu Manacor en producción, Voxelizer, Tactical Prototype, Sports Face, IA Hub, el motor de partida, Spawn, mods de Hytale y Super Cide Bros para la fiesta del colegio.Viu Manacor in production, Voxelizer, Tactical Prototype, Sports Face, IA Hub, the match engine, Spawn, Hytale mods and Super Cide Bros for the school party.
  3. 2025Empiezo DAM en el CIDEI start DAM at CIDE · Java, SQL y PL/SQL, Django. Catpire Survivors en libGDX.Java, SQL and PL/SQL, Django. Catpire Survivors in libGDX.
    del cuaderno · boli y subrayadoresfrom the notebook · ballpoint and highlightersUn diagrama entidad-relación de clase: «circuito», «gran premio» y «temporada», marcados con subrayador.An entity-relationship diagram from class: “circuito”, “gran premio” and “temporada” (circuit, grand prix, season), highlighted.
  4. 2024DnD Hex Combat · el BFS de la FIG. 5 y U.Roguelike en equipo.the BFS in FIG. 5, plus U.Roguelike with a team.
  5. 2020 – 2022Diseño y Desarrollo de Videojuegos, UdGVideo Game Design and Development, University of Girona · Godot, Unity, Phaser, C++ (un motor del juego de mesa Jaipur) y física en C#. Sapo Mafioso, Isometric Tactics, Animal Expirement.Godot, Unity, Phaser, C++ (an engine for the Jaipur board game) and physics in C#. Sapo Mafioso, Isometric Tactics, Animal Expirement.
    del cuaderno · bolifrom the notebook · ballpointCabecera de unos apuntes: «S.O.» y «1er examen 2022», subrayados.The header of some notes: “S.O.” (operating systems) and “1st exam 2022”, underlined.
  6. Antes y durante los estudiosBefore and during my studiesOtra vida: hosteleríaAnother life: hospitality · camarero en Mallorca, Ibiza y Girona. Aprendí a trabajar bajo presión y a hablar con quien tengo delante.waiter in Mallorca, Ibiza and Girona. I learned to work under pressure and to talk to whoever is in front of me.
  7. 2018 – 2019Ingeniería Informática, UIBComputer Engineering, UIB · Palma.
  8. antes de 2018before 2018Bachillerato científico-tecnológicoSpanish Bachillerato, science and technology track · Mossèn Alcover, Manacor.
lvl2

Aquí no hay jefe final. Hay un correo.No final boss here. Just an email.

Abierto a colaborar en cualquier cosa rara e interesante: sistemas de juego, simulaciones, herramientas o una web que tenga que funcionar de verdad.Open to collaborating on anything weird and interesting: game systems, simulations, tools or a website that has to actually work.

del cuaderno · rotulador negro y granatefrom the notebook · black and maroon markerOtra página de niveles: bajo una plataforma, una flecha que cae hasta «LVL 2», con la nota «CERRADO HASTA MATAR A TODOS?».Another level page: under a platform, an arrow that drops to “LVL 2”, with the note “CERRADO HASTA MATAR A TODOS?” (closed until you kill everyone?).
del cuaderno · lápizfrom the notebook · pencilUn personaje tirado en el suelo, el sombrero a un lado, y «MURIÓ» subrayado con una flecha. Aquí no hace falta llegar a eso.A character lying on the ground, hat to one side, and “MURIÓ” (“he died”) underlined with an arrow. No need to get that far here.