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="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/app/(app)/blog/page-9a3cc629e142de28.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>Blog archive â e-lab innovations</title><meta name="description" content="Long-form writing on hardware, embedded firmware, software craft, and weekend builds â the full archive."/><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/blog"/><meta name="format-detection" content="telephone=no, date=no, address=no, email=no"/><meta property="og:title" content="Blog archive â e-lab innovations"/><meta property="og:description" content="Long-form writing on hardware, embedded firmware, software craft, and weekend builds â the full archive."/><meta property="og:url" content="https://elabins.com/blog"/><meta property="og:site_name" content="e-lab innovations"/><meta property="og:image" content="https://elabins.com/og-default.png"/><meta property="og:image:width" content="1200"/><meta property="og:image:height" content="630"/><meta property="og:image:alt" content="e-lab innovations â Learn | Innovate | Share"/><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="Blog archive â e-lab innovations"/><meta name="twitter:description" content="Long-form writing on hardware, embedded firmware, software craft, and weekend builds â the full archive."/><meta name="twitter:image" content="https://elabins.com/og-default.png"/><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="" href="/">home</a></li><li><a class="active" 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":"CollectionPage","@id":"https://elabins.com/blog#collection","url":"https://elabins.com/blog","name":"Blog archive â e-lab innovations","description":"Long-form writing on hardware, embedded firmware, software craft, and weekend builds â the full archive.","mainEntity":{"@type":"ItemList","itemListElement":[{"@type":"ListItem","position":1,"url":"https://elabins.com/blog/making-a-wch-link-clone-program-the-unsupported-ch32v003","name":"Making a WCH-Link clone program the unsupported CH32V003","image":"https://elabins.com/https://elabins.com/media/ch549-link-thumbnail.png?v=1789921984589"},{"@type":"ListItem","position":2,"url":"https://elabins.com/blog/building-clipix-a-clipy-style-clipboard-manager-for-gnome","name":"Building Clipix, a Clipy-style clipboard manager for GNOME","image":"https://elabins.com/https://elabins.com/media/clipix-thumbnail.png?v=1788678908555"},{"@type":"ListItem","position":3,"url":"https://elabins.com/blog/building-a-usb-display-from-a-salvaged-smartwatch-lcd","name":"Building a USB display from a salvaged smartwatch LCD","image":"https://elabins.com/https://elabins.com/media/usb2tft-thumbnail.png?v=1785735340362"},{"@type":"ListItem","position":4,"url":"https://elabins.com/blog/turning-a-249-smartwatch-into-a-diy-airtag-tracker","name":"Turning a â¹249 Smartwatch Into a DIY AirTag Tracker","image":"https://elabins.com/https://elabins.com/media/findmy-airtag-thumbnail.png?v=1785564282618"},{"@type":"ListItem","position":5,"url":"https://elabins.com/blog/hacking-a-249-smartwatch-custom-firmware-on-tlsr8232","name":"Hacking a â¹249 Smartwatch: Custom Firmware on TLSR8232","image":"https://elabins.com/https://elabins.com/media/TLSR8232-watch-thumbnail.png?v=1785308305193"},{"@type":"ListItem","position":6,"url":"https://elabins.com/blog/reverse-engineering-moyoung-watch-faces-in-the-browser","name":"Reverse Engineering MoYoung Watch Faces in the Browser","image":"https://elabins.com/https://elabins.com/media/dafit-canvas-thumbnail.png?v=1785328579369"},{"@type":"ListItem","position":7,"url":"https://elabins.com/blog/how-i-built-an-hls-streaming-stack-on-shared-hosting","name":"How I Built an HLS Streaming Stack on Shared Hosting","image":"https://elabins.com/https://elabins.com/media/hls-stream-thumbnail.png?v=1785328583015"},{"@type":"ListItem","position":8,"url":"https://elabins.com/blog/introducing-elabins-portfolio-blocks-a-modern-wordpress-portfolio-plugin-with-github-integration","name":"Introducing Elabins Portfolio Blocks: A Modern WordPress Portfolio Plugin with GitHub Integration","image":"https://elabins.com/https://elabins.com/media/portfolio-plugin-thumbnail.png?v=1785328588583"},{"@type":"ListItem","position":9,"url":"https://elabins.com/blog/the-evolution-of-cakemail-from-google-sheets-to-people-api","name":"The Evolution of CakeMail: From Google Sheets to People API","image":"https://elabins.com/https://elabins.com/media/cake-mail-thumbnail.png?v=1785328577861"}]}},{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://elabins.com/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https://elabins.com/blog"}]}]}</script>
1<section class="page-hero"><div class="grid-bg"></div><div class="glow-orb primary" style="width:320px;height:320px;top:-15%;left:-10%"></div><div class="container relative"><span class="eyebrow">// the archive</span><h1 class="h-grad">writings.</h1><p>Hardware deep dives, embedded firmware notes, software craft, and the occasional opinionated take. Filter by category or tag, search by keyword.</p></div></section><section class="section"><div class="container"><div class="archive-controls"><div class="archive-row head"><span class="label">filter</span><div class="chip-strip"><button class="chip active" type="button">all<span class="ct">0</span></button><button class="chip " type="button">Arduino<span class="ct">0</span></button><button class="chip " type="button">Blog<span class="ct">0</span></button><button class="chip " type="button">ESP32<span class="ct">0</span></button><div class="relative"><button class="chip " style="border-style:dashed" type="button" aria-expanded="false"><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-funnel" aria-hidden="true"><path d="M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z"></path></svg>more<span class="ct">+<!-- -->6</span><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-chevron-down" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button></div></div><div class="control-cluster"><div class="relative"><button class="ctrl" aria-expanded="false" type="button"><span class="key">sort:</span> <!-- -->newest<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button></div><div class="relative"><button class="ctrl " aria-expanded="false" type="button"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag" aria-hidden="true"><path d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z"></path><circle cx="7.5" cy="7.5" r=".5" fill="currentColor"></circle></svg><span class="key">tags</span><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button></div><div class="search-box"><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><input type="search" placeholder="search articlesâ¦" aria-label="search articles" value=""/></div></div></div></div><div class="results-meta"><span>showing <strong class="grad">16</strong> article<!-- -->s</span><span>page <!-- -->1<!-- --> / <!-- -->2</span></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&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fch549-link-thumbnail-1280x720.png%3Fv%3D1789921984589&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fch549-link-thumbnail-1280x720.png%3Fv%3D1789921984589&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fch549-link-thumbnail-1280x720.png%3Fv%3D1789921984589&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fch549-link-thumbnail-1280x720.png%3Fv%3D1789921984589&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fch549-link-thumbnail-1280x720.png%3Fv%3D1789921984589&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fch549-link-thumbnail-1280x720.png%3Fv%3D1789921984589&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fch549-link-thumbnail-1280x720.png%3Fv%3D1789921984589&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fch549-link-thumbnail-1280x720.png%3Fv%3D1789921984589&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fch549-link-thumbnail-1280x720.png%3Fv%3D1789921984589&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fch549-link-thumbnail-1280x720.png%3Fv%3D1789921984589&w=3840&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&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fclipix-thumbnail-1280x720.png%3Fv%3D1788678908555&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fclipix-thumbnail-1280x720.png%3Fv%3D1788678908555&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fclipix-thumbnail-1280x720.png%3Fv%3D1788678908555&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fclipix-thumbnail-1280x720.png%3Fv%3D1788678908555&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fclipix-thumbnail-1280x720.png%3Fv%3D1788678908555&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fclipix-thumbnail-1280x720.png%3Fv%3D1788678908555&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fclipix-thumbnail-1280x720.png%3Fv%3D1788678908555&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fclipix-thumbnail-1280x720.png%3Fv%3D1788678908555&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fclipix-thumbnail-1280x720.png%3Fv%3D1788678908555&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fclipix-thumbnail-1280x720.png%3Fv%3D1788678908555&w=3840&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&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fusb2tft-thumbnail-1280x720.png%3Fv%3D1785735340362&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fusb2tft-thumbnail-1280x720.png%3Fv%3D1785735340362&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fusb2tft-thumbnail-1280x720.png%3Fv%3D1785735340362&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fusb2tft-thumbnail-1280x720.png%3Fv%3D1785735340362&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fusb2tft-thumbnail-1280x720.png%3Fv%3D1785735340362&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fusb2tft-thumbnail-1280x720.png%3Fv%3D1785735340362&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fusb2tft-thumbnail-1280x720.png%3Fv%3D1785735340362&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fusb2tft-thumbnail-1280x720.png%3Fv%3D1785735340362&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fusb2tft-thumbnail-1280x720.png%3Fv%3D1785735340362&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fusb2tft-thumbnail-1280x720.png%3Fv%3D1785735340362&w=3840&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&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Ffindmy-airtag-thumbnail-1280x720.png%3Fv%3D1785564282618&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Ffindmy-airtag-thumbnail-1280x720.png%3Fv%3D1785564282618&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Ffindmy-airtag-thumbnail-1280x720.png%3Fv%3D1785564282618&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Ffindmy-airtag-thumbnail-1280x720.png%3Fv%3D1785564282618&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Ffindmy-airtag-thumbnail-1280x720.png%3Fv%3D1785564282618&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Ffindmy-airtag-thumbnail-1280x720.png%3Fv%3D1785564282618&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Ffindmy-airtag-thumbnail-1280x720.png%3Fv%3D1785564282618&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Ffindmy-airtag-thumbnail-1280x720.png%3Fv%3D1785564282618&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Ffindmy-airtag-thumbnail-1280x720.png%3Fv%3D1785564282618&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Ffindmy-airtag-thumbnail-1280x720.png%3Fv%3D1785564282618&w=3840&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&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FTLSR8232-watch-thumbnail-1280x720.png%3Fv%3D1785308305193&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FTLSR8232-watch-thumbnail-1280x720.png%3Fv%3D1785308305193&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FTLSR8232-watch-thumbnail-1280x720.png%3Fv%3D1785308305193&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FTLSR8232-watch-thumbnail-1280x720.png%3Fv%3D1785308305193&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FTLSR8232-watch-thumbnail-1280x720.png%3Fv%3D1785308305193&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FTLSR8232-watch-thumbnail-1280x720.png%3Fv%3D1785308305193&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FTLSR8232-watch-thumbnail-1280x720.png%3Fv%3D1785308305193&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FTLSR8232-watch-thumbnail-1280x720.png%3Fv%3D1785308305193&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FTLSR8232-watch-thumbnail-1280x720.png%3Fv%3D1785308305193&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2FTLSR8232-watch-thumbnail-1280x720.png%3Fv%3D1785308305193&w=3840&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&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fdafit-canvas-thumbnail-1280x720.png%3Fv%3D1785328579369&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fdafit-canvas-thumbnail-1280x720.png%3Fv%3D1785328579369&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fdafit-canvas-thumbnail-1280x720.png%3Fv%3D1785328579369&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fdafit-canvas-thumbnail-1280x720.png%3Fv%3D1785328579369&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fdafit-canvas-thumbnail-1280x720.png%3Fv%3D1785328579369&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fdafit-canvas-thumbnail-1280x720.png%3Fv%3D1785328579369&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fdafit-canvas-thumbnail-1280x720.png%3Fv%3D1785328579369&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fdafit-canvas-thumbnail-1280x720.png%3Fv%3D1785328579369&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fdafit-canvas-thumbnail-1280x720.png%3Fv%3D1785328579369&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fdafit-canvas-thumbnail-1280x720.png%3Fv%3D1785328579369&w=3840&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><a class="card card-glow-primary blog-card" aria-label="How I Built an HLS Streaming Stack on Shared Hosting" href="/blog/how-i-built-an-hls-streaming-stack-on-shared-hosting"><div class="thumb relative"><img alt="How I Built an HLS Streaming Stack on Shared Hosting" 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%2Fhls-stream-thumbnail-1280x720.png%3Fv%3D1785328583015&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fhls-stream-thumbnail-1280x720.png%3Fv%3D1785328583015&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fhls-stream-thumbnail-1280x720.png%3Fv%3D1785328583015&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fhls-stream-thumbnail-1280x720.png%3Fv%3D1785328583015&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fhls-stream-thumbnail-1280x720.png%3Fv%3D1785328583015&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fhls-stream-thumbnail-1280x720.png%3Fv%3D1785328583015&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fhls-stream-thumbnail-1280x720.png%3Fv%3D1785328583015&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fhls-stream-thumbnail-1280x720.png%3Fv%3D1785328583015&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fhls-stream-thumbnail-1280x720.png%3Fv%3D1785328583015&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fhls-stream-thumbnail-1280x720.png%3Fv%3D1785328583015&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fhls-stream-thumbnail-1280x720.png%3Fv%3D1785328583015&w=3840&q=75"/><div class="corner-tag"><span class="cat-pill" style="--cat-dot:hsl(45 90% 50%)">Blog</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 15, 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> <!-- -->9 min read</span></div><h3>How I Built an HLS Streaming Stack on Shared Hosting</h3><p class="excerpt">Can shared hosting stream HLS? I built a browser-powered HLS pipeline, measured its limits, and shared the lessons learned.</p><div class="tags"><span class="tag">HLS</span><span class="tag">Streaming</span><span class="tag">Shared-Hosting</span><span class="tag">Mediabunny</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="Introducing Elabins Portfolio Blocks: A Modern WordPress Portfolio Plugin with GitHub Integration" href="/blog/introducing-elabins-portfolio-blocks-a-modern-wordpress-portfolio-plugin-with-github-integration"><div class="thumb relative"><img alt="Introducing Elabins Portfolio Blocks: A Modern WordPress Portfolio Plugin with GitHub Integration" 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%2Fportfolio-plugin-thumbnail-1280x720.png%3Fv%3D1785328588583&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fportfolio-plugin-thumbnail-1280x720.png%3Fv%3D1785328588583&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fportfolio-plugin-thumbnail-1280x720.png%3Fv%3D1785328588583&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fportfolio-plugin-thumbnail-1280x720.png%3Fv%3D1785328588583&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fportfolio-plugin-thumbnail-1280x720.png%3Fv%3D1785328588583&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fportfolio-plugin-thumbnail-1280x720.png%3Fv%3D1785328588583&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fportfolio-plugin-thumbnail-1280x720.png%3Fv%3D1785328588583&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fportfolio-plugin-thumbnail-1280x720.png%3Fv%3D1785328588583&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fportfolio-plugin-thumbnail-1280x720.png%3Fv%3D1785328588583&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fportfolio-plugin-thumbnail-1280x720.png%3Fv%3D1785328588583&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fportfolio-plugin-thumbnail-1280x720.png%3Fv%3D1785328588583&w=3840&q=75"/><div class="corner-tag"><span class="cat-pill" style="--cat-dot:hsl(45 90% 50%)">Blog</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> <!-- -->Apr 26, 2025</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>Introducing Elabins Portfolio Blocks: A Modern WordPress Portfolio Plugin with GitHub Integration</h3><p class="excerpt">Discover Elabins Portfolio Blocks, a modern WordPress portfolio plugin designed for developers, designers, and creators. With seamless GitHub integration, customizable portfolio blocks, and Gutenberg support, it makes showcasing projects easier, faster, and more professional.</p><div class="tags"><span class="tag">GitHub-Actions</span><span class="tag">WordPress</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="The Evolution of CakeMail: From Google Sheets to People API" href="/blog/the-evolution-of-cakemail-from-google-sheets-to-people-api"><div class="thumb relative"><img alt="The Evolution of CakeMail: From Google Sheets to People API" 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%2Fcake-mail-thumbnail-1280x720.png%3Fv%3D1785328577861&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fcake-mail-thumbnail-1280x720.png%3Fv%3D1785328577861&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fcake-mail-thumbnail-1280x720.png%3Fv%3D1785328577861&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fcake-mail-thumbnail-1280x720.png%3Fv%3D1785328577861&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fcake-mail-thumbnail-1280x720.png%3Fv%3D1785328577861&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fcake-mail-thumbnail-1280x720.png%3Fv%3D1785328577861&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fcake-mail-thumbnail-1280x720.png%3Fv%3D1785328577861&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fcake-mail-thumbnail-1280x720.png%3Fv%3D1785328577861&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fcake-mail-thumbnail-1280x720.png%3Fv%3D1785328577861&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fcake-mail-thumbnail-1280x720.png%3Fv%3D1785328577861&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Felabins.com%2Fmedia%2Fcake-mail-thumbnail-1280x720.png%3Fv%3D1785328577861&w=3840&q=75"/><div class="corner-tag"><span class="cat-pill" style="--cat-dot:hsl(45 90% 50%)">Blog</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> <!-- -->Apr 07, 2025</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>The Evolution of CakeMail: From Google Sheets to People API</h3><p class="excerpt">Take a behind-the-scenes look at the evolution of CakeMail, from a simple Google Sheets-powered mailing tool to a more scalable solution built around the Google People API. Discover the challenges, lessons learned, and technical decisions that shaped its growth.</p><div class="tags"><span class="tag">Automation</span><span class="tag">GAS</span><span class="tag">Gmail</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><nav class="flex justify-center items-center gap-2 mt-12 flex-wrap" aria-label="pagination"><span aria-disabled="true" aria-label="previous page" class="min-w-[38px] h-[38px] inline-flex items-center justify-center px-3 border rounded-md font-mono text-[0.82rem]" style="background:var(--surface);color:var(--text-muted);border-color:var(--border);font-weight:400;opacity:0.4;pointer-events:none"><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" style="transform:rotate(180deg)"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg></span><div class="hidden sm:contents"><a class="min-w-[38px] h-[38px] inline-flex items-center justify-center px-3 border rounded-md font-mono text-[0.82rem]" style="background:linear-gradient(135deg, var(--primary), var(--secondary));color:white;border-color:transparent;font-weight:600;opacity:1;pointer-events:auto" href="/blog">1</a><a class="min-w-[38px] h-[38px] inline-flex items-center justify-center px-3 border rounded-md font-mono text-[0.82rem]" style="background:var(--surface);color:var(--text-muted);border-color:var(--border);font-weight:400;opacity:1;pointer-events:auto" href="/blog?page=2">2</a></div><div class="sm:hidden inline-flex items-baseline gap-2 px-4 h-[38px] border border-border-base rounded-md bg-surface font-mono text-sm text-fg-muted"><span class="text-[0.7rem] uppercase tracking-widest text-fg-dim self-center">page</span><strong class="grad font-bold text-base">1</strong><span class="text-fg-dim self-center">/</span>
1<span class="self-center">2</span></div><a aria-label="next page" class="min-w-[38px] h-[38px] inline-flex items-center justify-center px-3 border rounded-md font-mono text-[0.82rem]" style="background:var(--surface);color:var(--text-muted);border-color:var(--border);font-weight:400;opacity:1;pointer-events:auto" href="/blog?page=2"><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></nav></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'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><a href="/cdn-cgi/l/email-protection#0f6e7c676e6b4f6a636e6d66617c216c6062" target="_blank" rel="noopener noreferrer"><span class="__cf_email__" data-cfemail="c7a6b4afa6a387a2aba6a5aea9b4e9a4a8aa">[email protected]</span></a></li><li><a href="/contact">Speaking & 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\":[\"\",\"blog\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"(app)\",{\"children\":[\"blog\",{\"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\":[\"blog\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[\"$L5\",null,[\"$\",\"$L6\",null,{\"children\":[\"$L7\",[\"$\",\"$L8\",null,{\"promise\":\"$@9\"}]]}]]}],{},null,false]},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\":\"Blog archive â e-lab innovations\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Long-form writing on hardware, embedded firmware, software craft, and weekend builds â the full archive.\"}],[\"$\",\"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/blog\"}],[\"$\",\"meta\",\"8\",{\"name\":\"format-detection\",\"content\":\"telephone=no, date=no, address=no, email=no\"}],[\"$\",\"meta\",\"9\",{\"property\":\"og:title\",\"content\":\"Blog archive â e-lab innovations\"}],[\"$\",\"meta\",\"10\",{\"property\":\"og:description\",\"content\":\"Long-form writing on hardware, embedded firmware, software craft, and weekend builds â the full archive.\"}],[\"$\",\"meta\",\"11\",{\"property\":\"og:url\",\"content\":\"https://elabins.com/blog\"}],[\"$\",\"meta\",\"12\",{\"property\":\"og:site_name\",\"content\":\"e-lab innovations\"}],[\"$\",\"meta\",\"13\",{\"property\":\"og:image\",\"content\":\"https://elabins.com/og-default.png\"}],[\"$\",\"meta\",\"14\",{\"property\":\"og:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"15\",{\"property\":\"og:image:height\",\"content\":\"630\"}],[\"$\",\"meta\",\"16\",{\"property\":\"og:image:alt\",\"content\":\"e-lab innovations â Learn | Innovate | Share\"}],[\"$\",\"meta\",\"17\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"$\",\"meta\",\"18\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"19\",{\"name\":\"twitter:creator\",\"content\":\"@elabinnovations\"}],[\"$\",\"meta\",\"20\",{\"name\":\"twitter:title\",\"content\":\"Blog archive â e-lab innovations\"}],[\"$\",\"meta\",\"21\",{\"name\":\"twitter:description\",\"content\":\"Long-form writing on hardware, embedded firmware, software craft, and weekend builds â the full archive.\"}],[\"$\",\"meta\",\"22\",{\"name\":\"twitter:image\",\"content\":\"https://elabins.com/og-default.png\"}],[\"$\",\"link\",\"23\",{\"rel\":\"icon\",\"href\":\"/favicon.ico\",\"type\":\"image/x-icon\",\"sizes\":\"16x16\"}],[\"$\",\"link\",\"24\",{\"rel\":\"icon\",\"href\":\"/favicon.ico\",\"sizes\":\"any\"}],[\"$\",\"link\",\"25\",{\"rel\":\"icon\",\"href\":\"/icons/icon-32.png\",\"type\":\"image/png\",\"sizes\":\"32x32\"}],[\"$\",\"link\",\"26\",{\"rel\":\"icon\",\"href\":\"/icons/icon-192.png\",\"type\":\"image/png\",\"sizes\":\"192x192\"}],[\"$\",\"link\",\"27\",{\"rel\":\"icon\",\"href\":\"/logo.svg\",\"type\":\"image/svg+xml\"}],[\"$\",\"link\",\"28\",{\"rel\":\"apple-touch-icon\",\"href\":\"/icons/icon-180.png\",\"sizes\":\"180x180\",\"type\":\"image/png\"}],[\"$\",\"$L10\",\"29\",{}]],\"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\",\"38152\",\"static/chunks/app/(app)/blog/page-9a3cc629e142de28.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\",\"38152\",\"static/chunks/app/(app)/blog/page-9a3cc629e142de28.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,"1f:Tc98,"])</script>
1<script>self.__next_f.push([1,"{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"CollectionPage\",\"@id\":\"https://elabins.com/blog#collection\",\"url\":\"https://elabins.com/blog\",\"name\":\"Blog archive â e-lab innovations\",\"description\":\"Long-form writing on hardware, embedded firmware, software craft, and weekend builds â the full archive.\",\"mainEntity\":{\"@type\":\"ItemList\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"url\":\"https://elabins.com/blog/making-a-wch-link-clone-program-the-unsupported-ch32v003\",\"name\":\"Making a WCH-Link clone program the unsupported CH32V003\",\"image\":\"https://elabins.com/https://elabins.com/media/ch549-link-thumbnail.png?v=1789921984589\"},{\"@type\":\"ListItem\",\"position\":2,\"url\":\"https://elabins.com/blog/building-clipix-a-clipy-style-clipboard-manager-for-gnome\",\"name\":\"Building Clipix, a Clipy-style clipboard manager for GNOME\",\"image\":\"https://elabins.com/https://elabins.com/media/clipix-thumbnail.png?v=1788678908555\"},{\"@type\":\"ListItem\",\"position\":3,\"url\":\"https://elabins.com/blog/building-a-usb-display-from-a-salvaged-smartwatch-lcd\",\"name\":\"Building a USB display from a salvaged smartwatch LCD\",\"image\":\"https://elabins.com/https://elabins.com/media/usb2tft-thumbnail.png?v=1785735340362\"},{\"@type\":\"ListItem\",\"position\":4,\"url\":\"https://elabins.com/blog/turning-a-249-smartwatch-into-a-diy-airtag-tracker\",\"name\":\"Turning a â¹249 Smartwatch Into a DIY AirTag Tracker\",\"image\":\"https://elabins.com/https://elabins.com/media/findmy-airtag-thumbnail.png?v=1785564282618\"},{\"@type\":\"ListItem\",\"position\":5,\"url\":\"https://elabins.com/blog/hacking-a-249-smartwatch-custom-firmware-on-tlsr8232\",\"name\":\"Hacking a â¹249 Smartwatch: Custom Firmware on TLSR8232\",\"image\":\"https://elabins.com/https://elabins.com/media/TLSR8232-watch-thumbnail.png?v=1785308305193\"},{\"@type\":\"ListItem\",\"position\":6,\"url\":\"https://elabins.com/blog/reverse-engineering-moyoung-watch-faces-in-the-browser\",\"name\":\"Reverse Engineering MoYoung Watch Faces in the Browser\",\"image\":\"https://elabins.com/https://elabins.com/media/dafit-canvas-thumbnail.png?v=1785328579369\"},{\"@type\":\"ListItem\",\"position\":7,\"url\":\"https://elabins.com/blog/how-i-built-an-hls-streaming-stack-on-shared-hosting\",\"name\":\"How I Built an HLS Streaming Stack on Shared Hosting\",\"image\":\"https://elabins.com/https://elabins.com/media/hls-stream-thumbnail.png?v=1785328583015\"},{\"@type\":\"ListItem\",\"position\":8,\"url\":\"https://elabins.com/blog/introducing-elabins-portfolio-blocks-a-modern-wordpress-portfolio-plugin-with-github-integration\",\"name\":\"Introducing Elabins Portfolio Blocks: A Modern WordPress Portfolio Plugin with GitHub Integration\",\"image\":\"https://elabins.com/https://elabins.com/media/portfolio-plugin-thumbnail.png?v=1785328588583\"},{\"@type\":\"ListItem\",\"position\":9,\"url\":\"https://elabins.com/blog/the-evolution-of-cakemail-from-google-sheets-to-people-api\",\"name\":\"The Evolution of CakeMail: From Google Sheets to People API\",\"image\":\"https://elabins.com/https://elabins.com/media/cake-mail-thumbnail.png?v=1785328577861\"}]}},{\"@type\":\"BreadcrumbList\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https://elabins.com/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https://elabins.com/blog\"}]}]}"])</script>
1<script>self.__next_f.push([1,"5:[[\"$\",\"script\",null,{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"$1f\"}}],\"$L20\",\"$L21\"]\n"])</script>
1<script>self.__next_f.push([1,"22:I[32886,[\"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\",\"38152\",\"static/chunks/app/(app)/blog/page-9a3cc629e142de28.js\"],\"BlogArchiveFilters\"]\n23: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\",\"38152\",\"static/chunks/app/(app)/blog/page-9a3cc629e142de28.js\"],\"Image\"]\n20:[\"$\",\"section\",null,{\"className\":\"page-hero\",\"children\":[[\"$\",\"div\",null,{\"className\":\"grid-bg\"}],[\"$\",\"div\",null,{\"className\":\"glow-orb primary\",\"style\":{\"width\":320,\"height\":320,\"top\":\"-15%\",\"left\":\"-10%\"}}],[\"$\",\"div\",null,{\"className\":\"container relative\",\"children\":[[\"$\",\"span\",null,{\"className\":\"eyebrow\",\"children\":\"// the archive\"}],[\"$\",\"h1\",null,{\"className\":\"h-grad\",\"children\":\"writings.\"}],[\"$\",\"p\",null,{\"children\":\"Hardware deep dives, embedded firmware notes, software craft, and the occasional opinionated take. Filter by category or tag, search by keyword.\"}]]}]]}]\n"])</script>
1<script>self.__next_f.push([1,"21:[\"$\",\"section\",null,{\"className\":\"section\",\"children\":[\"$\",\"div\",null,{\"className\":\"container\",\"children\":[[\"$\",\"$L22\",null,{\"categories\":[{\"slug\":\"arduino\",\"title\":\"Arduino\"},{\"slug\":\"blog\",\"title\":\"Blog\"},{\"slug\":\"esp32\",\"title\":\"ESP32\"},{\"slug\":\"esp32-cam\",\"title\":\"ESP32-CAM\"},{\"slug\":\"electronics\",\"title\":\"Electronics\"},{\"slug\":\"hardware\",\"title\":\"Hardware\"},{\"slug\":\"projects\",\"title\":\"Projects\"},{\"slug\":\"software\",\"title\":\"Software\"},{\"slug\":\"uncategorized\",\"title\":\"Uncategorized\"}],\"tags\":[{\"slug\":\"airtag\",\"title\":\"AirTag\"},{\"slug\":\"apple\",\"title\":\"Apple\"},{\"slug\":\"arduino\",\"title\":\"Arduino\"},{\"slug\":\"automation\",\"title\":\"Automation\"},{\"slug\":\"ble\",\"title\":\"BLE\"},{\"slug\":\"binary-format\",\"title\":\"Binary-Format\"},{\"slug\":\"ch32v003\",\"title\":\"CH32V003\"},{\"slug\":\"ch549\",\"title\":\"CH549\"},{\"slug\":\"clipboard\",\"title\":\"Clipboard\"},{\"slug\":\"colour\",\"title\":\"Colour\"},{\"slug\":\"cryptography\",\"title\":\"Cryptography\"},{\"slug\":\"dafit\",\"title\":\"DaFit\"},{\"slug\":\"display\",\"title\":\"Display\"},{\"slug\":\"driver\",\"title\":\"Driver\"},{\"slug\":\"esp12\",\"title\":\"ESP12\"},{\"slug\":\"esp32\",\"title\":\"ESP32\"},{\"slug\":\"esp32-cam\",\"title\":\"ESP32-Cam\"},{\"slug\":\"embedded\",\"title\":\"Embedded\"},{\"slug\":\"ffmpeg\",\"title\":\"FFMPEG\"},{\"slug\":\"findmy\",\"title\":\"FindMy\"},{\"slug\":\"firmware\",\"title\":\"Firmware\"},{\"slug\":\"gas\",\"title\":\"GAS\"},{\"slug\":\"github-actions\",\"title\":\"GitHub-Actions\"},{\"slug\":\"gmail\",\"title\":\"Gmail\"},{\"slug\":\"gnome\",\"title\":\"Gnome\"},{\"slug\":\"gnome-extension\",\"title\":\"Gnome Extension\"},{\"slug\":\"hls\",\"title\":\"HLS\"},{\"slug\":\"hardware-hacking\",\"title\":\"Hardware Hacking\"},{\"slug\":\"heroku\",\"title\":\"Heroku\"},{\"slug\":\"homeautomation\",\"title\":\"HomeAutomation\"},{\"slug\":\"homemade\",\"title\":\"Homemade\"},{\"slug\":\"iot\",\"title\":\"IoT\"},{\"slug\":\"l293d\",\"title\":\"L293D\"},{\"slug\":\"linux\",\"title\":\"Linux\"},{\"slug\":\"live-stream\",\"title\":\"Live-Stream\"},{\"slug\":\"mediabunny\",\"title\":\"Mediabunny\"},{\"slug\":\"moyoung\",\"title\":\"MoYoung\"},{\"slug\":\"motor\",\"title\":\"Motor\"},{\"slug\":\"nextjs\",\"title\":\"NextJs\"},{\"slug\":\"node-red\",\"title\":\"Node-red\"},{\"slug\":\"nodejs\",\"title\":\"NodeJs\"},{\"slug\":\"nokia\",\"title\":\"Nokia\"},{\"slug\":\"oscilloscope\",\"title\":\"Oscilloscope\"},{\"slug\":\"php\",\"title\":\"PHP\"},{\"slug\":\"risc-v\",\"title\":\"RISC-V\"},{\"slug\":\"rp2040\",\"title\":\"RP2040\"},{\"slug\":\"react\",\"title\":\"React\"},{\"slug\":\"reverse-engineering\",\"title\":\"Reverse Engineering\"},{\"slug\":\"sdcc\",\"title\":\"SDCC\"},{\"slug\":\"st7735\",\"title\":\"ST7735\"},{\"slug\":\"swio\",\"title\":\"SWIO\"},{\"slug\":\"shared-hosting\",\"title\":\"Shared-Hosting\"},{\"slug\":\"smartwatch\",\"title\":\"SmartWatch\"},{\"slug\":\"streaming\",\"title\":\"Streaming\"},{\"slug\":\"tft\",\"title\":\"TFT\"},{\"slug\":\"tlsr8232\",\"title\":\"TLSR8232\"},{\"slug\":\"tinyusb\",\"title\":\"TinyUSB\"},{\"slug\":\"usb\",\"title\":\"USB\"},{\"slug\":\"ubuntu\",\"title\":\"Ubuntu\"},{\"slug\":\"wch-link\",\"title\":\"WCH-Link\"},{\"slug\":\"web-bluetooth\",\"title\":\"Web-Bluetooth\"},{\"slug\":\"webcodecs\",\"title\":\"WebCodecs\"},{\"slug\":\"websocket\",\"title\":\"WebSocket\"},{\"slug\":\"webusb\",\"title\":\"WebUSB\"},{\"slug\":\"wordpress\",\"title\":\"WordPress\"}],\"current\":{\"category\":null,\"tags\":[],\"q\":\"\",\"sort\":\"newest\"}}],[\"$\",\"div\",null,{\"className\":\"results-meta\",\"children\":[[\"$\",\"span\",null,{\"children\":[\"showing \",[\"$\",\"strong\",null,{\"className\":\"grad\",\"children\":16}],\" article\",\"s\"]}],[\"$\",\"span\",null,{\"children\":[\"page \",1,\" / \",2]}]]}],[\"$\",\"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\":[[\"$\",\"$L23\",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) 100v
1w, (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\":[\"$L24\",\" \",\"24 min read\"]}]]}],\"$L25\",\"$L26\",\"$L27\",\"$L28\"]}]]}],\"$L29\",\"$L2a\",\"$L2b\",\"$L2c\",\"$L2d\",\"$L2e\",\"$L2f\",\"$L30\"]}],\"$L31\"]}]}]\n"])</script>
1<script>self.__next_f.push([1,"24:[\"$\",\"$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}]\n25:[\"$\",\"h3\",null,{\"children\":\"Making a WCH-Link clone program the unsupported CH32V003\"}]\n26:[\"$\",\"p\",null,{\"className\":\"excerpt\",\"children\":\"The listing said CH32V003 not supported. The hardware was never the problem, the firmware was, so I replaced it.\"}]\n27:[\"$\",\"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\"}]]}]\n28:[\"$\",\"div\",null,{\"className\":\"read\",\"children\":[[\"$\",\"span\",null,{\"children\":\"read article\"}],[\"$\",\"$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\":14}]]}]\n"])</script>
1<script>self.__next_f.push([1,"29:[\"$\",\"$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\":[[\"$\",\"$L23\",null,{\"src\":\"https://elabins.com/media/clipix-thumbnail-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\":\"$21:props:children:props:children:2: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\":\"$24:props:iconNode\",\"className\":\"lucide-clock\",\"size\":11}],\" \",\"3 min read\"]}]]}],[\"$\",\"h3\",null,{\"children\":\"Building Clipix, a Clipy-style clipboard manager for GNOME\"}],[\"$\",\"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.\"}],[\"$\",\"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\"}]]}],[\"$\",\"div\",null,{\"className\":\"read\",\"children\":[[\"$\",\"span\",null,{\"children\":\"read article\"}],[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$28:props:children:1:props:iconNode\",\"className\":\"lucide-arrow-right\",\"size\":14}]]}]]}]]}]\n"])</script>
1<script>self.__next_f.push([1,"2a:[\"$\",\"$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\":[[\"$\",\"$L23\",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\":\"$21:props:children:props:children:2: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\":\"$24: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\":\"$28:props:children:1:props:iconNode\",\"className\":\"lucide-arrow-right\",\"size\":14}]]}]]}]]}]\n"])</script>
1<script>self.__next_f.push([1,"2b:[\"$\",\"$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\":[[\"$\",\"$L23\",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\":\"$21:props:children:props:children:2: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\":\"$24: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\":\"$28:props:children:1:props:iconNode\",\"className\":\"lucide-arrow-right\",\"size\":14}]]}]]}]]}]\n"])</script>
1<script>self.__next_f.push([1,"2c:[\"$\",\"$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\":[[\"$\",\"$L23\",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\":\"$21:props:children:props:children:2: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\":\"$24: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\":\"$28:props:children:1:props:iconNode\",\"className\":\"lucide-arrow-right\",\"size\":14}]]}]]}]]}]\n"])</script>
1<script>self.__next_f.push([1,"2d:[\"$\",\"$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\":[[\"$\",\"$L23\",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\":\"$21:props:children:props:children:2: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\":\"$24: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\":\"$28:props:children:1:props:iconNode\",\"className\":\"lucide-arrow-right\",\"size\":14}]]}]]}]]}]\n"])</script>
1<script>self.__next_f.push([1,"2e:[\"$\",\"$L1b\",\"155229e3-d68b-46ca-b23c-6b75ba8696ac\",{\"href\":\"/blog/how-i-built-an-hls-streaming-stack-on-shared-hosting\",\"className\":\"card card-glow-primary blog-card\",\"aria-label\":\"How I Built an HLS Streaming Stack on Shared Hosting\",\"children\":[[\"$\",\"div\",null,{\"className\":\"thumb relative\",\"children\":[[\"$\",\"$L23\",null,{\"src\":\"https://elabins.com/media/hls-stream-thumbnail-1280x720.png?v=1785328583015\",\"alt\":\"How I Built an HLS Streaming Stack on Shared Hosting\",\"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(45 90% 50%)\"},\"children\":\"Blog\"}]}]]}],[\"$\",\"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\":\"$21:props:children:props:children:2:props:children:0:props:children:1:props:children:0:props:children:0:props:children:0:props:iconNode\",\"className\":\"lucide-calendar\",\"size\":11}],\" \",\"Jul 15, 2026\"]}],[\"$\",\"span\",null,{\"className\":\"sep\",\"children\":\"/\"}],[\"$\",\"span\",null,{\"className\":\"inline-flex items-center gap-1\",\"children\":[[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$24:props:iconNode\",\"className\":\"lucide-clock\",\"size\":11}],\" \",\"9 min read\"]}]]}],[\"$\",\"h3\",null,{\"children\":\"How I Built an HLS Streaming Stack on Shared Hosting\"}],[\"$\",\"p\",null,{\"className\":\"excerpt\",\"children\":\"Can shared hosting stream HLS? I built a browser-powered HLS pipeline, measured its limits, and shared the lessons learned.\"}],[\"$\",\"div\",null,{\"className\":\"tags\",\"children\":[[\"$\",\"span\",\"df7b8fa1-36c0-4575-926d-fabb1cd4f5eb\",{\"className\":\"tag\",\"children\":\"HLS\"}],[\"$\",\"span\",\"8e4d9443-2316-4b5a-98a5-cec14bafd507\",{\"className\":\"tag\",\"children\":\"Streaming\"}],[\"$\",\"span\",\"c941a21c-e361-4937-af8a-2265a65d3848\",{\"className\":\"tag\",\"children\":\"Shared-Hosting\"}],[\"$\",\"span\",\"dd88af47-5a6b-4bc9-afe3-649aee913256\",{\"className\":\"tag\",\"children\":\"Mediabunny\"}]]}],[\"$\",\"div\",null,{\"className\":\"read\",\"children\":[[\"$\",\"span\",null,{\"children\":\"read article\"}],[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$28:props:children:1:props:iconNode\",\"className\":\"lucide-arrow-right\",\"size\":14}]]}]]}]]}]\n"])</script>
1<script>self.__next_f.push([1,"2f:[\"$\",\"$L1b\",\"10beb0e7-d112-4ff1-afbd-3e4f35557296\",{\"href\":\"/blog/introducing-elabins-portfolio-blocks-a-modern-wordpress-portfolio-plugin-with-github-integration\",\"className\":\"card card-glow-primary blog-card\",\"aria-label\":\"Introducing Elabins Portfolio Blocks: A Modern WordPress Portfolio Plugin with GitHub Integration\",\"children\":[[\"$\",\"div\",null,{\"className\":\"thumb relative\",\"children\":[[\"$\",\"$L23\",null,{\"src\":\"https://elabins.com/media/portfolio-plugin-thumbnail-1280x720.png?v=1785328588583\",\"alt\":\"Introducing Elabins Portfolio Blocks: A Modern WordPress Portfolio Plugin with GitHub Integration\",\"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(45 90% 50%)\"},\"children\":\"Blog\"}]}]]}],[\"$\",\"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\":\"$21:props:children:props:children:2:props:children:0:props:children:1:props:children:0:props:children:0:props:children:0:props:iconNode\",\"className\":\"lucide-calendar\",\"size\":11}],\" \",\"Apr 26, 2025\"]}],[\"$\",\"span\",null,{\"className\":\"sep\",\"children\":\"/\"}],[\"$\",\"span\",null,{\"className\":\"inline-flex items-center gap-1\",\"children\":[[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$24:props:iconNode\",\"className\":\"lucide-clock\",\"size\":11}],\" \",\"3 min read\"]}]]}],[\"$\",\"h3\",null,{\"children\":\"Introducing Elabins Portfolio Blocks: A Modern WordPress Portfolio Plugin with GitHub Integration\"}],[\"$\",\"p\",null,{\"className\":\"excerpt\",\"children\":\"Discover Elabins Portfolio Blocks, a modern WordPress portfolio plugin designed for developers, designers, and creators. With seamless GitHub integration, customizable portfolio blocks, and Gutenberg support, it makes showcasing projects easier, faster, and more professional.\"}],[\"$\",\"div\",null,{\"className\":\"tags\",\"children\":[[\"$\",\"span\",\"a0020a2c-7259-4cae-abb3-f4b89ca325e0\",{\"className\":\"tag\",\"children\":\"GitHub-Actions\"}],[\"$\",\"span\",\"550ad578-23ce-41b7-b0f8-228a53de8c63\",{\"className\":\"tag\",\"children\":\"WordPress\"}]]}],[\"$\",\"div\",null,{\"className\":\"read\",\"children\":[[\"$\",\"span\",null,{\"children\":\"read article\"}],[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$28:props:children:1:props:iconNode\",\"className\":\"lucide-arrow-right\",\"size\":14}]]}]]}]]}]\n"])</script>
1<script>self.__next_f.push([1,"30:[\"$\",\"$L1b\",\"9dec69da-61ce-436b-bdff-e870d4572a4c\",{\"href\":\"/blog/the-evolution-of-cakemail-from-google-sheets-to-people-api\",\"className\":\"card card-glow-primary blog-card\",\"aria-label\":\"The Evolution of CakeMail: From Google Sheets to People API\",\"children\":[[\"$\",\"div\",null,{\"className\":\"thumb relative\",\"children\":[[\"$\",\"$L23\",null,{\"src\":\"https://elabins.com/media/cake-mail-thumbnail-1280x720.png?v=1785328577861\",\"alt\":\"The Evolution of CakeMail: From Google Sheets to People API\",\"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(45 90% 50%)\"},\"children\":\"Blog\"}]}]]}],[\"$\",\"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\":\"$21:props:children:props:children:2:props:children:0:props:children:1:props:children:0:props:children:0:props:children:0:props:iconNode\",\"className\":\"lucide-calendar\",\"size\":11}],\" \",\"Apr 07, 2025\"]}],[\"$\",\"span\",null,{\"className\":\"sep\",\"children\":\"/\"}],[\"$\",\"span\",null,{\"className\":\"inline-flex items-center gap-1\",\"children\":[[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$24:props:iconNode\",\"className\":\"lucide-clock\",\"size\":11}],\" \",\"3 min read\"]}]]}],[\"$\",\"h3\",null,{\"children\":\"The Evolution of CakeMail: From Google Sheets to People API\"}],[\"$\",\"p\",null,{\"className\":\"excerpt\",\"children\":\"Take a behind-the-scenes look at the evolution of CakeMail, from a simple Google Sheets-powered mailing tool to a more scalable solution built around the Google People API. Discover the challenges, lessons learned, and technical decisions that shaped its growth.\"}],[\"$\",\"div\",null,{\"className\":\"tags\",\"children\":[[\"$\",\"span\",\"2c117a4b-4970-4fe0-b82e-8bb95a465153\",{\"className\":\"tag\",\"children\":\"Automation\"}],[\"$\",\"span\",\"fa5ab45f-cd5b-4cf8-853c-cebaff6c5e72\",{\"className\":\"tag\",\"children\":\"GAS\"}],[\"$\",\"span\",\"e45861ed-b6dc-4dde-8bf0-01b0b2632c6f\",{\"className\":\"tag\",\"children\":\"Gmail\"}]]}],[\"$\",\"div\",null,{\"className\":\"read\",\"children\":[[\"$\",\"span\",null,{\"children\":\"read article\"}],[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$28:props:children:1:props:iconNode\",\"className\":\"lucide-arrow-right\",\"size\":14}]]}]]}]]}]\n"])</script>
1<script>self.__next_f.push([1,"31:[\"$\",\"nav\",null,{\"className\":\"flex justify-center items-center gap-2 mt-12 flex-wrap\",\"aria-label\":\"pagination\",\"children\":[[\"$\",\"span\",null,{\"aria-disabled\":\"true\",\"aria-label\":\"previous page\",\"className\":\"min-w-[38px] h-[38px] inline-flex items-center justify-center px-3 border rounded-md font-mono text-[0.82rem]\",\"style\":{\"background\":\"var(--surface)\",\"color\":\"var(--text-muted)\",\"borderColor\":\"var(--border)\",\"fontWeight\":400,\"opacity\":0.4,\"pointerEvents\":\"none\"},\"children\":[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$28:props:children:1:props:iconNode\",\"className\":\"lucide-arrow-right\",\"size\":14,\"style\":{\"transform\":\"rotate(180deg)\"}}]}],[\"$\",\"div\",null,{\"className\":\"hidden sm:contents\",\"children\":[[\"$\",\"$L1b\",\"1\",{\"href\":\"/blog\",\"aria-label\":\"$undefined\",\"className\":\"min-w-[38px] h-[38px] inline-flex items-center justify-center px-3 border rounded-md font-mono text-[0.82rem]\",\"style\":{\"background\":\"linear-gradient(135deg, var(--primary), var(--secondary))\",\"color\":\"white\",\"borderColor\":\"transparent\",\"fontWeight\":600,\"opacity\":1,\"pointerEvents\":\"auto\"},\"children\":1}],[\"$\",\"$L1b\",\"2\",{\"href\":\"/blog?page=2\",\"aria-label\":\"$undefined\",\"className\":\"min-w-[38px] h-[38px] inline-flex items-center justify-center px-3 border rounded-md font-mono text-[0.82rem]\",\"style\":{\"background\":\"var(--surface)\",\"color\":\"var(--text-muted)\",\"borderColor\":\"var(--border)\",\"fontWeight\":400,\"opacity\":1,\"pointerEvents\":\"auto\"},\"children\":2}]]}],[\"$\",\"div\",null,{\"className\":\"sm:hidden inline-flex items-baseline gap-2 px-4 h-[38px] border border-border-base rounded-md bg-surface font-mono text-sm text-fg-muted\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-[0.7rem] uppercase tracking-widest text-fg-dim self-center\",\"children\":\"page\"}],[\"$\",\"strong\",null,{\"className\":\"grad font-bold text-base\",\"children\":1}],[\"$\",\"span\",null,{\"className\":\"text-fg-dim self-center\",\"children\":\"/\"}],[\"$\",\"span\",null,{\"className\":\"self-center\",\"children\":2}]]}],[\"$\",\"$L1b\",null,{\"href\":\"/blog?page=2\",\"aria-label\":\"next page\",\"className\":\"min-w-[38px] h-[38px] inline-flex items-center justify-center px-3 border rounded-md font-mono text-[0.82rem]\",\"style\":{\"background\":\"var(--surface)\",\"color\":\"var(--text-muted)\",\"borderColor\":\"var(--border)\",\"fontWeight\":400,\"opacity\":1,\"pointerEvents\":\"auto\"},\"children\":[\"$\",\"$L1e\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$28:props:children:1:props:iconNode\",\"className\":\"lucide-arrow-right\",\"size\":14}]}]]}]\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.