PageSourceSearch

https://elabins.com/

html elabins.com collected 2026-10-02 12:42:04 UTC 146,838 bytes, 2 lines download raw bytes

1<!DOCTYPE html><html lang="en" class="__variable_984529 __variable_898c26"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/logo-wide.svg"/><link rel="preload" as="image" imageSrcSet="/_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20200713_173403-1600x2133.jpg%3Fv%3D1785332727470&amp;w=256&amp;q=75 256w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20200713_173403-1600x2133.jpg%3Fv%3D1785332727470&amp;w=384&amp;q=75 384w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20200713_173403-1600x2133.jpg%3Fv%3D1785332727470&amp;w=640&amp;q=75 640w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20200713_173403-1600x2133.jpg%3Fv%3D1785332727470&amp;w=750&amp;q=75 750w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20200713_173403-1600x2133.jpg%3Fv%3D1785332727470&amp;w=828&amp;q=75 828w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20200713_173403-1600x2133.jpg%3Fv%3D1785332727470&amp;w=1080&amp;q=75 1080w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20200713_173403-1600x2133.jpg%3Fv%3D1785332727470&amp;w=1200&amp;q=75 1200w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20200713_173403-1600x2133.jpg%3Fv%3D1785332727470&amp;w=1920&amp;q=75 1920w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20200713_173403-1600x2133.jpg%3Fv%3D1785332727470&amp;w=2048&amp;q=75 2048w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20200713_173403-1600x2133.jpg%3Fv%3D1785332727470&amp;w=3840&amp;q=75 3840w" imageSizes="(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw"/><link rel="preload" as="image" imageSrcSet="/_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20191001_204259-1600x1200.jpg%3Fv%3D1785332129403&amp;w=256&amp;q=75 256w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20191001_204259-1600x1200.jpg%3Fv%3D1785332129403&amp;w=384&amp;q=75 384w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20191001_204259-1600x1200.jpg%3Fv%3D1785332129403&amp;w=640&amp;q=75 640w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20191001_204259-1600x1200.jpg%3Fv%3D1785332129403&amp;w=750&amp;q=75 750w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20191001_204259-1600x1200.jpg%3Fv%3D1785332129403&amp;w=828&amp;q=75 828w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20191001_204259-1600x1200.jpg%3Fv%3D1785332129403&amp;w=1080&amp;q=75 1080w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20191001_204259-1600x1200.jpg%3Fv%3D1785332129403&amp;w=1200&amp;q=75 1200w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20191001_204259-1600x1200.jpg%3Fv%3D1785332129403&amp;w=1920&amp;q=75 1920w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20191001_204259-1600x1200.jpg%3Fv%3D1785332129403&amp;w=2048&amp;q=75 2048w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20191001_204259-1600x1200.jpg%3Fv%3D1785332129403&amp;w=3840&amp;q=75 3840w" imageSizes="(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw"/><link rel="preload" as="image" href="https://elabins.com/media/Mohammed%20Ashad.png?v=1782105051658"/><link rel="stylesheet" href="/_next/static/css/91958c353a213ae2.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/85b6ca73078cad9c.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/422512bf9ff511bd.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-875f557d33ab09f3.js"/>
1<script src="/_next/static/chunks/9f73e0ad-5ab2ee2564557453.js" async=""></script>
1<script src="/_next/static/chunks/91827-c0b7b0ef7daa2114.js" async=""></script>
1<script src="/_next/static/chunks/main-app-b2f7040b8ee654a8.js" async=""></script>
1<script src="/_next/static/chunks/50101cec-1de6d22ba4b0bd0a.js" async=""></script>
1<script src="/_next/static/chunks/794ffb4d-a6b36147a9b951ab.js" async=""></script>
1<script src="/_next/static/chunks/13843-eb9aa2fce9e894a5.js" async=""></script>
1<script src="/_next/static/chunks/70827-3099a06c986fa445.js" async=""></script>
1<script src="/_next/static/chunks/50881-03b6e3de96535131.js" async=""></script>
1<script src="/_next/static/chunks/app/(app)/layout-74ada51a59c96b38.js" async=""></script>
1<script src="/_next/static/chunks/79892-30f6d0548c439de9.js" async=""></script>
1<script src="/_next/static/chunks/11984-7159932817e42165.js" async=""></script>
1<script src="/_next/static/chunks/app/(app)/page-92ccc98e2d9101b6.js" async=""></script>
1<meta name="next-size-adjust" content=""/><meta name="theme-color" media="(prefers-color-scheme: dark)" content="#0a0e17"/><meta name="theme-color" media="(prefers-color-scheme: light)" content="#f8fafc"/><title>e-lab innovations — Learn | Innovate | Share</title><meta name="description" content="A maker&#x27;s notebook at the intersection of hardware and software. Long-form writing, weekend builds, and small useful apps."/><meta name="author" content="Mohammed Ashad"/><link rel="manifest" href="/manifest.webmanifest"/><meta name="keywords" content="embedded,hardware,software,maker,esp32,pcb,firmware,iot,blog"/><meta name="robots" content="index, follow"/><meta name="googlebot" content="index, follow, max-video-preview:-1, max-image-preview:large, max-snippet:-1"/><link rel="canonical" href="https://elabins.com"/><meta name="format-detection" content="telephone=no, date=no, address=no, email=no"/><meta property="og:title" content="e-lab innovations — Learn | Innovate | Share"/><meta property="og:description" content="A maker&#x27;s notebook at the intersection of hardware and software. Long-form writing, weekend builds, and small useful apps."/><meta property="og:url" content="https://elabins.com"/><meta property="og:site_name" content="e-lab innovations"/><meta property="og:image:alt" content="e-lab innovations — Learn | Innovate | Share"/><meta property="og:image:type" content="image/png"/><meta property="og:image" content="https://elabins.com/opengraph-image-xg4ifa?82d0972a81bfb364"/><meta property="og:image:width" content="1200"/><meta property="og:image:height" content="630"/><meta property="og:type" content="website"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:creator" content="@elabinnovations"/><meta name="twitter:title" content="e-lab innovations — Learn | Innovate | Share"/><meta name="twitter:description" content="A maker&#x27;s notebook at the intersection of hardware and software. Long-form writing, weekend builds, and small useful apps."/><meta name="twitter:image:alt" content="e-lab innovations — Learn | Innovate | Share"/><meta name="twitter:image:type" content="image/png"/><meta name="twitter:image" content="https://elabins.com/twitter-image-xg4ifa?5fdafdf89ca714e6"/><meta name="twitter:image:width" content="1200"/><meta name="twitter:image:height" content="630"/><link rel="icon" href="/favicon.ico" type="image/x-icon" sizes="16x16"/><link rel="icon" href="/favicon.ico" sizes="any"/><link rel="icon" href="/icons/icon-32.png" type="image/png" sizes="32x32"/><link rel="icon" href="/icons/icon-192.png" type="image/png" sizes="192x192"/><link rel="icon" href="/logo.svg" type="image/svg+xml"/><link rel="apple-touch-icon" href="/icons/icon-180.png" sizes="180x180" type="image/png"/>
1<script>(function(){try{var t=localStorage.getItem('elab-theme');if(!t){t='dark'}document.documentElement.setAttribute('data-theme',t);}catch(e){document.documentElement.setAttribute('data-theme','dark');}})();</script>
1<script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script>
1</head><body class="antialiased"><div hidden=""><!--$--><!--/$--></div><nav class="nav"><div class="container nav-inner"><a class="nav-brand" aria-label="e-lab innovations home" href="/"><img src="/logo-wide.svg" alt="e-lab innovations" style="height:40px;width:auto;display:block"/></a><ul class="nav-links "><li><a class="active" href="/">home</a></li><li><a class="" href="/blog">blog</a></li><li><a class="" href="/apps">apps</a></li><li><a class="" href="/photos">photos</a></li><li><a class="" href="/about">about</a></li><li><a class="" href="/contact">Contact</a></li><li class="nav-mobile-theme"><button type="button" aria-label="toggle theme"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-sun" aria-hidden="true"><circle cx="12" cy="12" r="4"></circle><path d="M12 2v2"></path><path d="M12 20v2"></path><path d="m4.93 4.93 1.41 1.41"></path><path d="m17.66 17.66 1.41 1.41"></path><path d="M2 12h2"></path><path d="M20 12h2"></path><path d="m6.34 17.66-1.41 1.41"></path><path d="m19.07 4.93-1.41 1.41"></path></svg><span>light mode</span></button></li></ul><div class="nav-actions"><button class="nav-search-btn" aria-label="open search" type="button"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-search" aria-hidden="true"><path d="m21 21-4.34-4.34"></path><circle cx="11" cy="11" r="8"></circle></svg><span class="nav-search-label">search</span><kbd class="nav-search-kbd">⌘K</kbd></button><button class="theme-toggle desktop-only" aria-label="toggle theme" type="button"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-sun" aria-hidden="true"><circle cx="12" cy="12" r="4"></circle><path d="M12 2v2"></path><path d="M12 20v2"></path><path d="m4.93 4.93 1.41 1.41"></path><path d="m17.66 17.66 1.41 1.41"></path><path d="M2 12h2"></path><path d="M20 12h2"></path><path d="m6.34 17.66-1.41 1.41"></path><path d="m19.07 4.93-1.41 1.41"></path></svg></button><button class="btn btn-primary btn-sm" type="button">join<!-- --> <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-right" aria-hidden="true"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg></button><button class="mobile-menu-btn" aria-label="menu" type="button"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-menu" aria-hidden="true"><path d="M4 5h16"></path><path d="M4 12h16"></path><path d="M4 19h16"></path></svg></button></div></div></nav><main>
1<script type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://elabins.com/#organization","name":"e-lab innovations","url":"https://elabins.com/","description":"A maker's notebook at the intersection of hardware and software.","logo":{"@type":"ImageObject","url":"https://elabins.com/logo-wide.png","width":620,"height":192},"sameAs":["https://github.com/e-labInnovations","https://twitter.com/elabinnovations","https://linkedin.com/in/mohammed-ashad","https://www.youtube.com/c/elabinnovations"],"founder":{"@id":"https://elabins.com/about#person"}},{"@type":"Person","@id":"https://elabins.com/about#person","name":"Mohammed Ashad","url":"https://elabins.com/about","sameAs":["https://github.com/e-labInnovations","https://twitter.com/elabinnovations","https://linkedin.com/in/mohammed-ashad","https://www.youtube.com/c/elabinnovations"],"worksFor":{"@id":"https://elabins.com/#organization"}},{"@type":"WebSite","@id":"https://elabins.com/#website","name":"e-lab innovations","url":"https://elabins.com/","description":"A maker's notebook at the intersection of hardware and software — long-form writing, weekend builds, and small useful apps.","publisher":{"@id":"https://elabins.com/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://elabins.com/blog?q={search_term_string}"},"query-input":"required name=search_term_string"}},{"@type":"WebPage","@id":"https://elabins.com/#webpage","url":"https://elabins.com/","name":"e-lab innovations — Learn | Innovate | Share","description":"A maker's notebook at the intersection of hardware and software. Long-form writing, weekend builds, and small useful apps.","inLanguage":"en","isPartOf":{"@id":"https://elabins.com/#website"}}]}</script>
1<section class="hero"><canvas class="hero-canvas" aria-hidden="true"></canvas><div class="grid-bg"></div><div class="glow-orb primary" style="width:480px;height:480px;top:-20%;left:-10%"></div><div class="glow-orb secondary" style="width:520px;height:520px;bottom:-25%;right:-15%"></div><div class="hero-content"><div class="hero-from"><span class="pulse"></span> <!-- -->from Mohammed Ashad</div><h1 class="hero-title"><span class="h-grad">e-lab</span><br/>innovations<span class="dot">.</span></h1><div class="hero-tag"><span>Learn</span><em>·</em><span>Innovate</span><em>·</em><span>Share</span></div><p class="hero-desc">Exploring the intersection of hardware and software to create innovative solutions for tomorrow&#x27;s challenges. A maker&#x27;s notebook — long-form writing, weekend builds, and small useful apps.</p><div class="hero-cta"><a class="btn btn-primary" href="/blog">read the blog<!-- --> <svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-right" aria-hidden="true"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg></a><a class="btn btn-ghost" href="/apps">see live apps</a></div><div class="hero-stats"><div><div class="num">16</div><div class="lbl">articles</div></div><div><div class="num">6</div><div class="lbl">live apps</div></div><div><div class="num">-</div><div class="lbl">readers/mo</div></div><div><div class="num">10 yrs</div><div class="lbl">tinkering</div></div></div></div><div class="hero-scroll" aria-label="scroll down"><svg class="scroll-mouse" viewBox="0 0 20 32" width="18" height="28" aria-hidden="true"><rect x="1" y="1" width="18" height="30" rx="9" fill="none" stroke="currentColor" stroke-width="1.5"></rect><circle class="scroll-dot" cx="10" cy="9" r="1.6" fill="currentColor"></circle></svg><div class="line"></div></div></section><section id="blog" class="section"><div class="container"><div class="section-head"><div class="title-block"><span class="eyebrow">// recent writings</span><h2>From the notebook</h2><p>Long-form posts on hardware projects, software craft, and the surprisingly fuzzy line between them.</p></div><a class="btn btn-ghost" href="/blog">view archive<!-- --> <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-right" aria-hidden="true"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg></a></div><div class="blog-grid"><a class="card card-glow-primary blog-card" aria-label="Making a WCH-Link clone program the unsupported CH32V003" href="/blog/making-a-wch-link-clone-program-the-unsupported-ch32v003"><div class="thumb relative"><img alt="A CH32V003 on a breadboard with a lit LED, wired to a WCH-Link clone, beside a laptop running the ch549-link web flasher mid-erase" loading="lazy" decoding="async" data-nimg="fill" class="object-cover" style="position:absolute;height:100%;width:100%;left:0;top:0;right:0;bottom:0;color:transparent" sizes="(max-width: 640px) 100vw, (max-width: 960px) 50vw, 33vw" srcSet="/_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fch549-link-thumbnail-1280x720.png%3Fv%3D1789921984589&amp;w=256&amp;q=75 256w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fch549-link-thumbnail-1280x720.png%3Fv%3D1789921984589&amp;w=384&amp;q=75 384w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fch549-link-thumbnail-1280x720.png%3Fv%3D1789921984589&amp;w=640&amp;q=75 640w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fch549-link-thumbnail-1280x720.png%3Fv%3D1789921984589&amp;w=750&amp;q=75 750w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fch549-link-thumbnail-1280x720.png%3Fv%3D1789921984589&amp;w=828&amp;q=75 828w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fch549-link-thumbnail-1280x720.png%3Fv%3D1789921984589&amp;w=1080&amp;q=75 1080w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fch549-link-thumbnail-1280x720.png%3Fv%3D1789921984589&amp;w=1200&amp;q=75 1200w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fch549-link-thumbnail-1280x720.png%3Fv%3D1789921984589&amp;w=1920&amp;q=75 1920w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fch549-link-thumbnail-1280x720.png%3Fv%3D1789921984589&amp;w=2048&amp;q=75 2048w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fch549-link-thumbnail-1280x720.png%3Fv%3D1789921984589&amp;w=3840&amp;q=75 3840w" src="/_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fch549-link-thumbnail-1280x720.png%3Fv%3D1789921984589&amp;w=3840&amp;q=75"/><div class="corner-tag"><span class="cat-pill" style="--cat-dot:hsl(28 85% 53%)">Hardware</span></div></div><div class="body"><div class="meta"><span class="inline-flex items-center gap-1"><svg xmlns="http://www.w3.org/2000/svg" width="11" height="11" viewB
1ox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-calendar" aria-hidden="true"><path d="M8 2v4"></path><path d="M16 2v4"></path><rect width="18" height="18" x="3" y="4" rx="2"></rect><path d="M3 10h18"></path></svg> <!-- -->Sep 20, 2026</span><span class="sep">/</span><span class="inline-flex items-center gap-1"><svg xmlns="http://www.w3.org/2000/svg" width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-clock" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="M12 6v6l4 2"></path></svg> <!-- -->24 min read</span></div><h3>Making a WCH-Link clone program the unsupported CH32V003</h3><p class="excerpt">The listing said CH32V003 not supported. The hardware was never the problem, the firmware was, so I replaced it.</p><div class="tags"><span class="tag">CH32V003</span><span class="tag">CH549</span><span class="tag">WCH-Link</span><span class="tag">RISC-V</span></div><div class="read"><span>read article</span><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-right" aria-hidden="true"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg></div></div></a><a class="card card-glow-primary blog-card" aria-label="Building Clipix, a Clipy-style clipboard manager for GNOME" href="/blog/building-clipix-a-clipy-style-clipboard-manager-for-gnome"><div class="thumb relative"><img alt="Building Clipix, a Clipy-style clipboard manager for GNOME" loading="lazy" decoding="async" data-nimg="fill" class="object-cover" style="position:absolute;height:100%;width:100%;left:0;top:0;right:0;bottom:0;color:transparent" sizes="(max-width: 640px) 100vw, (max-width: 960px) 50vw, 33vw" srcSet="/_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fclipix-thumbnail-1280x720.png%3Fv%3D1788678908555&amp;w=256&amp;q=75 256w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fclipix-thumbnail-1280x720.png%3Fv%3D1788678908555&amp;w=384&amp;q=75 384w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fclipix-thumbnail-1280x720.png%3Fv%3D1788678908555&amp;w=640&amp;q=75 640w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fclipix-thumbnail-1280x720.png%3Fv%3D1788678908555&amp;w=750&amp;q=75 750w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fclipix-thumbnail-1280x720.png%3Fv%3D1788678908555&amp;w=828&amp;q=75 828w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fclipix-thumbnail-1280x720.png%3Fv%3D1788678908555&amp;w=1080&amp;q=75 1080w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fclipix-thumbnail-1280x720.png%3Fv%3D1788678908555&amp;w=1200&amp;q=75 1200w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fclipix-thumbnail-1280x720.png%3Fv%3D1788678908555&amp;w=1920&amp;q=75 1920w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fclipix-thumbnail-1280x720.png%3Fv%3D1788678908555&amp;w=2048&amp;q=75 2048w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fclipix-thumbnail-1280x720.png%3Fv%3D1788678908555&amp;w=3840&amp;q=75 3840w" src="/_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fclipix-thumbnail-1280x720.png%3Fv%3D1788678908555&amp;w=3840&amp;q=75"/><div class="corner-tag"><span class="cat-pill" style="--cat-dot:hsl(217 85% 55%)">Software</span></div></div><div class="body"><div class="meta"><span class="inline-flex items-center gap-1"><svg xmlns="http://www.w3.org/2000/svg" width="11" height="11" viewB
1ox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-calendar" aria-hidden="true"><path d="M8 2v4"></path><path d="M16 2v4"></path><rect width="18" height="18" x="3" y="4" rx="2"></rect><path d="M3 10h18"></path></svg> <!-- -->Sep 06, 2026</span><span class="sep">/</span><span class="inline-flex items-center gap-1"><svg xmlns="http://www.w3.org/2000/svg" width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-clock" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="M12 6v6l4 2"></path></svg> <!-- -->3 min read</span></div><h3>Building Clipix, a Clipy-style clipboard manager for GNOME</h3><p class="excerpt">I missed Windows clipboard history on Linux, tried every manager I could find, then spent a weekend building my own GNOME extension.</p><div class="tags"><span class="tag">Gnome</span><span class="tag">Linux</span><span class="tag">Clipboard</span><span class="tag">Gnome Extension</span></div><div class="read"><span>read article</span><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-right" aria-hidden="true"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg></div></div></a><a class="card card-glow-primary blog-card" aria-label="Building a USB display from a salvaged smartwatch LCD" href="/blog/building-a-usb-display-from-a-salvaged-smartwatch-lcd"><div class="thumb relative"><img alt="Building a USB display from a salvaged smartwatch LCD" loading="lazy" decoding="async" data-nimg="fill" class="object-cover" style="position:absolute;height:100%;width:100%;left:0;top:0;right:0;bottom:0;color:transparent" sizes="(max-width: 640px) 100vw, (max-width: 960px) 50vw, 33vw" srcSet="/_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fusb2tft-thumbnail-1280x720.png%3Fv%3D1785735340362&amp;w=256&amp;q=75 256w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fusb2tft-thumbnail-1280x720.png%3Fv%3D1785735340362&amp;w=384&amp;q=75 384w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fusb2tft-thumbnail-1280x720.png%3Fv%3D1785735340362&amp;w=640&amp;q=75 640w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fusb2tft-thumbnail-1280x720.png%3Fv%3D1785735340362&amp;w=750&amp;q=75 750w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fusb2tft-thumbnail-1280x720.png%3Fv%3D1785735340362&amp;w=828&amp;q=75 828w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fusb2tft-thumbnail-1280x720.png%3Fv%3D1785735340362&amp;w=1080&amp;q=75 1080w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fusb2tft-thumbnail-1280x720.png%3Fv%3D1785735340362&amp;w=1200&amp;q=75 1200w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fusb2tft-thumbnail-1280x720.png%3Fv%3D1785735340362&amp;w=1920&amp;q=75 1920w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fusb2tft-thumbnail-1280x720.png%3Fv%3D1785735340362&amp;w=2048&amp;q=75 2048w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fusb2tft-thumbnail-1280x720.png%3Fv%3D1785735340362&amp;w=3840&amp;q=75 3840w" src="/_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fusb2tft-thumbnail-1280x720.png%3Fv%3D1785735340362&amp;w=3840&amp;q=75"/><div class="corner-tag"><span class="cat-pill" style="--cat-dot:hsl(28 85% 53%)">Hardware</span></div></div><div class="body"><div class="meta"><span class="inline-flex items-center gap-1"><svg xmlns="http://www.w3.org/2000/svg" width="11" height="11" viewB
1ox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-calendar" aria-hidden="true"><path d="M8 2v4"></path><path d="M16 2v4"></path><rect width="18" height="18" x="3" y="4" rx="2"></rect><path d="M3 10h18"></path></svg> <!-- -->Aug 03, 2026</span><span class="sep">/</span><span class="inline-flex items-center gap-1"><svg xmlns="http://www.w3.org/2000/svg" width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-clock" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="M12 6v6l4 2"></path></svg> <!-- -->28 min read</span></div><h3>Building a USB display from a salvaged smartwatch LCD</h3><p class="excerpt">2 Mbps of UART proved software USB was pointless. Then came an RP2040, a DMA rewrite, and a colour bug I could not see.</p><div class="tags"><span class="tag">RP2040</span><span class="tag">ST7735</span><span class="tag">USB</span><span class="tag">TLSR8232</span></div><div class="read"><span>read article</span><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-right" aria-hidden="true"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg></div></div></a><a class="card card-glow-primary blog-card" aria-label="Turning a ₹249 Smartwatch Into a DIY AirTag Tracker" href="/blog/turning-a-249-smartwatch-into-a-diy-airtag-tracker"><div class="thumb relative"><img alt="Turning a ₹249 Smartwatch Into a DIY AirTag Tracker" loading="lazy" decoding="async" data-nimg="fill" class="object-cover" style="position:absolute;height:100%;width:100%;left:0;top:0;right:0;bottom:0;color:transparent" sizes="(max-width: 640px) 100vw, (max-width: 960px) 50vw, 33vw" srcSet="/_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Ffindmy-airtag-thumbnail-1280x720.png%3Fv%3D1785564282618&amp;w=256&amp;q=75 256w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Ffindmy-airtag-thumbnail-1280x720.png%3Fv%3D1785564282618&amp;w=384&amp;q=75 384w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Ffindmy-airtag-thumbnail-1280x720.png%3Fv%3D1785564282618&amp;w=640&amp;q=75 640w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Ffindmy-airtag-thumbnail-1280x720.png%3Fv%3D1785564282618&amp;w=750&amp;q=75 750w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Ffindmy-airtag-thumbnail-1280x720.png%3Fv%3D1785564282618&amp;w=828&amp;q=75 828w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Ffindmy-airtag-thumbnail-1280x720.png%3Fv%3D1785564282618&amp;w=1080&amp;q=75 1080w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Ffindmy-airtag-thumbnail-1280x720.png%3Fv%3D1785564282618&amp;w=1200&amp;q=75 1200w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Ffindmy-airtag-thumbnail-1280x720.png%3Fv%3D1785564282618&amp;w=1920&amp;q=75 1920w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Ffindmy-airtag-thumbnail-1280x720.png%3Fv%3D1785564282618&amp;w=2048&amp;q=75 2048w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Ffindmy-airtag-thumbnail-1280x720.png%3Fv%3D1785564282618&amp;w=3840&amp;q=75 3840w" src="/_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Ffindmy-airtag-thumbnail-1280x720.png%3Fv%3D1785564282618&amp;w=3840&amp;q=75"/><div class="corner-tag"><span class="cat-pill" style="--cat-dot:hsl(28 85% 53%)">Hardware</span></div></div><div class="body"><div class="meta"><span class="inline-flex items-center gap-1"><svg xmlns="http://www.w3.org/2000/svg" width="11" height="11" viewB
1ox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-calendar" aria-hidden="true"><path d="M8 2v4"></path><path d="M16 2v4"></path><rect width="18" height="18" x="3" y="4" rx="2"></rect><path d="M3 10h18"></path></svg> <!-- -->Aug 01, 2026</span><span class="sep">/</span><span class="inline-flex items-center gap-1"><svg xmlns="http://www.w3.org/2000/svg" width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-clock" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="M12 6v6l4 2"></path></svg> <!-- -->24 min read</span></div><h3>Turning a ₹249 Smartwatch Into a DIY AirTag Tracker</h3><p class="excerpt">I lost my wallet on a night bus, so I turned a hacked ₹249 smartwatch into an Apple FindMy tracker and built my own app to follow it.</p><div class="tags"><span class="tag">FindMy</span><span class="tag">AirTag</span><span class="tag">TLSR8232</span><span class="tag">BLE</span></div><div class="read"><span>read article</span><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-right" aria-hidden="true"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg></div></div></a><a class="card card-glow-primary blog-card" aria-label="Hacking a ₹249 Smartwatch: Custom Firmware on TLSR8232" href="/blog/hacking-a-249-smartwatch-custom-firmware-on-tlsr8232"><div class="thumb relative"><img alt="Hacking a ₹249 Smartwatch: Custom Firmware on TLSR8232" loading="lazy" decoding="async" data-nimg="fill" class="object-cover" style="position:absolute;height:100%;width:100%;left:0;top:0;right:0;bottom:0;color:transparent" sizes="(max-width: 640px) 100vw, (max-width: 960px) 50vw, 33vw" srcSet="/_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FTLSR8232-watch-thumbnail-1280x720.png%3Fv%3D1785308305193&amp;w=256&amp;q=75 256w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FTLSR8232-watch-thumbnail-1280x720.png%3Fv%3D1785308305193&amp;w=384&amp;q=75 384w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FTLSR8232-watch-thumbnail-1280x720.png%3Fv%3D1785308305193&amp;w=640&amp;q=75 640w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FTLSR8232-watch-thumbnail-1280x720.png%3Fv%3D1785308305193&amp;w=750&amp;q=75 750w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FTLSR8232-watch-thumbnail-1280x720.png%3Fv%3D1785308305193&amp;w=828&amp;q=75 828w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FTLSR8232-watch-thumbnail-1280x720.png%3Fv%3D1785308305193&amp;w=1080&amp;q=75 1080w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FTLSR8232-watch-thumbnail-1280x720.png%3Fv%3D1785308305193&amp;w=1200&amp;q=75 1200w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FTLSR8232-watch-thumbnail-1280x720.png%3Fv%3D1785308305193&amp;w=1920&amp;q=75 1920w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FTLSR8232-watch-thumbnail-1280x720.png%3Fv%3D1785308305193&amp;w=2048&amp;q=75 2048w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FTLSR8232-watch-thumbnail-1280x720.png%3Fv%3D1785308305193&amp;w=3840&amp;q=75 3840w" src="/_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FTLSR8232-watch-thumbnail-1280x720.png%3Fv%3D1785308305193&amp;w=3840&amp;q=75"/><div class="corner-tag"><span class="cat-pill" style="--cat-dot:hsl(28 85% 53%)">Hardware</span></div></div><div class="body"><div class="meta"><span class="inline-flex items-center gap-1"><svg xmlns="http://www.w3.org/2000/svg" width="11" height="11" viewB
1ox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-calendar" aria-hidden="true"><path d="M8 2v4"></path><path d="M16 2v4"></path><rect width="18" height="18" x="3" y="4" rx="2"></rect><path d="M3 10h18"></path></svg> <!-- -->Jul 29, 2026</span><span class="sep">/</span><span class="inline-flex items-center gap-1"><svg xmlns="http://www.w3.org/2000/svg" width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-clock" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="M12 6v6l4 2"></path></svg> <!-- -->31 min read</span></div><h3>Hacking a ₹249 Smartwatch: Custom Firmware on TLSR8232</h3><p class="excerpt">A bike navigation idea led me to reverse engineer a ₹249 smartwatch, crack its SWire debug port, and flash my own firmware on it.</p><div class="tags"><span class="tag">Reverse Engineering</span><span class="tag">TLSR8232</span><span class="tag">SmartWatch</span><span class="tag">BLE</span></div><div class="read"><span>read article</span><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-right" aria-hidden="true"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg></div></div></a><a class="card card-glow-primary blog-card" aria-label="Reverse Engineering MoYoung Watch Faces in the Browser" href="/blog/reverse-engineering-moyoung-watch-faces-in-the-browser"><div class="thumb relative"><img alt="Reverse Engineering MoYoung Watch Faces in the Browser" loading="lazy" decoding="async" data-nimg="fill" class="object-cover" style="position:absolute;height:100%;width:100%;left:0;top:0;right:0;bottom:0;color:transparent" sizes="(max-width: 640px) 100vw, (max-width: 960px) 50vw, 33vw" srcSet="/_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fdafit-canvas-thumbnail-1280x720.png%3Fv%3D1785328579369&amp;w=256&amp;q=75 256w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fdafit-canvas-thumbnail-1280x720.png%3Fv%3D1785328579369&amp;w=384&amp;q=75 384w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fdafit-canvas-thumbnail-1280x720.png%3Fv%3D1785328579369&amp;w=640&amp;q=75 640w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fdafit-canvas-thumbnail-1280x720.png%3Fv%3D1785328579369&amp;w=750&amp;q=75 750w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fdafit-canvas-thumbnail-1280x720.png%3Fv%3D1785328579369&amp;w=828&amp;q=75 828w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fdafit-canvas-thumbnail-1280x720.png%3Fv%3D1785328579369&amp;w=1080&amp;q=75 1080w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fdafit-canvas-thumbnail-1280x720.png%3Fv%3D1785328579369&amp;w=1200&amp;q=75 1200w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fdafit-canvas-thumbnail-1280x720.png%3Fv%3D1785328579369&amp;w=1920&amp;q=75 1920w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fdafit-canvas-thumbnail-1280x720.png%3Fv%3D1785328579369&amp;w=2048&amp;q=75 2048w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fdafit-canvas-thumbnail-1280x720.png%3Fv%3D1785328579369&amp;w=3840&amp;q=75 3840w" src="/_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fdafit-canvas-thumbnail-1280x720.png%3Fv%3D1785328579369&amp;w=3840&amp;q=75"/><div class="corner-tag"><span class="cat-pill" style="--cat-dot:hsl(217 85% 55%)">Software</span></div></div><div class="body"><div class="meta"><span class="inline-flex items-center gap-1"><svg xmlns="http://www.w3.org/2000/svg" width="11" height="11" viewB
1ox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-calendar" aria-hidden="true"><path d="M8 2v4"></path><path d="M16 2v4"></path><rect width="18" height="18" x="3" y="4" rx="2"></rect><path d="M3 10h18"></path></svg> <!-- -->Jul 26, 2026</span><span class="sep">/</span><span class="inline-flex items-center gap-1"><svg xmlns="http://www.w3.org/2000/svg" width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-clock" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="M12 6v6l4 2"></path></svg> <!-- -->14 min read</span></div><h3>Reverse Engineering MoYoung Watch Faces in the Browser</h3><p class="excerpt">A gifted Porodo watch, no SDK, and a binary format nobody documented. How I ended up writing a watch face editor.</p><div class="tags"><span class="tag">Reverse Engineering</span><span class="tag">SmartWatch</span><span class="tag">MoYoung</span><span class="tag">DaFit</span></div><div class="read"><span>read article</span><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-right" aria-hidden="true"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg></div></div></a></div></div></section><section id="apps" class="section relative overflow-hidden border-t border-b border-border-base bg-bg-elev"><div class="grid-bg dense"></div><div class="container relative z-10"><div class="section-head"><div class="title-block"><span class="eyebrow">// shipping</span><h2>Live apps &amp; tools</h2><p>Small, focused software I&#x27;ve built and put online. All open-source or freely usable — no accounts unless you really need one.</p></div><a class="btn btn-ghost" href="/apps">view all apps<!-- --> <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-right" aria-hidden="true"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg></a></div><div class="apps-grid"><article class="card card-glow-secondary app-card lifecycle-active"><div class="preview"><div class="device" style="background:linear-gradient(135deg, hsl(155 65% 55% / 0.9), hsl(190 85% 55% / 0.7))"><div class="titlebar"><i></i><i></i><i></i></div><div class="screen" style="background:radial-gradient(circle at 30% 30%, hsla(155, 65%, 60%, 0.35), transparent 50%), linear-gradient(135deg, var(--surface), var(--bg-elev-2))"><img alt="bit-dojo" loading="lazy" width="96" height="96" decoding="async" data-nimg="1" class="app-logo" style="color:transparent" srcSet="/_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fbit-dojo-logo.png%3Fv%3D1790402783267&amp;w=96&amp;q=75 1x, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fbit-dojo-logo.png%3Fv%3D1790402783267&amp;w=256&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fbit-dojo-logo.png%3Fv%3D1790402783267&amp;w=256&amp;q=75"/></div></div></div><div class="body"><div class="head"><h3>bit-dojo</h3><div class="app-pills"><span class="pf-badge web"><i class="dot"></i>web</span></div></div><p>Learn the bitwise tricks embedded C runs on by writing real register code for a simulated CH32V003.</p><div class="app-foot"><div class="app-foot-links"><a class="btn-link primary" target="_blank" rel="noopener noreferrer" href="https://bit-dojo.elabins.com/">launch app <svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a><a class="btn-link" target="_blank" rel="noopener noreferrer" aria-label="GitHub repo" href="https://github.com/e-labInnovations/bit-dojo"><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" aria-hidden="true"><title>GitHub</title><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></a></div><span class="app-version mono">v<!-- -->0.1.0</span></div></div></article><article class="card card-glow-secondary app-card lifecycle-active"><div class="preview"><div class="device" style="background:linear-gradient(135deg, hsl(215 20% 45% / 0.9), hsl(222 47% 21% / 0.7))"><div class="titlebar"><i></i><i></i><i></i></div><div class="screen" style="background:radial-gradient(circle at 30% 30%, hsla(215, 20%, 60%, 0.35), transparent 50%), linear-gradient(135deg, var(--surface), var(--bg-elev-2))"><img alt="CH549-Link" loading="lazy" width="96" height="96" decoding="async" data-nimg="1" class="app-logo" style="color:transparent" srcSet="/_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fch549-link.png%3Fv%3D1789903889067&amp;w=96&amp;q=75 1x, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fch549-link.png%3Fv%3D1789903889067&amp;w=256&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fch549-link.png%3Fv%3D1789903889067&amp;w=256&amp;q=75"/></div></div></div><div class="body"><div class="head"><h3>CH549-Link</h3><div class="app-pills"><span class="pf-badge web"><i class="dot"></i>web</span></div></div><p>Browser-based firmware flasher that turns a WCH-Link debug probe into a single-wire CH32V003 programmer.</p><div class="app-foot"><div class="app-foot-links"><a class="btn-link primary" target="_blank" rel="noopener noreferrer" href="https://utils.elabins.com/ch549-link/">launch app <svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a><a class="btn-link" target="_blank" rel="noopener noreferrer" aria-label="GitHub repo" href="https://github.com/e-labInnovations/ch549-link"><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" aria-hidden="true"><title>GitHub</title><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></a></div><span class="app-version mono">v<!-- -->1.0.0</span></div></div></article><article class="card card-glow-secondary app-card lifecycle-active"><div class="preview"><div class="device" style="background:linear-gradient(135deg, hsl(224 55% 30% / 0.9), hsl(243 50% 20% / 0.7))"><div class="titlebar"><i></i><i></i><i></i></div><div class="screen" style="background:radial-gradient(circle at 30% 30%, hsla(224, 55%, 60%, 0.35), transparent 50%), linear-gradient(135deg, var(--surface), var(--bg-elev-2))"><img alt="Clipix Icon" loading="lazy" width="96" height="96" decoding="async" data-nimg="1" class="app-logo" style="color:transparent" srcSet="/_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fclipix-icon.png%3Fv%3D1788679373238&amp;w=96&amp;q=75 1x, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fclipix-icon.png%3Fv%3D1788679373238&amp;w=256&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fclipix-icon.png%3Fv%3D1788679373238&amp;w=256&amp;q=75"/></div></div></div><div class="body"><div class="head"><h3>Clipix</h3><div class="app-pills"><span class="pf-badge desktop"><i class="dot"></i>desktop</span></div></div><p>Clipboard history and snippets for GNOME Shell.</p><div class="app-foot"><div class="app-foot-links"><a class="btn-link primary" target="_blank" rel="noopener noreferrer" href="https://github.com/e-labInnovations/clipix">launch app <svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a><a class="btn-link" target="_blank" rel="noopener noreferrer" aria-label="GitHub repo" href="https://github.com/e-labInnovations/clipix"><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" aria-hidden="true"><title>GitHub</title><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></a></div></div></div></article><article class="card card-glow-secondary app-card lifecycle-active"><div class="preview"><div class="device" style="background:linear-gradient(135deg, hsl(280 90% 65% / 0.9), hsl(320 85% 60% / 0.7))"><div class="titlebar"><i></i><i></i><i></i></div><div class="screen" style="background:radial-gradient(circle at 30% 30%, hsla(280, 90%, 60%, 0.35), transparent 50%), linear-gradient(135deg, var(--surface), var(--bg-elev-2))"><img alt="DaFit Canvas Logo" loading="lazy" width="96" height="96" decoding="async" data-nimg="1" class="app-logo" style="color:transparent" srcSet="/_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fdafit-canvas-icon-512.png%3Fv%3D1782392593829&amp;w=96&amp;q=75 1x, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fdafit-canvas-icon-512.png%3Fv%3D1782392593829&amp;w=256&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fdafit-canvas-icon-512.png%3Fv%3D1782392593829&amp;w=256&amp;q=75"/></div></div></div><div class="body"><div class="head"><h3>Dafit Canvas</h3><div class="app-pills"><span class="pf-badge web"><i class="dot"></i>web</span></div></div><p>Browser-based visual editor for designing smartwatch faces compatible with the Da Fit / MoYoung ecosystem.</p><div class="app-foot"><div class="app-foot-links"><a class="btn-link primary" target="_blank" rel="noopener noreferrer" href="https://dafit-canvas.elabins.com/">launch app <svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a><a class="btn-link" target="_blank" rel="noopener noreferrer" aria-label="GitHub repo" href="https://github.com/e-labInnovations/dafit-canvas"><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" aria-hidden="true"><title>GitHub</title><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></a></div></div></div></article><article class="card card-glow-secondary app-card lifecycle-active"><div class="preview"><div class="device" style="background:linear-gradient(135deg, hsl(350 75% 55% / 0.9), hsl(280 80% 62% / 0.7))"><div class="titlebar"><i></i><i></i><i></i></div><div class="screen" style="background:radial-gradient(circle at 30% 30%, hsla(350, 75%, 60%, 0.35), transparent 50%), linear-gradient(135deg, var(--surface), var(--bg-elev-2))"><div class="app-glyph" style="background-image:linear-gradient(135deg, hsl(350 75% 55%), hsl(280 80% 62%))">∿</div></div></div></div><div class="body"><div class="head"><h3>OscillosPlot</h3><div class="app-pills"><span class="pf-badge web"><i class="dot"></i>web</span></div></div><p>Convert the image to an oscilloscope project Arduino C array</p><div class="app-foot"><div class="app-foot-links"><a class="btn-link primary" target="_blank" rel="noopener noreferrer" href="https://utils.elabins.com/tools/oscillosplot/">launch app <svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a><a class="btn-link" target="_blank" rel="noopener noreferrer" aria-label="GitHub repo" href="https://github.com/e-labInnovations/tools/tree/master/oscillosplot"><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" aria-hidden="true"><title>GitHub</title><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></a></div></div></div></article><article class="card card-glow-secondary app-card lifecycle-active"><div class="preview"><div class="device" style="background:linear-gradient(135deg, hsl(0 100% 40% / 0.9), hsl(230 100% 65% / 0.7))"><div class="titlebar"><i></i><i></i><i></i></div><div class="screen" style="background:radial-gradient(circle at 30% 30%, hsla(0, 100%, 60%, 0.35), transparent 50%), linear-gradient(135deg, var(-
1-surface), var(--bg-elev-2))"><div class="app-glyph" style="background-image:linear-gradient(135deg, hsl(0 100% 40%), hsl(230 100% 65%))">👾</div></div></div></div><div class="body"><div class="head"><h3>XBM Sprite</h3><div class="app-pills"><span class="pf-badge web"><i class="dot"></i>web</span></div></div><p>A tool to convert an image to an XBM Sprite</p><div class="app-foot"><div class="app-foot-links"><a class="btn-link primary" target="_blank" rel="noopener noreferrer" href="https://utils.elabins.com/tools/xbm-sprite">launch app <svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a><a class="btn-link" target="_blank" rel="noopener noreferrer" aria-label="GitHub repo" href="https://github.com/e-labInnovations/tools/tree/master/xbm-sprite"><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" aria-hidden="true"><title>GitHub</title><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></a></div></div></div></article></div></div></section><section id="photos" class="section"><div class="container"><div class="section-head"><div class="title-block"><span class="eyebrow">// snapshots</span><h2>From the workbench</h2><p>A loose photo journal — builds in progress, soldering iron at 2 AM, the occasional walk to clear my head.</p></div><a class="btn btn-ghost" href="/photos">full journal<!-- --> <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-right" aria-hidden="true"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg></a></div><div class="photo-wall"><a class="photo-tile real normal" aria-label="ESP-12-Based Home Automation Board" href="/photos/esp-12-based-home-automation-board"><img alt="Close-up of a custom ESP-12-based home automation board with relays and through-hole soldering." decoding="async" data-nimg="fill" class="photo-tile-img object-cover" style="position:absolute;height:100%;width:100%;left:0;top:0;right:0;bottom:0;color:transparent" sizes="(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw" srcSet="/_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20200713_173403-1600x2133.jpg%3Fv%3D1785332727470&amp;w=256&amp;q=75 256w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20200713_173403-1600x2133.jpg%3Fv%3D1785332727470&amp;w=384&amp;q=75 384w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20200713_173403-1600x2133.jpg%3Fv%3D1785332727470&amp;w=640&amp;q=75 640w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20200713_173403-1600x2133.jpg%3Fv%3D1785332727470&amp;w=750&amp;q=75 750w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20200713_173403-1600x2133.jpg%3Fv%3D1785332727470&amp;w=828&amp;q=75 828w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20200713_173403-1600x2133.jpg%3Fv%3D1785332727470&amp;w=1080&amp;q=75 1080w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20200713_173403-1600x2133.jpg%3Fv%3D1785332727470&amp;w=1200&amp;q=75 1200w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20200713_173403-1600x2133.jpg%3Fv%3D1785332727470&amp;w=1920&amp;q=75 1920w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20200713_173403-1600x2133.jpg%3Fv%3D1785332727470&amp;w=2048&amp;q=75 2048w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20200713_173403-1600x2133.jpg%3Fv%3D1785332727470&amp;w=3840&amp;q=75 3840w" src="/_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20200713_173403-1600x2133.jpg%3Fv%3D1785332727470&amp;w=3840&amp;q=75"/><span class="caption">ESP-12-Based Home Automation Board<span class="sep"> · </span>ƒ/2 · 1/33 · 4.12 mm · ISO715</span></a><a class="photo-tile real normal" aria-label="The 2019 e-lab innovations Logo on a 0.96-Inch OLED" href="/photos/the-2019-logo-on-a-096-inch-oled"><img alt="The 2019 e-lab innovations logo displayed on a 0.96-inch OLED using the U8G2 library." decoding="async" data-nimg="fill" class="photo-tile-img object-cover" style="position:absolute;height:100%;width:100%;left:0;top:0;right:0;bottom:0;
1color:transparent" sizes="(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw" srcSet="/_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20191001_204259-1600x1200.jpg%3Fv%3D1785332129403&amp;w=256&amp;q=75 256w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20191001_204259-1600x1200.jpg%3Fv%3D1785332129403&amp;w=384&amp;q=75 384w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20191001_204259-1600x1200.jpg%3Fv%3D1785332129403&amp;w=640&amp;q=75 640w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20191001_204259-1600x1200.jpg%3Fv%3D1785332129403&amp;w=750&amp;q=75 750w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20191001_204259-1600x1200.jpg%3Fv%3D1785332129403&amp;w=828&amp;q=75 828w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20191001_204259-1600x1200.jpg%3Fv%3D1785332129403&amp;w=1080&amp;q=75 1080w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20191001_204259-1600x1200.jpg%3Fv%3D1785332129403&amp;w=1200&amp;q=75 1200w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20191001_204259-1600x1200.jpg%3Fv%3D1785332129403&amp;w=1920&amp;q=75 1920w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20191001_204259-1600x1200.jpg%3Fv%3D1785332129403&amp;w=2048&amp;q=75 2048w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20191001_204259-1600x1200.jpg%3Fv%3D1785332129403&amp;w=3840&amp;q=75 3840w" src="/_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FIMG_20191001_204259-1600x1200.jpg%3Fv%3D1785332129403&amp;w=3840&amp;q=75"/><span class="caption">The 2019 e-lab innovations Logo on a 0.96-Inch OLED<span class="sep"> · </span>ƒ/2 · 1/13 · 4.12 mm · ISO1319</span></a></div><div class="text-center mt-8"><a class="btn-link" href="/photos"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-camera" aria-hidden="true"><path d="M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z"></path><circle cx="12" cy="13" r="3"></circle></svg> <!-- -->view all photos</a></div></div></section><section id="about" class="section-tight"><div class="container"><div class="card" style="padding:2.5rem;display:grid;grid-template-columns:auto 1fr;gap:2rem;align-items:center"><div class="flex items-center gap-5"><img src="https://elabins.com/media/Mohammed%20Ashad.png?v=1782105051658" alt="Mohammed Ashad" style="width:88px;height:88px;border-radius:50%;object-fit:cover;flex:none;border:2px solid var(--border-hi)"/><div><div class="eyebrow">// hi, I&#x27;m</div><div class="au-name" style="font-size:1.5rem;margin-top:0.5rem">Mohammed Ashad</div><div class="au-role" style="margin-top:0.25rem">Engineer · maker · technical writer</div></div></div><div><p style="color:var(--text-muted);font-size:1.05rem;line-height:1.65">I split my time between embedded firmware, cross-platform apps, and the kind of weekend projects that take three weekends. This site is where I write everything down so I don&#x27;t have to remember it twice, and so you don&#x27;t have to figure it out the hard way.</p><div class="flex gap-3 mt-5 flex-wrap items-center"><a class="btn btn-ghost btn-sm" href="/about">more about me<!-- --> <svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-right" aria-hidden="true"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg></a></div></div></div></div></section><section id="newsletter" class="section"><div class="container"><div class="newsletter"><div class="grid-bg"></div><div class="newsletter-inner"><span class="eyebrow center">// join the circuit</span><h2>Join the lab.</h2><p>Create a free account to get new posts in your inbox, comment on articles, and bookmark your favourites. Sign in with GitHub or Google — no email signup needed.</p><div class="flex justify-center gap-3 flex-wrap"><button class="btn btn-primary" type="button">join the lab<!-- --> <svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-right" aria-hidden="true"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg></button>
1<button class="btn btn-ghost" type="button">with GitHub<!-- --> <svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" width="15" height="15" fill="currentColor" aria-hidden="true"><title>GitHub</title><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></button></div><div class="newsletter-perks"><span>monthly cadence</span><span>no spam, ever</span><span>raw build notes</span><span>one-click unsubscribe</span></div></div></div></div></section><!--$--><!--/$--></main><footer class="footer"><div class="grid-bg"></div><div class="container relative"><div class="footer-grid"><div class="footer-brand"><div class="nav-brand"><img src="/logo-wide.svg" alt="e-lab innovations" style="height:44px;width:auto;display:block"/></div><p>A maker&#x27;s notebook at the intersection of hardware and software — long-form writing, weekend builds, and small useful apps.</p><div class="footer-socials"><a href="https://github.com/e-labInnovations" aria-label="github" target="_blank" rel="noopener noreferrer"><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" aria-hidden="true"><title>GitHub</title><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></a><a href="https://twitter.com/elabinnovations" aria-label="x" target="_blank" rel="noopener noreferrer"><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" aria-hidden="true"><title>X</title><path d="M14.234 10.162 22.977 0h-2.072l-7.591 8.824L7.251 0H.258l9.168 13.343L.258 24H2.33l8.016-9.318L16.749 24h6.993zm-2.837 3.299-.929-1.329L3.076 1.56h3.182l5.965 8.532.929 1.329 7.754 11.09h-3.182z"></path></svg></a><a href="https://linkedin.com/in/mohammed-ashad" aria-label="linkedin" target="_blank" rel="noopener noreferrer"><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" aria-hidden="true"><title>LinkedIn</title><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 0 1-2.063-2.065 2.063 2.063 0 1 1 2.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"></path></svg></a><a href="https://www.youtube.com/c/elabinnovations" aria-label="youtube" target="_blank" rel="noopener noreferrer"><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" aria-hidden="true"><title>YouTube</title><path d="M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z"></path></svg></a><a href="/feed.xml" aria-label="rss"><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" aria-hidden="true"><title>RSS</title><path d="M19.199 24C19.199 13.467 10.533 4.8 0 4.8V0c13.165 0 24 10.835 24 24h-4.801zM3.291 17.415c1.814 0 3.293 1.479 3.293 3.295 0 1.813-1.485 3.29-3.301 3.29C1.47 24 0 22.526 0 20.71s1.475-3.294 3.291-3.295zM15.909 24h-4.665c0-6.169-5.075-11.245-11.244-11.245V8.09c8.727 0 15.909 7.184 15.909 15.91z"></path></svg></a></div></div><div><h4>Explore</h4><ul><li><a href="/blog">Blog archive</a></li><li><a href="/apps">Live apps</a></li><li><a href="/photos">Photos</a></li><li><a href="/about">About</a></li><li><a href="/contact">Contact</a></li></ul></div><div><h4>Topics</h4><ul><li><a href="/blog?tag=esp32">#esp32</a></li><li><a href="/blog?tag=software">#software</a></li><li><a href="/blog?tag=hardware">#hardware</a></li><li><a href="/blog?tag=reverse-engineering">#reverse-engineering</a></li><li><a href="/blog?tag=tft">#tft</a></li></ul></div><div><h4>Get in touch</h4><ul><li>
1<a href="/cdn-cgi/l/email-protection#95f4e6fdf4f1d5f0f9f4f7fcfbe6bbf6faf8" target="_blank" rel="noopener noreferrer"><span class="__cf_email__" data-cfemail="50312338313410353c3132393e237e333f3d">[email&#160;protected]</span></a></li><li><a href="/contact">Speaking &amp; talks</a></li><li><a href="https://github.com/e-labInnovations" target="_blank" rel="noopener noreferrer">Open source</a></li><li><a href="/about">Now page</a></li></ul></div></div><div class="footer-bot"><div>© 2025 e-lab innovations · Mohammed Ashad</div><div style="color:var(--secondary)">v3.0</div></div></div></footer>
vendor: 108 bytes, line 1
1<script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
1<script src="/_next/static/chunks/webpack-875f557d33ab09f3.js" id="_R_" async=""></script>
1<script>(self.__next_f=self.__next_f||[]).push([0])</script>
1<script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[73550,[],\"\"]\n3:I[43812,[],\"\"]\n6:I[54663,[],\"OutletBoundary\"]\n8:I[38278,[],\"AsyncMetadataOutlet\"]\na:I[54663,[],\"ViewportBoundary\"]\nc:I[54663,[],\"MetadataBoundary\"]\nd:\"$Sreact.suspense\"\nf:I[18502,[],\"\"]\n10:I[44438,[],\"IconMark\"]\n:HL[\"/_next/static/media/2fe56c5e8a0dc232-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/558ca1a6aa3cb55e-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/56b5d6ac638045ae-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/c95d4fce0b415528-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/ed9cb87f7cefa820-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/f9fa7964f036c69d-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/css/91958c353a213ae2.css\",\"style\"]\n:HL[\"/_next/static/css/85b6ca73078cad9c.css\",\"style\"]\n:HL[\"/_next/static/css/422512bf9ff511bd.css\",\"style\"]\n"])</script>
1<script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"4KD-qejPRxgkqEr2Kczxg\",\"p\":\"\",\"c\":[\"\",\"\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"(app)\",{\"children\":[\"__PAGE__\",{}]},\"$undefined\",\"$undefined\",true]}],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"(app)\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/91958c353a213ae2.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/85b6ca73078cad9c.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"2\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/422512bf9ff511bd.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],\"$L4\"]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[\"$L5\",null,[\"$\",\"$L6\",null,{\"children\":[\"$L7\",[\"$\",\"$L8\",null,{\"promise\":\"$@9\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[[\"$\",\"$La\",null,{\"children\":\"$Lb\"}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]],[\"$\",\"$Lc\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$d\",null,{\"fallback\":null,\"children\":\"$Le\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$f\",[]],\"s\":false,\"S\":false}\n"])</script>
1<script>self.__next_f.push([1,"b:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"2\",{\"name\":\"theme-color\",\"media\":\"(prefers-color-scheme: dark)\",\"content\":\"#0a0e17\"}],[\"$\",\"meta\",\"3\",{\"name\":\"theme-color\",\"media\":\"(prefers-color-scheme: light)\",\"content\":\"#f8fafc\"}]]\n7:null\n"])</script>
1<script>self.__next_f.push([1,"9:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"e-lab innovations — Learn | Innovate | Share\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"A maker's notebook at the intersection of hardware and software. Long-form writing, weekend builds, and small useful apps.\"}],[\"$\",\"meta\",\"2\",{\"name\":\"author\",\"content\":\"Mohammed Ashad\"}],[\"$\",\"link\",\"3\",{\"rel\":\"manifest\",\"href\":\"/manifest.webmanifest\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"meta\",\"4\",{\"name\":\"keywords\",\"content\":\"embedded,hardware,software,maker,esp32,pcb,firmware,iot,blog\"}],[\"$\",\"meta\",\"5\",{\"name\":\"robots\",\"content\":\"index, follow\"}],[\"$\",\"meta\",\"6\",{\"name\":\"googlebot\",\"content\":\"index, follow, max-video-preview:-1, max-image-preview:large, max-snippet:-1\"}],[\"$\",\"link\",\"7\",{\"rel\":\"canonical\",\"href\":\"https://elabins.com\"}],[\"$\",\"meta\",\"8\",{\"name\":\"format-detection\",\"content\":\"telephone=no, date=no, address=no, email=no\"}],[\"$\",\"meta\",\"9\",{\"property\":\"og:title\",\"content\":\"e-lab innovations — Learn | Innovate | Share\"}],[\"$\",\"meta\",\"10\",{\"property\":\"og:description\",\"content\":\"A maker's notebook at the intersection of hardware and software. Long-form writing, weekend builds, and small useful apps.\"}],[\"$\",\"meta\",\"11\",{\"property\":\"og:url\",\"content\":\"https://elabins.com\"}],[\"$\",\"meta\",\"12\",{\"property\":\"og:site_name\",\"content\":\"e-lab innovations\"}],[\"$\",\"meta\",\"13\",{\"property\":\"og:image:alt\",\"content\":\"e-lab innovations — Learn | Innovate | Share\"}],[\"$\",\"meta\",\"14\",{\"property\":\"og:image:type\",\"content\":\"image/png\"}],[\"$\",\"meta\",\"15\",{\"property\":\"og:image\",\"content\":\"https://elabins.com/opengraph-image-xg4ifa?82d0972a81bfb364\"}],[\"$\",\"meta\",\"16\",{\"property\":\"og:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"17\",{\"property\":\"og:image:height\",\"content\":\"630\"}],[\"$\",\"meta\",\"18\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"$\",\"meta\",\"19\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"20\",{\"name\":\"twitter:creator\",\"content\":\"@elabinnovations\"}],[\"$\",\"meta\",\"21\",{\"name\":\"twitter:title\",\"content\":\"e-lab innovations — Learn | Innovate | Share\"}],[\"$\",\"meta\",\"22\",{\"name\":\"twitter:description\",\"content\":\"A maker's notebook at the intersection of hardware and software. Long-form writing, weekend builds, and small useful apps.\"}],[\"$\",\"meta\",\"23\",{\"name\":\"twitter:image:alt\",\"content\":\"e-lab innovations — Learn | Innovate | Share\"}],[\"$\",\"meta\",\"24\",{\"name\":\"twitter:image:type\",\"content\":\"image/png\"}],[\"$\",\"meta\",\"25\",{\"name\":\"twitter:image\",\"content\":\"https://elabins.com/twitter-image-xg4ifa?5fdafdf89ca714e6\"}],[\"$\",\"meta\",\"26\",{\"name\":\"twitter:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"27\",{\"name\":\"twitter:image:height\",\"content\":\"630\"}],[\"$\",\"link\",\"28\",{\"rel\":\"icon\",\"href\":\"/favicon.ico\",\"type\":\"image/x-icon\",\"sizes\":\"16x16\"}],[\"$\",\"link\",\"29\",{\"rel\":\"icon\",\"href\":\"/favicon.ico\",\"sizes\":\"any\"}],[\"$\",\"link\",\"30\",{\"rel\":\"icon\",\"href\":\"/icons/icon-32.png\",\"type\":\"image/png\",\"sizes\":\"32x32\"}],[\"$\",\"link\",\"31\",{\"rel\":\"icon\",\"href\":\"/icons/icon-192.png\",\"type\":\"image/png\",\"sizes\":\"192x192\"}],[\"$\",\"link\",\"32\",{\"rel\":\"icon\",\"href\":\"/logo.svg\",\"type\":\"image/svg+xml\"}],[\"$\",\"link\",\"33\",{\"rel\":\"apple-touch-icon\",\"href\":\"/icons/icon-180.png\",\"sizes\":\"180x180\",\"type\":\"image/png\"}],[\"$\",\"$L10\",\"34\",{}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script>
1<script>self.__next_f.push([1,"e:\"$9:metadata\"\n"])</script>
1<script>self.__next_f.push([1,"11:I[70423,[\"27815\",\"static/chunks/50101cec-1de6d22ba4b0bd0a.js\",\"37209\",\"static/chunks/794ffb4d-a6b36147a9b951ab.js\",\"13843\",\"static/chunks/13843-eb9aa2fce9e894a5.js\",\"70827\",\"static/chunks/70827-3099a06c986fa445.js\",\"50881\",\"static/chunks/50881-03b6e3de96535131.js\",\"4944\",\"static/chunks/app/(app)/layout-74ada51a59c96b38.js\"],\"RouteTransitionRoot\"]\n12:I[67960,[\"27815\",\"static/chunks/50101cec-1de6d22ba4b0bd0a.js\",\"37209\",\"static/chunks/794ffb4d-a6b36147a9b951ab.js\",\"13843\",\"static/chunks/13843-eb9aa2fce9e894a5.js\",\"70827\",\"static/chunks/70827-3099a06c986fa445.js\",\"50881\",\"static/chunks/50881-03b6e3de96535131.js\",\"4944\",\"static/chunks/app/(app)/layout-74ada51a59c96b38.js\"],\"Nav\"]\n"])</script>
1<script>self.__next_f.push([1,"4:[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"__variable_984529 __variable_898c26\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"(function(){try{var t=localStorage.getItem('elab-theme');if(!t){t='dark'}document.documentElement.setAttribute('data-theme',t);}catch(e){document.documentElement.setAttribute('data-theme','dark');}})();\"}}]}],[\"$\",\"body\",null,{\"className\":\"antialiased\",\"children\":[\"$\",\"$L11\",null,{\"children\":[[\"$\",\"$L12\",null,{\"user\":null,\"data\":{\"brandName\":\"e-lab innovations\",\"brandTagline\":\"learn | innovate | share\",\"links\":[{\"label\":\"home\",\"href\":\"/\"},{\"label\":\"blog\",\"href\":\"/blog\"},{\"label\":\"apps\",\"href\":\"/apps\"},{\"label\":\"photos\",\"href\":\"/photos\"},{\"label\":\"about\",\"href\":\"/about\"},{\"label\":\"Contact\",\"href\":\"/contact\"}],\"joinCtaLabel\":\"join\"},\"libraryCounts\":null,\"subscribed\":false}],[\"$\",\"main\",null,{\"children\":[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[\"$L13\",[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}],[\"$\",\"footer\",null,{\"className\":\"footer\",\"children\":[[\"$\",\"div\",null,{\"className\":\"grid-bg\"}],[\"$\",\"div\",null,{\"className\":\"container relative\",\"children\":[[\"$\",\"div\",null,{\"className\":\"footer-grid\",\"children\":[[\"$\",\"div\",null,{\"className\":\"footer-brand\",\"children\":[[\"$\",\"div\",null,{\"className\":\"nav-brand\",\"children\":[\"$\",\"img\",null,{\"src\":\"/logo-wide.svg\",\"alt\":\"e-lab innovations\",\"style\":{\"height\":44,\"width\":\"auto\",\"display\":\"block\"}}]}],[\"$\",\"p\",null,{\"children\":\"A maker's notebook at the intersection of hardware and software — long-form writing, weekend builds, and small useful apps.\"}],[\"$\",\"div\",null,{\"className\":\"footer-socials\",\"children\":[[\"$\",\"a\",\"GitHub-0\",{\"href\":\"https://github.com/e-labInnovations\",\"aria-label\":\"github\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"children\":[\"$\",\"svg\",null,{\"role\":\"img\",\"viewBox\":\"0 0 24 24\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":16,\"height\":16,\"fill\":\"currentColor\",\"aria-hidden\":true,\"children\":[[\"$\",\"title\",null,{\"children\":\"GitHub\"}],[\"$\",\"path\",null,{\"d\":\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\"}]]}]}],[\"$\",\"a\",\"X-1\",{\"href\":\"https://twitter.com/elabinnovations\",\"aria-label\":\"x\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"children\":[\"$\",\"svg\",null,{\"role\":\"img\",\"viewBox\":\"0 0 24 24\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":16,\"height\":16,\"fill\":\"currentColor\",\"aria-hidden\":true,\"children\":[[\"$\",\"title\",null,{\"children\":\"X\"}],[\"$\",\"path\",null,{\"d\":\"M14.234 10.162 22.977 0h-2.072l-7.591 8.824L7.251 0H.258l9.168 13.343L.258 24H2.33l8.016-9.318L16.749 24h6.993zm-2.837 3.299-.929-1.329L3.076 1.56h3.182l5.965 8.532.929 1.329 7.754 11.09h-3.182z\"}]]}]}],[\"$\",\"a\",\"LinkedIn-2\",{\"href\":\"https://linkedin.com/in/mohammed-ashad\",\"aria-label\":\"linkedin\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"children\":[\"$\",\"svg\",null,{\"role\":\"img\",\"viewBox\":\"0 0 24 24\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":16,\"height\"
1:16,\"fill\":\"currentColor\",\"aria-hidden\":true,\"children\":[[\"$\",\"title\",null,{\"children\":\"LinkedIn\"}],[\"$\",\"path\",null,{\"d\":\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 0 1-2.063-2.065 2.063 2.063 0 1 1 2.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z\"}]]}]}],\"$L14\",\"$L15\"]}]]}],[\"$L16\",\"$L17\",\"$L18\"]]}],\"$L19\"]}]]}],\"$L1a\"]}]}]]}]\n"])</script>
1<script>self.__next_f.push([1,"1b:I[40808,[\"27815\",\"static/chunks/50101cec-1de6d22ba4b0bd0a.js\",\"37209\",\"static/chunks/794ffb4d-a6b36147a9b951ab.js\",\"13843\",\"static/chunks/13843-eb9aa2fce9e894a5.js\",\"70827\",\"static/chunks/70827-3099a06c986fa445.js\",\"79892\",\"static/chunks/79892-30f6d0548c439de9.js\",\"11984\",\"static/chunks/11984-7159932817e42165.js\",\"29415\",\"static/chunks/app/(app)/page-92ccc98e2d9101b6.js\"],\"Link\"]\n1c:I[96704,[\"27815\",\"static/chunks/50101cec-1de6d22ba4b0bd0a.js\",\"37209\",\"static/chunks/794ffb4d-a6b36147a9b951ab.js\",\"13843\",\"static/chunks/13843-eb9aa2fce9e894a5.js\",\"70827\",\"static/chunks/70827-3099a06c986fa445.js\",\"50881\",\"static/chunks/50881-03b6e3de96535131.js\",\"4944\",\"static/chunks/app/(app)/layout-74ada51a59c96b38.js\"],\"GlobalChrome\",1]\n1e:I[14585,[\"27815\",\"static/chunks/50101cec-1de6d22ba4b0bd0a.js\",\"37209\",\"static/chunks/794ffb4d-a6b36147a9b951ab.js\",\"13843\",\"static/chunks/13843-eb9aa2fce9e894a5.js\",\"70827\",\"static/chunks/70827-3099a06c986fa445.js\",\"79892\",\"static/chunks/79892-30f6d0548c439de9.js\",\"11984\",\"static/chunks/11984-7159932817e42165.js\",\"29415\",\"static/chunks/app/(app)/page-92ccc98e2d9101b6.js\"],\"default\"]\n"])</script>
1<script>self.__next_f.push([1,"14:[\"$\",\"a\",\"YouTube-3\",{\"href\":\"https://www.youtube.com/c/elabinnovations\",\"aria-label\":\"youtube\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"children\":[\"$\",\"svg\",null,{\"role\":\"img\",\"viewBox\":\"0 0 24 24\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":16,\"height\":16,\"fill\":\"currentColor\",\"aria-hidden\":true,\"children\":[[\"$\",\"title\",null,{\"children\":\"YouTube\"}],[\"$\",\"path\",null,{\"d\":\"M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z\"}]]}]}]\n"])</script>
1<script>self.__next_f.push([1,"15:[\"$\",\"a\",\"RSS-4\",{\"href\":\"/feed.xml\",\"aria-label\":\"rss\",\"target\":\"$undefined\",\"rel\":\"$undefined\",\"children\":[\"$\",\"svg\",null,{\"role\":\"img\",\"viewBox\":\"0 0 24 24\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":16,\"height\":16,\"fill\":\"currentColor\",\"aria-hidden\":true,\"children\":[[\"$\",\"title\",null,{\"children\":\"RSS\"}],[\"$\",\"path\",null,{\"d\":\"M19.199 24C19.199 13.467 10.533 4.8 0 4.8V0c13.165 0 24 10.835 24 24h-4.801zM3.291 17.415c1.814 0 3.293 1.479 3.293 3.295 0 1.813-1.485 3.29-3.301 3.29C1.47 24 0 22.526 0 20.71s1.475-3.294 3.291-3.295zM15.909 24h-4.665c0-6.169-5.075-11.245-11.244-11.245V8.09c8.727 0 15.909 7.184 15.909 15.91z\"}]]}]}]\n16:[\"$\",\"div\",\"Explore-0\",{\"children\":[[\"$\",\"h4\",null,{\"children\":\"Explore\"}],[\"$\",\"ul\",null,{\"children\":[[\"$\",\"li\",\"/blog-0\",{\"children\":[\"$\",\"$L1b\",null,{\"href\":\"/blog\",\"children\":\"Blog archive\"}]}],[\"$\",\"li\",\"/apps-1\",{\"children\":[\"$\",\"$L1b\",null,{\"href\":\"/apps\",\"children\":\"Live apps\"}]}],[\"$\",\"li\",\"/photos-2\",{\"children\":[\"$\",\"$L1b\",null,{\"href\":\"/photos\",\"children\":\"Photos\"}]}],[\"$\",\"li\",\"/about-3\",{\"children\":[\"$\",\"$L1b\",null,{\"href\":\"/about\",\"children\":\"About\"}]}],[\"$\",\"li\",\"/contact-4\",{\"children\":[\"$\",\"$L1b\",null,{\"href\":\"/contact\",\"children\":\"Contact\"}]}]]}]]}]\n"])</script>
1<script>self.__next_f.push([1,"17:[\"$\",\"div\",\"Topics-1\",{\"children\":[[\"$\",\"h4\",null,{\"children\":\"Topics\"}],[\"$\",\"ul\",null,{\"children\":[[\"$\",\"li\",\"/blog?tag=esp32-0\",{\"children\":[\"$\",\"$L1b\",null,{\"href\":\"/blog?tag=esp32\",\"children\":\"#esp32\"}]}],[\"$\",\"li\",\"/blog?tag=software-1\",{\"children\":[\"$\",\"$L1b\",null,{\"href\":\"/blog?tag=software\",\"children\":\"#software\"}]}],[\"$\",\"li\",\"/blog?tag=hardware-2\",{\"children\":[\"$\",\"$L1b\",null,{\"href\":\"/blog?tag=hardware\",\"children\":\"#hardware\"}]}],[\"$\",\"li\",\"/blog?tag=reverse-engineering-3\",{\"children\":[\"$\",\"$L1b\",null,{\"href\":\"/blog?tag=reverse-engineering\",\"children\":\"#reverse-engineering\"}]}],[\"$\",\"li\",\"/blog?tag=tft-4\",{\"children\":[\"$\",\"$L1b\",null,{\"href\":\"/blog?tag=tft\",\"children\":\"#tft\"}]}]]}]]}]\n"])</script>
1<script>self.__next_f.push([1,"18:[\"$\",\"div\",\"Get in touch-2\",{\"children\":[[\"$\",\"h4\",null,{\"children\":\"Get in touch\"}],[\"$\",\"ul\",null,{\"children\":[[\"$\",\"li\",\"mailto:[email protected]\",{\"children\":[\"$\",\"a\",null,{\"href\":\"mailto:[email protected]\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"children\":\"[email protected]\"}]}],[\"$\",\"li\",\"/contact-1\",{\"children\":[\"$\",\"$L1b\",null,{\"href\":\"/contact\",\"children\":\"Speaking \u0026 talks\"}]}],[\"$\",\"li\",\"https://github.com/e-labInnovations-2\",{\"children\":[\"$\",\"a\",null,{\"href\":\"https://github.com/e-labInnovations\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"children\":\"Open source\"}]}],[\"$\",\"li\",\"/about-3\",{\"children\":[\"$\",\"$L1b\",null,{\"href\":\"/about\",\"children\":\"Now page\"}]}]]}]]}]\n"])</script>
1<script>self.__next_f.push([1,"19:[\"$\",\"div\",null,{\"className\":\"footer-bot\",\"children\":[[\"$\",\"div\",null,{\"children\":\"© 2025 e-lab innovations · Mohammed Ashad\"}],[\"$\",\"div\",null,{\"style\":{\"color\":\"var(--secondary)\"},\"children\":\"v3.0\"}]]}]\n1a:[\"$\",\"$L1c\",null,{}]\n"])</script>
1<script>self.__next_f.push([1,"13:[\"$L1d\",[\"$\",\"section\",null,{\"className\":\"not-found\",\"children\":[[\"$\",\"div\",null,{\"className\":\"grid-bg\"}],[\"$\",\"div\",null,{\"className\":\"glow-orb primary\",\"style\":{\"width\":320,\"height\":320,\"top\":\"-15%\",\"left\":\"-10%\"}}],[\"$\",\"div\",null,{\"className\":\"glow-orb secondary\",\"style\":{\"width\":360,\"height\":360,\"bottom\":\"-20%\",\"right\":\"-15%\"}}],[\"$\",\"div\",null,{\"className\":\"relative z-10 flex flex-col items-center text-center\",\"children\":[[\"$\",\"span\",null,{\"className\":\"nf-status\",\"children\":[[\"$\",\"span\",null,{\"className\":\"dot\"}],\" signal_lost\"]}],[\"$\",\"div\",null,{\"className\":\"mb-4\",\"children\":[\"$\",\"svg\",null,{\"className\":\"brand-mark\",\"viewBox\":\"0 0 40 40\",\"width\":56,\"height\":56,\"aria-hidden\":\"true\",\"children\":[[\"$\",\"defs\",null,{\"children\":[\"$\",\"linearGradient\",null,{\"id\":\"bm-404\",\"x1\":\"0\",\"y1\":\"0\",\"x2\":\"1\",\"y2\":\"1\",\"children\":[[\"$\",\"stop\",null,{\"offset\":\"0%\",\"stopColor\":\"var(--primary)\"}],[\"$\",\"stop\",null,{\"offset\":\"100%\",\"stopColor\":\"var(--secondary)\"}]]}]}],[\"$\",\"circle\",null,{\"cx\":\"20\",\"cy\":\"20\",\"r\":\"18.25\",\"fill\":\"none\",\"stroke\":\"url(#bm-404)\",\"strokeWidth\":\"1.6\"}],[\"$\",\"polygon\",null,{\"points\":\"20,7 31.26,13.5 31.26,26.5 20,33 8.74,26.5 8.74,13.5\",\"fill\":\"none\",\"stroke\":\"url(#bm-404)\",\"strokeWidth\":\"1\",\"strokeLinejoin\":\"round\",\"opacity\":\"0.55\"}],[\"$\",\"circle\",null,{\"cx\":\"20\",\"cy\":\"7\",\"r\":\"1.7\",\"fill\":\"url(#bm-404)\"}],[\"$\",\"text\",null,{\"x\":\"20\",\"y\":\"26\",\"textAnchor\":\"middle\",\"fontFamily\":\"var(--font-sans)\",\"fontSize\":\"17\",\"fontWeight\":\"700\",\"fill\":\"url(#bm-404)\",\"style\":{\"letterSpacing\":\"-0.02em\"},\"children\":\"e\"}]]}]}],[\"$\",\"div\",null,{\"className\":\"nf-code\",\"children\":\"404\"}],[\"$\",\"div\",null,{\"className\":\"nf-readout\",\"children\":\"not_found\"}],[\"$\",\"h1\",null,{\"className\":\"nf-headline\",\"children\":\"This page never shipped.\"}],[\"$\",\"p\",null,{\"className\":\"nf-text\",\"children\":\"Either the link is wrong, the post was retired, or it's a corner of the site that never made it out of the workshop.\"}],\"$undefined\",[\"$\",\"div\",null,{\"className\":\"nf-actions\",\"children\":[[\"$\",\"$L1b\",null,{\"href\":\"/\",\"className\":\"btn btn-primary\",\"children\":[[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":[[\"path\",{\"d\":\"M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8\",\"key\":\"5wwlr5\"}],[\"path\",{\"d\":\"M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\",\"key\":\"r6nss1\"}]],\"className\":\"lucide-house\",\"size\":14}],\" back to home\"]}],[\"$\",\"$L1b\",null,{\"href\":\"/blog\",\"className\":\"btn btn-ghost\",\"children\":[[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":[[\"path\",{\"d\":\"m12 19-7-7 7-7\",\"key\":\"1l729n\"}],[\"path\",{\"d\":\"M19 12H5\",\"key\":\"x3x0zl\"}]],\"className\":\"lucide-arrow-left\",\"size\":14}],\" browse the archive\"]}]]}],[\"$\",\"div\",null,{\"className\":\"nf-suggest\",\"children\":[[\"$\",\"$L1b\",null,{\"href\":\"/blog\",\"children\":[[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":[[\"path\",{\"d\":\"M12 7v14\",\"key\":\"1akyts\"}],[\"path\",{\"d\":\"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z\",\"key\":\"ruj8y\"}]],\"className\":\"lucide-book-open\",\"size\":20}],[\"$\",\"span\",null,{\"children\":\"blog\"}]]}],[\"$\",\"$L1b\",null,{\"href\":\"/apps\",\"children\":[[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":[[\"path\",{\"d\":\"M12 19h8\",\"key\":\"baeox8\"}],[\"path\",{\"d\":\"m4 17 6-6-6-6\",\"key\":\"1yngyt\"}]],\"className\":\"lucide-terminal\",\"size\":20}],[\"$\",\"span\",null,{\"children\":\"apps\"}]]}],[\"$\",\"$L1b\",null,{\"href\":\"/photos\",\"children\":[[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":[[\"path\",{\"d\":\"M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z\",\"key\":\"18u6gg\"}],[\"circle\",{\"cx\":\"12\",\"cy\":\"13\",\"r\":\"3\",\"key\":\"1vg3eu\"}]],\"className\":\"lucide-camera\",\"size\":20}],[\"$\",\"span\",null,{\"children\":\"photos\"}]]}]]}]]}]]}]]\n"])</script>
1<script>self.__next_f.push([1,"1d:null\n"])</script>
1<script>self.__next_f.push([1,"20:I[55624,[\"27815\",\"static/chunks/50101cec-1de6d22ba4b0bd0a.js\",\"37209\",\"static/chunks/794ffb4d-a6b36147a9b951ab.js\",\"13843\",\"static/chunks/13843-eb9aa2fce9e894a5.js\",\"70827\",\"static/chunks/70827-3099a06c986fa445.js\",\"79892\",\"static/chunks/79892-30f6d0548c439de9.js\",\"11984\",\"static/chunks/11984-7159932817e42165.js\",\"29415\",\"static/chunks/app/(app)/page-92ccc98e2d9101b6.js\"],\"ParticlesCanvas\"]\n21:I[88340,[\"27815\",\"static/chunks/50101cec-1de6d22ba4b0bd0a.js\",\"37209\",\"static/chunks/794ffb4d-a6b36147a9b951ab.js\",\"13843\",\"static/chunks/13843-eb9aa2fce9e894a5.js\",\"70827\",\"static/chunks/70827-3099a06c986fa445.js\",\"79892\",\"static/chunks/79892-30f6d0548c439de9.js\",\"11984\",\"static/chunks/11984-7159932817e42165.js\",\"29415\",\"static/chunks/app/(app)/page-92ccc98e2d9101b6.js\"],\"LucideIcon\"]\n1f:T6e4,"])</script>
1<script>self.__next_f.push([1,"{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://elabins.com/#organization\",\"name\":\"e-lab innovations\",\"url\":\"https://elabins.com/\",\"description\":\"A maker's notebook at the intersection of hardware and software.\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://elabins.com/logo-wide.png\",\"width\":620,\"height\":192},\"sameAs\":[\"https://github.com/e-labInnovations\",\"https://twitter.com/elabinnovations\",\"https://linkedin.com/in/mohammed-ashad\",\"https://www.youtube.com/c/elabinnovations\"],\"founder\":{\"@id\":\"https://elabins.com/about#person\"}},{\"@type\":\"Person\",\"@id\":\"https://elabins.com/about#person\",\"name\":\"Mohammed Ashad\",\"url\":\"https://elabins.com/about\",\"sameAs\":[\"https://github.com/e-labInnovations\",\"https://twitter.com/elabinnovations\",\"https://linkedin.com/in/mohammed-ashad\",\"https://www.youtube.com/c/elabinnovations\"],\"worksFor\":{\"@id\":\"https://elabins.com/#organization\"}},{\"@type\":\"WebSite\",\"@id\":\"https://elabins.com/#website\",\"name\":\"e-lab innovations\",\"url\":\"https://elabins.com/\",\"description\":\"A maker's notebook at the intersection of hardware and software — long-form writing, weekend builds, and small useful apps.\",\"publisher\":{\"@id\":\"https://elabins.com/#organization\"},\"potentialAction\":{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https://elabins.com/blog?q={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}},{\"@type\":\"WebPage\",\"@id\":\"https://elabins.com/#webpage\",\"url\":\"https://elabins.com/\",\"name\":\"e-lab innovations — Learn | Innovate | Share\",\"description\":\"A maker's notebook at the intersection of hardware and software. Long-form writing, weekend builds, and small useful apps.\",\"inLanguage\":\"en\",\"isPartOf\":{\"@id\":\"https://elabins.com/#website\"}}]}"])</script>
1<script>self.__next_f.push([1,"5:[[\"$\",\"script\",null,{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"$1f\"}}],[[\"$\",\"section\",\"hero\",{\"className\":\"hero\",\"children\":[[\"$\",\"$L20\",null,{}],[\"$\",\"div\",null,{\"className\":\"grid-bg\"}],[\"$\",\"div\",null,{\"className\":\"glow-orb primary\",\"style\":{\"width\":480,\"height\":480,\"top\":\"-20%\",\"left\":\"-10%\"}}],[\"$\",\"div\",null,{\"className\":\"glow-orb secondary\",\"style\":{\"width\":520,\"height\":520,\"bottom\":\"-25%\",\"right\":\"-15%\"}}],[\"$\",\"div\",null,{\"className\":\"hero-content\",\"children\":[[\"$\",\"div\",null,{\"className\":\"hero-from\",\"children\":[[\"$\",\"span\",null,{\"className\":\"pulse\"}],\" \",\"from Mohammed Ashad\"]}],[\"$\",\"h1\",null,{\"className\":\"hero-title\",\"children\":[[\"$\",\"span\",null,{\"className\":\"h-grad\",\"children\":\"e-lab\"}],[\"$\",\"br\",null,{}],\"innovations\",[\"$\",\"span\",null,{\"className\":\"dot\",\"children\":\".\"}]]}],[\"$\",\"div\",null,{\"className\":\"hero-tag\",\"children\":[[\"$\",\"$1\",\"Learn-0\",{\"children\":[false,[\"$\",\"span\",null,{\"children\":\"Learn\"}]]}],[\"$\",\"$1\",\"Innovate-1\",{\"children\":[[\"$\",\"em\",null,{\"children\":\"·\"}],[\"$\",\"span\",null,{\"children\":\"Innovate\"}]]}],[\"$\",\"$1\",\"Share-2\",{\"children\":[[\"$\",\"em\",null,{\"children\":\"·\"}],[\"$\",\"span\",null,{\"children\":\"Share\"}]]}]]}],[\"$\",\"p\",null,{\"className\":\"hero-desc\",\"children\":\"Exploring the intersection of hardware and software to create innovative solutions for tomorrow's challenges. A maker's notebook — long-form writing, weekend builds, and small useful apps.\"}],[\"$\",\"div\",null,{\"className\":\"hero-cta\",\"children\":[[\"$\",\"$L1b\",null,{\"href\":\"/blog\",\"className\":\"btn btn-primary\",\"children\":[\"read the blog\",\" \",[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":[[\"path\",{\"d\":\"M5 12h14\",\"key\":\"1ays0h\"}],[\"path\",{\"d\":\"m12 5 7 7-7 7\",\"key\":\"xquz4c\"}]],\"className\":\"lucide-arrow-right\",\"size\":15}]]}],[\"$\",\"$L1b\",null,{\"href\":\"/apps\",\"className\":\"btn btn-ghost\",\"children\":[[\"$\",\"$L21\",null,{\"name\":\"terminal\",\"size\":15}],\"see live apps\"]}]]}],[\"$\",\"div\",null,{\"className\":\"hero-stats\",\"children\":[[\"$\",\"div\",\"articles-0\",{\"children\":[[\"$\",\"div\",null,{\"className\":\"num\",\"children\":\"16\"}],[\"$\",\"div\",null,{\"className\":\"lbl\",\"children\":\"articles\"}]]}],[\"$\",\"div\",\"live apps-1\",{\"children\":[[\"$\",\"div\",null,{\"className\":\"num\",\"children\":\"6\"}],[\"$\",\"div\",null,{\"className\":\"lbl\",\"children\":\"live apps\"}]]}],[\"$\",\"div\",\"readers/mo-2\",{\"children\":[\"$L22\",\"$L23\"]}],\"$L24\"]}]]}],\"$L25\"]}],\"$L26\",\"$L27\",\"$L28\",\"$L29\",null,\"$L2a\"]]\n"])</script>
1<script>self.__next_f.push([1,"2b:I[79892,[\"27815\",\"static/chunks/50101cec-1de6d22ba4b0bd0a.js\",\"37209\",\"static/chunks/794ffb4d-a6b36147a9b951ab.js\",\"13843\",\"static/chunks/13843-eb9aa2fce9e894a5.js\",\"70827\",\"static/chunks/70827-3099a06c986fa445.js\",\"79892\",\"static/chunks/79892-30f6d0548c439de9.js\",\"11984\",\"static/chunks/11984-7159932817e42165.js\",\"29415\",\"static/chunks/app/(app)/page-92ccc98e2d9101b6.js\"],\"Image\"]\n3c:I[51173,[\"27815\",\"static/chunks/50101cec-1de6d22ba4b0bd0a.js\",\"37209\",\"static/chunks/794ffb4d-a6b36147a9b951ab.js\",\"13843\",\"static/chunks/13843-eb9aa2fce9e894a5.js\",\"70827\",\"static/chunks/70827-3099a06c986fa445.js\",\"79892\",\"static/chunks/79892-30f6d0548c439de9.js\",\"11984\",\"static/chunks/11984-7159932817e42165.js\",\"29415\",\"static/chunks/app/(app)/page-92ccc98e2d9101b6.js\"],\"SubscribeButton\"]\n22:[\"$\",\"div\",null,{\"className\":\"num\",\"children\":\"-\"}]\n23:[\"$\",\"div\",null,{\"className\":\"lbl\",\"children\":\"readers/mo\"}]\n24:[\"$\",\"div\",\"tinkering-3\",{\"children\":[[\"$\",\"div\",null,{\"className\":\"num\",\"children\":\"10 yrs\"}],[\"$\",\"div\",null,{\"className\":\"lbl\",\"children\":\"tinkering\"}]]}]\n25:[\"$\",\"div\",null,{\"className\":\"hero-scroll\",\"aria-label\":\"scroll down\",\"children\":[[\"$\",\"svg\",null,{\"className\":\"scroll-mouse\",\"viewBox\":\"0 0 20 32\",\"width\":\"18\",\"height\":\"28\",\"aria-hidden\":\"true\",\"children\":[[\"$\",\"rect\",null,{\"x\":\"1\",\"y\":\"1\",\"width\":\"18\",\"height\":\"30\",\"rx\":\"9\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":\"1.5\"}],[\"$\",\"circle\",null,{\"className\":\"scroll-dot\",\"cx\":\"10\",\"cy\":\"9\",\"r\":\"1.6\",\"fill\":\"currentColor\"}]]}],[\"$\",\"div\",null,{\"className\":\"line\"}]]}]\n"])</script>
1<script>self.__next_f.push([1,"26:[\"$\",\"section\",\"blog\",{\"id\":\"blog\",\"className\":\"section\",\"children\":[\"$\",\"div\",null,{\"className\":\"container\",\"children\":[[\"$\",\"div\",null,{\"className\":\"section-head\",\"children\":[[\"$\",\"div\",null,{\"className\":\"title-block\",\"children\":[[\"$\",\"span\",null,{\"className\":\"eyebrow\",\"children\":\"// recent writings\"}],[\"$\",\"h2\",null,{\"children\":\"From the notebook\"}],[\"$\",\"p\",null,{\"children\":\"Long-form posts on hardware projects, software craft, and the surprisingly fuzzy line between them.\"}]]}],[\"$\",\"$L1b\",null,{\"href\":\"/blog\",\"className\":\"btn btn-ghost\",\"children\":[\"view archive\",\" \",[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$5:1:0:props:children:4:props:children:4:props:children:0:props:children:2:props:iconNode\",\"className\":\"lucide-arrow-right\",\"size\":14}]]}]]}],[\"$\",\"div\",null,{\"className\":\"blog-grid\",\"children\":[[\"$\",\"$L1b\",\"50297b2c-8f72-4b9a-8539-80bbfd5b84df\",{\"href\":\"/blog/making-a-wch-link-clone-program-the-unsupported-ch32v003\",\"className\":\"card card-glow-primary blog-card\",\"aria-label\":\"Making a WCH-Link clone program the unsupported CH32V003\",\"children\":[[\"$\",\"div\",null,{\"className\":\"thumb relative\",\"children\":[[\"$\",\"$L2b\",null,{\"src\":\"https://elabins.com/media/ch549-link-thumbnail-1280x720.png?v=1789921984589\",\"alt\":\"A CH32V003 on a breadboard with a lit LED, wired to a WCH-Link clone, beside a laptop running the ch549-link web flasher mid-erase\",\"fill\":true,\"sizes\":\"(max-width: 640px) 100vw, (max-width: 960px) 50vw, 33vw\",\"className\":\"object-cover\"}],[\"$\",\"div\",null,{\"className\":\"corner-tag\",\"children\":[\"$\",\"span\",null,{\"className\":\"cat-pill\",\"style\":{\"--cat-dot\":\"hsl(28 85% 53%)\"},\"children\":\"Hardware\"}]}]]}],[\"$\",\"div\",null,{\"className\":\"body\",\"children\":[[\"$\",\"div\",null,{\"className\":\"meta\",\"children\":[[\"$\",\"span\",null,{\"className\":\"inline-flex items-center gap-1\",\"children\":[[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":[[\"path\",{\"d\":\"M8 2v4\",\"key\":\"1cmpym\"}],[\"path\",{\"d\":\"M16 2v4\",\"key\":\"4m81vk\"}],[\"rect\",{\"width\":\"18\",\"height\":\"18\",\"x\":\"3\",\"y\":\"4\",\"rx\":\"2\",\"key\":\"1hopcy\"}],[\"path\",{\"d\":\"M3 10h18\",\"key\":\"8toen8\"}]],\"className\":\"lucide-calendar\",\"size\":11}],\" \",\"Sep 20, 2026\"]}],[\"$\",\"span\",null,{\"className\":\"sep\",\"children\":\"/\"}],[\"$\",\"span\",null,{\"className\":\"inline-flex items-center gap-1\",\"children\":[[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":[[\"circle\",{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"10\",\"key\":\"1mglay\"}],[\"path\",{\"d\":\"M12 6v6l4 2\",\"key\":\"mmk7yg\"}]],\"className\":\"lucide-clock\",\"size\":11}],\" \",\"24 min read\"]}]]}],[\"$\",\"h3\",null,{\"children\":\"Making a WCH-Link clone program the unsupported CH32V003\"}],[\"$\",\"p\",null,{\"className\":\"excerpt\",\"children\":\"The listing said CH32V003 not supported. The hardware was never the problem, the firmware was, so I replaced it.\"}],[\"$\",\"div\",null,{\"className\":\"tags\",\"children\":[[\"$\",\"span\",\"7bfbd453-cd3e-4800-8efb-0a42fa9ec31c\",{\"className\":\"tag\",\"children\":\"CH32V003\"}],[\"$\",\"span\",\"a3e8dfa5-0f7a-40d6-b431-85ba91373050\",{\"className\":\"tag\",\"children\":\"CH549\"}],[\"$\",\"span\",\"d2ec5093-2df0-4bf9-ae37-2ab3085a9efd\",{\"className\":\"tag\",\"children\":\"WCH-Link\"}],[\"$\",\"span\",\"042aec3f-7abf-4ee5-80c1-1b10a1849cf7\",{\"className\":\"tag\",\"children\":\"RISC-V\"}]]}],[\"$\",\"div\",null,{\"className\":\"read\",\"children\":[[\"$\",\"span\",null,{\"children\":\"read article\"}],[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$5:1:0:props:children:4:props:children:4:props:children:0:props:children:2:props:iconNode\",\"className\":\"lucide-arrow-right\",\"size\":14}]]}]]}]]}],[\"$\",\"$L1b\",\"ffb9a0e7-a23c-4cb1-9af2-b0fb6f276b1a\",{\"href\":\"/blog/building-clipix-a-clipy-style-clipboard-manager-for-gnome\",\"className\":\"card card-glow-primary blog-card\",\"aria-label\":\"Building Clipix, a Clipy-style clipboard manager for GNOME\",\"children\":[[\"$\",\"div\",null,{\"className\":\"thumb relative\",\"children\":[[\"$\",\"$L2b\",null,{\"src\":\"https://elabins.com/media/clipix-thumbn
1ail-1280x720.png?v=1788678908555\",\"alt\":\"Building Clipix, a Clipy-style clipboard manager for GNOME\",\"fill\":true,\"sizes\":\"(max-width: 640px) 100vw, (max-width: 960px) 50vw, 33vw\",\"className\":\"object-cover\"}],[\"$\",\"div\",null,{\"className\":\"corner-tag\",\"children\":[\"$\",\"span\",null,{\"className\":\"cat-pill\",\"style\":{\"--cat-dot\":\"hsl(217 85% 55%)\"},\"children\":\"Software\"}]}]]}],[\"$\",\"div\",null,{\"className\":\"body\",\"children\":[[\"$\",\"div\",null,{\"className\":\"meta\",\"children\":[[\"$\",\"span\",null,{\"className\":\"inline-flex items-center gap-1\",\"children\":[[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$26:props:children:props:children:1:props:children:0:props:children:1:props:children:0:props:children:0:props:children:0:props:iconNode\",\"className\":\"lucide-calendar\",\"size\":11}],\" \",\"Sep 06, 2026\"]}],[\"$\",\"span\",null,{\"className\":\"sep\",\"children\":\"/\"}],[\"$\",\"span\",null,{\"className\":\"inline-flex items-center gap-1\",\"children\":[[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$26:props:children:props:children:1:props:children:0:props:children:1:props:children:0:props:children:2:props:children:0:props:iconNode\",\"className\":\"lucide-clock\",\"size\":11}],\" \",\"3 min read\"]}]]}],[\"$\",\"h3\",null,{\"children\":\"Building Clipix, a Clipy-style clipboard manager for GNOME\"}],\"$L2c\",\"$L2d\",\"$L2e\"]}]]}],\"$L2f\",\"$L30\",\"$L31\",\"$L32\"]}]]}]}]\n"])</script>
1<script>self.__next_f.push([1,"27:[\"$\",\"section\",\"apps\",{\"id\":\"apps\",\"className\":\"section relative overflow-hidden border-t border-b border-border-base bg-bg-elev\",\"children\":[[\"$\",\"div\",null,{\"className\":\"grid-bg dense\"}],[\"$\",\"div\",null,{\"className\":\"container relative z-10\",\"children\":[[\"$\",\"div\",null,{\"className\":\"section-head\",\"children\":[[\"$\",\"div\",null,{\"className\":\"title-block\",\"children\":[[\"$\",\"span\",null,{\"className\":\"eyebrow\",\"children\":\"// shipping\"}],[\"$\",\"h2\",null,{\"children\":\"Live apps \u0026 tools\"}],[\"$\",\"p\",null,{\"children\":\"Small, focused software I've built and put online. All open-source or freely usable — no accounts unless you really need one.\"}]]}],[\"$\",\"$L1b\",null,{\"href\":\"/apps\",\"className\":\"btn btn-ghost\",\"children\":[\"view all apps\",\" \",[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$5:1:0:props:children:4:props:children:4:props:children:0:props:children:2:props:iconNode\",\"className\":\"lucide-arrow-right\",\"size\":14}]]}]]}],[\"$\",\"div\",null,{\"className\":\"apps-grid\",\"children\":[[\"$\",\"article\",\"061df9cc-d08a-4f55-8da0-27474258cb7c\",{\"className\":\"card card-glow-secondary app-card lifecycle-active\",\"children\":[[\"$\",\"div\",null,{\"className\":\"preview\",\"children\":[\"$\",\"div\",null,{\"className\":\"device\",\"style\":{\"background\":\"linear-gradient(135deg, hsl(155 65% 55% / 0.9), hsl(190 85% 55% / 0.7))\"},\"children\":[[\"$\",\"div\",null,{\"className\":\"titlebar\",\"children\":[[\"$\",\"i\",null,{}],[\"$\",\"i\",null,{}],[\"$\",\"i\",null,{}]]}],[\"$\",\"div\",null,{\"className\":\"screen\",\"style\":{\"background\":\"radial-gradient(circle at 30% 30%, hsla(155, 65%, 60%, 0.35), transparent 50%), linear-gradient(135deg, var(--surface), var(--bg-elev-2))\"},\"children\":[\"$\",\"$L2b\",null,{\"src\":\"https://elabins.com/media/bit-dojo-logo.png?v=1790402783267\",\"alt\":\"bit-dojo\",\"width\":96,\"height\":96,\"className\":\"app-logo\"}]}]]}]}],[\"$\",\"div\",null,{\"className\":\"body\",\"children\":[[\"$\",\"div\",null,{\"className\":\"head\",\"children\":[[\"$\",\"h3\",null,{\"children\":\"bit-dojo\"}],[\"$\",\"div\",null,{\"className\":\"app-pills\",\"children\":[[\"$\",\"span\",\"web\",{\"className\":\"pf-badge web\",\"children\":[[\"$\",\"i\",null,{\"className\":\"dot\"}],\"web\"]}]]}]]}],false,[\"$\",\"p\",null,{\"children\":\"Learn the bitwise tricks embedded C runs on by writing real register code for a simulated CH32V003.\"}],[\"$\",\"div\",null,{\"className\":\"app-foot\",\"children\":[[\"$\",\"div\",null,{\"className\":\"app-foot-links\",\"children\":[[\"$\",\"$L1b\",null,{\"href\":\"https://bit-dojo.elabins.com/\",\"className\":\"btn-link primary\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"children\":[\"launch app \",[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":[[\"path\",{\"d\":\"M15 3h6v6\",\"key\":\"1q9fwt\"}],[\"path\",{\"d\":\"M10 14 21 3\",\"key\":\"gplh6r\"}],[\"path\",{\"d\":\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\",\"key\":\"a6xqqp\"}]],\"className\":\"lucide-external-link\",\"size\":13}]]}],[\"$\",\"$L1b\",null,{\"href\":\"https://github.com/e-labInnovations/bit-dojo\",\"className\":\"btn-link\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"aria-label\":\"GitHub repo\",\"children\":[\"$\",\"svg\",null,{\"role\":\"img\",\"viewBox\":\"0 0 24 24\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":13,\"height\":13,\"fill\":\"currentColor\",\"aria-hidden\":true,\"children\":[[\"$\",\"title\",null,{\"children\":\"GitHub\"}],[\"$\",\"path\",null,{\"d\":\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\"}]]}]}]]}],[\"$\",\"span\",null,{\"className\":\"app-version mono\",\"children\":[\"v\",\"0.1.0\"]}]]}]]}]]}],[\"$\",\"article\",\"7f2dd32a-c1bf-42ed-bd28-9a522a1cb3c2\",{\"className\":\"card card-glow-secondary app-card lifecycle-active\",\"children\":[[\"$\",\"div\",null,{\"className\":\"preview\",\"children\":[\"$\",\"div\",null,{\"className\":\"device\",\"style\":{\"background\":\"linear-gradient(135deg, hsl(215 20% 45% / 0.9), hsl(222 47% 21% / 0.7))\"},\"children\":[[\"$\",\"div\",null,{\"className\":\"titlebar\",\"children\":[\"$L33\",\"$L34\",\"$L35\"]}],\"$L36\"]}]}],\"$L37\"]}],\"$L38\",\"$L39\",\"$L3a\",\"$L3b\"]}]]}]]}]\n"])</script>
1<script>self.__next_f.push([1,"28:[\"$\",\"section\",\"photos\",{\"id\":\"photos\",\"className\":\"section\",\"children\":[\"$\",\"div\",null,{\"className\":\"container\",\"children\":[[\"$\",\"div\",null,{\"className\":\"section-head\",\"children\":[[\"$\",\"div\",null,{\"className\":\"title-block\",\"children\":[[\"$\",\"span\",null,{\"className\":\"eyebrow\",\"children\":\"// snapshots\"}],[\"$\",\"h2\",null,{\"children\":\"From the workbench\"}],[\"$\",\"p\",null,{\"children\":\"A loose photo journal — builds in progress, soldering iron at 2 AM, the occasional walk to clear my head.\"}]]}],[\"$\",\"$L1b\",null,{\"href\":\"/photos\",\"className\":\"btn btn-ghost\",\"children\":[\"full journal\",\" \",[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$5:1:0:props:children:4:props:children:4:props:children:0:props:children:2:props:iconNode\",\"className\":\"lucide-arrow-right\",\"size\":14}]]}]]}],[[\"$\",\"div\",null,{\"className\":\"photo-wall\",\"children\":[[\"$\",\"$L1b\",\"839899dd-e668-4f5d-a7ad-ff9e2c07a411\",{\"href\":\"/photos/esp-12-based-home-automation-board\",\"className\":\"photo-tile real normal\",\"aria-label\":\"ESP-12-Based Home Automation Board\",\"children\":[[\"$\",\"$L2b\",null,{\"src\":\"https://elabins.com/media/IMG_20200713_173403-1600x2133.jpg?v=1785332727470\",\"alt\":\"Close-up of a custom ESP-12-based home automation board with relays and through-hole soldering.\",\"fill\":true,\"sizes\":\"(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw\",\"className\":\"photo-tile-img object-cover\",\"priority\":true,\"loading\":\"$undefined\"}],[\"$\",\"span\",null,{\"className\":\"caption\",\"children\":[\"ESP-12-Based Home Automation Board\",[\"$\",\"span\",null,{\"className\":\"sep\",\"children\":\" · \"}],\"ƒ/2 · 1/33 · 4.12 mm · ISO715\"]}]]}],[\"$\",\"$L1b\",\"c6311864-0fa6-4edc-ab76-67be2e77fead\",{\"href\":\"/photos/the-2019-logo-on-a-096-inch-oled\",\"className\":\"photo-tile real normal\",\"aria-label\":\"The 2019 e-lab innovations Logo on a 0.96-Inch OLED\",\"children\":[[\"$\",\"$L2b\",null,{\"src\":\"https://elabins.com/media/IMG_20191001_204259-1600x1200.jpg?v=1785332129403\",\"alt\":\"The 2019 e-lab innovations logo displayed on a 0.96-inch OLED using the U8G2 library.\",\"fill\":true,\"sizes\":\"(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw\",\"className\":\"photo-tile-img object-cover\",\"priority\":true,\"loading\":\"$undefined\"}],[\"$\",\"span\",null,{\"className\":\"caption\",\"children\":[\"The 2019 e-lab innovations Logo on a 0.96-Inch OLED\",[\"$\",\"span\",null,{\"className\":\"sep\",\"children\":\" · \"}],\"ƒ/2 · 1/13 · 4.12 mm · ISO1319\"]}]]}]]}],[\"$\",\"div\",null,{\"className\":\"text-center mt-8\",\"children\":[\"$\",\"$L1b\",null,{\"href\":\"/photos\",\"className\":\"btn-link\",\"children\":[[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$13:1:props:children:3:props:children:8:props:children:2:props:children:0:props:iconNode\",\"className\":\"lucide-camera\",\"size\":14}],\" \",\"view all photos\"]}]}]]]}]}]\n"])</script>
1<script>self.__next_f.push([1,"29:[\"$\",\"section\",\"about\",{\"id\":\"about\",\"className\":\"section-tight\",\"children\":[\"$\",\"div\",null,{\"className\":\"container\",\"children\":[\"$\",\"div\",null,{\"className\":\"card\",\"style\":{\"padding\":\"2.5rem\",\"display\":\"grid\",\"gridTemplateColumns\":\"auto 1fr\",\"gap\":\"2rem\",\"alignItems\":\"center\"},\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-5\",\"children\":[[\"$\",\"img\",null,{\"src\":\"https://elabins.com/media/Mohammed%20Ashad.png?v=1782105051658\",\"alt\":\"Mohammed Ashad\",\"style\":{\"width\":88,\"height\":88,\"borderRadius\":\"50%\",\"objectFit\":\"cover\",\"flex\":\"none\",\"border\":\"2px solid var(--border-hi)\"}}],[\"$\",\"div\",null,{\"children\":[[\"$\",\"div\",null,{\"className\":\"eyebrow\",\"children\":\"// hi, I'm\"}],[\"$\",\"div\",null,{\"className\":\"au-name\",\"style\":{\"fontSize\":\"1.5rem\",\"marginTop\":\"0.5rem\"},\"children\":\"Mohammed Ashad\"}],[\"$\",\"div\",null,{\"className\":\"au-role\",\"style\":{\"marginTop\":\"0.25rem\"},\"children\":\"Engineer · maker · technical writer\"}]]}]]}],[\"$\",\"div\",null,{\"children\":[[\"$\",\"p\",null,{\"style\":{\"color\":\"var(--text-muted)\",\"fontSize\":\"1.05rem\",\"lineHeight\":1.65},\"children\":\"I split my time between embedded firmware, cross-platform apps, and the kind of weekend projects that take three weekends. This site is where I write everything down so I don't have to remember it twice, and so you don't have to figure it out the hard way.\"}],[\"$\",\"div\",null,{\"className\":\"flex gap-3 mt-5 flex-wrap items-center\",\"children\":[[\"$\",\"$L1b\",null,{\"href\":\"/about\",\"className\":\"btn btn-ghost btn-sm\",\"children\":[\"more about me\",\" \",[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$5:1:0:props:children:4:props:children:4:props:children:0:props:children:2:props:iconNode\",\"className\":\"lucide-arrow-right\",\"size\":13}]]}],[]]}]]}]]}]}]}]\n"])</script>
1<script>self.__next_f.push([1,"2a:[\"$\",\"section\",\"newsletter\",{\"id\":\"newsletter\",\"className\":\"section\",\"children\":[\"$\",\"div\",null,{\"className\":\"container\",\"children\":[\"$\",\"div\",null,{\"className\":\"newsletter\",\"children\":[[\"$\",\"div\",null,{\"className\":\"grid-bg\"}],[\"$\",\"div\",null,{\"className\":\"newsletter-inner\",\"children\":[[\"$\",\"span\",null,{\"className\":\"eyebrow center\",\"children\":\"// join the circuit\"}],[\"$\",\"h2\",null,{\"children\":\"Join the lab.\"}],[\"$\",\"p\",null,{\"children\":\"Create a free account to get new posts in your inbox, comment on articles, and bookmark your favourites. Sign in with GitHub or Google — no email signup needed.\"}],[\"$\",\"div\",null,{\"className\":\"flex justify-center gap-3 flex-wrap\",\"children\":[[\"$\",\"$L3c\",null,{\"variant\":\"primary\",\"children\":\"join the lab\"}],[\"$\",\"$L3c\",null,{\"variant\":\"ghost\",\"icon\":\"github\",\"children\":\"with GitHub\"}]]}],[\"$\",\"div\",null,{\"className\":\"newsletter-perks\",\"children\":[[\"$\",\"span\",\"monthly cadence-0\",{\"children\":\"monthly cadence\"}],[\"$\",\"span\",\"no spam, ever-1\",{\"children\":\"no spam, ever\"}],[\"$\",\"span\",\"raw build notes-2\",{\"children\":\"raw build notes\"}],[\"$\",\"span\",\"one-click unsubscribe-3\",{\"children\":\"one-click unsubscribe\"}]]}]]}]]}]}]}]\n"])</script>
1<script>self.__next_f.push([1,"2c:[\"$\",\"p\",null,{\"className\":\"excerpt\",\"children\":\"I missed Windows clipboard history on Linux, tried every manager I could find, then spent a weekend building my own GNOME extension.\"}]\n2d:[\"$\",\"div\",null,{\"className\":\"tags\",\"children\":[[\"$\",\"span\",\"c31306d4-1fd1-49fe-9d0e-2c8a7af41aff\",{\"className\":\"tag\",\"children\":\"Gnome\"}],[\"$\",\"span\",\"51363b10-2ca1-43ac-a215-74a64c88444e\",{\"className\":\"tag\",\"children\":\"Linux\"}],[\"$\",\"span\",\"58d310aa-25f9-4b43-9fe3-9b4afde8ec14\",{\"className\":\"tag\",\"children\":\"Clipboard\"}],[\"$\",\"span\",\"6cda162a-573c-42a7-aa05-85be7c7d5bcd\",{\"className\":\"tag\",\"children\":\"Gnome Extension\"}]]}]\n2e:[\"$\",\"div\",null,{\"className\":\"read\",\"children\":[[\"$\",\"span\",null,{\"children\":\"read article\"}],[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$5:1:0:props:children:4:props:children:4:props:children:0:props:children:2:props:iconNode\",\"className\":\"lucide-arrow-right\",\"size\":14}]]}]\n"])</script>
1<script>self.__next_f.push([1,"2f:[\"$\",\"$L1b\",\"99a57579-571c-46d8-bd12-a2e08e977c7c\",{\"href\":\"/blog/building-a-usb-display-from-a-salvaged-smartwatch-lcd\",\"className\":\"card card-glow-primary blog-card\",\"aria-label\":\"Building a USB display from a salvaged smartwatch LCD\",\"children\":[[\"$\",\"div\",null,{\"className\":\"thumb relative\",\"children\":[[\"$\",\"$L2b\",null,{\"src\":\"https://elabins.com/media/usb2tft-thumbnail-1280x720.png?v=1785735340362\",\"alt\":\"Building a USB display from a salvaged smartwatch LCD\",\"fill\":true,\"sizes\":\"(max-width: 640px) 100vw, (max-width: 960px) 50vw, 33vw\",\"className\":\"object-cover\"}],[\"$\",\"div\",null,{\"className\":\"corner-tag\",\"children\":[\"$\",\"span\",null,{\"className\":\"cat-pill\",\"style\":{\"--cat-dot\":\"hsl(28 85% 53%)\"},\"children\":\"Hardware\"}]}]]}],[\"$\",\"div\",null,{\"className\":\"body\",\"children\":[[\"$\",\"div\",null,{\"className\":\"meta\",\"children\":[[\"$\",\"span\",null,{\"className\":\"inline-flex items-center gap-1\",\"children\":[[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$26:props:children:props:children:1:props:children:0:props:children:1:props:children:0:props:children:0:props:children:0:props:iconNode\",\"className\":\"lucide-calendar\",\"size\":11}],\" \",\"Aug 03, 2026\"]}],[\"$\",\"span\",null,{\"className\":\"sep\",\"children\":\"/\"}],[\"$\",\"span\",null,{\"className\":\"inline-flex items-center gap-1\",\"children\":[[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$26:props:children:props:children:1:props:children:0:props:children:1:props:children:0:props:children:2:props:children:0:props:iconNode\",\"className\":\"lucide-clock\",\"size\":11}],\" \",\"28 min read\"]}]]}],[\"$\",\"h3\",null,{\"children\":\"Building a USB display from a salvaged smartwatch LCD\"}],[\"$\",\"p\",null,{\"className\":\"excerpt\",\"children\":\"2 Mbps of UART proved software USB was pointless. Then came an RP2040, a DMA rewrite, and a colour bug I could not see.\"}],[\"$\",\"div\",null,{\"className\":\"tags\",\"children\":[[\"$\",\"span\",\"f86a157a-6ef3-4ec5-b7e0-d839b587bb5c\",{\"className\":\"tag\",\"children\":\"RP2040\"}],[\"$\",\"span\",\"d8bb0c78-179a-468b-a45d-0f488411fa19\",{\"className\":\"tag\",\"children\":\"ST7735\"}],[\"$\",\"span\",\"839428cf-64ce-415c-96ce-4c24144ee630\",{\"className\":\"tag\",\"children\":\"USB\"}],[\"$\",\"span\",\"de8ce61d-07d9-4cba-8a6a-65d40242fece\",{\"className\":\"tag\",\"children\":\"TLSR8232\"}]]}],[\"$\",\"div\",null,{\"className\":\"read\",\"children\":[[\"$\",\"span\",null,{\"children\":\"read article\"}],[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$5:1:0:props:children:4:props:children:4:props:children:0:props:children:2:props:iconNode\",\"className\":\"lucide-arrow-right\",\"size\":14}]]}]]}]]}]\n"])</script>
1<script>self.__next_f.push([1,"30:[\"$\",\"$L1b\",\"ad418e56-6508-425e-b967-0d67dc44955d\",{\"href\":\"/blog/turning-a-249-smartwatch-into-a-diy-airtag-tracker\",\"className\":\"card card-glow-primary blog-card\",\"aria-label\":\"Turning a ₹249 Smartwatch Into a DIY AirTag Tracker\",\"children\":[[\"$\",\"div\",null,{\"className\":\"thumb relative\",\"children\":[[\"$\",\"$L2b\",null,{\"src\":\"https://elabins.com/media/findmy-airtag-thumbnail-1280x720.png?v=1785564282618\",\"alt\":\"Turning a ₹249 Smartwatch Into a DIY AirTag Tracker\",\"fill\":true,\"sizes\":\"(max-width: 640px) 100vw, (max-width: 960px) 50vw, 33vw\",\"className\":\"object-cover\"}],[\"$\",\"div\",null,{\"className\":\"corner-tag\",\"children\":[\"$\",\"span\",null,{\"className\":\"cat-pill\",\"style\":{\"--cat-dot\":\"hsl(28 85% 53%)\"},\"children\":\"Hardware\"}]}]]}],[\"$\",\"div\",null,{\"className\":\"body\",\"children\":[[\"$\",\"div\",null,{\"className\":\"meta\",\"children\":[[\"$\",\"span\",null,{\"className\":\"inline-flex items-center gap-1\",\"children\":[[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$26:props:children:props:children:1:props:children:0:props:children:1:props:children:0:props:children:0:props:children:0:props:iconNode\",\"className\":\"lucide-calendar\",\"size\":11}],\" \",\"Aug 01, 2026\"]}],[\"$\",\"span\",null,{\"className\":\"sep\",\"children\":\"/\"}],[\"$\",\"span\",null,{\"className\":\"inline-flex items-center gap-1\",\"children\":[[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$26:props:children:props:children:1:props:children:0:props:children:1:props:children:0:props:children:2:props:children:0:props:iconNode\",\"className\":\"lucide-clock\",\"size\":11}],\" \",\"24 min read\"]}]]}],[\"$\",\"h3\",null,{\"children\":\"Turning a ₹249 Smartwatch Into a DIY AirTag Tracker\"}],[\"$\",\"p\",null,{\"className\":\"excerpt\",\"children\":\"I lost my wallet on a night bus, so I turned a hacked ₹249 smartwatch into an Apple FindMy tracker and built my own app to follow it.\"}],[\"$\",\"div\",null,{\"className\":\"tags\",\"children\":[[\"$\",\"span\",\"1f41f4a6-d589-4fbd-b9b9-3d29c9d9f369\",{\"className\":\"tag\",\"children\":\"FindMy\"}],[\"$\",\"span\",\"37f9828c-3411-4295-9716-f71996bae37d\",{\"className\":\"tag\",\"children\":\"AirTag\"}],[\"$\",\"span\",\"de8ce61d-07d9-4cba-8a6a-65d40242fece\",{\"className\":\"tag\",\"children\":\"TLSR8232\"}],[\"$\",\"span\",\"7551ab94-2070-4bce-b271-f040330ccd12\",{\"className\":\"tag\",\"children\":\"BLE\"}]]}],[\"$\",\"div\",null,{\"className\":\"read\",\"children\":[[\"$\",\"span\",null,{\"children\":\"read article\"}],[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$5:1:0:props:children:4:props:children:4:props:children:0:props:children:2:props:iconNode\",\"className\":\"lucide-arrow-right\",\"size\":14}]]}]]}]]}]\n"])</script>
1<script>self.__next_f.push([1,"31:[\"$\",\"$L1b\",\"468b2673-386e-4b89-ac7d-f965b2ed665c\",{\"href\":\"/blog/hacking-a-249-smartwatch-custom-firmware-on-tlsr8232\",\"className\":\"card card-glow-primary blog-card\",\"aria-label\":\"Hacking a ₹249 Smartwatch: Custom Firmware on TLSR8232\",\"children\":[[\"$\",\"div\",null,{\"className\":\"thumb relative\",\"children\":[[\"$\",\"$L2b\",null,{\"src\":\"https://elabins.com/media/TLSR8232-watch-thumbnail-1280x720.png?v=1785308305193\",\"alt\":\"Hacking a ₹249 Smartwatch: Custom Firmware on TLSR8232\",\"fill\":true,\"sizes\":\"(max-width: 640px) 100vw, (max-width: 960px) 50vw, 33vw\",\"className\":\"object-cover\"}],[\"$\",\"div\",null,{\"className\":\"corner-tag\",\"children\":[\"$\",\"span\",null,{\"className\":\"cat-pill\",\"style\":{\"--cat-dot\":\"hsl(28 85% 53%)\"},\"children\":\"Hardware\"}]}]]}],[\"$\",\"div\",null,{\"className\":\"body\",\"children\":[[\"$\",\"div\",null,{\"className\":\"meta\",\"children\":[[\"$\",\"span\",null,{\"className\":\"inline-flex items-center gap-1\",\"children\":[[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$26:props:children:props:children:1:props:children:0:props:children:1:props:children:0:props:children:0:props:children:0:props:iconNode\",\"className\":\"lucide-calendar\",\"size\":11}],\" \",\"Jul 29, 2026\"]}],[\"$\",\"span\",null,{\"className\":\"sep\",\"children\":\"/\"}],[\"$\",\"span\",null,{\"className\":\"inline-flex items-center gap-1\",\"children\":[[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$26:props:children:props:children:1:props:children:0:props:children:1:props:children:0:props:children:2:props:children:0:props:iconNode\",\"className\":\"lucide-clock\",\"size\":11}],\" \",\"31 min read\"]}]]}],[\"$\",\"h3\",null,{\"children\":\"Hacking a ₹249 Smartwatch: Custom Firmware on TLSR8232\"}],[\"$\",\"p\",null,{\"className\":\"excerpt\",\"children\":\"A bike navigation idea led me to reverse engineer a ₹249 smartwatch, crack its SWire debug port, and flash my own firmware on it.\"}],[\"$\",\"div\",null,{\"className\":\"tags\",\"children\":[[\"$\",\"span\",\"e1a1a356-1edb-48cc-9941-dfad9c42ce94\",{\"className\":\"tag\",\"children\":\"Reverse Engineering\"}],[\"$\",\"span\",\"de8ce61d-07d9-4cba-8a6a-65d40242fece\",{\"className\":\"tag\",\"children\":\"TLSR8232\"}],[\"$\",\"span\",\"0089abd7-bce9-4ef9-b5a8-2aa6c3ebfd5e\",{\"className\":\"tag\",\"children\":\"SmartWatch\"}],[\"$\",\"span\",\"7551ab94-2070-4bce-b271-f040330ccd12\",{\"className\":\"tag\",\"children\":\"BLE\"}]]}],[\"$\",\"div\",null,{\"className\":\"read\",\"children\":[[\"$\",\"span\",null,{\"children\":\"read article\"}],[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$5:1:0:props:children:4:props:children:4:props:children:0:props:children:2:props:iconNode\",\"className\":\"lucide-arrow-right\",\"size\":14}]]}]]}]]}]\n"])</script>
1<script>self.__next_f.push([1,"32:[\"$\",\"$L1b\",\"433bcd29-7954-4787-a18d-ba8e1c6eeecb\",{\"href\":\"/blog/reverse-engineering-moyoung-watch-faces-in-the-browser\",\"className\":\"card card-glow-primary blog-card\",\"aria-label\":\"Reverse Engineering MoYoung Watch Faces in the Browser\",\"children\":[[\"$\",\"div\",null,{\"className\":\"thumb relative\",\"children\":[[\"$\",\"$L2b\",null,{\"src\":\"https://elabins.com/media/dafit-canvas-thumbnail-1280x720.png?v=1785328579369\",\"alt\":\"Reverse Engineering MoYoung Watch Faces in the Browser\",\"fill\":true,\"sizes\":\"(max-width: 640px) 100vw, (max-width: 960px) 50vw, 33vw\",\"className\":\"object-cover\"}],[\"$\",\"div\",null,{\"className\":\"corner-tag\",\"children\":[\"$\",\"span\",null,{\"className\":\"cat-pill\",\"style\":{\"--cat-dot\":\"hsl(217 85% 55%)\"},\"children\":\"Software\"}]}]]}],[\"$\",\"div\",null,{\"className\":\"body\",\"children\":[[\"$\",\"div\",null,{\"className\":\"meta\",\"children\":[[\"$\",\"span\",null,{\"className\":\"inline-flex items-center gap-1\",\"children\":[[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$26:props:children:props:children:1:props:children:0:props:children:1:props:children:0:props:children:0:props:children:0:props:iconNode\",\"className\":\"lucide-calendar\",\"size\":11}],\" \",\"Jul 26, 2026\"]}],[\"$\",\"span\",null,{\"className\":\"sep\",\"children\":\"/\"}],[\"$\",\"span\",null,{\"className\":\"inline-flex items-center gap-1\",\"children\":[[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$26:props:children:props:children:1:props:children:0:props:children:1:props:children:0:props:children:2:props:children:0:props:iconNode\",\"className\":\"lucide-clock\",\"size\":11}],\" \",\"14 min read\"]}]]}],[\"$\",\"h3\",null,{\"children\":\"Reverse Engineering MoYoung Watch Faces in the Browser\"}],[\"$\",\"p\",null,{\"className\":\"excerpt\",\"children\":\"A gifted Porodo watch, no SDK, and a binary format nobody documented. How I ended up writing a watch face editor.\"}],[\"$\",\"div\",null,{\"className\":\"tags\",\"children\":[[\"$\",\"span\",\"e1a1a356-1edb-48cc-9941-dfad9c42ce94\",{\"className\":\"tag\",\"children\":\"Reverse Engineering\"}],[\"$\",\"span\",\"0089abd7-bce9-4ef9-b5a8-2aa6c3ebfd5e\",{\"className\":\"tag\",\"children\":\"SmartWatch\"}],[\"$\",\"span\",\"70741135-df9d-4a3d-b3d2-34d3776badeb\",{\"className\":\"tag\",\"children\":\"MoYoung\"}],[\"$\",\"span\",\"d315deec-7c40-4593-8bd9-e8a8da80cac9\",{\"className\":\"tag\",\"children\":\"DaFit\"}]]}],[\"$\",\"div\",null,{\"className\":\"read\",\"children\":[[\"$\",\"span\",null,{\"children\":\"read article\"}],[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$5:1:0:props:children:4:props:children:4:props:children:0:props:children:2:props:iconNode\",\"className\":\"lucide-arrow-right\",\"size\":14}]]}]]}]]}]\n"])</script>
1<script>self.__next_f.push([1,"33:[\"$\",\"i\",null,{}]\n34:[\"$\",\"i\",null,{}]\n35:[\"$\",\"i\",null,{}]\n36:[\"$\",\"div\",null,{\"className\":\"screen\",\"style\":{\"background\":\"radial-gradient(circle at 30% 30%, hsla(215, 20%, 60%, 0.35), transparent 50%), linear-gradient(135deg, var(--surface), var(--bg-elev-2))\"},\"children\":[\"$\",\"$L2b\",null,{\"src\":\"https://elabins.com/media/ch549-link.png?v=1789903889067\",\"alt\":\"CH549-Link\",\"width\":96,\"height\":96,\"className\":\"app-logo\"}]}]\n"])</script>
1<script>self.__next_f.push([1,"37:[\"$\",\"div\",null,{\"className\":\"body\",\"children\":[[\"$\",\"div\",null,{\"className\":\"head\",\"children\":[[\"$\",\"h3\",null,{\"children\":\"CH549-Link\"}],[\"$\",\"div\",null,{\"className\":\"app-pills\",\"children\":[[\"$\",\"span\",\"web\",{\"className\":\"pf-badge web\",\"children\":[[\"$\",\"i\",null,{\"className\":\"dot\"}],\"web\"]}]]}]]}],false,[\"$\",\"p\",null,{\"children\":\"Browser-based firmware flasher that turns a WCH-Link debug probe into a single-wire CH32V003 programmer.\"}],[\"$\",\"div\",null,{\"className\":\"app-foot\",\"children\":[[\"$\",\"div\",null,{\"className\":\"app-foot-links\",\"children\":[[\"$\",\"$L1b\",null,{\"href\":\"https://utils.elabins.com/ch549-link/\",\"className\":\"btn-link primary\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"children\":[\"launch app \",[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$27:props:children:1:props:children:1:props:children:0:props:children:1:props:children:3:props:children:0:props:children:0:props:children:1:props:iconNode\",\"className\":\"lucide-external-link\",\"size\":13}]]}],[\"$\",\"$L1b\",null,{\"href\":\"https://github.com/e-labInnovations/ch549-link\",\"className\":\"btn-link\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"aria-label\":\"GitHub repo\",\"children\":[\"$\",\"svg\",null,{\"role\":\"img\",\"viewBox\":\"0 0 24 24\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":13,\"height\":13,\"fill\":\"currentColor\",\"aria-hidden\":true,\"children\":[[\"$\",\"title\",null,{\"children\":\"GitHub\"}],[\"$\",\"path\",null,{\"d\":\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\"}]]}]}]]}],[\"$\",\"span\",null,{\"className\":\"app-version mono\",\"children\":[\"v\",\"1.0.0\"]}]]}]]}]\n"])</script>
1<script>self.__next_f.push([1,"38:[\"$\",\"article\",\"be12734e-56f8-447c-96d7-ebd81525c58e\",{\"className\":\"card card-glow-secondary app-card lifecycle-active\",\"children\":[[\"$\",\"div\",null,{\"className\":\"preview\",\"children\":[\"$\",\"div\",null,{\"className\":\"device\",\"style\":{\"background\":\"linear-gradient(135deg, hsl(224 55% 30% / 0.9), hsl(243 50% 20% / 0.7))\"},\"children\":[[\"$\",\"div\",null,{\"className\":\"titlebar\",\"children\":[[\"$\",\"i\",null,{}],[\"$\",\"i\",null,{}],[\"$\",\"i\",null,{}]]}],[\"$\",\"div\",null,{\"className\":\"screen\",\"style\":{\"background\":\"radial-gradient(circle at 30% 30%, hsla(224, 55%, 60%, 0.35), transparent 50%), linear-gradient(135deg, var(--surface), var(--bg-elev-2))\"},\"children\":[\"$\",\"$L2b\",null,{\"src\":\"https://elabins.com/media/clipix-icon.png?v=1788679373238\",\"alt\":\"Clipix Icon\",\"width\":96,\"height\":96,\"className\":\"app-logo\"}]}]]}]}],[\"$\",\"div\",null,{\"className\":\"body\",\"children\":[[\"$\",\"div\",null,{\"className\":\"head\",\"children\":[[\"$\",\"h3\",null,{\"children\":\"Clipix\"}],[\"$\",\"div\",null,{\"className\":\"app-pills\",\"children\":[[\"$\",\"span\",\"desktop\",{\"className\":\"pf-badge desktop\",\"children\":[[\"$\",\"i\",null,{\"className\":\"dot\"}],\"desktop\"]}]]}]]}],false,[\"$\",\"p\",null,{\"children\":\"Clipboard history and snippets for GNOME Shell.\"}],[\"$\",\"div\",null,{\"className\":\"app-foot\",\"children\":[[\"$\",\"div\",null,{\"className\":\"app-foot-links\",\"children\":[[\"$\",\"$L1b\",null,{\"href\":\"https://github.com/e-labInnovations/clipix\",\"className\":\"btn-link primary\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"children\":[\"launch app \",[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$27:props:children:1:props:children:1:props:children:0:props:children:1:props:children:3:props:children:0:props:children:0:props:children:1:props:iconNode\",\"className\":\"lucide-external-link\",\"size\":13}]]}],[\"$\",\"$L1b\",null,{\"href\":\"https://github.com/e-labInnovations/clipix\",\"className\":\"btn-link\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"aria-label\":\"GitHub repo\",\"children\":[\"$\",\"svg\",null,{\"role\":\"img\",\"viewBox\":\"0 0 24 24\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":13,\"height\":13,\"fill\":\"currentColor\",\"aria-hidden\":true,\"children\":[[\"$\",\"title\",null,{\"children\":\"GitHub\"}],[\"$\",\"path\",null,{\"d\":\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\"}]]}]}]]}],null]}]]}]]}]\n"])</script>
1<script>self.__next_f.push([1,"39:[\"$\",\"article\",\"ad9d1dc3-adc2-4582-90a5-e53c530cbb49\",{\"className\":\"card card-glow-secondary app-card lifecycle-active\",\"children\":[[\"$\",\"div\",null,{\"className\":\"preview\",\"children\":[\"$\",\"div\",null,{\"className\":\"device\",\"style\":{\"background\":\"linear-gradient(135deg, hsl(280 90% 65% / 0.9), hsl(320 85% 60% / 0.7))\"},\"children\":[[\"$\",\"div\",null,{\"className\":\"titlebar\",\"children\":[[\"$\",\"i\",null,{}],[\"$\",\"i\",null,{}],[\"$\",\"i\",null,{}]]}],[\"$\",\"div\",null,{\"className\":\"screen\",\"style\":{\"background\":\"radial-gradient(circle at 30% 30%, hsla(280, 90%, 60%, 0.35), transparent 50%), linear-gradient(135deg, var(--surface), var(--bg-elev-2))\"},\"children\":[\"$\",\"$L2b\",null,{\"src\":\"https://elabins.com/media/dafit-canvas-icon-512.png?v=1782392593829\",\"alt\":\"DaFit Canvas Logo\",\"width\":96,\"height\":96,\"className\":\"app-logo\"}]}]]}]}],[\"$\",\"div\",null,{\"className\":\"body\",\"children\":[[\"$\",\"div\",null,{\"className\":\"head\",\"children\":[[\"$\",\"h3\",null,{\"children\":\"Dafit Canvas\"}],[\"$\",\"div\",null,{\"className\":\"app-pills\",\"children\":[[\"$\",\"span\",\"web\",{\"className\":\"pf-badge web\",\"children\":[[\"$\",\"i\",null,{\"className\":\"dot\"}],\"web\"]}]]}]]}],false,[\"$\",\"p\",null,{\"children\":\"Browser-based visual editor for designing smartwatch faces compatible with the Da Fit / MoYoung ecosystem.\"}],[\"$\",\"div\",null,{\"className\":\"app-foot\",\"children\":[[\"$\",\"div\",null,{\"className\":\"app-foot-links\",\"children\":[[\"$\",\"$L1b\",null,{\"href\":\"https://dafit-canvas.elabins.com/\",\"className\":\"btn-link primary\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"children\":[\"launch app \",[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$27:props:children:1:props:children:1:props:children:0:props:children:1:props:children:3:props:children:0:props:children:0:props:children:1:props:iconNode\",\"className\":\"lucide-external-link\",\"size\":13}]]}],[\"$\",\"$L1b\",null,{\"href\":\"https://github.com/e-labInnovations/dafit-canvas\",\"className\":\"btn-link\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"aria-label\":\"GitHub repo\",\"children\":[\"$\",\"svg\",null,{\"role\":\"img\",\"viewBox\":\"0 0 24 24\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":13,\"height\":13,\"fill\":\"currentColor\",\"aria-hidden\":true,\"children\":[[\"$\",\"title\",null,{\"children\":\"GitHub\"}],[\"$\",\"path\",null,{\"d\":\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\"}]]}]}]]}],null]}]]}]]}]\n"])</script>
1<script>self.__next_f.push([1,"3a:[\"$\",\"article\",\"af32bf2d-e7f8-42f9-88f5-2cadd5b6dcbe\",{\"className\":\"card card-glow-secondary app-card lifecycle-active\",\"children\":[[\"$\",\"div\",null,{\"className\":\"preview\",\"children\":[\"$\",\"div\",null,{\"className\":\"device\",\"style\":{\"background\":\"linear-gradient(135deg, hsl(350 75% 55% / 0.9), hsl(280 80% 62% / 0.7))\"},\"children\":[[\"$\",\"div\",null,{\"className\":\"titlebar\",\"children\":[[\"$\",\"i\",null,{}],[\"$\",\"i\",null,{}],[\"$\",\"i\",null,{}]]}],[\"$\",\"div\",null,{\"className\":\"screen\",\"style\":{\"background\":\"radial-gradient(circle at 30% 30%, hsla(350, 75%, 60%, 0.35), transparent 50%), linear-gradient(135deg, var(--surface), var(--bg-elev-2))\"},\"children\":[\"$\",\"div\",null,{\"className\":\"app-glyph\",\"style\":{\"backgroundImage\":\"linear-gradient(135deg, hsl(350 75% 55%), hsl(280 80% 62%))\"},\"children\":\"∿\"}]}]]}]}],[\"$\",\"div\",null,{\"className\":\"body\",\"children\":[[\"$\",\"div\",null,{\"className\":\"head\",\"children\":[[\"$\",\"h3\",null,{\"children\":\"OscillosPlot\"}],[\"$\",\"div\",null,{\"className\":\"app-pills\",\"children\":[[\"$\",\"span\",\"web\",{\"className\":\"pf-badge web\",\"children\":[[\"$\",\"i\",null,{\"className\":\"dot\"}],\"web\"]}]]}]]}],false,[\"$\",\"p\",null,{\"children\":\"Convert the image to an oscilloscope project Arduino C array\"}],[\"$\",\"div\",null,{\"className\":\"app-foot\",\"children\":[[\"$\",\"div\",null,{\"className\":\"app-foot-links\",\"children\":[[\"$\",\"$L1b\",null,{\"href\":\"https://utils.elabins.com/tools/oscillosplot/\",\"className\":\"btn-link primary\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"children\":[\"launch app \",[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$27:props:children:1:props:children:1:props:children:0:props:children:1:props:children:3:props:children:0:props:children:0:props:children:1:props:iconNode\",\"className\":\"lucide-external-link\",\"size\":13}]]}],[\"$\",\"$L1b\",null,{\"href\":\"https://github.com/e-labInnovations/tools/tree/master/oscillosplot\",\"className\":\"btn-link\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"aria-label\":\"GitHub repo\",\"children\":[\"$\",\"svg\",null,{\"role\":\"img\",\"viewBox\":\"0 0 24 24\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":13,\"height\":13,\"fill\":\"currentColor\",\"aria-hidden\":true,\"children\":[[\"$\",\"title\",null,{\"children\":\"GitHub\"}],[\"$\",\"path\",null,{\"d\":\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\"}]]}]}]]}],null]}]]}]]}]\n"])</script>
1<script>self.__next_f.push([1,"3b:[\"$\",\"article\",\"2cee9ba9-9dc1-4b6d-a7df-a84c0f7efd47\",{\"className\":\"card card-glow-secondary app-card lifecycle-active\",\"children\":[[\"$\",\"div\",null,{\"className\":\"preview\",\"children\":[\"$\",\"div\",null,{\"className\":\"device\",\"style\":{\"background\":\"linear-gradient(135deg, hsl(0 100% 40% / 0.9), hsl(230 100% 65% / 0.7))\"},\"children\":[[\"$\",\"div\",null,{\"className\":\"titlebar\",\"children\":[[\"$\",\"i\",null,{}],[\"$\",\"i\",null,{}],[\"$\",\"i\",null,{}]]}],[\"$\",\"div\",null,{\"className\":\"screen\",\"style\":{\"background\":\"radial-gradient(circle at 30% 30%, hsla(0, 100%, 60%, 0.35), transparent 50%), linear-gradient(135deg, var(--surface), var(--bg-elev-2))\"},\"children\":[\"$\",\"div\",null,{\"className\":\"app-glyph\",\"style\":{\"backgroundImage\":\"linear-gradient(135deg, hsl(0 100% 40%), hsl(230 100% 65%))\"},\"children\":\"👾\"}]}]]}]}],[\"$\",\"div\",null,{\"className\":\"body\",\"children\":[[\"$\",\"div\",null,{\"className\":\"head\",\"children\":[[\"$\",\"h3\",null,{\"children\":\"XBM Sprite\"}],[\"$\",\"div\",null,{\"className\":\"app-pills\",\"children\":[[\"$\",\"span\",\"web\",{\"className\":\"pf-badge web\",\"children\":[[\"$\",\"i\",null,{\"className\":\"dot\"}],\"web\"]}]]}]]}],false,[\"$\",\"p\",null,{\"children\":\"A tool to convert an image to an XBM Sprite\"}],[\"$\",\"div\",null,{\"className\":\"app-foot\",\"children\":[[\"$\",\"div\",null,{\"className\":\"app-foot-links\",\"children\":[[\"$\",\"$L1b\",null,{\"href\":\"https://utils.elabins.com/tools/xbm-sprite\",\"className\":\"btn-link primary\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"children\":[\"launch app \",[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$27:props:children:1:props:children:1:props:children:0:props:children:1:props:children:3:props:children:0:props:children:0:props:children:1:props:iconNode\",\"className\":\"lucide-external-link\",\"size\":13}]]}],[\"$\",\"$L1b\",null,{\"href\":\"https://github.com/e-labInnovations/tools/tree/master/xbm-sprite\",\"className\":\"btn-link\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"aria-label\":\"GitHub repo\",\"children\":[\"$\",\"svg\",null,{\"role\":\"img\",\"viewBox\":\"0 0 24 24\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":13,\"height\":13,\"fill\":\"currentColor\",\"aria-hidden\":true,\"children\":[[\"$\",\"title\",null,{\"children\":\"GitHub\"}],[\"$\",\"path\",null,{\"d\":\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\"}]]}]}]]}],null]}]]}]]}]\n"])</script>
1<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"722deb77e1fc4088bfb4665af09d4ab8","r":1,"spa":2}' crossorigin="anonymous"></script>
1
2</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.