[{"data":1,"prerenderedAt":2422},["ShallowReactive",2],{"productsSearch":3,"openSourceSearch":112,"postsSearch":250,"guidesSearch":1057,"blog-php-laravel-node-emudhra-security-updates-october-2026":1101,"guides-post-null":15,"guides-posts-null":15,"header-products":2212,"$f2bzpwklhdwuf9":2250,"footer-products":2274,"header-open-source":2312,"footer-open-source":2367},[4,36,59,87],{"id":5,"title":6,"badge":7,"badges":8,"buy_url":15,"complete_package_url":15,"description":16,"essentials_url":15,"extension":17,"external":18,"logo_component":15,"logo_square":19,"logo_wide":20,"meta":21,"screenshot":29,"short_description":30,"short_title":15,"stem":31,"trial_url":32,"type":33,"url":34,"__hash__":35},"products\u002Fproducts\u002F1.selfhost-pro.md","Self-Host Pro","New",[9,12],{"label":10,"color":11},"Docker","#2970FF",{"label":13,"color":14},"Marketplace","#EF6820",null,"Sell self-hosted software in minutes. Push your Docker image, connect Stripe, and let your customers install with a single command.","md",true,"\u002Flogos\u002Fselfhostpro-white-icon.svg","\u002Flogos\u002Fselfhostpro.svg",{"body":22},{"type":23,"value":24,"toc":25},"minimark",[],{"title":26,"searchDepth":27,"depth":27,"links":28},"",2,[],"\u002Fscreenshots\u002Fselfhostpro.png","Sell self-hosted software in minutes.","products\u002F1.selfhost-pro","https:\u002F\u002Fapp.selfhostpro.com\u002Fregister","saas","https:\u002F\u002Fselfhostpro.com","TxV-epPTzFONj85grGEZbtfNIKuDkaEJEcwRzaNtOVc",{"id":37,"title":38,"badge":15,"badges":39,"buy_url":45,"complete_package_url":15,"description":46,"essentials_url":15,"extension":17,"external":18,"logo_component":15,"logo_square":47,"logo_wide":48,"meta":49,"screenshot":54,"short_description":55,"short_title":15,"stem":56,"trial_url":15,"type":33,"url":57,"__hash__":58},"products\u002Fproducts\u002F3.spin-pro.md","Spin Pro",[40,42],{"label":41,"color":11},"Self-hosted",{"label":43,"color":44},"Starter Kit","#EE46BC","https:\u002F\u002Fstore.serversideup.net\u002Fbuy\u002F9cf51bbc-2a86-4ea1-958b-c4d69e05cde6?checkout%5Bdiscount_code%5D=FIRST50","Based on a collection of our open source projects, Spin Pro enables Laravel Pros to ship software with the power of a PaaS to any VPS host of their choice. Available as PAY ONCE infrastructure.","\u002Flogos\u002Fspin-icon.svg","\u002Flogos\u002Fspin-pro.svg",{"body":50},{"type":23,"value":51,"toc":52},[],{"title":26,"searchDepth":27,"depth":27,"links":53},[],"\u002Fscreenshots\u002Fspin-pro.png","Production-ready Docker templates for shipping quickly.","products\u002F3.spin-pro","https:\u002F\u002Fgetspin.pro","pHr_PxhWYDeM1Enca9N61yxQcIogpuI1pmigoa9PcHo",{"id":60,"title":61,"badge":15,"badges":62,"buy_url":69,"complete_package_url":69,"description":70,"essentials_url":71,"extension":17,"external":72,"logo_component":73,"logo_square":74,"logo_wide":15,"meta":75,"screenshot":80,"short_description":81,"short_title":82,"stem":83,"trial_url":15,"type":84,"url":85,"__hash__":86},"products\u002Fproducts\u002F4.browser-extensions-book.md","Building Browser Extensions",[63,66],{"label":64,"color":65},"Book","#17B26A",{"label":67,"color":68},"Source Code","#0BA5EC","https:\u002F\u002Fstore.serversideup.net\u002Fcheckout\u002Fbuy\u002F5ec75643-2fc5-4366-ae67-213a217c4e54?checkout","Learn how to efficiently build browser extensions for every major browser from the same codebase. Source code examples for every major JavaScript framework is included.","https:\u002F\u002Fstore.serversideup.net\u002Fcheckout\u002Fbuy\u002F96e2d787-e797-4e13-9c8d-0aeb7b687844",false,"LogosChrome","\u002Flogos\u002Fchrome.svg",{"body":76},{"type":23,"value":77,"toc":78},[],{"title":26,"searchDepth":27,"depth":27,"links":79},[],"\u002Fscreenshots\u002Fbrowser-extensions-book.png","Build browser extensions for Firefox, Chrome, and more.","Building Browser Ext.","products\u002F4.browser-extensions-book","book","\u002Fproducts\u002Fbuilding-multi-platform-browser-extensions\u002F","s5qFx4_mAvZQ1oY9mxqJtMDG-IUpZ4viKXGB2cpCqUE",{"id":88,"title":89,"badge":15,"badges":90,"buy_url":96,"complete_package_url":96,"description":97,"essentials_url":98,"extension":17,"external":72,"logo_component":99,"logo_square":100,"logo_wide":15,"meta":101,"screenshot":106,"short_description":107,"short_title":108,"stem":109,"trial_url":15,"type":84,"url":110,"__hash__":111},"products\u002Fproducts\u002F5.api-spa-book.md","Ultimate Guide To Building APIs & SPAs",[91,92,93],{"label":64,"color":65},{"label":67,"color":68},{"label":94,"color":95},"Videos","#7A5AF8","https:\u002F\u002Fserversideup.lemonsqueezy.com\u002Fcheckout\u002Fbuy\u002F10d32965-4348-4502-a8cc-cf4895c4a841?checkout%5Bdiscount_code%5D=LAUNCHCOMPLETE","Learn how you can use a Laravel API with a Nuxt frontend. You'll then learn how you can take that same Nuxt code and compile it into iOS and Android apps using the same codebase with Capacitor. Includes source code, Figma templates, videos, and more.","https:\u002F\u002Fserversideup.lemonsqueezy.com\u002Fcheckout\u002Fbuy\u002F69a4e541-e74b-4c40-9cde-15fd9a13c6da?checkout%5Bdiscount_code%5D=LAUNCHESSENTIALS","LogosAppStore","\u002Flogos\u002Fapp-store-icon.svg",{"body":102},{"type":23,"value":103,"toc":104},[],{"title":26,"searchDepth":27,"depth":27,"links":105},[],"\u002Fscreenshots\u002Fapi-book.png","Build web and mobile apps from the same codebase.","Guide to APIs & SPAs","products\u002F5.api-spa-book","\u002Fproducts\u002Fultimate-guide-to-building-apis-and-spas-with-laravel-and-nuxt3\u002F","D4l8dwFfsCcIeSTW_mGwnj9ntvx-ndSDzDga4syx2R8",[113,140,162,185,209,231],{"id":114,"title":115,"badge":15,"badges":116,"description":123,"extension":17,"external":72,"github_slug":124,"logo_square":125,"logo_wide":126,"meta":127,"repo_url":132,"screenshot":133,"short_description":134,"short_title":135,"stem":136,"type":137,"url":138,"__hash__":139},"openSource\u002Fopen-source\u002F1.docker-php.md","Docker PHP",[117,120],{"label":118,"color":119},"Open Source","#85888E",{"label":121,"color":122},"Docker Image","#2E90FA","Our open source PHP Docker images are production-ready and optimized for Laravel and WordPress. Configuration is a breeze with environment variables. Choose between FPM+NGINX, NGINX Unit, and more.","serversideup\u002Fdocker-php","\u002Flogos\u002Fdocker-php-icon.svg","\u002Flogos\u002Fdocker-php.svg",{"body":128},{"type":23,"value":129,"toc":130},[],{"title":26,"searchDepth":27,"depth":27,"links":131},[],"https:\u002F\u002Fgithub.com\u002Fserversideup\u002Fdocker-php","\u002Fscreenshots\u002Fdocker-php.png","Supercharged PHP Docker images, based off the official PHP images.","serversideup\u002Fphp","open-source\u002F1.docker-php","docker-image","https:\u002F\u002Fserversideup.net\u002Fopen-source\u002Fdocker-php\u002F","n3MDRhVVgGQLn9OfH6Hh1RXTN2LO0npzihr14Ju_Q8Y",{"id":141,"title":142,"badge":15,"badges":143,"description":147,"extension":17,"external":72,"github_slug":148,"logo_square":47,"logo_wide":149,"meta":150,"repo_url":155,"screenshot":156,"short_description":157,"short_title":15,"stem":158,"type":159,"url":160,"__hash__":161},"openSource\u002Fopen-source\u002F2.spin.md","Spin",[144,145],{"label":118,"color":119},{"label":146,"color":14},"Deployment Tool","Get the power of running a PaaS on any VPS host of your choice. Run your application in a 100% replicated workflow on macOS, Windows, and Linux all using Docker.","serversideup\u002Fspin","\u002Flogos\u002Fspin.svg",{"body":151},{"type":23,"value":152,"toc":153},[],{"title":26,"searchDepth":27,"depth":27,"links":154},[],"https:\u002F\u002Fgithub.com\u002Fserversideup\u002Fspin","\u002Fscreenshots\u002Fspin.png","Docker Simplified. Deploy Anywhere. Zero Downtime. Any OS.","open-source\u002F2.spin","tool","https:\u002F\u002Fserversideup.net\u002Fopen-source\u002Fspin\u002F","3wkEWcMFZ07pUCDQR2PS0I3BE0GhqZWUUWEl9Ne2hks",{"id":163,"title":164,"badge":15,"badges":165,"description":169,"extension":17,"external":72,"github_slug":170,"logo_square":171,"logo_wide":172,"meta":173,"repo_url":178,"screenshot":179,"short_description":180,"short_title":15,"stem":181,"type":182,"url":183,"__hash__":184},"openSource\u002Fopen-source\u002F3.financial-freedom.md","Financial Freedom",[166,167],{"label":118,"color":119},{"label":168,"color":65},"Budgeting Tool","An open source alternative to Mint and YNAB. Track your expenses and never worry about your financial data being used by investors again.","serversideup\u002Ffinancial-freedom","\u002Flogos\u002Ffinancial-freedom-white-icon.svg","\u002Flogos\u002Ffinancial-freedom.svg",{"body":174},{"type":23,"value":175,"toc":176},[],{"title":26,"searchDepth":27,"depth":27,"links":177},[],"https:\u002F\u002Fgithub.com\u002Fserversideup\u002Ffinancial-freedom","\u002Fscreenshots\u002Ffinancial-freedom.png","Open source alternative to Mint, YNAB, and more.","open-source\u002F3.financial-freedom","app","https:\u002F\u002Fserversideup.net\u002Fopen-source\u002Ffinancial-freedom\u002F","Jg0Q8582POghRvbb20PbbEAhD1TE9wqX0eaazoaNmXI",{"id":186,"title":187,"badge":15,"badges":188,"description":193,"extension":17,"external":72,"github_slug":194,"logo_square":195,"logo_wide":196,"meta":197,"repo_url":202,"screenshot":203,"short_description":204,"short_title":15,"stem":205,"type":206,"url":207,"__hash__":208},"openSource\u002Fopen-source\u002F4.amplitudejs.md","AmplitudeJS",[189,190],{"label":118,"color":119},{"label":191,"color":192},"HTML5 Audio Library","#6172F3","Gain full control of the web audio element in HTML5. Design your audio player to exactly match your vision. Use visualizers to take your audio to the next level.","521dimensions\u002Famplitudejs","\u002Flogos\u002Famplitude-white-icon.svg","\u002Flogos\u002Famplitudejs.svg",{"body":198},{"type":23,"value":199,"toc":200},[],{"title":26,"searchDepth":27,"depth":27,"links":201},[],"https:\u002F\u002Fgithub.com\u002Fserversideup\u002Famplitudejs","\u002Fscreenshots\u002Famplitude.png","Customize the design of any element of the HTML5 Audio Player.","open-source\u002F4.amplitudejs","library","https:\u002F\u002Fserversideup.net\u002Fopen-source\u002Famplitudejs\u002F","R3gWpQhxl9MpRlgAmUDocJIiXI4GkM2rlVh4zNa4vC8",{"id":210,"title":211,"badge":15,"badges":212,"description":216,"extension":17,"external":72,"github_slug":217,"logo_square":218,"logo_wide":219,"meta":220,"repo_url":225,"screenshot":226,"short_description":227,"short_title":15,"stem":228,"type":206,"url":229,"__hash__":230},"openSource\u002Fopen-source\u002F5.webext-bridge.md","webext-bridge",[213,214],{"label":118,"color":119},{"label":215,"color":14},"Browser Extensions","Simplify the communication between your browser extension's components with a type-safe messaging library for Chrome, Firefox, and Edge.","serversideup\u002Fwebext-bridge","\u002Flogos\u002Fweb-ext-bridge-icon.svg","\u002Flogos\u002Fwebext-bridge.svg",{"body":221},{"type":23,"value":222,"toc":223},[],{"title":26,"searchDepth":27,"depth":27,"links":224},[],"https:\u002F\u002Fgithub.com\u002Fserversideup\u002Fwebext-bridge","\u002Fscreenshots\u002Fwebext-bridge.png","Messaging in Web Extensions made easy. Batteries included.","open-source\u002F5.webext-bridge","https:\u002F\u002Fserversideup.net\u002Fopen-source\u002Fwebext-bridge\u002F","vo7OidHO3fjG5C819Z2hkTIj_IG0QiB_Ubqsi7bWLM8",{"id":232,"title":233,"badge":15,"badges":234,"description":237,"extension":17,"external":18,"github_slug":238,"logo_square":239,"logo_wide":15,"meta":240,"repo_url":245,"screenshot":15,"short_description":246,"short_title":247,"stem":248,"type":137,"url":245,"__hash__":249},"openSource\u002Fopen-source\u002F6.docker-ansible.md","Docker Ansible",[235,236],{"label":118,"color":119},{"label":121,"color":122},"Run Ansible anywhere with a lightweight and powerful Docker image for automation and configuration management.","serversideup\u002Fdocker-ansible","\u002Flogos\u002Fansible-icon.svg",{"body":241},{"type":23,"value":242,"toc":243},[],{"title":26,"searchDepth":27,"depth":27,"links":244},[],"https:\u002F\u002Fgithub.com\u002Fserversideup\u002Fdocker-ansible","Run Ansible anywhere with a lightweight and powerful Docker image.","serversideup\u002Fansible","open-source\u002F6.docker-ansible","77f1RaRu4xdWkmjM6pVXwQqXxN0nlTEu6zFcMthppzQ",[251,258,264,269,275,282,287,292,297,303,308,313,318,323,328,333,338,343,349,354,359,364,369,374,379,384,389,395,400,405,410,414,419,424,429,434,439,443,447,451,456,461,465,470,475,480,485,490,495,500,506,511,515,521,526,530,536,541,546,551,556,560,565,570,575,580,586,591,596,601,606,611,616,621,626,631,636,641,646,651,655,660,665,670,675,680,685,689,693,698,703,708,712,717,722,727,732,736,740,744,749,753,758,763,768,773,778,783,788,793,797,802,806,811,816,821,826,831,836,841,846,851,856,860,865,870,875,880,885,890,895,900,905,910,915,919,924,929,934,939,944,948,952,956,961,965,970,974,978,982,986,991,996,1001,1005,1009,1014,1019,1024,1029,1033,1038,1043,1048,1053],{"path":252,"title":253,"categories":254,"date":257},"\u002Fblog\u002Faccessing-route-parameters-in-nuxt-3","Accessing Route Parameters in Nuxt 3",[255,256],"nuxt","vue","2022-03-30",{"path":259,"title":260,"categories":261,"date":263},"\u002Fblog\u002Fadd-api-end-points-laravel","Add Laravel API Endpoints",[262],"laravel","2017-10-09",{"path":265,"title":266,"categories":267,"date":268},"\u002Fblog\u002Fadding-laravel-user-profiles","Adding Laravel User Profiles",[262],"2018-01-11",{"path":270,"title":271,"categories":272,"date":274},"\u002Fblog\u002Fadding-server-configurations-within-your-laravel-app","Adding server configurations within your Laravel App",[262,273],"devops","2023-05-24",{"path":276,"title":277,"categories":278,"date":281},"\u002Fblog\u002Fadopt-a-ubiquiti-usg-to-a-unifi-cloud-controller-automate-device-deployments","Adopt a Ubiquiti USG to a UniFi Cloud Controller & automate device deployments",[279,280],"unifi","networking","2018-06-20",{"path":283,"title":284,"categories":285,"date":286},"\u002Fblog\u002Fadvanced-data-fetching-with-nuxt-3","Advanced Data Fetching with Nuxt 3",[255],"2023-01-26",{"path":288,"title":289,"categories":290,"date":291},"\u002Fblog\u002Fadvanced-meilisearch-queries-with-laravel-scout","Advanced Meilisearch Queries with Laravel Scout",[262],"2022-04-18",{"path":293,"title":294,"categories":295,"date":296},"\u002Fblog\u002Fadvanced-vuex-4-tips","Advanced Vuex 4 Tips",[256],"2021-09-28",{"path":298,"title":299,"categories":300,"date":302},"\u002Fblog\u002Famplitudejs-configuration-options","AmplitudeJS Configuration Options",[301],"javascript","2018-09-20",{"path":304,"title":305,"categories":306,"date":307},"\u002Fblog\u002Famplitudejs-live-stream-html5-audio","AmplitudeJS for Live Stream HTML5 Audio",[301],"2014-04-05",{"path":309,"title":310,"categories":311,"date":312},"\u002Fblog\u002Fanimista-css-with-vuejs-transitions","Animista CSS Animations with VueJS Transitions",[256],"2018-05-17",{"path":314,"title":315,"categories":316,"date":317},"\u002Fblog\u002Fapi-form-submissions-javascript-vuex-laravel","API Driven Form Submissions with Javascript, Vuex and Laravel",[262,256],"2017-10-26",{"path":319,"title":320,"categories":321,"date":322},"\u002Fblog\u002Fappend-gravatar-attribute-to-the-laravel-eloquent-user-model","Append Gravatar Attribute to the Laravel Eloquent User Model",[262],"2021-12-07",{"path":324,"title":325,"categories":326,"date":327},"\u002Fblog\u002Fautomatic-controller-assignment-unifi-dhcp-option-43-mikrotik-routers","Automatic Controller Assignment for UniFi DHCP Option 43 on Mikrotik Routers",[279,280],"2017-09-13",{"path":329,"title":330,"categories":331,"date":332},"\u002Fblog\u002Fbasic-get-requests-with-fetch-api-and-vuejs","Basic GET Requests with Fetch API and VueJS",[256],"2020-11-18",{"path":334,"title":335,"categories":336,"date":337},"\u002Fblog\u002Fbeginning-vuex-4-with-vue-3","Beginning Vuex 4 with Vue 3",[256],"2021-09-07",{"path":339,"title":340,"categories":341,"date":342},"\u002Fblog\u002Fbest-practices-for-planning-for-unifi-video","Best practices for planning for UniFi Video",[279,280],"2018-06-22",{"path":344,"title":345,"categories":346,"date":348},"\u002Fblog\u002Fbrowser-extension-messaging","Browser Extension Messaging",[347],"browserextensions","2023-12-12",{"path":350,"title":351,"categories":352,"date":353},"\u002Fblog\u002Fbuild-an-api-wrapper-with-vuejs-axios","Build an API Wrapper with VueJS & Axios",[256],"2020-11-16",{"path":355,"title":356,"categories":357,"date":358},"\u002Fblog\u002Fbuild-api-requests-javascript","Build Out API Requests in Javascript",[301],"2017-10-12",{"path":360,"title":361,"categories":362,"date":363},"\u002Fblog\u002Fbuild-vuex-module","Build a Vuex Module",[256],"2017-10-16",{"path":365,"title":366,"categories":367,"date":368},"\u002Fblog\u002Fbuilding-a-queue-with-vue-3-and-vuex-4","Building a Queue with Vue 3 and Vuex 4",[256],"2022-03-17",{"path":370,"title":371,"categories":372,"date":373},"\u002Fblog\u002Fbuilding-a-single-song-player","Building a Single Song Player",[301],"2018-08-30",{"path":375,"title":376,"categories":377,"date":378},"\u002Fblog\u002Fbuilding-page-layout-vue-router","Building a Page Layout for Vue Router",[262,256],"2017-10-23",{"path":380,"title":381,"categories":382,"date":383},"\u002Fblog\u002Fcaching-api-endpoints-with-laravel","Caching API Endpoints with Laravel",[262],"2022-09-27",{"path":385,"title":386,"categories":387,"date":388},"\u002Fblog\u002Fcapturing-an-image-from-an-html5-canvas-or-video-element","Capturing an image from an HTML5 Canvas or Video Element",[301],"2021-10-05",{"path":390,"title":391,"categories":392,"date":394},"\u002Fblog\u002Fchoosing-your-services-and-database","Choosing Your Services and Database",[393],"programming","2026-03-26",{"path":396,"title":397,"categories":398,"date":399},"\u002Fblog\u002Fcisco-ios-command-cheat-sheet-for-routers-and-switches","Cisco IOS Command Cheat Sheet for Routers and Switches",[273],"2011-11-22",{"path":401,"title":402,"categories":403,"date":404},"\u002Fblog\u002Fclean-vuejs-public-private-routes","VueJS Route Security and Authentication",[256],"2018-01-04",{"path":406,"title":407,"categories":408,"date":409},"\u002Fblog\u002Fcollections-blueprints-and-entries-with-statamic-3","Collections, Blueprints, and Entries with Statamic 3",[262],"2022-03-12",{"path":411,"title":412,"categories":413,"date":342},"\u002Fblog\u002Fconfigure-a-secure-guest-wireless-network-using-vlans-firewalls-and-throttling","Configure a secure guest wireless network using VLANs, firewalls, and throttling",[279,280],{"path":415,"title":416,"categories":417,"date":418},"\u002Fblog\u002Fconfigure-stripe-to-work-with-laravel-cashier-in-laravel-6","Configure Stripe to Work with Laravel Cashier in Laravel 6",[262],"2019-12-17",{"path":420,"title":421,"categories":422,"date":423},"\u002Fblog\u002Fconfiguring-axios-globally-with-vuejs","Configuring Axios Globally with VueJS",[256],"2020-08-03",{"path":425,"title":426,"categories":427,"date":428},"\u002Fblog\u002Fconfiguring-js-sass-single-page-app","Configuring JS and SASS for a Single Page App",[256,262],"2017-09-28",{"path":430,"title":431,"categories":432,"date":433},"\u002Fblog\u002Fconfiguring-vue-router-single-page-app","Configuring Vue Router for a Single Page App",[256],"2019-08-10",{"path":435,"title":436,"categories":437,"date":438},"\u002Fblog\u002Fcordova-app-icon-sizes","Creating Cordova App Icon Sizes the Fast Way",[301],"2017-08-31",{"path":440,"title":441,"categories":442,"date":418},"\u002Fblog\u002Fcreating-a-stripe-subscription-with-laravel-cashier-laravel-passport","Creating a Stripe Subscription with Laravel Cashier + Laravel Passport",[262,256],{"path":444,"title":445,"categories":446,"date":418},"\u002Fblog\u002Fcreating-saas-products-in-stripe-to-sell-with-laravel-cashier","Creating SAAS Products in Stripe to Sell with Laravel Cashier",[262],{"path":448,"title":449,"categories":450,"date":418},"\u002Fblog\u002Fcreating-stripe-setup-intents-with-laravel-api-and-vuejs-spa","Creating Stripe Setup Intents With Laravel API and VueJS SPA",[256],{"path":452,"title":453,"categories":454,"date":455},"\u002Fblog\u002Fcustom-component-v-model-attribute-with-vue-3","Custom Component v-model attribute with Vue 3",[256],"2022-01-27",{"path":457,"title":458,"categories":459,"date":460},"\u002Fblog\u002Fcustom-google-maps-info-windows","Custom Google Maps Info Windows",[256],"2017-11-09",{"path":462,"title":463,"categories":464,"date":460},"\u002Fblog\u002Fcustom-markers-google-map","Custom Markers on Google Map",[256],{"path":466,"title":467,"categories":468,"date":469},"\u002Fblog\u002Fcustomize-google-map-info-windows","Customize Google Map Info Windows",[256],"2017-12-14",{"path":471,"title":472,"categories":473,"date":474},"\u002Fblog\u002Fcustomize-html-audio-css-amplitudejs","Customize HTML Audio via CSS -- Introducing AmplitudeJS",[301],"2014-04-04",{"path":476,"title":477,"categories":478,"date":479},"\u002Fblog\u002Fcustomizing-and-displaying-tags-in-statamic-3","Customizing and Displaying Tags in Statamic 3",[262],"2022-03-15",{"path":481,"title":482,"categories":483,"date":484},"\u002Fblog\u002Fdeploy-unifi-cloud-controller-5-10-minutes","Deploy a UniFi Cloud Controller for $5 and under 10 minutes",[279,280],"2017-11-30",{"path":486,"title":487,"categories":488,"date":489},"\u002Fblog\u002Fdesigning-an-installation-script","Designing an Installation Script",[393],"2026-04-08",{"path":491,"title":492,"categories":493,"date":494},"\u002Fblog\u002Fdetect-if-click-is-inside-an-element-with-javascript","Detect if Click is Inside an Element with JavaScript",[301],"2022-10-11",{"path":496,"title":497,"categories":498,"date":499},"\u002Fblog\u002Fdisplaying-resources-google-map-vue-js","Displaying Resources on a Google Map With Vue JS",[256],"2017-11-06",{"path":501,"title":502,"categories":503,"date":505},"\u002Fblog\u002Fdocker-compose-bind-mounts-vs-named-volumes","Docker Compose Bind Mounts vs Named Volumes: When to Use Each",[504,273],"docker","2026-04-02",{"path":507,"title":508,"categories":509,"date":510},"\u002Fblog\u002Fdrag-and-drop-file-uploads-with-vuejs-and-axios","Drag and Drop File Uploads with VueJS and Axios",[256],"2018-01-09",{"path":512,"title":513,"categories":514,"date":291},"\u002Fblog\u002Fdynamic-api-requests-with-nuxt-3","Dynamic API Requests with Nuxt 3",[255],{"path":516,"title":517,"categories":518,"date":520},"\u002Fblog\u002Fdynamic-autocomplete-options-with-ajax-javascript-jquery-and-php","Dynamic Autocomplete Options with AJAX, Javascript, JQuery and PHP",[301,519],"php","2012-10-08",{"path":522,"title":523,"categories":524,"date":525},"\u002Fblog\u002Fdynamic-forms-vuejs","Dynamic Forms with VueJS",[256],"2017-11-16",{"path":527,"title":528,"categories":529,"date":525},"\u002Fblog\u002Feloquent-parent-child-relationship-laravel","Eloquent Parent Child Relationship in Laravel",[262],{"path":531,"title":532,"categories":533,"date":535},"\u002Fblog\u002Fenable-key-based-ssh-authentication-on-synology-servers","Enable key-based SSH authentication on Synology servers",[534],"synology","2018-08-28",{"path":537,"title":538,"categories":539,"date":540},"\u002Fblog\u002Fevent-handler-tips-for-javascript-and-vuejs","Event Handler Tips for JavaScript and VueJS",[256],"2022-09-13",{"path":542,"title":543,"categories":544,"date":545},"\u002Fblog\u002Ffavoriting-liking-laravel-vuejs","Favoriting or Liking With Laravel and VueJS",[256,262],"2017-11-20",{"path":547,"title":548,"categories":549,"date":550},"\u002Fblog\u002Ffetch-api-components-with-vue-3-composition-api","Fetch API Components with Vue 3 Composition API",[256],"2021-11-30",{"path":552,"title":553,"categories":554,"date":555},"\u002Fblog\u002Ffile-management-with-vuejs-and-laravel","File Management with VueJS and Laravel",[256,262],"2018-01-15",{"path":557,"title":558,"categories":559,"date":510},"\u002Fblog\u002Ffile-upload-progress-indicator-with-axios-and-vuejs","File Upload Progress Indicator with Axios and VueJS",[256],{"path":561,"title":562,"categories":563,"date":564},"\u002Fblog\u002Ffile-uploads-using-fetch-api-and-vuejs","File Uploads using Fetch API and VueJS",[256],"2021-11-23",{"path":566,"title":567,"categories":568,"date":569},"\u002Fblog\u002Ffilter-sort-and-search-arrays-with-javascript","Filter, Sort, and Search Arrays with JavaScript",[301],"2022-10-04",{"path":571,"title":572,"categories":573,"date":574},"\u002Fblog\u002Ffiltering-meilisearch-search-results-with-laravel-scout","Filtering Meilisearch Search Results with Laravel Scout",[262],"2022-04-11",{"path":576,"title":577,"categories":578,"date":579},"\u002Fblog\u002Ffiltering-vuejs-mixins","Filtering with VueJS Mixins",[262],"2017-12-07",{"path":581,"title":582,"categories":583,"date":585},"\u002Fblog\u002Fflash-data-with-inertiajs","Flash Data with InertiaJS",[584],"inertiajs","2025-07-31",{"path":587,"title":588,"categories":589,"date":590},"\u002Fblog\u002Fgenerating-wireguard-qr-codes-for-fast-mobile-deployments","Generating WireGuard QR codes for fast mobile deployments",[280],"2020-05-25",{"path":592,"title":593,"categories":594,"date":595},"\u002Fblog\u002Fgeocode-address-google-maps","Geocode An Address With Google Maps",[262],"2017-11-02",{"path":597,"title":598,"categories":599,"date":600},"\u002Fblog\u002Fget-active-element-with-javascript","Get Active Element with JavaScript",[301],"2022-10-18",{"path":602,"title":603,"categories":604,"date":605},"\u002Fblog\u002Fgetting-started-with-wireguard-vpn-important-concepts","Getting started with WireGuard VPN: Important Concepts",[280],"2020-05-21",{"path":607,"title":608,"categories":609,"date":610},"\u002Fblog\u002Fgoodbye-wordpress-hello-new-cms","Goodbye WordPress, Hello New CMS",[255,301],"2025-06-10",{"path":612,"title":613,"categories":614,"date":615},"\u002Fblog\u002Fgoogle-analytics-vue-router-single-page-application","Google Analytics with Vue Router in an SPA",[256],"2017-12-18",{"path":617,"title":618,"categories":619,"date":620},"\u002Fblog\u002Fhow-to-configure-a-wireguard-android-vpn-client","How to configure a WireGuard Android VPN Client",[280],"2020-05-27",{"path":622,"title":623,"categories":624,"date":625},"\u002Fblog\u002Fhow-to-configure-a-wireguard-ios-client","How to configure a WireGuard iOS client",[280],"2020-05-26",{"path":627,"title":628,"categories":629,"date":630},"\u002Fblog\u002Fhow-to-configure-a-wireguard-macos-client","How to configure a WireGuard macOS client",[280],"2020-05-24",{"path":632,"title":633,"categories":634,"date":635},"\u002Fblog\u002Fhow-to-configure-a-wireguard-windows-10-vpn-client","How to configure a WireGuard Windows 10 VPN client",[280],"2020-05-23",{"path":637,"title":638,"categories":639,"date":640},"\u002Fblog\u002Fhow-to-get-ssh-to-work-with-1password-docker-desktop-macos-within-a-container","How to Get SSH to Work with 1Password, Docker Desktop, and macOS Within a Container",[273],"2024-10-11",{"path":642,"title":643,"categories":644,"date":645},"\u002Fblog\u002Fhow-to-preload-css-background-images","How to Preload CSS Background Images",[301],"2018-09-27",{"path":647,"title":648,"categories":649,"date":650},"\u002Fblog\u002Fhow-to-set-up-wireguard-vpn-server-on-ubuntu-20-04","How to set up WireGuard VPN server on Ubuntu 20.04",[273,280],"2020-05-22",{"path":652,"title":653,"categories":654,"date":484},"\u002Fblog\u002Fimplementing-tagging-component","Implementing the Vue JS Tag Component",[256],{"path":656,"title":657,"categories":658,"date":659},"\u002Fblog\u002Fimportance-of-repeatable-environments","Importance of Repeatable Environments",[393],"2026-03-20",{"path":661,"title":662,"categories":663,"date":664},"\u002Fblog\u002Fimporting-and-using-components-in-nuxt-3","Importing and Using Components in Nuxt 3",[255],"2022-04-19",{"path":666,"title":667,"categories":668,"date":669},"\u002Fblog\u002Finstall-unifi-video-controller-on-synology-nas-using-docker","Install UniFi Video Controller on Synology NAS using Docker",[279,534],"2018-08-29",{"path":671,"title":672,"categories":673,"date":674},"\u002Fblog\u002Finstalling-and-preparing-your-synology-server","Installing and preparing your Synology Server",[534,280],"2018-06-23",{"path":676,"title":677,"categories":678,"date":679},"\u002Fblog\u002Finstalling-configuring-laravel-passport","Installing and Configuring Laravel Passport",[262],"2017-09-25",{"path":681,"title":682,"categories":683,"date":684},"\u002Fblog\u002Finstalling-configuring-laravel-socialite","Installing And Configuring Laravel Socialite",[262],"2017-09-05",{"path":686,"title":687,"categories":688,"date":438},"\u002Fblog\u002Finstalling-configuring-laravel-spa","Installing and Configuring Laravel For a Single Page Application",[262],{"path":690,"title":691,"categories":692,"date":418},"\u002Fblog\u002Finstalling-laravel-cashier-on-laravel-6-x","Installing Laravel Cashier on Laravel 6.x",[262],{"path":694,"title":695,"categories":696,"date":697},"\u002Fblog\u002Finstalling-tailwindcss-in-a-wordpress-theme","Installing TailwindCSS in a WordPress Theme",[301],"2020-08-06",{"path":699,"title":700,"categories":701,"date":702},"\u002Fblog\u002Fintroducing-benchkit-laravel-performance-testing-tool","Introducing BenchKit: The Laravel Performance Testing Tool We've All Been Waiting For",[273,262],"2025-09-25",{"path":704,"title":705,"categories":706,"date":707},"\u002Fblog\u002Fintroduction-to-classes-and-oop-with-javascript","Introduction to Classes and OOP with JavaScript",[301],"2022-09-20",{"path":709,"title":710,"categories":711,"date":535},"\u002Fblog\u002Flaravel-admin-routes-and-security-in-a-spa","Laravel Admin Routes and Security in a SPA",[262],{"path":713,"title":714,"categories":715,"date":716},"\u002Fblog\u002Flaravel-gates-and-policies-in-an-api-driven-spa","Laravel Gates and Policies in an API Driven SPA",[262],"2018-08-21",{"path":718,"title":719,"categories":720,"date":721},"\u002Fblog\u002Flaravel-hcaptcha-custom-validation-rule","Laravel hCaptcha Custom Validation Rule",[262],"2020-07-06",{"path":723,"title":724,"categories":725,"date":726},"\u002Fblog\u002Flaravel-one-to-many-deployments-with-docker-ansible","Laravel: One-to-many Deployments with Docker + Ansible",[273,262],"2023-04-26",{"path":728,"title":729,"categories":730,"date":731},"\u002Fblog\u002Fmanaging-pivot-data-with-laravel-eloquent","Managing Pivot Data with Laravel Eloquent",[262],"2022-10-25",{"path":733,"title":734,"categories":735,"date":418},"\u002Fblog\u002Fmanaging-stripe-payment-methods-in-vuejs-spa-and-laravel-api","Managing Stripe Payment Methods in VueJS SPA and Laravel API",[262,256],{"path":737,"title":738,"categories":739,"date":525},"\u002Fblog\u002Fmany-many-relationships-laravel","Many To Many Relationships With Laravel",[262],{"path":741,"title":742,"categories":743,"date":307},"\u002Fblog\u002Fmedia-temple-amazon-s3-backup-and-other-linux-servers","Media Temple Amazon S3 Backup for DV (this works on other Linux servers too)",[273],{"path":745,"title":746,"categories":747,"date":748},"\u002Fblog\u002Fmigrating-from-wordpress-to-nuxt-content","Migrating from WordPress to Nuxt Content",[255],"2025-09-04",{"path":750,"title":751,"categories":752,"date":368},"\u002Fblog\u002Fmigrating-layouts-from-nuxt-2-to-nuxt-3","Migrating Layouts from Nuxt 2 to Nuxt 3",[255],{"path":754,"title":755,"categories":756,"date":757},"\u002Fblog\u002Fnginx-unit-fixing-value-doesnt-exist","NGINX Unit: Fixing \"Value doesn't exist.\"",[273,504],"2023-10-24",{"path":759,"title":760,"categories":761,"date":762},"\u002Fblog\u002Foauth-and-other-authentication-methods","OAuth and Other Authentication Methods",[393],"2026-04-14",{"path":764,"title":765,"categories":766,"date":767},"\u002Fblog\u002Fpackaging-a-nuxtjs-app-for-ios-and-android-with-capacitorjs","Packaging a NuxtJS app for iOS and Android with CapacitorJS",[255],"2020-08-16",{"path":769,"title":770,"categories":771,"date":772},"\u002Fblog\u002Fpartial-reloads-with-inertiajs","Partial Reloads with InertiaJS",[584],"2024-01-20",{"path":774,"title":775,"categories":776,"date":777},"\u002Fblog\u002Fpassword-security-validation-with-vuejs-and-zxcvbn","Password Security Validation with VueJS and zxcvbn",[584],"2020-05-06",{"path":779,"title":780,"categories":781,"date":782},"\u002Fblog\u002Fphp-laravel-node-emudhra-security-updates-october-2026","PHP, Laravel, Node, and a Compromised CA: What to Patch This Week",[519,262,504,273],"2026-10-21",{"path":784,"title":785,"categories":786,"date":787},"\u002Fblog\u002Fplanning-your-laravel-and-vuejs-spa-application-admin-section","Planning your Laravel and VueJS SPA Application Admin Section",[262],"2018-08-14",{"path":789,"title":790,"categories":791,"date":792},"\u002Fblog\u002Fpost-put-and-patch-requests-with-nuxt-3","POST, PUT, and PATCH Requests with Nuxt 3",[255],"2022-05-03",{"path":794,"title":795,"categories":796,"date":697},"\u002Fblog\u002Fpost-put-patch-requests-with-vuejs-and-axios","POST, PUT & PATCH Requests with VueJS and Axios",[256],{"path":798,"title":799,"categories":800,"date":801},"\u002Fblog\u002Fprevent-website-downtime-cloud-outage-survival-guide","Prevent Website Downtime with this Cloud Outage Survival Guide",[273],"2016-12-05",{"path":803,"title":804,"categories":805,"date":510},"\u002Fblog\u002Fpreview-file-uploads-with-axios-and-vuejs","Preview File Uploads with Axios and VueJS",[256],{"path":807,"title":808,"categories":809,"date":810},"\u002Fblog\u002Fpreview-mp3-with-html5-audio-element-and-vuejs","Preview MP3 with HTML5 Audio Element and VueJS",[256],"2021-10-19",{"path":812,"title":813,"categories":814,"date":815},"\u002Fblog\u002Fpreview-video-before-uploading-with-html5-and-vuejs","Preview Video Before Uploading with HTML5 and VueJS",[256],"2021-10-25",{"path":817,"title":818,"categories":819,"date":820},"\u002Fblog\u002Fpreviewing-a-csv-file-with-vuejs-and-papaparse","Previewing a CSV file with VueJS and Papaparse",[256],"2021-11-01",{"path":822,"title":823,"categories":824,"date":825},"\u002Fblog\u002Fpublic-private-api-laravel","Public and Private API with Laravel",[262],"2017-12-28",{"path":827,"title":828,"categories":829,"date":830},"\u002Fblog\u002Fre-using-vuejs-mixins-filtering-google-map-data","Re-using VueJS Mixins and Filtering Google Map Data",[256],"2017-12-11",{"path":832,"title":833,"categories":834,"date":835},"\u002Fblog\u002Froast-designs-have-been-updated","Roast Designs Have Been Updated",[256,262],"2018-05-16",{"path":837,"title":838,"categories":839,"date":840},"\u002Fblog\u002Froast-is-on-laravel-5-6","Roast is on Laravel 5.6!",[256,262],"2018-06-13",{"path":842,"title":843,"categories":844,"date":845},"\u002Fblog\u002Fsearch-eloquent-relationships-with-laravel-scout-and-meilisearch","Search Eloquent Relationships with Laravel Scout and Meilisearch",[262],"2022-03-28",{"path":847,"title":848,"categories":849,"date":850},"\u002Fblog\u002Fsending-post-put-and-patch-requests-with-fetch-api-and-vuejs","Sending POST, PUT, and PATCH Requests with Fetch API and VueJS",[256],"2021-11-15",{"path":852,"title":853,"categories":854,"date":855},"\u002Fblog\u002Fsending-server-sent-events-with-laravel","Sending Server Sent Events (SSE) with Laravel",[262],"2025-12-09",{"path":857,"title":858,"categories":859,"date":428},"\u002Fblog\u002Fset-song-played-percentage-amplitudejs","Set Song Played Percentage with AmplitudeJS",[301],{"path":861,"title":862,"categories":863,"date":864},"\u002Fblog\u002Fsetting-page-titles-in-nuxt-3","Setting Page Titles in Nuxt 3",[255],"2022-03-22",{"path":866,"title":867,"categories":868,"date":869},"\u002Fblog\u002Fsorting-in-vuejs-components-and-vuex-state","Sorting in VueJS Components and Vuex State",[255],"2018-09-25",{"path":871,"title":872,"categories":873,"date":874},"\u002Fblog\u002Fsorting-meilisearch-results-with-laravel-scout-and-eloquent","Sorting Meilisearch Results with Laravel Scout and Eloquent",[262],"2022-04-04",{"path":876,"title":877,"categories":878,"date":879},"\u002Fblog\u002Fspa-tutorial-update-2","SPA Tutorial Update 2",[262,256],"2017-11-13",{"path":881,"title":882,"categories":883,"date":884},"\u002Fblog\u002Fspa-tutorial-update-3","SPA Tutorial Update 3",[262,256],"2017-12-04",{"path":886,"title":887,"categories":888,"date":889},"\u002Fblog\u002Fspa-tutorial-update-4","SPA Tutorial Update 4",[262,256],"2017-12-21",{"path":891,"title":892,"categories":893,"date":894},"\u002Fblog\u002Fspin-launch-deploy-laravel-like-a-pro","Spin v3: Deploy Laravel Like A Pro",[273,262],"2025-03-19",{"path":896,"title":897,"categories":898,"date":899},"\u002Fblog\u002Fstream-terminal-output-to-browser","Stream Terminal Output To Browser",[262],"2025-12-16",{"path":901,"title":902,"categories":903,"date":904},"\u002Fblog\u002Fstructuring-vue-2-vue-router-vuex-single-page-application","Structuring Vue 2, Vue Router, Vuex for a Single Page Application",[256],"2017-10-02",{"path":906,"title":907,"categories":908,"date":909},"\u002Fblog\u002Fstyle-the-html-5-audio-element","Tutorial: How To Style the HTML 5 Audio Player",[301],"2012-10-21",{"path":911,"title":912,"categories":913,"date":914},"\u002Fblog\u002Ftagging-with-laravel","Tagging With Laravel",[301],"2017-11-27",{"path":916,"title":917,"categories":918,"date":378},"\u002Fblog\u002Ftutorial-progress","SPA Tutorial Progress Update",[262],{"path":920,"title":921,"categories":922,"date":923},"\u002Fblog\u002Funique-elements-in-amplitudejs","Unique Elements in AmplitudeJS",[301],"2018-09-06",{"path":925,"title":926,"categories":927,"date":928},"\u002Fblog\u002Fupgrade-your-ubiquiti-usg-firmware-the-easy-way","Upgrade your Ubiquiti USG firmware the easy way",[279,280],"2017-12-01",{"path":930,"title":931,"categories":932,"date":933},"\u002Fblog\u002Fuploading-files-vuejs-axios","Uploading Files With VueJS and Axios",[256],"2017-12-13",{"path":935,"title":936,"categories":937,"date":938},"\u002Fblog\u002Furl-query-parameters-with-javascript-vue-2-and-vue-3","URL Query Parameters with JavaScript, Vue 2 and Vue 3",[256],"2022-09-06",{"path":940,"title":941,"categories":942,"date":943},"\u002Fblog\u002Fusing-amplitudejs-public-methods","Using AmplitudeJS Public Methods",[256],"2018-09-13",{"path":945,"title":946,"categories":947,"date":257},"\u002Fblog\u002Fusing-async-data-in-nuxt-3","Using asyncData in Nuxt 3",[255],{"path":949,"title":950,"categories":951,"date":423},"\u002Fblog\u002Fusing-axios-to-make-api-requests-with-vuejs","Using Axios to Make API Requests With VueJS",[256],{"path":953,"title":954,"categories":955,"date":864},"\u002Fblog\u002Fusing-environment-variables-in-nuxt-3","Using Environment Variables in Nuxt 3",[255],{"path":957,"title":958,"categories":959,"date":960},"\u002Fblog\u002Fusing-foundation-sites-laravel-5-3-webpack","Using Foundation Sites with Laravel 5.3 and Webpack",[262],"2017-02-24",{"path":962,"title":963,"categories":964,"date":697},"\u002Fblog\u002Fusing-laravel-mix-in-a-wordpress-theme","Using Laravel Mix in a WordPress Theme",[301],{"path":966,"title":967,"categories":968,"date":969},"\u002Fblog\u002Fusing-laravel-sanctum-airlock-with-nuxtjs","Using Laravel Sanctum\u002FAirlock with NuxtJS",[262],"2020-01-17",{"path":971,"title":972,"categories":973,"date":767},"\u002Fblog\u002Fusing-nuxtjs-to-build-an-ios-and-android-app","Using NuxtJS to Build an iOS and Android App",[255],{"path":975,"title":976,"categories":977,"date":378},"\u002Fblog\u002Fusing-sass-vue-components-laravel-mix","Using SASS in Vue Components with Laravel Mix",[256],{"path":979,"title":980,"categories":981,"date":418},"\u002Fblog\u002Fusing-stripe-elements-in-a-vuejs-component","Using Stripe Elements in a VueJS Component",[256],{"path":983,"title":984,"categories":985,"date":767},"\u002Fblog\u002Fusing-tailwindcss-to-design-your-mobile-app","Using TailwindCSS to Design Your Mobile App",[256],{"path":987,"title":988,"categories":989,"date":990},"\u002Fblog\u002Fusing-vuex-modules-inside-components","Using Vuex Modules Inside Components",[256],"2017-10-19",{"path":992,"title":993,"categories":994,"date":995},"\u002Fblog\u002Fusing-vuex-with-inertiajs","Using Vuex with InertiaJS",[584],"2021-09-21",{"path":997,"title":998,"categories":999,"date":1000},"\u002Fblog\u002Fvalidating-api-request-javascript-laravel","Validating an API request with Javascript and Laravel",[262,301],"2017-10-30",{"path":1002,"title":1003,"categories":1004,"date":864},"\u002Fblog\u002Fvue-3-web-notification-component","Vue 3 Web Notification Component",[256],{"path":1006,"title":1007,"categories":1008,"date":484},"\u002Fblog\u002Fvue-js-tag-input","Vue JS Tag input",[256],{"path":1010,"title":1011,"categories":1012,"date":1013},"\u002Fblog\u002Fvue-router-navigation-guards-vuex","Vue Router Navigation Guards with Vuex",[256],"2018-01-08",{"path":1015,"title":1016,"categories":1017,"date":1018},"\u002Fblog\u002Fvue-router-permission-recipes-and-laravel-policies-examples","Vue Router Permission Recipes and Laravel Policies Examples",[256],"2018-09-18",{"path":1020,"title":1021,"categories":1022,"date":1023},"\u002Fblog\u002Fvuejs-app-admin-screens","VueJS App Admin Screens",[256],"2018-09-11",{"path":1025,"title":1026,"categories":1027,"date":1028},"\u002Fblog\u002Fvuejs-route-permissions-security-and-admin-section","VueJS Route Permissions, Security and Admin Section",[256],"2018-09-04",{"path":1030,"title":1031,"categories":1032,"date":373},"\u002Fblog\u002Fvuepress-within-a-laravel-application","Vuepress Within a Laravel Application",[256],{"path":1034,"title":1035,"categories":1036,"date":1037},"\u002Fblog\u002Fwe-will-launch-your-ai-app","We Will Launch Your AI App",[393],"2026-07-17",{"path":1039,"title":1040,"categories":1041,"date":1042},"\u002Fblog\u002Fwhat-is-amplitude-js","What Is AmplitudeJS?",[301],"2018-08-22",{"path":1044,"title":1045,"categories":1046,"date":1047},"\u002Fblog\u002Fwhen-api-driven-development-works-and-when-it-doesnt","When API Driven Development Works... And When It Doesn't",[262],"2020-01-10",{"path":1049,"title":1050,"categories":1051,"date":1052},"\u002Fblog\u002Fwhy-make-your-saas-self-hostable","Why Make Your SaaS Self-Hostable?",[393],"2026-01-28",{"path":1054,"title":1055,"categories":1056,"date":1042},"\u002Fblog\u002Fworking-with-amplitudejs-song-object-metadata","Working With AmplitudeJS Song Object Metadata",[301],[1058,1062,1066,1070,1074,1078,1082,1085,1089,1093,1097],{"path":1059,"title":1060,"categories":1061},"\u002Fguides\u002Famplitudejs-from-the-ground-up","AmplitudeJS From the Ground Up",[301],{"path":1063,"title":1064,"categories":1065},"\u002Fguides\u002Fapi-driven-development-laravel-vuejs","API Driven Development With Laravel and VueJS",[262,256],{"path":1067,"title":1068,"categories":1069},"\u002Fguides\u002Fcomplete-ubiquiti-unifi-synology-network-build","Complete Ubiquiti UniFi + Synology Network Build",[279,280,534],{"path":1071,"title":1072,"categories":1073},"\u002Fguides\u002Fdesigning-your-saas-app-to-be-self-hostable","Designing Your SaaS App to be Self-Hostable",[393],{"path":1075,"title":1076,"categories":1077},"\u002Fguides\u002Fgain-flexibility-and-increase-privacy-with-wireguard-vpn","Gain Flexibility and Increase Privacy with WireGuard VPN",[280],{"path":1079,"title":1080,"categories":1081},"\u002Fguides\u002Fguide-uploading-files-vuejs-axios","Guide to Uploading Files with VueJS and Axios",[301,256],{"path":1083,"title":972,"categories":1084},"\u002Fguides\u002Fhow-to-build-an-ios-android-app-with-capacitorjs-nuxtjs-tailwindcss",[301,256,255],{"path":1086,"title":1087,"categories":1088},"\u002Fguides\u002Fupgrading-nuxt-2-to-nuxt-3","Upgrading Nuxt 2 to Nuxt 3",[255,256],{"path":1090,"title":1091,"categories":1092},"\u002Fguides\u002Fusing-fetch-api-with-vuejs","Using Fetch API with Vue.js",[301,256],{"path":1094,"title":1095,"categories":1096},"\u002Fguides\u002Fusing-laravel-cashier-with-vuejs-spa-and-laravel-passport-api","Using Laravel Cashier with VueJS SPA and Laravel Passport API",[301,256],{"path":1098,"title":1099,"categories":1100},"\u002Fguides\u002Fyour-guide-to-using-an-api-with-vuejs-nuxtjs-and-axios","Your Guide to Using an API with VueJS\u002FNuxtJS and Axios",[301,256],{"id":1102,"title":780,"author":1103,"body":1104,"categories":2206,"date":782,"description":2207,"extension":17,"guide":15,"header_image":72,"meta":2208,"navigation":18,"path":779,"seo":2209,"stem":2210,"video_url":15,"__hash__":2211},"blog\u002Fblog\u002Fphp-laravel-node-emudhra-security-updates-october-2026.md","jaydrogers",{"type":23,"value":1105,"toc":2193},[1106,1110,1113,1225,1230,1241,1291,1301,1329,1332,1353,1356,1361,1372,1375,1435,1438,1467,1478,1506,1509,1531,1557,1560,1571,1575,1584,1591,1605,1705,1714,1731,1734,1759,1765,1768,1771,1780,1794,1797,1839,1846,1849,1880,1883,1887,1890,1893,1908,1912,1915,1929,1933,1936,1969,1972,1988,1994,2056,2073,2076,2111,2139,2143,2146,2159,2166,2170,2173,2181,2189],[1107,1108,1109],"p",{},"It's been a wild 48 hours. Four separate security issues landed within two days of each other. If you run Laravel, there's a good chance all four touch your stack.",[1107,1111,1112],{},"I've been answering questions about these in our GitHub discussions and Discord all day. Here's everything in one place: what happened and what I would do about each one.",[1114,1115,1116,1132],"table",{},[1117,1118,1119],"thead",{},[1120,1121,1122,1126,1129],"tr",{},[1123,1124,1125],"th",{},"Issue",[1123,1127,1128],{},"Severity",[1123,1130,1131],{},"What to do",[1133,1134,1135,1166,1185,1207],"tbody",{},[1120,1136,1137,1145,1148],{},[1138,1139,1140],"td",{},[1141,1142,1144],"a",{"href":1143},"#php-cve-2026-109618-and-cve-2026-109619","PHP security release",[1138,1146,1147],{},"Critical (CVSS 9.2)",[1138,1149,1150,1151,1155,1156,1155,1159,1162,1163],{},"Upgrade to ",[1152,1153,1154],"code",{},"8.5.12",", ",[1152,1157,1158],{},"8.4.27",[1152,1160,1161],{},"8.3.36",", or ",[1152,1164,1165],{},"8.2.35",[1120,1167,1168,1174,1176],{},[1138,1169,1170],{},[1141,1171,1173],{"href":1172},"#laravel-tokenguard-auth-bypass","Laravel TokenGuard auth bypass",[1138,1175,1147],{},[1138,1177,1150,1178,1181,1182],{},[1152,1179,1180],{},"13.29.0"," or ",[1152,1183,1184],{},"12.68.0",[1120,1186,1187,1193,1196],{},[1138,1188,1189],{},[1141,1190,1192],{"href":1191},"#nodejs-security-releases","Node.js security releases",[1138,1194,1195],{},"High",[1138,1197,1150,1198,1155,1201,1162,1204],{},[1152,1199,1200],{},"26.12.1",[1152,1202,1203],{},"24.22.1",[1152,1205,1206],{},"22.23.4",[1120,1208,1209,1215,1218],{},[1138,1210,1211],{},[1141,1212,1214],{"href":1213},"#emudhra-intermediate-ca-compromise","eMudhra CA compromise",[1138,1216,1217],{},"Critical for non-browser clients",[1138,1219,1220,1221,1224],{},"Update ",[1152,1222,1223],{},"ca-certificates"," on your servers and in your containers",[1226,1227,1229],"h2",{"id":1228},"php-cve-2026-109618-and-cve-2026-109619","PHP: CVE-2026-109618 and CVE-2026-109619",[1107,1231,1232,1233,1240],{},"PHP released ",[1141,1234,1239],{"href":1235,"rel":1236,"target":1238},"https:\u002F\u002Fwww.php.net\u002Farchive\u002F2026.php#2026-10-21-5",[1237],"nofollow","_blank","8.5.12, 8.4.27, 8.3.36, and 8.2.35"," on October 21. They fix two critical vulnerabilities (CVSS 9.2) that allow unauthenticated remote code execution. Every version before those releases is affected.",[1114,1242,1243,1253],{},[1117,1244,1245],{},[1120,1246,1247,1250],{},[1123,1248,1249],{},"Release line",[1123,1251,1252],{},"Patched version",[1133,1254,1255,1264,1273,1282],{},[1120,1256,1257,1260],{},[1138,1258,1259],{},"8.5",[1138,1261,1262],{},[1152,1263,1154],{},[1120,1265,1266,1269],{},[1138,1267,1268],{},"8.4",[1138,1270,1271],{},[1152,1272,1158],{},[1120,1274,1275,1278],{},[1138,1276,1277],{},"8.3",[1138,1279,1280],{},[1152,1281,1161],{},[1120,1283,1284,1287],{},[1138,1285,1286],{},"8.2",[1138,1288,1289],{},[1152,1290,1165],{},[1107,1292,1293,1294,1297,1298,1300],{},"Both bugs are in PHP's request handling, so they hit every way of serving PHP: PHP-FPM, Apache with ",[1152,1295,1296],{},"mod_php",", php-cgi, FrankenPHP, and LiteSpeed. PHP rates ",[1152,1299,1296],{}," as the highest risk. They have a working exploit where a single unauthenticated request triggers the attack before any of your application code runs.",[1302,1303,1304,1318],"ul",{},[1305,1306,1307,1311,1312,1317],"li",{},[1308,1309,1310],"strong",{},"CVE-2026-109618"," (",[1141,1313,1316],{"href":1314,"rel":1315,"target":1238},"https:\u002F\u002Fgithub.com\u002Fphp\u002Fphp-src\u002Fsecurity\u002Fadvisories\u002FGHSA-w8hw-w9fx-j79w",[1237],"GHSA-w8hw-w9fx-j79w","): When PHP runs out of memory partway through setting up a request, cleanup can treat half-initialized data as valid. Crafted multipart form requests can trigger it.",[1305,1319,1320,1311,1323,1328],{},[1308,1321,1322],{},"CVE-2026-109619",[1141,1324,1327],{"href":1325,"rel":1326,"target":1238},"https:\u002F\u002Fgithub.com\u002Fphp\u002Fphp-src\u002Fsecurity\u002Fadvisories\u002FGHSA-6wmf-4rv5-p3rp",[1237],"GHSA-6wmf-4rv5-p3rp","): State from one request can survive after its memory is freed. The next request on the same worker can then use it.",[1107,1330,1331],{},"Check which version you're running:",[1333,1334,1339],"pre",{"className":1335,"code":1336,"filename":1337,"language":1338,"meta":26,"style":26},"language-bash shiki shiki-themes material-theme-lighter ayu-dark ayu-dark","php -v\n","Check your PHP version","bash",[1152,1340,1341],{"__ignoreMap":26},[1342,1343,1346,1349],"span",{"class":1344,"line":1345},"line",1,[1342,1347,519],{"class":1348},"sYo81",[1342,1350,1352],{"class":1351},"s9syP"," -v\n",[1107,1354,1355],{},"If you install PHP from your Linux distribution, the distributions got the patches ahead of time. Run your package manager's update and restart PHP.",[1357,1358,1360],"h3",{"id":1359},"if-you-use-serversideupphp","If you use serversideup\u002Fphp",[1107,1362,1363,1364,1371],{},"Patched images are live in ",[1141,1365,1368],{"href":1366,"rel":1367,"target":1238},"https:\u002F\u002Fgithub.com\u002Fserversideup\u002Fdocker-php\u002Freleases\u002Ftag\u002Fv5.0.2",[1237],[1152,1369,1370],{},"v5.0.2",". It covers PHP 8.2, 8.3, 8.4, and 8.5 on Debian Bookworm, Debian Trixie, Alpine 3.23, and Alpine 3.24.",[1107,1373,1374],{},"How you update depends on which tag you use:",[1114,1376,1377,1389],{},[1117,1378,1379],{},[1120,1380,1381,1384,1387],{},[1123,1382,1383],{},"Tag type",[1123,1385,1386],{},"Example",[1123,1388,1131],{},[1133,1390,1391,1404,1420],{},[1120,1392,1393,1396,1401],{},[1138,1394,1395],{},"Floating",[1138,1397,1398],{},[1152,1399,1400],{},"8.4-fpm-nginx",[1138,1402,1403],{},"Pull and redeploy",[1120,1405,1406,1409,1414],{},[1138,1407,1408],{},"Release",[1138,1410,1411],{},[1152,1412,1413],{},"8.4-fpm-nginx-v5.0.1",[1138,1415,1416,1417],{},"Change it to ",[1152,1418,1419],{},"8.4-fpm-nginx-v5.0.2",[1120,1421,1422,1425,1430],{},[1138,1423,1424],{},"Patch version",[1138,1426,1427],{},[1152,1428,1429],{},"8.4.26-fpm-nginx",[1138,1431,1416,1432],{},[1152,1433,1434],{},"8.4.27-fpm-nginx",[1107,1436,1437],{},"If you use a floating tag, pull and restart:",[1333,1439,1442],{"className":1335,"code":1440,"filename":1441,"language":1338,"meta":26,"style":26},"docker compose pull\ndocker compose up -d\n","Pull and restart",[1152,1443,1444,1455],{"__ignoreMap":26},[1342,1445,1446,1448,1452],{"class":1344,"line":1345},[1342,1447,504],{"class":1348},[1342,1449,1451],{"class":1450},"svKdX"," compose",[1342,1453,1454],{"class":1450}," pull\n",[1342,1456,1457,1459,1461,1464],{"class":1344,"line":27},[1342,1458,504],{"class":1348},[1342,1460,1451],{"class":1450},[1342,1462,1463],{"class":1450}," up",[1342,1465,1466],{"class":1351}," -d\n",[1107,1468,1469,1470,1473,1474,1477],{},"If you build your own image ",[1152,1471,1472],{},"FROM serversideup\u002Fphp",", add ",[1152,1475,1476],{},"--pull"," so Docker doesn't use the old base image from its cache:",[1333,1479,1482],{"className":1335,"code":1480,"filename":1481,"language":1338,"meta":26,"style":26},"docker compose build --pull\ndocker compose up -d\n","Rebuild with the latest base image",[1152,1483,1484,1496],{"__ignoreMap":26},[1342,1485,1486,1488,1490,1493],{"class":1344,"line":1345},[1342,1487,504],{"class":1348},[1342,1489,1451],{"class":1450},[1342,1491,1492],{"class":1450}," build",[1342,1494,1495],{"class":1351}," --pull\n",[1342,1497,1498,1500,1502,1504],{"class":1344,"line":27},[1342,1499,504],{"class":1348},[1342,1501,1451],{"class":1450},[1342,1503,1463],{"class":1450},[1342,1505,1466],{"class":1351},[1107,1507,1508],{},"Then confirm you're on the patched version:",[1333,1510,1513],{"className":1335,"code":1511,"filename":1512,"language":1338,"meta":26,"style":26},"docker compose exec php php -v\n","Confirm the PHP version",[1152,1514,1515],{"__ignoreMap":26},[1342,1516,1517,1519,1521,1524,1527,1529],{"class":1344,"line":1345},[1342,1518,504],{"class":1348},[1342,1520,1451],{"class":1450},[1342,1522,1523],{"class":1450}," exec",[1342,1525,1526],{"class":1450}," php",[1342,1528,1526],{"class":1450},[1342,1530,1352],{"class":1351},[1107,1532,1533,1534,1155,1539,1544,1545,1550,1551,1556],{},"PHP 8.1 and older will not. The PHP team did publish minimal source backports for ",[1141,1535,1538],{"href":1536,"rel":1537,"target":1238},"https:\u002F\u002Fgithub.com\u002Fphp\u002Fphp-src\u002Ftree\u002FPHP-7.4-CVE-2026-109618-109619",[1237],"7.4",[1141,1540,1543],{"href":1541,"rel":1542,"target":1238},"https:\u002F\u002Fgithub.com\u002Fphp\u002Fphp-src\u002Ftree\u002FPHP-8.0-CVE-2026-109618-109619",[1237],"8.0",", and ",[1141,1546,1549],{"href":1547,"rel":1548,"target":1238},"https:\u002F\u002Fgithub.com\u002Fphp\u002Fphp-src\u002Ftree\u002FPHP-8.1-CVE-2026-109618-109619",[1237],"8.1"," for people who build from source. Those aren't official releases, and there won't be official Docker images for them. We also stopped building Debian Bullseye and Alpine 3.16 on September 3. If you're on any of those, this is the push to upgrade. Our ",[1141,1552,1555],{"href":1553,"rel":1554},"https:\u002F\u002Fserversideup.net\u002Fopen-source\u002Fdocker-php\u002Fdocs\u002Fgetting-started\u002Fupgrade-guide",[1237],"upgrade guide"," walks through it.",[1107,1558,1559],{},"Also keep in mind PHP 8.2 reaches end of life on December 31, 2026.",[1107,1561,1562,1563,1566,1567,1570],{},"One thing that makes days like this a little less stressful: our images run as ",[1152,1564,1565],{},"www-data"," instead of ",[1152,1568,1569],{},"root",". If someone does get code execution, they don't own the whole container.",[1226,1572,1574],{"id":1573},"laravel-tokenguard-auth-bypass","Laravel: TokenGuard auth bypass",[1107,1576,1577,1578,1583],{},"Laravel published ",[1141,1579,1582],{"href":1580,"rel":1581,"target":1238},"https:\u002F\u002Fgithub.com\u002Flaravel\u002Fframework\u002Fsecurity\u002Fadvisories\u002FGHSA-f9x3-7vq9-cph6",[1237],"GHSA-f9x3-7vq9-cph6"," on October 19. It's rated critical (CVSS 9.2).",[1107,1585,1586,1587,1590],{},"If you use Laravel's built-in ",[1152,1588,1589],{},"TokenGuard"," and run MySQL or MariaDB, an attacker can send a crafted, non-string token value that matches the wrong user in the database. Under certain database configurations, that lets someone log in as any existing user without their token. Every route behind that guard is exposed.",[1107,1592,1593,1594,1596,1597,1600,1601,1604],{},"You're using ",[1152,1595,1589],{}," if your ",[1152,1598,1599],{},"config\u002Fauth.php"," has a guard with the ",[1152,1602,1603],{},"token"," driver:",[1333,1606,1609],{"className":1607,"code":1608,"filename":1599,"language":519,"meta":26,"style":26},"language-php shiki shiki-themes material-theme-lighter ayu-dark ayu-dark","'guards' => [\n    'api' => [\n        'driver' => 'token',\n        'provider' => 'users',\n    ],\n],\n",[1152,1610,1611,1630,1644,1668,1689,1697],{"__ignoreMap":26},[1342,1612,1613,1617,1620,1622,1626],{"class":1344,"line":1345},[1342,1614,1616],{"class":1615},"sm2Rb","'",[1342,1618,1619],{"class":1450},"guards",[1342,1621,1616],{"class":1615},[1342,1623,1625],{"class":1624},"sLPTV"," =>",[1342,1627,1629],{"class":1628},"scXpY"," [\n",[1342,1631,1632,1635,1638,1640,1642],{"class":1344,"line":27},[1342,1633,1634],{"class":1615},"    '",[1342,1636,1637],{"class":1450},"api",[1342,1639,1616],{"class":1615},[1342,1641,1625],{"class":1624},[1342,1643,1629],{"class":1628},[1342,1645,1647,1650,1653,1655,1657,1660,1662,1664],{"class":1344,"line":1646},3,[1342,1648,1649],{"class":1615},"        '",[1342,1651,1652],{"class":1450},"driver",[1342,1654,1616],{"class":1615},[1342,1656,1625],{"class":1624},[1342,1658,1659],{"class":1615}," '",[1342,1661,1603],{"class":1450},[1342,1663,1616],{"class":1615},[1342,1665,1667],{"class":1666},"s_I6F",",\n",[1342,1669,1671,1673,1676,1678,1680,1682,1685,1687],{"class":1344,"line":1670},4,[1342,1672,1649],{"class":1615},[1342,1674,1675],{"class":1450},"provider",[1342,1677,1616],{"class":1615},[1342,1679,1625],{"class":1624},[1342,1681,1659],{"class":1615},[1342,1683,1684],{"class":1450},"users",[1342,1686,1616],{"class":1615},[1342,1688,1667],{"class":1666},[1342,1690,1692,1695],{"class":1344,"line":1691},5,[1342,1693,1694],{"class":1628},"    ]",[1342,1696,1667],{"class":1666},[1342,1698,1700,1703],{"class":1344,"line":1699},6,[1342,1701,1702],{"class":1628},"]",[1342,1704,1667],{"class":1666},[1107,1706,1707,1708,1710,1711,1713],{},"The fix is in ",[1152,1709,1180],{}," and ",[1152,1712,1184],{},". There are no workarounds listed, so upgrade:",[1333,1715,1718],{"className":1335,"code":1716,"filename":1717,"language":1338,"meta":26,"style":26},"composer update laravel\u002Fframework\n","Upgrade Laravel",[1152,1719,1720],{"__ignoreMap":26},[1342,1721,1722,1725,1728],{"class":1344,"line":1345},[1342,1723,1724],{"class":1348},"composer",[1342,1726,1727],{"class":1450}," update",[1342,1729,1730],{"class":1450}," laravel\u002Fframework\n",[1107,1732,1733],{},"Then confirm the version you're running:",[1333,1735,1738],{"className":1335,"code":1736,"filename":1737,"language":1338,"meta":26,"style":26},"composer show laravel\u002Fframework | grep versions\n","Confirm the Laravel version",[1152,1739,1740],{"__ignoreMap":26},[1342,1741,1742,1744,1747,1750,1753,1756],{"class":1344,"line":1345},[1342,1743,1724],{"class":1348},[1342,1745,1746],{"class":1450}," show",[1342,1748,1749],{"class":1450}," laravel\u002Fframework",[1342,1751,1752],{"class":1624}," |",[1342,1754,1755],{"class":1348}," grep",[1342,1757,1758],{"class":1450}," versions\n",[1107,1760,1761,1762,1764],{},"Even if you don't use the ",[1152,1763,1603],{}," driver, I'd still upgrade. It's a patch release and it's one less thing to wonder about.",[1107,1766,1767],{},"The advisory only lists fixes for 12.x and 13.x. If you're still on Laravel 11 or older, you won't get a patch for this one.",[1226,1769,1192],{"id":1770},"nodejs-security-releases",[1107,1772,1773,1774,1779],{},"Node.js shipped ",[1141,1775,1778],{"href":1776,"rel":1777,"target":1238},"https:\u002F\u002Fnodejs.org\u002Fen\u002Fblog\u002Fvulnerability\u002Foctober-2026-security-releases",[1237],"security releases for every supported line"," on October 21. There are 10 CVEs in total. The four rated high are the ones I'd pay attention to:",[1302,1781,1782,1785,1788],{},[1305,1783,1784],{},"An out-of-bounds write in the Brotli decoder that allows remote code execution",[1305,1786,1787],{},"Two separate TLS certificate hostname bypasses",[1305,1789,1790,1793],{},[1152,1791,1792],{},"dns.resolve"," truncating names that contain a NUL character",[1107,1795,1796],{},"Upgrade to the patched version for your line:",[1114,1798,1799,1807],{},[1117,1800,1801],{},[1120,1802,1803,1805],{},[1123,1804,1249],{},[1123,1806,1252],{},[1133,1808,1809,1819,1829],{},[1120,1810,1811,1814],{},[1138,1812,1813],{},"26.x",[1138,1815,1816],{},[1152,1817,1818],{},"v26.12.1",[1120,1820,1821,1824],{},[1138,1822,1823],{},"24.x",[1138,1825,1826],{},[1152,1827,1828],{},"v24.22.1",[1120,1830,1831,1834],{},[1138,1832,1833],{},"22.x",[1138,1835,1836],{},[1152,1837,1838],{},"v22.23.4",[1107,1840,1841,1842,1845],{},"A lot of Laravel developers only use Node to run ",[1152,1843,1844],{},"npm run build"," with Vite. It's easy to think this doesn't matter. If that's all you use it for, the risk is lower. You should still update. If you run Inertia SSR or any Node process in production, update today.",[1107,1847,1848],{},"Places to check:",[1302,1850,1851,1858,1864,1870],{},[1305,1852,1853,1854,1857],{},"Your local machine (",[1152,1855,1856],{},"nvm install 24",", Homebrew, etc.)",[1305,1859,1860,1863],{},[1152,1861,1862],{},"FROM node:..."," lines in your Dockerfiles",[1305,1865,1866,1869],{},[1152,1867,1868],{},"node-version"," in your GitHub Actions or GitLab CI config",[1305,1871,1872,1873,1181,1876,1879],{},"Any ",[1152,1874,1875],{},".nvmrc",[1152,1877,1878],{},".node-version"," files pinned to an older patch version",[1107,1881,1882],{},"These releases also include the updated CA store for the next issue.",[1226,1884,1886],{"id":1885},"emudhra-intermediate-ca-compromise","eMudhra intermediate CA compromise",[1107,1888,1889],{},"This one is the strangest of the bunch. The private keys for eight eMudhra intermediate certificates were generated so badly that anyone could recover them from the public certificates. The keys were effectively tiny numbers. 🤯",[1107,1891,1892],{},"Those intermediates chain up to roots trusted by Mozilla, Microsoft, Apple, and Chrome. Six are TLS certificates and two are for code signing. If you have the keys, you can issue a certificate for any domain that clients would trust.",[1107,1894,1895,1896,1901,1902,1907],{},"Mozilla is tracking it in ",[1141,1897,1900],{"href":1898,"rel":1899,"target":1238},"https:\u002F\u002Fbugzilla.mozilla.org\u002Fshow_bug.cgi?id=2083449",[1237],"Bug 2083449",". Dennis Jackson also put together a ",[1141,1903,1906],{"href":1904,"rel":1905,"target":1238},"https:\u002F\u002Femudhra.we-have-a-problem.com\u002F",[1237],"full write-up with patched versions for every platform",".",[1357,1909,1911],{"id":1910},"your-browser-is-fine-your-server-might-not-be","Your browser is fine. Your server might not be.",[1107,1913,1914],{},"Browsers already handled this. Firefox and Chrome blocked the certificates on October 17. Apple followed on October 19 and Microsoft on October 20.",[1107,1916,1917,1918,1921,1922,1155,1925,1928],{},"The problem is everything that isn't a browser. When your Laravel app calls an API with the ",[1152,1919,1920],{},"Http"," facade, Guzzle uses the CA bundle on your server or in your container. Same with ",[1152,1923,1924],{},"curl",[1152,1926,1927],{},"wget",", and anything else making outbound HTTPS requests. If that CA bundle is old, your app still trusts these certificates.",[1357,1930,1932],{"id":1931},"update-ca-certificates","Update ca-certificates",[1107,1934,1935],{},"On a Debian or Ubuntu server:",[1333,1937,1940],{"className":1335,"code":1938,"filename":1939,"language":1338,"meta":26,"style":26},"sudo apt update && sudo apt install --only-upgrade ca-certificates\n","Debian or Ubuntu",[1152,1941,1942],{"__ignoreMap":26},[1342,1943,1944,1947,1950,1952,1955,1958,1960,1963,1966],{"class":1344,"line":1345},[1342,1945,1946],{"class":1348},"sudo",[1342,1948,1949],{"class":1450}," apt",[1342,1951,1727],{"class":1450},[1342,1953,1954],{"class":1666}," &&",[1342,1956,1957],{"class":1348}," sudo",[1342,1959,1949],{"class":1450},[1342,1961,1962],{"class":1450}," install",[1342,1964,1965],{"class":1351}," --only-upgrade",[1342,1967,1968],{"class":1450}," ca-certificates\n",[1107,1970,1971],{},"On Alpine:",[1333,1973,1976],{"className":1335,"code":1974,"filename":1975,"language":1338,"meta":26,"style":26},"apk upgrade ca-certificates\n","Alpine",[1152,1977,1978],{"__ignoreMap":26},[1342,1979,1980,1983,1986],{"class":1344,"line":1345},[1342,1981,1982],{"class":1348},"apk",[1342,1984,1985],{"class":1450}," upgrade",[1342,1987,1968],{"class":1450},[1107,1989,1990,1991,1993],{},"Here are the patched ",[1152,1992,1223],{}," versions for the platforms most of us run:",[1114,1995,1996,2005],{},[1117,1997,1998],{},[1120,1999,2000,2003],{},[1123,2001,2002],{},"Platform",[1123,2004,1252],{},[1133,2006,2007,2017,2027,2037,2047],{},[1120,2008,2009,2012],{},[1138,2010,2011],{},"Debian 12 (Bookworm)",[1138,2013,2014],{},[1152,2015,2016],{},"20250419~deb12u2",[1120,2018,2019,2022],{},[1138,2020,2021],{},"Debian 13 (Trixie)",[1138,2023,2024],{},[1152,2025,2026],{},"20250419+deb13u1",[1120,2028,2029,2032],{},[1138,2030,2031],{},"Ubuntu 24.04",[1138,2033,2034],{},[1152,2035,2036],{},"20260816ubuntu0.24.04.1",[1120,2038,2039,2042],{},[1138,2040,2041],{},"Ubuntu 22.04",[1138,2043,2044],{},[1152,2045,2046],{},"20260816ubuntu0.22.04.1",[1120,2048,2049,2051],{},[1138,2050,1975],{},[1138,2052,2053],{},[1152,2054,2055],{},"20261020-r0",[1107,2057,2058,2059,2066,2067,1181,2070,1907],{},"If you use ",[1141,2060,2063],{"href":2061,"rel":2062,"target":1238},"https:\u002F\u002Fgithub.com\u002Fcomposer\u002Fca-bundle",[1237],[1152,2064,2065],{},"composer\u002Fca-bundle"," directly, update to ",[1152,2068,2069],{},"1.4.16",[1152,2071,2072],{},"1.6.0",[1107,2074,2075],{},"For containers, don't patch a running container. Pull a fresh image and redeploy so the update is baked in. You can check which version an image ships with:",[1333,2077,2080],{"className":1335,"code":2078,"filename":2079,"language":1338,"meta":26,"style":26},"docker run --rm serversideup\u002Fphp:8.4-fpm-nginx dpkg -s ca-certificates | grep Version\n","Debian-based images",[1152,2081,2082],{"__ignoreMap":26},[1342,2083,2084,2086,2089,2092,2095,2098,2101,2104,2106,2108],{"class":1344,"line":1345},[1342,2085,504],{"class":1348},[1342,2087,2088],{"class":1450}," run",[1342,2090,2091],{"class":1351}," --rm",[1342,2093,2094],{"class":1450}," serversideup\u002Fphp:8.4-fpm-nginx",[1342,2096,2097],{"class":1450}," dpkg",[1342,2099,2100],{"class":1351}," -s",[1342,2102,2103],{"class":1450}," ca-certificates",[1342,2105,1752],{"class":1624},[1342,2107,1755],{"class":1348},[1342,2109,2110],{"class":1450}," Version\n",[1333,2112,2115],{"className":1335,"code":2113,"filename":2114,"language":1338,"meta":26,"style":26},"docker run --rm serversideup\u002Fphp:8.4-fpm-nginx-alpine apk list -I ca-certificates\n","Alpine-based images",[1152,2116,2117],{"__ignoreMap":26},[1342,2118,2119,2121,2123,2125,2128,2131,2134,2137],{"class":1344,"line":1345},[1342,2120,504],{"class":1348},[1342,2122,2088],{"class":1450},[1342,2124,2091],{"class":1351},[1342,2126,2127],{"class":1450}," serversideup\u002Fphp:8.4-fpm-nginx-alpine",[1342,2129,2130],{"class":1450}," apk",[1342,2132,2133],{"class":1450}," list",[1342,2135,2136],{"class":1351}," -I",[1342,2138,1968],{"class":1450},[1357,2140,2142],{"id":2141},"test-it","Test it",[1107,2144,2145],{},"The write-up includes test hosts that serve certificates from the compromised chain. Run this from your server or inside your container:",[1333,2147,2150],{"className":1335,"code":2148,"filename":2149,"language":1338,"meta":26,"style":26},"curl https:\u002F\u002Fdv-g3b-emudhra.we-have-a-problem.com\u002F\n","Test your trust store",[1152,2151,2152],{"__ignoreMap":26},[1342,2153,2154,2156],{"class":1344,"line":1345},[1342,2155,1924],{"class":1348},[1342,2157,2158],{"class":1450}," https:\u002F\u002Fdv-g3b-emudhra.we-have-a-problem.com\u002F\n",[1107,2160,2161,2162,2165],{},"You ",[1308,2163,2164],{},"want"," a certificate error here. If the request succeeds, that machine still trusts the compromised intermediates.",[1226,2167,2169],{"id":2168},"wrapping-up","Wrapping up",[1107,2171,2172],{},"Every one of these has a fix available today. Update PHP, Laravel, Node, and your CA certificates, then redeploy.",[1107,2174,2175,2176,2180],{},"Have questions or stuck on an upgrade? Jump into our ",[1141,2177,2179],{"href":2178},"\u002Fdiscord\u002F","Discord"," and let us know.",[1107,2182,2183,2184,2188],{},"If you'd rather not spend your next security week doing this yourself, we can ",[1141,2185,2187],{"href":2186},"\u002Fhire-us\u002F","handle it for you",". Security updates and infrastructure are part of what we do for our clients every month.",[2190,2191,2192],"style",{},"html pre.shiki code .sYo81, html code.shiki .sYo81{--shiki-light:#E2931D;--shiki-default:#59C2FF;--shiki-dark:#59C2FF}html pre.shiki code .s9syP, html code.shiki .s9syP{--shiki-light:#91B859;--shiki-default:#95E6CB;--shiki-dark:#95E6CB}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .svKdX, html code.shiki .svKdX{--shiki-light:#91B859;--shiki-default:#AAD94C;--shiki-dark:#AAD94C}html pre.shiki code .sm2Rb, html code.shiki .sm2Rb{--shiki-light:#39ADB5;--shiki-default:#AAD94C;--shiki-dark:#AAD94C}html pre.shiki code .sLPTV, html code.shiki .sLPTV{--shiki-light:#39ADB5;--shiki-default:#F29668;--shiki-dark:#F29668}html pre.shiki code .scXpY, html code.shiki .scXpY{--shiki-light:#39ADB5;--shiki-default:#BFBDB6;--shiki-dark:#BFBDB6}html pre.shiki code .s_I6F, html code.shiki .s_I6F{--shiki-light:#39ADB5;--shiki-default:#BFBDB6B3;--shiki-dark:#BFBDB6B3}",{"title":26,"searchDepth":27,"depth":27,"links":2194},[2195,2198,2199,2200,2205],{"id":1228,"depth":27,"text":1229,"children":2196},[2197],{"id":1359,"depth":1646,"text":1360},{"id":1573,"depth":27,"text":1574},{"id":1770,"depth":27,"text":1192},{"id":1885,"depth":27,"text":1886,"children":2201},[2202,2203,2204],{"id":1910,"depth":1646,"text":1911},{"id":1931,"depth":1646,"text":1932},{"id":2141,"depth":1646,"text":2142},{"id":2168,"depth":27,"text":2169},[519,262,504,273],"Four critical security issues landed within 48 hours: PHP, a Laravel auth bypass, Node.js, and the eMudhra CA compromise. Here's what each one means and what to update.",{},{"title":780,"description":2207},"blog\u002Fphp-laravel-node-emudhra-security-updates-october-2026","mPK90V3XPL8Xtfn1bYy0u8KVrYthfAGHG31UyWpig1c",[2213,2222,2231,2240],{"id":5,"title":6,"badge":7,"badges":2214,"buy_url":15,"complete_package_url":15,"description":16,"essentials_url":15,"extension":17,"external":18,"logo_component":15,"logo_square":19,"logo_wide":20,"meta":2217,"screenshot":29,"short_description":30,"short_title":15,"stem":31,"trial_url":32,"type":33,"url":34,"__hash__":35},[2215,2216],{"label":10,"color":11},{"label":13,"color":14},{"body":2218},{"type":23,"value":2219,"toc":2220},[],{"title":26,"searchDepth":27,"depth":27,"links":2221},[],{"id":37,"title":38,"badge":15,"badges":2223,"buy_url":45,"complete_package_url":15,"description":46,"essentials_url":15,"extension":17,"external":18,"logo_component":15,"logo_square":47,"logo_wide":48,"meta":2226,"screenshot":54,"short_description":55,"short_title":15,"stem":56,"trial_url":15,"type":33,"url":57,"__hash__":58},[2224,2225],{"label":41,"color":11},{"label":43,"color":44},{"body":2227},{"type":23,"value":2228,"toc":2229},[],{"title":26,"searchDepth":27,"depth":27,"links":2230},[],{"id":60,"title":61,"badge":15,"badges":2232,"buy_url":69,"complete_package_url":69,"description":70,"essentials_url":71,"extension":17,"external":72,"logo_component":73,"logo_square":74,"logo_wide":15,"meta":2235,"screenshot":80,"short_description":81,"short_title":82,"stem":83,"trial_url":15,"type":84,"url":85,"__hash__":86},[2233,2234],{"label":64,"color":65},{"label":67,"color":68},{"body":2236},{"type":23,"value":2237,"toc":2238},[],{"title":26,"searchDepth":27,"depth":27,"links":2239},[],{"id":88,"title":89,"badge":15,"badges":2241,"buy_url":96,"complete_package_url":96,"description":97,"essentials_url":98,"extension":17,"external":72,"logo_component":99,"logo_square":100,"logo_wide":15,"meta":2245,"screenshot":106,"short_description":107,"short_title":108,"stem":109,"trial_url":15,"type":84,"url":110,"__hash__":111},[2242,2243,2244],{"label":64,"color":65},{"label":67,"color":68},{"label":94,"color":95},{"body":2246},{"type":23,"value":2247,"toc":2248},[],{"title":26,"searchDepth":27,"depth":27,"links":2249},[],{"fromGitHub":18,"tiers":2251},{"platinum":2252,"gold":2258,"silver":2259,"bronze":2264,"infrastructure":2265,"supporters":2273},[2253],{"name":2254,"url":2255,"logo":2256,"logo_dark":2257},"Sevalla","https:\u002F\u002Fsevalla.com","\u002Fsponsors\u002Fsevalla.png","\u002Flogos\u002Fsevalla.svg",[],[2260],{"name":2261,"url":2262,"logo":2263,"logo_dark":15},"GiGa infosystems","https:\u002F\u002Fgiga-infosystems.com","\u002Fsponsors\u002Fgiga-infosystems.png",[],[2266,2270],{"name":2267,"url":2268,"logo":2269,"logo_dark":15},"Depot","https:\u002F\u002Fdepot.dev","\u002Fsponsors\u002Fdepot.png",{"name":10,"url":2271,"logo":2272,"logo_dark":15},"https:\u002F\u002Fhub.docker.com\u002Fu\u002Fserversideup","\u002Fsponsors\u002Fdocker.png",[],[2275,2284,2293,2302],{"id":5,"title":6,"badge":7,"badges":2276,"buy_url":15,"complete_package_url":15,"description":16,"essentials_url":15,"extension":17,"external":18,"logo_component":15,"logo_square":19,"logo_wide":20,"meta":2279,"screenshot":29,"short_description":30,"short_title":15,"stem":31,"trial_url":32,"type":33,"url":34,"__hash__":35},[2277,2278],{"label":10,"color":11},{"label":13,"color":14},{"body":2280},{"type":23,"value":2281,"toc":2282},[],{"title":26,"searchDepth":27,"depth":27,"links":2283},[],{"id":37,"title":38,"badge":15,"badges":2285,"buy_url":45,"complete_package_url":15,"description":46,"essentials_url":15,"extension":17,"external":18,"logo_component":15,"logo_square":47,"logo_wide":48,"meta":2288,"screenshot":54,"short_description":55,"short_title":15,"stem":56,"trial_url":15,"type":33,"url":57,"__hash__":58},[2286,2287],{"label":41,"color":11},{"label":43,"color":44},{"body":2289},{"type":23,"value":2290,"toc":2291},[],{"title":26,"searchDepth":27,"depth":27,"links":2292},[],{"id":60,"title":61,"badge":15,"badges":2294,"buy_url":69,"complete_package_url":69,"description":70,"essentials_url":71,"extension":17,"external":72,"logo_component":73,"logo_square":74,"logo_wide":15,"meta":2297,"screenshot":80,"short_description":81,"short_title":82,"stem":83,"trial_url":15,"type":84,"url":85,"__hash__":86},[2295,2296],{"label":64,"color":65},{"label":67,"color":68},{"body":2298},{"type":23,"value":2299,"toc":2300},[],{"title":26,"searchDepth":27,"depth":27,"links":2301},[],{"id":88,"title":89,"badge":15,"badges":2303,"buy_url":96,"complete_package_url":96,"description":97,"essentials_url":98,"extension":17,"external":72,"logo_component":99,"logo_square":100,"logo_wide":15,"meta":2307,"screenshot":106,"short_description":107,"short_title":108,"stem":109,"trial_url":15,"type":84,"url":110,"__hash__":111},[2304,2305,2306],{"label":64,"color":65},{"label":67,"color":68},{"label":94,"color":95},{"body":2308},{"type":23,"value":2309,"toc":2310},[],{"title":26,"searchDepth":27,"depth":27,"links":2311},[],[2313,2322,2331,2340,2349,2358],{"id":114,"title":115,"badge":15,"badges":2314,"description":123,"extension":17,"external":72,"github_slug":124,"logo_square":125,"logo_wide":126,"meta":2317,"repo_url":132,"screenshot":133,"short_description":134,"short_title":135,"stem":136,"type":137,"url":138,"__hash__":139},[2315,2316],{"label":118,"color":119},{"label":121,"color":122},{"body":2318},{"type":23,"value":2319,"toc":2320},[],{"title":26,"searchDepth":27,"depth":27,"links":2321},[],{"id":141,"title":142,"badge":15,"badges":2323,"description":147,"extension":17,"external":72,"github_slug":148,"logo_square":47,"logo_wide":149,"meta":2326,"repo_url":155,"screenshot":156,"short_description":157,"short_title":15,"stem":158,"type":159,"url":160,"__hash__":161},[2324,2325],{"label":118,"color":119},{"label":146,"color":14},{"body":2327},{"type":23,"value":2328,"toc":2329},[],{"title":26,"searchDepth":27,"depth":27,"links":2330},[],{"id":163,"title":164,"badge":15,"badges":2332,"description":169,"extension":17,"external":72,"github_slug":170,"logo_square":171,"logo_wide":172,"meta":2335,"repo_url":178,"screenshot":179,"short_description":180,"short_title":15,"stem":181,"type":182,"url":183,"__hash__":184},[2333,2334],{"label":118,"color":119},{"label":168,"color":65},{"body":2336},{"type":23,"value":2337,"toc":2338},[],{"title":26,"searchDepth":27,"depth":27,"links":2339},[],{"id":186,"title":187,"badge":15,"badges":2341,"description":193,"extension":17,"external":72,"github_slug":194,"logo_square":195,"logo_wide":196,"meta":2344,"repo_url":202,"screenshot":203,"short_description":204,"short_title":15,"stem":205,"type":206,"url":207,"__hash__":208},[2342,2343],{"label":118,"color":119},{"label":191,"color":192},{"body":2345},{"type":23,"value":2346,"toc":2347},[],{"title":26,"searchDepth":27,"depth":27,"links":2348},[],{"id":210,"title":211,"badge":15,"badges":2350,"description":216,"extension":17,"external":72,"github_slug":217,"logo_square":218,"logo_wide":219,"meta":2353,"repo_url":225,"screenshot":226,"short_description":227,"short_title":15,"stem":228,"type":206,"url":229,"__hash__":230},[2351,2352],{"label":118,"color":119},{"label":215,"color":14},{"body":2354},{"type":23,"value":2355,"toc":2356},[],{"title":26,"searchDepth":27,"depth":27,"links":2357},[],{"id":232,"title":233,"badge":15,"badges":2359,"description":237,"extension":17,"external":18,"github_slug":238,"logo_square":239,"logo_wide":15,"meta":2362,"repo_url":245,"screenshot":15,"short_description":246,"short_title":247,"stem":248,"type":137,"url":245,"__hash__":249},[2360,2361],{"label":118,"color":119},{"label":121,"color":122},{"body":2363},{"type":23,"value":2364,"toc":2365},[],{"title":26,"searchDepth":27,"depth":27,"links":2366},[],[2368,2377,2386,2395,2404,2413],{"id":114,"title":115,"badge":15,"badges":2369,"description":123,"extension":17,"external":72,"github_slug":124,"logo_square":125,"logo_wide":126,"meta":2372,"repo_url":132,"screenshot":133,"short_description":134,"short_title":135,"stem":136,"type":137,"url":138,"__hash__":139},[2370,2371],{"label":118,"color":119},{"label":121,"color":122},{"body":2373},{"type":23,"value":2374,"toc":2375},[],{"title":26,"searchDepth":27,"depth":27,"links":2376},[],{"id":141,"title":142,"badge":15,"badges":2378,"description":147,"extension":17,"external":72,"github_slug":148,"logo_square":47,"logo_wide":149,"meta":2381,"repo_url":155,"screenshot":156,"short_description":157,"short_title":15,"stem":158,"type":159,"url":160,"__hash__":161},[2379,2380],{"label":118,"color":119},{"label":146,"color":14},{"body":2382},{"type":23,"value":2383,"toc":2384},[],{"title":26,"searchDepth":27,"depth":27,"links":2385},[],{"id":163,"title":164,"badge":15,"badges":2387,"description":169,"extension":17,"external":72,"github_slug":170,"logo_square":171,"logo_wide":172,"meta":2390,"repo_url":178,"screenshot":179,"short_description":180,"short_title":15,"stem":181,"type":182,"url":183,"__hash__":184},[2388,2389],{"label":118,"color":119},{"label":168,"color":65},{"body":2391},{"type":23,"value":2392,"toc":2393},[],{"title":26,"searchDepth":27,"depth":27,"links":2394},[],{"id":186,"title":187,"badge":15,"badges":2396,"description":193,"extension":17,"external":72,"github_slug":194,"logo_square":195,"logo_wide":196,"meta":2399,"repo_url":202,"screenshot":203,"short_description":204,"short_title":15,"stem":205,"type":206,"url":207,"__hash__":208},[2397,2398],{"label":118,"color":119},{"label":191,"color":192},{"body":2400},{"type":23,"value":2401,"toc":2402},[],{"title":26,"searchDepth":27,"depth":27,"links":2403},[],{"id":210,"title":211,"badge":15,"badges":2405,"description":216,"extension":17,"external":72,"github_slug":217,"logo_square":218,"logo_wide":219,"meta":2408,"repo_url":225,"screenshot":226,"short_description":227,"short_title":15,"stem":228,"type":206,"url":229,"__hash__":230},[2406,2407],{"label":118,"color":119},{"label":215,"color":14},{"body":2409},{"type":23,"value":2410,"toc":2411},[],{"title":26,"searchDepth":27,"depth":27,"links":2412},[],{"id":232,"title":233,"badge":15,"badges":2414,"description":237,"extension":17,"external":18,"github_slug":238,"logo_square":239,"logo_wide":15,"meta":2417,"repo_url":245,"screenshot":15,"short_description":246,"short_title":247,"stem":248,"type":137,"url":245,"__hash__":249},[2415,2416],{"label":118,"color":119},{"label":121,"color":122},{"body":2418},{"type":23,"value":2419,"toc":2420},[],{"title":26,"searchDepth":27,"depth":27,"links":2421},[],1792613322521]