diff --git a/README.md b/README.md
index d3b20a2..f944b1d 100644
--- a/README.md
+++ b/README.md
@@ -14,7 +14,7 @@ A professional, bilingual CV site with server-side PDF generation, HTMX interact
**Open Source:** The code is MIT licensed and available for educational purposes. You're welcome to use it as a template or reference for your own projects. This repository is maintained as my personal CV site and may be modified without notice.
-**Contributions:** This is a personal CV project and is feature-complete. I'm not seeking contributions, but you're welcome to use it as a template! If you find a critical security vulnerability, please follow the [responsible disclosure process](docs/HACK-CHALLENGE.md#-responsible-disclosure).
+**Contributions:** This is a personal CV project and is feature-complete. I'm not seeking contributions, but you're welcome to use it as a template! If you find a critical security vulnerability, please report it via email.
## 📑 Table of Contents
@@ -81,24 +81,7 @@ This project demonstrates **production-grade security** practices with multiple
**Security Rating: A- (Very Good)**
-### Try to Hack Me Challenge! 🎯
-
-Think you can break through these defenses? **I welcome ethical hackers and security researchers to test this site.**
-
-**Challenge Categories:**
-1. **Browser-Only Bypass** - Submit a contact form using curl or Postman (Hard ⭐⭐⭐)
-2. **Rate Limit Bypass** - Exceed the rate limits without detection (Medium ⭐⭐)
-3. **Injection Challenge** - Execute code via XSS, command injection, or email header injection (Hard ⭐⭐⭐)
-4. **Bot Detection Bypass** - Submit as a bot without getting caught (Medium ⭐⭐)
-5. **CSRF Challenge** - Submit without a valid token (Hard ⭐⭐⭐)
-
-**Documentation:**
-- **[SECURITY.md](docs/SECURITY.md)** - Complete security architecture and implementation details
-- **[HACK-CHALLENGE.md](docs/HACK-CHALLENGE.md)** - Full hacking challenge rules and guidelines
-
-**Found a vulnerability?** Follow the [responsible disclosure process](docs/HACK-CHALLENGE.md#-responsible-disclosure).
-
-**Hall of Fame:** Valid findings will be acknowledged publicly (with your permission).
+**Documentation:** See [SECURITY.md](docs/SECURITY.md) for complete security architecture and implementation details.
---
@@ -197,7 +180,6 @@ This project includes comprehensive documentation organized by purpose:
### 📋 Policies & Standards
- **[SECURITY.md](docs/SECURITY.md)** - Complete security architecture, implementation, and testing guide
-- **[HACK-CHALLENGE.md](docs/HACK-CHALLENGE.md)** - "Try to Hack Me!" challenge for security researchers
- **[PRIVACY.md](doc/PRIVACY.md)** - Privacy policy template and analytics guidance
- **[CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)** - Community standards (Contributor Covenant)
- **[CONTRIBUTING.md](CONTRIBUTING.md)** - Contribution policy (personal project notice)
@@ -244,7 +226,7 @@ Deployment guides available for:
- `GO_ENV` - Environment (development/production)
- `TEMPLATE_HOT_RELOAD` - Enable template hot-reload in development
-**Security:** See [SECURITY.md](docs/SECURITY.md) for production deployment best practices and [HACK-CHALLENGE.md](docs/HACK-CHALLENGE.md) for penetration testing guidelines.
+**Security:** See [SECURITY.md](docs/SECURITY.md) for production deployment best practices.
## 🎨 Customization
@@ -306,8 +288,7 @@ This project is licensed under the **MIT License** - see the [LICENSE](LICENSE)
## 💬 Questions or Issues?
- **Questions:** Feel free to fork and modify - this is a template!
-- **Security Issues:** See [HACK-CHALLENGE.md](docs/HACK-CHALLENGE.md) for reporting security vulnerabilities
-- **Security Research:** Read the [Try to Hack Me Challenge](docs/HACK-CHALLENGE.md) if you want to test the security
+- **Security Issues:** Report vulnerabilities via email
- **Documentation:** Check [CUSTOMIZATION.md](doc/CUSTOMIZATION.md) and [DEPLOYMENT.md](doc/DEPLOYMENT.md)
## 🙏 Acknowledgments
diff --git a/data/cv-en.json b/data/cv-en.json
index f526ff1..b81f988 100644
--- a/data/cv-en.json
+++ b/data/cv-en.json
@@ -55,7 +55,8 @@
"API Integration"
],
"companyLogo": "olympic-broadcasting.png",
- "shortDescription": "SAP CDC solutions for international broadcasting events. Custom implementations and technical guidance."
+ "shortDescription": "SAP CDC solutions for international broadcasting events. Custom implementations and technical guidance.",
+ "companyID": "olympic-broadcasting"
},
{
"position": "Senior SAP/CDC Technical Consultant",
@@ -82,7 +83,8 @@
"Authentication Systems"
],
"companyLogo": "livgolf.png",
- "shortDescription": "Technical consulting for SAP CDC implementation. Created authorization screens, backend endpoints, and comprehensive documentation."
+ "shortDescription": "Technical consulting for SAP CDC implementation. Created authorization screens, backend endpoints, and comprehensive documentation.",
+ "companyID": "livgolf"
},
{
"position": "Senior Technical Consultant",
@@ -114,7 +116,8 @@
"Managed identity flows for millions of users across web and mobile platforms"
],
"companyLogo": "aena.png",
- "shortDescription": "Lead Technical Consultant for AENA Airports Authentication System serving millions of passengers across all Spanish airports."
+ "shortDescription": "Lead Technical Consultant for AENA Airports Authentication System serving millions of passengers across all Spanish airports.",
+ "companyID": "aena"
},
{
"position": "Senior Technical Consultant",
@@ -140,7 +143,8 @@
"Technical Documentation"
],
"companyLogo": "sap.png",
- "shortDescription": "SAP Customer Data Cloud technical consulting, troubleshooting, and stakeholder education on GDPR compliance."
+ "shortDescription": "SAP Customer Data Cloud technical consulting, troubleshooting, and stakeholder education on GDPR compliance.",
+ "companyID": "sap"
},
{
"position": "Junior Technical Consultant",
@@ -165,7 +169,8 @@
"System Monitoring"
],
"companyLogo": "gigya.png",
- "shortDescription": "Technical support and problem-solving for Gigya platform. System monitoring and training program development."
+ "shortDescription": "Technical support and problem-solving for Gigya platform. System monitoring and training program development.",
+ "companyID": "gigya"
},
{
"position": "Director / Freelance Fullstack Developer",
@@ -196,7 +201,8 @@
"DevOps"
],
"companyLogo": "drosoloft-plain.png",
- "shortDescription": "Freelance work for multiple clients (Megabanner, Ebantic, Everis, Indra) developing React applications, designing APIs, integrating video systems and managing projects."
+ "shortDescription": "Freelance work for multiple clients (Megabanner, Ebantic, Everis, Indra) developing React applications, designing APIs, integrating video systems and managing projects.",
+ "companyID": "drosoloft"
},
{
"position": "Technical Director / Programmer",
@@ -224,7 +230,8 @@
"Successfully managed technical team and product development"
],
"companyLogo": "emailing-network.png",
- "shortDescription": "Technical Director leading development of backend and 5 websites. Reduced production times by 75%."
+ "shortDescription": "Technical Director leading development of backend and 5 websites. Reduced production times by 75%.",
+ "companyID": "emailing-network"
},
{
"position": "Programmer Analyst (Freelance)",
@@ -245,7 +252,8 @@
"JavaScript"
],
"companyLogo": "twentic.png",
- "shortDescription": "WordPress and PHP website development as freelance programmer."
+ "shortDescription": "WordPress and PHP website development as freelance programmer.",
+ "companyID": "twentic"
},
{
"position": "Analyst Programmer / Expert Technician",
@@ -267,7 +275,8 @@
"System Configuration",
"Technical Support"
],
- "shortDescription": "Software and hardware configuration, technical problem-solving, and team mentoring."
+ "shortDescription": "Software and hardware configuration, technical problem-solving, and team mentoring.",
+ "companyID": "pentamsi"
},
{
"position": "Senior Programmer",
@@ -288,7 +297,8 @@
"Search Engine Technology",
"European R&D Projects"
],
- "shortDescription": "European R&D project for revolutionary search engine development."
+ "shortDescription": "European R&D project for revolutionary search engine development.",
+ "companyID": "webratio"
},
{
"position": "Junior Programmer",
@@ -311,7 +321,8 @@
"Data Visualization",
"Chart Generation"
],
- "shortDescription": "JAVA development specialized in data chart generation and applet development."
+ "shortDescription": "JAVA development specialized in data chart generation and applet development.",
+ "companyID": "insa"
}
],
"education": [
@@ -533,96 +544,124 @@
],
"projects": [
{
- "name": "AENA Airports Authentication System",
- "role": "Lead Technical Consultant & Main Developer",
- "url": "https://usuarios.aena.es",
- "period": "2021-2023",
- "description": "Complete authentication and identity management system for all AENA airports in Spain. Handles millions of users across web and mobile platforms.",
+ "title": "Somos Una Ola - Beach Cleaning Initiative",
+ "projectName": "Somos Una Ola",
+ "projectDesc": "Beach Cleaning Initiative",
+ "url": "https://somosunaola.org",
+ "projectLogo": "somosunaola.png",
+ "location": "La Palma, Canary Islands",
+ "startDate": "2023-07",
+ "current": true,
"technologies": [
- "SAP CDC",
- "React",
"Node.js",
- "Authentication",
- "Mobile"
+ "Express.js",
+ "HTMX"
],
- "highlights": [
- "Deployed across all Spanish airports",
- "Handles millions of user authentications",
- "Integrated with multiple AENA digital platforms"
- ]
+ "shortDescription": "Volunteer project promoting beach cleaning on La Palma island. Created their website to publish completed cleanings and schedule future events.",
+ "responsibilities": [
+ "Designed and developed full-stack website using Node.js Express and HTMX",
+ "Implemented event publishing system for completed and upcoming beach cleanings",
+ "Supported environmental initiative that has completed 18 cleanings across 12 beaches"
+ ],
+ "projectID": "somos-una-ola"
},
{
- "name": "SAP Customer Data Cloud Starter Kit",
- "role": "Main Contributor",
- "url": "https://github.com/gigya/cdc-starter-kit",
- "period": "2019-2021",
- "description": "Simple front-end template for building fast, robust, and adaptable web apps or sites, including SAP CDC capabilities. Open-source contribution.",
+ "title": "Herrumbre Vivo Arte - Artist Portfolio Website",
+ "projectName": "Herrumbre Vivo Arte",
+ "projectDesc": "Artist Portfolio Website",
+ "url": "https://herrumbrevivoarte.com",
+ "projectLogo": "herrumbre-vivo.png",
+ "location": "Fuencaliente, La Palma",
+ "startDate": "2024",
+ "current": true,
"technologies": [
- "SAP CDC",
- "React",
- "JavaScript",
- "Template Development"
+ "Web Development",
+ "Portfolio Design"
],
- "highlights": [
- "Open-source contribution to SAP ecosystem",
- "Used by developers worldwide",
- "Simplifies SAP CDC integration"
- ]
+ "shortDescription": "Portfolio website for Gustavo Díaz, artisan who transforms recycled materials into sculptures. Promotes environmental art and sustainable creativity.",
+ "responsibilities": [
+ "Created online presence for recycled art project focused on sustainability",
+ "Showcased sculptures made from metal, plastic, glass, and wood waste",
+ "Highlighted environmental workshops and educational mission aligned with Sustainable Development Goals"
+ ],
+ "projectID": "herrumbre-vivo-arte"
},
{
- "name": "AI-Powered Development Workflows",
- "role": "Independent Research & Development",
- "period": "2023 - Present",
- "description": "Pioneered AI-assisted development workflows using Claude Code and modern tools. Successfully experimented with migrating projects from React to HTMX + Go architecture, reducing complexity while maintaining functionality.",
+ "title": "La Porra.club - Football Prediction Platform",
+ "projectName": "La Porra.club",
+ "projectDesc": "Football Prediction Platform",
+ "url": "https://laporra.club",
+ "projectLogo": "laporra.png",
+ "gitRepoUrl": "/Users/txeo/laporra",
+ "location": "Online",
+ "current": true,
"technologies": [
- "Claude Code",
+ "Node.js",
+ "Hono",
"HTMX",
- "Go",
- "Tailwind CSS",
- "AI APIs",
- "Prompt Engineering"
+ "Panini Templates",
+ "Server-Side Rendering"
],
- "highlights": [
- "Reduced development time by 60% using AI-assisted workflows",
- "Modernized legacy applications with AI guidance",
- "Created reusable patterns for HTMX + Go development"
- ]
+ "shortDescription": "Private invitation-only platform for friends to predict football competition results. Features gamification with digital rewards and competitive scoring system.",
+ "responsibilities": [
+ "Built full-stack application using Node.js, Hono server, and HTMX for reactive frontend",
+ "Implemented server-side rendering with Panini template engine for optimal performance",
+ "Designed prediction algorithm and scoring system with gamification mechanics",
+ "Created private invitation system for exclusive friend group access"
+ ],
+ "projectID": "la-porraclub"
},
{
- "name": "React & Node.js Projects",
- "role": "Technical Lead & Developer",
- "period": "2015-2017",
- "description": "Multiple projects for clients including Megabanner, Cepsa, Cazatucasa",
+ "title": "CDC Starter Kit - SAP Customer Data Cloud Demo",
+ "projectName": "CDC Starter Kit",
+ "projectDesc": "SAP Customer Data Cloud Demo",
+ "url": "https://gigyademo.com/cdc-starter-kit/",
+ "projectLogo": "sap.png",
+ "location": "Online",
+ "startDate": "2018",
+ "current": true,
+ "maintainedBy": "SAP",
"technologies": [
+ "SAP CDC",
+ "JavaScript",
+ "React",
+ "API Integration",
+ "Authentication"
+ ],
+ "shortDescription": "Comprehensive demonstration and starter kit for SAP Customer Data Cloud. Complete implementation showcase created 100% independently as public GitHub resource. Now maintained by SAP.",
+ "responsibilities": [
+ "Designed and developed complete CDC implementation demonstration from scratch as official SAP resource",
+ "Created comprehensive starter kit with authentication, user management, and data flow examples",
+ "Built reusable components and integration patterns for SAP CDC",
+ "Provided technical documentation and best practices for enterprise identity management",
+ "Project now maintained by SAP as official public resource"
+ ],
+ "projectID": "cdc-starter-kit"
+ },
+ {
+ "title": "Third Party Contributions",
+ "url": "",
+ "projectLogo": "",
+ "location": "Various",
+ "startDate": "2015",
+ "endDate": "2016",
+ "current": true,
+ "technologies": [
+ "JavaScript",
"React",
"Node.js",
- "JavaScript",
- "API Development"
- ]
- },
- {
- "name": "Java Enterprise Projects",
- "role": "Technical Lead & Developer",
- "period": "2008-2015",
- "description": "Enterprise applications including Portic.net Regular Lines, III and IV Awards of Music in Extremadura",
- "technologies": [
- "Java",
- "J2EE",
- "Spring",
- "Hibernate"
- ]
- },
- {
- "name": "PHP & WordPress Projects",
- "role": "Web Developer",
- "period": "2012-2015",
- "description": "Multiple web projects including Oferting, Emailing Network, Coupon&Go, Clicplan, Lidering, Delivery Bikes BCN, Jorpack, Gourmet Bus, Moreno y Rubio, Mobbeel, Las Peruchas",
- "technologies": [
"PHP",
"WordPress",
- "MySQL",
- "JavaScript"
- ]
+ "Web Development"
+ ],
+ "shortDescription": "Collection of client projects and websites including Lidering, Jorpack, Delivery Bikes BCN, and Mobbeel where I contributed to development, implementation, and technical solutions across various industries.",
+ "responsibilities": [
+ "
Lidering (via Twentic)
2015: Developed and implemented comprehensive real estate and property management platform with advanced search functionality, property listings, and client management features
",
+ "
Jorpack (via Twentic)
2015: Created corporate website and e-commerce solution for industrial packaging company, featuring product catalog, custom quote system, and business process integration
",
+ "
Delivery Bikes BCN 2016: Built web platform for bicycle delivery service in Barcelona, including route optimization, real-time tracking, and customer booking system
",
+ "Mobbeel 2015: Designed and developed corporate website for biometric authentication and identity verification solutions provider, showcasing security products and enterprise services
"
+ ],
+ "projectID": "third-party-contributions"
}
],
"awards": [
@@ -694,7 +733,8 @@
"responsibilities": [
"Intro to AI Transformers Course April 2024: Comprehensive introduction to transformer architecture and AI models, covering attention mechanisms, encoder-decoder structures, and practical applications in natural language processing
",
"Learn React Course March 2022: Complete React framework training covering components, state management, hooks, lifecycle methods, and modern React development practices
"
- ]
+ ],
+ "courseID": "codecademy-certifications"
},
{
"title": "LinkedIn Learning Certifications",
@@ -710,7 +750,8 @@
"Learning Android Security February 2020: Android security best practices, encryption methods, secure coding practices, and mobile application security fundamentals
",
"Persuasive UX: Creating Credibility January 2020: User experience design principles focused on building trust, credibility, and persuasive design patterns for web applications
",
"Big Data Foundations: Techniques and Concepts December 2019: Fundamentals of big data technologies, distributed computing, data processing frameworks, and analytics techniques
"
- ]
+ ],
+ "courseID": "linkedin-learning-certificatio"
},
{
"title": "Servoy World 2011",
@@ -724,7 +765,8 @@
"Attended conferences on Servoy development",
"Learned about latest features and platform best practices",
"Networked with Servoy developers from around the world"
- ]
+ ],
+ "courseID": "servoy-world-2011"
},
{
"title": "Train the Trainers",
@@ -738,7 +780,8 @@
"Learned advanced didactic methodologies for professional teaching",
"Developed pedagogical skills for technical training delivery",
"Obtained official certification as Professional Trainer"
- ]
+ ],
+ "courseID": "train-the-trainers"
},
{
"title": "Windows 2003 Server",
@@ -752,7 +795,8 @@
"Learned Windows Server 2003 installation and configuration",
"Practiced user and permission management in Active Directory",
"Developed skills in network services administration"
- ]
+ ],
+ "courseID": "windows-2003-server"
},
{
"title": "1st Extremadura Conference on Software Industry",
@@ -766,7 +810,8 @@
"Attended presentations on software industry trends",
"Participated in practical development workshops",
"Networked with regional technology sector professionals"
- ]
+ ],
+ "courseID": "1st-extremadura-conference-on-"
},
{
"title": "Web Application Development: Apache, PHP and MySQL",
@@ -780,98 +825,8 @@
"Learned Apache web server configuration and administration",
"Developed dynamic web applications using PHP",
"Designed and implemented MySQL databases for web applications"
- ]
- }
- ],
- "projects": [
- {
- "title": "Somos Una Ola - Beach Cleaning Initiative",
- "projectName": "Somos Una Ola",
- "projectDesc": "Beach Cleaning Initiative",
- "url": "https://somosunaola.org",
- "projectLogo": "somosunaola.png",
- "location": "La Palma, Canary Islands",
- "startDate": "2023-07",
- "current": true,
- "technologies": ["Node.js", "Express.js", "HTMX"],
- "shortDescription": "Volunteer project promoting beach cleaning on La Palma island. Created their website to publish completed cleanings and schedule future events.",
- "responsibilities": [
- "Designed and developed full-stack website using Node.js Express and HTMX",
- "Implemented event publishing system for completed and upcoming beach cleanings",
- "Supported environmental initiative that has completed 18 cleanings across 12 beaches"
- ]
- },
- {
- "title": "Herrumbre Vivo Arte - Artist Portfolio Website",
- "projectName": "Herrumbre Vivo Arte",
- "projectDesc": "Artist Portfolio Website",
- "url": "https://herrumbrevivoarte.com",
- "projectLogo": "herrumbre-vivo.png",
- "location": "Fuencaliente, La Palma",
- "startDate": "2024",
- "current": true,
- "technologies": ["Web Development", "Portfolio Design"],
- "shortDescription": "Portfolio website for Gustavo Díaz, artisan who transforms recycled materials into sculptures. Promotes environmental art and sustainable creativity.",
- "responsibilities": [
- "Created online presence for recycled art project focused on sustainability",
- "Showcased sculptures made from metal, plastic, glass, and wood waste",
- "Highlighted environmental workshops and educational mission aligned with Sustainable Development Goals"
- ]
- },
- {
- "title": "La Porra.club - Football Prediction Platform",
- "projectName": "La Porra.club",
- "projectDesc": "Football Prediction Platform",
- "url": "https://laporra.club",
- "projectLogo": "laporra.png",
- "gitRepoUrl": "/Users/txeo/laporra",
- "location": "Online",
- "current": true,
- "technologies": ["Node.js", "Hono", "HTMX", "Panini Templates", "Server-Side Rendering"],
- "shortDescription": "Private invitation-only platform for friends to predict football competition results. Features gamification with digital rewards and competitive scoring system.",
- "responsibilities": [
- "Built full-stack application using Node.js, Hono server, and HTMX for reactive frontend",
- "Implemented server-side rendering with Panini template engine for optimal performance",
- "Designed prediction algorithm and scoring system with gamification mechanics",
- "Created private invitation system for exclusive friend group access"
- ]
- },
- {
- "title": "CDC Starter Kit - SAP Customer Data Cloud Demo",
- "projectName": "CDC Starter Kit",
- "projectDesc": "SAP Customer Data Cloud Demo",
- "url": "https://gigyademo.com/cdc-starter-kit/",
- "projectLogo": "sap.png",
- "location": "Online",
- "startDate": "2018",
- "current": true,
- "maintainedBy": "SAP",
- "technologies": ["SAP CDC", "JavaScript", "React", "API Integration", "Authentication"],
- "shortDescription": "Comprehensive demonstration and starter kit for SAP Customer Data Cloud. Complete implementation showcase created 100% independently as public GitHub resource. Now maintained by SAP.",
- "responsibilities": [
- "Designed and developed complete CDC implementation demonstration from scratch as official SAP resource",
- "Created comprehensive starter kit with authentication, user management, and data flow examples",
- "Built reusable components and integration patterns for SAP CDC",
- "Provided technical documentation and best practices for enterprise identity management",
- "Project now maintained by SAP as official public resource"
- ]
- },
- {
- "title": "Third Party Contributions",
- "url": "",
- "projectLogo": "",
- "location": "Various",
- "startDate": "2015",
- "endDate": "2016",
- "current": true,
- "technologies": ["JavaScript", "React", "Node.js", "PHP", "WordPress", "Web Development"],
- "shortDescription": "Collection of client projects and websites including Lidering, Jorpack, Delivery Bikes BCN, and Mobbeel where I contributed to development, implementation, and technical solutions across various industries.",
- "responsibilities": [
- "
Lidering (via Twentic)
2015: Developed and implemented comprehensive real estate and property management platform with advanced search functionality, property listings, and client management features
",
- "
Jorpack (via Twentic)
2015: Created corporate website and e-commerce solution for industrial packaging company, featuring product catalog, custom quote system, and business process integration
",
- "
Delivery Bikes BCN 2016: Built web platform for bicycle delivery service in Barcelona, including route optimization, real-time tracking, and customer booking system
",
- "Mobbeel 2015: Designed and developed corporate website for biometric authentication and identity verification solutions provider, showcasing security products and enterprise services
"
- ]
+ ],
+ "courseID": "web-application-development-ap"
}
],
"references": [
@@ -935,4 +890,4 @@
"format": "JSON Resume Extended",
"language": "en"
}
-}
\ No newline at end of file
+}
diff --git a/data/cv-es.json b/data/cv-es.json
index e395233..6555c1a 100644
--- a/data/cv-es.json
+++ b/data/cv-es.json
@@ -55,7 +55,8 @@
"Integración de APIs"
],
"companyLogo": "olympic-broadcasting.png",
- "shortDescription": "Soluciones SAP CDC para eventos de transmisión internacional. Implementaciones personalizadas y orientación técnica."
+ "shortDescription": "Soluciones SAP CDC para eventos de transmisión internacional. Implementaciones personalizadas y orientación técnica.",
+ "companyID": "olympic-broadcasting"
},
{
"position": "Consultor Técnico Senior SAP/CDC",
@@ -82,7 +83,8 @@
"Sistemas de Autenticación"
],
"companyLogo": "livgolf.png",
- "shortDescription": "Consultoría técnica para implementación SAP CDC. Creación de pantallas de autorización, endpoints backend y documentación completa."
+ "shortDescription": "Consultoría técnica para implementación SAP CDC. Creación de pantallas de autorización, endpoints backend y documentación completa.",
+ "companyID": "livgolf"
},
{
"position": "Consultor Técnico Senior",
@@ -114,7 +116,8 @@
"Gestión de flujos de identidad para millones de usuarios en plataformas web y móviles"
],
"companyLogo": "aena.png",
- "shortDescription": "Consultor Técnico Principal del Sistema de Autenticación de Aeropuertos AENA sirviendo a millones de pasajeros en todos los aeropuertos españoles."
+ "shortDescription": "Consultor Técnico Principal del Sistema de Autenticación de Aeropuertos AENA sirviendo a millones de pasajeros en todos los aeropuertos españoles.",
+ "companyID": "aena"
},
{
"position": "Consultor Técnico Senior",
@@ -140,7 +143,8 @@
"Documentación Técnica"
],
"companyLogo": "sap.png",
- "shortDescription": "Consultoría técnica SAP Customer Data Cloud, resolución de problemas y educación de stakeholders en cumplimiento GDPR."
+ "shortDescription": "Consultoría técnica SAP Customer Data Cloud, resolución de problemas y educación de stakeholders en cumplimiento GDPR.",
+ "companyID": "sap"
},
{
"position": "Consultor Técnico Junior",
@@ -165,7 +169,8 @@
"Monitoreo de Sistemas"
],
"companyLogo": "gigya.png",
- "shortDescription": "Soporte técnico y resolución de problemas para plataforma Gigya. Monitoreo de sistemas y desarrollo de programas de formación."
+ "shortDescription": "Soporte técnico y resolución de problemas para plataforma Gigya. Monitoreo de sistemas y desarrollo de programas de formación.",
+ "companyID": "gigya"
},
{
"position": "Director / Desarrollador Fullstack Freelance",
@@ -196,7 +201,8 @@
"DevOps"
],
"companyLogo": "drosoloft-plain.png",
- "shortDescription": "Trabajo freelance para múltiples clientes (Megabanner, Ebantic, Everis, Indra) desarrollando aplicaciones React, diseñando APIs, integrando sistemas de video y gestionando proyectos."
+ "shortDescription": "Trabajo freelance para múltiples clientes (Megabanner, Ebantic, Everis, Indra) desarrollando aplicaciones React, diseñando APIs, integrando sistemas de video y gestionando proyectos.",
+ "companyID": "drosoloft"
},
{
"position": "Director Técnico / Programador",
@@ -224,7 +230,8 @@
"Gestión exitosa de equipo técnico y desarrollo de productos"
],
"companyLogo": "emailing-network.png",
- "shortDescription": "Director Técnico liderando desarrollo de backend y 5 sitios web. Reducción del 75% en tiempos de producción."
+ "shortDescription": "Director Técnico liderando desarrollo de backend y 5 sitios web. Reducción del 75% en tiempos de producción.",
+ "companyID": "emailing-network"
},
{
"position": "Analista Programador (Freelance)",
@@ -245,7 +252,8 @@
"JavaScript"
],
"companyLogo": "twentic.png",
- "shortDescription": "Desarrollo de sitios web WordPress y PHP como programador freelance."
+ "shortDescription": "Desarrollo de sitios web WordPress y PHP como programador freelance.",
+ "companyID": "twentic"
},
{
"position": "Analista Programador / Técnico Experto",
@@ -267,7 +275,8 @@
"Configuración de Sistemas",
"Soporte Técnico"
],
- "shortDescription": "Configuración de software y hardware, resolución de problemas técnicos y mentoría de equipos."
+ "shortDescription": "Configuración de software y hardware, resolución de problemas técnicos y mentoría de equipos.",
+ "companyID": "pentamsi"
},
{
"position": "Programador Senior",
@@ -288,7 +297,8 @@
"Tecnología de Motores de Búsqueda",
"Proyectos Europeos I+D"
],
- "shortDescription": "Proyecto europeo I+D para desarrollo de motor de búsqueda revolucionario."
+ "shortDescription": "Proyecto europeo I+D para desarrollo de motor de búsqueda revolucionario.",
+ "companyID": "webratio"
},
{
"position": "Programador Junior",
@@ -311,7 +321,8 @@
"Visualización de Datos",
"Generación de Gráficos"
],
- "shortDescription": "Desarrollo JAVA especializado en generación de gráficos de datos y desarrollo de applets."
+ "shortDescription": "Desarrollo JAVA especializado en generación de gráficos de datos y desarrollo de applets.",
+ "companyID": "insa"
}
],
"education": [
@@ -538,96 +549,124 @@
],
"projects": [
{
- "name": "Sistema de Autenticación de Aeropuertos AENA",
- "role": "Consultor Técnico Principal y Desarrollador Principal",
- "url": "https://usuarios.aena.es",
- "period": "2021-2023",
- "description": "Sistema completo de autenticación y gestión de identidad para todos los aeropuertos AENA en España. Gestiona millones de usuarios en plataformas web y móviles.",
+ "title": "Somos Una Ola - Iniciativa de Limpieza de Playas",
+ "projectName": "Somos Una Ola",
+ "projectDesc": "Iniciativa de Limpieza de Playas",
+ "url": "https://somosunaola.org",
+ "projectLogo": "somosunaola.png",
+ "location": "La Palma, Islas Canarias",
+ "startDate": "2023-07",
+ "current": true,
"technologies": [
- "SAP CDC",
- "React",
"Node.js",
- "Autenticación",
- "Móvil"
+ "Express.js",
+ "HTMX"
],
- "highlights": [
- "Desplegado en todos los aeropuertos españoles",
- "Gestiona millones de autenticaciones de usuarios",
- "Integrado con múltiples plataformas digitales AENA"
- ]
+ "shortDescription": "Proyecto de voluntariado que promueve la limpieza de playas en la isla de La Palma. Creación de su sitio web para publicar limpiezas realizadas y programar eventos futuros.",
+ "responsibilities": [
+ "Diseñé y desarrollé sitio web full-stack usando Node.js Express y HTMX",
+ "Implementé sistema de publicación de eventos para limpiezas realizadas y futuras",
+ "Apoyé iniciativa ambiental que ha completado 18 limpiezas en 12 playas diferentes"
+ ],
+ "projectID": "somos-una-ola"
},
{
- "name": "SAP Customer Data Cloud Starter Kit",
- "role": "Contribuidor Principal",
- "url": "https://github.com/gigya/cdc-starter-kit",
- "period": "2019-2021",
- "description": "Plantilla front-end simple para construir aplicaciones o sitios web rápidos, robustos y adaptables, incluyendo capacidades SAP CDC. Contribución de código abierto.",
+ "title": "Herrumbre Vivo Arte - Sitio Web Portfolio de Artista",
+ "projectName": "Herrumbre Vivo Arte",
+ "projectDesc": "Sitio Web Portfolio de Artista",
+ "url": "https://herrumbrevivoarte.com",
+ "projectLogo": "herrumbre-vivo.png",
+ "location": "Fuencaliente, La Palma",
+ "startDate": "2024",
+ "current": true,
"technologies": [
- "SAP CDC",
- "React",
- "JavaScript",
- "Desarrollo de Plantillas"
+ "Desarrollo Web",
+ "Diseño de Portfolio"
],
- "highlights": [
- "Contribución de código abierto al ecosistema SAP",
- "Usado por desarrolladores en todo el mundo",
- "Simplifica la integración de SAP CDC"
- ]
+ "shortDescription": "Sitio web portfolio para Gustavo Díaz, artesano que transforma materiales reciclados en esculturas. Promueve arte ambiental y creatividad sostenible.",
+ "responsibilities": [
+ "Creé presencia online para proyecto de arte reciclado enfocado en sostenibilidad",
+ "Mostré esculturas hechas de desechos metálicos, plásticos, vidrio y madera",
+ "Destaqué talleres ambientales y misión educativa alineada con Objetivos de Desarrollo Sostenible"
+ ],
+ "projectID": "herrumbre-vivo-arte"
},
{
- "name": "Flujos de Trabajo de Desarrollo Potenciados por IA",
- "role": "Investigación y Desarrollo Independiente",
- "period": "2023 - Presente",
- "description": "Desarrollo pionero de flujos de trabajo asistidos por IA usando Claude Code y herramientas modernas. Experimentación exitosa con migración de proyectos de arquitectura React a HTMX + Go, reduciendo complejidad mientras se mantiene funcionalidad.",
+ "title": "La Porra.club - Plataforma de Predicción de Fútbol",
+ "projectName": "La Porra.club",
+ "projectDesc": "Plataforma de Predicción de Fútbol",
+ "url": "https://laporra.club",
+ "projectLogo": "laporra.png",
+ "gitRepoUrl": "/Users/txeo/laporra",
+ "location": "Online",
+ "current": true,
"technologies": [
- "Claude Code",
+ "Node.js",
+ "Hono",
"HTMX",
- "Go",
- "Tailwind CSS",
- "APIs IA",
- "Ingeniería de Prompts"
+ "Plantillas Panini",
+ "Renderizado del Lado del Servidor"
],
- "highlights": [
- "Reducción del 60% en tiempo de desarrollo usando flujos de trabajo asistidos por IA",
- "Modernización de aplicaciones legacy con guía de IA",
- "Creación de patrones reutilizables para desarrollo HTMX + Go"
- ]
+ "shortDescription": "Plataforma privada de acceso por invitación para amigos para predecir resultados de competiciones de fútbol. Incluye gamificación con recompensas digitales y sistema de puntuación competitivo.",
+ "responsibilities": [
+ "Desarrollé aplicación full-stack usando Node.js, servidor Hono y HTMX para frontend reactivo",
+ "Implementé renderizado del lado del servidor con motor de plantillas Panini para rendimiento óptimo",
+ "Diseñé algoritmo de predicción y sistema de puntuación con mecánicas de gamificación",
+ "Creé sistema de invitación privada para acceso exclusivo del grupo de amigos"
+ ],
+ "projectID": "la-porraclub"
},
{
- "name": "Proyectos React y Node.js",
- "role": "Líder Técnico y Desarrollador",
- "period": "2015-2017",
- "description": "Múltiples proyectos para clientes incluyendo Megabanner, Cepsa, Cazatucasa",
+ "title": "CDC Starter Kit - Demo de SAP Customer Data Cloud",
+ "projectName": "CDC Starter Kit",
+ "projectDesc": "Demo de SAP Customer Data Cloud",
+ "url": "https://gigyademo.com/cdc-starter-kit/",
+ "projectLogo": "sap.png",
+ "location": "Online",
+ "startDate": "2018",
+ "current": true,
+ "maintainedBy": "SAP",
"technologies": [
+ "SAP CDC",
+ "JavaScript",
+ "React",
+ "Integración de APIs",
+ "Autenticación"
+ ],
+ "shortDescription": "Demostración completa y kit de inicio para SAP Customer Data Cloud. Proyecto de implementación completa creado 100% de forma independiente como recurso público en GitHub. Ahora mantenido por SAP.",
+ "responsibilities": [
+ "Diseñé y desarrollé demostración completa de implementación de CDC desde cero como recurso oficial de SAP",
+ "Creé kit de inicio integral con autenticación, gestión de usuarios y ejemplos de flujo de datos",
+ "Desarrollé componentes reutilizables y patrones de integración para SAP CDC",
+ "Proporcioné documentación técnica y mejores prácticas para gestión empresarial de identidades",
+ "Proyecto ahora mantenido por SAP como recurso público oficial"
+ ],
+ "projectID": "cdc-starter-kit"
+ },
+ {
+ "title": "Contribuciones a Proyectos de Terceros",
+ "url": "",
+ "projectLogo": "",
+ "location": "Varios",
+ "startDate": "2015",
+ "endDate": "2016",
+ "current": true,
+ "technologies": [
+ "JavaScript",
"React",
"Node.js",
- "JavaScript",
- "Desarrollo de APIs"
- ]
- },
- {
- "name": "Proyectos Java Enterprise",
- "role": "Líder Técnico y Desarrollador",
- "period": "2008-2015",
- "description": "Aplicaciones empresariales incluyendo Portic.net Regular Lines, III y IV Premios de Música en Extremadura",
- "technologies": [
- "Java",
- "J2EE",
- "Spring",
- "Hibernate"
- ]
- },
- {
- "name": "Proyectos PHP y WordPress",
- "role": "Desarrollador Web",
- "period": "2012-2015",
- "description": "Múltiples proyectos web incluyendo Oferting, Emailing Network, Coupon&Go, Clicplan, Lidering, Delivery Bikes BCN, Jorpack, Gourmet Bus, Moreno y Rubio, Mobbeel, Las Peruchas",
- "technologies": [
"PHP",
"WordPress",
- "MySQL",
- "JavaScript"
- ]
+ "Desarrollo Web"
+ ],
+ "shortDescription": "Colección de proyectos de clientes y sitios web incluyendo Lidering, Jorpack, Delivery Bikes BCN y Mobbeel donde contribuí al desarrollo, implementación y soluciones técnicas en diversas industrias.",
+ "responsibilities": [
+ "
Lidering (a través de Twentic)
2015: Desarrollé e implementé plataforma integral de gestión inmobiliaria y propiedades con funcionalidad avanzada de búsqueda, listado de propiedades y gestión de clientes
",
+ "
Jorpack (a través de Twentic)
2015: Creé sitio web corporativo y solución e-commerce para empresa de embalaje industrial, con catálogo de productos, sistema de presupuestos personalizados e integración de procesos de negocio
",
+ "
Delivery Bikes BCN 2016: Construí plataforma web para servicio de entrega en bicicleta en Barcelona, incluyendo optimización de rutas, seguimiento en tiempo real y sistema de reservas para clientes
",
+ "Mobbeel 2015: Diseñé y desarrollé sitio web corporativo para proveedor de soluciones de autenticación biométrica y verificación de identidad, mostrando productos de seguridad y servicios empresariales
"
+ ],
+ "projectID": "contribuciones-a-proyectos-de-"
}
],
"awards": [
@@ -699,7 +738,8 @@
"responsibilities": [
"Intro to AI Transformers Course Abril 2024: Introducción completa a la arquitectura de transformers y modelos de IA, cubriendo mecanismos de atención, estructuras encoder-decoder y aplicaciones prácticas en procesamiento de lenguaje natural
",
"Learn React Course Marzo 2022: Formación completa en React framework cubriendo componentes, gestión de estado, hooks, métodos de ciclo de vida y prácticas modernas de desarrollo con React
"
- ]
+ ],
+ "courseID": "certificaciones-codecademy"
},
{
"title": "Certificaciones LinkedIn Learning",
@@ -715,7 +755,8 @@
"Learning Android Security Febrero 2020: Mejores prácticas de seguridad Android, métodos de encriptación, prácticas de codificación segura y fundamentos de seguridad de aplicaciones móviles
",
"Persuasive UX: Creating Credibility Enero 2020: Principios de diseño de experiencia de usuario enfocados en generar confianza, credibilidad y patrones de diseño persuasivo para aplicaciones web
",
"Big Data Foundations: Techniques and Concepts Diciembre 2019: Fundamentos de tecnologías big data, computación distribuida, frameworks de procesamiento de datos y técnicas de análisis
"
- ]
+ ],
+ "courseID": "certificaciones-linkedin-learn"
},
{
"title": "Servoy World 2011",
@@ -729,7 +770,8 @@
"Asistí a conferencias sobre desarrollo con Servoy",
"Aprendí sobre las últimas características y mejores prácticas de la plataforma",
"Hice networking con desarrolladores Servoy de todo el mundo"
- ]
+ ],
+ "courseID": "servoy-world-2011"
},
{
"title": "Formador de Formadores",
@@ -743,7 +785,8 @@
"Aprendí metodologías didácticas avanzadas para la enseñanza profesional",
"Desarrollé habilidades pedagógicas para impartir formación técnica",
"Obtuve certificación oficial como Formador de Formadores"
- ]
+ ],
+ "courseID": "formador-de-formadores"
},
{
"title": "Windows 2003 Server",
@@ -757,7 +800,8 @@
"Aprendí instalación y configuración de Windows Server 2003",
"Practiqué gestión de usuarios y permisos en Active Directory",
"Desarrollé habilidades en administración de servicios de red"
- ]
+ ],
+ "courseID": "windows-2003-server"
},
{
"title": "I Jornada Extremeña sobre la Industria del Software",
@@ -771,7 +815,8 @@
"Asistí a ponencias sobre tendencias en la industria del software",
"Participé en talleres prácticos de desarrollo",
"Hice networking con profesionales del sector tecnológico regional"
- ]
+ ],
+ "courseID": "i-jornada-extremea-sobre-la-in"
},
{
"title": "Desarrollo de aplicaciones Web: Apache, PHP y MySQL",
@@ -785,98 +830,8 @@
"Aprendí configuración y administración del servidor web Apache",
"Desarrollé aplicaciones web dinámicas usando PHP",
"Diseñé e implementé bases de datos MySQL para aplicaciones web"
- ]
- }
- ],
- "projects": [
- {
- "title": "Somos Una Ola - Iniciativa de Limpieza de Playas",
- "projectName": "Somos Una Ola",
- "projectDesc": "Iniciativa de Limpieza de Playas",
- "url": "https://somosunaola.org",
- "projectLogo": "somosunaola.png",
- "location": "La Palma, Islas Canarias",
- "startDate": "2023-07",
- "current": true,
- "technologies": ["Node.js", "Express.js", "HTMX"],
- "shortDescription": "Proyecto de voluntariado que promueve la limpieza de playas en la isla de La Palma. Creación de su sitio web para publicar limpiezas realizadas y programar eventos futuros.",
- "responsibilities": [
- "Diseñé y desarrollé sitio web full-stack usando Node.js Express y HTMX",
- "Implementé sistema de publicación de eventos para limpiezas realizadas y futuras",
- "Apoyé iniciativa ambiental que ha completado 18 limpiezas en 12 playas diferentes"
- ]
- },
- {
- "title": "Herrumbre Vivo Arte - Sitio Web Portfolio de Artista",
- "projectName": "Herrumbre Vivo Arte",
- "projectDesc": "Sitio Web Portfolio de Artista",
- "url": "https://herrumbrevivoarte.com",
- "projectLogo": "herrumbre-vivo.png",
- "location": "Fuencaliente, La Palma",
- "startDate": "2024",
- "current": true,
- "technologies": ["Desarrollo Web", "Diseño de Portfolio"],
- "shortDescription": "Sitio web portfolio para Gustavo Díaz, artesano que transforma materiales reciclados en esculturas. Promueve arte ambiental y creatividad sostenible.",
- "responsibilities": [
- "Creé presencia online para proyecto de arte reciclado enfocado en sostenibilidad",
- "Mostré esculturas hechas de desechos metálicos, plásticos, vidrio y madera",
- "Destaqué talleres ambientales y misión educativa alineada con Objetivos de Desarrollo Sostenible"
- ]
- },
- {
- "title": "La Porra.club - Plataforma de Predicción de Fútbol",
- "projectName": "La Porra.club",
- "projectDesc": "Plataforma de Predicción de Fútbol",
- "url": "https://laporra.club",
- "projectLogo": "laporra.png",
- "gitRepoUrl": "/Users/txeo/laporra",
- "location": "Online",
- "current": true,
- "technologies": ["Node.js", "Hono", "HTMX", "Plantillas Panini", "Renderizado del Lado del Servidor"],
- "shortDescription": "Plataforma privada de acceso por invitación para amigos para predecir resultados de competiciones de fútbol. Incluye gamificación con recompensas digitales y sistema de puntuación competitivo.",
- "responsibilities": [
- "Desarrollé aplicación full-stack usando Node.js, servidor Hono y HTMX para frontend reactivo",
- "Implementé renderizado del lado del servidor con motor de plantillas Panini para rendimiento óptimo",
- "Diseñé algoritmo de predicción y sistema de puntuación con mecánicas de gamificación",
- "Creé sistema de invitación privada para acceso exclusivo del grupo de amigos"
- ]
- },
- {
- "title": "CDC Starter Kit - Demo de SAP Customer Data Cloud",
- "projectName": "CDC Starter Kit",
- "projectDesc": "Demo de SAP Customer Data Cloud",
- "url": "https://gigyademo.com/cdc-starter-kit/",
- "projectLogo": "sap.png",
- "location": "Online",
- "startDate": "2018",
- "current": true,
- "maintainedBy": "SAP",
- "technologies": ["SAP CDC", "JavaScript", "React", "Integración de APIs", "Autenticación"],
- "shortDescription": "Demostración completa y kit de inicio para SAP Customer Data Cloud. Proyecto de implementación completa creado 100% de forma independiente como recurso público en GitHub. Ahora mantenido por SAP.",
- "responsibilities": [
- "Diseñé y desarrollé demostración completa de implementación de CDC desde cero como recurso oficial de SAP",
- "Creé kit de inicio integral con autenticación, gestión de usuarios y ejemplos de flujo de datos",
- "Desarrollé componentes reutilizables y patrones de integración para SAP CDC",
- "Proporcioné documentación técnica y mejores prácticas para gestión empresarial de identidades",
- "Proyecto ahora mantenido por SAP como recurso público oficial"
- ]
- },
- {
- "title": "Contribuciones a Proyectos de Terceros",
- "url": "",
- "projectLogo": "",
- "location": "Varios",
- "startDate": "2015",
- "endDate": "2016",
- "current": true,
- "technologies": ["JavaScript", "React", "Node.js", "PHP", "WordPress", "Desarrollo Web"],
- "shortDescription": "Colección de proyectos de clientes y sitios web incluyendo Lidering, Jorpack, Delivery Bikes BCN y Mobbeel donde contribuí al desarrollo, implementación y soluciones técnicas en diversas industrias.",
- "responsibilities": [
- "
Lidering (a través de Twentic)
2015: Desarrollé e implementé plataforma integral de gestión inmobiliaria y propiedades con funcionalidad avanzada de búsqueda, listado de propiedades y gestión de clientes
",
- "
Jorpack (a través de Twentic)
2015: Creé sitio web corporativo y solución e-commerce para empresa de embalaje industrial, con catálogo de productos, sistema de presupuestos personalizados e integración de procesos de negocio
",
- "
Delivery Bikes BCN 2016: Construí plataforma web para servicio de entrega en bicicleta en Barcelona, incluyendo optimización de rutas, seguimiento en tiempo real y sistema de reservas para clientes
",
- "Mobbeel 2015: Diseñé y desarrollé sitio web corporativo para proveedor de soluciones de autenticación biométrica y verificación de identidad, mostrando productos de seguridad y servicios empresariales
"
- ]
+ ],
+ "courseID": "desarrollo-de-aplicaciones-web"
}
],
"references": [
@@ -940,4 +895,4 @@
"format": "JSON Resume Extended",
"language": "es"
}
-}
\ No newline at end of file
+}
diff --git a/data/ui-en.json b/data/ui-en.json
index d2d3a36..d8e4c02 100644
--- a/data/ui-en.json
+++ b/data/ui-en.json
@@ -121,6 +121,10 @@
},
"actions": {
"title": "Actions",
+ "cmdK": {
+ "key": "⌘/Ctrl K",
+ "description": "Open command bar"
+ },
"print": {
"key": "Ctrl / Cmd + P",
"description": "Print or save as PDF"
@@ -187,6 +191,38 @@
"title": "Error"
}
},
+ "cmdK": {
+ "placeholder": "Type a command or search...",
+ "noResults": "No results found",
+ "sections": {
+ "navigation": "Navigation",
+ "shortcuts": "Shortcuts",
+ "downloads": "Downloads"
+ },
+ "actions": {
+ "jumpToExperience": "Jump to Experience",
+ "jumpToEducation": "Jump to Education",
+ "jumpToSkills": "Jump to Skills",
+ "jumpToProjects": "Jump to Projects",
+ "jumpToCourses": "Jump to Courses",
+ "jumpToLanguages": "Jump to Languages",
+ "jumpToAwards": "Jump to Awards",
+ "toggleLength": "Toggle CV Length",
+ "toggleIcons": "Toggle Icons",
+ "toggleTheme": "Toggle Theme",
+ "showShortcuts": "Show Keyboard Shortcuts",
+ "print": "Print CV",
+ "downloadPdfShort": "Download PDF (Short)",
+ "downloadPdfDefault": "Download PDF (Default)",
+ "downloadPdfExtended": "Download PDF (Extended)",
+ "viewTextCv": "View Text CV",
+ "downloadTextCv": "Download Text CV"
+ },
+ "button": {
+ "tooltip": "Command Bar",
+ "ariaLabel": "Open command bar (Cmd+K)"
+ }
+ },
"widgets": {
"backToTop": {
"ariaLabel": "Back to top",
@@ -232,7 +268,9 @@
"downloadPdf": "Download as PDF",
"printFriendly": "Print Friendly",
"plainText": "Plain Text",
- "contact": "Contact"
+ "contact": "Contact",
+ "search": "Search",
+ "searchAriaLabel": "Open command bar (Cmd+K)"
}
}
}
diff --git a/data/ui-es.json b/data/ui-es.json
index 3552e1c..17fda97 100644
--- a/data/ui-es.json
+++ b/data/ui-es.json
@@ -121,6 +121,10 @@
},
"actions": {
"title": "Acciones",
+ "cmdK": {
+ "key": "⌘/Ctrl K",
+ "description": "Abrir barra de comandos"
+ },
"print": {
"key": "Ctrl / Cmd + P",
"description": "Imprimir o guardar como PDF"
@@ -187,6 +191,38 @@
"title": "Error"
}
},
+ "cmdK": {
+ "placeholder": "Escribe un comando o busca...",
+ "noResults": "No se encontraron resultados",
+ "sections": {
+ "navigation": "Navegación",
+ "shortcuts": "Atajos",
+ "downloads": "Descargas"
+ },
+ "actions": {
+ "jumpToExperience": "Ir a Experiencia",
+ "jumpToEducation": "Ir a Educación",
+ "jumpToSkills": "Ir a Habilidades",
+ "jumpToProjects": "Ir a Proyectos",
+ "jumpToCourses": "Ir a Cursos",
+ "jumpToLanguages": "Ir a Idiomas",
+ "jumpToAwards": "Ir a Premios",
+ "toggleLength": "Alternar Longitud del CV",
+ "toggleIcons": "Alternar Iconos",
+ "toggleTheme": "Alternar Tema",
+ "showShortcuts": "Mostrar Atajos de Teclado",
+ "print": "Imprimir CV",
+ "downloadPdfShort": "Descargar PDF (Corto)",
+ "downloadPdfDefault": "Descargar PDF (Por Defecto)",
+ "downloadPdfExtended": "Descargar PDF (Extendido)",
+ "viewTextCv": "Ver CV en Texto",
+ "downloadTextCv": "Descargar CV en Texto"
+ },
+ "button": {
+ "tooltip": "Barra de Comandos",
+ "ariaLabel": "Abrir barra de comandos (Cmd+K)"
+ }
+ },
"widgets": {
"backToTop": {
"ariaLabel": "Volver arriba",
@@ -232,7 +268,9 @@
"downloadPdf": "Descargar como PDF",
"printFriendly": "Imprimir amigable",
"plainText": "Texto Plano",
- "contact": "Contacto"
+ "contact": "Contacto",
+ "search": "Buscar",
+ "searchAriaLabel": "Abrir barra de comandos (Cmd+K)"
}
}
}
diff --git a/doc/16-CMD-K-API.md b/doc/16-CMD-K-API.md
new file mode 100644
index 0000000..47734ad
--- /dev/null
+++ b/doc/16-CMD-K-API.md
@@ -0,0 +1,315 @@
+# CMD+K Command Palette API Documentation
+
+## Overview
+
+The CV application provides a command palette (CMD+K / Ctrl+K) powered by [ninja-keys](https://github.com/nickadam/ninja-keys) web component. Dynamic entries (experiences, projects, courses) are loaded from a backend API endpoint, allowing automatic updates when CV data changes without modifying JavaScript code.
+
+## Architecture
+
+### Design Decision
+
+**API-First Approach**: Rather than hardcoding entries in JavaScript or reading from DOM elements, the command palette fetches its dynamic data from a dedicated API endpoint. This provides:
+
+1. **Automatic Updates**: New CV entries appear in CMD+K without code changes
+2. **Language Support**: API returns localized data based on language parameter
+3. **Cache Efficiency**: 1-hour cache headers reduce redundant requests
+4. **Separation of Concerns**: Frontend only handles rendering; backend owns data
+
+### Data Flow
+
+```
+User opens CMD+K (Ctrl+K / Cmd+K)
+ ↓
+ninja-keys-init.js initializes
+ ↓
+fetch('/api/cmd-k?lang={en|es}')
+ ↓
+Backend loads CV data from JSON files
+ ↓
+Maps experiences, projects, courses to actions
+ ↓
+Returns JSON with action arrays
+ ↓
+Frontend combines with static actions
+ ↓
+ninja-keys displays searchable command palette
+```
+
+## API Endpoint
+
+### GET /api/cmd-k
+
+Returns dynamic entries for the ninja-keys command palette.
+
+**URL**: `/api/cmd-k`
+**Method**: `GET`
+**Authentication**: None (public endpoint)
+
+#### Query Parameters
+
+| Parameter | Type | Default | Description |
+|-----------|------|---------|-------------|
+| `lang` | string | `en` | Language code (`en` or `es`) |
+
+#### Response
+
+**Content-Type**: `application/json`
+**Cache-Control**: `public, max-age=3600` (1 hour)
+
+```json
+{
+ "experiences": [
+ {
+ "id": "exp-olympic-broadcasting",
+ "title": "Olympic Broadcasting Services",
+ "section": "Experience",
+ "keywords": "Olympic Broadcasting Services Senior SAP Technical Consultant"
+ }
+ ],
+ "projects": [
+ {
+ "id": "proj-somos-una-ola",
+ "title": "Somos Una Ola",
+ "section": "Projects",
+ "keywords": "Somos Una Ola Volunteer project promoting beach cleaning..."
+ }
+ ],
+ "courses": [
+ {
+ "id": "course-codecademy-certifications",
+ "title": "Codecademy Certifications",
+ "section": "Courses",
+ "keywords": "Codecademy Certifications Codecademy"
+ }
+ ]
+}
+```
+
+#### Response Fields
+
+| Field | Type | Description |
+|-------|------|-------------|
+| `experiences` | array | Work experience entries |
+| `projects` | array | Personal/professional project entries |
+| `courses` | array | Course and certification entries |
+
+Each entry contains:
+
+| Field | Type | Description |
+|-------|------|-------------|
+| `id` | string | Unique identifier (e.g., `exp-{companyId}`, `proj-{projectId}`) |
+| `title` | string | Display title for the command palette |
+| `section` | string | Section label (`Experience`, `Projects`, `Courses`) |
+| `keywords` | string | Searchable keywords for filtering |
+
+#### Example Requests
+
+```bash
+# English (default)
+curl http://localhost:1999/api/cmd-k
+
+# Spanish
+curl http://localhost:1999/api/cmd-k?lang=es
+
+# With jq formatting
+curl -s http://localhost:1999/api/cmd-k | jq '.'
+
+# Check response headers
+curl -I http://localhost:1999/api/cmd-k
+```
+
+#### Error Responses
+
+| Status | Description |
+|--------|-------------|
+| 500 | Failed to load CV data |
+
+## Frontend Integration
+
+### ninja-keys-init.js
+
+The frontend JavaScript fetches from the API and combines with static actions:
+
+```javascript
+// Fetch dynamic entries from API
+async function fetchDynamicEntries() {
+ try {
+ const response = await fetch(`/api/cmd-k?lang=${lang}`);
+ if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
+ return await response.json();
+ } catch (error) {
+ console.error('Failed to fetch CMD+K data:', error);
+ return { experiences: [], projects: [], courses: [] };
+ }
+}
+
+// Combine with static actions
+const dynamicData = await fetchDynamicEntries();
+const actions = [
+ ...staticActions,
+ ...mapExperienceActions(dynamicData.experiences || []),
+ ...mapProjectActions(dynamicData.projects || []),
+ ...mapCourseActions(dynamicData.courses || [])
+];
+
+ninjaKeys.data = actions;
+```
+
+### Action Mapping
+
+Dynamic entries are converted to ninja-keys actions with handlers:
+
+```javascript
+function mapExperienceActions(experiences) {
+ return experiences.map(exp => ({
+ id: exp.id,
+ title: exp.title,
+ section: exp.section,
+ keywords: `${exp.keywords} work job career`.toLowerCase(),
+ icon: '',
+ handler: () => scrollToSection(exp.id)
+ }));
+}
+```
+
+## Backend Implementation
+
+### Handler: cv_cmdk.go
+
+```go
+// CmdKData returns JSON data for the ninja-keys command palette
+func (h *CVHandler) CmdKData(w http.ResponseWriter, r *http.Request) {
+ lang := r.URL.Query().Get("lang")
+ if lang == "" {
+ lang = "en"
+ }
+ if lang != "en" && lang != "es" {
+ lang = "en"
+ }
+
+ cv, err := models.LoadCV(lang)
+ if err != nil {
+ http.Error(w, "Failed to load CV data", http.StatusInternalServerError)
+ return
+ }
+
+ response := CmdKResponse{
+ Experiences: mapExperiences(cv.Experience),
+ Projects: mapProjects(cv.Projects),
+ Courses: mapCourses(cv.Courses),
+ }
+
+ w.Header().Set("Content-Type", "application/json")
+ w.Header().Set("Cache-Control", "public, max-age=3600")
+ json.NewEncoder(w).Encode(response)
+}
+```
+
+### Route Registration
+
+```go
+// routes/routes.go
+// API routes (must be before "/" to avoid catch-all)
+mux.HandleFunc("/api/cmd-k", cvHandler.CmdKData)
+```
+
+## ID Convention
+
+IDs follow a consistent pattern matching DOM element IDs for scroll targeting:
+
+| Type | Pattern | Example |
+|------|---------|---------|
+| Experience | `exp-{companyId}` | `exp-olympic-broadcasting` |
+| Project | `proj-{projectId}` | `proj-somos-una-ola` |
+| Course | `course-{courseId}` | `course-codecademy-certifications` |
+
+These IDs correspond to HTML element IDs in the page:
+```html
+...
+...
+...
+```
+
+## Static Actions
+
+In addition to dynamic entries, the command palette includes static actions:
+
+### Navigation
+- Jump to Top, Experience, Education, Skills, Projects, Courses, Languages, Awards, Other Info
+
+### Shortcuts
+- Toggle CV Length (L key)
+- Toggle Icons (I key)
+- Toggle Theme (V key)
+- Show Shortcuts Help (? key)
+- Print CV (Cmd+P)
+
+### Downloads
+- Download PDF (Default, Short, Extended versions)
+- View/Download Text CV
+
+### Actions
+- Open Contact Form
+- Show Site Info
+- Toggle Zoom Controls
+- Switch Language (EN/ES)
+- Change Color Theme
+
+### Social Links
+- LinkedIn, GitHub, Domestika, Personal Website
+
+## Testing
+
+### Unit Tests (Go)
+
+Located at `internal/handlers/cv_cmdk_test.go`:
+
+```go
+func TestCmdKData(t *testing.T) {
+ // Tests: Default language, English, Spanish, Invalid language fallback
+ // Validates: Status code, Content-Type, response structure, counts
+}
+
+func TestCmdKDataCaching(t *testing.T) {
+ // Validates Cache-Control header
+}
+```
+
+Run with:
+```bash
+go test ./internal/handlers/ -run TestCmdK -v
+```
+
+### E2E Tests (Playwright/Bun)
+
+Located at `tests/mjs/71-cmd-k-api-scroll.test.mjs`:
+
+Tests:
+1. API returns valid JSON with expected structure
+2. Experience scroll navigation works
+3. Project scroll navigation works
+4. Course scroll navigation works
+5. Section scroll navigation works
+6. Multiple sequential searches work correctly
+
+Run with:
+```bash
+HEADLESS=true bun run tests/mjs/71-cmd-k-api-scroll.test.mjs
+```
+
+## Performance
+
+- **Cache Duration**: 1 hour (reduces API calls on page refresh)
+- **Response Size**: ~2-3 KB (compact JSON)
+- **Load Time**: API fetched during page initialization
+- **Fallback**: Empty arrays returned on error (graceful degradation)
+
+## Files
+
+| File | Purpose |
+|------|---------|
+| `internal/handlers/cv_cmdk.go` | API handler |
+| `internal/handlers/cv_cmdk_test.go` | Unit tests |
+| `internal/routes/routes.go` | Route registration |
+| `static/js/ninja-keys-init.js` | Frontend integration |
+| `tests/mjs/71-cmd-k-api-scroll.test.mjs` | E2E tests |
diff --git a/doc/2-MODERN-WEB-TECHNIQUES.md b/doc/2-MODERN-WEB-TECHNIQUES.md
index 74bf98f..9d89963 100644
--- a/doc/2-MODERN-WEB-TECHNIQUES.md
+++ b/doc/2-MODERN-WEB-TECHNIQUES.md
@@ -3602,4 +3602,144 @@ Test structured data:
---
+### 15. Dynamic Contact Form - HTMX + Hyperscript Pattern
+
+**Problem:** Traditional contact forms either require full page reloads (poor UX) or heavy JavaScript frameworks (React, Vue) for dynamic behavior.
+
+**Solution:** HTMX for server communication + Hyperscript for declarative behavior = dynamic SPA-like experience with zero custom JavaScript.
+
+#### Architecture Overview
+
+```
+┌─────────────────────────────────────────────────────────────────┐
+│ CONTACT FORM FLOW │
+├─────────────────────────────────────────────────────────────────┤
+│ │
+│ [User Input] → [HTMX POST] → [Go Handler] → [HTML Response] │
+│ │ │ │ │ │
+│ ▼ ▼ ▼ ▼ │
+│ Honeypot + hx-post Validation Success/Error │
+│ Timestamp hx-target + Security HTML partial │
+│ hx-swap │
+│ │
+│ [Hyperscript handles UI state based on response content] │
+│ │
+└─────────────────────────────────────────────────────────────────┘
+```
+
+#### HTMX Configuration
+
+```html
+