[{"data":1,"prerenderedAt":1938},["ShallowReactive",2],{"productsSearch":3,"openSourceSearch":112,"postsSearch":250,"guidesSearch":1062,"blog-php-cve-2026-115560-session-upload-progress":1106,"guides-post-null":15,"guides-posts-null":15,"header-products":1722,"$f2bzpwklhdwuf9":1760,"footer-products":1790,"header-open-source":1828,"footer-open-source":1883},[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,798,802,807,811,816,821,826,831,836,841,846,851,856,861,865,870,875,880,885,890,895,900,905,910,915,920,924,929,934,939,944,949,953,957,961,966,970,975,979,983,987,991,996,1001,1006,1010,1014,1019,1024,1029,1034,1038,1043,1048,1053,1058],{"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-cve-2026-115560-session-upload-progress","A new PHP CVE was announced. Here's what you need to know",[519,504],"2026-10-23",{"path":784,"title":785,"categories":786,"date":787},"\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":789,"title":790,"categories":791,"date":792},"\u002Fblog\u002Fplanning-your-laravel-and-vuejs-spa-application-admin-section","Planning your Laravel and VueJS SPA Application Admin Section",[262],"2018-08-14",{"path":794,"title":795,"categories":796,"date":797},"\u002Fblog\u002Fpost-put-and-patch-requests-with-nuxt-3","POST, PUT, and PATCH Requests with Nuxt 3",[255],"2022-05-03",{"path":799,"title":800,"categories":801,"date":697},"\u002Fblog\u002Fpost-put-patch-requests-with-vuejs-and-axios","POST, PUT & PATCH Requests with VueJS and Axios",[256],{"path":803,"title":804,"categories":805,"date":806},"\u002Fblog\u002Fprevent-website-downtime-cloud-outage-survival-guide","Prevent Website Downtime with this Cloud Outage Survival Guide",[273],"2016-12-05",{"path":808,"title":809,"categories":810,"date":510},"\u002Fblog\u002Fpreview-file-uploads-with-axios-and-vuejs","Preview File Uploads with Axios and VueJS",[256],{"path":812,"title":813,"categories":814,"date":815},"\u002Fblog\u002Fpreview-mp3-with-html5-audio-element-and-vuejs","Preview MP3 with HTML5 Audio Element and VueJS",[256],"2021-10-19",{"path":817,"title":818,"categories":819,"date":820},"\u002Fblog\u002Fpreview-video-before-uploading-with-html5-and-vuejs","Preview Video Before Uploading with HTML5 and VueJS",[256],"2021-10-25",{"path":822,"title":823,"categories":824,"date":825},"\u002Fblog\u002Fpreviewing-a-csv-file-with-vuejs-and-papaparse","Previewing a CSV file with VueJS and Papaparse",[256],"2021-11-01",{"path":827,"title":828,"categories":829,"date":830},"\u002Fblog\u002Fpublic-private-api-laravel","Public and Private API with Laravel",[262],"2017-12-28",{"path":832,"title":833,"categories":834,"date":835},"\u002Fblog\u002Fre-using-vuejs-mixins-filtering-google-map-data","Re-using VueJS Mixins and Filtering Google Map Data",[256],"2017-12-11",{"path":837,"title":838,"categories":839,"date":840},"\u002Fblog\u002Froast-designs-have-been-updated","Roast Designs Have Been Updated",[256,262],"2018-05-16",{"path":842,"title":843,"categories":844,"date":845},"\u002Fblog\u002Froast-is-on-laravel-5-6","Roast is on Laravel 5.6!",[256,262],"2018-06-13",{"path":847,"title":848,"categories":849,"date":850},"\u002Fblog\u002Fsearch-eloquent-relationships-with-laravel-scout-and-meilisearch","Search Eloquent Relationships with Laravel Scout and Meilisearch",[262],"2022-03-28",{"path":852,"title":853,"categories":854,"date":855},"\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":857,"title":858,"categories":859,"date":860},"\u002Fblog\u002Fsending-server-sent-events-with-laravel","Sending Server Sent Events (SSE) with Laravel",[262],"2025-12-09",{"path":862,"title":863,"categories":864,"date":428},"\u002Fblog\u002Fset-song-played-percentage-amplitudejs","Set Song Played Percentage with AmplitudeJS",[301],{"path":866,"title":867,"categories":868,"date":869},"\u002Fblog\u002Fsetting-page-titles-in-nuxt-3","Setting Page Titles in Nuxt 3",[255],"2022-03-22",{"path":871,"title":872,"categories":873,"date":874},"\u002Fblog\u002Fsorting-in-vuejs-components-and-vuex-state","Sorting in VueJS Components and Vuex State",[255],"2018-09-25",{"path":876,"title":877,"categories":878,"date":879},"\u002Fblog\u002Fsorting-meilisearch-results-with-laravel-scout-and-eloquent","Sorting Meilisearch Results with Laravel Scout and Eloquent",[262],"2022-04-04",{"path":881,"title":882,"categories":883,"date":884},"\u002Fblog\u002Fspa-tutorial-update-2","SPA Tutorial Update 2",[262,256],"2017-11-13",{"path":886,"title":887,"categories":888,"date":889},"\u002Fblog\u002Fspa-tutorial-update-3","SPA Tutorial Update 3",[262,256],"2017-12-04",{"path":891,"title":892,"categories":893,"date":894},"\u002Fblog\u002Fspa-tutorial-update-4","SPA Tutorial Update 4",[262,256],"2017-12-21",{"path":896,"title":897,"categories":898,"date":899},"\u002Fblog\u002Fspin-launch-deploy-laravel-like-a-pro","Spin v3: Deploy Laravel Like A Pro",[273,262],"2025-03-19",{"path":901,"title":902,"categories":903,"date":904},"\u002Fblog\u002Fstream-terminal-output-to-browser","Stream Terminal Output To Browser",[262],"2025-12-16",{"path":906,"title":907,"categories":908,"date":909},"\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":911,"title":912,"categories":913,"date":914},"\u002Fblog\u002Fstyle-the-html-5-audio-element","Tutorial: How To Style the HTML 5 Audio Player",[301],"2012-10-21",{"path":916,"title":917,"categories":918,"date":919},"\u002Fblog\u002Ftagging-with-laravel","Tagging With Laravel",[301],"2017-11-27",{"path":921,"title":922,"categories":923,"date":378},"\u002Fblog\u002Ftutorial-progress","SPA Tutorial Progress Update",[262],{"path":925,"title":926,"categories":927,"date":928},"\u002Fblog\u002Funique-elements-in-amplitudejs","Unique Elements in AmplitudeJS",[301],"2018-09-06",{"path":930,"title":931,"categories":932,"date":933},"\u002Fblog\u002Fupgrade-your-ubiquiti-usg-firmware-the-easy-way","Upgrade your Ubiquiti USG firmware the easy way",[279,280],"2017-12-01",{"path":935,"title":936,"categories":937,"date":938},"\u002Fblog\u002Fuploading-files-vuejs-axios","Uploading Files With VueJS and Axios",[256],"2017-12-13",{"path":940,"title":941,"categories":942,"date":943},"\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":945,"title":946,"categories":947,"date":948},"\u002Fblog\u002Fusing-amplitudejs-public-methods","Using AmplitudeJS Public Methods",[256],"2018-09-13",{"path":950,"title":951,"categories":952,"date":257},"\u002Fblog\u002Fusing-async-data-in-nuxt-3","Using asyncData in Nuxt 3",[255],{"path":954,"title":955,"categories":956,"date":423},"\u002Fblog\u002Fusing-axios-to-make-api-requests-with-vuejs","Using Axios to Make API Requests With VueJS",[256],{"path":958,"title":959,"categories":960,"date":869},"\u002Fblog\u002Fusing-environment-variables-in-nuxt-3","Using Environment Variables in Nuxt 3",[255],{"path":962,"title":963,"categories":964,"date":965},"\u002Fblog\u002Fusing-foundation-sites-laravel-5-3-webpack","Using Foundation Sites with Laravel 5.3 and Webpack",[262],"2017-02-24",{"path":967,"title":968,"categories":969,"date":697},"\u002Fblog\u002Fusing-laravel-mix-in-a-wordpress-theme","Using Laravel Mix in a WordPress Theme",[301],{"path":971,"title":972,"categories":973,"date":974},"\u002Fblog\u002Fusing-laravel-sanctum-airlock-with-nuxtjs","Using Laravel Sanctum\u002FAirlock with NuxtJS",[262],"2020-01-17",{"path":976,"title":977,"categories":978,"date":767},"\u002Fblog\u002Fusing-nuxtjs-to-build-an-ios-and-android-app","Using NuxtJS to Build an iOS and Android App",[255],{"path":980,"title":981,"categories":982,"date":378},"\u002Fblog\u002Fusing-sass-vue-components-laravel-mix","Using SASS in Vue Components with Laravel Mix",[256],{"path":984,"title":985,"categories":986,"date":418},"\u002Fblog\u002Fusing-stripe-elements-in-a-vuejs-component","Using Stripe Elements in a VueJS Component",[256],{"path":988,"title":989,"categories":990,"date":767},"\u002Fblog\u002Fusing-tailwindcss-to-design-your-mobile-app","Using TailwindCSS to Design Your Mobile App",[256],{"path":992,"title":993,"categories":994,"date":995},"\u002Fblog\u002Fusing-vuex-modules-inside-components","Using Vuex Modules Inside Components",[256],"2017-10-19",{"path":997,"title":998,"categories":999,"date":1000},"\u002Fblog\u002Fusing-vuex-with-inertiajs","Using Vuex with InertiaJS",[584],"2021-09-21",{"path":1002,"title":1003,"categories":1004,"date":1005},"\u002Fblog\u002Fvalidating-api-request-javascript-laravel","Validating an API request with Javascript and Laravel",[262,301],"2017-10-30",{"path":1007,"title":1008,"categories":1009,"date":869},"\u002Fblog\u002Fvue-3-web-notification-component","Vue 3 Web Notification Component",[256],{"path":1011,"title":1012,"categories":1013,"date":484},"\u002Fblog\u002Fvue-js-tag-input","Vue JS Tag input",[256],{"path":1015,"title":1016,"categories":1017,"date":1018},"\u002Fblog\u002Fvue-router-navigation-guards-vuex","Vue Router Navigation Guards with Vuex",[256],"2018-01-08",{"path":1020,"title":1021,"categories":1022,"date":1023},"\u002Fblog\u002Fvue-router-permission-recipes-and-laravel-policies-examples","Vue Router Permission Recipes and Laravel Policies Examples",[256],"2018-09-18",{"path":1025,"title":1026,"categories":1027,"date":1028},"\u002Fblog\u002Fvuejs-app-admin-screens","VueJS App Admin Screens",[256],"2018-09-11",{"path":1030,"title":1031,"categories":1032,"date":1033},"\u002Fblog\u002Fvuejs-route-permissions-security-and-admin-section","VueJS Route Permissions, Security and Admin Section",[256],"2018-09-04",{"path":1035,"title":1036,"categories":1037,"date":373},"\u002Fblog\u002Fvuepress-within-a-laravel-application","Vuepress Within a Laravel Application",[256],{"path":1039,"title":1040,"categories":1041,"date":1042},"\u002Fblog\u002Fwe-will-launch-your-ai-app","We Will Launch Your AI App",[393],"2026-07-17",{"path":1044,"title":1045,"categories":1046,"date":1047},"\u002Fblog\u002Fwhat-is-amplitude-js","What Is AmplitudeJS?",[301],"2018-08-22",{"path":1049,"title":1050,"categories":1051,"date":1052},"\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":1054,"title":1055,"categories":1056,"date":1057},"\u002Fblog\u002Fwhy-make-your-saas-self-hostable","Why Make Your SaaS Self-Hostable?",[393],"2026-01-28",{"path":1059,"title":1060,"categories":1061,"date":1047},"\u002Fblog\u002Fworking-with-amplitudejs-song-object-metadata","Working With AmplitudeJS Song Object Metadata",[301],[1063,1067,1071,1075,1079,1083,1087,1090,1094,1098,1102],{"path":1064,"title":1065,"categories":1066},"\u002Fguides\u002Famplitudejs-from-the-ground-up","AmplitudeJS From the Ground Up",[301],{"path":1068,"title":1069,"categories":1070},"\u002Fguides\u002Fapi-driven-development-laravel-vuejs","API Driven Development With Laravel and VueJS",[262,256],{"path":1072,"title":1073,"categories":1074},"\u002Fguides\u002Fcomplete-ubiquiti-unifi-synology-network-build","Complete Ubiquiti UniFi + Synology Network Build",[279,280,534],{"path":1076,"title":1077,"categories":1078},"\u002Fguides\u002Fdesigning-your-saas-app-to-be-self-hostable","Designing Your SaaS App to be Self-Hostable",[393],{"path":1080,"title":1081,"categories":1082},"\u002Fguides\u002Fgain-flexibility-and-increase-privacy-with-wireguard-vpn","Gain Flexibility and Increase Privacy with WireGuard VPN",[280],{"path":1084,"title":1085,"categories":1086},"\u002Fguides\u002Fguide-uploading-files-vuejs-axios","Guide to Uploading Files with VueJS and Axios",[301,256],{"path":1088,"title":977,"categories":1089},"\u002Fguides\u002Fhow-to-build-an-ios-android-app-with-capacitorjs-nuxtjs-tailwindcss",[301,256,255],{"path":1091,"title":1092,"categories":1093},"\u002Fguides\u002Fupgrading-nuxt-2-to-nuxt-3","Upgrading Nuxt 2 to Nuxt 3",[255,256],{"path":1095,"title":1096,"categories":1097},"\u002Fguides\u002Fusing-fetch-api-with-vuejs","Using Fetch API with Vue.js",[301,256],{"path":1099,"title":1100,"categories":1101},"\u002Fguides\u002Fusing-laravel-cashier-with-vuejs-spa-and-laravel-passport-api","Using Laravel Cashier with VueJS SPA and Laravel Passport API",[301,256],{"path":1103,"title":1104,"categories":1105},"\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":1107,"title":780,"author":1108,"body":1109,"categories":1716,"date":782,"description":1717,"extension":17,"guide":15,"header_image":72,"meta":1718,"navigation":18,"path":779,"seo":1719,"stem":1720,"video_url":15,"__hash__":1721},"blog\u002Fblog\u002Fphp-cve-2026-115560-session-upload-progress.md","jaydrogers",{"type":23,"value":1110,"toc":1705},[1111,1124,1127,1132,1156,1159,1172,1179,1183,1186,1220,1223,1226,1272,1279,1282,1313,1318,1346,1352,1356,1363,1383,1392,1405,1409,1428,1442,1449,1513,1541,1544,1573,1579,1582,1641,1644,1648,1658,1680,1684,1687,1693,1701],[1112,1113,1114,1115,1123],"p",{},"Two days after PHP's big security release, the PHP security team posted another notice. This one is new and is being tracked as ",[1116,1117,1122],"a",{"href":1118,"rel":1119,"target":1121},"https:\u002F\u002Fwww.php.net\u002Farchive\u002F2026.php#2026-10-23-1",[1120],"nofollow","_blank","CVE-2026-115560",", a remote code execution bug in session upload progress. There's no patched PHP release for it yet.",[1112,1125,1126],{},"The good news is it takes a really specific setup to exploit. The confusing part is how it relates to Wednesday's release. Let's clear it up.",[1128,1129,1131],"h2",{"id":1130},"how-this-relates-to-wednesdays-cves","How this relates to Wednesday's CVEs",[1112,1133,1134,1135,1139,1140,1144,1145,1144,1148,1151,1152,1155],{},"On October 21, PHP fixed CVE-2026-109618 and CVE-2026-109619. I covered both in ",[1116,1136,1138],{"href":1137},"\u002Fblog\u002Fphp-laravel-node-emudhra-security-updates-october-2026\u002F","this post",". Updating to ",[1141,1142,1143],"code",{},"8.5.12",", ",[1141,1146,1147],{},"8.4.27",[1141,1149,1150],{},"8.3.36",", or ",[1141,1153,1154],{},"8.2.35"," fixed those two.",[1112,1157,1158],{},"It does not fix CVE-2026-115560 (today's vulnerability). This is a separate vulnerability.",[1112,1160,1161,1162,1167,1168,1171],{},"The overlap is the workaround. The ",[1116,1163,1166],{"href":1164,"rel":1165,"target":1121},"https:\u002F\u002Fgithub.com\u002Fphp\u002Fphp-src\u002Fsecurity\u002Fadvisories\u002FGHSA-6wmf-4rv5-p3rp",[1120],"advisory for CVE-2026-109619"," already suggested turning off ",[1141,1169,1170],{},"session.upload_progress.enabled"," if you couldn't update right away. The real fix was patching, so most people just patched.",[1112,1173,1174,1175,1178],{},"Now PHP is recommending ",[1141,1176,1177],{},"session.upload_progress.enabled=0"," again, this time to block CVE-2026-115560.",[1128,1180,1182],{"id":1181},"are-you-affected","Are you affected?",[1112,1184,1185],{},"Your app is only exposed if all three of these are true:",[1187,1188,1189,1204,1217],"ol",{},[1190,1191,1192,1195,1196,1199,1200,1203],"li",{},[1141,1193,1194],{},"session.serialize_handler"," is set to ",[1141,1197,1198],{},"php_binary"," or ",[1141,1201,1202],{},"php_serialize"," in your PHP config",[1190,1205,1206,1207,1209,1210,1213,1214],{},"Your code switches it to ",[1141,1208,519],{}," with ",[1141,1211,1212],{},"ini_set()"," before calling ",[1141,1215,1216],{},"session_start()",[1190,1218,1219],{},"Session upload progress is enabled (it's on by default)",[1112,1221,1222],{},"The first two are the rare part. Most apps never touch the serialize handler, let alone change it in the middle of a request. PHP acknowledges this, which is why they're shipping the fix in their regular release cycle instead of an emergency release.",[1112,1224,1225],{},"Search your codebase for anything that changes it:",[1227,1228,1233],"pre",{"className":1229,"code":1230,"filename":1231,"language":1232,"meta":26,"style":26},"language-bash shiki shiki-themes material-theme-lighter ayu-dark ayu-dark","grep -rn \"serialize_handler\" --include=\"*.php\" .\n","Search for serialize handler changes","bash",[1141,1234,1235],{"__ignoreMap":26},[1236,1237,1240,1244,1248,1252,1256,1259,1262,1264,1267,1269],"span",{"class":1238,"line":1239},"line",1,[1236,1241,1243],{"class":1242},"sYo81","grep",[1236,1245,1247],{"class":1246},"s9syP"," -rn",[1236,1249,1251],{"class":1250},"sm2Rb"," \"",[1236,1253,1255],{"class":1254},"svKdX","serialize_handler",[1236,1257,1258],{"class":1250},"\"",[1236,1260,1261],{"class":1246}," --include=",[1236,1263,1258],{"class":1250},[1236,1265,1266],{"class":1254},"*.php",[1236,1268,1258],{"class":1250},[1236,1270,1271],{"class":1254}," .\n",[1112,1273,1274,1275,1278],{},"Leave ",[1141,1276,1277],{},"vendor\u002F"," in the search, because a package could be the one doing it.",[1112,1280,1281],{},"Then check what your config is set to:",[1227,1283,1286],{"className":1229,"code":1284,"filename":1285,"language":1232,"meta":26,"style":26},"php -i | grep -E \"session.serialize_handler|session.upload_progress.enabled\"\n","Check your session settings",[1141,1287,1288],{"__ignoreMap":26},[1236,1289,1290,1292,1295,1299,1302,1305,1307,1310],{"class":1238,"line":1239},[1236,1291,519],{"class":1242},[1236,1293,1294],{"class":1246}," -i",[1236,1296,1298],{"class":1297},"sLPTV"," |",[1236,1300,1301],{"class":1242}," grep",[1236,1303,1304],{"class":1246}," -E",[1236,1306,1251],{"class":1250},[1236,1308,1309],{"class":1254},"session.serialize_handler|session.upload_progress.enabled",[1236,1311,1312],{"class":1250},"\"\n",[1314,1315,1317],"h3",{"id":1316},"if-you-run-laravel","If you run Laravel",[1112,1319,1320,1321,1326,1327,1332,1333,1199,1336,1339,1340,1342,1343,1345],{},"Laravel doesn't use PHP's built-in sessions. When Laravel ",[1116,1322,1325],{"href":1323,"rel":1324,"target":1121},"https:\u002F\u002Fgithub.com\u002Flaravel\u002Fframework\u002Fblob\u002Fv13.38.0\u002Fsrc\u002FIlluminate\u002FSession\u002FStore.php#L98-L107",[1120],"starts a session",", it ",[1116,1328,1331],{"href":1329,"rel":1330,"target":1121},"https:\u002F\u002Fgithub.com\u002Flaravel\u002Fframework\u002Fblob\u002Fv13.38.0\u002Fsrc\u002FIlluminate\u002FSession\u002FStore.php#L126-L140",[1120],"reads the raw data from its own driver"," (file, database, Redis, etc.) and decodes it with ",[1141,1334,1335],{},"unserialize()",[1141,1337,1338],{},"json_decode()",". The framework never calls ",[1141,1341,1216],{}," and never touches ",[1141,1344,1194],{},", so it can't meet the second condition.",[1112,1347,1348,1349,1351],{},"You'd only be exposed if your own code or a package starts a native PHP session alongside Laravel. That's what the ",[1141,1350,1243],{}," above is for.",[1128,1353,1355],{"id":1354},"turn-off-session-upload-progress","Turn off session upload progress",[1112,1357,1358,1359,1362],{},"Until PHP ships a patched release, set this in your ",[1141,1360,1361],{},"php.ini"," or FPM pool config:",[1227,1364,1368],{"className":1365,"code":1366,"filename":1361,"language":1367,"meta":26,"style":26},"language-ini shiki shiki-themes material-theme-lighter ayu-dark ayu-dark","session.upload_progress.enabled = 0\n","ini",[1141,1369,1370],{"__ignoreMap":26},[1236,1371,1372,1375,1379],{"class":1238,"line":1239},[1236,1373,1170],{"class":1374},"ss6I4",[1236,1376,1378],{"class":1377},"s_I6F"," =",[1236,1380,1382],{"class":1381},"saiic"," 0\n",[1112,1384,1385,1386,1199,1388,1391],{},"Then restart PHP so every worker picks it up. PHP's advice from Wednesday still applies here: don't rely on ",[1141,1387,1212],{},[1141,1389,1390],{},".user.ini",", because the setting needs to apply before PHP parses the request.",[1112,1393,1394,1395,1400,1401,1404],{},"The only thing you lose is ",[1116,1396,1399],{"href":1397,"rel":1398,"target":1121},"https:\u002F\u002Fwww.php.net\u002Fmanual\u002Fen\u002Fsession.upload-progress.php",[1120],"upload progress tracking"," through ",[1141,1402,1403],{},"$_SESSION",". Most upload progress bars these days come from JavaScript in the browser, not from this.",[1128,1406,1408],{"id":1407},"if-you-use-serversideupphp","If you use serversideup\u002Fphp",[1112,1410,1411,1412,1419,1420,1423,1424,1427],{},"We released ",[1116,1413,1416],{"href":1414,"rel":1415,"target":1121},"https:\u002F\u002Fgithub.com\u002Fserversideup\u002Fdocker-php\u002Freleases\u002Ftag\u002Fv5.0.3",[1120],[1141,1417,1418],{},"v5.0.3"," this morning to be safe. It adds a ",[1141,1421,1422],{},"PHP_SESSION_UPLOAD_PROGRESS_ENABLED"," environment variable and defaults it to ",[1141,1425,1426],{},"0",".",[1112,1429,1430,1431,1441],{},"Our images already ",[1116,1432,1435,1436,1438,1439],{"href":1433,"rel":1434,"target":1121},"https:\u002F\u002Fgithub.com\u002Fserversideup\u002Fdocker-php\u002Fblob\u002Fv5.0.3\u002Fsrc\u002Fcommon\u002Fusr\u002Flocal\u002Fetc\u002Fphp\u002Fconf.d\u002Fserversideup-docker-php.ini#L1438",[1120],"default ",[1141,1437,1194],{}," to ",[1141,1440,519],{},", so most people running them were never in a position to hit this. We'd still rather ship the safe default than have everyone audit their apps by hand.",[1112,1443,1444,1445,1448],{},"PHP versions didn't change from ",[1141,1446,1447],{},"v5.0.2",", so here's how to update based on your tag:",[1450,1451,1452,1468],"table",{},[1453,1454,1455],"thead",{},[1456,1457,1458,1462,1465],"tr",{},[1459,1460,1461],"th",{},"Tag type",[1459,1463,1464],{},"Example",[1459,1466,1467],{},"What to do",[1469,1470,1471,1485,1501],"tbody",{},[1456,1472,1473,1477,1482],{},[1474,1475,1476],"td",{},"Floating",[1474,1478,1479],{},[1141,1480,1481],{},"8.4-fpm-nginx",[1474,1483,1484],{},"Pull and redeploy",[1456,1486,1487,1490,1495],{},[1474,1488,1489],{},"Release",[1474,1491,1492],{},[1141,1493,1494],{},"8.4-fpm-nginx-v5.0.2",[1474,1496,1497,1498],{},"Change it to ",[1141,1499,1500],{},"8.4-fpm-nginx-v5.0.3",[1456,1502,1503,1506,1511],{},[1474,1504,1505],{},"Patch version",[1474,1507,1508],{},[1141,1509,1510],{},"8.4.27-fpm-nginx",[1474,1512,1484],{},[1227,1514,1517],{"className":1229,"code":1515,"filename":1516,"language":1232,"meta":26,"style":26},"docker compose pull\ndocker compose up -d\n","Pull and restart",[1141,1518,1519,1529],{"__ignoreMap":26},[1236,1520,1521,1523,1526],{"class":1238,"line":1239},[1236,1522,504],{"class":1242},[1236,1524,1525],{"class":1254}," compose",[1236,1527,1528],{"class":1254}," pull\n",[1236,1530,1531,1533,1535,1538],{"class":1238,"line":27},[1236,1532,504],{"class":1242},[1236,1534,1525],{"class":1254},[1236,1536,1537],{"class":1254}," up",[1236,1539,1540],{"class":1246}," -d\n",[1112,1542,1543],{},"Then confirm it's off:",[1227,1545,1548],{"className":1229,"code":1546,"filename":1547,"language":1232,"meta":26,"style":26},"docker compose exec php php -i | grep session.upload_progress.enabled\n","Confirm upload progress is off",[1141,1549,1550],{"__ignoreMap":26},[1236,1551,1552,1554,1556,1559,1562,1564,1566,1568,1570],{"class":1238,"line":1239},[1236,1553,504],{"class":1242},[1236,1555,1525],{"class":1254},[1236,1557,1558],{"class":1254}," exec",[1236,1560,1561],{"class":1254}," php",[1236,1563,1561],{"class":1254},[1236,1565,1294],{"class":1246},[1236,1567,1298],{"class":1297},[1236,1569,1301],{"class":1242},[1236,1571,1572],{"class":1254}," session.upload_progress.enabled\n",[1112,1574,1575,1576,1427],{},"You should see ",[1141,1577,1578],{},"session.upload_progress.enabled => Off => Off",[1112,1580,1581],{},"If your app needs upload progress and never changes the serialize handler at runtime, you can turn it back on:",[1227,1583,1588],{"className":1584,"code":1585,"filename":1586,"language":1587,"meta":26,"style":26},"language-yaml shiki shiki-themes material-theme-lighter ayu-dark ayu-dark","services:\n  php:\n    image: serversideup\u002Fphp:8.4-fpm-nginx\n    environment:\n      PHP_SESSION_UPLOAD_PROGRESS_ENABLED: \"1\"\n","compose.yml","yaml",[1141,1589,1590,1599,1606,1618,1626],{"__ignoreMap":26},[1236,1591,1592,1596],{"class":1238,"line":1239},[1236,1593,1595],{"class":1594},"sou7T","services",[1236,1597,1598],{"class":1377},":\n",[1236,1600,1601,1604],{"class":1238,"line":27},[1236,1602,1603],{"class":1594},"  php",[1236,1605,1598],{"class":1377},[1236,1607,1609,1612,1615],{"class":1238,"line":1608},3,[1236,1610,1611],{"class":1594},"    image",[1236,1613,1614],{"class":1377},":",[1236,1616,1617],{"class":1254}," serversideup\u002Fphp:8.4-fpm-nginx\n",[1236,1619,1621,1624],{"class":1238,"line":1620},4,[1236,1622,1623],{"class":1594},"    environment",[1236,1625,1598],{"class":1377},[1236,1627,1629,1632,1634,1636,1639],{"class":1238,"line":1628},5,[1236,1630,1631],{"class":1594},"      PHP_SESSION_UPLOAD_PROGRESS_ENABLED",[1236,1633,1614],{"class":1377},[1236,1635,1251],{"class":1250},[1236,1637,1638],{"class":1254},"1",[1236,1640,1312],{"class":1250},[1112,1642,1643],{},"We'll revisit the default once PHP ships its fix.",[1314,1645,1647],{"id":1646},"frankenphp-1132","FrankenPHP 1.13.2",[1112,1649,1650,1652,1653,1657],{},[1141,1651,1418],{}," also moves our FrankenPHP images to ",[1116,1654,1647],{"href":1655,"rel":1656,"target":1121},"https:\u002F\u002Fgithub.com\u002Fphp\u002Ffrankenphp\u002Freleases\u002Ftag\u002Fv1.13.2",[1120],". It fixes three advisories in FrankenPHP itself. The one I'd care about most: an unauthenticated client could tie up every PHP thread by queuing requests and disconnecting.",[1227,1659,1662],{"className":1229,"code":1660,"filename":1661,"language":1232,"meta":26,"style":26},"docker compose exec php frankenphp version\n","Confirm the FrankenPHP version",[1141,1663,1664],{"__ignoreMap":26},[1236,1665,1666,1668,1670,1672,1674,1677],{"class":1238,"line":1239},[1236,1667,504],{"class":1242},[1236,1669,1525],{"class":1254},[1236,1671,1558],{"class":1254},[1236,1673,1561],{"class":1254},[1236,1675,1676],{"class":1254}," frankenphp",[1236,1678,1679],{"class":1254}," version\n",[1128,1681,1683],{"id":1682},"happy-friday","Happy Friday",[1112,1685,1686],{},"It's been a week, but don't panic too much.",[1112,1688,1689,1690,1692],{},"CVE-2026-115560 needs a rare setup to exploit, and one setting blocks it. Turn off session upload progress, or pull ",[1141,1691,1418],{}," if you use our images. Then update PHP again when the next regular release ships.",[1112,1694,1695,1696,1700],{},"Have questions? Jump into our ",[1116,1697,1699],{"href":1698},"\u002Fdiscord\u002F","Discord"," and let us know.",[1702,1703,1704],"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 pre.shiki code .sm2Rb, html code.shiki .sm2Rb{--shiki-light:#39ADB5;--shiki-default:#AAD94C;--shiki-dark:#AAD94C}html pre.shiki code .svKdX, html code.shiki .svKdX{--shiki-light:#91B859;--shiki-default:#AAD94C;--shiki-dark:#AAD94C}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 .sLPTV, html code.shiki .sLPTV{--shiki-light:#39ADB5;--shiki-default:#F29668;--shiki-dark:#F29668}html pre.shiki code .ss6I4, html code.shiki .ss6I4{--shiki-light:#E53935;--shiki-default:#FF8F40;--shiki-dark:#FF8F40}html pre.shiki code .s_I6F, html code.shiki .s_I6F{--shiki-light:#39ADB5;--shiki-default:#BFBDB6B3;--shiki-dark:#BFBDB6B3}html pre.shiki code .saiic, html code.shiki .saiic{--shiki-light:#90A4AE;--shiki-default:#BFBDB6;--shiki-dark:#BFBDB6}html pre.shiki code .sou7T, html code.shiki .sou7T{--shiki-light:#E53935;--shiki-default:#39BAE6;--shiki-dark:#39BAE6}",{"title":26,"searchDepth":27,"depth":27,"links":1706},[1707,1708,1711,1712,1715],{"id":1130,"depth":27,"text":1131},{"id":1181,"depth":27,"text":1182,"children":1709},[1710],{"id":1316,"depth":1608,"text":1317},{"id":1354,"depth":27,"text":1355},{"id":1407,"depth":27,"text":1408,"children":1713},[1714],{"id":1646,"depth":1608,"text":1647},{"id":1682,"depth":27,"text":1683},[519,504],"CVE-2026-115560 is a second PHP RCE this week, separate from the October 21 fixes. It needs a rare setup to exploit, and one setting blocks it.",{},{"title":780,"description":1717},"blog\u002Fphp-cve-2026-115560-session-upload-progress","RLbkzq9HGqg3A2X9mtZavogepJ_3VBnv8Fr7V_4FQ-o",[1723,1732,1741,1750],{"id":5,"title":6,"badge":7,"badges":1724,"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":1727,"screenshot":29,"short_description":30,"short_title":15,"stem":31,"trial_url":32,"type":33,"url":34,"__hash__":35},[1725,1726],{"label":10,"color":11},{"label":13,"color":14},{"body":1728},{"type":23,"value":1729,"toc":1730},[],{"title":26,"searchDepth":27,"depth":27,"links":1731},[],{"id":37,"title":38,"badge":15,"badges":1733,"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":1736,"screenshot":54,"short_description":55,"short_title":15,"stem":56,"trial_url":15,"type":33,"url":57,"__hash__":58},[1734,1735],{"label":41,"color":11},{"label":43,"color":44},{"body":1737},{"type":23,"value":1738,"toc":1739},[],{"title":26,"searchDepth":27,"depth":27,"links":1740},[],{"id":60,"title":61,"badge":15,"badges":1742,"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":1745,"screenshot":80,"short_description":81,"short_title":82,"stem":83,"trial_url":15,"type":84,"url":85,"__hash__":86},[1743,1744],{"label":64,"color":65},{"label":67,"color":68},{"body":1746},{"type":23,"value":1747,"toc":1748},[],{"title":26,"searchDepth":27,"depth":27,"links":1749},[],{"id":88,"title":89,"badge":15,"badges":1751,"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":1755,"screenshot":106,"short_description":107,"short_title":108,"stem":109,"trial_url":15,"type":84,"url":110,"__hash__":111},[1752,1753,1754],{"label":64,"color":65},{"label":67,"color":68},{"label":94,"color":95},{"body":1756},{"type":23,"value":1757,"toc":1758},[],{"title":26,"searchDepth":27,"depth":27,"links":1759},[],{"fromGitHub":18,"tiers":1761},{"platinum":1762,"gold":1768,"silver":1769,"bronze":1774,"infrastructure":1781,"supporters":1789},[1763],{"name":1764,"url":1765,"logo":1766,"logo_dark":1767},"Sevalla","https:\u002F\u002Fsevalla.com","\u002Fsponsors\u002Fsevalla.png","\u002Flogos\u002Fsevalla.svg",[],[1770],{"name":1771,"url":1772,"logo":1773,"logo_dark":15},"GiGa infosystems","https:\u002F\u002Fgiga-infosystems.com","\u002Fsponsors\u002Fgiga-infosystems.png",[1775,1778],{"name":1776,"url":1777},"Deimos Industries","https:\u002F\u002Fdeimosindustries.com",{"name":1779,"url":1780},"CarePilot (Formerly DocuCare)","https:\u002F\u002Fcarepilot.com",[1782,1786],{"name":1783,"url":1784,"logo":1785,"logo_dark":15},"Depot","https:\u002F\u002Fdepot.dev","\u002Fsponsors\u002Fdepot.png",{"name":10,"url":1787,"logo":1788,"logo_dark":15},"https:\u002F\u002Fhub.docker.com\u002Fu\u002Fserversideup","\u002Fsponsors\u002Fdocker.png",[],[1791,1800,1809,1818],{"id":5,"title":6,"badge":7,"badges":1792,"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":1795,"screenshot":29,"short_description":30,"short_title":15,"stem":31,"trial_url":32,"type":33,"url":34,"__hash__":35},[1793,1794],{"label":10,"color":11},{"label":13,"color":14},{"body":1796},{"type":23,"value":1797,"toc":1798},[],{"title":26,"searchDepth":27,"depth":27,"links":1799},[],{"id":37,"title":38,"badge":15,"badges":1801,"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":1804,"screenshot":54,"short_description":55,"short_title":15,"stem":56,"trial_url":15,"type":33,"url":57,"__hash__":58},[1802,1803],{"label":41,"color":11},{"label":43,"color":44},{"body":1805},{"type":23,"value":1806,"toc":1807},[],{"title":26,"searchDepth":27,"depth":27,"links":1808},[],{"id":60,"title":61,"badge":15,"badges":1810,"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":1813,"screenshot":80,"short_description":81,"short_title":82,"stem":83,"trial_url":15,"type":84,"url":85,"__hash__":86},[1811,1812],{"label":64,"color":65},{"label":67,"color":68},{"body":1814},{"type":23,"value":1815,"toc":1816},[],{"title":26,"searchDepth":27,"depth":27,"links":1817},[],{"id":88,"title":89,"badge":15,"badges":1819,"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":1823,"screenshot":106,"short_description":107,"short_title":108,"stem":109,"trial_url":15,"type":84,"url":110,"__hash__":111},[1820,1821,1822],{"label":64,"color":65},{"label":67,"color":68},{"label":94,"color":95},{"body":1824},{"type":23,"value":1825,"toc":1826},[],{"title":26,"searchDepth":27,"depth":27,"links":1827},[],[1829,1838,1847,1856,1865,1874],{"id":114,"title":115,"badge":15,"badges":1830,"description":123,"extension":17,"external":72,"github_slug":124,"logo_square":125,"logo_wide":126,"meta":1833,"repo_url":132,"screenshot":133,"short_description":134,"short_title":135,"stem":136,"type":137,"url":138,"__hash__":139},[1831,1832],{"label":118,"color":119},{"label":121,"color":122},{"body":1834},{"type":23,"value":1835,"toc":1836},[],{"title":26,"searchDepth":27,"depth":27,"links":1837},[],{"id":141,"title":142,"badge":15,"badges":1839,"description":147,"extension":17,"external":72,"github_slug":148,"logo_square":47,"logo_wide":149,"meta":1842,"repo_url":155,"screenshot":156,"short_description":157,"short_title":15,"stem":158,"type":159,"url":160,"__hash__":161},[1840,1841],{"label":118,"color":119},{"label":146,"color":14},{"body":1843},{"type":23,"value":1844,"toc":1845},[],{"title":26,"searchDepth":27,"depth":27,"links":1846},[],{"id":163,"title":164,"badge":15,"badges":1848,"description":169,"extension":17,"external":72,"github_slug":170,"logo_square":171,"logo_wide":172,"meta":1851,"repo_url":178,"screenshot":179,"short_description":180,"short_title":15,"stem":181,"type":182,"url":183,"__hash__":184},[1849,1850],{"label":118,"color":119},{"label":168,"color":65},{"body":1852},{"type":23,"value":1853,"toc":1854},[],{"title":26,"searchDepth":27,"depth":27,"links":1855},[],{"id":186,"title":187,"badge":15,"badges":1857,"description":193,"extension":17,"external":72,"github_slug":194,"logo_square":195,"logo_wide":196,"meta":1860,"repo_url":202,"screenshot":203,"short_description":204,"short_title":15,"stem":205,"type":206,"url":207,"__hash__":208},[1858,1859],{"label":118,"color":119},{"label":191,"color":192},{"body":1861},{"type":23,"value":1862,"toc":1863},[],{"title":26,"searchDepth":27,"depth":27,"links":1864},[],{"id":210,"title":211,"badge":15,"badges":1866,"description":216,"extension":17,"external":72,"github_slug":217,"logo_square":218,"logo_wide":219,"meta":1869,"repo_url":225,"screenshot":226,"short_description":227,"short_title":15,"stem":228,"type":206,"url":229,"__hash__":230},[1867,1868],{"label":118,"color":119},{"label":215,"color":14},{"body":1870},{"type":23,"value":1871,"toc":1872},[],{"title":26,"searchDepth":27,"depth":27,"links":1873},[],{"id":232,"title":233,"badge":15,"badges":1875,"description":237,"extension":17,"external":18,"github_slug":238,"logo_square":239,"logo_wide":15,"meta":1878,"repo_url":245,"screenshot":15,"short_description":246,"short_title":247,"stem":248,"type":137,"url":245,"__hash__":249},[1876,1877],{"label":118,"color":119},{"label":121,"color":122},{"body":1879},{"type":23,"value":1880,"toc":1881},[],{"title":26,"searchDepth":27,"depth":27,"links":1882},[],[1884,1893,1902,1911,1920,1929],{"id":114,"title":115,"badge":15,"badges":1885,"description":123,"extension":17,"external":72,"github_slug":124,"logo_square":125,"logo_wide":126,"meta":1888,"repo_url":132,"screenshot":133,"short_description":134,"short_title":135,"stem":136,"type":137,"url":138,"__hash__":139},[1886,1887],{"label":118,"color":119},{"label":121,"color":122},{"body":1889},{"type":23,"value":1890,"toc":1891},[],{"title":26,"searchDepth":27,"depth":27,"links":1892},[],{"id":141,"title":142,"badge":15,"badges":1894,"description":147,"extension":17,"external":72,"github_slug":148,"logo_square":47,"logo_wide":149,"meta":1897,"repo_url":155,"screenshot":156,"short_description":157,"short_title":15,"stem":158,"type":159,"url":160,"__hash__":161},[1895,1896],{"label":118,"color":119},{"label":146,"color":14},{"body":1898},{"type":23,"value":1899,"toc":1900},[],{"title":26,"searchDepth":27,"depth":27,"links":1901},[],{"id":163,"title":164,"badge":15,"badges":1903,"description":169,"extension":17,"external":72,"github_slug":170,"logo_square":171,"logo_wide":172,"meta":1906,"repo_url":178,"screenshot":179,"short_description":180,"short_title":15,"stem":181,"type":182,"url":183,"__hash__":184},[1904,1905],{"label":118,"color":119},{"label":168,"color":65},{"body":1907},{"type":23,"value":1908,"toc":1909},[],{"title":26,"searchDepth":27,"depth":27,"links":1910},[],{"id":186,"title":187,"badge":15,"badges":1912,"description":193,"extension":17,"external":72,"github_slug":194,"logo_square":195,"logo_wide":196,"meta":1915,"repo_url":202,"screenshot":203,"short_description":204,"short_title":15,"stem":205,"type":206,"url":207,"__hash__":208},[1913,1914],{"label":118,"color":119},{"label":191,"color":192},{"body":1916},{"type":23,"value":1917,"toc":1918},[],{"title":26,"searchDepth":27,"depth":27,"links":1919},[],{"id":210,"title":211,"badge":15,"badges":1921,"description":216,"extension":17,"external":72,"github_slug":217,"logo_square":218,"logo_wide":219,"meta":1924,"repo_url":225,"screenshot":226,"short_description":227,"short_title":15,"stem":228,"type":206,"url":229,"__hash__":230},[1922,1923],{"label":118,"color":119},{"label":215,"color":14},{"body":1925},{"type":23,"value":1926,"toc":1927},[],{"title":26,"searchDepth":27,"depth":27,"links":1928},[],{"id":232,"title":233,"badge":15,"badges":1930,"description":237,"extension":17,"external":18,"github_slug":238,"logo_square":239,"logo_wide":15,"meta":1933,"repo_url":245,"screenshot":15,"short_description":246,"short_title":247,"stem":248,"type":137,"url":245,"__hash__":249},[1931,1932],{"label":118,"color":119},{"label":121,"color":122},{"body":1934},{"type":23,"value":1935,"toc":1936},[],{"title":26,"searchDepth":27,"depth":27,"links":1937},[],1792767276413]