I build software, automate processes and validate quality — with over 20 years of experience across the full technology stack. I deliver fast, reliable results backed by real production projects. Construyo software, automatizo procesos y valido calidad — con más de 20 años de experiencia en toda la pila tecnológica. Entrego resultados rápidos y fiables respaldados por proyectos reales en producción.
I work directly with companies to deliver tangible results — fast and at competitive rates, thanks to a battle-tested workflow and the right tools for each job. Trabajo directamente con empresas para entregar resultados tangibles — rápido y a precios competitivos, gracias a un flujo de trabajo probado y las herramientas adecuadas para cada tarea.
Web applications, APIs, scripts and automation tools. From a simple landing page to a full-stack SaaS product, I handle the entire development cycle. Aplicaciones web, APIs, scripts y herramientas de automatización. Desde una landing sencilla hasta un SaaS completo, gestiono todo el ciclo de desarrollo.
Manual and automated testing, test case design, bug tracking and quality reports. I make sure your product works before it reaches your users. Testing manual y automatizado, diseño de casos de prueba, seguimiento de bugs e informes de calidad. Me aseguro de que tu producto funcione antes de llegar a tus usuarios.
Content creation, SEO, ad campaigns and social media strategy. I produce and publish content that grows your audience and converts visitors into customers. Creación de contenido, SEO, campañas publicitarias y estrategia de redes sociales. Produzco y publico contenido que hace crecer tu audiencia y convierte visitantes en clientes.
Professional images and visual assets for your brand, product or campaigns. UI design and landing pages that convert. Imágenes y recursos visuales profesionales para tu marca, producto o campañas. Diseño de interfaces y landing pages que convierten.
I automate repetitive tasks, connect your tools and build workflows that save your team hours every week. No more copy-pasting between platforms. Automatizo tareas repetitivas, conecto tus herramientas y creo flujos de trabajo que ahorran horas a tu equipo cada semana. Sin más copiar y pegar entre plataformas.
I integrate AI capabilities into your existing products — chatbots with custom knowledge bases, voice input, intelligent document processing and more. Integro capacidades de IA en tus productos existentes — chatbots con base de conocimiento, entrada por voz, procesamiento inteligente de documentos y más.
I have spent over two decades working across the full technology stack — from configuring switches and routers to writing test cases in Gherkin, validating APIs with Postman, and building full-stack web applications from scratch.
He pasado más de dos décadas trabajando en toda la pila tecnológica — desde configurar switches y routers hasta escribir casos de prueba en Gherkin, validar APIs con Postman y construir aplicaciones web completas desde cero.
My approach is proactive and results-driven. I believe in using the right tool for the job — including AI — and evaluating both human-written and machine-generated code with the same critical eye.
Mi enfoque es proactivo y orientado a resultados. Creo en usar la herramienta adecuada para cada tarea — incluyendo la IA — y evaluar tanto el código escrito por personas como el generado por máquinas con el mismo ojo crítico.
Most recently I built TallyFam — a family finance app — independently, publishing it to web, Android and iOS. A hands-on proof that I can design, develop and ship a full product end to end.
Recientemente construí TallyFam — una app de finanzas familiares — de forma independiente, publicándola en web, Android e iOS. Una demostración práctica de que puedo diseñar, desarrollar y lanzar un producto completo de principio a fin.
Products designed, built and shipped independently — from idea to production. Productos diseñados, construidos y publicados de forma independiente — desde la idea hasta producción.
Available for development, QA, automation and consulting projects. Based in Madrid, open to remote work worldwide. Disponible para proyectos de desarrollo, QA, automatización y consultoría. Basado en Madrid, abierto a trabajo remoto en todo el mundo.
TallyFam is a multi-platform family expense tracking app I designed, built, and published entirely by myself — from the initial idea through to the App Store and Google Play listings. The product runs as a PWA on web and as native apps on Android and iOS, all from a single shared codebase.TallyFam es una app multi-plataforma de seguimiento de gastos familiares que diseñé, construí y publiqué enteramente solo — desde la idea inicial hasta las fichas en App Store y Google Play. El producto funciona como PWA en web y como app nativa en Android e iOS, todo desde una única base de código compartida.
The core challenge was building a real-time collaborative dashboard that stays consistent across different devices within the same family, while handling separate payment systems for each platform — Stripe on the web and RevenueCat for the mobile stores.El reto principal fue construir un dashboard colaborativo en tiempo real que se mantuviera consistente en distintos dispositivos dentro de la misma familia, gestionando al mismo tiempo sistemas de pago distintos para cada plataforma — Stripe en web y RevenueCat para las tiendas móviles.
The architecture is a client-heavy Single Page Application where all UI logic runs in the browser. PHP acts only as a secure file server and AI proxy — it never touches the database. Firebase handles all real-time data, authentication, and serverless functions. Capacitor wraps the same web bundle into native Android and iOS apps with access to device APIs.La arquitectura es una Single Page Application donde toda la lógica de UI corre en el navegador. PHP actúa únicamente como servidor de archivos seguro y proxy de IA — nunca toca la base de datos. Firebase gestiona todos los datos en tiempo real, la autenticación y las funciones serverless. Capacitor envuelve el mismo bundle web en apps nativas de Android e iOS con acceso a APIs del dispositivo.
Every technology decision was made to maximize delivery speed without sacrificing quality or security. The goal was to ship a full product solo in 3 months across 3 platforms.Cada decisión tecnológica se tomó para maximizar la velocidad de entrega sin sacrificar calidad ni seguridad. El objetivo era publicar un producto completo en solitario en 3 meses en 3 plataformas.
After building the product, I designed and implemented a full automated QA suite using Playwright, covering login, registration, password recovery, dashboard and transactions across Desktop Chrome, Pixel 5 (Mobile Chrome) and iPhone 13 (Mobile Safari).Tras construir el producto, diseñé e implementé una suite completa de QA automatizado con Playwright, cubriendo login, registro, recuperación de contraseña, dashboard y transacciones en Desktop Chrome, Pixel 5 (Mobile Chrome) e iPhone 13 (Mobile Safari).
| FileArchivo | Tests | Desktop Chrome | Pixel 5 | iPhone 13 |
|---|---|---|---|---|
| login.spec.js | 9 | pass | pass | pass |
| registro.spec.js | 12 | pass | pass | pass |
| recuperacion.spec.js | 12 | pass | pass | pass |
| dashboard.spec.js | 10 + 5 skip | pass | pass | skip (webkit) |
| transacciones.spec.js | 12 + 6 skip | pass | pass | skip (webkit) |
minlength="6" attribute triggering the browser's validation bubble before custom JS error messages could fire, making UI behavior inconsistent.El campo de contraseña tenía un atributo nativo minlength="6" que activaba la burbuja de validación del navegador antes de que los mensajes de error JS personalizados pudieran ejecutarse.novalidate to the register form in auth.php — disables native browser validation so custom JS takes full control.Se añadió novalidate al formulario de registro en auth.php — desactiva la validación nativa para que el JS personalizado tome el control.handleResetPassword called Firebase directly without first checking for an empty email or invalid format — any input triggered a Firebase API call.handleResetPassword llamaba a Firebase directamente sin verificar si el email estaba vacío o tenía formato inválido.novalidate on the reset form.Se añadieron validaciones JS (vacío + regex de formato) antes de llamar a Firebase, más novalidate en el formulario de reset.typeof webkit !== 'undefined' && webkit.messageHandlers != null — only true inside a real WKWebView, never in Safari browser.Se cambió la detección a typeof webkit !== 'undefined' && webkit.messageHandlers != null — solo verdadero dentro de un WKWebView real.input[type="number"] required, causing the browser's native submit block to fire before React's handleSubmit could run — Playwright couldn't set React-controlled inputs via dispatchEvent either.El formulario de transacciones tenía input[type="number"] required, causando que el bloqueo nativo del navegador se activara antes que el handleSubmit de React — Playwright tampoco podía establecer inputs controlados por React vía dispatchEvent.noValidate to both React form elements (lines 1090 and 1418 of index.php). Exposed window.__setFormField via useEffect so Playwright can set React state directly.Se añadió noValidate a los dos formularios React (líneas 1090 y 1418 de index.php). Se expuso window.__setFormField vía useEffect para que Playwright pueda establecer el estado de React directamente.Three recorded sessions covering all 5 test files — authentication flows, real-time dashboard data loading, and transaction form validation across Desktop Chrome and Mobile Chrome (Pixel 5).Tres sesiones grabadas que cubren los 5 archivos de tests — flujos de autenticación, carga de datos del dashboard en tiempo real y validación del formulario de transacciones en Desktop Chrome y Mobile Chrome (Pixel 5).