[{"data":1,"prerenderedAt":912},["ShallowReactive",2],{"blog-preview":3,"$fy8O9-L-sfzrldh0eyoi6LRmmIPyZlyfssDcYleQtfe8":331,"$fvbqHbZOECLJYRbpGd52pBaVvD26m-GPToIgn7nQUgTk":701},[4],{"id":5,"title":6,"body":7,"description":315,"extension":316,"meta":317,"navigation":318,"path":319,"publishedAt":320,"seo":321,"stem":322,"tags":323,"__hash__":330},"blog\u002Fposts\u002Fwelcome-to-my-blog.md","Welcome to My Blog – Let's Grow Together",{"type":8,"value":9,"toc":304},"minimark",[10,26,31,34,37,50,54,57,62,78,83,103,108,122,126,133,136,150,159,163,169,175,181,187,191,194,200,206,212,218,222,225,228,231,235,238,243,246,281,284,287,292,295],[11,12,16,20,23],"intro-section",{"alt":13,"height":14,"src":15,"width":14},"Waldemar Enns - Software Developer and Consultant",400,"\u002Fme-2022.JPG",[17,18,19],"p",{},"Hey, I'm Waldemar! 👋",[17,21,22],{},"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.",[17,24,25],{},"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.",[27,28,30],"h2",{"id":29},"whos-behind-this","Who's behind this?",[17,32,33],{},"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.",[17,35,36],{},"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.",[17,38,39,40,44,45,49],{},"My journey started with a simple belief: ",[41,42,43],"strong",{},"technology should help people, not confuse them."," That's why I don't just work \"for\" clients—I work ",[46,47,48],"em",{},"with"," them. I want to understand what your business truly needs before writing the first line of code.",[27,51,53],{"id":52},"my-tech-stack","My Tech Stack",[17,55,56],{},"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:",[17,58,59],{},[41,60,61],{},"Frontend & User Experience",[63,64,65,72],"ul",{},[66,67,68,71],"li",{},[41,69,70],{},"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.",[66,73,74,77],{},[41,75,76],{},"TypeScript"," – 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.",[17,79,80],{},[41,81,82],{},"Backend & APIs",[63,84,85,91,97],{},[66,86,87,90],{},[41,88,89],{},"Laravel"," – 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.",[66,92,93,96],{},[41,94,95],{},"NestJS"," – For more complex, enterprise-grade applications requiring microservices architecture or GraphQL APIs.",[66,98,99,102],{},[41,100,101],{},"Python"," – Great for data processing, automation scripts, and when I need to integrate machine learning capabilities.",[17,104,105],{},[41,106,107],{},"Infrastructure & DevOps",[63,109,110,116],{},[66,111,112,115],{},[41,113,114],{},"CI\u002FCD"," – Automated testing and deployment through GitHub Actions and GitLab CI. I don't believe in \"it works on my machine.\"",[66,117,118,121],{},[41,119,120],{},"Cloud Hosting"," – Whether it's Vercel, Netlify, or traditional VPS setups, I ensure your application is fast, secure, and scalable.",[27,123,125],{"id":124},"the-ai-revolution","The AI Revolution",[17,127,128,129,132],{},"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 ",[41,130,131],{},"Agentic Coding","—because I firmly believe AI tools like Cursor, Claude Code, and Opencode can (and should!) revolutionize how we work.",[17,134,135],{},"These aren't just fancy autocomplete tools. When used correctly, they can:",[63,137,138,141,144,147],{},[66,139,140],{},"Accelerate development by 10x",[66,142,143],{},"Help you write better, more consistent code",[66,145,146],{},"Handle the boilerplate so you can focus on architecture and problem-solving",[66,148,149],{},"Make debugging and refactoring less painful",[17,151,152,153,158],{},"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, ",[154,155,157],"a",{"href":156},"\u002F#workshops","check out my workshops"," or drop me a message.",[27,160,162],{"id":161},"how-i-work","How I Work",[17,164,165,168],{},[41,166,167],{},"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.",[17,170,171,174],{},[41,172,173],{},"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.",[17,176,177,180],{},[41,178,179],{},"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.",[17,182,183,186],{},[41,184,185],{},"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.",[27,188,190],{"id":189},"what-to-expect-from-this-blog","What to Expect from This Blog",[17,192,193],{},"This blog will be my space to share:",[17,195,196,199],{},[41,197,198],{},"🚀 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.",[17,201,202,205],{},[41,203,204],{},"🤖 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.",[17,207,208,211],{},[41,209,210],{},"💡 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.",[17,213,214,217],{},[41,215,216],{},"🌍 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).",[27,219,221],{"id":220},"my-promise","My Promise",[17,223,224],{},"No tech jargon. No superficial \"hello world\" tutorials. No rehashed documentation.",[17,226,227],{},"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.",[17,229,230],{},"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.",[27,232,234],{"id":233},"lets-connect","Let's Connect",[17,236,237],{},"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?",[17,239,240],{},[41,241,242],{},"I'm always happy to connect.",[17,244,245],{},"You can reach me through:",[63,247,248,259,271],{},[66,249,250,253,254,258],{},[41,251,252],{},"Email",": Drop a message through the ",[154,255,257],{"href":256},"\u002F#contact","contact form"," on this site",[66,260,261,264,265],{},[41,262,263],{},"LinkedIn",": ",[154,266,270],{"href":267,"rel":268},"https:\u002F\u002Flinkedin.com\u002Fin\u002Fwaldemar-enns",[269],"nofollow","linkedin.com\u002Fin\u002Fwaldemar-enns",[66,272,273,264,276],{},[41,274,275],{},"GitHub",[154,277,280],{"href":278,"rel":279},"https:\u002F\u002Fgithub.com\u002FWaldemarEnns",[269],"github.com\u002FWaldemarEnns",[17,282,283],{},"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. 😊",[17,285,286],{},"Looking forward to hearing from you!",[17,288,289],{},[41,290,291],{},"Waldemar",[293,294],"hr",{},[17,296,297],{},[46,298,299,300,303],{},"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, ",[154,301,302],{"href":256},"let me know","—I'm always open to suggestions!",{"title":305,"searchDepth":306,"depth":306,"links":307},"",2,[308,309,310,311,312,313,314],{"id":29,"depth":306,"text":30},{"id":52,"depth":306,"text":53},{"id":124,"depth":306,"text":125},{"id":161,"depth":306,"text":162},{"id":189,"depth":306,"text":190},{"id":220,"depth":306,"text":221},{"id":233,"depth":306,"text":234},"Personal insights from 7+ years in web development, AI workshops, and the story behind my work","md",{},true,"\u002Fposts\u002Fwelcome-to-my-blog","2026-01-30",{"title":6,"description":315},"posts\u002Fwelcome-to-my-blog",[324,325,326,327,328,329],"personal","web development","vue","nuxt","ai","workshops","R-Yc9l53fXCFpQTbYDa240njcUz2fKgl70LIom1jFHs",[332,400,467,522,580,635],{"id":333,"title":334,"body":335,"category":377,"challenge":378,"description":305,"extension":316,"featured":318,"image":379,"images":380,"impact":381,"meta":382,"navigation":318,"order":383,"path":384,"seo":385,"slug":386,"solution":387,"stem":388,"tagline":389,"tags":390,"testimonial":395,"testimonial_author":396,"testimonial_role":397,"url":398,"__hash__":399},"projects_en\u002Fprojects\u002Fen\u002Fimpax-tours.md","IMPAX Tours",{"type":8,"value":336,"toc":372},[337,341,344,348,365,369],[27,338,340],{"id":339},"project-overview","Project Overview",[17,342,343],{},"IMPAX Tours is an online platform for booking outdoor travel experiences, specialising in surf camps and backpacker lodges worldwide. On behalf of IMPAX Tours UG, I developed the complete web platform as a freelance full-stack developer over a period of 10 months.",[27,345,347],{"id":346},"key-features","Key Features",[63,349,350,353,356,359,362],{},[66,351,352],{},"Location-based search with filters for destination, accommodation type, and availability",[66,354,355],{},"Integrated booking flow with payment processing",[66,357,358],{},"Provider dashboard for managing surf camps and backpacker lodges",[66,360,361],{},"Responsive design for mobile and desktop users",[66,363,364],{},"Sustainability section with information on eco-conscious travel",[27,366,368],{"id":367},"technical-highlights","Technical Highlights",[17,370,371],{},"The platform was built with a Laravel backend and Vue.js frontend. The architecture is designed for scalability and supports multiple providers with their own content management. The search functionality is powered by a database-driven filtering solution with geographical criteria.",{"title":305,"searchDepth":306,"depth":306,"links":373},[374,375,376],{"id":339,"depth":306,"text":340},{"id":346,"depth":306,"text":347},{"id":367,"depth":306,"text":368},"booking-platform","IMPAX Tours needed a scalable platform where travelers could find and directly book surf camps and backpacker lodges worldwide – including search, destination filtering, and payment integration.","\u002Fimages\u002Fprojects\u002Fimpax-tours.webp",null,"The platform launched successfully, enabling travelers worldwide to find and book outdoor accommodations. The project was completed over 10 months of freelance work and received the highest praise from the managing director.",{},1,"\u002Fprojects\u002Fen\u002Fimpax-tours",{"title":334,"description":305},"impax-tours","I built the entire platform as a full-stack developer using Laravel as the backend and Vue.js as the frontend. The solution includes location-based search, filters by destination and accommodation type, and a fully integrated booking and payment flow.","projects\u002Fen\u002Fimpax-tours","Surf & travel booking platform",[391,89,392,393,394],"Vue.js","PHP","MySQL","Booking","Mr. Enns completed his tasks to our complete satisfaction and met our expectations in every respect. We regret to lose him as a freelancer.","Andre Baumunk","Managing Director, IMPAX Tours UG","https:\u002F\u002Fimpax-tours.com","0aQlRQsmHu5h7jrilxl8kuX2duf63hADqj8waA_yig4",{"id":401,"title":402,"body":403,"category":445,"challenge":446,"description":305,"extension":316,"featured":318,"image":447,"images":448,"impact":452,"meta":453,"navigation":318,"order":306,"path":454,"seo":455,"slug":456,"solution":457,"stem":458,"tagline":459,"tags":460,"testimonial":463,"testimonial_author":464,"testimonial_role":465,"url":380,"__hash__":466},"projects_en\u002Fprojects\u002Fen\u002Fhotel-checkin-platform.md","Digital Hotel Check-in System",{"type":8,"value":404,"toc":440},[405,407,410,412,435,437],[27,406,340],{"id":339},[17,408,409],{},"This project involved building a fully digital guest check-in and room booking system for a hospitality group, deployed on in-lobby tablets. The application walks guests through the entire check-in process in a step-by-step flow, from room selection to booking confirmation.",[27,411,347],{"id":346},[63,413,414,417,420,423,426,429,432],{},[66,415,416],{},"Interactive floor plan for per-room selection, with real-time availability colour coding",[66,418,419],{},"Room type overview with feature comparison (Standard, Deluxe, Suite)",[66,421,422],{},"Multi-field personal data form with client-side validation (name, contact, passport, vehicle registration)",[66,424,425],{},"Booking overview screen displaying a full summary before confirmation",[66,427,428],{},"Digital signature capture with touchscreen support",[66,430,431],{},"AGB (terms & conditions) and Gästetaxe (tourist tax) integration",[66,433,434],{},"Fully German-language UI matching the client's brand identity",[27,436,368],{"id":367},[17,438,439],{},"The application was built with Vue.js and a PHP\u002FREST API backend. The interactive floor plan renders room availability dynamically based on backend data, with colour states for available, occupied, and premium rooms. The multi-step flow uses client-side state management to preserve guest data across steps without premature server calls.",{"title":305,"searchDepth":306,"depth":306,"links":441},[442,443,444],{"id":339,"depth":306,"text":340},{"id":346,"depth":306,"text":347},{"id":367,"depth":306,"text":368},"web-app","A hospitality group needed to replace their paper-based guest check-in process with a modern, tablet-friendly web application that guides guests through room selection, personal data entry, and booking confirmation — all without staff involvement.","\u002Fimages\u002Fprojects\u002Fhotel-checkin-platform.webp",[447,449,450,451],"\u002Fimages\u002Fprojects\u002Fhotel-checkin-personal-data.webp","\u002Fimages\u002Fprojects\u002Fhotel-checkin-room-selection.webp","\u002Fimages\u002Fprojects\u002Fhotel-checkin-floor-plan.webp","The system eliminated paper-based check-in entirely, reduced average check-in time significantly, and enabled the hotel to manage room availability and guest data digitally from day one.",{},"\u002Fprojects\u002Fen\u002Fhotel-checkin-platform",{"title":402,"description":305},"hotel-checkin-platform","I developed a multi-step web application with Vue.js featuring a dynamic room selection screen with interactive floor plan, a personal data form with validation, a booking overview with digital signature, and a full German-language UI tailored to the client's brand.","projects\u002Fen\u002Fhotel-checkin-platform","Digital hotel check-in system",[391,76,392,461,462],"REST API","Hotel","Fantastische Zusammenarbeit mit einem hohem Grad an Zuverlässigkeit, Geschwindigkeit und Qualität.","Stephan Wiese","COO, bloc group","ZQaSduOXrHxaiRKuTpyW_r_oXU3fnG3THvHVsDe0CA4",{"id":468,"title":469,"body":470,"category":445,"challenge":506,"description":305,"extension":316,"featured":507,"image":380,"images":380,"impact":508,"meta":509,"navigation":318,"order":510,"path":511,"seo":512,"slug":513,"solution":514,"stem":515,"tagline":516,"tags":517,"testimonial":380,"testimonial_author":380,"testimonial_role":380,"url":380,"__hash__":521},"projects_en\u002Fprojects\u002Fen\u002Fprinter-management.md","Printer Management Platform",{"type":8,"value":471,"toc":501},[472,474,477,479,496,498],[27,473,340],{"id":339},[17,475,476],{},"Developed at CAMAO Tec (later rebranded to mmmake), this project involved building a printer management web application for a multi-store European retailer. The goal was to give operations teams a clear overview of all physical printer devices across their European store network, including device settings, physical locations, and associated metadata.",[27,478,347],{"id":346},[63,480,481,484,487,490,493],{},[66,482,483],{},"Device overview dashboard across all store locations",[66,485,486],{},"CRUD operations for printer devices, settings, and metadata",[66,488,489],{},"OIDC\u002FOAuth authentication with audience validation and permission-based access control",[66,491,492],{},"Integration with an internal StencilJS UI component library",[66,494,495],{},"Mock-data layer to maintain delivery pace during API development",[27,497,368],{"id":367},[17,499,500],{},"The application was built on Vue 3, marking the company's first adoption of the framework. The REST API followed OpenAPI Spec 3 and required implementing a full OIDC authentication flow against an internal identity provider. Where the product design diverged from the component library, I worked directly with the library owners to identify and resolve issues — fixes that propagated to all framework consumers of the library, including native web components.",{"title":305,"searchDepth":306,"depth":306,"links":502},[503,504,505],{"id":339,"depth":306,"text":340},{"id":346,"depth":306,"text":347},{"id":367,"depth":306,"text":368},"A multi-store European retailer needed a web interface to manage physical printers across all their locations — covering device overviews, settings, location assignment, and metadata. The project also served as the company's first introduction of Vue into their tech stack.",false,"The application launched successfully and became the foundation for future feature extensions. The team was fully onboarded into Vue with a solid understanding of component architecture and ecosystem best practices. Bug fixes contributed back to the shared component library benefited all downstream framework consumers.",{},3,"\u002Fprojects\u002Fen\u002Fprinter-management",{"title":469,"description":305},"printer-management","I built the web application using Vue 3 and an internal StencilJS-based UI component library, connected to a REST API following OpenAPI Spec 3 with OIDC authentication. I implemented OAuth-compliant auth including audience and permission checks, bridged gaps where the design diverged from the component library, and kept delivery on schedule by using mock data and mock services while the API was still in development. I also onboarded the development team into Vue, coaching best practices in component design and the Vue ecosystem.","projects\u002Fen\u002Fprinter-management","Europe-wide device management for retail",[518,76,519,461,520],"Vue 3","OIDC","StencilJS","Lml6xl48r7TlYoOKrxLziNBNr39Ol4Krxj6c7Y1WCco",{"id":523,"title":524,"body":525,"category":561,"challenge":562,"description":305,"extension":316,"featured":507,"image":380,"images":380,"impact":563,"meta":564,"navigation":318,"order":565,"path":566,"seo":567,"slug":568,"solution":569,"stem":570,"tagline":571,"tags":572,"testimonial":380,"testimonial_author":380,"testimonial_role":380,"url":380,"__hash__":579},"projects_en\u002Fprojects\u002Fen\u002Fhealthcare-chat-integration.md","Healthcare PWA Chat Integration",{"type":8,"value":526,"toc":556},[527,529,532,534,551,553],[27,528,340],{"id":339},[17,530,531],{},"This NDA-protected project involved integrating a real-time chat system into an existing React progressive web application serving clients and healthcare professionals. The app managed user data for both roles and required a communication channel between them. The project scope was narrowly focused: select the right chat technology and implement it end-to-end under a tight deadline.",[27,533,347],{"id":346},[63,535,536,539,542,545,548],{},[66,537,538],{},"RocketChat integrated via Docker into the existing infrastructure",[66,540,541],{},"Automatic RocketChat user provisioning on app registration and login",[66,543,544],{},"NestJS proxy endpoints for chat-room creation, message handling, and business logic",[66,546,547],{},"Custom WebSocket client implementation for real-time messaging in the React frontend",[66,549,550],{},"Jest unit tests on all new NestJS endpoints using dependency injection and module mocking",[27,552,368],{"id":367},[17,554,555],{},"The backend was generated with Amplication and already used MongoDB, which made it straightforward to share the same database instance with RocketChat. Rather than using RocketChat's pre-built UI, I implemented the WebSocket connection manually to match the client's existing interface design. NestJS's module system and dependency injection made it easy to write isolated unit tests for the new proxy endpoints, providing the first test coverage the project had seen.",{"title":305,"searchDepth":306,"depth":306,"links":557},[558,559,560],{"id":339,"depth":306,"text":340},{"id":346,"depth":306,"text":347},{"id":367,"depth":306,"text":368},"integration","A healthcare web application connecting clients and doctors was missing its core communication feature — a real-time user chat — with a hard deadline approaching. The existing codebase was a React PWA with a NestJS\u002FAmplication backend, both lacking tests or quality gates. The client had no tooling strategy and needed both a technology recommendation and a full implementation.","The chat feature was delivered on time and fully integrated into the existing application. NestJS endpoints were covered with Jest unit tests — the first quality-assurance layer in the project. The solution kept user management centralised and real-time messaging performant through a direct WebSocket connection.",{},4,"\u002Fprojects\u002Fen\u002Fhealthcare-chat-integration",{"title":524,"description":305},"healthcare-chat-integration","I researched and evaluated chat solutions with React support (including GetStream.io and RocketChat), presented findings to the client, and led the integration of RocketChat. I extended the existing Docker Compose setup to run RocketChat against the project's existing MongoDB instance, disabled self-registration, and implemented automatic user creation in RocketChat on login and registration. Proxy endpoints were built in NestJS to intercept chat-room creation and messaging with business logic, covered by Jest unit tests. On the frontend, I implemented a custom RocketChat WebSocket connection from scratch to enable real-time messaging within the app's existing UI design.","projects\u002Fen\u002Fhealthcare-chat-integration","Real-time chat for a client-doctor web app",[573,95,574,575,576,577,578],"React","RocketChat","WebSockets","MongoDB","Jest","PWA","TJ-MBDXVJck1GhNkVqnvvyCxjpshSCUkkWtcvAXi0A8",{"id":581,"title":582,"body":583,"category":445,"challenge":622,"description":305,"extension":316,"featured":507,"image":380,"images":380,"impact":623,"meta":624,"navigation":318,"order":625,"path":626,"seo":627,"slug":628,"solution":629,"stem":630,"tagline":631,"tags":632,"testimonial":380,"testimonial_author":380,"testimonial_role":380,"url":380,"__hash__":634},"projects_en\u002Fprojects\u002Fen\u002Fphotobooth-platform.md","Photobooth Platform",{"type":8,"value":584,"toc":617},[585,587,590,592,612,614],[27,586,340],{"id":339},[17,588,589],{},"This project involved rebuilding a photobooth software platform from the ground up for a company that rents out photobooths — including hardware, personnel, custom overlays, and software — for corporate events and live occasions. The existing MVP covered only the bare minimum and was not fit for real-world, high-volume use.",[27,591,347],{"id":346},[63,593,594,597,600,603,606,609],{},[66,595,596],{},"Node.js disk watcher detecting newly captured images from a WiFi SD card in real time",[66,598,599],{},"Laravel backend for image ingestion, thumbnail generation, and overlay compositing",[66,601,602],{},"WebSocket notifications pushing new images to the Vue frontend instantly",[66,604,605],{},"Overlay selection with backend-rendered preview images (mediocre resolution for speed)",[66,607,608],{},"Full-resolution image generation with selected overlay on confirmation",[66,610,611],{},"PHP print command dispatched from Laravel to the connected event printer",[27,613,368],{"id":367},[17,615,616],{},"The core challenge was achieving real-time responsiveness without polling. The combination of a Node.js file watcher and a Laravel WebSocket broadcaster meant the frontend was always up to date the moment a photo landed on disk. Thumbnail generation on the backend was essential to keep the frontend snappy — loading full-resolution images in a live event context would have caused noticeable delays. The Laravel\u002FVue stack replaced an unmaintainable plain PHP\u002FJS codebase with a clean, framework-structured application ready for future extensions.",{"title":305,"searchDepth":306,"depth":306,"links":618},[619,620,621],{"id":339,"depth":306,"text":340},{"id":346,"depth":306,"text":347},{"id":367,"depth":306,"text":368},"A photobooth rental company had an MVP built in plain PHP and HTML\u002FJS with no framework, no live image loading, and performance unsuitable for live events with high photo volumes. Freshly captured photos weren't displayed in real time, the codebase wasn't maintainable, and the frontend lacked the reactivity needed for a smooth booth experience.","The platform replaced a fragile MVP with a robust, maintainable application capable of handling high-volume live events. Real-time image delivery and instant print dispatch gave booth operators and event guests a smooth, responsive experience. The Laravel\u002FVue stack provided a clean foundation for future feature development.",{},5,"\u002Fprojects\u002Fen\u002Fphotobooth-platform",{"title":582,"description":305},"photobooth-platform","I rewrote the platform with a Laravel backend and Vue.js frontend. A Node.js script continuously scanned the target disk for new images captured via a WiFi-enabled SD card. On detection, it notified the Laravel backend, which processed each image — generating thumbnails for fast preview and overlay-composited versions for selection. Once a photo and overlay were chosen, Laravel generated the final full-resolution image and dispatched a PHP print command directly to the connected printer. The frontend received real-time updates via WebSocket, displaying new photos instantly without any manual reload.","projects\u002Fen\u002Fphotobooth-platform","Real-time photo processing for live events",[391,89,633,575,392],"Node.js","W5mRdtnD0Jw-b5OGRWkoqA6F848Ginjm4JraKNJEcd4",{"id":636,"title":637,"body":638,"category":445,"challenge":680,"description":305,"extension":316,"featured":318,"image":681,"images":682,"impact":685,"meta":686,"navigation":318,"order":687,"path":688,"seo":689,"slug":690,"solution":691,"stem":692,"tagline":693,"tags":694,"testimonial":380,"testimonial_author":380,"testimonial_role":380,"url":699,"__hash__":700},"projects_en\u002Fprojects\u002Fen\u002Fwichtel-wunsch.md","Wichtel-Wunsch",{"type":8,"value":639,"toc":675},[640,642,645,647,670,672],[27,641,340],{"id":339},[17,643,644],{},"Wichtel-Wunsch is a personal side project — a mobile-first Progressive Web App for organizing Secret Santa gift exchanges and managing wish lists. It solves the coordination problem of gift giving events without relying on group chats or spreadsheets.",[27,646,347],{"id":346},[63,648,649,652,655,658,661,664,667],{},[66,650,651],{},"Create and manage Wichtel events with a shareable invite link",[66,653,654],{},"Personal wish lists with optional shop URLs for each participant",[66,656,657],{},"All wish lists visible to every event member — no more guessing",[66,659,660],{},"Google OAuth authentication via Supabase Auth",[66,662,663],{},"Installable PWA with web push notification support",[66,665,666],{},"GDPR-compliant data export (Art. 15)",[66,668,669],{},"Fully responsive, mobile-first design",[27,671,368],{"id":367},[17,673,674],{},"Built with Nuxt 4 and Vue 3 on the frontend, backed by Supabase (PostgreSQL) for the database and authentication layer. Every table is protected with Row Level Security policies. The project includes a comprehensive test suite: 163 database tests using pgTAP covering schema constraints, RLS rules, and application behavior, plus E2E tests with Cypress.",{"title":305,"searchDepth":306,"depth":306,"links":676},[677,678,679],{"id":339,"depth":306,"text":340},{"id":346,"depth":306,"text":347},{"id":367,"depth":306,"text":368},"Organizing Secret Santa events is chaotic — who buys for whom, what does each person actually want, and how do you coordinate without spoiling surprises? Existing tools are either too bloated or require accounts on third-party platforms people don't trust.","\u002Fimages\u002Fprojects\u002Fwichtel-wunsch.webp",[681,683,684],"\u002Fimages\u002Fprojects\u002Fwichtel-wunsch-event.webp","\u002Fimages\u002Fprojects\u002Fwichtel-wunsch-admin.webp","A clean, installable PWA that makes Secret Santa events effortless to organize. The app is GDPR-compliant with a data export feature, secured with Row Level Security on every database table, and backed by 163 automated database tests covering schema integrity, RLS policies, and business logic.",{},6,"\u002Fprojects\u002Fen\u002Fwichtel-wunsch",{"title":637,"description":305},"wichtel-wunsch","I built Wichtel-Wunsch as a mobile-first Progressive Web App using Nuxt 4, Vue 3, and Supabase. Users can create events, invite friends via a shareable link, and manage personal wish lists with optional shop links. All participant wish lists are visible within the event, so no one needs to guess. Authentication is handled via Google OAuth, and the app is fully installable on any device.","projects\u002Fen\u002Fwichtel-wunsch","Secret Santa & wish list PWA",[695,391,76,696,697,698,578],"Nuxt","Supabase","PostgreSQL","TailwindCSS","https:\u002F\u002Fwichtel-wunsch.app","95bansLqOEWlaezIEMr6cJLRtciGgZIaXhK2CGQcG9k",[702,735,773,806,839,874],{"id":333,"title":334,"body":703,"category":377,"challenge":378,"description":305,"extension":316,"featured":318,"image":379,"images":380,"impact":381,"meta":732,"navigation":318,"order":383,"path":384,"seo":733,"slug":386,"solution":387,"stem":388,"tagline":389,"tags":734,"testimonial":395,"testimonial_author":396,"testimonial_role":397,"url":398,"__hash__":399},{"type":8,"value":704,"toc":727},[705,707,709,711,723,725],[27,706,340],{"id":339},[17,708,343],{},[27,710,347],{"id":346},[63,712,713,715,717,719,721],{},[66,714,352],{},[66,716,355],{},[66,718,358],{},[66,720,361],{},[66,722,364],{},[27,724,368],{"id":367},[17,726,371],{},{"title":305,"searchDepth":306,"depth":306,"links":728},[729,730,731],{"id":339,"depth":306,"text":340},{"id":346,"depth":306,"text":347},{"id":367,"depth":306,"text":368},{},{"title":334,"description":305},[391,89,392,393,394],{"id":401,"title":402,"body":736,"category":445,"challenge":446,"description":305,"extension":316,"featured":318,"image":447,"images":769,"impact":452,"meta":770,"navigation":318,"order":306,"path":454,"seo":771,"slug":456,"solution":457,"stem":458,"tagline":459,"tags":772,"testimonial":463,"testimonial_author":464,"testimonial_role":465,"url":380,"__hash__":466},{"type":8,"value":737,"toc":764},[738,740,742,744,760,762],[27,739,340],{"id":339},[17,741,409],{},[27,743,347],{"id":346},[63,745,746,748,750,752,754,756,758],{},[66,747,416],{},[66,749,419],{},[66,751,422],{},[66,753,425],{},[66,755,428],{},[66,757,431],{},[66,759,434],{},[27,761,368],{"id":367},[17,763,439],{},{"title":305,"searchDepth":306,"depth":306,"links":765},[766,767,768],{"id":339,"depth":306,"text":340},{"id":346,"depth":306,"text":347},{"id":367,"depth":306,"text":368},[447,449,450,451],{},{"title":402,"description":305},[391,76,392,461,462],{"id":468,"title":469,"body":774,"category":445,"challenge":506,"description":305,"extension":316,"featured":507,"image":380,"images":380,"impact":508,"meta":803,"navigation":318,"order":510,"path":511,"seo":804,"slug":513,"solution":514,"stem":515,"tagline":516,"tags":805,"testimonial":380,"testimonial_author":380,"testimonial_role":380,"url":380,"__hash__":521},{"type":8,"value":775,"toc":798},[776,778,780,782,794,796],[27,777,340],{"id":339},[17,779,476],{},[27,781,347],{"id":346},[63,783,784,786,788,790,792],{},[66,785,483],{},[66,787,486],{},[66,789,489],{},[66,791,492],{},[66,793,495],{},[27,795,368],{"id":367},[17,797,500],{},{"title":305,"searchDepth":306,"depth":306,"links":799},[800,801,802],{"id":339,"depth":306,"text":340},{"id":346,"depth":306,"text":347},{"id":367,"depth":306,"text":368},{},{"title":469,"description":305},[518,76,519,461,520],{"id":523,"title":524,"body":807,"category":561,"challenge":562,"description":305,"extension":316,"featured":507,"image":380,"images":380,"impact":563,"meta":836,"navigation":318,"order":565,"path":566,"seo":837,"slug":568,"solution":569,"stem":570,"tagline":571,"tags":838,"testimonial":380,"testimonial_author":380,"testimonial_role":380,"url":380,"__hash__":579},{"type":8,"value":808,"toc":831},[809,811,813,815,827,829],[27,810,340],{"id":339},[17,812,531],{},[27,814,347],{"id":346},[63,816,817,819,821,823,825],{},[66,818,538],{},[66,820,541],{},[66,822,544],{},[66,824,547],{},[66,826,550],{},[27,828,368],{"id":367},[17,830,555],{},{"title":305,"searchDepth":306,"depth":306,"links":832},[833,834,835],{"id":339,"depth":306,"text":340},{"id":346,"depth":306,"text":347},{"id":367,"depth":306,"text":368},{},{"title":524,"description":305},[573,95,574,575,576,577,578],{"id":581,"title":582,"body":840,"category":445,"challenge":622,"description":305,"extension":316,"featured":507,"image":380,"images":380,"impact":623,"meta":871,"navigation":318,"order":625,"path":626,"seo":872,"slug":628,"solution":629,"stem":630,"tagline":631,"tags":873,"testimonial":380,"testimonial_author":380,"testimonial_role":380,"url":380,"__hash__":634},{"type":8,"value":841,"toc":866},[842,844,846,848,862,864],[27,843,340],{"id":339},[17,845,589],{},[27,847,347],{"id":346},[63,849,850,852,854,856,858,860],{},[66,851,596],{},[66,853,599],{},[66,855,602],{},[66,857,605],{},[66,859,608],{},[66,861,611],{},[27,863,368],{"id":367},[17,865,616],{},{"title":305,"searchDepth":306,"depth":306,"links":867},[868,869,870],{"id":339,"depth":306,"text":340},{"id":346,"depth":306,"text":347},{"id":367,"depth":306,"text":368},{},{"title":582,"description":305},[391,89,633,575,392],{"id":636,"title":637,"body":875,"category":445,"challenge":680,"description":305,"extension":316,"featured":318,"image":681,"images":908,"impact":685,"meta":909,"navigation":318,"order":687,"path":688,"seo":910,"slug":690,"solution":691,"stem":692,"tagline":693,"tags":911,"testimonial":380,"testimonial_author":380,"testimonial_role":380,"url":699,"__hash__":700},{"type":8,"value":876,"toc":903},[877,879,881,883,899,901],[27,878,340],{"id":339},[17,880,644],{},[27,882,347],{"id":346},[63,884,885,887,889,891,893,895,897],{},[66,886,651],{},[66,888,654],{},[66,890,657],{},[66,892,660],{},[66,894,663],{},[66,896,666],{},[66,898,669],{},[27,900,368],{"id":367},[17,902,674],{},{"title":305,"searchDepth":306,"depth":306,"links":904},[905,906,907],{"id":339,"depth":306,"text":340},{"id":346,"depth":306,"text":347},{"id":367,"depth":306,"text":368},[681,683,684],{},{"title":637,"description":305},[695,391,76,696,697,698,578],1775672745252]