[{"data":1,"prerenderedAt":2193},["ShallowReactive",2],{"productsSearch":3,"openSourceSearch":112,"postsSearch":250,"guidesSearch":1062,"\u002Fterms\u002Fservices\u002F":1106,"header-products":1977,"$f2bzpwklhdwuf9":2015,"footer-products":2045,"header-open-source":2083,"footer-open-source":2138},[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":1108,"body":1109,"date":1969,"description":1970,"extension":17,"meta":1971,"navigation":18,"ogImage":15,"path":1972,"robots":15,"schemaOrg":15,"seo":1973,"sitemap":1974,"stem":1975,"toc":18,"__hash__":1976},"content\u002Fterms\u002Fservices.md","Development and Hosting Services",{"type":23,"value":1110,"toc":1924},[1111,1115,1124,1129,1134,1137,1141,1147,1151,1154,1157,1160,1164,1167,1170,1173,1177,1196,1199,1203,1206,1216,1220,1223,1227,1235,1239,1242,1245,1248,1252,1259,1262,1270,1273,1277,1280,1284,1288,1291,1294,1297,1345,1348,1356,1360,1363,1375,1378,1381,1385,1388,1392,1395,1399,1405,1414,1417,1420,1423,1428,1446,1449,1453,1456,1459,1462,1466,1471,1476,1480,1483,1486,1489,1492,1518,1521,1524,1527,1531,1535,1538,1605,1608,1616,1620,1623,1626,1634,1637,1641,1644,1647,1651,1654,1657,1660,1664,1667,1671,1677,1680,1684,1687,1690,1694,1697,1700,1704,1707,1787,1790,1793,1797,1805,1808,1811,1814,1817,1820,1824,1831,1835,1838,1841,1847,1850,1854,1857,1861,1864,1867,1870,1873,1899,1903,1908],[1112,1113,1114],"p",{},"These terms apply to our development retainers, managed hosting, and hourly work (the \"Services\"). They are provided by 521 Dimensions LLC, doing business as Server Side Up (\"Server Side Up,\" \"we,\" \"us,\" or \"our\"), to you (\"Client,\" \"you,\" or \"your\").",[1112,1116,1117,1118,1123],{},"Our ",[1119,1120,1122],"a",{"href":1121},"\u002Fterms\u002F","General Terms of Service"," are part of these terms, including the sections on use restrictions, payment terms, warranty disclaimer, liability, governing law and disputes, and general provisions. If the two conflict, these terms control for the Services. A quote or order from us controls over both.",[1125,1126,1128],"h2",{"id":1127},"how-we-work-with-every-client","How we work with every client",[1130,1131,1133],"h3",{"id":1132},"accepting-these-terms","Accepting these terms",[1112,1135,1136],{},"You accept these terms when you check the box at checkout, when you pay a quote or invoice that links to them, or when you sign an annual agreement.",[1130,1138,1140],{"id":1139},"business-hours","Business hours",[1112,1142,1143,1144,1146],{},"We work ",[1139,1145],{},". We're closed from December 24 through January 1, and on Memorial Day, July 4, Labor Day, Thanksgiving, and the day after Thanksgiving. We also close for the occasional conference or team event, and we'll tell you ahead of time. Retainer clients get a reply within 1 business day. Retainer work always comes first, so hourly clients can expect a reply within 3 business days.",[1130,1148,1150],{"id":1149},"hourly-work","Hourly work",[1112,1152,1153],{},"Anything outside your plan is billed hourly. That includes emergencies, jumping the queue, after-hours work, and hosting work your plan doesn't include. Retainer clients pay lower rates for this work.",[1112,1155,1156],{},"Retainer clients always get our time first. Standard hourly work is scheduled around their requests, so it may take longer to start.",[1158,1159],"hourly-rates",{},[1130,1161,1163],{"id":1162},"billing-and-payment","Billing and payment",[1112,1165,1166],{},"Plans are billed automatically each month through Stripe, or by invoice. You authorize us to charge your payment method each billing cycle.",[1112,1168,1169],{},"If a payment fails, Stripe will retry the charge and we'll email you right away. You have 14 days from the first failed attempt to fix it. After 14 days we suspend service, and after 30 days we may end your plan.",[1112,1171,1172],{},"A bounced ACH payment costs $50 to cover our bank fees. Late balances accrue interest at 1.5% per month (18% per year), or the maximum rate Wisconsin law allows, whichever is less. In any dispute about payment or a breach of these terms, the winning party can recover reasonable attorney fees and costs.",[1130,1174,1176],{"id":1175},"what-we-need-from-you","What we need from you",[1178,1179,1180,1184,1187,1190,1193],"ul",{},[1181,1182,1183],"li",{},"Timely access to the systems, repositories, and tools we need.",[1181,1185,1186],{},"One main contact who can make decisions.",[1181,1188,1189],{},"Clear requirements and context for each request.",[1181,1191,1192],{},"Answers to our questions within 5 business days.",[1181,1194,1195],{},"Your own backups, unless we manage your hosting.",[1112,1197,1198],{},"When we're waiting on you, delivery dates move by the same amount of time.",[1130,1200,1202],{"id":1201},"who-owns-the-work","Who owns the work",[1112,1204,1205],{},"You own the custom code, designs, and materials we create for you. Once you've paid in full, we assign all rights in that work to you.",[1112,1207,1208,1209,1215],{},"We keep ownership of tools and code we built before working with you, anything we publish to our public repositories at ",[1119,1210,1214],{"href":1211,"rel":1212},"https:\u002F\u002Fgithub.com\u002Fserversideup",[1213],"nofollow","github.com\u002Fserversideup",", and our general knowledge and methods. If any of our tools end up in your project, you get a perpetual, non-exclusive license to use, modify, and maintain them for that project. Third-party open source, such as Laravel or Vue, comes to you under its own license.",[1130,1217,1219],{"id":1218},"confidentiality","Confidentiality",[1112,1221,1222],{},"We won't share your confidential information, including source code, business plans, financial details, customer data, and anything else marked or reasonably understood to be confidential. We only share it if the law requires it, if you give us written permission, or if it becomes public through no fault of ours. This promise continues after our work together ends.",[1130,1224,1226],{"id":1225},"client-references","Client references",[1112,1228,1229,1230,1234],{},"We may list your company name and logo on our website as a client, and describe the general kind of work we did, such as \"web application development.\" We never share project details, code, pricing, or confidential information. You can opt out at any time by emailing ",[1119,1231,1233],{"href":1232},"mailto:support@serversideup.net","support@serversideup.net",", and we'll remove you within 30 days. A detailed case study always needs your separate written permission and approval.",[1130,1236,1238],{"id":1237},"our-promises-to-each-other","Our promises to each other",[1112,1240,1241],{},"We promise to do our work in a professional and workmanlike way, that we have the right to provide the Services and give you ownership of the work, and that the custom work we create won't knowingly infringe anyone's intellectual property.",[1112,1243,1244],{},"You agree to indemnify us, which means covering any damages, liabilities, and costs (including reasonable attorney fees), for claims that come from your use of the work we create, your breach of these terms, your violation of a law or someone else's rights, or content and data you give us.",[1112,1246,1247],{},"We agree to indemnify you in the same way for claims that the custom work we create infringes someone's intellectual property, as long as you tell us about the claim promptly, let us control the defense and settlement, and reasonably help us.",[1130,1249,1251],{"id":1250},"ending-our-work-together","Ending our work together",[1112,1253,1254,1255,1258],{},"We may end your plan for non-payment as described in ",[1119,1256,1163],{"href":1257},"#billing-and-payment",", and right away for harassment or threats toward our team, requests to do something illegal, or a material breach of these terms. We may also end it for any reason with 30 days' written notice, for example if we're not a good fit.",[1112,1260,1261],{},"If we end your plan with 30 days' notice, you don't owe any annual discount payback, and we'll keep working through the notice period if you'd like. You still owe any unpaid invoices, and we don't refund work already done.",[1112,1263,1264,1265,1269],{},"Within 30 days after our work ends, we'll send you final copies of your code, documentation, and materials. After 90 days, we may delete our working copies. Hosted servers follow the rules in ",[1119,1266,1268],{"href":1267},"#ending-hosting","Ending hosting",".",[1112,1271,1272],{},"Ownership, confidentiality, liability, the promises above, and money owed all continue after our work together ends.",[1130,1274,1276],{"id":1275},"changes-to-these-terms","Changes to these terms",[1112,1278,1279],{},"We'll give you at least 30 days' written notice before changes to these terms take effect. For annual plans, changes wait until your end date unless we both agree in writing.",[1125,1281,1283],{"id":1282},"development-retainers","Development retainers",[1130,1285,1287],{"id":1286},"plans","Plans",[1289,1290],"retainer-plans",{},[1112,1292,1293],{},"Monthly plans have no long-term commitment, and you can pay by credit card or ACH. Annual plans are a 12-month commitment, billed monthly by ACH bank transfer. Each one starts with an agreement we both sign. It lists your plan, price, start date, and end date.",[1112,1295,1296],{},"Every plan includes:",[1178,1298,1299,1302,1305,1308,1311,1314,1317,1320,1323,1326,1329,1332,1335,1338],{},[1181,1300,1301],{},"Full-stack development (frontend, backend, and DevOps)",[1181,1303,1304],{},"UX design and implementation",[1181,1306,1307],{},"Custom CI\u002FCD pipelines",[1181,1309,1310],{},"Database design",[1181,1312,1313],{},"iOS and Android development",[1181,1315,1316],{},"QA testing",[1181,1318,1319],{},"Bug fixes and maintenance",[1181,1321,1322],{},"Work through GitHub, GitLab, or Notion issues, with no meetings required",[1181,1324,1325],{},"Revisions on each request until you're happy with it (new ideas become new requests)",[1181,1327,1328],{},"A monthly planning check-in, by call or in writing, with a summary of what we shipped",[1181,1330,1331],{},"Help writing your requests and splitting large ones into smaller pieces",[1181,1333,1334],{},"A monthly maintenance pass for routine dependency and security updates, which doesn't use your priority track",[1181,1336,1337],{},"Reviews of your team's merge requests or pull requests, which count as requests",[1181,1339,1117,1340,1344],{},[1119,1341,1343],{"href":1342},"#hourly-work","retainer rates"," for work outside your plan",[1112,1346,1347],{},"Major upgrades, such as a new framework or language version, go in your queue as requests.",[1112,1349,1350,1351,1355],{},"Retainers don't include 24\u002F7 emergency support, on-call service, or guaranteed response times. You can get those at our hourly rates or with a ",[1119,1352,1354],{"href":1353},"#dedicated-team","Dedicated Team"," agreement. We do quality work and make reasonable efforts, but we don't promise that specific features will ship by specific dates. This is a retainer, not a fixed-price project.",[1130,1357,1359],{"id":1358},"how-priority-tracks-work","How priority tracks work",[1112,1361,1362],{},"An active request is one task or feature that needs focused work, such as \"build the user dashboard\" or \"fix this group of bugs.\"",[1112,1364,1365,1366,1370,1371,1374],{},"On ",[1367,1368,1369],"strong",{},"Single Priority",", we work on one active request at a time, and other requests wait in a queue. On ",[1367,1372,1373],{},"Dual Priority",", we work on two at a time.",[1112,1376,1377],{},"A priority track is our focused time set aside for you. It isn't a fixed number of hours. It isn't unlimited hours either. A small request might take an afternoon and a large one might take weeks. We split large requests into pieces you can review as we go.",[1112,1379,1380],{},"We recommend setting priorities once a week. Changing them every hour or every day slows everything down, and we'll let you know if it starts to affect the work.",[1130,1382,1384],{"id":1383},"when-work-is-done","When work is done",[1112,1386,1387],{},"A request is done when it works as agreed and you confirm it in writing (in an issue or by email). If we tell you it's done and you don't reply within 10 business days, it counts as accepted.",[1130,1389,1391],{"id":1390},"money-back-guarantee","Money-back guarantee",[1112,1393,1394],{},"Your first month comes with a 7-day money-back guarantee, on monthly plans, annual plans, and Dedicated Team agreements. If you're not happy within the first 7 days, tell us in writing and we'll refund your first month's payment in full. After those 7 days, we don't refund time already worked.",[1130,1396,1398],{"id":1397},"canceling","Canceling",[1112,1400,1401,1404],{},[1367,1402,1403],{},"Monthly plans:"," cancel any time. The cancellation takes effect at the end of your current billing period, and service continues until then. We don't give prorated refunds for a partial month.",[1112,1406,1407,1410,1411,1413],{},[1367,1408,1409],{},"Annual plans:"," these have a 12-month minimum. To leave early, email ",[1119,1412,1233],{"href":1232}," with 60 days' written notice. You'll also pay back the annual discount for every month you received, because the discount is the price of the full-year commitment.",[1415,1416],"retainer-cancellation-example",{},[1112,1418,1419],{},"When we get your notice, we'll stop automatic billing and send one final invoice for the 60 days of service plus the discount payback, due within 7 days. We keep working through the 60 days, and you owe them even if you don't use them. Once that invoice is paid, we're fully settled.",[1112,1421,1422],{},"If we end an annual plan because of non-payment, you still owe the unpaid monthly charges, the discount payback, any late and bounced-payment fees, and reasonable collection costs and attorney fees.",[1112,1424,1425],{},[1367,1426,1427],{},"If you're unhappy with our quality:",[1429,1430,1431,1434,1437,1440,1443],"ol",{},[1181,1432,1433],{},"Tell us in writing, with details about what's wrong.",[1181,1435,1436],{},"We have 30 days to fix it.",[1181,1438,1439],{},"If it's still not fixed, tell us again and say clearly what result you expect.",[1181,1441,1442],{},"If nothing improves after the 30 days, you may cancel with 30 more days' notice.",[1181,1444,1445],{},"We'll waive the discount payback in this case.",[1112,1447,1448],{},"This only works with good faith on both sides, and we'll make a genuine effort to fix any real concern.",[1130,1450,1452],{"id":1451},"renewing-an-annual-plan","Renewing an annual plan",[1112,1454,1455],{},"Annual plans don't renew on their own. At least 60 days before your end date, we'll send you a new agreement for another year, with its price. To renew, sign it before your end date.",[1112,1457,1458],{},"Your price is locked until your end date. The price in a new agreement may be different.",[1112,1460,1461],{},"If you don't sign a new agreement, you stay on the same plan at the monthly price once your end date passes, and you can cancel any time. For example, if your agreement ends on February 28, 2027, you'll be billed the monthly price starting March 1, 2027.",[1130,1463,1465],{"id":1464},"changing-plans","Changing plans",[1112,1467,1468,1470],{},[1367,1469,1403],{}," switch between Single and Dual Priority any time. The change starts with your next billing cycle.",[1112,1472,1473,1475],{},[1367,1474,1409],{}," you can upgrade any time with written notice. The upgrade starts with your next billing cycle and runs through your original end date. For example, if you're billed on the 1st and tell us on March 15, the upgrade starts April 1. You can only downgrade when you renew, by signing a new agreement for the smaller plan. To reduce sooner, you can cancel under the annual cancellation terms above and sign up again on the smaller plan.",[1130,1477,1479],{"id":1478},"time-off","Time off",[1112,1481,1482],{},"We don't give credits or refunds for our scheduled closures, vacations or illness, short delays, or outages at services like GitHub. If we can't work for 14 or more days in a row because of something unexpected, such as a serious illness, we may give you a prorated credit at our discretion.",[1130,1484,1354],{"id":1485},"dedicated-team",[1112,1487,1488],{},"A Dedicated Team is for companies that want us to run most of their engineering, with the response times and on-call coverage that retainers don't include.",[1112,1490,1491],{},"It starts with an agreement we both sign. Your agreement covers:",[1178,1493,1494,1497,1500,1503,1506,1509,1512,1515],{},[1181,1495,1496],{},"Your monthly price, how you're billed, and your start and end dates",[1181,1498,1499],{},"What your scope includes, and what's billed at our hourly rates",[1181,1501,1502],{},"Response times for each level of urgency",[1181,1504,1505],{},"On-call hours, what counts as an outage, and how to reach us",[1181,1507,1508],{},"What happens if we miss a response time",[1181,1510,1511],{},"The cloud provider accounts we manage for you",[1181,1513,1514],{},"Your notice period, and what it costs to end the agreement early",[1181,1516,1517],{},"How we communicate, including your Slack channel, contacts, and planning check-ins",[1112,1519,1520],{},"We send a new agreement at least 60 days before your end date. If you don't sign it, your agreement continues month to month at the same price until either of us ends it with the notice period your agreement sets.",[1112,1522,1523],{},"We manage your servers in a cloud provider account that you own and choose. You pay the provider directly, and server costs aren't part of your Dedicated Team price.",[1112,1525,1526],{},"These terms apply to Dedicated Team work unless your agreement says otherwise. If the two conflict, your agreement controls. If we miss a response time, your only remedies are the ones your agreement lists.",[1125,1528,1530],{"id":1529},"managed-hosting","Managed hosting",[1130,1532,1534],{"id":1533},"what-you-get","What you get",[1112,1536,1537],{},"Managed hosting keeps your servers running, patched, and backed up, so you can focus on your business. Your quote lists your plan, servers, add-ons, price, billing period, and any notice period. Your servers can live in your own cloud provider account or in ours.",[1539,1540,1541,1554],"table",{},[1542,1543,1544],"thead",{},[1545,1546,1547,1551],"tr",{},[1548,1549,1550],"th",{},"Included in your plan",[1548,1552,1553],{},"Billed at our hourly rates",[1555,1556,1557,1566,1574,1582,1590,1598],"tbody",{},[1545,1558,1559,1563],{},[1560,1561,1562],"td",{},"Server deployment and management",[1560,1564,1565],{},"Changes to your app",[1545,1567,1568,1571],{},[1560,1569,1570],{},"Operating system security updates",[1560,1572,1573],{},"Fixing problems caused by code we didn't review",[1545,1575,1576,1579],{},[1560,1577,1578],{},"24\u002F7 uptime monitoring and alerts",[1560,1580,1581],{},"Data exports and migrations",[1545,1583,1584,1587],{},[1560,1585,1586],{},"Automated offsite backups",[1560,1588,1589],{},"Disaster recovery tests (quoted separately)",[1545,1591,1592,1595],{},[1560,1593,1594],{},"DNS management",[1560,1596,1597],{},"Anything else your plan doesn't list",[1545,1599,1600,1603],{},[1560,1601,1602],{},"Fixing anything we break",[1560,1604],{},[1112,1606,1607],{},"Work covered by an active retainer isn't billed hourly.",[1112,1609,1610,1611,1615],{},"Add-ons on your quote, such as private GitLab, CI\u002FCD runners, VPN access, and DNS Pro, follow these same terms. You're responsible for the people you give access to, and they must follow the ",[1119,1612,1614],{"href":1613},"\u002Fterms\u002F#use-restrictions","use restrictions"," in our General Terms.",[1130,1617,1619],{"id":1618},"your-code-and-ours","Your code and ours",[1112,1621,1622],{},"We can only stand behind code we've reviewed. Code counts as reviewed when it's merged through a merge request or pull request that one of our accounts approved or merged. Code pushed straight to the main branch isn't reviewed. Neither are commits added after our approval, even if the request is merged later.",[1112,1624,1625],{},"You're welcome to deploy your own code. Anything you ship without our review, including changes to server or infrastructure files, is your responsibility.",[1112,1627,1628,1629,1633],{},"Your code includes code written by AI tools, software you added without telling us, and anything done under your team's logins or tools. Our ",[1119,1630,1632],{"href":1631},"#our-promises-to-each-other","promises to you"," cover only the work we do.",[1112,1635,1636],{},"If you don't have an active retainer or other agreement with us, your whole app counts as your code, including code we wrote in the past, and keeping its dependencies up to date is your job.",[1130,1638,1640],{"id":1639},"security","Security",[1112,1642,1643],{},"We keep the server secure: the operating system, its security updates, and the server's configuration. Your app's security, including its code and dependencies, is yours, or part of your retainer if you have one. If you won't let us upgrade end-of-life software, such as an unsupported language version, problems it causes count as your code.",[1112,1645,1646],{},"If your app exposes your users' data, you're responsible for any notices the law requires you to send them. If a security incident on our side affects your data, we'll tell you within 72 hours of finding it.",[1130,1648,1650],{"id":1649},"services-we-dont-host","Services we don't host",[1112,1652,1653],{},"Managed hosting covers only the servers we manage and have root access to. Your app may also use services you chose that run somewhere else, such as Supabase or another hosted database, an authentication or payment provider, an email service, object storage, a third-party API, or servers that someone else manages. We don't run those services and can't control when they fail.",[1112,1655,1656],{},"Unless we agree in writing, our uptime guarantee, monitoring, backups, and security work don't cover them. Backing up the data you keep in those services, and restoring it, is your responsibility. Most providers offer their own backup tools for this.",[1112,1658,1659],{},"If one of them goes down, we'll let you know when we spot it. Any workaround or recovery work is billed at our hourly rates. If you have a retainer, you can put it in your queue instead.",[1130,1661,1663],{"id":1662},"maintenance","Maintenance",[1112,1665,1666],{},"Security patches sometimes need a server reboot. Expect at least one brief reboot a month, usually 1-2 minutes. We try to do it outside business hours, but an urgent patch may not wait. We don't send notice for these reboots. If you can't afford any downtime, we can quote extra servers that keep your app up during reboots.",[1130,1668,1670],{"id":1669},"content-and-abuse","Content and abuse",[1112,1672,1673,1674,1676],{},"We don't monitor your traffic or content, and you're responsible for everything your servers and add-ons host and send. Our ",[1119,1675,1614],{"href":1613}," apply to all of it. You also may not use our services to mine cryptocurrency, deliberately overload resources, scan or attack other networks, or hide abuse behind our VPN or tunnels.",[1112,1678,1679],{},"If we get a copyright or illegal-content complaint about your server, you have 48 hours after we tell you to remove the content. If you don't, we may suspend the server. We may suspend any service right away if it's the source or target of abuse, or if we see clear signs of illegal activity or anything that puts other customers or our systems at risk. Cleanup is billed at our hourly rates.",[1130,1681,1683],{"id":1682},"dns-and-cloudflare","DNS and Cloudflare",[1112,1685,1686],{},"When we manage your DNS or Cloudflare settings, such as the proxy, CDN, or browser integrity protection, we're managing the settings that connect visitors to your app. They reduce risk, but they don't make your app secure. We don't inspect your traffic, and a breach of your app, or of any system we don't host, is your responsibility.",[1112,1688,1689],{},"If DNS management is the only service you buy from us, we don't patch, monitor, or secure your servers or apps, and the uptime guarantee doesn't apply.",[1130,1691,1693],{"id":1692},"runners-gitlab-and-vpn","Runners, GitLab, and VPN",[1112,1695,1696],{},"Dedicated CI\u002FCD runners include unlimited build minutes for normal CI\u002FCD work. They may not run non-build workloads, and we may stop jobs that run away or affect other customers. You're responsible for what your pipelines run and the secrets you store in them. If you bring your own runner hardware, keeping it running is your job.",[1112,1698,1699],{},"Anything you share through a development tunnel or preview URL can be reached by anyone with the link, so keep sensitive data off them. You're responsible for traffic from your VPN users and your dedicated IP address.",[1130,1701,1703],{"id":1702},"who-pays-when-something-breaks","Who pays when something breaks",[1112,1705,1706],{},"We're your first call when something is down. Usually we have to investigate before we know what caused it.",[1539,1708,1709,1719],{},[1542,1710,1711],{},[1545,1712,1713,1716],{},[1548,1714,1715],{},"What caused it",[1548,1717,1718],{},"Who pays",[1555,1720,1721,1729,1736,1744,1756,1764,1772,1780],{},[1545,1722,1723,1726],{},[1560,1724,1725],{},"A change we made or a setting we configured",[1560,1727,1728],{},"We do",[1545,1730,1731,1734],{},[1560,1732,1733],{},"A cloud provider outage, on a server in our account",[1560,1735,1728],{},[1545,1737,1738,1741],{},[1560,1739,1740],{},"A cloud provider outage, on a server in your account",[1560,1742,1743],{},"You do, at our hourly rates, for any recovery work. Monitoring and letting you know are included.",[1545,1745,1746,1753],{},[1560,1747,1748,1749],{},"An outage in a ",[1119,1750,1752],{"href":1751},"#services-we-dont-host","service we don't host",[1560,1754,1755],{},"You do, at our hourly rates, for any workaround or recovery work",[1545,1757,1758,1761],{},[1560,1759,1760],{},"An outside attack, such as a DDoS",[1560,1762,1763],{},"We do, unless it got in through software you were responsible for updating or code with known exploits that you shipped",[1545,1765,1766,1769],{},[1560,1767,1768],{},"Code or changes we didn't review",[1560,1770,1771],{},"You do, at our hourly rates, including the time we spent investigating. Work outside business hours is billed at the after-hours rate. If you have a retainer and can wait until business hours, you can put the fix in your queue instead.",[1545,1773,1774,1777],{},[1560,1775,1776],{},"Runaway traffic from your app, or an abused API key",[1560,1778,1779],{},"You do, at our hourly rates",[1545,1781,1782,1785],{},[1560,1783,1784],{},"We can't find the cause",[1560,1786,1728],{},[1788,1789],"incident-cost-example",{},[1112,1791,1792],{},"When you pay for an investigation, we send the evidence with the invoice. To stop runaway traffic, we may disable the API key or account causing it.",[1130,1794,1796],{"id":1795},"when-your-app-goes-down","When your app goes down",[1112,1798,1799,1800,1804],{},"When your server goes down after hours, we start working on it right away, before we know what caused it. Getting you back online matters more than whose fault it was, and ",[1119,1801,1803],{"href":1802},"#who-pays-when-something-breaks","who pays"," gets settled once we know the cause.",[1112,1806,1807],{},"If you'd rather we not work after hours, tell us in writing. We'll wait until the next business day, you won't be billed for after-hours work, and downtime outside business hours won't count against your uptime guarantee.",[1112,1809,1810],{},"If a deploy caused the problem, we may roll your code back to the last working version in your Git history without asking. A rollback doesn't change your data.",[1112,1812,1813],{},"When a rollback isn't enough, usually because a change already altered your database, we restore your server from its latest snapshot. A snapshot restore always loses data. Anything saved since the snapshot is gone, which can be up to 48 hours of data. We can bring most of it back from your daily offsite backup, cutting the loss to 24 hours at most, but that takes extra work. The same who-pays rules apply to that work.",[1112,1815,1816],{},"Because a snapshot restore loses data, we ask before we do one. If we can't reach you, we wait. If you'd rather we restore without asking whenever it's the fastest fix, tell us in writing.",[1112,1818,1819],{},"If your code or changes cause 2 incidents within 90 days, we may require our review before you deploy, remove your deploy access, or end your hosting with 30 days' notice.",[1130,1821,1823],{"id":1822},"backups","Backups",[1112,1825,1826,1827,1830],{},"We take automated backups, including daily offsite backups that are encrypted, stored with a separate provider, and kept for up to 365 days. We back up only the servers we manage, not data kept in ",[1119,1828,1829],{"href":1751},"services we don't host",". We can't guarantee that every backup will restore. If you need proof that restores work, we can quote annual, quarterly, or monthly disaster recovery tests.",[1130,1832,1834],{"id":1833},"uptime-guarantee","Uptime guarantee",[1112,1836,1837],{},"We guarantee 99.9% uptime each month. If we fall short, ask within 30 days after the month ends, and we'll credit your account for the downtime beyond the 0.1% allowance.",[1112,1839,1840],{},"For example, if your management fee is $1,000 for a 30-day month (43,200 minutes), 99.9% uptime allows 43 minutes of downtime. If your server was down for 180 minutes, the extra 137 minutes earn a credit of $1,000 × 137 ÷ 43,200 = $3.17.",[1112,1842,1843,1844,1846],{},"Downtime caused by code we didn't review, runaway traffic, maintenance reboots, a suspension, a cloud provider outage, or an outage in a ",[1119,1845,1752],{"href":1751}," doesn't count. Neither does downtime outside business hours if you've opted out of after-hours work.",[1112,1848,1849],{},"Credits come off your management fee, not your server costs, and can't be more than 100% of that month's fee. Credits are your only remedy for downtime. If we miss 99.9% in 3 of any 6 months, you may cancel without any early-cancellation charges.",[1130,1851,1853],{"id":1852},"regulated-data","Regulated data",[1112,1855,1856],{},"Don't store health information covered by HIPAA, payment card data covered by PCI DSS, or similar regulated data on servers we manage unless we've agreed to it in writing first.",[1130,1858,1860],{"id":1859},"your-domains-and-data","Your domains and data",[1112,1862,1863],{},"Domains we register for you may sit in your registrar account or ours, but you're always listed as the registrant, so the domain is yours either way. We keep them private and renewed while you're a client. You own 100% of your data.",[1130,1865,1268],{"id":1866},"ending-hosting",[1112,1868,1869],{},"To end hosting, you sign our cancellation document. It sets your end date and lets you confirm that you have all of your data, or hire us to export it at our hourly rates. If we end your hosting, the end date is the one in our notice.",[1112,1871,1872],{},"On the end date:",[1178,1874,1875,1881,1887,1893],{},[1181,1876,1877,1880],{},[1367,1878,1879],{},"Servers in our account"," are deleted, along with their backups. Make sure you have everything you need before then.",[1181,1882,1883,1886],{},[1367,1884,1885],{},"Servers in your account"," stay with you. We remove our access, monitoring, and backup jobs, and from then on the server and its security are entirely yours.",[1181,1888,1889,1892],{},[1367,1890,1891],{},"Add-ons"," such as private GitLab, the container registry, runners, and VPN are deleted along with their data.",[1181,1894,1895,1898],{},[1367,1896,1897],{},"Domains in our account"," stay registered until they expire. Getting the transfer code is free, and help with the transfer is billed at our hourly rates. If you let a domain expire, anyone can register it, and expired domains are sometimes bought to impersonate the old owner or send phishing emails.",[1125,1900,1902],{"id":1901},"questions","Questions?",[1112,1904,1905,1906,1269],{},"If you have questions about these terms, contact us at ",[1119,1907,1233],{"href":1232},[1112,1909,1910,1913,1916,1918,1920],{},[1367,1911,1912],{},"521 Dimensions LLC, doing business as Server Side Up",[1914,1915],"br",{},[1119,1917,1233],{"href":1232},[1914,1919],{},[1119,1921,1923],{"href":1922},"\u002F","https:\u002F\u002Fserversideup.net",{"title":26,"searchDepth":27,"depth":27,"links":1925},[1926,1940,1951,1968],{"id":1127,"depth":27,"text":1128,"children":1927},[1928,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939],{"id":1132,"depth":1929,"text":1133},3,{"id":1139,"depth":1929,"text":1140},{"id":1149,"depth":1929,"text":1150},{"id":1162,"depth":1929,"text":1163},{"id":1175,"depth":1929,"text":1176},{"id":1201,"depth":1929,"text":1202},{"id":1218,"depth":1929,"text":1219},{"id":1225,"depth":1929,"text":1226},{"id":1237,"depth":1929,"text":1238},{"id":1250,"depth":1929,"text":1251},{"id":1275,"depth":1929,"text":1276},{"id":1282,"depth":27,"text":1283,"children":1941},[1942,1943,1944,1945,1946,1947,1948,1949,1950],{"id":1286,"depth":1929,"text":1287},{"id":1358,"depth":1929,"text":1359},{"id":1383,"depth":1929,"text":1384},{"id":1390,"depth":1929,"text":1391},{"id":1397,"depth":1929,"text":1398},{"id":1451,"depth":1929,"text":1452},{"id":1464,"depth":1929,"text":1465},{"id":1478,"depth":1929,"text":1479},{"id":1485,"depth":1929,"text":1354},{"id":1529,"depth":27,"text":1530,"children":1952},[1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967],{"id":1533,"depth":1929,"text":1534},{"id":1618,"depth":1929,"text":1619},{"id":1639,"depth":1929,"text":1640},{"id":1649,"depth":1929,"text":1650},{"id":1662,"depth":1929,"text":1663},{"id":1669,"depth":1929,"text":1670},{"id":1682,"depth":1929,"text":1683},{"id":1692,"depth":1929,"text":1693},{"id":1702,"depth":1929,"text":1703},{"id":1795,"depth":1929,"text":1796},{"id":1822,"depth":1929,"text":1823},{"id":1833,"depth":1929,"text":1834},{"id":1852,"depth":1929,"text":1853},{"id":1859,"depth":1929,"text":1860},{"id":1866,"depth":1929,"text":1268},{"id":1901,"depth":27,"text":1902},"2026-10-13","Terms for our development retainers, managed hosting, and hourly work",{},"\u002Fterms\u002Fservices",{"title":1108,"description":1970},{"loc":1972},"terms\u002Fservices","_Uf0U_eFP-KR3GhVlj_-7DHPefw_S2tLguyrnjctp4k",[1978,1987,1996,2005],{"id":5,"title":6,"badge":7,"badges":1979,"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":1982,"screenshot":29,"short_description":30,"short_title":15,"stem":31,"trial_url":32,"type":33,"url":34,"__hash__":35},[1980,1981],{"label":10,"color":11},{"label":13,"color":14},{"body":1983},{"type":23,"value":1984,"toc":1985},[],{"title":26,"searchDepth":27,"depth":27,"links":1986},[],{"id":37,"title":38,"badge":15,"badges":1988,"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":1991,"screenshot":54,"short_description":55,"short_title":15,"stem":56,"trial_url":15,"type":33,"url":57,"__hash__":58},[1989,1990],{"label":41,"color":11},{"label":43,"color":44},{"body":1992},{"type":23,"value":1993,"toc":1994},[],{"title":26,"searchDepth":27,"depth":27,"links":1995},[],{"id":60,"title":61,"badge":15,"badges":1997,"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":2000,"screenshot":80,"short_description":81,"short_title":82,"stem":83,"trial_url":15,"type":84,"url":85,"__hash__":86},[1998,1999],{"label":64,"color":65},{"label":67,"color":68},{"body":2001},{"type":23,"value":2002,"toc":2003},[],{"title":26,"searchDepth":27,"depth":27,"links":2004},[],{"id":88,"title":89,"badge":15,"badges":2006,"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":2010,"screenshot":106,"short_description":107,"short_title":108,"stem":109,"trial_url":15,"type":84,"url":110,"__hash__":111},[2007,2008,2009],{"label":64,"color":65},{"label":67,"color":68},{"label":94,"color":95},{"body":2011},{"type":23,"value":2012,"toc":2013},[],{"title":26,"searchDepth":27,"depth":27,"links":2014},[],{"fromGitHub":18,"tiers":2016},{"platinum":2017,"gold":2023,"silver":2024,"bronze":2029,"infrastructure":2036,"supporters":2044},[2018],{"name":2019,"url":2020,"logo":2021,"logo_dark":2022},"Sevalla","https:\u002F\u002Fsevalla.com","\u002Fsponsors\u002Fsevalla.png","\u002Flogos\u002Fsevalla.svg",[],[2025],{"name":2026,"url":2027,"logo":2028,"logo_dark":15},"GiGa infosystems","https:\u002F\u002Fgiga-infosystems.com","\u002Fsponsors\u002Fgiga-infosystems.png",[2030,2033],{"name":2031,"url":2032},"Deimos Industries","https:\u002F\u002Fdeimosindustries.com",{"name":2034,"url":2035},"CarePilot","https:\u002F\u002Fcarepilot.com",[2037,2041],{"name":2038,"url":2039,"logo":2040,"logo_dark":15},"Depot","https:\u002F\u002Fdepot.dev","\u002Fsponsors\u002Fdepot.png",{"name":10,"url":2042,"logo":2043,"logo_dark":15},"https:\u002F\u002Fhub.docker.com\u002Fu\u002Fserversideup","\u002Fsponsors\u002Fdocker.png",[],[2046,2055,2064,2073],{"id":5,"title":6,"badge":7,"badges":2047,"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":2050,"screenshot":29,"short_description":30,"short_title":15,"stem":31,"trial_url":32,"type":33,"url":34,"__hash__":35},[2048,2049],{"label":10,"color":11},{"label":13,"color":14},{"body":2051},{"type":23,"value":2052,"toc":2053},[],{"title":26,"searchDepth":27,"depth":27,"links":2054},[],{"id":37,"title":38,"badge":15,"badges":2056,"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":2059,"screenshot":54,"short_description":55,"short_title":15,"stem":56,"trial_url":15,"type":33,"url":57,"__hash__":58},[2057,2058],{"label":41,"color":11},{"label":43,"color":44},{"body":2060},{"type":23,"value":2061,"toc":2062},[],{"title":26,"searchDepth":27,"depth":27,"links":2063},[],{"id":60,"title":61,"badge":15,"badges":2065,"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":2068,"screenshot":80,"short_description":81,"short_title":82,"stem":83,"trial_url":15,"type":84,"url":85,"__hash__":86},[2066,2067],{"label":64,"color":65},{"label":67,"color":68},{"body":2069},{"type":23,"value":2070,"toc":2071},[],{"title":26,"searchDepth":27,"depth":27,"links":2072},[],{"id":88,"title":89,"badge":15,"badges":2074,"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":2078,"screenshot":106,"short_description":107,"short_title":108,"stem":109,"trial_url":15,"type":84,"url":110,"__hash__":111},[2075,2076,2077],{"label":64,"color":65},{"label":67,"color":68},{"label":94,"color":95},{"body":2079},{"type":23,"value":2080,"toc":2081},[],{"title":26,"searchDepth":27,"depth":27,"links":2082},[],[2084,2093,2102,2111,2120,2129],{"id":114,"title":115,"badge":15,"badges":2085,"description":123,"extension":17,"external":72,"github_slug":124,"logo_square":125,"logo_wide":126,"meta":2088,"repo_url":132,"screenshot":133,"short_description":134,"short_title":135,"stem":136,"type":137,"url":138,"__hash__":139},[2086,2087],{"label":118,"color":119},{"label":121,"color":122},{"body":2089},{"type":23,"value":2090,"toc":2091},[],{"title":26,"searchDepth":27,"depth":27,"links":2092},[],{"id":141,"title":142,"badge":15,"badges":2094,"description":147,"extension":17,"external":72,"github_slug":148,"logo_square":47,"logo_wide":149,"meta":2097,"repo_url":155,"screenshot":156,"short_description":157,"short_title":15,"stem":158,"type":159,"url":160,"__hash__":161},[2095,2096],{"label":118,"color":119},{"label":146,"color":14},{"body":2098},{"type":23,"value":2099,"toc":2100},[],{"title":26,"searchDepth":27,"depth":27,"links":2101},[],{"id":163,"title":164,"badge":15,"badges":2103,"description":169,"extension":17,"external":72,"github_slug":170,"logo_square":171,"logo_wide":172,"meta":2106,"repo_url":178,"screenshot":179,"short_description":180,"short_title":15,"stem":181,"type":182,"url":183,"__hash__":184},[2104,2105],{"label":118,"color":119},{"label":168,"color":65},{"body":2107},{"type":23,"value":2108,"toc":2109},[],{"title":26,"searchDepth":27,"depth":27,"links":2110},[],{"id":186,"title":187,"badge":15,"badges":2112,"description":193,"extension":17,"external":72,"github_slug":194,"logo_square":195,"logo_wide":196,"meta":2115,"repo_url":202,"screenshot":203,"short_description":204,"short_title":15,"stem":205,"type":206,"url":207,"__hash__":208},[2113,2114],{"label":118,"color":119},{"label":191,"color":192},{"body":2116},{"type":23,"value":2117,"toc":2118},[],{"title":26,"searchDepth":27,"depth":27,"links":2119},[],{"id":210,"title":211,"badge":15,"badges":2121,"description":216,"extension":17,"external":72,"github_slug":217,"logo_square":218,"logo_wide":219,"meta":2124,"repo_url":225,"screenshot":226,"short_description":227,"short_title":15,"stem":228,"type":206,"url":229,"__hash__":230},[2122,2123],{"label":118,"color":119},{"label":215,"color":14},{"body":2125},{"type":23,"value":2126,"toc":2127},[],{"title":26,"searchDepth":27,"depth":27,"links":2128},[],{"id":232,"title":233,"badge":15,"badges":2130,"description":237,"extension":17,"external":18,"github_slug":238,"logo_square":239,"logo_wide":15,"meta":2133,"repo_url":245,"screenshot":15,"short_description":246,"short_title":247,"stem":248,"type":137,"url":245,"__hash__":249},[2131,2132],{"label":118,"color":119},{"label":121,"color":122},{"body":2134},{"type":23,"value":2135,"toc":2136},[],{"title":26,"searchDepth":27,"depth":27,"links":2137},[],[2139,2148,2157,2166,2175,2184],{"id":114,"title":115,"badge":15,"badges":2140,"description":123,"extension":17,"external":72,"github_slug":124,"logo_square":125,"logo_wide":126,"meta":2143,"repo_url":132,"screenshot":133,"short_description":134,"short_title":135,"stem":136,"type":137,"url":138,"__hash__":139},[2141,2142],{"label":118,"color":119},{"label":121,"color":122},{"body":2144},{"type":23,"value":2145,"toc":2146},[],{"title":26,"searchDepth":27,"depth":27,"links":2147},[],{"id":141,"title":142,"badge":15,"badges":2149,"description":147,"extension":17,"external":72,"github_slug":148,"logo_square":47,"logo_wide":149,"meta":2152,"repo_url":155,"screenshot":156,"short_description":157,"short_title":15,"stem":158,"type":159,"url":160,"__hash__":161},[2150,2151],{"label":118,"color":119},{"label":146,"color":14},{"body":2153},{"type":23,"value":2154,"toc":2155},[],{"title":26,"searchDepth":27,"depth":27,"links":2156},[],{"id":163,"title":164,"badge":15,"badges":2158,"description":169,"extension":17,"external":72,"github_slug":170,"logo_square":171,"logo_wide":172,"meta":2161,"repo_url":178,"screenshot":179,"short_description":180,"short_title":15,"stem":181,"type":182,"url":183,"__hash__":184},[2159,2160],{"label":118,"color":119},{"label":168,"color":65},{"body":2162},{"type":23,"value":2163,"toc":2164},[],{"title":26,"searchDepth":27,"depth":27,"links":2165},[],{"id":186,"title":187,"badge":15,"badges":2167,"description":193,"extension":17,"external":72,"github_slug":194,"logo_square":195,"logo_wide":196,"meta":2170,"repo_url":202,"screenshot":203,"short_description":204,"short_title":15,"stem":205,"type":206,"url":207,"__hash__":208},[2168,2169],{"label":118,"color":119},{"label":191,"color":192},{"body":2171},{"type":23,"value":2172,"toc":2173},[],{"title":26,"searchDepth":27,"depth":27,"links":2174},[],{"id":210,"title":211,"badge":15,"badges":2176,"description":216,"extension":17,"external":72,"github_slug":217,"logo_square":218,"logo_wide":219,"meta":2179,"repo_url":225,"screenshot":226,"short_description":227,"short_title":15,"stem":228,"type":206,"url":229,"__hash__":230},[2177,2178],{"label":118,"color":119},{"label":215,"color":14},{"body":2180},{"type":23,"value":2181,"toc":2182},[],{"title":26,"searchDepth":27,"depth":27,"links":2183},[],{"id":232,"title":233,"badge":15,"badges":2185,"description":237,"extension":17,"external":18,"github_slug":238,"logo_square":239,"logo_wide":15,"meta":2188,"repo_url":245,"screenshot":15,"short_description":246,"short_title":247,"stem":248,"type":137,"url":245,"__hash__":249},[2186,2187],{"label":118,"color":119},{"label":121,"color":122},{"body":2189},{"type":23,"value":2190,"toc":2191},[],{"title":26,"searchDepth":27,"depth":27,"links":2192},[],1793830856742]