[{"data":1,"prerenderedAt":918},["ShallowReactive",2],{"projects-es":3,"projects-testimonials-es":389,"blog-preview-es":600},[4,82,152,207,266,321],{"id":5,"title":6,"body":7,"category":56,"challenge":57,"description":50,"extension":58,"featured":59,"image":60,"images":61,"impact":62,"meta":63,"navigation":59,"order":64,"path":65,"seo":66,"slug":67,"solution":68,"stem":69,"tagline":70,"tags":71,"testimonial":77,"testimonial_author":78,"testimonial_role":79,"url":80,"__hash__":81},"projects_es\u002Fprojects\u002Fes\u002Fimpax-tours.md","IMPAX Tours",{"type":8,"value":9,"toc":49},"minimark",[10,15,19,23,42,46],[11,12,14],"h2",{"id":13},"descripción-del-proyecto","Descripción del Proyecto",[16,17,18],"p",{},"IMPAX Tours es una plataforma online para reservar experiencias de viaje al aire libre, especializada en campamentos de surf y alojamientos backpacker en todo el mundo. Por encargo de IMPAX Tours UG, desarrollé la plataforma web completa como desarrollador full-stack freelance durante un período de 10 meses.",[11,20,22],{"id":21},"características-principales","Características Principales",[24,25,26,30,33,36,39],"ul",{},[27,28,29],"li",{},"Búsqueda por ubicación con filtros por destino, tipo de alojamiento y disponibilidad",[27,31,32],{},"Flujo de reserva integrado con procesamiento de pagos",[27,34,35],{},"Panel de gestión para proveedores de campamentos de surf y alojamientos",[27,37,38],{},"Diseño responsive para usuarios móviles y de escritorio",[27,40,41],{},"Sección de sostenibilidad con información sobre viajes ecológicos",[11,43,45],{"id":44},"aspectos-técnicos","Aspectos Técnicos",[16,47,48],{},"La plataforma se construyó con un backend Laravel y un frontend Vue.js. La arquitectura está diseñada para escalar y admite múltiples proveedores con su propio sistema de gestión de contenidos. La funcionalidad de búsqueda está impulsada por una solución de filtrado basada en base de datos con criterios geográficos.",{"title":50,"searchDepth":51,"depth":51,"links":52},"",2,[53,54,55],{"id":13,"depth":51,"text":14},{"id":21,"depth":51,"text":22},{"id":44,"depth":51,"text":45},"booking-platform","IMPAX Tours necesitaba una plataforma escalable donde los viajeros pudieran encontrar y reservar directamente campamentos de surf y alojamientos backpacker en todo el mundo, con búsqueda, filtros por destino e integración de pagos.","md",true,"\u002Fimages\u002Fprojects\u002Fimpax-tours.webp",null,"La plataforma se lanzó con éxito, permitiendo a viajeros de todo el mundo encontrar y reservar alojamientos de aventura. El proyecto se completó en 10 meses de trabajo freelance y recibió los más altos elogios del director general.",{},1,"\u002Fprojects\u002Fes\u002Fimpax-tours",{"title":6,"description":50},"impax-tours","Desarrollé toda la plataforma como desarrollador full-stack utilizando Laravel como backend y Vue.js como frontend. La solución incluye búsqueda por ubicación, filtros por destino y tipo de alojamiento, y un flujo de reserva y pago completamente integrado.","projects\u002Fes\u002Fimpax-tours","Plataforma de reservas de surf y viajes",[72,73,74,75,76],"Vue.js","Laravel","PHP","MySQL","Booking","El Sr. Enns completó sus tareas con nuestra completa satisfacción y cumplió nuestras expectativas en todos los aspectos. Lamentamos perderle como freelancer.","Andre Baumunk","Director General, IMPAX Tours UG","https:\u002F\u002Fimpax-tours.com","Ly7EmT2ndNNpZZzoZEGD_5JPWxs-AIrtQIuDfZbC46I",{"id":83,"title":84,"body":85,"category":129,"challenge":130,"description":50,"extension":58,"featured":59,"image":131,"images":132,"impact":136,"meta":137,"navigation":59,"order":51,"path":138,"seo":139,"slug":140,"solution":141,"stem":142,"tagline":143,"tags":144,"testimonial":148,"testimonial_author":149,"testimonial_role":150,"url":61,"__hash__":151},"projects_es\u002Fprojects\u002Fes\u002Fhotel-checkin-platform.md","Sistema Digital de Check-in Hotelero",{"type":8,"value":86,"toc":124},[87,89,92,96,119,121],[11,88,14],{"id":13},[16,90,91],{},"Este proyecto consistió en construir un sistema digital de check-in y reserva de habitaciones para un grupo hotelero, desplegado en tablets de vestíbulo. La aplicación guía a los huéspedes paso a paso por todo el proceso, desde la selección de habitación hasta la confirmación de la reserva.",[11,93,95],{"id":94},"funcionalidades","Funcionalidades",[24,97,98,101,104,107,110,113,116],{},[27,99,100],{},"Plano interactivo para selección de habitación con indicación de disponibilidad en tiempo real",[27,102,103],{},"Vista comparativa de tipos de habitación (Estándar, Deluxe, Suite)",[27,105,106],{},"Formulario de datos personales con validación del lado cliente",[27,108,109],{},"Pantalla de resumen de reserva con vista completa antes de confirmar",[27,111,112],{},"Captura de firma digital con soporte táctil",[27,114,115],{},"Integración de términos y condiciones y tasa turística",[27,117,118],{},"Interfaz completamente en alemán adaptada a la identidad visual del cliente",[11,120,45],{"id":44},[16,122,123],{},"La aplicación fue desarrollada con Vue.js y un backend PHP\u002FREST API. El plano interactivo muestra la disponibilidad de habitaciones de forma dinámica basándose en datos del backend. El flujo multistep utiliza gestión de estado en el cliente para preservar los datos del huésped entre pasos.",{"title":50,"searchDepth":51,"depth":51,"links":125},[126,127,128],{"id":13,"depth":51,"text":14},{"id":94,"depth":51,"text":95},{"id":44,"depth":51,"text":45},"web-app","Un grupo hotelero necesitaba reemplazar su proceso de check-in de huéspedes en papel con una aplicación web moderna y adaptada a tablets, que guiara a los huéspedes de forma autónoma por la selección de habitación, la entrada de datos y la confirmación de reserva.","\u002Fimages\u002Fprojects\u002Fhotel-checkin-platform.webp",[131,133,134,135],"\u002Fimages\u002Fprojects\u002Fhotel-checkin-personal-data.webp","\u002Fimages\u002Fprojects\u002Fhotel-checkin-room-selection.webp","\u002Fimages\u002Fprojects\u002Fhotel-checkin-floor-plan.webp","El sistema eliminó por completo el check-in en papel, redujo significativamente el tiempo medio de registro y permitió gestionar digitalmente la disponibilidad de habitaciones y los datos de huéspedes desde el primer día.",{},"\u002Fprojects\u002Fes\u002Fhotel-checkin-platform",{"title":84,"description":50},"hotel-checkin-platform","Desarrollé una aplicación web de varios pasos con Vue.js: plano interactivo para selección de habitación, formulario de datos personales con validación, resumen de reserva con firma digital y una interfaz completamente en alemán adaptada a la identidad de marca del cliente.","projects\u002Fes\u002Fhotel-checkin-platform","Sistema digital de check-in hotelero",[72,145,74,146,147],"TypeScript","REST API","Hotel","Fantastische Zusammenarbeit mit einem hohem Grad an Zuverlässigkeit, Geschwindigkeit und Qualität.","Stephan Wiese","COO, bloc group","m7ey3gNl9UCuqYv9zLXLoUw1sOgQUvlBqjYqARv3dYU",{"id":153,"title":154,"body":155,"category":129,"challenge":191,"description":50,"extension":58,"featured":192,"image":61,"images":61,"impact":193,"meta":194,"navigation":59,"order":195,"path":196,"seo":197,"slug":198,"solution":199,"stem":200,"tagline":201,"tags":202,"testimonial":61,"testimonial_author":61,"testimonial_role":61,"url":61,"__hash__":206},"projects_es\u002Fprojects\u002Fes\u002Fprinter-management.md","Plataforma de Gestión de Impresoras",{"type":8,"value":156,"toc":186},[157,159,162,164,181,183],[11,158,14],{"id":13},[16,160,161],{},"Desarrollado en CAMAO Tec (posteriormente renombrada mmmake), este proyecto consistió en construir una aplicación web de gestión de impresoras para un minorista europeo con múltiples tiendas. El objetivo era ofrecer a los equipos de operaciones una visión clara de todos los dispositivos de impresión físicos en su red de tiendas europeas, incluyendo configuraciones, ubicaciones y metadatos asociados.",[11,163,95],{"id":94},[24,165,166,169,172,175,178],{},[27,167,168],{},"Panel de vista general de dispositivos en todas las ubicaciones",[27,170,171],{},"Operaciones CRUD para impresoras, configuraciones y metadatos",[27,173,174],{},"Autenticación OIDC\u002FOAuth con validación de audiencia y control de acceso basado en permisos",[27,176,177],{},"Integración de una biblioteca de componentes UI interna basada en StencilJS",[27,179,180],{},"Capa de datos simulados para mantener el ritmo de entrega durante el desarrollo de la API",[11,182,45],{"id":44},[16,184,185],{},"La aplicación fue construida con Vue 3, marcando la primera adopción del framework en la empresa. La REST API seguía OpenAPI Spec 3 y requirió implementar un flujo de autenticación OIDC completo contra un proveedor de identidad interno. Donde el diseño divergía de la biblioteca de componentes, colaboré directamente con sus propietarios para identificar y resolver problemas, con correcciones que se propagaron a todos los consumidores del framework.",{"title":50,"searchDepth":51,"depth":51,"links":187},[188,189,190],{"id":13,"depth":51,"text":14},{"id":94,"depth":51,"text":95},{"id":44,"depth":51,"text":45},"Un minorista europeo con múltiples tiendas necesitaba una interfaz web para gestionar impresoras físicas en todas sus ubicaciones — con vista general de dispositivos, configuraciones, asignación de ubicaciones y metadatos. El proyecto también sirvió como la primera adopción de Vue en la pila tecnológica de la empresa.",false,"La aplicación se entregó con éxito y se convirtió en la base para futuras extensiones. El equipo fue incorporado completamente a Vue. Las correcciones aportadas a la biblioteca de componentes beneficiaron a todos los consumidores del framework.",{},3,"\u002Fprojects\u002Fes\u002Fprinter-management",{"title":154,"description":50},"printer-management","Desarrollé la aplicación web con Vue 3 y una biblioteca de componentes UI interna basada en StencilJS, conectada a una REST API siguiendo OpenAPI Spec 3 con autenticación OIDC. Implementé el flujo OAuth completo incluyendo validación de audiencia y permisos, cubrí las divergencias entre el diseño y la biblioteca de componentes, y mantuve los plazos usando datos y servicios simulados mientras la API aún estaba en desarrollo. También incorporé al equipo de desarrollo en Vue, con formación en buenas prácticas de diseño de componentes y el ecosistema Vue.","projects\u002Fes\u002Fprinter-management","Gestión de dispositivos en toda Europa para retail",[203,145,204,146,205],"Vue 3","OIDC","StencilJS","ZJOYN0e-khhfTABnCOIPDOaU0Q3WPC_Et8ogR4BMzjA",{"id":208,"title":209,"body":210,"category":246,"challenge":247,"description":50,"extension":58,"featured":192,"image":61,"images":61,"impact":248,"meta":249,"navigation":59,"order":250,"path":251,"seo":252,"slug":253,"solution":254,"stem":255,"tagline":256,"tags":257,"testimonial":61,"testimonial_author":61,"testimonial_role":61,"url":61,"__hash__":265},"projects_es\u002Fprojects\u002Fes\u002Fhealthcare-chat-integration.md","Integración de Chat en PWA Sanitaria",{"type":8,"value":211,"toc":241},[212,214,217,219,236,238],[11,213,14],{"id":13},[16,215,216],{},"Este proyecto bajo NDA consistió en integrar un sistema de chat en tiempo real en una aplicación web progresiva (PWA) React para clientes y profesionales sanitarios. La app gestionaba datos de usuario de ambos roles y necesitaba un canal de comunicación entre ellos. El alcance era concreto: elegir la tecnología adecuada e implementarla de extremo a extremo bajo presión de tiempo.",[11,218,95],{"id":94},[24,220,221,224,227,230,233],{},[27,222,223],{},"RocketChat integrado vía Docker en la infraestructura existente",[27,225,226],{},"Creación automática de usuarios en RocketChat al registrarse o iniciar sesión",[27,228,229],{},"Endpoints proxy NestJS para creación de salas, gestión de mensajes y lógica de negocio",[27,231,232],{},"Implementación personalizada de cliente WebSocket para mensajería en tiempo real en React",[27,234,235],{},"Pruebas unitarias Jest en todos los nuevos endpoints NestJS con inyección de dependencias y mocking",[11,237,45],{"id":44},[16,239,240],{},"El backend fue generado con Amplication y ya usaba MongoDB, lo que facilitó compartir la misma instancia de base de datos con RocketChat. En lugar de usar la UI predefinida de RocketChat, implementé la conexión WebSocket manualmente para respetar el diseño de interfaz existente del cliente. El sistema de módulos e inyección de dependencias de NestJS facilitó escribir pruebas unitarias aisladas para los nuevos endpoints — la primera cobertura de pruebas del proyecto.",{"title":50,"searchDepth":51,"depth":51,"links":242},[243,244,245],{"id":13,"depth":51,"text":14},{"id":94,"depth":51,"text":95},{"id":44,"depth":51,"text":45},"integration","Una aplicación web sanitaria que conecta clientes y médicos carecía de su función principal — un chat en tiempo real — con una fecha límite inminente. El código existente era una PWA en React con backend NestJS\u002FAmplication, ambos sin pruebas ni controles de calidad. El cliente no tenía estrategia tecnológica y necesitaba tanto una recomendación como una implementación completa.","La función de chat se entregó a tiempo e integrada completamente en la aplicación. Los endpoints NestJS fueron cubiertos con pruebas Jest por primera vez en el proyecto. La solución mantiene la gestión de usuarios centralizada y la mensajería en tiempo real eficiente mediante conexión WebSocket directa.",{},4,"\u002Fprojects\u002Fes\u002Fhealthcare-chat-integration",{"title":209,"description":50},"healthcare-chat-integration","Investigué y evalué soluciones de chat con soporte para React (incluyendo GetStream.io y RocketChat), presenté los resultados al cliente y lideré la integración de RocketChat. Extendí el Docker Compose existente para ejecutar RocketChat sobre la instancia MongoDB del proyecto, desactivé el auto-registro e implementé la creación automática de usuarios en RocketChat al registrarse o iniciar sesión. Construí endpoints proxy en NestJS para la creación de salas y mensajes, cubiertos con pruebas unitarias Jest. En el frontend, implementé una conexión WebSocket personalizada con RocketChat para mensajería en tiempo real dentro del diseño UI existente.","projects\u002Fes\u002Fhealthcare-chat-integration","Chat en tiempo real para una app cliente-médico",[258,259,260,261,262,263,264],"React","NestJS","RocketChat","WebSockets","MongoDB","Jest","PWA","gXFOsb44pHXUp6EGtQA9BL5BZs7S71IoqcH-IlSXJ2U",{"id":267,"title":268,"body":269,"category":129,"challenge":308,"description":50,"extension":58,"featured":192,"image":61,"images":61,"impact":309,"meta":310,"navigation":59,"order":311,"path":312,"seo":313,"slug":314,"solution":315,"stem":316,"tagline":317,"tags":318,"testimonial":61,"testimonial_author":61,"testimonial_role":61,"url":61,"__hash__":320},"projects_es\u002Fprojects\u002Fes\u002Fphotobooth-platform.md","Plataforma de Fotomatón",{"type":8,"value":270,"toc":303},[271,273,276,278,298,300],[11,272,14],{"id":13},[16,274,275],{},"Este proyecto consistió en reconstruir desde cero una plataforma de software para fotomatón para una empresa que alquila fotomatones — incluyendo hardware, personal, overlays personalizados y software — para eventos corporativos y ocasiones en vivo. El MVP existente apenas cumplía los requisitos mínimos y no era apto para uso real en eventos de alto volumen.",[11,277,95],{"id":94},[24,279,280,283,286,289,292,295],{},[27,281,282],{},"Script Node.js que detecta nuevas imágenes de una tarjeta SD con WiFi en tiempo real",[27,284,285],{},"Backend Laravel para ingesta de imágenes, generación de miniaturas y composición de overlays",[27,287,288],{},"Notificaciones WebSocket que envían nuevas imágenes al frontend Vue al instante",[27,290,291],{},"Selección de overlay con previsualización renderizada en el backend (resolución optimizada)",[27,293,294],{},"Generación de imagen en resolución completa con overlay seleccionado al confirmar",[27,296,297],{},"Comando de impresión PHP enviado desde Laravel a la impresora del evento",[11,299,45],{"id":44},[16,301,302],{},"El reto principal era lograr reactividad en tiempo real sin polling. La combinación de un file watcher en Node.js y un broadcaster WebSocket en Laravel mantenía el frontend siempre actualizado en el momento en que una foto llegaba al disco. La generación de miniaturas en el backend era esencial para mantener el frontend ágil — cargar imágenes en resolución completa en un evento en vivo habría causado retrasos notables. El stack Laravel\u002FVue reemplazó una base de código PHP\u002FJS difícil de mantener con una aplicación limpia y estructurada lista para futuras extensiones.",{"title":50,"searchDepth":51,"depth":51,"links":304},[305,306,307],{"id":13,"depth":51,"text":14},{"id":94,"depth":51,"text":95},{"id":44,"depth":51,"text":45},"Una empresa de alquiler de fotomatones operaba un MVP en PHP y HTML\u002FJS sin framework, sin carga de imágenes en tiempo real y con un rendimiento inadecuado para eventos con alto volumen de fotografías. Las fotos recién tomadas no se mostraban en tiempo real, el código no era mantenible y al frontend le faltaba la reactividad necesaria para una experiencia fluida.","La plataforma reemplazó un MVP frágil con una aplicación robusta y mantenible capaz de gestionar eventos de alto volumen. La entrega de imágenes en tiempo real y el despacho inmediato de impresión ofrecieron una experiencia fluida a operadores e invitados. El stack Laravel\u002FVue proporcionó una base limpia para desarrollo futuro.",{},5,"\u002Fprojects\u002Fes\u002Fphotobooth-platform",{"title":268,"description":50},"photobooth-platform","Reescribí la plataforma con un backend Laravel y frontend Vue.js. Un script Node.js escaneaba continuamente el disco de destino en busca de nuevas imágenes capturadas mediante una tarjeta SD con WiFi. Al detectarlas, notificaba al backend Laravel, que procesaba cada imagen — generando miniaturas para previsualización rápida y versiones con overlay para selección. Tras elegir foto y overlay, Laravel generaba la imagen final en resolución completa y enviaba un comando de impresión PHP directamente a la impresora conectada. El frontend recibía actualizaciones en tiempo real vía WebSocket, mostrando nuevas fotos al instante sin recargas manuales.","projects\u002Fes\u002Fphotobooth-platform","Procesamiento de fotos en tiempo real para eventos",[72,73,319,261,74],"Node.js","A8turb3oWE27QFkMMp4MUDAw_Uk43VEjxE3mQutI67o",{"id":322,"title":323,"body":324,"category":129,"challenge":368,"description":50,"extension":58,"featured":59,"image":369,"images":370,"impact":373,"meta":374,"navigation":59,"order":375,"path":376,"seo":377,"slug":378,"solution":379,"stem":380,"tagline":381,"tags":382,"testimonial":61,"testimonial_author":61,"testimonial_role":61,"url":387,"__hash__":388},"projects_es\u002Fprojects\u002Fes\u002Fwichtel-wunsch.md","Wichtel-Wunsch",{"type":8,"value":325,"toc":363},[326,328,331,335,358,360],[11,327,14],{"id":13},[16,329,330],{},"Wichtel-Wunsch es un proyecto personal — una Progressive Web App mobile-first para organizar eventos de amigo invisible y gestionar listas de deseos. Resuelve el problema de coordinación de los intercambios de regalos sin depender de chats grupales ni hojas de cálculo.",[11,332,334],{"id":333},"funcionalidades-principales","Funcionalidades Principales",[24,336,337,340,343,346,349,352,355],{},[27,338,339],{},"Crear y gestionar eventos con un enlace de invitación compartible",[27,341,342],{},"Listas de deseos personales con enlaces opcionales a tiendas para cada participante",[27,344,345],{},"Todas las listas visibles para todos los miembros del evento — sin más adivinanzas",[27,347,348],{},"Autenticación con Google OAuth a través de Supabase Auth",[27,350,351],{},"PWA instalable con soporte de notificaciones push",[27,353,354],{},"Exportación de datos conforme al RGPD (Art. 15)",[27,356,357],{},"Diseño completamente responsivo y mobile-first",[11,359,45],{"id":44},[16,361,362],{},"Desarrollado con Nuxt 4 y Vue 3 en el frontend, respaldado por Supabase (PostgreSQL) para la base de datos y la autenticación. Cada tabla está protegida con políticas de Row Level Security. El proyecto incluye una suite de tests completa: 163 tests de base de datos con pgTAP para restricciones de esquema, reglas RLS y comportamiento de la aplicación, además de tests E2E con Cypress.",{"title":50,"searchDepth":51,"depth":51,"links":364},[365,366,367],{"id":13,"depth":51,"text":14},{"id":333,"depth":51,"text":334},{"id":44,"depth":51,"text":45},"Organizar un amigo invisible es complicado: ¿quién le compra a quién, qué quiere cada persona y cómo coordinar todo sin arruinar la sorpresa? Las herramientas existentes son demasiado complejas o requieren cuentas en plataformas de terceros en las que muchos no confían.","\u002Fimages\u002Fprojects\u002Fwichtel-wunsch.webp",[369,371,372],"\u002Fimages\u002Fprojects\u002Fwichtel-wunsch-event.webp","\u002Fimages\u002Fprojects\u002Fwichtel-wunsch-admin.webp","Una PWA limpia e instalable que hace que los eventos de amigo invisible sean sencillos de organizar. La app cumple con el RGPD con función de exportación de datos, está protegida con Row Level Security en cada tabla de la base de datos y cuenta con 163 tests automatizados de base de datos que cubren integridad de esquema, políticas RLS y lógica de negocio.",{},6,"\u002Fprojects\u002Fes\u002Fwichtel-wunsch",{"title":323,"description":50},"wichtel-wunsch","Desarrollé Wichtel-Wunsch como una Progressive Web App mobile-first con Nuxt 4, Vue 3 y Supabase. Los usuarios pueden crear eventos, invitar amigos mediante un enlace compartido y gestionar listas de deseos personales con enlaces opcionales a tiendas. Todas las listas de los participantes son visibles dentro del evento, para que nadie tenga que adivinar. La autenticación se realiza mediante Google OAuth, y la app es instalable en cualquier dispositivo.","projects\u002Fes\u002Fwichtel-wunsch","Amigo invisible y listas de deseos PWA",[383,72,145,384,385,386,264],"Nuxt","Supabase","PostgreSQL","TailwindCSS","https:\u002F\u002Fwichtel-wunsch.app","SsDtA9rNh51mt5jBymhj4BdPdEQ4pmYOc9H5jlHwTJI",[390,423,461,494,529,562],{"id":208,"title":209,"body":391,"category":246,"challenge":247,"description":50,"extension":58,"featured":192,"image":61,"images":61,"impact":248,"meta":420,"navigation":59,"order":250,"path":251,"seo":421,"slug":253,"solution":254,"stem":255,"tagline":256,"tags":422,"testimonial":61,"testimonial_author":61,"testimonial_role":61,"url":61,"__hash__":265},{"type":8,"value":392,"toc":415},[393,395,397,399,411,413],[11,394,14],{"id":13},[16,396,216],{},[11,398,95],{"id":94},[24,400,401,403,405,407,409],{},[27,402,223],{},[27,404,226],{},[27,406,229],{},[27,408,232],{},[27,410,235],{},[11,412,45],{"id":44},[16,414,240],{},{"title":50,"searchDepth":51,"depth":51,"links":416},[417,418,419],{"id":13,"depth":51,"text":14},{"id":94,"depth":51,"text":95},{"id":44,"depth":51,"text":45},{},{"title":209,"description":50},[258,259,260,261,262,263,264],{"id":83,"title":84,"body":424,"category":129,"challenge":130,"description":50,"extension":58,"featured":59,"image":131,"images":457,"impact":136,"meta":458,"navigation":59,"order":51,"path":138,"seo":459,"slug":140,"solution":141,"stem":142,"tagline":143,"tags":460,"testimonial":148,"testimonial_author":149,"testimonial_role":150,"url":61,"__hash__":151},{"type":8,"value":425,"toc":452},[426,428,430,432,448,450],[11,427,14],{"id":13},[16,429,91],{},[11,431,95],{"id":94},[24,433,434,436,438,440,442,444,446],{},[27,435,100],{},[27,437,103],{},[27,439,106],{},[27,441,109],{},[27,443,112],{},[27,445,115],{},[27,447,118],{},[11,449,45],{"id":44},[16,451,123],{},{"title":50,"searchDepth":51,"depth":51,"links":453},[454,455,456],{"id":13,"depth":51,"text":14},{"id":94,"depth":51,"text":95},{"id":44,"depth":51,"text":45},[131,133,134,135],{},{"title":84,"description":50},[72,145,74,146,147],{"id":5,"title":6,"body":462,"category":56,"challenge":57,"description":50,"extension":58,"featured":59,"image":60,"images":61,"impact":62,"meta":491,"navigation":59,"order":64,"path":65,"seo":492,"slug":67,"solution":68,"stem":69,"tagline":70,"tags":493,"testimonial":77,"testimonial_author":78,"testimonial_role":79,"url":80,"__hash__":81},{"type":8,"value":463,"toc":486},[464,466,468,470,482,484],[11,465,14],{"id":13},[16,467,18],{},[11,469,22],{"id":21},[24,471,472,474,476,478,480],{},[27,473,29],{},[27,475,32],{},[27,477,35],{},[27,479,38],{},[27,481,41],{},[11,483,45],{"id":44},[16,485,48],{},{"title":50,"searchDepth":51,"depth":51,"links":487},[488,489,490],{"id":13,"depth":51,"text":14},{"id":21,"depth":51,"text":22},{"id":44,"depth":51,"text":45},{},{"title":6,"description":50},[72,73,74,75,76],{"id":267,"title":268,"body":495,"category":129,"challenge":308,"description":50,"extension":58,"featured":192,"image":61,"images":61,"impact":309,"meta":526,"navigation":59,"order":311,"path":312,"seo":527,"slug":314,"solution":315,"stem":316,"tagline":317,"tags":528,"testimonial":61,"testimonial_author":61,"testimonial_role":61,"url":61,"__hash__":320},{"type":8,"value":496,"toc":521},[497,499,501,503,517,519],[11,498,14],{"id":13},[16,500,275],{},[11,502,95],{"id":94},[24,504,505,507,509,511,513,515],{},[27,506,282],{},[27,508,285],{},[27,510,288],{},[27,512,291],{},[27,514,294],{},[27,516,297],{},[11,518,45],{"id":44},[16,520,302],{},{"title":50,"searchDepth":51,"depth":51,"links":522},[523,524,525],{"id":13,"depth":51,"text":14},{"id":94,"depth":51,"text":95},{"id":44,"depth":51,"text":45},{},{"title":268,"description":50},[72,73,319,261,74],{"id":153,"title":154,"body":530,"category":129,"challenge":191,"description":50,"extension":58,"featured":192,"image":61,"images":61,"impact":193,"meta":559,"navigation":59,"order":195,"path":196,"seo":560,"slug":198,"solution":199,"stem":200,"tagline":201,"tags":561,"testimonial":61,"testimonial_author":61,"testimonial_role":61,"url":61,"__hash__":206},{"type":8,"value":531,"toc":554},[532,534,536,538,550,552],[11,533,14],{"id":13},[16,535,161],{},[11,537,95],{"id":94},[24,539,540,542,544,546,548],{},[27,541,168],{},[27,543,171],{},[27,545,174],{},[27,547,177],{},[27,549,180],{},[11,551,45],{"id":44},[16,553,185],{},{"title":50,"searchDepth":51,"depth":51,"links":555},[556,557,558],{"id":13,"depth":51,"text":14},{"id":94,"depth":51,"text":95},{"id":44,"depth":51,"text":45},{},{"title":154,"description":50},[203,145,204,146,205],{"id":322,"title":323,"body":563,"category":129,"challenge":368,"description":50,"extension":58,"featured":59,"image":369,"images":596,"impact":373,"meta":597,"navigation":59,"order":375,"path":376,"seo":598,"slug":378,"solution":379,"stem":380,"tagline":381,"tags":599,"testimonial":61,"testimonial_author":61,"testimonial_role":61,"url":387,"__hash__":388},{"type":8,"value":564,"toc":591},[565,567,569,571,587,589],[11,566,14],{"id":13},[16,568,330],{},[11,570,334],{"id":333},[24,572,573,575,577,579,581,583,585],{},[27,574,339],{},[27,576,342],{},[27,578,345],{},[27,580,348],{},[27,582,351],{},[27,584,354],{},[27,586,357],{},[11,588,45],{"id":44},[16,590,362],{},{"title":50,"searchDepth":51,"depth":51,"links":592},[593,594,595],{"id":13,"depth":51,"text":14},{"id":333,"depth":51,"text":334},{"id":44,"depth":51,"text":45},[369,371,372],{},{"title":323,"description":50},[383,72,145,384,385,386,264],[601],{"id":602,"title":603,"alternates":604,"body":606,"description":904,"extension":58,"meta":905,"navigation":59,"path":906,"publishedAt":907,"seo":908,"stem":909,"tags":910,"__hash__":917},"blog_en\u002Fposts\u002Fwelcome-to-my-blog.md","Welcome to My Blog – Let's Grow Together",{"de":605},"\u002Fposts\u002Fwillkommen-in-meinem-blog",{"type":8,"value":607,"toc":895},[608,623,627,630,633,646,650,653,658,671,676,694,699,713,717,724,727,741,750,754,760,766,772,778,782,785,791,797,803,809,813,816,819,822,826,829,834,837,872,875,878,883,886],[609,610,614,617,620],"intro-section",{"alt":611,"height":612,"src":613,"width":612},"Waldemar Enns - Software Developer and Consultant",400,"\u002Fme-2022.JPG",[16,615,616],{},"Hey, I'm Waldemar! 👋",[16,618,619],{},"Thanks for stopping by. This blog isn't just a collection of tech tutorials—it's my digital living room where I share what I've learned over 7+ years as a software developer, freelancer, and consultant based in Germany.",[16,621,622],{},"Whether you're here to learn, looking for a development partner, or just curious about modern web tech—I'm glad you found your way here.",[11,624,626],{"id":625},"whos-behind-this","Who's behind this?",[16,628,629],{},"I'm the guy who transforms complex business problems into elegant code solutions. But honestly? I'm primarily a problem-solver with a passion for clean code and genuine partnerships.",[16,631,632],{},"My journey into development wasn't a straight line. Like many developers, I started with curiosity and a lot of trial and error. What began as tinkering with websites quickly evolved into a deep passion for building software that actually makes a difference. Over the past 7+ years, I've had the privilege of working with companies across various industries—from startups launching their first product to established businesses looking to modernize their digital presence.",[16,634,635,636,640,641,645],{},"My journey started with a simple belief: ",[637,638,639],"strong",{},"technology should help people, not confuse them."," That's why I don't just work \"for\" clients—I work ",[642,643,644],"em",{},"with"," them. I want to understand what your business truly needs before writing the first line of code.",[11,647,649],{"id":648},"my-tech-stack","My Tech Stack",[16,651,652],{},"Over the years, I've developed deep expertise in a modern, powerful stack that lets me build everything from sleek marketing sites to complex SaaS platforms:",[16,654,655],{},[637,656,657],{},"Frontend & User Experience",[24,659,660,666],{},[27,661,662,665],{},[637,663,664],{},"Vue.js & Nuxt"," – My go-to framework for building fast, SEO-friendly applications. The Vue ecosystem is incredibly productive, and Nuxt takes it to the next level with server-side rendering and an amazing developer experience.",[27,667,668,670],{},[637,669,145],{}," – Because catching errors at compile time beats debugging them in production. Type safety isn't just a nice-to-have; it's essential for maintainable code.",[16,672,673],{},[637,674,675],{},"Backend & APIs",[24,677,678,683,688],{},[27,679,680,682],{},[637,681,73],{}," – When I need a robust backend, Laravel delivers. It's perfect for SaaS applications, booking systems, inventory management, and API development. The ecosystem is mature, well-documented, and a joy to work with.",[27,684,685,687],{},[637,686,259],{}," – For more complex, enterprise-grade applications requiring microservices architecture or GraphQL APIs.",[27,689,690,693],{},[637,691,692],{},"Python"," – Great for data processing, automation scripts, and when I need to integrate machine learning capabilities.",[16,695,696],{},[637,697,698],{},"Infrastructure & DevOps",[24,700,701,707],{},[27,702,703,706],{},[637,704,705],{},"CI\u002FCD"," – Automated testing and deployment through GitHub Actions and GitLab CI. I don't believe in \"it works on my machine.\"",[27,708,709,712],{},[637,710,711],{},"Cloud Hosting"," – Whether it's Vercel, Netlify, or traditional VPS setups, I ensure your application is fast, secure, and scalable.",[11,714,716],{"id":715},"the-ai-revolution","The AI Revolution",[16,718,719,720,723],{},"I'll admit it: I'm genuinely excited about AI-assisted development. Not because it's trendy, but because I've seen it transform my own workflow. That's why I offer workshops on ",[637,721,722],{},"Agentic Coding","—because I firmly believe AI tools like Cursor, Claude Code, and Opencode can (and should!) revolutionize how we work.",[16,725,726],{},"These aren't just fancy autocomplete tools. When used correctly, they can:",[24,728,729,732,735,738],{},[27,730,731],{},"Accelerate development by 10x",[27,733,734],{},"Help you write better, more consistent code",[27,736,737],{},"Handle the boilerplate so you can focus on architecture and problem-solving",[27,739,740],{},"Make debugging and refactoring less painful",[16,742,743,744,749],{},"I've trained 50+ developers on these tools, and the feedback has been incredible. If you're curious about integrating AI into your development workflow, ",[745,746,748],"a",{"href":747},"\u002F#workshops","check out my workshops"," or drop me a message.",[11,751,753],{"id":752},"how-i-work","How I Work",[16,755,756,759],{},[637,757,758],{},"Testing is Non-Negotiable","\nI rarely skip testing—it's a fundamental part of my development process. Unit tests with TDD, component tests with Cypress, and E2E tests to verify the complete user journey. This ensures the code is robust from day one and makes future changes less risky.",[16,761,762,765],{},[637,763,764],{},"Agile & Adaptive","\nI apply agile methods like SCRUM, Kanban, or Scrumban to stay flexible and incorporate regular feedback. Through short iterations and weekly check-ins, I ensure requirements stay current and actionable. No surprises at the end of the project.",[16,767,768,771],{},[637,769,770],{},"Clean Code & Git Flow","\nI work with a mix of Git Flow and GitHub Flow, ensuring well-structured branches whether we're in a long-term development cycle or need quick iterations. Regular rebasing, clear commit messages, and thorough code reviews keep the codebase clean and traceable.",[16,773,774,777],{},[637,775,776],{},"Communication Over Jargon","\nI believe in clear, regular updates. You'll always know where your project stands and what's coming next. No technical jargon, no vague status reports—just honest progress updates and direct access when you need it.",[11,779,781],{"id":780},"what-to-expect-from-this-blog","What to Expect from This Blog",[16,783,784],{},"This blog will be my space to share:",[16,786,787,790],{},[637,788,789],{},"🚀 Practical Insights","\nReal lessons learned from projects—not just the successes, but also the \"oops, should've done that differently\" moments. From Vue.js and Nuxt to Laravel and Python backend solutions. I'll share code snippets, architectural decisions, and the reasoning behind them.",[16,792,793,796],{},[637,794,795],{},"🤖 AI & The Future of Coding","\nDeep dives into AI-assisted development. How to set up Cursor, Claude Code, and Opencode for maximum productivity. Prompt engineering techniques that actually work. Best practices for integrating AI into your team's workflow.",[16,798,799,802],{},[637,800,801],{},"💡 Thoughts Beyond Code","\nAgile methods that actually work in the real world. Why testing isn't just a checkbox. How to communicate technical projects so stakeholders understand what's happening. The soft skills that make good developers great.",[16,804,805,808],{},[637,806,807],{},"🌍 Industry Perspectives","\nObservations on where web development is heading. Reviews of new tools and frameworks. Honest opinions on tech trends (the good, the bad, and the overhyped).",[11,810,812],{"id":811},"my-promise","My Promise",[16,814,815],{},"No tech jargon. No superficial \"hello world\" tutorials. No rehashed documentation.",[16,817,818],{},"Just honest insights into the world of modern web development—with all its challenges and opportunities. I believe in code that grows with you. In partnerships that last beyond project completion. And that the best technology is the one that truly moves your business forward.",[16,820,821],{},"When you work with me, you get more than a developer. You get a strategic partner who understands that technology is a means to an end—not the end itself. Someone who asks \"why\" before \"how\" and cares about your success as much as you do.",[11,823,825],{"id":824},"lets-connect","Let's Connect",[16,827,828],{},"Got a question about a technical challenge? A project that needs support? Want to discuss whether AI tools could help your team? Or just want to chat about web development over a virtual coffee?",[16,830,831],{},[637,832,833],{},"I'm always happy to connect.",[16,835,836],{},"You can reach me through:",[24,838,839,850,862],{},[27,840,841,844,845,849],{},[637,842,843],{},"Email",": Drop a message through the ",[745,846,848],{"href":847},"\u002F#contact","contact form"," on this site",[27,851,852,855,856],{},[637,853,854],{},"LinkedIn",": ",[745,857,861],{"href":858,"rel":859},"https:\u002F\u002Flinkedin.com\u002Fin\u002Fwaldemar-enns",[860],"nofollow","linkedin.com\u002Fin\u002Fwaldemar-enns",[27,863,864,855,867],{},[637,865,866],{},"GitHub",[745,868,871],{"href":869,"rel":870},"https:\u002F\u002Fgithub.com\u002FWaldemarEnns",[860],"github.com\u002FWaldemarEnns",[16,873,874],{},"Whether you're a fellow developer, a business owner looking for technical guidance, or someone curious about the world of web development—don't hesitate to reach out. I don't bite. Promise. 😊",[16,876,877],{},"Looking forward to hearing from you!",[16,879,880],{},[637,881,882],{},"Waldemar",[884,885],"hr",{},[16,887,888],{},[642,889,890,891,894],{},"P.S. If you found this blog helpful or interesting, consider sharing it with others who might benefit. And if you have topics you'd like me to cover, ",[745,892,893],{"href":847},"let me know","—I'm always open to suggestions!",{"title":50,"searchDepth":51,"depth":51,"links":896},[897,898,899,900,901,902,903],{"id":625,"depth":51,"text":626},{"id":648,"depth":51,"text":649},{"id":715,"depth":51,"text":716},{"id":752,"depth":51,"text":753},{"id":780,"depth":51,"text":781},{"id":811,"depth":51,"text":812},{"id":824,"depth":51,"text":825},"Personal insights from 7+ years in web development, AI workshops, and the story behind my work",{},"\u002Fposts\u002Fwelcome-to-my-blog","2026-01-30",{"title":603,"description":904},"posts\u002Fwelcome-to-my-blog",[911,912,913,914,915,916],"personal","web development","vue","nuxt","ai","workshops","tE-vunBaw17Kgvs97US1u-Jq-F5UoDXb-FFhuStgQzk",1776832588393]