Proyectos
Todos son proyectos propios, de principio a fin: diseño, desarrollo, despliegue, seguridad y mantenimiento. Cada ficha incluye un fragmento de codigo real, tal cual esta en el repositorio — no una maqueta ni una captura de una interfaz.
Y-COREV2 — Gestor de biblioteca de Steam
En desarrolloReescritura desde cero de una app de escritorio para gestionar bibliotecas de Steam, eliminando la deuda tecnica de la version anterior. Monorepo con pnpm workspaces y Turborepo: app de escritorio (Electron + React), landing (Astro) y servicio de actualizaciones en Cloudflare Workers.
El nucleo es un unico punto de entrada IPC (ycore:invoke)
con contrato tipado en Zod: cada canal valida su input y su output
antes y despues de ejecutar el handler, y nunca deja escapar una
excepcion hacia la interfaz — un fallo en el handler vuelve como un
Result serializable, no como un crash. La decision
esta forzada por un script de reglas (check-file-rules.mjs)
que bloquea cualquier otro ipcMain.handle fuera de este
archivo. Arquitectura documentada como ADR; pruebas end-to-end con
Playwright y unitarias con Vitest.
- 53
- commits, primera semana y media
- 1
- punto de entrada IPC en todo el monorepo
- ago 2026
- en desarrollo activo
React · TypeScript · Electron · Zod · Drizzle ORM · Turborepo · Cloudflare Workers
Ver en GitHubasync function runChannel(
registry: Registry,
channel: ChannelName,
rawPayload: unknown,
): Promise<Result<unknown, AppError>> {
const definition = contract[channel];
const parsedInput = definition.input.safeParse(rawPayload);
if (!parsedInput.success) {
return err(appError('ipc.invalid-input', { context: { channel } }));
}
// isKnownChannel() y Registry garantizan la correspondencia 1:1 en runtime
const handler = registry[channel] as (input: unknown) => Promise<Result<unknown, AppError>>;
const result = await handler(parsedInput.data);
if (isErr(result)) return result;
const parsedOutput = definition.output.safeParse(result.value);
if (!parsedOutput.success) {
return err(appError('ipc.invalid-output', { context: { channel } }));
}
return ok(parsedOutput.data);
}
El unico canal ipcMain.handle de todo el monorepo. Todo lo demas pasa por aqui.
0ef6b6c feat(update-worker): panel admin tras Cloudflare Access (F7, ADR-0014)
83d795c feat(desktop): arquitectura de plugins con aislamiento en utility process (F7, ADR-0013)
a53f4f4 chore(repo): registra el scope desktop-e2e y anade el changeset de ADR-0012
1437ec8 feat(desktop): presupuesto de arranque y tamano del instalador medidos en CI (F6, ADR-0012)
e09fa94 feat(desktop): bandeja del sistema y notificaciones nativas de descargas (F6, ADR-0011)
4631a53 feat(desktop): wizard de onboarding del primer arranque (F6, ADR-0010)
Y-CORE + API backend
En produccion
Primera version de la app y su servicio en produccion
(y-core-render-api), con usuarios reales. Gestion de
biblioteca, tienda integrada, gestor de mods, backups,
actualizador automatico, bot de Discord e interfaz en 7 idiomas.
Durante una auditoria propia encontre y corregi tres fallos de seguridad reales: CORS abierto que reflejaba cualquier origen, path traversal en la comunicacion IPC, y ausencia de limite de intentos en la recuperacion de contraseña. El backend usa autenticacion propia por cabecera en vez de JWT, con limite de peticiones y sincronizacion de claves via la API de GitHub.
- 141
- commits
- 3
- vulnerabilidades reales corregidas
- 7
- idiomas en la interfaz
Electron · React · Fastify · Supabase · Discord API
export interface AuthUser {
username: string | null
ipAddress: string
}
async function authPlugin(fastify: FastifyInstance) {
fastify.decorate('authenticate', async (req, reply) => {
const username = req.headers['x-username'] as string | undefined;
req.user = {
username: username || null,
ipAddress: req.ip,
};
});
}
export default fp(authPlugin, { name: 'auth' });
b2aa6ae fix: harden API synchronization and install diagnostics
ed6c112 fix: resolve store 500s (ambiguous category join, invalid telemetry UUID) + production hardening
3d47a60 fix: broken test suite and README env vars for new Render deploy
d1555c7 feat: improve support chat prompt with Y-core-specific troubleshooting
026f238 feat: AI-powered support chat endpoint using Groq
Vanguard — Bot de Discord con agente de IA
En produccionGestion de cuentas compartidas, moderacion, anti-raid y tickets; construido en una jornada de trabajo intensivo. El agente de IA usa function-calling real sobre Groq: el modelo no responde de memoria, decide que herramienta llamar (buscar en la base de conocimiento, buscar una cuenta, crear un ticket) segun la pregunta, limitado por canal y con cooldown para evitar abuso.
Servicio programado que consulta APIs externas cada hora y publica alertas automaticas de juegos gratuitos; panel web de administracion con OAuth2 de Discord.
- 86
- commits en una jornada
- 8
- herramientas distintas del agente de IA
- 1 h
- intervalo del rastreo de ofertas
Node.js · Discord API · OAuth2 · LLM function-calling
Repositorio privadoconst SYSTEM_TOOLS = [
{
type: 'function',
function: {
name: 'search_accounts',
description: 'Buscar credenciales de cuentas compartidas ' +
'cuando el usuario pide UNA CUENTA ESPECIFICA.',
parameters: {
type: 'object',
properties: {
query: { type: 'string', description: 'Juego o plataforma' },
platform: { type: 'string', enum: ['steam', 'netflix', 'gamepass'] },
},
required: ['query'],
},
},
},
// ... 7 herramientas mas: get_memories, create_ticket, send_message
];
53853e7 feat: presence con auriculares (Listening) al conectarse
782f80f chore: remove unused notifiedNames var
0d50a36 feat(free-games): embed con botones, dedup inteligente, sin duplicados
a0233b3 fix: remove welcome embed (nekotina), fix freegames 429 & epic 404
eb0d07e fix: populateMultiSelect not defined & free-games forceCheck missing method
Unity Rewind Tool — herramienta de depuracion
HerramientaGraba el estado del juego frame a frame para retroceder tras un fallo sin necesidad de reproducirlo. Compresion por anclas y diferencias, medida con el profiler de Unity contra grabacion sin comprimir: 91% menos memoria. Tres detectores automaticos de fallos sin configuracion — valores que dejan de ser numeros, objetos que se van del mapa, saltos imposibles entre frames — validados en dos proyectos propios de Unity.
0,73 ms de coste por frame en la escena de referencia con 100
objetos grabados, medido con Unity Profiler el 24 de agosto de
2026. Investigacion de mercado previa: encuesta a unos 30
desarrolladores en comunidades de gamedev antes de escribir
codigo — el registro completo de cada fallo encontrado y resuelto
durante el desarrollo esta documentado en
aprendizaje.md.
- 91%
- menos memoria
- 0,73 ms
- coste por frame, 100 objetos
- 3
- detectores automaticos
C# · Unity · Profiling · Compresion de datos
Repositorio privado/// <summary>
/// Tipos de fallo que se detectan sin configurar nada.
/// Permite activar o desactivar cada clase por separado.
/// </summary>
[Flags]
public enum TiposDeFallo
{
/// No detectar nada automaticamente.
Ninguno = 0,
/// NaN o infinito. Casi siempre una division entre cero
/// que se propaga en silencio por todo lo que toque.
ValorNoNumerico = 1,
/// El objeto se va del mapa: sigue vivo, ya no esta donde deberia.
FueraDelMundo = 2,
}
beb2d5e Los objetos creados durante la partida tambien se graban
1b6f27d Los campos que se reinician a proposito dejan de dar avisos falsos
a214514 Grabar un fotograma cuesta un 21 por ciento menos
fe0e831 El coste real de grabar es once veces el estimado
5448293 Tiny Fighters, el juego que prueba el plugin, y lo que ha encontrado
Y-cinema — Aplicacion de escritorio para streaming
HerramientaApp de Electron con streaming de torrents en tiempo real y transcodificacion integrada via ffmpeg; servicio de scraping empaquetado como recurso independiente dentro de la propia app.
Electron · ffmpeg · Node.js
Repositorio privadoyumman — asistente de IA personal
ExperimentalEjecuta un modelo de lenguaje (Qwen2.5-7B) en local, sin API, con reconocimiento y sintesis de voz integrados.
LLM local · llama.cpp · Reconocimiento de voz
Repositorio privadoPescar y Limpiar — juego para Roblox
PublicadoJuego en solitario; flujo de trabajo con Git, Rojo y Wally fuera del editor, completado en tres dias.
Luau · Roblox · Rojo · Wally
Repositorio privado