16 min de lecturaEspañol

Optimizando Claude Code: Desarrollo Seguro con 98% de Reducción de Tokens

Una inmersión profunda en la optimización de Claude Code para uso en producción: implementando seguridad contra vulnerabilidades RCE, logrando 98% de reducción de tokens con ejecución de código MCP, y adoptando patrones de proxy de Next.js 16.

#Claude Code#IA#Seguridad#Next.js#Optimización#DevTools#Productividad#MCP#TypeScript#React

Optimizando Claude Code: Seguridad, Eficiencia y Patrones Modernos

Publicado: 15 de noviembre, 2025 Tiempo de Lectura: 25 minutos


Resumen Ejecutivo

Después de realizar un análisis profundo de mi configuración de Claude Code en 6 proyectos principales (papamin, gespervis, pabellon, nitaino, portfolio y jayei), descubrí oportunidades significativas de mejora. Este artículo documenta el camino desde el uso básico hasta un entorno de desarrollo con IA de nivel de producción y seguridad reforzada.

Hallazgos Clave:

  • 💰 Optimización de Costos: Reducción del 30-50% usando estratégicamente Haiku 4.5
  • Ganancias de Eficiencia: 98.7% de reducción de tokens mediante patrones de ejecución de código MCP
  • 🔒 Seguridad Reforzada: Mitigación de vulnerabilidades RCE y aplicación de sandbox
  • 📈 Aumento de Productividad: 40-60% de incremento mediante hooks, agentes y skills

Tabla de Contenidos

  1. Análisis del Estado Actual
  2. Vulnerabilidades de Seguridad y Mitigaciones
  3. Patrones de Eficiencia MCP
  4. Patrones de Proxy en Next.js 16
  5. Estrategia de Implementación
  6. Resultados Esperados

1. Análisis del Estado Actual

Lo Que Funciona Bien

Mi configuración de Claude Code (v2.0.42) mostró fundamentos sólidos:

  • 329 sesiones en 7 proyectos (uso activo y productivo)
  • 4 servidores MCP configurados (Playwright, Context7, Prisma, Markitdown)
  • Excelente uso de CLAUDE.md en todos los proyectos
  • Personalización específica por proyecto en nitaino-menu-system
  • Buena gestión de permisos con comandos pre-aprobados

Brechas Críticas Descubiertas

Sin embargo, el análisis reveló funcionalidades principales sin utilizar:

CategoríaConfiguradoDisponibleUtilización
Sistema de Skills00%
Plugins050+0%
Agentes Personalizados00%
Hooks07 tipos0%
Estilos de Salida00%
Comandos Personalizados414% (1/7 proyectos)
Servidores MCP4Bueno

La Llamada de Atención

Revisar las versiones recientes de Claude Code (v1.0.38 hasta v2.0.42) reveló funcionalidades transformadoras que no estaba aprovechando:

  1. Sistema de Hooks (v1.0.38) - Automatizar pruebas, linting, validación de commits
  2. Agentes Personalizados (v2.0.60) - Asistentes de IA especializados
  3. Skills (v2.0.20) - Codificación de flujos de trabajo reutilizables
  4. Haiku 4.5 (v2.0.17) - Modelo eficiente en costos para tareas simples
  5. Modo Sandbox (v2.0.24) - Aislamiento de seguridad para comandos bash

Gasto estimado actual: $50-150/mes (todo Sonnet) Potencial optimizado: $25-75/mes (50% uso de Haiku)


2. Vulnerabilidades de Seguridad y Mitigaciones

El Reporte de Vulnerabilidad RCE

Un reporte crítico de ciberseguridad reveló vulnerabilidades de ejecución remota de código (RCE) en tres extensiones oficiales de Anthropic:

Severidad: CVSS 8.9 (Alta) Vector de Ataque: Inyección de comandos sin sanitizar Afectados: Conector Chrome, conector iMessage, conector Apple Notes

El Problema Central

Estas vulnerabilidades provienen de aceptar entrada externa y pasarla directamente a comandos shell sin validación:

// PATRÓN VULNERABLE (NO USAR)
const userInput = getExternalInput();
exec(`git commit -m "${userInput}"`); // ⚠️ Riesgo de inyección de comandos

Ejemplo de Ataque:

userInput = "test"; rm -rf / #"
# Se convierte en: git commit -m "test"; rm -rf / #"

