PageSourceSearch

https://orestis.ch/blog/automating-beach-rental-store

html orestis.ch collected 2026-09-25 20:08:00 UTC 63,400 bytes, 1 lines download raw bytes

1<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv=X-UA-Compatible content="IE=edge,chrome=1"> <meta name=viewport content="width=device-width, initial-scale=1"> <meta name=description content="A deep dive into automating a physical retail space: How I built custom smart racks using Raspberry Pi, I/O expanders, and 3D printed parts to run a 24/7 unstaffed rental store. | AI & Full-Stack Engineer"> <meta name=author content="Orestis Zambounis"> <title>Automating a Beach Rental Store</title> <!-- Essential SEO meta tags --> <meta property="og:title" content="Automating a Beach Rental Store"> <meta property="og:description" content="A deep dive into automating a physical retail space: How I built custom smart racks using Raspberry Pi, I/O expanders, and 3D printed parts to run a 24/7 unstaffed rental store."> <meta property="og:url" content="https://orestis.ch/blog/automating-beach-rental-store"> <meta property="og:site_name" content="Orestis Zambounis"> <meta property="og:type" content="website"> <meta property="og:image" content="https://orestis.ch/assets/images/blogs/2025-12-08-automating-beach-rental-store/beachin.jpg"> <link rel="icon" type="image/png" href="/assets/images/favicon.png" /> <link rel="apple-touch-icon" href="/assets/images/favicon.png" /> <link rel="shortcut icon" type="image/png" href="/assets/images/favicon.png" /> <meta name="msapplication-TileImage" content="/assets/images/favicon.png"> <meta name="theme-color" content="#667eea"> <link rel="canonical" href="https://orestis.ch/blog/automating-beach-rental-store"> <link rel="alternate" type="application/rss+xml" title="Orestis Zambounis - RSS Feed" href="https://orestis.ch/feed.xml"> <!-- MathJax for LaTeX rendering --> 
1<script> MathJax = { tex: { inlineMath: [['$', '$'], ['\\(', '\\)']], displayMath: [['$$', '$$'], ['\\[', '\\]']], processEscapes: true, processEnvironments: true }, options: { skipHtmlTags: ['script', 'noscript', 'style', 'textarea', 'pre'] }, output: { displayOverflow: 'linebreak', linebreaks: { inline: true, width: '100%', lineleading: 0.2, LinebreakVisitor: null, } } }; </script>
1 
1<script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@4/tex-mml-chtml.js"></script>
1 <style> /*! normalize.css v4.1.1 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block}audio:not([controls]){display:none;height:0}progress{vertical-align:baseline}template,[hidden]{display:none}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}img{border-style:none}svg:not(:root){overflow:hidden}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}button,input,select,textarea{font:inherit;margin:0}optgroup{font-weight:bold}button,input{overflow:visible}button,select{text-transform:none}button,html [type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-input-placeholder{color:inherit;opacity:0.54}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.highlight .c{color:#998;font-style:italic}.highlight .err{color:#a61717;background-color:#e3d2d2}.highlight .k{font-weight:bold}.highlight .o{font-weight:bold}.highlight .cm{color:#998;font-style:italic}.highlight .cp{color:#999;font-weight:bold}.highlight .c1{color:#998;font-style:italic}.highlight .cs{color:#999;font-weight:bold;font-style:italic}.highlight .gd{color:#000;background-color:#fdd}.highlight .gd .x{color:#000;background-color:#faa}.highlight .ge{font-style:italic}.highlight .gr{color:#a00}.highlight .gh{color:#999}.highlight .gi{color:#000;background-color:#dfd}.highlight .gi .x{color:#000;background-color:#afa}.highlight .go{color:#888}.highlight .gp{color:#555}.highlight .gs{font-weight:bold}.highlight .gu{color:purple;font-weight:bold}.highlight .gt{color:#a00}.highlight .kc{font-weight:bold}.highlight .kd{font-weight:bold}.highlight .kn{font-weight:bold}.highlight .kp{font-weight:bold}.highlight .kr{font-weight:bold}.highlight .kt{color:#458;font-weight:bold}.highlight .m{color:#099}.highlight .s{color:#d14}.highlight .n{color:#333}.highlight .na{color:teal}.highlight .nb{color:#0086b3}.highlight .nc{color:#458;font-weight:bold}.highlight .no{color:teal}.highlight .ni{color:purple}.highlight .ne{color:#900;font-weight:bold}.highlight .nf{color:#900;font-weight:bold}.highlight .nn{color:#555}.highlight .nt{color:navy}.highlight .nv{color:teal}.highlight .ow{font-weight:bold}.highlight .w{color:#bbb}.highlight .mf{color:#099}.highlight .mh{color:#099}.highlight .mi{color:#099}.highlight .mo{color:#099}.highlight .sb{color:#d14}.highlight .sc{color:#d14}.highlight .sd{color:#d14}.highlight .s2{color:#d14}.highlight .se{color:#d14}.highlight .sh{color:#d14}.highlight .si{color:#d14}.highlight .sx{color:#d14}.highlight .sr{color:#009926}.highlight .s1{color:#d14}.highlight .ss{color:#990073}.highlight .bp{color:#999}.highlight .vc{color:teal}.highlight .vg{color:teal}.highlight .vi{color:teal}.highlight .il{color:#099}.highlight .gc{color:#999;background-color:#EAF2F5}body,html{font-size:62.5%}body{line-height:1;font:16px "Helvetica Neue",Helvetica,Arial,sans-serif;color:#595959}h1,h2,h3,h4{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;color:#222;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}h1{font-size:3rem;letter-spacing:-1px;color:#222;font-weight:700}h2{font-size:2.2rem}h3{font-size:2rem}h4{font-size:1.6rem}a{color:indigo;text-decoration:underline}p{line-height:1.7;color:#595959;font-weight:300;margin-bottom:20px;letter-spacing:.4px}@media only screen and (max-width: 400px){p{letter-spacing:.2px}}strong{font-weight:bold}.btn{display:inline-block;position:relative;overflow:hidden;border:none;cursor:pointer;margin-right:1rem;margin-bottom:.5rem;display:inline-block;padding:10px 20px;background:#222;color:#fff;text-decoration:none;border-radius:3px;font-weight:500;font-size:1.3rem;transition:none;border:1px solid #222}.btn:hover{background:#fff;color:#222}.btn.small{padding:8px 16px;font-size:1.2rem}.btn-secondary{background:transparent;color:#222;border:1px solid #222}.btn-secondary:hover{background:#222;color:#fff}.btn-primary{background:linear-gradient(135deg, #667eea 0%, #764ba2 100%) !important;box-shadow:0 4px 15px rgba(102,126,234,0.4) !important;color:#fff !important}.btn-primary:before{background:linear-gradient(135deg, #3958e4 0%, #5d3b7f 100%) !important}.btn-primary:hover{box-shadow:0 6px 20px rgba(102,126,234,0.6) !important;color:#fff !important;text-decoration:none !important}ul li,ol li{line-height:2.4rem;font-weight:300;color:#595959}img,pre,iframe{max-width:100%}img,pre{border-radius:4px}@media only screen and (max-width: 400px){.contain-mobile{object-fit:contain !important}}.contain-desktop-only{object-fit:contain}@media only screen and (max-width: 400px){.contain-desktop-only{object-fit:cover !important}}figcaption{position:relative;top:-20px;left:0;right:0;margin:0 auto;width:100%;text-align:center;font-size:1.3rem;color:#797676;font-weight:300}@media only screen and (max-width: 400px){figcaption{font-size:1.2rem}}blockquote{padding-left:15px;border-left:3px solid #eee}.project-quote{margin:10px 0 20px 0;padding:10px 15px;background:#f9f9f9;border-left:3px solid #ddd}.project-quote p{margin-bottom:5px;font-size:1.3rem;line-height:1.7;font-weight:300;letter-spacing:.4px}.project-quote cite{font-size:1.1rem;color:#797676;font-style:normal}.project-description+.project-quote{margin-top:-5px}hr{border:none;height:1px;margin:40px auto;background:#eee;width:100%}figure.highlight{width:100%;margin:0}code,tt{padding:1px 0;font-family:"Consolas",Liberation Mono,Menlo,Courier,monospace;font-size:12px;line-height:20px;background:#fff;border-radius:2px;border-radius:2px}pre{box-sizing:border-box;margin:0 0 1.75em 0;width:100%;padding:5px 10px;font-family:"Consolas",Liberation Mono,Menlo,Courier,monospace;font-size:1.2rem;line-height:2rem;overflow:auto;background:#fff;border:1px solid #ededed;border-radius:2px}a:not(.link,.btn,.header-anchor,[data-mjx-href]){color:inherit;border-bottom:1px dotted rgba(160,160,160,0.65);text-decoration:none;transition:color .3s ease,border-bottom-color .2s ease}a:not(.link,.btn,.header-anchor,[data-mjx-href]):hover{color:#06c}.wrapper-small,.wrapper-normal,.wrapper-blog,.wrapper-large,.wrapper-xlarge{height:100%;width:100%;margin:0 auto}@media only screen and (max-width: 400px){.wrapper-small,.wrapper-normal,.wrapper-blog,.wrapper-large,.wrapper-xlarge{width:88%}}@media only screen and (min-width: 400px) and (max-width: 1050px){.wrapper-small,.wrapper-normal,.wrapper-blog,.wrapper-large,.wrapper-xlarge{width:88%}}.wrapper-small{max-width:600px}.wrapper-normal{max-width:680px}.wrapper-blog{max-width:680px}.wrapper-large{max-width:1000px}.wrapper-xlarge{max-width:1200px}.text-center{text-align:center}.clearfix:before,.clearfix:after{content:"";display:table}.clearfix:after{clear:both}.animated{animation:fade-in-down .6s;animation-delay:.3s;animation-fill-mode:both}@keyframes fade-in-down{0%{opacity:0;transform:translateY(-10px)}100%{opacity:1;transform:translateY(0)}}.home,.contact,.projects{margin-top:125px;text-align:center}.home>.list,.contact>.list,.projects>.list{position:relative}.home>.list:before,.contact>.list:before,.projects>.list:before{display:block;width:7px;height:7px;border:#ededed 1px solid;position:absolute;top:-5px;left:50%;margin-left:-5px;background:#FFF;box-shadow:#FFF 0 0 0 5px;border-radius:3px}.home .url,.contact .url,.projects .url{text-align:start}.home>.list>.item,.blog>.list>.item,.projects>.list>.item{display:flex;width:95%;margin:0 auto;border-bottom:1px dotted rgba(160,160,160,0.65);margin-top:2rem}@media (max-width: 600px){.home>.list>.item,.blog>.list>.item,.projects>.list>.item{flex-direction:column;align-items:center}}.home>.list>.item:last-child,.blog>.list>.item:last-child,.projects>.list>.item:last-child{border-bottom:none}.home>.list>.item>.url,.blog>.list>.item>.url,.projects>.list>.item>.url{display:block;padding:20px 0;text-decoration:none;align-items:center;display:flex;flex:1}.home>.list>.item>.description,.blog>.list>.item>.description,.projects>.list>.item>
1.description{display:flex;flex:1}.home>.list>.item>.url>div>.title,.blog>.list>.item>.url>div>.title,.projects>.list>.item>.url>div>.title{margin:0;font-weight:500;transition:all ease-in-out .2s;display:inline}.home>.list>.item>.url>div>.year,.blog>.list>.item>.url>div>.year,.projects>.list>.item>.url>div>.year{margin:0;text-align:left;font-size:14px}.home>.list>.item:hover>.url>.title,.blog>.list>.item:hover>.url>.title,.projects>.list>.item:hover>.url>.title{color:indigo}.home>.list>.item>.url>.thumbnail,.blog>.list>.item>.url>.thumbnail,.projects>.list>.item>.url>.thumbnail{display:inline;height:4.5rem;width:4.5rem;margin-right:2rem;object-fit:cover;box-shadow:0 0vmin .6vmin rgba(0,0,0,0.2)}.home>.list aside,.blog>.list aside,.projects>.list aside{position:relative;top:2px;margin:0;width:25%;float:right;font-weight:300;color:#797676;text-align:right;transition:all ease-in-out .2s}.home>.list .item:hover .url aside,.blog>.list .item:hover .url aside,.projects>.list .item:hover .url aside{color:#595959}.blog>.list>.item>.url>.title,.projects>.list>.item>.url>.title{display:inline}.blog>.list>.item>.url>.emoji,.projects>.list>.item>.url>.emoji{display:inline;position:relative;top:-4px;margin-right:10px}.home>.list>.item>.project-content{display:flex;width:100%;padding:20px 0}@media (max-width: 600px){.home>.list>.item>.project-content{flex-direction:column}}.home>.list>.item>.project-content>.project-left{flex:1;padding-right:2rem}@media (max-width: 600px){.home>.list>.item>.project-content>.project-left{padding-right:0;margin-bottom:1rem}}.home>.list>.item>.project-content>.project-left>.url{text-decoration:none;display:block;margin-bottom:.5rem}.home>.list>.item>.project-content>.project-left>.url>.title{margin:0;font-weight:500;transition:all ease-in-out .2s;font-size:1.4rem}.home>.list>.item>.project-content>.project-left>.url:hover>.title{color:indigo}.home>.list>.item>.project-content>.project-left>.subtitle{margin:.5rem 0;font-size:1rem;color:#797676;font-weight:400;line-height:1.4}.home>.list>.item>.project-content>.project-left>.year{margin:.5rem 0;font-size:14px;color:#797676;font-weight:300}.home>.list>.item>.project-content>.project-left>.links{margin-top:1rem}.home>.list>.item>.project-content>.project-left>.links>.project-link{display:inline-block;padding:.5rem 1rem;background-color:#ededed;color:#595959;text-decoration:none;border-radius:4px;font-size:.9rem;transition:all ease-in-out .2s}.home>.list>.item>.project-content>.project-left>.links>.project-link:hover{background-color:indigo;color:#fff}.home>.list>.item>.project-content>.project-right{flex:1.5;display:flex;flex-direction:column;align-items:flex-start;padding-top:.5rem}.home>.list>.item>.project-content>.project-right>.description{margin:0 0 1.5rem 0;line-height:1.6}.home>.list>.item>.project-content>.project-right>.project-image{width:100%}.home>.list>.item>.project-content>.project-right>.project-image>a>.full-image{width:100%;height:auto;max-height:300px;object-fit:cover;border-radius:8px;box-shadow:0 4px 12px rgba(0,0,0,0.15);transition:transform .3s ease}.home>.list>.item>.project-content>.project-right>.project-image>a:hover>.full-image{transform:translateY(-2px);box-shadow:0 6px 20px rgba(0,0,0,0.2)}.contact-page{padding:60px 0;max-width:600px;margin:0 auto}@media only screen and (max-width: 400px){.contact-page{padding:30px 0}}.contact-page .container{width:90%;max-width:600px;margin:0 auto;padding:0 20px}@media only screen and (max-width: 400px){.contact-page .container{width:95%;padding:0 15px}}.contact-page h1{font-size:2.5rem;margin-bottom:1em;color:#222;border-bottom:2px solid #ededed;padding-bottom:15px;text-align:center}@media only screen and (max-width: 400px){.contact-page h1{font-size:2rem}}.contact-page h2{font-size:1.8rem;margin:2em 0 1em 0;color:#555}@media only screen and (max-width: 400px){.contact-page h2{font-size:1.5rem;margin:1.5em 0 .8em 0}}.contact-page h3{font-size:1.4rem;margin:1.5em 0 .5em 0;color:#555}@media only screen and (max-width: 400px){.contact-page h3{font-size:1.2rem;margin:1.2em 0 .4em 0}}.contact-page .contact-section{margin-bottom:2em;text-align:center}@media only screen and (max-width: 400px){.contact-page .contact-section{margin-bottom:1.5em}}.contact-page .contact-section p{margin-bottom:.8em;line-height:1.6;color:#333;font-size:1.1rem}@media only screen and (max-width: 400px){.contact-page .contact-section p{font-size:1rem}}.contact-page .contact-item a{color:#222;text-decoration:none;border-bottom:1px solid transparent;transition:all .3s ease;font-weight:500}.contact-page .contact-item a:hover{border-bottom-color:#222;text-decoration:none}.contact-page .address .company-name{font-weight:600;color:#222;margin-bottom:.3em}.contact-page .address p{margin-bottom:.3em}.contact-page .contact-actions{margin-top:3em;text-align:center}@media only screen and (max-width: 400px){.contact-page .contact-actions{margin-top:2em}}.contact-page .contact-actions .btn{margin-right:1rem;margin-bottom:.5rem;padding:10px 20px}@media only screen and (max-width: 400px){.contact-page .contact-actions .btn{display:block;margin:.5rem 0;margin-right:0}}.legal-page{padding:60px 0;max-width:800px;margin:0 auto}@media only screen and (max-width: 400px){.legal-page{padding:30px 0}}.legal-page .container{width:90%;max-width:800px;margin:0 auto;padding:0 20px}@media only screen and (max-width: 400px){.legal-page .container{width:95%;padding:0 15px}}.legal-page h1{font-size:2.5rem;margin-bottom:1em;color:#222;border-bottom:2px solid #ededed;padding-bottom:15px}@media only screen and (max-width: 400px){.legal-page h1{font-size:2rem}}.legal-page h2{font-size:1.8rem;margin:2em 0 1em 0;color:#555}@media only screen and (max-width: 400px){.legal-page h2{font-size:1.5rem}}.legal-page p{margin-bottom:1.2em;line-height:1.6;color:#333;font-size:1.1rem}.legal-page p:first-of-type{font-size:1rem;color:#595959;font-style:italic}.legal-page ul{margin:1em 0 1.5em 20px}.legal-page ul li{margin-bottom:.5em;line-height:1.6;color:#333;font-size:1.1rem}.legal-page a{color:#222;text-decoration:none;border-bottom:1px solid transparent;transition:all .3s ease}.legal-page a:hover{border-bottom-color:#222;text-decoration:none}.legal-page strong{color:#222}.portfolio-container{padding:2rem 0}.portfolio-header{margin-bottom:4rem}.portfolio-header h1{font-size:3.5rem;margin-bottom:1rem;color:#222}.portfolio-header .portfolio-subtitle{font-size:1.8rem;color:#797676;font-weight:300}.portfolio-category{margin-bottom:8rem}.portfolio-category:last-child{margin-bottom:5rem}.portfolio-category .category-title{font-size:2.8rem;color:#222;margin-bottom:3rem;padding-bottom:1rem;border-bottom:1px solid #ddd}.project-item{margin-bottom:4rem;background:#fff;border:1px solid #eee;border-radius:4px;overflow:hidden}.project-content{display:flex;align-items:stretch;min-height:300px}@media only screen and (max-width: 780px){.project-content{flex-direction:column;min-height:0}}.project-info{flex:1;padding:3rem;display:flex;flex-direction:column;justify-content:space-between}@media only screen and (max-width: 780px){.project-info{padding:2rem}}.project-title{font-size:2.4rem;color:#222;margin-bottom:.5rem;line-height:1.3}.project-subtitle{font-size:1.6rem;color:#797676;margin-bottom:1.5rem;font-weight:400}.project-description{font-size:1.4rem;line-height:1.6;color:#595959;margin-bottom:2rem}.project-links{margin-bottom:1.5rem}.project-meta{flex-direction:row;display:flex}.project-meta .project-year{font-size:1.3rem;color:#797676;font-weight:500;background:#f8f9fa;padding:.5rem 1rem;border-radius:20px;
1display:inline-block;margin-right:.7rem}.project-image{flex:0 0 400px;position:relative}@media only screen and (max-width: 780px){.project-image{flex:none;height:auto}}.project-image img{width:100%;height:100%;object-fit:cover;display:block;border-radius:0}@media only screen and (max-width: 780px){.project-image img{height:auto}}.project-item--small{margin-bottom:2.5rem}.project-item--small .project-content{min-height:200px}@media only screen and (max-width: 780px){.project-item--small .project-content{flex-direction:column;min-height:0}}.project-item--small .project-info{padding:2rem}@media only screen and (max-width: 780px){.project-item--small .project-info{padding:1.5rem}}.project-item--small .project-title{font-size:1.8rem;margin-bottom:.3rem}.project-item--small .project-subtitle{font-size:1.3rem;margin-bottom:1rem}.project-item--small .project-description{font-size:1.3rem;margin-bottom:1.5rem}.project-item--small .project-links{margin-bottom:1rem}.project-item--small .project-links .btn{padding:8px 16px;font-size:1.2rem}.project-item--small .project-image{flex:0 0 250px;border-radius:0}@media (max-width: 1024px){.project-item--small .project-image{flex:0 0 200px}}@media only screen and (min-width: 400px) and (max-width: 1050px){.project-item--small .project-image{flex:0 0 180px}}@media only screen and (max-width: 780px){.project-item--small .project-image{height:auto}}@media (max-width: 1024px){.project-content .project-image{flex:0 0 350px}}@media only screen and (min-width: 400px) and (max-width: 1050px){.project-content .project-image{flex:0 0 300px}}@media only screen and (max-width: 780px){.project-content .project-image{flex:none}.portfolio-header h1{font-size:3rem}.portfolio-header .portfolio-subtitle{font-size:1.6rem}.portfolio-category .category-title{font-size:2.4rem}.project-item--small .project-title{font-size:1.6rem}.project-item--small .project-subtitle{font-size:1.2rem}}@media only screen and (max-width: 780px){.portfolio-header{margin-bottom:3rem}.portfolio-header h1{font-size:2.5rem}.portfolio-header .portfolio-subtitle{font-size:1.4rem}.portfolio-category{margin-bottom:6rem}.portfolio-category:last-child{margin-bottom:4rem}.portfolio-category .category-title{font-size:2rem;margin-bottom:2rem}.project-item{margin-bottom:3rem}.project-item--small{margin-bottom:2rem}.project-item--small .project-title{font-size:1.5rem}.project-item--small .project-subtitle{font-size:1.1rem}.project-item--small .project-description{font-size:1.2rem}.project-title{font-size:2rem}.project-subtitle{font-size:1.4rem}.project-description{font-size:1.3rem}}.blog-container{margin:0 auto;padding:40px 0}.blog-header{margin-bottom:60px}.blog-header h1{font-size:2.5rem;margin-bottom:10px}.blog-header .blog-subtitle{font-size:1.1rem;color:#595959;font-style:italic}.blog-posts .no-posts{text-align:center;color:#595959;font-size:1.1rem;margin:60px 0}.blog-post-preview{margin-bottom:50px;padding-bottom:40px;border-bottom:1px solid #eee}.blog-post-preview:last-child{border-bottom:none}.blog-post-preview .post-preview-title{margin-bottom:10px}.blog-post-preview .post-preview-title a{text-decoration:none}.blog-post-preview .post-preview-meta{font-size:.9rem;color:#999;margin-bottom:15px}.blog-post-preview .post-preview-meta time{margin-right:15px}.blog-post-preview .post-preview-meta .post-preview-categories .category{display:inline-block;background:#f0f0f0;padding:3px 10px;border-radius:3px;margin-right:5px;font-size:.85rem}.blog-post-preview .post-preview-excerpt{color:#555;line-height:1.6;margin-bottom:5px;font-family:source-serif-pro,Georgia,Cambria,"Times New Roman",Times,serif}.blog-post-preview .post-preview-readmore{font-size:1.3rem}.post-container{margin:0 auto;padding:40px 0}.post-hero{margin:0 0 2rem 0}.post-hero img{width:100%;height:auto;display:block;border-radius:8px}.post-header{margin-bottom:40px}.post-header .post-title{font-size:4rem;margin-bottom:15px}.post-header .post-meta{font-size:.95rem;color:#999}.post-header .post-meta .post-date{margin-right:15px}.post-header .post-meta .post-author{margin-right:15px}.post-header .post-meta .post-categories .category{display:inline-block;background:#f0f0f0;padding:3px 10px;border-radius:3px;margin-right:5px;font-size:.85rem}.post-content{line-height:1.8;font-family:source-serif-pro,Georgia,Cambria,"Times New Roman",Times,serif}.post-content h2{margin-top:40px;margin-bottom:20px;font-size:2.5rem;font-weight:600}.post-content h3{margin-top:30px;margin-bottom:15px;font-size:2rem;font-weight:600}.post-content p{margin-bottom:20px;text-align:initial}.post-content ul,.post-content ol{margin-bottom:20px;padding-left:30px}.post-content code{background:#f5f5f5;padding:2px 6px;border-radius:3px;font-family:"Monaco","Courier New",monospace;font-size:.9em}.post-content pre{background:#f5f5f5;padding:15px;border-radius:5px;overflow-x:auto;margin-bottom:20px}.post-content pre code{background:none;padding:0}.post-content blockquote{border-left:4px solid #06c;padding-left:20px;margin:20px 0;color:#595959;font-style:italic}.post-content img{max-width:100%;height:auto;display:block;margin:30px auto}.post-content table{width:100%;margin:30px auto;border-collapse:collapse}.post-content table thead{background:#f5f5f5}.post-content table thead th{padding:10px 15px;text-align:left;font-weight:600;border-bottom:1.5px solid #ddd}.post-content table tbody tr{border-bottom:1px solid #eee}.post-content table tbody td{padding:10px 15px}.post-content .vimeo{padding:56.25% 0 0 0;position:relative;border-radius:4px;overflow:clip;margin:30px auto}.post-content .image-caption{max-width:90%;margin:auto;text-align:center;font-size:1.2rem;color:#797676;font-style:italic;margin-top:-20px;margin-bottom:30px}.post-navigation{margin-top:40px;padding-top:20px;font-size:1.3rem}@media (max-width: 768px){.blog-header h1{font-size:2rem}.post-header .post-title{font-size:2.5rem}.post-content h2{font-size:2rem}.post-content h3{font-size:1.7rem}}.footer-main{border-top:1px solid #ededed;padding:40px 0 20px 0;margin:40px 0 0;font-size:1.3rem;color:#797676;font-weight:300;text-align:center;position:relative}.footer-main:before{display:block;content:" ";width:7px;height:7px;border:#ededed 1px solid;position:absolute;top:-5px;left:50%;margin-left:-5px;background:#FFF;box-shadow:#FFF 0 0 0 5px;border-radius:3px}.footer-main .footer-content{display:grid;grid-template-columns:repeat(auto-fit, minmax(200px, 1fr));gap:30px;margin:0 auto 30px;text-align:left}@media (max-width: 600px){.footer-main .footer-content{grid-template-columns:1fr;text-align:center}}.footer-main .footer-content .footer-contact{text-align:left}@media (max-width: 600px){.footer-main .footer-content .footer-contact{text-align:center}}.footer-main .footer-content .footer-contact h4,.footer-main .footer-content .footer-contact p{text-align:left}@media (max-width: 600px){.footer-main .footer-content .footer-contact h4,.footer-main .footer-content .footer-contact p{text-align:center}}.footer-main .footer-content h4{color:#222;font-size:1.1rem;margin-bottom:15px;font-weight:bold}.footer-main .footer-content p{margin:8px 0;font-size:1rem}.footer-main .footer-content ul{list-style:none;padding:0;margin:0}.footer-main .footer-content ul li{margin:8px 0}.footer-main .footer-bottom{border-top:1px solid #e0e0e0;padding-top:20px;font-size:.9rem;color:#595959}.footer-main>.link{display:inline}.footer-main>.link>.icon{width:15px !important;fill:#797676 !important;transition:ease-in-out all .3s;position:relative;top:3px;display:inherit;margin:0}.footer-main>.link>.icon:hover{fill:indigo !important}.footer-main>.extra{color:#797676;margin-top:0}.footer-main>.extra>.link{color:#222;text-decoration:none;border-bottom:1px solid transparent;transition:ease-in-out all .3s;padding-bottom:1px}.footer-main>.extra>.link:hover{border-color:#797676}.header-home{display:block;margin:0 auto;text-align:center;position:relative;z-index:99}.header-home>.link>.selfie{width:125px;margin-bottom:25px;border-radius:100%;transition:all .2s;box-shadow:0;opacity:1}.header-home>.title{font-size:4rem;margin:0 0 13px}.header-home>.description{font-size:1.85rem;font-weight:300;font-style:normal;color:#797676;width:70%;margin:0 auto 30px}.header-home>.description a{font-weight:200}.nav>.list,.nav-home>.list{list-style:none;margin:0;padding:0 13px 0}.nav>.list>.item,.nav-home>.list>.item{display:inline-block}.nav>.list>.item>.link,.nav-home>.list>.item>.link{display:inline-block;font-weight:300;font-size:1.4rem;padding:20px 10px;text-decoration:none}.nav{position:absolute;right:0;top:0}.nav>.list{padding:0 13px 0}.nav>.list>.item>.link{font-size:1.4rem;padding:20px 10px}.nav-home{border-bottom:1px solid #ededed;margin:40px 0 0;font-size:1.4rem;color:#797676;font-weight:300;text-align:center;position:relative}.nav-home:before{display:block;content:" ";width:7px;height:7px;border:#ededed 1px solid;position:absolute;bottom:-5px;left:50%;margin-left:-5px;background:#FFF;box-shadow:#FFF 0 0 0 5px;border-radius:3px}.nav-home>.list{padding:0}.nav-home>.list>.item>.link{font-size:2rem;padding:7px 15px;margin:0;border-radius:4%;transition:all .4s ease-in-out;width:70px}.nav-home>.list>.item>.link:hover{color:#595959}.evidence{background-image:linear-gradient(to bottom, rgba(39,243,106,0.15), rgba(39,243,106,0.15));color:beta}.star>.url>.title{width:auto !important;display:inline;background-image:linear-gradient(rgba(39,243,106,0.15), rgba(39,243,106,0.15))}.twitter-tweet{margin:10px auto}.icon{display:inline-block;width:17px;height:17px;fill:#000;text-align:center;color:#000;margin:7px auto}.caption{position:relative;top:1rem;left:0;right:0;margin:0 auto;width:100%;text-align:center;font-size:1.3rem}.bigger-image{min-width:130%;margin:5rem 0 5rem -15%}@media only screen and (max-width: 400px){.bigger-image{min-width:114%;margin:2rem 0 2rem -7%}}@media only screen and (min-width: 400px) and (max-width: 1050px){.bigger-image{min-width:114%;margin:2rem 0 2rem -7%}}.breaker{height:1px;margin:6rem auto;width:100%}.breaker:before{content:"• • •";width:100%;text-align:center;display:block;color:#797676;letter-spacing:4px;position:relative;top:-8px}.social-links{margin-top:20px}.social-links>.link{margin:0;text-decoration:none;position:relative;display:inline-block;height:35px;width:35px}.social-links>.link:hover>.icon{fill:indigo}.social-links>.link:hover:before{opacity:1;display:inline-block;transform:translate3d(0, 0, 0);white-space:nowrap}.social-links>.link:before{content:attr(data-title);display:none;position:absolute;bottom:-34px;left:-6px;margin:0 auto;font-size:13px;padding:3px 10px;background:#222;color:#fff;border-radius:2px;height:22px;line-height:22px;opacity:0;transition:opacity 150ms linear,transform 150ms linear,-webkit-transform 150ms linear;transform:translate3d(0, -8px, 0);z-index:99}.social-links>.link:after{content:"";position:absolute;top:35px;left:13px;width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:6px solid #222;opacity:0;transition:opacity 150ms linear,transform 150ms linear,-webkit-transform 150ms linear;transform:translate3d(0, -8px, 0);z-index:100}.social-links>.link:hover:after{opacity:1;transform:translate3d(0, 0, 0)}.social-links>.icon{transition:all ease-in-out .2s} </style> </head> <body> <div class="wrapper-xlarge" > <nav class="navigation-header"> <a href="/"><b>ORESTIS</b></a> <div class="spacer"></div> <a href="/portfolio">Portfolio</a> <a href="/blog">Blog</a> </nav> <style> .navigation-header { padding: 2rem 0; gap: 2rem; display: flex; } .navigation-header .spacer { flex-grow: 1; } </style> <div class="post-hero"> <img src="/assets/images/blogs/2025-12-08-automating-beach-rental-store/beachin.jpg" alt="Automating a Beach Rental Store" /> </div> <div class="wrapper-blog" style="width: 100%;"> <article class="post-container"> <header class="post-header"> <h1 class="post-title">Automating a Beach Rental Store</h1> <div class="post-meta"> <time class="post-date" datetime="2025-12-08T11:00:00+00:00"> December 08, 2025 </time> <span class="post-author">by Orestis Zambounis</span> <span class="post-categories"> <span class="category">IoT</span> <span class="category">Entrepreneurship</span> </span> </div> </header> <div class="post-content"> <p>This is the story of <strong>Beachin’ Rentals</strong>, our first venture into the world of physical retail. Located just three minutes from the sand in Barceloneta, we set out to provide high-quality beach equipment to locals and tourists alike. However, we quickly ran into a fundamental problem: the cost of staffing. In our first year, the expense of having an employee on-site was eating through our margins, and we were losing money.</p> <p>We faced a stark choice: close up shop or pivot entirely. I began analyzing the daily tasks of our staff and realized the job was relatively repetitive and procedural. This sparked a question: <em>What if we could automate it?</em> Theoretically, automation would allow us to operate 24/7 with near-zero marginal labor costs, transforming a struggling rental shop into a scalable, self-sufficient business.</p> <h2 id="automation-the-smart-rack">Automation: The “Smart Rack”</h2> <p>The first hurdle was the hardware. Our core products—beach loungers and umbrellas—do not fit into conventional smart lockers due to their “oversized” geometry. Even if we could find large enough lockers, they wouldn’t be space-efficient for our small storefront. We needed a custom solution.</p> <p>I designed a “Smart Rack.” Instead of traditional locker doors, this system uses chained buckles that loop through the product to secure it. It was a space-saving, geometry-agnostic solution perfectly detailed for long, narrow items like umbrellas and folded sunbeds.</p> <p>To validate this idea, I started with a Proof of Concept (PoC). The goal was to prove the entire loop could function without human intervention: from a customer selecting an item on a UI, to processing a payment via a Stripe terminal, to triggering the electric locks. If I could make this work for one lock, I knew I could scale it to 32.</p> <div class="vimeo"> <iframe src="https://player.vimeo.com/video/1144524032?badge=0&amp;autopause=0&amp;player_id=0&amp;app_id=58479&amp;autoplay=1&amp;muted=1&amp;loop=1&amp;controls=0" frameborder="0" allow="autoplay; fullscreen; picture-in-picture; clipboard-write; encrypted-media;
1 web-share" referrerpolicy="strict-origin-when-cross-origin" style="position:absolute;top:0;left:0;width:100%;height:100%;" title="Admin Panel -&gt; Lock Control"></iframe> </div> <p class="image-caption">Proof of concept: Electric lock control from a separate user interface.</p> <p>Mounting the locks onto the rack was easier said than done. I spent roughly two months just cutting metal to fit the rack structure so the buckles would slide through correctly. There were countless hours spent 3D printing handheld parts, connecting cables, and soldering components to ensure a robust build.</p> <p><img src="/assets/images/blogs/2025-12-08-automating-beach-rental-store/wip-3.jpg" alt="Work-in-progress metal rack frame with electric locks mounted and 3D printed handheld components attached" /></p> <p class="image-caption">Electric locks mounted on rack frame with 3D printed handheld parts.</p> <p>Once the electric lockers were installed, I wired up all the trigger and feedback cables using four I/O expanders (MCP23017). This setup allowed a single Raspberry Pi to control the state of 32 lockers via the I2C interface. Crucially, I implemented a feedback loop: any activity in the shop (opening or closing a lock) triggered a notification on our Android admin app. This admin interface was connected via the cloud, giving us the power to control the locks remotely if needed.</p> <p><img src="/assets/images/blogs/2025-12-08-automating-beach-rental-store/wip-4.jpg" alt="Raspberry Pi connected to four MCP23017 I/O expanders via I2C interface with wiring setup to control 32 electric locks" /></p> <p class="image-caption">I/O expanders (MCP23017) to control 32 locks through the I2C interface of the Raspberry Pi.</p> <p>For the customer experience, we designed an intuitive self-service UI. We tested this rigorously with various users before rolling it out to ensure it was foolproof. The system accommodated two flows: walk-in customers could select and pay directly at the kiosk, while those who booked online via our Shopify store could enter a reservation code to unlock their gear. We opted for a physical payment terminal rather than a QR-code-based web payment to reduce trust friction and make the transaction feel more secure and professional.</p> <p><img src="/assets/images/blogs/2025-12-08-automating-beach-rental-store/kiosk2b.jpg" alt="Self-service kiosk with touchscreen interface for product selection and integrated payment terminal for rental equipment" /></p> <p class="image-caption">User interface to select and pay for rental equipment, and unlock online orders.</p> <p>After more than three months of grueling work—much harder than anticipated—the system was finally live. Watching our first customers use it was surreal. We had feared that removing the human element might lower our conversion rate, but we observed the exact opposite. Customers loved the autonomy and speed of the smooth check-in/check-out process, free from the pressure of interacting with sales staff.</p> <p><img src="/assets/images/blogs/2025-12-08-automating-beach-rental-store/rack.jpg" style="max-width:min(100%, 400px)" alt="Completed smart rack system with beach loungers and umbrellas secured by automated electric locks and buckle chains" /></p> <p class="image-caption">Final "Smart Rack" with rental products snugly fitted.</p> <p><img src="/assets/images/blogs/2025-12-08-automating-beach-rental-store/customers.jpg" alt="Two customers entering the self-service store Beachin' Rentals" style="margin-bottom: -15px" /> <img src="/assets/images/blogs/2025-12-08-automating-beach-rental-store/customers2.jpg" alt="Multiple customers browsing and using the automated rental system to select beach equipment" /></p> <p class="image-caption">Customers using the self-service system to rent beach equipment.</p> <h2 id="smart-lockers-for-inline-skates">Smart Lockers for Inline Skates</h2> <p>Having proven the business model was viable in our second year with just the 32-lock rack, we looked for ways to expand. We still had available floor space, and as an inline skating enthusiast myself, I knew Barcelona is considered a European mecca for the sport, thanks to its smooth, flat promenades like the Barceloneta seaside.</p> <p>We launched a “smoke test” with just two pairs of inline skates to validate the demand. The results were positive, so we decided to scale up. We ordered customized smart lockers directly from a factory in China, designed to integrate easily into our existing ecosystem via the RS485 protocol.</p> <p><img src="/assets/images/blogs/2025-12-08-automating-beach-rental-store/smartlockers.jpg" alt="Custom smart lockers manufactured in China with RS485 protocol integration designed for automated inline skate rentals" /></p> <p class="image-caption">Customized smart lockers from a factory in China.</p> <p><img src="/assets/images/blogs/2025-12-08-automating-beach-rental-store/smartlockerslight.jpg" alt="Illuminated smart lockers with LED lighting displaying inline skates in individual transparent compartments for optimal product presentation" /></p> <p class="image-caption">Smart lockers with inline skates integrated into our store. Illuminated compartments ensure optimal product presentation.</p> <p>The addition made the shop feel complete. The inline skates blended perfectly with our beach equipment, adding a cool, active vibe to the store while diversifying our revenue streams.</p> <div class="vimeo"> <iframe src="https://player.vimeo.com/video/1144527759?badge=0&amp;autopause=0&amp;player_id=0&amp;app_id=58479&amp;autoplay=1&amp;muted=1&amp;loop=1&amp;controls=0" frameborder="0" allow="autoplay; fullscreen; picture-in-picture; clipboard-write; encrypted-media;
1 web-share" referrerpolicy="strict-origin-when-cross-origin" style="position:absolute;top:0;left:0;width:100%;height:100%;" title="Bechin' Rentals Self-Service"></iframe> </div> <p class="image-caption">Round view through our shop with both the smart rack and smart lockers.</p> <h2 id="door-automation">Door Automation</h2> <p>While the rentals were automated, the store operations weren’t fully hands-off yet. We still needed someone to visit the shop every evening for about 15 minutes to check returned inventory for damage and close the door blinds. Finding someone reliable for such a short, specific task proved to be a pain.</p> <p>We realized that since our inventory was relatively low-cost and damage was rare, it was more economical to absorb the occasional loss of a deposit than to pay for daily manual inspections. However, we still needed to secure the shop at night to prevent vandalism. The solution was full door automation. We outsourced this to a specialized company that automated our blinds for a relatively low price point, finally removing the last daily manual task.</p> <p><img src="/assets/images/blogs/2025-12-08-automating-beach-rental-store/door-fix.gif" alt="Technicians working on installing automated door blind system to enable hands-free store opening and closing" /></p> <p class="image-caption">Technicians working on fully automating our door blinds.</p> <h2 id="upgraded-rack-v2">Upgraded Rack (V2)</h2> <p>Our first smart rack was a success, often selling out completely during the high season. However, it had flaws: the beach umbrellas were simply placed on a shelf, leading to tangles and mess. We decided to almost double our capacity from 32 to 62 locks with an upgraded design.</p> <p>This time, I didn’t want to spend weeks DIY-ing the fabrication. We utilized an on-demand laser-cutting service in Germany to create modular metal pieces that could be mounted onto any standard rack to convert it into a smart system with minimal effort. We also 3D printed several components on-demand in China, as our design had reached a level of maturity that justified outsourcing.</p> <p><img src="/assets/images/blogs/2025-12-08-automating-beach-rental-store/module.jpg" alt="Precision laser-cut modular metal components designed for easy smart rack assembly and scalability" style="max-width:min(100%, 400px)" /></p> <p class="image-caption">Modular design for the upgraded smart rack.</p> <p>The new rack features 62 locks and looks professional. The cylindrical tubes you see aren’t rocket launchers—they are custom compartments for the umbrellas, solving the tangling issue once and for all. This modular design not only expanded our capacity but also offered a novel, scalable approach to storing irregular items that traditional lockers simply can’t handle.</p> <p><img src="/assets/images/blogs/2025-12-08-automating-beach-rental-store/customlockers2.jpg" alt="Smart Rack V2 with 62 electric locks featuring custom cylindrical compartments to prevent umbrella tangling" style="margin-bottom: -15px" /> <!-- <img src="/assets/images/blogs/2025-12-08-automating-beach-rental-store/rackv2-cam.jpeg" alt="Smart Rack V2 with modular lock system, cylindrical umbrella tubes, and organized beach equipment storage visible from surveillance camera angle" /> --></p> 
1<script src="https://player.vimeo.com/api/player.js"></script>
1 <p class="image-caption">Smart Rack V2 with modular locks and snug pipe compartments for umbrellas.</p> <h2 id="outlook-taking-it-to-greece">Outlook: Taking It to Greece</h2> <p>With the core technology validated in Barcelona, the next chapter is scaling, and Greece just handed us the perfect opportunity.</p> <p>In 2024, Greek Law 5092/2024 disrupted the country’s €2B coastal tourism industry by strictly limiting beach bars to 30% sand coverage, hard-capping concessions at 500sqm and 60% equipment density. Enforcement is serious: drone surveillance and crowdsourced reporting carry fines up to €60,000. Operators who previously expanded freely to meet peak summer demand can no longer do so. They’re bleeding potential revenue while simultaneously struggling with severe seasonal staff shortages.</p> <p>Our solution exploits a legal arbitrage. By placing a fully automated rental hub off the sand (for example, on a taverna’s patio or a hotel terrace), equipment is classified as “portable personal gear” that customers carry to the mandated 70% free zones themselves. Businesses can monetize the regulatory overflow without violating their spatial concession, expanding their fixed footprint, or increasing headcount.</p> <p><img src="/assets/images/blogs/2025-12-08-automating-beach-rental-store/outlook.jpg" alt="AI generated simulation of Smart Rack V2 deployed at a Greek beachfront location with modular lock system and organized beach equipment storage" /></p> <p class="image-caption">Simulation of an automated rental hub deployed at a Greek beachfront location.</p> <p>The Smart Rack’s modularity is key here. A single unit condenses 60+ items into ~2sqm, making it deployable in tight spaces that traditional lockers or rental shops simply can’t serve. The system is off-grid capable and corrosion-resistant, built for the harsh coastal environment from day one.</p> <p>Our go-to-market is B2B: hardware sales paired with a recurring SaaS fee. Target customers include beachfront tavernas and clubs that lost significant footprint to the new density caps, coastal hotels seeking to offer 24/7 autonomous beach amenities without competing in state auctions for beach concessions, and independent entrepreneurs deploying automated kiosks on municipal public spaces overlooking uncommercialized beaches.</p> <h2 id="conclusion">Conclusion</h2> <p>Automating <strong>Beachin’ Rentals</strong> turned a struggling business into a profitable, self-running operation. By identifying the bottleneck (labor costs), embracing IoT technology, and iterating on hardware designs, we managed to create a unique rental experience that customers genuinely prefer. Furthermore, we proved that a fully unattended store can work in the real world.</p> <p>Now, with a regulatory shift opening up an entire market of operators who urgently need to serve more customers without expanding their footprint or hiring more staff, the timing couldn’t be better to productize what we’ve built and scale it across the Mediterranean.</p> <p><a href="/shop-automation/">Thinking to automate your store?</a></p> <hr /> <h2 id="links">Links</h2> <p><a href="https://beachinrentalsbcn.es/">Beachin’ Rentals</a></p> </div> <nav class="post-navigation"> <a href="/blog" class="back-to-blog">← Back to blog</a> </nav> </article> </div> </div> </div> <svg display="none" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <defs> <symbol id="icon-rss" viewBox="0 0 1024 1024"> <title>rss</title> <path class="path1" d="M122.88 122.88v121.19c362.803 0 656.896 294.195 656.896 656.998h121.293c0-429.773-348.416-778.189-778.189-778.189zM122.88 365.414v121.293c228.813 0 414.362 185.498 414.362 414.413h121.242c0-295.834-239.821-535.706-535.603-535.706zM239.053 668.621c-64.205 0-116.224 52.122-116.224 116.275s52.019 116.224 116.224 116.224 116.173-52.019 116.173-116.224-51.968-116.275-116.173-116.275z"></path> </symbol> <symbol id="icon-facebook" viewBox="0 0 1024 1024"> <title>facebook</title> <path class="path1" d="M870.4 51.2h-716.8c-56.32 0-102.4 46.080-102.4 102.4v716.8c0 56.371 46.080 102.4 102.4 102.4h358.4v-358.4h-102.4v-126.72h102.4v-104.96c0-110.797 62.054-188.621 192.819-188.621l92.314 0.102v133.376h-61.286c-50.893 0-70.246 38.195-70.246 73.626v86.528h131.482l-29.082 126.669h-102.4v358.4h204.8c56.32 0 102.4-46.029 102.4-102.4v-716.8c0-56.32-46.080-102.4-102.4-102.4z"></path> </symbol> <symbol id="icon-twitter" viewBox="0 0 1024 1024"> <title>twitter</title> <path class="path1" d="M886.579 319.795c0.41 8.294 0.563 16.691 0.563 24.986 0 255.488-194.406 549.99-549.888 549.99-109.21 0-210.739-32-296.294-86.886 15.155 1.792 30.515 2.714 46.080 2.714 90.624 0 173.926-30.925 240.026-82.688-84.531-1.587-155.955-57.395-180.531-134.195 11.776 2.202 23.91 3.379 36.352 3.379 17.664 0 34.765-2.304 50.944-6.707-88.422-17.818-155.034-95.898-155.034-189.594 0-0.819 0-1.587 0-2.406 26.061 14.49 55.91 23.194 87.552 24.218-51.866-34.714-86.016-93.798-86.016-160.922 0-35.379 9.523-68.608 26.214-97.178 95.283 116.992 237.773 193.894 398.387 201.984-3.277-14.182-4.966-28.877-4.966-44.083 0-106.701 86.477-193.178 193.229-193.178 55.603 0 105.83 23.398 141.107 60.979 43.981-8.704 85.35-24.781 122.726-46.899-14.438 45.107-45.107 82.995-84.992 106.906 39.117-4.71 76.288-15.002 111.002-30.413-25.907 38.81-58.675 72.806-96.461 99.994z"></path> </symbol> <symbol id="icon-github" viewBox="0 0 1024 1024"> <title>github</title> <path class="path1" d="M674.816 579.021c-36.762 0-66.56 41.318-66.56 92.109 0 50.893 29.798 92.211 66.56 92.211s66.56-41.318 66.56-92.211c-0.051-50.79-29.798-92.109-66.56-92.109zM906.547 339.251c7.629-18.688 7.936-124.877-32.512-226.611 0 0-92.723 10.189-233.011 106.496-29.44-8.192-79.258-12.186-128.973-12.186-49.818 0-99.584 3.994-129.024 12.186-140.339-96.307-233.062-106.496-233.062-106.496-40.397 101.734-39.987 207.923-32.461 226.611-47.514 51.61-76.544 113.613-76.544 198.195 0 367.923 305.306 373.811 382.31 373.811 17.51 0 52.122 0.102 88.781 0.102 36.608 0 71.27-0.102 88.678-0.102 77.107 0 382.3
11-5.888 382.31-373.811 0-84.582-28.979-146.586-76.493-198.195zM513.434 866.048h-2.867c-193.075 0-343.501-22.989-343.501-210.688 0-45.005 15.872-86.682 53.606-121.293 62.822-57.702 169.216-27.187 289.894-27.187 0.512 0 1.024 0 1.485 0 0.512 0 0.922 0 1.382 0 120.678 0 227.123-30.515 289.997 27.187 37.632 34.611 53.504 76.288 53.504 121.293 0 187.699-150.374 210.688-343.501 210.688zM349.235 579.021c-36.762 0-66.56 41.318-66.56 92.109 0 50.893 29.798 92.211 66.56 92.211 36.813 0 66.611-41.318 66.611-92.211 0-50.79-29.798-92.109-66.611-92.109z"></path> </symbol> <symbol id="icon-youtube" viewBox="0 0 1024 1024"> <title>youtube</title> <path class="path1" d="M512 117.76c-503.194 0-512 44.749-512 394.24s8.806 394.24 512 394.24 512-44.749 512-394.24-8.806-394.24-512-394.24zM676.096 529.101l-229.888 107.315c-20.122 9.318-36.608-1.126-36.608-23.347v-202.138c0-22.17 16.486-32.666 36.608-23.347l229.888 107.315c20.122 9.421 20.122 24.781 0 34.202z"></path> </symbol> <symbol id="icon-mail" viewBox="0 0 1024 1024"> <title>mail</title> <path class="path1" d="M80.589 270.643c24.986 13.414 371.098 199.373 384 206.285s29.594 10.189 46.387 10.189c16.794 0 33.485-3.277 46.387-10.189s359.014-192.87 384-206.285c25.037-13.466 48.691-65.843 2.765-65.843h-866.253c-45.926 0-22.272 52.378 2.714 65.843zM952.986 383.437c-28.416 14.797-378.214 197.069-395.622 206.182s-29.594 10.189-46.387 10.189-28.979-1.075-46.387-10.189-365.21-191.437-393.626-206.234c-19.968-10.445-19.763 1.792-19.763 11.213s0 373.402 0 373.402c0 21.504 28.979 51.2 51.2 51.2h819.2c22.221 0 51.2-29.696 51.2-51.2 0 0 0-363.93 0-373.35s0.205-21.658-19.814-11.213z"></path> </symbol> <symbol id="icon-spotify" viewBox="0 0 1024 1024"> <title>spotify</title> <path class="path1" d="M512 61.44c-248.883 0-450.56 201.626-450.56 450.56 0 248.781 201.677 450.56 450.56 450.56 248.934 0 450.509-201.728 450.509-450.56 0-248.883-201.523-450.56-450.509-450.56zM690.074 742.502c-8.858 0-15.053-3.379-21.555-7.322-60.877-36.915-136.294-56.269-218.010-56.269-41.677 0-86.682 4.966-133.632 14.592l-5.734 1.434c-5.939 1.434-12.032 3.021-16.691 3.021-18.995 0-33.843-14.746-33.843-33.587 0-19.098 10.752-32.614 28.774-35.994 56.115-12.8 108.954-19.046 161.382-19.046 94.976 0 179.866 22.016 252.467 65.485 12.442 7.27 20.275 15.667 20.275 34.202-0.051 18.483-15.002 33.485-33.434 33.485zM736.819 611.379c-10.598 0-17.562-4.045-23.706-7.629-109.722-65.075-273.050-86.682-407.603-50.842-2.253 0.666-4.301 1.28-6.144 1.894-5.069 1.587-9.779 3.174-16.435 3.174-22.118 0-40.090-18.074-40.090-40.346 0-21.453 11.213-36.454 31.437-42.189 51.866-14.234 100.557-23.654 170.65-23.654 113.254 0 223.078 28.416 309.146 79.923 15.667 8.96 22.784 21.197 22.784 39.475 0 22.221-17.971 40.192-40.038 40.192zM789.862 461.875c-9.984 0-16.128-2.406-25.344-7.373-74.394-44.646-190.464-71.219-310.733-71.219-62.669 0-119.603 6.912-169.267 20.326-1.69 0.41-3.277 0.87-5.018 1.382-5.274 1.587-11.878 3.482-18.688 3.482-26.419 0-47.053-20.89-47.053-47.565 0-23.194 13.005-40.909 34.816-47.36 59.955-17.715 128.973-26.675 205.107-26.675 137.114 0 267.571 30.464 357.939 83.507 16.998 9.677 25.344 24.32 25.344 44.646 0 26.266-20.685 46.848-47.104 46.848z"></path> </symbol> <symbol id="icon-lastfm" viewBox="0 0 315 315"> <title>lastfm</title> <path class="path1" d="M264.467 135.355c-2.688-0.92-5.289-1.773-7.787-2.594C236.855 126.26 230 123.449 230 112.41 c0-9.572 6.799-16.26 16.533-16.26c7.986 0 13.502 3.307 19.039 11.41c2.156 3.158 6.348 4.188 9.721 2.389l19.148-10.205 c1.762-0.938 3.076-2.541 3.652-4.453c0.576-1.91 0.367-3.973-0.582-5.729c-11.123-20.596-27.912-31.037-49.9-31.037 c-16.592 0-30.648 5.227-40.654 15.117c-9.918 9.803-15.16 23.453-15.16 39.471c0 33.607 21.297 47.508 58.063 60.156 c21.045 7.311 25.965 10.137 25.965 21.121c0 13.578-11.727 23.434-27.885 23.434c-0.486 0-0.98-0.008-1.48-0.025 c-17.377-0.607-22.725-9.088-30.789-28.297c-12.947-30.814-28.082-67.734-29.205-70.543c-0.012-0.031-0.025-0.064-0.037-0.096 c-16.416-39.535-49.057-62.209-89.555-62.209C43.457 56.654 0 101.9 0 157.518c0 55.598 43.457 100.828 96.873 100.828 c29.217 0 56.559-13.49 75.016-37.014c1.674-2.133 2.064-5.004 1.025-7.508l-11.541-27.781c-1.125-2.711-3.729-4.514-6.66-4.619 c-2.945-0.105-5.654 1.512-6.971 4.135c-9.977 19.9-29.469 32.262-50.869 32.262c-31.658 0-57.414-27.053-57.414-60.303 c0-33.26 25.756-60.32 57.414-60.32c23.029 0 44.1 14.273 52.432 35.516c0.023 0.055 0.045 0.111 0.068 0.166l28.574 67.982 l3.293 7.617c13.811 33.602 34.273 48.652 66.359 48.797h0.133c38.348 0 67.268-26.699 67.268-62.103 C315 159.674 295.66 145.965 264.467 135.355z"></path> </symbol> <symbol id="icon-instagram" viewBox="0 0 1024 1024"> <title>instagram</title> <path class="path1" d="M870.4 51.2h-716.8c-56.32 0-102.4 46.080-102.4 102.4v716.8c0 56.371 46.080 102.4 102.4 102.4h716.8c56.32 0 102.4-46.029 102.4-102.4v-716.8c0-56.32-46.080-102.4-102.4-102.4zM511.181 794.778c156.621 0 283.546-127.027 283.546-283.597 0-17.306-2.202-33.997-5.274-50.381h80.947v369.459c0 19.558-15.872 35.328-35.482 35.328h-645.837c-19.61 0-35.482-15.77-35.482-35.328v-369.459h79.309c-3.123 16.384-5.325 33.075-5.325 50.381 0 156.621 127.027 283.597 283.597 283.597zM333.978 511.181c0-97.894 79.36-177.203 177.254-177.203 97.843 0 177.254 79.309 177.254 177.203s-79.411 177.254-177.254 177.254c-97.946 0-177.254-79.36-177.254-177.254zM834.918 307.2h-82.688c-19.558 0-35.43-15.974-35.43-35.43v-82.79c0-19.558 15.872-35.379 35.379-35.379h82.688c19.661 0 35.533 15.821 35.533 35.379v82.739c0 19.507-15.872 35.482-35.482 35.482z"></path> </symbol>
1 <symbol id="icon-linkedin" viewBox="0 0 1024 1024"> <title>linkedin</title> <path class="path1" d="M256 153.6c0 54.374-36.352 101.171-102.451 101.171-62.208 0-102.349-44.134-102.349-98.509 0-55.808 38.912-105.062 102.4-105.062s101.171 46.592 102.4 102.4zM51.2 972.8v-665.6h204.8v665.6h-204.8z"></path> <path class="path2" d="M358.4 534.733c0-79.104-2.611-145.203-5.222-202.291h184.013l9.114 88.218h3.891c25.907-41.523 89.395-102.4 195.686-102.4 129.638 0 226.918 86.784 226.918 273.51v381.030h-204.8v-351.283c0-81.613-31.078-143.872-102.4-143.872-54.374 0-81.613 44.032-95.898 80.333-5.222 13.005-6.502 31.13-6.502 49.306v365.517h-204.8v-438.067z"></path> </symbol> <symbol id="icon-google" viewBox="0 0 1024 1024"> <title>google</title> <path class="path1" d="M522.2 438.8v175.6h290.4c-11.8 75.4-87.8 220.8-290.4 220.8-174.8 0-317.4-144.8-317.4-323.2s142.6-323.2 317.4-323.2c99.4 0 166 42.4 204 79l139-133.8c-89.2-83.6-204.8-134-343-134-283 0-512 229-512 512s229 512 512 512c295.4 0 491.6-207.8 491.6-500.2 0-33.6-3.6-59.2-8-84.8l-483.6-0.2z"></path> </symbol> <symbol id="icon-google-plus" viewBox="0 0 1317 1024"> <title>google-plus</title> <path class="path1" d="M821.143 521.714q0 118.857-49.714 211.714t-141.714 145.143-210.857 52.286q-85.143 0-162.857-33.143t-133.714-89.143-89.143-133.714-33.143-162.857 33.143-162.857 89.143-133.714 133.714-89.143 162.857-33.143q163.429 0 280.571 109.714l-113.714 109.143q-66.857-64.571-166.857-64.571-70.286 0-130 35.429t-94.571 96.286-34.857 132.857 34.857 132.857 94.571 96.286 130 35.429q47.429 0 87.143-13.143t65.429-32.857 44.857-44.857 28-47.429 12.286-42.286h-237.714v-144h395.429q6.857 36 6.857 69.714zM1316.571 452v120h-119.429v119.429h-120v-119.429h-119.429v-120h119.429v-119.429h120v119.429h119.429z"></path> </symbol> <symbol id="icon-pinterest" viewBox="0 0 1024 1024"> <title>pinterest</title> <path class="path1" d="M512 68.4c-245 0-443.6 198.6-443.6 443.6 0 188 117 348.4 282 413-3.8-35-7.4-89 1.6-127.2 8-34.6 52-220.4 52-220.4s-13.2-26.6-13.2-65.8c0-61.6 35.8-107.8 80.2-107.8 37.8 0 56.2 28.4 56.2 62.4 0 38-24.2 95-36.8 147.6-10.6 44.2 22 80.2 65.6 80.2 78.8 0 139.4-83.2 139.4-203.2 0-106.2-76.4-180.4-185.2-180.4-126.2 0-200.2 94.6-200.2 192.6 0 38.2 14.6 79 33 101.2 3.6 4.4 4.2 8.2 3 12.8-3.4 14-10.8 44.2-12.4 50.4-2 8.2-6.4 9.8-14.8 6-55.4-25.8-90-106.8-90-171.8 0-140 101.6-268.4 293-268.4 153.8 0 273.4 109.6 273.4 256.2 0 152.8-96.4 276-230.2 276-45 0-87.2-23.4-101.6-51 0 0-22.2 84.6-27.6 105.4-10 38.6-37 86.8-55.2 116.2 41.6 12.8 85.6 19.8 131.4 19.8 245 0 443.6-198.6 443.6-443.6 0-245.2-198.6-443.8-443.6-443.8z"></path> </symbol> <symbol id="icon-medium" viewBox="0 0 179.2 179.2"> <title>medium</title> <path transform="scale(0.1,-0.1) translate(0,-1536)" d="M597 1115v-1173q0 -25 -12.5 -42.5t-36.5 -17.5q-17 0 -33 8l-465 233q-21 10 -35.5 33.5t-14.5 46.5v1140q0 20 10 34t29 14q14 0 44 -15l511 -256q3 -3 3 -5zM661 1014l534 -866l-534 266v600zM1792 996v-1054q0 -25 -14 -40.5t-38 -15.5t-47 13l-441 220zM1789 1116 q0 -3 -256.5 -419.5t-300.5 -487.5l-390 634l324 527q17 28 52 28q14 0 26 -6l541 -270q4 -2 4 -6z" /> </symbol> <symbol id="icon-vimeo" viewBox="0 0 21 21"> <title>vimeo</title> <path d="M17.811,2.018c2.017,0.053,3.026,1.198,3.036,3.438c0,0.147-0.005,0.3-0.013,0.457c-0.089,1.899-1.502,4.486-4.245,7.76 c-2.829,3.43-5.229,5.147-7.2,5.156c-1.226,0-2.244-1.05-3.061-3.151l-0.858-2.88L4.622,9.922C3.997,7.838,3.329,6.798,2.616,6.798 c-0.156,0-0.697,0.304-1.626,0.91L0,6.537l1.536-1.276l1.511-1.263C4.4,2.914,5.429,2.328,6.135,2.241 c0.094-0.01,0.188-0.013,0.284-0.013c1.449,0,2.354,1.041,2.709,3.124C9.326,6.54,9.49,7.506,9.623,8.248 C9.752,8.992,9.86,9.51,9.946,9.805c0.479,1.97,0.995,2.96,1.55,2.968c0.426,0,1.082-0.642,1.968-1.926 c0.866-1.319,1.332-2.296,1.392-2.932c0.019-0.129,0.026-0.25,0.026-0.362c0-0.861-0.474-1.29-1.418-1.29 c-0.479,0-0.99,0.102-1.537,0.299c0.98-3.021,2.864-4.534,5.65-4.544C17.655,2.018,17.732,2.018,17.811,2.018z"/> </symbol> <symbol id="icon-stackoverflow" viewBox="0 0 878 1024"> <title>stackoverflow</title> <path class="path1" d="M736.571 932.571h-638.857v-274.286h-91.429v365.714h821.714v-365.714h-91.429v274.286zM198.286 633.143l18.857-89.714 447.429 94.286-18.857 89.143zM257.143 419.429l38.286-83.429 414.286 193.714-38.286 82.857zM372 216l58.286-70.286 350.857 293.143-58.286 70.286zM598.857 0l272.571 366.286-73.143 54.857-272.571-366.286zM188.571 840.571v-90.857h457.143v90.857h-457.143z"></path> </symbol> <symbol id="icon-reddit" viewBox="0 0 1024 1024"> <title>reddit</title> <path class="path1" d="M1024 483.429q0 33.143-16.857 60.286t-45.429 41.429q6.857 26.286 6.857 54.857 0 88.571-60.857 164t-166 119.143-228.571 43.714-228.286-43.714-165.714-119.143-60.857-164q0-26.857 6.286-53.714-29.143-14.286-46.857-42t-17.714-60.857q0-46.857 33.143-80.286t80.571-33.429q48.571 0 82.857 36 124.571-86.857 294.286-92.571l66.286-297.714q1.714-7.429 8.571-12t14.857-2.857l210.857 46.286q10.286-21.143 30.857-34t45.143-12.857q35.429 0 60.571 24.857t25.143 60.286-25.143 60.571-60.571 25.143-60.286-24.857-24.857-60.286l-190.857-42.286-59.429 269.714q171.429 5.143 296.571 91.429 33.143-34.857 81.714-34.857 47.429 0 80.571 33.429t33.143 80.286zM238.857 597.143q0 35.429 24.857 60.571t60.286 25.143 60.571-25.143 25.143-60.571-25.143-60.286-60.571-24.857q-34.857 0-60 25.143t-25.143 60zM701.714 800q6.286-6.286 6.286-14.857t-6.28
16-14.857q-5.714-5.714-14.286-5.714t-14.857 5.714q-23.429 24-69.143 35.429t-91.429 11.429-91.429-11.429-69.143-35.429q-6.286-5.714-14.857-5.714t-14.286 5.714q-6.286 5.714-6.286 14.571t6.286 15.143q24.571 24.571 67.714 38.857t70 16.857 52 2.571 52-2.571 70-16.857 67.714-38.857zM700 682.857q35.429 0 60.286-25.143t24.857-60.571q0-34.857-25.143-60t-60-25.143q-35.429 0-60.571 24.857t-25.143 60.286 25.143 60.571 60.571 25.143z"></path> </symbol> <symbol id="icon-quora" viewBox="0 0 76 76"> <title>quora</title> <path class="path1" d="M67.9,59.1c0,0-0.4,5.3-5.2,5.3c-3.7,0-6.3-2.8-8.7-6.5c6.8-5.9,11.1-14.7,11.1-24.6C65.1,15.4,51.1,1,33.8,1 S2.6,15.4,2.6,33.2s14,32.2,31.3,32.2c3.1,0,6.2-0.5,9-1.4C46.5,69.8,51,75,58.2,75c14.6,0,15.2-15.9,15.2-15.9L67.9,59.1 L67.9,59.1z M33.8,60.2c-10.1,0-18.2-12.1-18.2-26.9S23.8,6.3,33.8,6.3s18.2,12.1,18.2,26.9c0,5.9-1.3,11.4-3.5,15.8 c-2.5-3.5-5.4-6.5-9.7-7.5c-7.5-1.7-14,1.7-16.1,3.4l1.9,4c0,0,2-1.1,6.8,0c3.1,0.7,5.4,4.9,8.1,9.8C37.9,59.7,35.9,60.2,33.8,60.2 z"></path> </symbol> <symbol id="icon-microphone" viewBox="-8 -4 34 37"> <title>quora</title> <path clip-rule="evenodd" d="M10.8,22.8V26h5v2h-5h-3h-5v-2h5v-3.2C3.4,22.2,0,18.7,0,14.4v-3 c0-0.1,0-0.3,0-0.4h2.8
1c0,0.3-0.1,0.6-0.1,0.9V14c0,3.3,2.9,6,6.5,6c3.6,0,6.5-2.7,6.5-6v-2.1c0-0.3,0-0.6-0.1-0.9h2.8 c0,0.1,0,0.3,0,0.4v3C18.6,18.7,15.2,22.2,10.8,22.8z M9.3,18c-2.5,0-4.5-2-4.5-4.5v-9C4.8,2,6.8,0,9.3,0s4.5,2,4.5,4.5v9 C13.8,16,11.8,18,9.3,18z" fill="#0D0D0D" fill-rule="evenodd"/> </symbol> </defs> </svg> <footer class="footer-main"> <div class="wrapper-normal"> <div class="footer-content"> <div class="footer-business"> <h4>Navigation</h4> <ul> <li><a href="/">Home</a></li> <li><a href="/portfolio">Portfolio</a></li> <li><a href="/blog">Blog</a></li> <li><a href="/shop-automation">Shop Automation</a></li> <li><a href="https://calendly.com/me-orestisz/20-minute-meeting">Consultation</a></li> <li><a href="/contact">Contact</a></li> </ul> </div> <div class="footer-contact"> <h4>Contact</h4> <p>Email: <a href="mailto:[email protected]">[email protected]</a></p> <p>Zambounis Technology<br> Haselrain 1<br> 4103 Bottmingen<br> Switzerland</p> </div> <div class="footer-legal"> <h4>Legal</h4> <ul> <li><a href="/privacy-policy">Privacy Policy</a></li> <li><a href="/terms">Terms of Service</a></li> <li><a href="/impressum">Impressum</a></li> </ul> </div> </div> <div class="footer-bottom"> © 2026 Orestis Zambounis </div> </div> </footer> </div> <!-- Header anchor links script --> 
1<script> document.addEventListener('DOMContentLoaded', function() { const headers = document.querySelectorAll('.post-content h2[id], .post-content h3[id]'); const isMobile = 'ontouchstart' in window || navigator.maxTouchPoints > 0; headers.forEach(function(header) { header.style.cursor = 'pointer'; const anchor = document.createElement('a'); anchor.href = '#' + header.id; anchor.className = 'header-anchor'; anchor.textContent = '#'; anchor.style.cssText = 'position: absolute; left: -25px; color: #ccc; text-decoration: none; opacity: 0; transition: opacity 0.2s;'; header.style.position = 'relative'; header.insertBefore(anchor, header.firstChild); if (!isMobile) { header.addEventListener('mouseenter', function() { anchor.style.opacity = '1'; }); header.addEventListener('mouseleave', function() { anchor.style.opacity = '0'; }); } header.addEventListener('click', function(e) { e.preventDefault(); const url = window.location.origin + window.location.pathname + '#' + header.id; history.pushState(null, null, '#' + header.id); navigator.clipboard.writeText(url).catch(function(err) { console.error('Failed to copy: ', err); }); }); }); }); </script>
1 </body> </html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.