<!doctype html><html itemscope class=system lang=en-us itemtype=http://schema.org/WebPage><head><meta name=generator content="Hugo 0.143.1"><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=5"><meta name=theme-name content="sharpieshadow"><link rel="shortcut icon" href=/images/favicon_hu_e6d69ea7eccfe2fd.png type=image/x-icon><link rel=icon href=/images/favicon_hu_e6d69ea7eccfe2fd.png type=image/x-icon><link rel=icon type=image/png sizes=48x48 href=/images/favicon_hu_a60986bc8c41097.png><link rel=icon type=image/png sizes=96x96 href=/images/favicon_hu_e6d69ea7eccfe2fd.png><link rel=apple-touch-icon sizes=144x144 href=/images/favicon_hu_45c2b78a7fdf682d.png><link rel=manifest href=/manifest.webmanifest><meta name=msapplication-TileColor content="#ddd"><meta name=theme-color content="#ffffff"><base href=https://www.hishamkhalifa.com/><title>Hisham Khalifa</title>
<meta name=keywords content="Hisham Khalifa,ceo,cto,maker,developer,entrepreneur,startup,tech,business"><meta name=description content="Hisham Khalifa"><meta name=author content="Hisham Khalifa"><meta property="og:title" content="Hisham Khalifa"><meta property="og:description" content="Hisham Khalifa"><meta property="og:type" content="website"><meta property="og:url" content="https://www.hishamkhalifa.com/"><meta name=twitter:title content="Hisham Khalifa"><meta name=twitter:description content="Hisham Khalifa"><meta name=twitter:site content="@hi5hamk"><meta name=twitter:creator content="@Hisham Khalifa"><script defer src=https://analytics.hakari.app/script.js data-website-id=ab66f579-f492-41f6-b645-017d0d46211a></script><script>let indexURL="https://www.hishamkhalifa.com/searchindex.json",includeSectionsInSearch=["work","blog"],search_no_results="No results for",search_initial_message="Type something to search..."</script><meta http-equiv=x-dns-prefetch-control content="on"><link rel=preconnect href=https://use.fontawesome.com crossorigin><link rel=preconnect href=//cdnjs.cloudflare.com><link rel=preconnect href=//www.googletagmanager.com><link rel=preconnect href=//www.google-analytics.com><link rel=dns-prefetch href=https://use.fontawesome.com><link rel=dns-prefetch href=//ajax.googleapis.com><link rel=dns-prefetch href=//cdnjs.cloudflare.com><link rel=dns-prefetch href=//www.googletagmanager.com><link rel=dns-prefetch href=//www.google-analytics.com><link rel=dns-prefetch href=//fonts.googleapis.com><link rel=dns-prefetch href=//connect.facebook.net><link rel=dns-prefetch href=//platform.linkedin.com><link rel=dns-prefetch href=//platform.twitter.com><link rel=preconnect href=https://fonts.googleapis.com><link rel=preconnect href=https://fonts.gstatic.com crossorigin><script>(function(){const e=document.createElement("link");e.href="https://fonts.googleapis.com/css2?family=Fira Code&family=IBM Plex Sans&display=swap",e.type="text/css",e.rel="stylesheet",document.head.appendChild(e)})()</script><link href=/css/style.min.d1048be45834e58bdbdfed3e03ba54e568d8e18166188a33ccead4da7fa7b4c6.css integrity="sha256-0QSL5Fg05Yvb3+0+A7pU5WjY4YFmGIozzOrU2n+ntMY=" rel=stylesheet><link defer async rel=stylesheet href=/css/style-lazy.min.9e7e035d2f064fe004383f2ffc11a8f2966ef7b51c5fb2fac926e35c0061b5cf.css integrity="sha256-nn4DXS8GT+AEOD8v/BGo8pZu97UcX7L6ySbjXABhtc8=" media=print onload='this.media="all",this.onload=null'></head><body><div class=search-modal aria-hidden=true style=--color-primary:#121212><div data-target=close-search-modal class=search-modal-overlay></div><div class=search-wrapper data-image=true data-description=true data-tags=true data-categories=false><div class=search-wrapper-header><label for=search-modal-input style=margin-top:-1px><span class=sr-only>search icon</span>
<svg viewBox="0 0 512 512" height="18" width="18" class="search-icon" data-type="search"><path fill="currentcolor" d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8.0 45.3s-32.8 12.5-45.3.0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9.0 208S93.1.0 208 0 416 93.1 416 208zM208 352a144 144 0 100-288 144 144 0 100 288z"/></svg>
<svg viewBox="0 0 512 512" height="18" width="18" class="search-reset" data-type="reset"><path fill="currentcolor" d="M256 512A256 256 0 10256 0a256 256 0 100 512zM175 175c9.4-9.4 24.6-9.4 33.9.0l47 47 47-47c9.4-9.4 24.6-9.4 33.9.0s9.4 24.6.0 33.9l-47 47 47 47c9.4 9.4 9.4 24.6.0 33.9s-24.6 9.4-33.9.0l-47-47-47 47c-9.4 9.4-24.6 9.4-33.9.0s-9.4-24.6.0-33.9l47-47-47-47c-9.4-9.4-9.4-24.6.0-33.9z"/></svg>
</label><input id=search-modal-input type=text data-search-input autocomplete=off aria-label=Search placeholder="Search projects and blog..."></div><div class=search-wrapper-body><div class=search-result data-search-result></div><span class=search-result-empty>Type something to search...</span></div><div class=search-wrapper-footer><span><kbd><svg width="14" height="14" fill="currentcolor" viewBox="0 0 16 16"><path d="M3.204 11h9.592L8 5.519 3.204 11zm-.753-.659 4.796-5.48a1 1 0 011.506.0l4.796 5.48c.566.647.106 1.659-.753 1.659H3.204a1 1 0 01-.753-1.659z"/></svg>
</kbd><kbd><svg width="14" height="14" fill="currentcolor" style="margin-top:1px" viewBox="0 0 16 16"><path d="M3.204 5h9.592L8 10.481 3.204 5zm-.753.659 4.796 5.48a1 1 0 001.506.0l4.796-5.48c.566-.647.106-1.659-.753-1.659H3.204a1 1 0 00-.753 1.659z"/></svg>
</kbd>to navigate
</span><span><kbd><svg width="12" height="12" fill="currentcolor" style="display:inline-block" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M14.5 1.5a.5.5.0 01.5.5v4.8a2.5 2.5.0 01-2.5 2.5H2.707l3.347 3.346a.5.5.0 01-.708.708l-4.2-4.2a.5.5.0 010-.708l4-4a.5.5.0 11.708.708L2.707 8.3H12.5A1.5 1.5.0 0014 6.8V2a.5.5.0 01.5-.5z"/></svg>
</kbd>to select
</span><span class=search-result-info></span>
<span data-target=close-search-modal><kbd>ESC</kbd> to close</span></div></div></div><main><section class="section py-1"><div class=container><div class="flex justify-center mb-8"><img class="mt-21 w-16 h-16 rounded-full object-cover shadow-lg" src=/images/hk3.png alt="Profile Image" loading=lazy></div><div class="flex flex-col items-center justify-center gap-6 text-center"><h1 class="text-base font-bold mb-0 pt-0 whitespace-nowrap">HISHAM ABDULRAHMAN KHALIFA</h1><p class="mb-0 text-base [&_a]:underline lg:pl-25 lg:pr-25 lg:mb-4">Co-founder of <a href=https://zido.app target=_blank>Zido</a>. Co-founded <a href=https://exchangewire.com target=_blank>PikslMe</a> (acquired by ExchangeWire). Built <a href=https://tabeo.co.uk target=_blank>Tabeo&rsquo;s</a> BNPL healthcare platform ($370M+ raised). Developed macOS apps at <a href=https://www.binarybakery.com target=_blank>Binary Bakery</a>. Mentor at <a href=https://weekend.startupbahrain.com/weekend target=_blank>StartupWeekend</a>. Always building, always learning. Some projects succeed, some don&rsquo;t, but every step counts.</p></div></div></section><section class="section py-1 r sticky top-0 z-[100] bg-body dark:bg-darkmode-body"><div class=container><div class="flex flex-wrap items-center justify-center transition-all duration-200" id=nav-content><div class="window-frame inline-flex mt-4"><div class="flex items-center bg-body dark:bg-darkmode-body px-2"><a href=/blog class="hover:bg-primary hover:text-black transition-colors duration-200 px-2 py-1 font-mono text-sm">[blog]
</a><a href=/work class="hover:bg-primary hover:text-black transition-colors duration-200 px-2 py-1 font-mono text-sm">[work]
</a><a href=/about class="hover:bg-primary hover:text-black transition-colors duration-200 px-2 py-1 font-mono text-sm">[about]
</a><a href=/contact class="hover:bg-primary hover:text-black transition-colors duration-200 px-2 py-1 font-mono text-sm">[contact]
</a><button aria-label=search class="hover:bg-primary hover:text-black transition-colors duration-200 px-3 py-1" data-target=search-modal>
<i class="fa fa-search text-sm"></i></button></div></div></div></div></section><div class="container text-center mt-8"><hr class="w-[250px] mx-auto my-4"><p class="text-sm mb-2">Subscribe to get future posts via email (or grab the
<a href=/blog/index.xml class="underline hover:bg-primary hover:text-black transition-colors duration-200">RSS feed</a>)</p><div class="max-w-md mx-auto"><form action=https://formspree.io/f/mjkgqled method=POST class="window-frame inline-flex border font-mono text-sm"><input type=email name=email placeholder="Type your email..." class="text-sm bg-transparent px-3 py-1 focus:outline-none w-64" required>
<button type=submit class="hover:bg-primary hover:text-black transition-colors duration-200 px-3 py-1">
[subscribe]</button></form></div></div><script>document.addEventListener("DOMContentLoaded",function(){const t=document.querySelector(".header"),n=document.querySelector("#nav-content"),s=n.closest("section"),e=document.querySelector("#nav-logo");window.addEventListener("scroll",function(){const n=s.getBoundingClientRect().top;if(n<50){const s=Math.max(0,n/50);t.style.opacity=s,n<=0?e.classList.remove("opacity-0","w-0"):e.classList.add("opacity-0","w-0")}else t.style.opacity=1,e.classList.add("opacity-0","w-0")})})</script><section class=section-sm><div class=container><div class="flex flex-col lg:flex-row gap-6"><div class=lg:w-6/6><div><div class="transform transition-all duration-200 hover:scale-[1.02] mb-10"><a href=/blog/2025-02-25-powering-up-a-commodore-vic-20/ class="block h-full"><div class="window-frame h-full flex flex-col"><div class=window-header><div class="flex justify-between items-center"><div class=window-title>~/blog/2025-02-25-powering-up-a-commo...</div><div class="text-sm opacity-70 font-mono">2025-03-12</div></div></div><div class=window-tags-bar><div class="flex flex-wrap gap-2 text-sm font-mono"><span class=opacity-70>#retrocomputing</span>
<span class=opacity-70>#commodore</span>
<span class=opacity-70>#vic-20</span>
<span class=opacity-70>#commodore-vic-20</span>
<span class=opacity-70>#home-computers</span>
<span class=opacity-70>#restoration</span></div></div><div class="window-content flex-grow flex flex-col"><style>.gallery-container{width:100%;margin:2rem 0}.gallery-container.card-mode{margin:0}.gallery-filmstrip{display:flex;overflow-x:auto;gap:.5rem;padding:.5rem;scrollbar-width:thin;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.gallery-filmstrip::-webkit-scrollbar{height:6px}.gallery-filmstrip::-webkit-scrollbar-track{background:var(--scroll-track-color,#f1f1f1);border-radius:3px}.gallery-filmstrip::-webkit-scrollbar-thumb{background:var(--scroll-thumb-color,#888);border-radius:3px}.gallery-thumbnail{margin:0!important;flex:none;width:var(--thumbnail-width,150px);height:var(--thumbnail-height,100px);position:relative;cursor:pointer;border-radius:4px;overflow:hidden;transition:transform .2s}.gallery-thumbnail:focus-visible{outline:3px solid #007bff;outline-offset:2px}.card-mode .gallery-thumbnail{width:var(--card-thumbnail-width,120px);height:var(--card-thumbnail-height,80px)}.gallery-thumbnail:hover{transform:scale(1.05)}.gallery-thumbnail img,.gallery-thumbnail video{width:100%;height:100%;margin:0!important;object-fit:cover}.gallery-main{margin-top:1rem;position:relative;border-radius:8px;overflow:hidden;background:var(--gallery-bg,#f8f9fa);display:flex;justify-content:center;align-items:center;height:var(--main-image-height,600px)}.gallery-main img,.gallery-main video{width:100%;height:100%;object-fit:contain;max-height:var(--main-image-max-height,600px)}.gallery-video-wrapper{position:relative;width:100%;height:100%}.gallery-play-button{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:60px;height:60px;background:rgba(0,0,0,.7);border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background-color .2s}.gallery-play-button:hover{background:rgba(0,0,0,.9)}.gallery-play-button::before{content:'';width:0;height:0;border-style:solid;border-width:12px 0 12px 20px;border-color:transparent transparent transparent #fff;margin-left:4px}.gallery-thumbnail .gallery-play-button{width:30px;height:30px}.gallery-thumbnail .gallery-play-button::before{border-width:6px 0 6px 10px;margin-left:2px}.gallery-caption{padding:1rem;background:rgba(0,0,0,.85);color:#fff;position:absolute;bottom:0;left:0;right:0;font-size:.9rem}.gallery-selected{border:2px solid var(--selected-border-color,#5b5b5c);transform:scale(1.05)}.gallery-error{padding:1rem;color:#721c24;background-color:#f8d7da;border:1px solid #f5c6cb;border-radius:4px;margin:1rem 0}.fullscreen-overlay{display:none;position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.9);z-index:9999;cursor:zoom-out}.fullscreen-overlay.active{display:flex;justify-content:center;align-items:center}.fullscreen-image{max-width:95%;max-height:95vh;object-fit:contain}.gallery-main img{cursor:zoom-in}</style><div class="gallery-container card-mode" role=region aria-label="Media gallery"><div class=gallery-filmstrip role=listbox aria-label="Media thumbnails" tabindex=0><div class=gallery-thumbnail role=option aria-selected=false tabindex=0 data-type=image data-src=/images/gallery/blog/2025-02-25-powering-up-a-commodore-vic-20-gallery-2/1.jpg data-caption="The Commodore VIC-20, before clean up."><img src=/images/gallery/blog/2025-02-25-powering-up-a-commodore-vic-20-gallery-2/1.jpg alt="The Commodore VIC-20, before clean up." loading=eager></div><div class=gallery-thumbnail role=option aria-selected=false tabindex=0 data-type=image data-src=/images/gallery/blog/2025-02-25-powering-up-a-commodore-vic-20-gallery-2/2.jpg data-caption="Bill Shatner using his Captain Kirk charm to sell the VIC-20."><img src=/images/gallery/blog/2025-02-25-powering-up-a-commodore-vic-20-gallery-2/2.jpg alt="Bill Shatner using his Captain Kirk charm to sell the VIC-20." loading=eager></div><div class=gallery-thumbnail role=option aria-selected=false tabindex=0 data-type=image data-src=/images/gallery/blog/2025-02-25-powering-up-a-commodore-vic-20-gallery-2/3.jpg data-caption="The VIC-20 does a cameo appearance in John Wick."><img src=/images/gallery/blog/2025-02-25-powering-up-a-commodore-vic-20-gallery-2/3.jpg alt="The VIC-20 does a cameo appearance in John Wick." loading=eager></div></div></div><div class=fullscreen-overlay><img class=fullscreen-image src alt></div><h4 class=mb-2><span>Powering up a Commodore VIC-20</span></h4><p class="mb-6 flex-grow">The 1980s was a pretty amazing time to experience the early days of personal computing. Apple, Commodore, Atari, Sinclair, Amstrad, Texas Instruments, Radio Shack, MSX, and many more platforms were vying for a place in people&rsquo;s homes.</p><div class=mt-auto><span class="no-capitalize btn btn-outline-primary btn-sm hover:text-black inline-block">Read more</span></div></div></div></a></div><div class="transform transition-all duration-200 hover:scale-[1.02] mb-10"><a href=/blog/2024-01-26-yaduino-cyberdeck/ class="block h-full"><div class="window-frame h-full flex flex-col"><div class=window-header><div class="flex justify-between items-center"><div class=window-title>~/blog/2024-01-26-yaduino-cyberdeck.m...</div><div class="text-sm opacity-70 font-mono">2024-01-26</div></div></div><div class=window-tags-bar><div class="flex flex-wrap gap-2 text-sm font-mono"><span class=opacity-70>#hardware</span>
<span class=opacity-70>#open-source</span>
<span class=opacity-70>#iot</span>
<span class=opacity-70>#avr</span>
<span class=opacity-70>#microcontroller</span>
<span class=opacity-70>#electronics</span></div></div><div class="window-content flex-grow flex flex-col"><style>.gallery-container{width:100%;margin:2rem 0}.gallery-container.card-mode{margin:0}.gallery-filmstrip{display:flex;overflow-x:auto;gap:.5rem;padding:.5rem;scrollbar-width:thin;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.gallery-filmstrip::-webkit-scrollbar{height:6px}.gallery-filmstrip::-webkit-scrollbar-track{background:var(--scroll-track-color,#f1f1f1);border-radius:3px}.gallery-filmstrip::-webkit-scrollbar-thumb{background:var(--scroll-thumb-color,#888);border-radius:3px}.gallery-thumbnail{margin:0!important;flex:none;width:var(--thumbnail-width,150px);height:var(--thumbnail-height,100px);position:relative;cursor:pointer;border-radius:4px;overflow:hidden;transition:transform .2s}.gallery-thumbnail:focus-visible{outline:3px solid #007bff;outline-offset:2px}.card-mode .gallery-thumbnail{width:var(--card-thumbnail-width,120px);height:var(--card-thumbnail-height,80px)}.gallery-thumbnail:hover{transform:scale(1.05)}.gallery-thumbnail img,.gallery-thumbnail video{width:100%;height:100%;margin:0!important;object-fit:cover}.gallery-main{margin-top:1rem;position:relative;border-radius:8px;overflow:hidden;background:var(--gallery-bg,#f8f9fa);display:flex;justify-content:center;align-items:center;height:var(--main-image-height,600px)}.gallery-main img,.gallery-main video{width:100%;height:100%;object-fit:contain;max-height:var(--main-image-max-height,600px)}.gallery-video-wrapper{position:relative;width:100%;height:100%}.gallery-play-button{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:60px;height:60px;background:rgba(0,0,0,.7);border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background-color .2s}.gallery-play-button:hover{background:rgba(0,0,0,.9)}.gallery-play-button::before{content:'';width:0;height:0;border-style:solid;border-width:12px 0 12px 20px;border-color:transparent transparent transparent #fff;margin-left:4px}.gallery-thumbnail .gallery-play-button{width:30px;height:30px}.gallery-thumbnail .gallery-play-button::before{border-width:6px 0 6px 10px;margin-left:2px}.gallery-caption{padding:1rem;background:rgba(0,0,0,.85);color:#fff;position:absolute;bottom:0;left:0;right:0;font-size:.9rem}.gallery-selected{border:2px solid var(--selected-border-color,#5b5b5c);transform:scale(1.05)}.gallery-error{padding:1rem;color:#721c24;background-color:#f8d7da;border:1px solid #f5c6cb;border-radius:4px;margin:1rem 0}.fullscreen-overlay{display:none;position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.9);z-index:9999;cursor:zoom-out}.fullscreen-overlay.active{display:flex;justify-content:center;align-items:center}.fullscreen-image{max-width:95%;max-height:95vh;object-fit:contain}.gallery-main img{cursor:zoom-in}</style><div class="gallery-container card-mode" role=region aria-label="Media gallery"><div class=gallery-filmstrip role=listbox aria-label="Media thumbnails" tabindex=0><div class=gallery-thumbnail role=option aria-selected=false tabindex=0 data-type=image data-src=/images/gallery/blog/2024-01-26-yaduino-cyberdeck/1.png data-caption="If one is going to build a cyberdeck, you might as well make it look like a cyberdeck."><img src=/images/gallery/blog/2024-01-26-yaduino-cyberdeck/1.png alt="If one is going to build a cyberdeck, you might as well make it look like a cyberdeck." loading=eager></div><div class=gallery-thumbnail role=option aria-selected=false tabindex=0 data-type=video data-src=/images/gallery/blog/2024-01-26-yaduino-cyberdeck/2.mp4 data-caption="I have been told it has Mandalorian vibes."><div class=gallery-video-wrapper><video src=/images/gallery/blog/2024-01-26-yaduino-cyberdeck/2.mp4 poster=/images/gallery/blog/2024-01-26-yaduino-cyberdeck/2.png preload=metadata playsinline></video><div class=gallery-play-button role=button aria-label="Play video"></div></div></div></div></div><div class=fullscreen-overlay><img class=fullscreen-image src alt></div><h4 class=mb-2><span>Yaduino Cyberdeck</span></h4><p class="mb-6 flex-grow">This is based on my &ldquo;Yaduino&rdquo; Arduino Uno clone, my first MCU system design project using the good old Atmega328P. Thought I&rsquo;d do something fun and turn one of the boards into some sort of &ldquo;cyberdeck&rdquo; complete with net access courtesy of an ESP-8266. Wrote some quick and dirty code to manage menus and launch actions across three screens. Also has some nice text effects for good &ldquo;cyber&rdquo; measures.</p><div class=mt-auto><span class="no-capitalize btn btn-outline-primary btn-sm hover:text-black inline-block">Read more</span></div></div></div></a></div><div class="transform transition-all duration-200 hover:scale-[1.02] mb-10"><a href=/blog/2023-12-24-reflections-on-restoring-a-commodore-amiga-500-plus/ class="block h-full"><div class="window-frame h-full flex flex-col"><div class=window-header><div class="flex justify-between items-center"><div class=window-title>~/blog/2023-12-24-reflections-on-rest...</div><div class="text-sm opacity-70 font-mono">2023-12-24</div></div></div><div class=window-tags-bar><div class="flex flex-wrap gap-2 text-sm font-mono"><span class=opacity-70>#retrocomputing</span>
<span class=opacity-70>#restoration</span>
<span class=opacity-70>#Amiga 500+</span>
<span class=opacity-70>#vintage computers</span>
<span class=opacity-70>#Commodore</span></div></div><div class="window-content flex-grow flex flex-col"><style>.gallery-container{width:100%;margin:2rem 0}.gallery-container.card-mode{margin:0}.gallery-filmstrip{display:flex;overflow-x:auto;gap:.5rem;padding:.5rem;scrollbar-width:thin;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.gallery-filmstrip::-webkit-scrollbar{height:6px}.gallery-filmstrip::-webkit-scrollbar-track{background:var(--scroll-track-color,#f1f1f1);border-radius:3px}.gallery-filmstrip::-webkit-scrollbar-thumb{background:var(--scroll-thumb-color,#888);border-radius:3px}.gallery-thumbnail{margin:0!important;flex:none;width:var(--thumbnail-width,150px);height:var(--thumbnail-height,100px);position:relative;cursor:pointer;border-radius:4px;overflow:hidden;transition:transform .2s}.gallery-thumbnail:focus-visible{outline:3px solid #007bff;outline-offset:2px}.card-mode .gallery-thumbnail{width:var(--card-thumbnail-width,120px);height:var(--card-thumbnail-height,80px)}.gallery-thumbnail:hover{transform:scale(1.05)}.gallery-thumbnail img,.gallery-thumbnail video{width:100%;height:100%;margin:0!important;object-fit:cover}.gallery-main{margin-top:1rem;position:relative;border-radius:8px;overflow:hidden;background:var(--gallery-bg,#f8f9fa);display:flex;justify-content:center;align-items:center;height:var(--main-image-height,600px)}.gallery-main img,.gallery-main video{width:100%;height:100%;object-fit:contain;max-height:var(--main-image-max-height,600px)}.gallery-video-wrapper{position:relative;width:100%;height:100%}.gallery-play-button{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:60px;height:60px;background:rgba(0,0,0,.7);border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background-color .2s}.gallery-play-button:hover{background:rgba(0,0,0,.9)}.gallery-play-button::before{content:'';width:0;height:0;border-style:solid;border-width:12px 0 12px 20px;border-color:transparent transparent transparent #fff;margin-left:4px}.gallery-thumbnail .gallery-play-button{width:30px;height:30px}.gallery-thumbnail .gallery-play-button::before{border-width:6px 0 6px 10px;margin-left:2px}.gallery-caption{padding:1rem;background:rgba(0,0,0,.85);color:#fff;position:absolute;bottom:0;left:0;right:0;font-size:.9rem}.gallery-selected{border:2px solid var(--selected-border-color,#5b5b5c);transform:scale(1.05)}.gallery-error{padding:1rem;color:#721c24;background-color:#f8d7da;border:1px solid #f5c6cb;border-radius:4px;margin:1rem 0}.fullscreen-overlay{display:none;position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.9);z-index:9999;cursor:zoom-out}.fullscreen-overlay.active{display:flex;justify-content:center;align-items:center}.fullscreen-image{max-width:95%;max-height:95vh;object-fit:contain}.gallery-main img{cursor:zoom-in}</style><div class="gallery-container card-mode" role=region aria-label="Media gallery"><div class=gallery-filmstrip role=listbox aria-label="Media thumbnails" tabindex=0><div class=gallery-thumbnail role=option aria-selected=false tabindex=0 data-type=image data-src=/images/gallery/blog/2023-12-24-reflections-on-restoring-a-commodore-amiga-500-plus/1.webp data-caption="This Amiga 500+ is resilient."><img src=/images/gallery/blog/2023-12-24-reflections-on-restoring-a-commodore-amiga-500-plus/1.webp alt="This Amiga 500+ is resilient." loading=eager></div><div class=gallery-thumbnail role=option aria-selected=false tabindex=0 data-type=image data-src=/images/gallery/blog/2023-12-24-reflections-on-restoring-a-commodore-amiga-500-plus/2.webp data-caption="The corroded PCB track under the battery that needed tinning."><img src=/images/gallery/blog/2023-12-24-reflections-on-restoring-a-commodore-amiga-500-plus/2.webp alt="The corroded PCB track under the battery that needed tinning." loading=eager></div><div class=gallery-thumbnail role=option aria-selected=false tabindex=0 data-type=image data-src=/images/gallery/blog/2023-12-24-reflections-on-restoring-a-commodore-amiga-500-plus/3.png data-caption="In contrast, this particular board’s (an Amiga 1500 (2000), Rev 6) damage is caused by a Varta battery, which resulted in corroding the CPU and its socket since the battery’s innards crept into its area."><img src=/images/gallery/blog/2023-12-24-reflections-on-restoring-a-commodore-amiga-500-plus/3.png alt="In contrast, this particular board’s (an Amiga 1500 (2000), Rev 6) damage is caused by a Varta battery, which resulted in corroding the CPU and its socket since the battery’s innards crept into its area." loading=eager></div></div></div><div class=fullscreen-overlay><img class=fullscreen-image src alt></div><h4 class=mb-2><span>Reflections on restoring a Commodore Amiga 500 Plus</span></h4><p class="mb-6 flex-grow">As a hobby, I do occasional restorations of vintage computers and other electronics. Restoring vintage computers is my escape—like a mental jog that keeps burnout at bay. It&rsquo;s also a fantastic way to &ldquo;time travel&rdquo; and appreciate some brilliant engineering feats from the past.</p><div class=mt-auto><span class="no-capitalize btn btn-outline-primary btn-sm hover:text-black inline-block">Read more</span></div></div></div></a></div><div class="transform transition-all duration-200 hover:scale-[1.02] mb-10"><a href=/blog/2023-06-13-statetrooper-finite-state-machine/ class="block h-full"><div class="window-frame h-full flex flex-col"><div class=window-header><div class="flex justify-between items-center"><div class=window-title>~/blog/2023-06-13-statetrooper-finite...</div><div class="text-sm opacity-70 font-mono">2023-06-13</div></div></div><div class=window-tags-bar><div class="flex flex-wrap gap-2 text-sm font-mono"><span class=opacity-70>#go</span>
<span class=opacity-70>#fsm</span>
<span class=opacity-70>#finite state machine</span>
<span class=opacity-70>#programming</span>
<span class=opacity-70>#golang</span></div></div><div class="window-content flex-grow flex flex-col"><style>.gallery-container{width:100%;margin:2rem 0}.gallery-container.card-mode{margin:0}.gallery-filmstrip{display:flex;overflow-x:auto;gap:.5rem;padding:.5rem;scrollbar-width:thin;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.gallery-filmstrip::-webkit-scrollbar{height:6px}.gallery-filmstrip::-webkit-scrollbar-track{background:var(--scroll-track-color,#f1f1f1);border-radius:3px}.gallery-filmstrip::-webkit-scrollbar-thumb{background:var(--scroll-thumb-color,#888);border-radius:3px}.gallery-thumbnail{margin:0!important;flex:none;width:var(--thumbnail-width,150px);height:var(--thumbnail-height,100px);position:relative;cursor:pointer;border-radius:4px;overflow:hidden;transition:transform .2s}.gallery-thumbnail:focus-visible{outline:3px solid #007bff;outline-offset:2px}.card-mode .gallery-thumbnail{width:var(--card-thumbnail-width,120px);height:var(--card-thumbnail-height,80px)}.gallery-thumbnail:hover{transform:scale(1.05)}.gallery-thumbnail img,.gallery-thumbnail video{width:100%;height:100%;margin:0!important;object-fit:cover}.gallery-main{margin-top:1rem;position:relative;border-radius:8px;overflow:hidden;background:var(--gallery-bg,#f8f9fa);display:flex;justify-content:center;align-items:center;height:var(--main-image-height,600px)}.gallery-main img,.gallery-main video{width:100%;height:100%;object-fit:contain;max-height:var(--main-image-max-height,600px)}.gallery-video-wrapper{position:relative;width:100%;height:100%}.gallery-play-button{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:60px;height:60px;background:rgba(0,0,0,.7);border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background-color .2s}.gallery-play-button:hover{background:rgba(0,0,0,.9)}.gallery-play-button::before{content:'';width:0;height:0;border-style:solid;border-width:12px 0 12px 20px;border-color:transparent transparent transparent #fff;margin-left:4px}.gallery-thumbnail .gallery-play-button{width:30px;height:30px}.gallery-thumbnail .gallery-play-button::before{border-width:6px 0 6px 10px;margin-left:2px}.gallery-caption{padding:1rem;background:rgba(0,0,0,.85);color:#fff;position:absolute;bottom:0;left:0;right:0;font-size:.9rem}.gallery-selected{border:2px solid var(--selected-border-color,#5b5b5c);transform:scale(1.05)}.gallery-error{padding:1rem;color:#721c24;background-color:#f8d7da;border:1px solid #f5c6cb;border-radius:4px;margin:1rem 0}.fullscreen-overlay{display:none;position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.9);z-index:9999;cursor:zoom-out}.fullscreen-overlay.active{display:flex;justify-content:center;align-items:center}.fullscreen-image{max-width:95%;max-height:95vh;object-fit:contain}.gallery-main img{cursor:zoom-in}</style><div class="gallery-container card-mode" role=region aria-label="Media gallery"><div class=gallery-filmstrip role=listbox aria-label="Media thumbnails" tabindex=0><div class=gallery-thumbnail role=option aria-selected=false tabindex=0 data-type=image data-src=/images/gallery/blog/2023-06-13-statetrooper-finite-state-machine/1.png data-caption="Hacker News trending"><img src=/images/gallery/blog/2023-06-13-statetrooper-finite-state-machine/1.png alt="Hacker News trending" loading=eager></div><div class=gallery-thumbnail role=option aria-selected=false tabindex=0 data-type=image data-src=/images/gallery/blog/2023-06-13-statetrooper-finite-state-machine/2.png data-caption="StateTrooper logo"><img src=/images/gallery/blog/2023-06-13-statetrooper-finite-state-machine/2.png alt="StateTrooper logo" loading=eager></div><div class=gallery-thumbnail role=option aria-selected=false tabindex=0 data-type=image data-src=/images/gallery/blog/2023-06-13-statetrooper-finite-state-machine/3.png data-caption="Mermaid.js rules diagram"><img src=/images/gallery/blog/2023-06-13-statetrooper-finite-state-machine/3.png alt="Mermaid.js rules diagram" loading=eager></div><div class=gallery-thumbnail role=option aria-selected=false tabindex=0 data-type=image data-src=/images/gallery/blog/2023-06-13-statetrooper-finite-state-machine/4.png data-caption="Mermaid.js transition history diagram"><img src=/images/gallery/blog/2023-06-13-statetrooper-finite-state-machine/4.png alt="Mermaid.js transition history diagram" loading=eager></div></div></div><div class=fullscreen-overlay><img class=fullscreen-image src alt></div><h4 class=mb-2><span>StateTrooper - A finite state machine for Go</span></h4><p class="mb-6 flex-grow">Spent an evening getting rid of some repetitive state handling code in one of my Go projects. The result is StateTrooper, a finite state machine package.</p><div class=mt-auto><span class="no-capitalize btn btn-outline-primary btn-sm hover:text-black inline-block">Read more</span></div></div></div></a></div><div class="transform transition-all duration-200 hover:scale-[1.02] mb-10"><a href=/blog/2022-09-01-yaduino-mcu-board/ class="block h-full"><div class="window-frame h-full flex flex-col"><div class=window-header><div class="flex justify-between items-center"><div class=window-title>~/blog/2022-09-01-yaduino-mcu-board.m...</div><div class="text-sm opacity-70 font-mono">2022-09-01</div></div></div><div class=window-tags-bar><div class="flex flex-wrap gap-2 text-sm font-mono"><span class=opacity-70>#hardware</span>
<span class=opacity-70>#open-source</span>
<span class=opacity-70>#iot</span>
<span class=opacity-70>#avr</span>
<span class=opacity-70>#microcontroller</span>
<span class=opacity-70>#electronics</span></div></div><div class="window-content flex-grow flex flex-col"><style>.gallery-container{width:100%;margin:2rem 0}.gallery-container.card-mode{margin:0}.gallery-filmstrip{display:flex;overflow-x:auto;gap:.5rem;padding:.5rem;scrollbar-width:thin;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.gallery-filmstrip::-webkit-scrollbar{height:6px}.gallery-filmstrip::-webkit-scrollbar-track{background:var(--scroll-track-color,#f1f1f1);border-radius:3px}.gallery-filmstrip::-webkit-scrollbar-thumb{background:var(--scroll-thumb-color,#888);border-radius:3px}.gallery-thumbnail{margin:0!important;flex:none;width:var(--thumbnail-width,150px);height:var(--thumbnail-height,100px);position:relative;cursor:pointer;border-radius:4px;overflow:hidden;transition:transform .2s}.gallery-thumbnail:focus-visible{outline:3px solid #007bff;outline-offset:2px}.card-mode .gallery-thumbnail{width:var(--card-thumbnail-width,120px);height:var(--card-thumbnail-height,80px)}.gallery-thumbnail:hover{transform:scale(1.05)}.gallery-thumbnail img,.gallery-thumbnail video{width:100%;height:100%;margin:0!important;object-fit:cover}.gallery-main{margin-top:1rem;position:relative;border-radius:8px;overflow:hidden;background:var(--gallery-bg,#f8f9fa);display:flex;justify-content:center;align-items:center;height:var(--main-image-height,600px)}.gallery-main img,.gallery-main video{width:100%;height:100%;object-fit:contain;max-height:var(--main-image-max-height,600px)}.gallery-video-wrapper{position:relative;width:100%;height:100%}.gallery-play-button{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:60px;height:60px;background:rgba(0,0,0,.7);border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background-color .2s}.gallery-play-button:hover{background:rgba(0,0,0,.9)}.gallery-play-button::before{content:'';width:0;height:0;border-style:solid;border-width:12px 0 12px 20px;border-color:transparent transparent transparent #fff;margin-left:4px}.gallery-thumbnail .gallery-play-button{width:30px;height:30px}.gallery-thumbnail .gallery-play-button::before{border-width:6px 0 6px 10px;margin-left:2px}.gallery-caption{padding:1rem;background:rgba(0,0,0,.85);color:#fff;position:absolute;bottom:0;left:0;right:0;font-size:.9rem}.gallery-selected{border:2px solid var(--selected-border-color,#5b5b5c);transform:scale(1.05)}.gallery-error{padding:1rem;color:#721c24;background-color:#f8d7da;border:1px solid #f5c6cb;border-radius:4px;margin:1rem 0}.fullscreen-overlay{display:none;position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.9);z-index:9999;cursor:zoom-out}.fullscreen-overlay.active{display:flex;justify-content:center;align-items:center}.fullscreen-image{max-width:95%;max-height:95vh;object-fit:contain}.gallery-main img{cursor:zoom-in}</style><div class="gallery-container card-mode" role=region aria-label="Media gallery"><div class=gallery-filmstrip role=listbox aria-label="Media thumbnails" tabindex=0><div class=gallery-thumbnail role=option aria-selected=false tabindex=0 data-type=image data-src=/images/gallery/blog/2022-09-01-yaduino-mcu-board/1.png data-caption="Now that&amp;#39;s a good looking PCB, if I do say so myself."><img src=/images/gallery/blog/2022-09-01-yaduino-mcu-board/1.png alt="Now that&amp;#39;s a good looking PCB, if I do say so myself." loading=eager></div><div class=gallery-thumbnail role=option aria-selected=false tabindex=0 data-type=image data-src=/images/gallery/blog/2022-09-01-yaduino-mcu-board/2.png data-caption="Brownouts resolved with a 100uF bypass cap across the ESP-01 module supply pins."><img src=/images/gallery/blog/2022-09-01-yaduino-mcu-board/2.png alt="Brownouts resolved with a 100uF bypass cap across the ESP-01 module supply pins." loading=eager></div><div class=gallery-thumbnail role=option aria-selected=false tabindex=0 data-type=image data-src=/images/gallery/blog/2022-09-01-yaduino-mcu-board/3.png data-caption="An assembled Yaduino board, complete with a 1602A display and ESP-01 module plugged in. Note the red bodge wire to connect VCC on the charge management IC."><img src=/images/gallery/blog/2022-09-01-yaduino-mcu-board/3.png alt="An assembled Yaduino board, complete with a 1602A display and ESP-01 module plugged in. Note the red bodge wire to connect VCC on the charge management IC." loading=eager></div><div class=gallery-thumbnail role=option aria-selected=false tabindex=0 data-type=image data-src=/images/gallery/blog/2022-09-01-yaduino-mcu-board/4.png data-caption="A couple of assembled Yaduinos complete with custom 3D printed enclosures. One of them sports an OLED display instead of a 1602A."><img src=/images/gallery/blog/2022-09-01-yaduino-mcu-board/4.png alt="A couple of assembled Yaduinos complete with custom 3D printed enclosures. One of them sports an OLED display instead of a 1602A." loading=eager></div></div></div><div class=fullscreen-overlay><img class=fullscreen-image src alt></div><h4 class=mb-2><span>The Yaduino - An ATmega328P playground</span></h4><p class="mb-6 flex-grow">So this is my first stab at designing a microcontroller board. I call it Yaduino - Yet Another Arduino (the missing r is deliberate!) :)</p><div class=mt-auto><span class="no-capitalize btn btn-outline-primary btn-sm hover:text-black inline-block">Read more</span></div></div></div></a></div><div class="transform transition-all duration-200 hover:scale-[1.02] mb-10"><a href=/blog/2021-06-14-amiga-keyboard-to-usb/ class="block h-full"><div class="window-frame h-full flex flex-col"><div class=window-header><div class="flex justify-between items-center"><div class=window-title>~/blog/2021-06-14-amiga-keyboard-to-u...</div><div class="text-sm opacity-70 font-mono">2021-06-14</div></div></div><div class=window-tags-bar><div class="flex flex-wrap gap-2 text-sm font-mono"><span class=opacity-70>#hardware</span>
<span class=opacity-70>#amiga</span>
<span class=opacity-70>#keyboard</span>
<span class=opacity-70>#usb</span>
<span class=opacity-70>#teensy</span>
<span class=opacity-70>#retrocomputing</span>
<span class=opacity-70>#cdtv</span>
<span class=opacity-70>#synergy</span></div></div><div class="window-content flex-grow flex flex-col"><style>.gallery-container{width:100%;margin:2rem 0}.gallery-container.card-mode{margin:0}.gallery-filmstrip{display:flex;overflow-x:auto;gap:.5rem;padding:.5rem;scrollbar-width:thin;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.gallery-filmstrip::-webkit-scrollbar{height:6px}.gallery-filmstrip::-webkit-scrollbar-track{background:var(--scroll-track-color,#f1f1f1);border-radius:3px}.gallery-filmstrip::-webkit-scrollbar-thumb{background:var(--scroll-thumb-color,#888);border-radius:3px}.gallery-thumbnail{margin:0!important;flex:none;width:var(--thumbnail-width,150px);height:var(--thumbnail-height,100px);position:relative;cursor:pointer;border-radius:4px;overflow:hidden;transition:transform .2s}.gallery-thumbnail:focus-visible{outline:3px solid #007bff;outline-offset:2px}.card-mode .gallery-thumbnail{width:var(--card-thumbnail-width,120px);height:var(--card-thumbnail-height,80px)}.gallery-thumbnail:hover{transform:scale(1.05)}.gallery-thumbnail img,.gallery-thumbnail video{width:100%;height:100%;margin:0!important;object-fit:cover}.gallery-main{margin-top:1rem;position:relative;border-radius:8px;overflow:hidden;background:var(--gallery-bg,#f8f9fa);display:flex;justify-content:center;align-items:center;height:var(--main-image-height,600px)}.gallery-main img,.gallery-main video{width:100%;height:100%;object-fit:contain;max-height:var(--main-image-max-height,600px)}.gallery-video-wrapper{position:relative;width:100%;height:100%}.gallery-play-button{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:60px;height:60px;background:rgba(0,0,0,.7);border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background-color .2s}.gallery-play-button:hover{background:rgba(0,0,0,.9)}.gallery-play-button::before{content:'';width:0;height:0;border-style:solid;border-width:12px 0 12px 20px;border-color:transparent transparent transparent #fff;margin-left:4px}.gallery-thumbnail .gallery-play-button{width:30px;height:30px}.gallery-thumbnail .gallery-play-button::before{border-width:6px 0 6px 10px;margin-left:2px}.gallery-caption{padding:1rem;background:rgba(0,0,0,.85);color:#fff;position:absolute;bottom:0;left:0;right:0;font-size:.9rem}.gallery-selected{border:2px solid var(--selected-border-color,#5b5b5c);transform:scale(1.05)}.gallery-error{padding:1rem;color:#721c24;background-color:#f8d7da;border:1px solid #f5c6cb;border-radius:4px;margin:1rem 0}.fullscreen-overlay{display:none;position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.9);z-index:9999;cursor:zoom-out}.fullscreen-overlay.active{display:flex;justify-content:center;align-items:center}.fullscreen-image{max-width:95%;max-height:95vh;object-fit:contain}.gallery-main img{cursor:zoom-in}</style><div class="gallery-container card-mode" role=region aria-label="Media gallery"><div class=gallery-filmstrip role=listbox aria-label="Media thumbnails" tabindex=0><div class=gallery-thumbnail role=option aria-selected=false tabindex=0 data-type=image data-src=/images/gallery/blog/2021-06-14-amiga-keyboard-to-usb/1.jpg data-caption=1><img src=/images/gallery/blog/2021-06-14-amiga-keyboard-to-usb/1.jpg alt=1 loading=eager></div><div class=gallery-thumbnail role=option aria-selected=false tabindex=0 data-type=image data-src=/images/gallery/blog/2021-06-14-amiga-keyboard-to-usb/2.jpg data-caption=2><img src=/images/gallery/blog/2021-06-14-amiga-keyboard-to-usb/2.jpg alt=2 loading=eager></div><div class=gallery-thumbnail role=option aria-selected=false tabindex=0 data-type=image data-src=/images/gallery/blog/2021-06-14-amiga-keyboard-to-usb/3.jpg data-caption=3><img src=/images/gallery/blog/2021-06-14-amiga-keyboard-to-usb/3.jpg alt=3 loading=eager></div></div></div><div class=fullscreen-overlay><img class=fullscreen-image src alt></div><h4 class=mb-2><span>Converting Amiga keyboards to USB</span></h4><p class="mb-6 flex-grow">Wouldn&rsquo;t it be cool to use a big-box Amiga keyboard, such as one for the A3000 or even a CDTV keyboard, with a modern computer using USB? Maybe even use it with a next-generation Amiga, like a Pegasos II running AmigaOS 4.1 FE? Well, that&rsquo;s exactly what I did, and it works great. In fact, I&rsquo;ve currently plugged in a CDTV keyboard into my headless Synergy server&rsquo;s USB port, along with a mouse, to share a single mouse and keyboard across multiple machines; namely, an Amiga 1000 and a couple of Pegasos II systems running AmigaOS 4.1 FE and MorphOS.</p><div class=mt-auto><span class="no-capitalize btn btn-outline-primary btn-sm hover:text-black inline-block">Read more</span></div></div></div></a></div><div class="transform transition-all duration-200 hover:scale-[1.02] mb-10"><a href=/blog/2019-12-23-headless-synergy-setup/ class="block h-full"><div class="window-frame h-full flex flex-col"><div class=window-header><div class="flex justify-between items-center"><div class=window-title>~/blog/2019-12-23-headless-synergy-se...</div><div class="text-sm opacity-70 font-mono">2019-12-23</div></div></div><div class=window-tags-bar><div class="flex flex-wrap gap-2 text-sm font-mono"><span class=opacity-70>#synergy</span>
<span class=opacity-70>#headless</span>
<span class=opacity-70>#setup</span>
<span class=opacity-70>#linux</span>
<span class=opacity-70>#macos</span>
<span class=opacity-70>#windows</span>
<span class=opacity-70>#amiga</span></div></div><div class="window-content flex-grow flex flex-col"><style>.gallery-container{width:100%;margin:2rem 0}.gallery-container.card-mode{margin:0}.gallery-filmstrip{display:flex;overflow-x:auto;gap:.5rem;padding:.5rem;scrollbar-width:thin;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.gallery-filmstrip::-webkit-scrollbar{height:6px}.gallery-filmstrip::-webkit-scrollbar-track{background:var(--scroll-track-color,#f1f1f1);border-radius:3px}.gallery-filmstrip::-webkit-scrollbar-thumb{background:var(--scroll-thumb-color,#888);border-radius:3px}.gallery-thumbnail{margin:0!important;flex:none;width:var(--thumbnail-width,150px);height:var(--thumbnail-height,100px);position:relative;cursor:pointer;border-radius:4px;overflow:hidden;transition:transform .2s}.gallery-thumbnail:focus-visible{outline:3px solid #007bff;outline-offset:2px}.card-mode .gallery-thumbnail{width:var(--card-thumbnail-width,120px);height:var(--card-thumbnail-height,80px)}.gallery-thumbnail:hover{transform:scale(1.05)}.gallery-thumbnail img,.gallery-thumbnail video{width:100%;height:100%;margin:0!important;object-fit:cover}.gallery-main{margin-top:1rem;position:relative;border-radius:8px;overflow:hidden;background:var(--gallery-bg,#f8f9fa);display:flex;justify-content:center;align-items:center;height:var(--main-image-height,600px)}.gallery-main img,.gallery-main video{width:100%;height:100%;object-fit:contain;max-height:var(--main-image-max-height,600px)}.gallery-video-wrapper{position:relative;width:100%;height:100%}.gallery-play-button{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:60px;height:60px;background:rgba(0,0,0,.7);border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background-color .2s}.gallery-play-button:hover{background:rgba(0,0,0,.9)}.gallery-play-button::before{content:'';width:0;height:0;border-style:solid;border-width:12px 0 12px 20px;border-color:transparent transparent transparent #fff;margin-left:4px}.gallery-thumbnail .gallery-play-button{width:30px;height:30px}.gallery-thumbnail .gallery-play-button::before{border-width:6px 0 6px 10px;margin-left:2px}.gallery-caption{padding:1rem;background:rgba(0,0,0,.85);color:#fff;position:absolute;bottom:0;left:0;right:0;font-size:.9rem}.gallery-selected{border:2px solid var(--selected-border-color,#5b5b5c);transform:scale(1.05)}.gallery-error{padding:1rem;color:#721c24;background-color:#f8d7da;border:1px solid #f5c6cb;border-radius:4px;margin:1rem 0}.fullscreen-overlay{display:none;position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.9);z-index:9999;cursor:zoom-out}.fullscreen-overlay.active{display:flex;justify-content:center;align-items:center}.fullscreen-image{max-width:95%;max-height:95vh;object-fit:contain}.gallery-main img{cursor:zoom-in}</style><div class="gallery-container card-mode" role=region aria-label="Media gallery"><div class=gallery-filmstrip role=listbox aria-label="Media thumbnails" tabindex=0><div class=gallery-thumbnail role=option aria-selected=false tabindex=0 data-type=image data-src=/images/gallery/blog/2019-12-23-headless-synergy-setup/1.jpg data-caption=1><img src=/images/gallery/blog/2019-12-23-headless-synergy-setup/1.jpg alt=1 loading=eager></div></div></div><div class=fullscreen-overlay><img class=fullscreen-image src alt></div><h4 class=mb-2><span>Headless Synergy setup using an OrangePiZero</span></h4><p class="mb-6 flex-grow">If you’re like me and have a collection of retro machines that only support the Synergy client, not the server, and you don’t want to run a Synergy server on a bulky machine (or simply don’t have one nearby), then a headless Synergy server on a tiny SBC like the OrangePiZero or a Raspberry Pi is the perfect solution. It’s a slick setup that lets you share a single mouse and keyboard across all your machines with ease.</p><div class=mt-auto><span class="no-capitalize btn btn-outline-primary btn-sm hover:text-black inline-block">Read more</span></div></div></div></a></div></div></div></div></div></section></main><footer class="bg-theme-light dark:bg-darkmode-theme-light"><div class=container><div class="row items-center py-10"><div class="lg:col-3 mb-8 text-center lg:mb-0 lg:text-left"><a class="navbar-brand inline-block text-sm" href=/>hishamkhalifa.com</a></div><div class="lg:col-6 mb-8 text-center lg:mb-0"><ul></ul></div><div class="lg:col-3 mb-8 text-center lg:mb-0 lg:mt-0 lg:text-right"><ul class=social-icons><li><a target=_blank aria-label=github rel="nofollow noopener" href=https://www.github.com/hishamk><i class="fab fa-github"></i></a></li><li><a target=_blank aria-label=twitter rel="nofollow noopener" href=https://twitter.com/hi5hamk><i class="fab fa-x-twitter"></i></a></li><li><a target=_blank aria-label=linkedin rel="nofollow noopener" href=https://www.linkedin.com/in/hishamk><i class="fab fa-linkedin"></i></a></li><li><a target=_blank aria-label=youtube rel="nofollow noopener" href=https://www.youtube.com/@hishamk><i class="fab fa-youtube"></i></a></li></ul></div></div></div><div class="border-border dark:border-darkmode-border border-t py-7"><div class="text-sm text-light dark:text-darkmode-light container text-center"><p>Sharpieshadow Hugo theme by <a href=https://github.com/hishamk target=_blank>Hisham Khalifa</a><br>Copyright 2006 - 2025 Hisham Khalifa</p></div></div></footer><script crossorigin=anonymous integrity="sha256-LO9JECYLqyMcpGlrtxZcpUn0I8AvhO6oIIibJZv4zbk=" src=/js/script.min.2cef4910260bab231ca4696bb7165ca549f423c02f84eea820889b259bf8cdb9.js></script><script defer async crossorigin=anonymous integrity="sha256-w+aS42D2+B+Jix+joZ7pAua1vbu/pRK/IhoP55b8n3w=" src=/js/script-lazy.min.c3e692e360f6f81f898b1fa3a19ee902e6b5bdbbbfa512bf221a0fe796fc9f7c.js></script><script>"serviceWorker"in navigator&&navigator.serviceWorker.register("/service-worker.js")</script></body></html>