Implementación de Seguridad Reforzada

1. Habilitar Modo Sandbox (Obligatorio)

El modo sandbox de Claude Code aísla los comandos bash del sistema host:

// ~/.claude/settings.json
{
  "sandbox": {
    "enabled": true,
    "allowUnsandboxedCommands": false
  }
}

Cómo funciona:

  • Los comandos se ejecutan en un entorno aislado
  • Acceso restringido al sistema de archivos
  • Capacidades de red limitadas
  • Aislamiento de procesos

2. Endurecimiento de Permisos

Implementar una estrategia de defensa en profundidad:

// ~/.claude/settings.local.json
{
  "permissions": {
    "deny": [
      "Bash(rm -rf:*)",
      "Bash(sudo:*)",
      "Bash(eval:*)",
      "Bash(> /dev:*)",
      "Bash(mkfs:*)"
    ],
    "ask": [
      "Bash(docker:*)",
      "Bash(npm install:*)",
      "Bash(git push --force:*)",
      "Bash(git reset --hard:*)"
    ],
    "allow": [
      "Bash(git status)",
      "Bash(git diff:*)",
      "Bash(pnpm build)",
      // ... solo comandos seguros
    ]
  }
}

Niveles de Seguridad:

  • Deny (Denegar): Bloqueados completamente (comandos destructivos)
  • Ask (Preguntar): Requiere confirmación explícita del usuario (comandos riesgosos)
  • Allow (Permitir): Operaciones seguras pre-aprobadas

3. Hook de Validación de Seguridad

Crear un hook PreToolUse para validar comandos antes de la ejecución:

#!/bin/bash
# ~/.claude/hooks/PreToolUse.sh

if [ "$TOOL_NAME" = "Bash" ]; then
  # Bloquear patrones peligrosos
  if echo "$TOOL_INPUT" | grep -E '(rm -rf /|sudo rm|eval |> /dev/|:|mkfs)'; then
    echo "❌ BLOQUEADO: Patrón de comando peligroso detectado"
    exit 1
  fi

  # Advertir sobre patrones riesgosos
  if echo "$TOOL_INPUT" | grep -E '(\$\(.*\)|\`.*\`|\|\||&&)'; then
    echo "⚠️  ADVERTENCIA: Sustitución de comandos o encadenamiento detectado"
  fi

  # Validar operaciones force de git
  if echo "$TOOL_INPUT" | grep -q "git push --force"; then
    echo "⚠️  ADVERTENCIA: Force push detectado - asegúrese de que es intencional"
  fi
fi

Beneficios del Hook:

  • Validación en tiempo de ejecución de todos los comandos
  • Detección de amenazas basada en patrones
  • Registro de auditoría
  • Advertencias al usuario para operaciones riesgosas

4. Auditoría de Seguridad de Servidores MCP

Auditar todos los servidores MCP para vulnerabilidades de inyección de comandos:

Servidor MCP Playwright:

  • ✅ Verificar: Sanitización de entrada para URLs
  • ✅ Verificar: Seguridad de evaluación de JavaScript
  • ✅ Verificar: Validación de rutas de archivos

Servidor MCP Prisma:

  • ✅ Verificar: Protección contra inyección SQL
  • ✅ Verificar: Manejo de cadenas de conexión
  • ✅ Verificar: Validación de comandos de migración

Servidor MCP Context7:

  • ✅ Verificar: Exposición de API key
  • ✅ Verificar: Sanitización de parámetros de consulta

Servidor MCP Markitdown:

  • ✅ Verificar: Protección contra path traversal
  • ✅ Verificar: Validación de entrada para operaciones de archivo

3. Eficiencia MCP: 98.7% de Reducción de Tokens

El Problema con el Uso Tradicional de MCP

El enfoque tradicional carga todas las definiciones de herramientas de inicio:

Solicitud → Cargar todas las 50+ definiciones de herramientas (150,000 tokens)
         → El modelo selecciona 1-2 herramientas
         → Ejecutar
         → Resultado (2,000 tokens usados)

Total: 150,000 tokens cargados, 2,000 tokens usados = 98.7% desperdicio

La Solución: Ejecución MCP Basada en Código

El blog de ingeniería de Anthropic reveló un patrón revolucionario: divulgación progresiva mediante ejecución de código.

