I build software by directing AI coding agents (Claude Code). I choose what to work on, set the constraints, decide what gets proposed to other projects and handle the conversation with their maintainers. The agent writes and tests the code. Every pull request below says so in its description.
AnyPS5 · C++20, CMake
A tool that ports PS5 executables to Linux and Windows. My contributions are robustness fixes found with fuzzing and sanitizers. Each one has a regression test.
| Pull request | Status | What it fixes |
|---|---|---|
| #183 fix(relinker): require a full ELF64 header before reading it | Merged | Truncated input files were read past their end |
| #193 fix(relinker): keep ELF bounds checks from overflowing | Merged | Crafted offsets wrapped the bounds check (heap overflow) |
| #213 fix(shader): skip the push constant copy when there is nothing to copy | Merged | Undefined behaviour reported by UBSan in the shader cache |
| #280 fix(shader): reject SDWA and DPP instructions without their modifier word | Merged | Truncated GPU instructions were read out of bounds |
| #328 fix(json2): reject documents nested deeper than 512 levels | Merged | Deeply nested JSON crashed the process (stack overflow) |
| #412 fix(shader): reject position exports without vertex input info | Merged | A pixel shader exporting a position crashed the recompiler (null pointer) |
| #455 fix(audio): bound ATRAC9 decoding to the superframe | Merged | Corrupt ATRAC9 audio made the decoder read past the game's buffer |
| #488 fix(json2): throw on numbers that overflow a double | Merged | A JSON number like 1e309 became infinity and crashed the process when serialized |
| #352 fix(savedata): reject invalid directory names in sceSaveDataDelete | Merged | ../ in a save name deleted directories outside the save folder |
| #3631 test(json2): destroy the value before constructing over it | Merged | A test leaked a node, reported by LeakSanitizer |
| #3971 fix(libkernel): limit param.json nesting depth | Merged | A param.json with tens of thousands of nested arrays crashed the process (stack overflow) |
My fork, arreina/AnyPS5, adds CI for this work: AddressSanitizer and UBSan jobs, static analysis (cppcheck, clang-tidy), SPIR-V validation, and fuzzers for the ELF reader, x86 and GPU instruction decoders, the shader recompiler, the shader cache, JSON and GPU command packets. They have found more than a dozen bugs; the ones not yet reported are queued.
Issues I reported:
| Issue | Status | What it is |
|---|---|---|
| #1276 ANYPS5_ENABLE_SPIRV_TOOLS: CCP turns a constant byte store into an 8-bit OpConstant that the module cannot declare | Fixed in #1343 14 hours later | Found by the recompiler fuzzer; the fix was tested with the shader from the issue |
| #3634 AddressSanitizer on Linux: the PS5 window is the shadow gap, so the guest arena has no free range | Fixed in #3705 (by another contributor) | Sanitizer builds could not allocate guest memory. The fix uses the same approach as the workaround described in the issue: move the guest window out of the shadow gap |
I also ran the AMD tests of #487 on a Radeon RX 580 (Polaris), and a maintainer cited the result when closing it.
On #2709, an intermittent guest_avplayer test failure, I ran 1,000 stress runs under AddressSanitizer and UBSan with no failure on Linux and posted the result. The failure that remained on Windows was fixed by another contributor in #5733.
Coucou · Tauri (Rust, TypeScript)
A desktop companion that shows the state of coding agent sessions (Claude Code, Codex, Gemini CLI and others) at the top of the screen. My contributions are to its Linux version.
| Pull request | Status | What it does |
|---|---|---|
| #104 Linux (X11): keep the island unfocusable and on every workspace | Merged | The overlay no longer steals keyboard focus and follows you across workspaces |
| #110 Pause idle animations, and stop polling for a cursor Linux doesn't have | Merged | Lower idle CPU use |
| #111 Linux: shrink the hidden island to its wake strip, and only take clicks there | Merged | The hidden overlay no longer blocks clicks on the windows below it |
| #105 Add npm run fake-session to try the island without Claude Code | In review | A simulated session for developing and testing without an agent |
| #106 Ignore clicks on a fresh approval card, and wire up Y / N | Closed | Prevented approving a permission request by accident; closed because the project merged the same click guard separately |
LibAtrac9 · C
ATRAC9 audio decoder used by PS4/PS5 emulators.
| Pull request | Status | What it fixes |
|---|---|---|
| #5 Range-check band extension, gradient and channel config parameters | In review (approved by a reviewer) | Corrupt audio frames made the decoder read and write past its own arrays |
Lince · C
A programming language for making video games, with Spanish keywords, so that programming does not require knowing English. Written in plain C with nothing to install to build it (gcc and make); tested on Linux and Windows. The juego module brings a window, 2D drawing, sprites drawn with text, keyboard, mouse and gamepad, sound (WAV and OGG), particles and scenes.
- Hot reload: save the file while the game is running and it updates without closing the window, with the player where they were. Errors show up in the game window.
- Sharing:
lince repartirturns a game into a.zipwith SDL2 inside that runs without installing anything. - Documentation that cannot drift: the manual's examples and the tutorial's steps are real programs that run when the pages are built, and CI fails if a page no longer matches.
Website: arreina.github.io/lince · Tutorial: your first game · Manual
importar "juego"
juego.abrir("Mi juego", 640, 480)
sea x = 320
mientras juego.abierto() {
si juego.tecla("derecha") { x = x + 300 * juego.dt() }
si juego.tecla("izquierda") { x = x - 300 * juego.dt() }
juego.limpiar([20, 24, 48])
juego.circulo(x, 240, 20, "#ffc850")
juego.texto("HOLA", 20, 20, 3)
juego.presentar()
}
- Small, single-topic changes that follow each project's conventions
- Bug fixes come with a regression test where the project has a test suite, checked to fail without the fix
- Only synthetic test data; no proprietary content
- Nothing is published to another project without my review