Patrón: Buscar → Cargar → Ejecutar

En lugar de cargar todo de inicio:

// 1. Buscar herramientas relevantes (tokens mínimos)
const tools = await search_tools("automatización de navegador");

// 2. Cargar solo las definiciones necesarias
const { navigate, screenshot } = await load_tools(tools);

// 3. Ejecutar con flujo de control local
for (const url of urls) {
  await navigate(url);
  const img = await screenshot();

  // La lógica local no consume tokens
  if (meets_criteria(img)) break;
}

Uso de Tokens:

  • Búsqueda: 100 tokens
  • Cargar 2 herramientas: 500 tokens
  • Ejecución local: 0 tokens adicionales
  • Total: 600 tokens vs 150,000 tokens

Estrategia de Implementación

Crear Skill de Ejecución de Código MCP:

# Patrón de Ejecución de Código MCP

## Cuándo Usar
Conjuntos de datos grandes, múltiples llamadas a herramientas, lógica condicional

## Patrón
\`\`\`typescript
// Descubrimiento progresivo de herramientas
const tools = await search_tools("operaciones de base de datos");

// Cargar solo herramientas necesarias
const { query, insert, update } = await load_tools(tools);

// Ejecutar con procesamiento de datos local
const results = await query("SELECT * FROM users WHERE active = true");

// Filtrar localmente (sin costo de tokens)
const filtered = results.filter(u => u.lastLogin > cutoffDate);

// Operaciones por lotes localmente
for (const user of filtered) {
  await update(user.id, { status: 'inactive' });
}
\`\`\`

## Beneficios
- 98% reducción de tokens
- Ejecución más rápida (flujo de control local)
- Procesamiento de datos antes de interacción con modelo
- Mejor manejo de errores

Crear Agente @mcp-executor:

{
  "name": "mcp-executor",
  "description": "Ejecutor eficiente de herramientas MCP usando APIs basadas en código",
  "prompt": "Tienes acceso a servidores MCP mediante ejecución de código. Usa search_tools() para encontrar herramientas relevantes, luego ejecuta mediante código generado. Procesa datos localmente antes de devolver resultados. Disponibles: playwright, context7, prisma, markitdown.",
  "model": "claude-haiku-4-5-20250929"
}

Uso:

@mcp-executor procesar la base de datos gespervis: encontrar todos los estudiantes
inscritos en Otoño 2024, calcular promedio GPA, identificar estudiantes bajo 3.0

El agente:

  1. Busca herramientas de Prisma
  2. Carga solo la herramienta query
  3. Ejecuta consulta
  4. Procesa 10,000 filas localmente (sin costo de tokens)
  5. Devuelve resumen (50 tokens)

Enfoque tradicional: 150,000 tokens Enfoque de ejecución de código: 2,000 tokens Ahorro: 98.7%


4. Patrones de Proxy en Next.js 16

La Funcionalidad Proxy (Anteriormente Middleware)

Next.js 16 introdujo Proxy (renombrado de Middleware) para ejecutar código antes de completar solicitudes.

Configuración Básica

// proxy.ts (raíz del proyecto)
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'

export function proxy(request: NextRequest) {
  // Ejecutar antes del manejador de ruta
  const token = request.cookies.get('auth-token')

  if (!token && request.nextUrl.pathname.startsWith('/dashboard')) {
    return NextResponse.redirect(new URL('/login', request.url))
  }

  // Modificar headers
  const response = NextResponse.next()
  response.headers.set('x-custom-header', 'value')

  return response
}

export const config = {
  matcher: ['/dashboard/:path*', '/api/:path*']
}

Casos de Uso para Mis Proyectos

1. Guardias de Autenticación (gespervis-school, pabellon-fama)

export function proxy(request: NextRequest) {
  const session = request.cookies.get('session')

  // Rutas protegidas
  if (request.nextUrl.pathname.startsWith('/admin')) {
    if (!session || !isValidSession(session.value)) {
      return NextResponse.redirect(new URL('/login', request.url))
    }
  }

  return NextResponse.next()
}

2. Detección de Idioma (jayei, pabellon-fama)

export function proxy(request: NextRequest) {
  const language = request.cookies.get('language')

  if (!language) {
    // Detectar desde header Accept-Language
    const preferred = request.headers.get('accept-language')
    const lang = preferred?.startsWith('es') ? 'es' : 'en'

    const response = NextResponse.next()
    response.cookies.set('language', lang)
    return response
  }

  return NextResponse.next()
}

3. Pruebas A/B (portfolio)

export function proxy(request: NextRequest) {
  const variant = request.cookies.get('experiment-variant')

  if (!variant && request.nextUrl.pathname === '/') {
    // Asignar variante
    const assignedVariant = Math.random() > 0.5 ? 'A' : 'B'

    const response = NextResponse.rewrite(
      new URL(`/experiments/${assignedVariant}`, request.url)
    )
    response.cookies.set('experiment-variant', assignedVariant)
    return response
  }

  return NextResponse.next()
}

4. Headers de Seguridad (todos los proyectos)

export function proxy(request: NextRequest) {
  const response = NextResponse.next()

  // Headers de seguridad
  response.headers.set('X-Frame-Options', 'DENY')
  response.headers.set('X-Content-Type-Options', 'nosniff')
  response.headers.set('Referrer-Policy', 'strict-origin-when-cross-origin')
  response.headers.set(
    'Content-Security-Policy',
    "default-src 'self'; script-src 'self' 'unsafe-inline'"
  )

  return response
}

Consideraciones de Seguridad

⚠️ Limitaciones Importantes:

  1. No para carga pesada de datos - Proxy agrega latencia a cada solicitud
  2. No es reemplazo de auth apropiado - Usar solo para verificaciones optimistas
  3. El caché no tiene efecto - Opciones de caché de fetch() ignoradas en proxy

Mejores Prácticas:

// ✅ BUENO: Verificación de permisos ligera
export function proxy(request: NextRequest) {
  const hasPermission = request.cookies.get('role') === 'admin'
  if (!hasPermission) {
    return NextResponse.redirect(new URL('/unauthorized', request.url))
  }
  return NextResponse.next()
}

// ❌ MALO: Consulta pesada a base de datos
export function proxy(request: NextRequest) {
  // NO HACER ESTO - agrega latencia a cada solicitud
  const user = await db.users.findUnique({ ... })
  // ...
}

5. Estrategia de Implementación

Fase 1: Refuerzo de Seguridad (90 minutos)

Prioridad: CRÍTICA - Implementar primero

# 1. Habilitar modo sandbox
echo '{
  "alwaysThinkingEnabled": true,
  "sandbox": {
    "enabled": true,
    "allowUnsandboxedCommands": false
  }
}' > ~/.claude/settings.json

# 2. Crear directorio de hooks de seguridad
mkdir -p ~/.claude/hooks

# 3. Crear hook de validación PreToolUse
cat > ~/.claude/hooks/PreToolUse.sh << 'EOF'
#!/bin/bash
if [ "$TOOL_NAME" = "Bash" ]; then
  # Bloquear patrones peligrosos
  if echo "$TOOL_INPUT" | grep -E '(rm -rf /|sudo rm|eval )'; then
    echo "❌ BLOQUEADO: Comando peligroso"
    exit 1
  fi
fi
EOF

chmod +x ~/.claude/hooks/PreToolUse.sh

# 4. Auditar servidores MCP
claude mcp list
# Revisar manualmente las definiciones de herramientas de cada servidor

Fase 2: Agentes Personalizados (60 minutos)

Crear asistentes especializados para tareas recurrentes:

mkdir -p ~/.claude/agents

# @reviewer - Revisor de código consciente de seguridad
cat > ~/.claude/agents/reviewer.json << 'EOF'
{
  "description": "Revisor de código consciente de seguridad para TypeScript/React/Next.js",
  "prompt": "Revisor de código senior especializado en:\n- Mejores prácticas de TypeScript/React/Next.js\n- Vulnerabilidades OWASP Top 10\n- Prevención de inyección de comandos\n- Protección XSS y CSRF\n- Validación de entrada\n- Patrones de proxy Next.js 16\n\nMARCAR: eval(), dangerouslySetInnerHTML, comandos shell, entrada no validada.",
  "model": "claude-sonnet-4-5-20250929",
  "disallowedTools": ["Bash"]
}
EOF

# @spanish - Experto en español caribeño (para jayei)
cat > ~/.claude/agents/spanish.json << 'EOF'
{
  "description": "Experto en localización español caribeño",
  "prompt": "Experto en idioma español para Puerto Rico/República Dominicana. Enfoque en:\n- Traducción natural al español caribeño\n- Apropiación cultural\n- SEO en español\n- Texto de accesibilidad\n- Codificación correcta (ñ, á, é, í, ó, ú)",
  "model": "claude-sonnet-4-5-20250929",
  "disallowedTools": ["Bash", "Write"]
}
EOF

# @database - Experto en Prisma (para gespervis)
cat > ~/.claude/agents/database.json << 'EOF'
{
  "description": "Experto en Prisma/PostgreSQL con enfoque en seguridad",
  "prompt": "Experto en bases de datos especializado en:\n- Diseño de esquemas Prisma\n- Prevención de inyección SQL\n- Estrategias de migración\n- Optimización de consultas\n- Validación de entrada\n\nNUNCA usar SQL raw. SIEMPRE usar consultas type-safe de Prisma.",
  "model": "claude-sonnet-4-5-20250929"
}
EOF

# @nextjs - Experto en patrones Next.js 16
cat > ~/.claude/agents/nextjs.json << 'EOF'
{
  "description": "Experto en Next.js 16+ con patrones de proxy",
  "prompt": "Especialista en Next.js 16+ enfocado en:\n- Patrones de Proxy (anteriormente Middleware)\n- Seguridad de Server Actions\n- Manejadores de rutas\n- Flujos de auth con proxy\n- Manipulación de headers\n- Optimización de Turbopack",
  "model": "claude-sonnet-4-5-20250929"
}
EOF

Uso:

# Revisión de código
@reviewer revisar src/components/UserProfile.tsx

# Traducción al español
@spanish traducir este texto de UI a español caribeño: "Welcome back!"

# Ayuda con base de datos
@database diseñar un esquema Prisma para seguimiento de inscripciones estudiantiles

# Patrones de Next.js
@nextjs implementar guardia de auth usando proxy de Next.js 16

Fase 3: Sistema de Skills (60 minutos)

Codificar mejores prácticas como flujos de trabajo reutilizables:

mkdir -p ~/.claude/skills

# Skill 1: Configuración Next.js 16
cat > ~/.claude/skills/nextjs-16-setup.md << 'EOF'
# Configuración de Proyecto Next.js 16+

## Inicialización
\`\`\`bash
pnpm create next-app@latest --turbopack
# Seleccionar: TypeScript ✓, ESLint ✓, Tailwind ✓, App Router ✓, Turbopack ✓
pnpm add lucide-react zod
\`\`\`

## Configuración de Seguridad
1. Crear `.env.local` (NO .env)
2. Agregar a .gitignore: `.env*.local`
3. Usar `NEXT_PUBLIC_*` solo para variables seguras para cliente

## Configuración de Proxy
\`\`\`typescript
// proxy.ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'

export function proxy(request: NextRequest) {
  const token = request.cookies.get('auth-token')
  if (!token && request.nextUrl.pathname.startsWith('/dashboard')) {
    return NextResponse.redirect(new URL('/login', request.url))
  }
  return NextResponse.next()
}

export const config = {
  matcher: ['/dashboard/:path*', '/api/:path*']
}
\`\`\`

## Verificaciones de Calidad
- [ ] `pnpm build` exitoso
- [ ] `pnpm lint` pasa
- [ ] Sin archivos .env en git
- [ ] Proxy configurado
EOF

Fase 4: Optimización de Costos (20 minutos)

Configurar estrategia de selección de modelo:

// ~/.claude/settings.json
{
  "alwaysThinkingEnabled": true,
  "sandbox": {
    "enabled": true,
    "allowUnsandboxedCommands": false
  },
  "modelPreferences": {
    "simple": "claude-haiku-4-5-20250929",
    "review": "claude-sonnet-4-5-20250929",
    "security": "claude-sonnet-4-5-20250929",
    "architecture": "claude-opus-4-20250514"
  }
}

Directrices de Uso:

Tipo de TareaModeloCosto/MTokCuándo Usar
Consultas simplesHaiku$0.80Generación de código, traducciones
Revisión de códigoSonnet$3.00Auditorías de seguridad, arquitectura
Razonamiento complejoSonnet$3.00Diseño de base de datos, i18n
ArquitecturaOpus$15.00Solo refactorizaciones mayores

Ahorros Estimados:

  • Antes: 100% Sonnet = $3.00/MTok promedio
  • Después: 50% Haiku, 45% Sonnet, 5% Opus = $1.65/MTok promedio
  • Ahorro: 45%

6. Resultados Esperados

Impacto Cuantificado

Reducción de Costos

Antes:

  • 100% uso de Sonnet 4
  • Estimado: $50-150/mes
  • Promedio: $3.00/MTok

Después:

  • 50% Haiku, 45% Sonnet, 5% Opus
  • Estimado: $25-75/mes
  • Promedio: $1.65/MTok
  • Ahorro: 30-50%

Eficiencia de Tokens

Uso de MCP:

  • Antes: 150,000 tokens por operación
  • Después: 2,000 tokens por operación
  • Reducción: 98.7%

Ejemplo Práctico:

  • Procesar 10,000 registros de estudiantes de la base de datos gespervis
  • Tradicional: Cargar todas las herramientas Prisma (150k tokens) + procesar (50k tokens) = 200k tokens
  • Ejecución de código: Buscar herramientas (100 tokens) + cargar query (500 tokens) + procesamiento local (0 tokens) = 600 tokens
  • Costo: $0.60 → $0.0005 (99.9% reducción)

Ganancias de Productividad

CaracterísticaImpactoTiempo Ahorrado/Semana
Hooks20-30%4-6 horas
Agentes Personalizados15-25%3-5 horas
Skills10-20%2-4 horas
MCP Eficiente5-10%1-2 horas
Combinado40-60%10-17 horas

Mejoras de Seguridad

  • Protección RCE: Modo sandbox previene inyección de comandos
  • Validación de Entrada: Hook PreToolUse valida todos los comandos
  • Rastro de Auditoría: Todas las operaciones registradas para revisión
  • Seguridad MCP: Servidores auditados para vulnerabilidades
  • Controles de Permisos: Niveles deny/ask/allow implementados

Conclusión

Este viaje de optimización transformó Claude Code de un "asistente útil" a un entorno de desarrollo de nivel de producción:

  1. Seguridad Primero: Mitigación RCE, modo sandbox, validación de entrada
  2. Eficiente en Costos: 30-50% reducción mediante selección estratégica de modelo
  3. Optimizado en Tokens: 98.7% reducción mediante ejecución de código MCP
  4. Productividad Mejorada: 40-60% ganancias mediante automatización
  5. Patrones Modernos: Integración de proxy Next.js 16

Lista de Verificación de Implementación

  • Habilitar modo sandbox
  • Crear hooks de seguridad (PreToolUse)
  • Construir agentes personalizados (@reviewer, @spanish, @database, @nextjs)
  • Codificar skills (configuración Next.js 16, componentes seguros, patrones MCP)
  • Configurar optimización de modelo (Haiku para tareas simples)
  • Crear hooks adicionales (PostToolUse, SessionStart, SessionEnd)
  • Auditar servidores MCP para vulnerabilidades
  • Probar todos los componentes

Próximos Pasos

  1. Semana 1: Implementar refuerzo de seguridad (Fase 1)
  2. Semana 2: Desplegar agentes y skills (Fases 2-4)
  3. Semana 3: Monitorear y optimizar (medir impacto real)
  4. Semana 4: Expandir a los 6 proyectos

Recursos


¿Preguntas? ¿Ideas? ¿Desafíos? Comparte tu viaje de optimización de Claude Code en los comentarios.

Etiquetas: #ClaudeCode #IA #Seguridad #NextJS #Optimización #DevTools #Productividad


Sobre el Autor

Mario Rafael Ayala es un consultor tecnológico independiente especializado en desarrollo asistido por IA y soluciones full-stack con 20+ años de experiencia. Gestiona 6 proyectos activos usando Claude Code y se enfoca en flujos de trabajo de IA de nivel de producción.

Portafolio: https://www.mariorafaelayala.com Proyectos: papamin, gespervis, pabellon, nitaino, portfolio, jayei

MA

Mario Rafael Ayala

Ingeniero de Software Senior con 25+ años de experiencia. Especialista en desarrollo web full-stack, transformación digital y educación tecnológica. Actualmente enfocado en Next.js, TypeScript y soluciones para pequeños negocios.

Artículos Relacionados