PageSourceSearch

https://www.beebombshell.com/blog

html beebombshell.com collected 2026-10-02 01:23:49 UTC 66,664 bytes, 41 lines download raw bytes

1<!DOCTYPE html><!--p3jR_fQ8Wsvst1xPCT9hK--><html class="display-flex position-relative min-width-0 fill-width geist_d82bf9db-module__Ifi_Dq__variable geist_250f8b91-module__B2UTAq__variable geist_4edd9b70-module__GC7HaW__variable geist_mono_90672d7c-module__qcY_rq__variable " lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/797e433ab948586e-s.p.29207c2f.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/caa3a2e1cccd8315-s.p.3b6cae6d.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/chunks/93ac2d54f71ec8d4.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/d20e0f0702cef329.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/7bcc96f0d06e2ff5.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/2a5b081f82bb5f58.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/4c177a1c2b51a4c4.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/370d9903930d886d.js"/>
1<script src="/_next/static/chunks/961311cbebbffb6d.js" async=""></script>
1<script src="/_next/static/chunks/6a646249fbaa4118.js" async=""></script>
1<script src="/_next/static/chunks/turbopack-0ac8f9819d87a5c2.js" async=""></script>
1<script src="/_next/static/chunks/d96012bcfc98706a.js" async=""></script>
1<script src="/_next/static/chunks/73e3194f06db260e.js" async=""></script>
1<script src="/_next/static/chunks/234d212332a9799c.js" async=""></script>
1<script src="/_next/static/chunks/532cfeeb52257029.js" async=""></script>
1<script src="/_next/static/chunks/b1aa469869bea0fe.js" async=""></script>
1<script src="/_next/static/chunks/79d032dd79c3b95c.js" async=""></script>
1<script src="/_next/static/chunks/136acffeffc44697.js" async=""></script>
1<script src="/_next/static/chunks/77c1917bfce7ffb0.js" async=""></script>
1<meta name="next-size-adjust" content=""/><title>Writing about design and tech...</title><meta name="description" content="Read what Bhavya Verma has been up to recently"/><meta property="og:title" content="Writing about design and tech..."/><meta property="og:description" content="Read what Bhavya Verma has been up to recently"/><meta property="og:url" content="https://beebombshell.com/blog"/><meta property="og:image" content="https://beebombshell.com/api/og/generate?title=Writing%20about%20design%20and%20tech..."/><meta property="og:image:alt" content="Writing about design and tech..."/><meta property="og:type" content="website"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:title" content="Writing about design and tech..."/><meta name="twitter:description" content="Read what Bhavya Verma has been up to recently"/><meta name="twitter:image" content="https://beebombshell.com/api/og/generate?title=Writing%20about%20design%20and%20tech..."/><link rel="icon" href="/favicon.ico?favicon.d721a1bf.ico" sizes="32x32" type="image/x-icon"/>
1<script id="theme-init">
2              (function() {
3                try {
4                  const root = document.documentElement;
5                  const defaultTheme = 'system';
6                  
7                  // Set defaults from config
8                  const config = {"brand":"indigo","accent":"blue","neutral":"gray","solid":"contrast","solid-style":"flat","border":"playful","surface":"translucent","transition":"all","scaling":"100","viz-style":"gradient"};
9                  
10                  // Apply default values
11                  Object.entries(config).forEach(([key, value]) => {
12                    root.setAttribute('data-' + key, value);
13                  });
14                  
15                  // Resolve theme
16                  const resolveTheme = (themeValue) => {
17                    if (!themeValue || themeValue === 'system') {
18                      return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
19                    }
20                    return themeValue;
21                  };
22                  
23                  // Apply saved theme
24                  const savedTheme = localStorage.getItem('data-theme');
25                  const resolvedTheme = resolveTheme(savedTheme);
26                  root.setAttribute('data-theme', resolvedTheme);
27                  
28                  // Apply any saved style overrides
29                  const styleKeys = Object.keys(config);
30                  styleKeys.forEach(key => {
31                    const value = localStorage.getItem('data-' + key);
32                    if (value) {
33                      root.setAttribute('data-' + key, value);
34                    }
35                  });
36                } catch (e) {
37                  console.error('Failed to initialize theme:', e);
38                  document.documentElement.setAttribute('data-theme', 'dark');
39                }
40              })();
41            </script>
41<script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script>
41</head><body class="display-flex position-relative p-0 m-0 page-background flex-column align-center min-width-0 fill-width " style="min-height:100vh"><div hidden=""><!--$--><!--/$--></div><div class="display-flex position-absolute fill min-width-0 min-height-0 min-width-0 fill-width RevealFx-module-scss-module__6G5tfa__revealFx RevealFx-module-scss-module__6G5tfa__hidden  " style="transition-duration:2s;transform:translateY(undefined)"><div class="display-flex position-relative overflow-hidden fill min-height-0 min-width-0 "><div class="display-flex position-absolute top-0 left-0 overflow-hidden fill min-height-0 min-width-0 Mask-module-scss-module__b7fjhq__mask " style="--mask-position-x:50%;--mask-position-y:0%;--mask-radius:100vh"><div class="display-flex position-absolute top-0 left-0 pointer-events-none opacity-40 fill min-height-0 min-width-0 Background-module-scss-module__ijNboa__dots " style="--dots-color:var(--brand-background-strong);--dots-size:var(--static-space-2)"></div><div class="display-flex position-absolute top-0 left-0 pointer-events-none opacity-80 fill min-height-0 min-width-0 " style="background-image:linear-gradient(to right, var(--neutral-alpha-medium) 1px, transparent 1px), linear-gradient(to bottom, var(--neutral-alpha-medium) 1px, transparent 1px);background-size:0.25rem 0.25rem"></div></div></div></div><div class="display-flex position-relative min-width-0 fill-width s-flex-hide" style="min-height:var(--static-space-16)"></div><div class="display-flex position-fixed min-width-0 fill-width z-index-9 Fade-module-scss-module__WhQGgG__mask s-flex-hide" style="height:var(--static-space-80);--base-color:var(--page-background);--gradient-direction:180deg"></div><div class="display-flex position-fixed flex-hide bottom-0 min-width-0 fill-width z-index-9 Fade-module-scss-module__WhQGgG__mask s-flex-show" style="height:var(--static-space-80);--base-color:var(--page-background);--gradient-direction:0deg"></div><header class="display-flex position-sticky p-8 top-0 justify-center fit-height min-width-0 fill-width z-index-9 Header-module-scss-module__t7BEda__position s-position-fixed" data-border="rounded"><div class="display-flex position-relative pl-12 align-center min-width-0 fill-width font-body font-default font-s "><div class="display-flex position-relative s-flex-hide">Asia/Kolkata</div></div><div class="display-flex position-relative justify-center min-width-0 fill-width "><div class="display-flex position-relative p-4 page-background neutral-border-alpha-weak border-solid border-1 radius-m-4 justify-center shadow-l z-index-1 "><div class="display-flex position-relative g-4 align-center font-body font-default font-s "><a class="ToggleButton-module-scss-module__9rlAba__button ToggleButton-module-scss-module__9rlAba__ghost ToggleButton-module-scss-module__9rlAba__m radius-m text-decoration-none button cursor-interactive fit-width justify-center" href="/"><span class="display-inline-flex position-relative fit color-inherit Icon-module-scss-module__glKzjG__xs " aria-hidden="true"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 256 256" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M216,120v96H152V152H104v64H40V120a8,8,0,0,1,2.34-5.66l80-80a8,8,0,0,1,11.32,0l80,80A8,8,0,0,1,216,120Z" opacity="0.2"></path><path d="M219.31,108.68l-80-80a16,16,0,0,0-22.62,0l-80,80A15.87,15.87,0,0,0,32,120v96a8,8,0,0,0,8,8h64a8,8,0,0,0,8-8V160h32v56a8,8,0,0,0,8,8h64a8,8,0,0,0,8-8V120A15.87,15.87,0,0,0,219.31,108.68ZM208,208H160V152a8,8,0,0,0-8-8H104a8,8,0,0,0-8,8v56H48V120l80-80,80,80Z"></path></svg></span></a><div class="display-flex position-relative neutral-background-alpha-medium flex-column min-height-0 fill-height " style="min-width:var(--static-space-1);max-height:var(--static-space-24);width:var(--static-space-1)"></div><div class="display-flex position-relative s-flex-hide"><a class="ToggleButton-module-scss-module__9rlAba__button ToggleButton-module-scss-module__9rlAba__ghost ToggleButton-module-scss-module__9rlAba__m radius-m text-decoration-none button cursor-interactive fit-width justify-center" href="/about"><span class="display-inline-flex position-relative fit color-inherit Icon-module-scss-module__glKzjG__xs " aria-hidden="true"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 256 256" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M224,128a95.76,95.76,0,0,1-31.8,71.37A72,72,0,0,0,128,160a40,40,0,1,0-40-40,40,40,0,0,0,40,40,72,72,0,0,0-64.2,39.37h0A96,96,0,1,1,224,128Z" opacity="0.2"></path><path d="M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24ZM74.08,197.5a64,64,0,0,1,10
417.84,0,87.83,87.83,0,0,1-107.84,0ZM96,120a32,32,0,1,1,32,32A32,32,0,0,1,96,120Zm97.76,66.41a79.66,79.66,0,0,0-36.06-28.75,48,48,0,1,0-59.4,0,79.66,79.66,0,0,0-36.06,28.75,88,88,0,1,1,131.52,0Z"></path></svg></span><div class="display-flex position-static px-4 justify-center font-label font-s font-default ">About</div></a></div><div class="display-flex position-relative flex-hide s-flex-show"><a class="ToggleButton-module-scss-module__9rlAba__button ToggleButton-module-scss-module__9rlAba__ghost ToggleButton-module-scss-module__9rlAba__m radius-m text-decoration-none button cursor-interactive fit-width justify-center" href="/about"><span class="display-inline-flex position-relative fit color-inherit Icon-module-scss-module__glKzjG__xs " aria-hidden="true"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 256 256" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M224,128a95.76,95.76,0,0,1-31.8,71.37A72,72,0,0,0,128,160a40,40,0,1,0-40-40,40,40,0,0,0,40,40,72,72,0,0,0-64.2,39.37h0A96,96,0,1,1,224,128Z" opacity="0.2"></path><path d="M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24ZM74.08,197.5a64,64,0,0,1,107.84,0,87.83,87.83,0,0,1-107.84,0ZM96,120a32,32,0,1,1,32,32A32,32,0,0,1,96,120Zm97.76,66.41a79.66,79.66,0,0,0-36.06-28.75,48,48,0,1,0-59.4,0,79.66,79.66,0,0,0-36.06,28.75,88,88,0,1,1,131.52,0Z"></path></svg></span></a></div><div class="display-flex position-relative s-flex-hide"><a class="ToggleButton-module-scss-module__9rlAba__button ToggleButton-module-scss-module__9rlAba__ghost ToggleButton-module-scss-module__9rlAba__m radius-m text-decoration-none button cursor-interactive fit-width justify-center" href="/work"><span class="display-inline-flex position-relative fit color-inherit Icon-module-scss-module__glKzjG__xs " aria-hidden="true"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 256 256" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M208,56V200a8,8,0,0,1-8,8H56a8,8,0,0,1-8-8V56a8,8,0,0,1,8-8H200A8,8,0,0,1,208,56Z" opacity="0.2"></path><path d="M200,40H56A16,16,0,0,0,40,56V200a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V56A16,16,0,0,0,200,40Zm0,80H136V56h64ZM120,56v64H56V56ZM56,136h64v64H56Zm144,64H136V136h64v64Z"></path></svg></span><div class="display-flex position-static px-4 justify-center font-label font-s font-default ">Work</div></a></div><div class="display-flex position-relative flex-hide s-flex-show"><a class="ToggleButton-module-scss-module__9rlAba__button ToggleButton-module-scss-module__9rlAba__ghost ToggleButton-module-scss-module__9rlAba__m radius-m text-decoration-none button cursor-interactive fit-width justify-center" href="/work"><span class="display-inline-flex position-relative fit color-inherit Icon-module-scss-module__glKzjG__xs " aria-hidden="true"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 256 256" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M208,56V200a8,8,0,0,1-8,8H56a8,8,0,0,1-8-8V56a8,8,0,0,1,8-8H200A8,8,0,0,1,208,56Z" opacity="0.2"></path><path d="M200,40H56A16,16,0,0,0,40,56V200a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V56A16,16,0,0,0,200,40Zm0,80H136V56h64ZM120,56v64H56V56ZM56,136h64v64H56Zm144,64H136V136h64v64Z"></path></svg></span></a></div><div class="display-flex position-relative s-flex-hide"><a class="ToggleButton-module-scss-module__9rlAba__button ToggleButton-module-scss-module__9rlAba__ghost ToggleButton-module-scss-module__9rlAba__m ToggleButton-module-scss-module__9rlAba__selected radius-m text-decoration-none button cursor-interactive fit-width justify-center" href="/blog"><span class="display-inline-flex position-relative fit color-inherit Icon-module-scss-module__glKzjG__xs " aria-hidden="true"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 256 256" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M208,32V192H72a24,24,0,0,0-24,24V56A24,24,0,0,1,72,32h40v96l32-24,32,24V32Z" opacity="0.2"></path><path d="M208,24H72A32,32,0,0,0,40,56V224a8,8,0,0,0,8,8H192a8,8,0,0,0,0-16H56a16,16,0,0,1,16-16H208a8,8,0,0,0,8-8V32A8,8,0,0,0,208,24ZM120,40h48v72L148.79,97.6a8,8,0,0,0-9.6,0L120,112Zm80,144H72a31.82,31.82,0,0,0-16,4.29V56A16,16,0,0,1,72,40h32v88a8,8,0,0,0,12.8,6.4L144,114l27.21,20.4A8,8,0,0,0,176,136a8.1,8.1,0,0,0,3.58-.84A8,8,0,0,0,184,128V40h16Z"></path></svg></span><div class="display-flex position-static px-4 justify-center font-label font-s font-default ">Blog</div></a></div><div class="display-flex position-relative flex-hide s-flex-show"><a class="ToggleButton-module-scss-module__9rlAba__button ToggleButton-module-scss-module__9rlAba__ghost ToggleButton-module-scss-module__9rlAba__m ToggleButton-module-scss-module__9rlAba__selected radius-m text-decoration-none button cursor-interactive fit-width justify-center" href="/blog"><span class="display-inline-flex position-relative fit color-inherit Icon-module-scss-module__glKzjG__xs " aria-hidden="true"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 256 256" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M208,32V192H72a24,24,0,0,0-24,24V56A24,24,0,0,1,72,32h40v96l32-24,32,24V32Z" opacity="0.2"></path><path d="M208,24H72A32,32,0,0,0,40,56V224a8,8,0,0,0,8,8H192a8,8,0,0,0,0-16H56a16,16,0,0,1,16-16H208a8,8,0,0,0,8-8V32A8,8,0,0,0,208,24ZM120,40h48v72L148.79,97.6a8,8,0,0,0-9.6,0L120,112Zm80,144H72a31.82,31.82,0,0,0-16,4.29V56A16,16,0,0,1,72,40h32v88a8,8,0,0,0,12.8,6.4L144,114l27.21,20.4A8,8,0,0,0,176,136a8.1,8.1,0,0,0,3.58-.84A8,8,0,0,0,184,128V40h16Z"></path></svg></span></a></div><div class="display-flex position-relative s-flex-hide"><a class="ToggleButton-module-scss-module__9rlAba__button ToggleButton-module-scss-module__9rlAba__ghost ToggleButton-module-scss-module__9rlAba__m radius-m text-decoration-none button cursor-interactive fit-width justify-center" href="/gallery"><span class="display-inline-flex position-relative fit color-inherit Icon-module-scss-module__glKzjG__xs " aria-hidden="true"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 256 256" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M224,56V178.06l-39.72-39.72a8,8,0,0,0-11.31,0L147.31,164,97.66,114.34a8,8,0,0,0-11.32,0L32,168.69V56a8,8,0,0,1,8-8H216A8,8,0,0,1,224,56Z" opacity="0.2"></path><path d="M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40Zm0,16V158.75l-26.07-26.06a16,16,0,0,0-22.63,0l-20,20-44-44a16,16,0,0,0-22.62,0L40,149.37V56ZM40,172l52-52,80,80H40Zm176,28H194.63l-36-36,20-20L216,181.38V200ZM144,100a12,12,0,1,1,12,12A12,12,0,0,1,144,100Z"></path></svg></span><div class="display-flex position-static px-4 justify-center font-label font-s font-default ">Gallery</div></a></div><div class="display-flex position-relative flex-hide s-flex-show"><a class="ToggleButton-module-scss-module__9rlAba__button ToggleButton-module-scss-module__9rlAba__ghost ToggleButton-module-scss-module__9rlAba__m radius-m text-decoration-none button cursor-interactive fit-width justify-center" href="/gallery"><span class="display-inline-flex position-relative fit color-inherit Icon-module-scss-module__glKzjG__xs " aria-hidden="true"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 256 256" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M224,56V178.06l-39.72-39.72a8,8,0,0,0-11.31,0L147.31,164,97.66,114.34a8,8,0,0,0-11.32,0L32,168.69V56a8,8,0,0,1,8-8H216A8,8,0,0,1,224,56Z" opacity="0.2"></path><path d="M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40Zm0,16V158.75l-26.07-26.06a16,16,0,0,0-22.63,0l-20,20-44-44a16,16,0,0,0-22.62,0L40,149.37V56ZM40,172l52-52,80,80H40Zm176,28H194.63l-36-36,20-20L216,181.38V200ZM144,100a12,12,0,1,1,12,12A12,12,0,0,1,144,100Z"></path></svg></span></a></div><div class="display-flex position-relative neutral-background-alpha-medium flex-column min-height-0 fill-height " style="min-width:var(--static-space-1);max-height:var(--static-space-24);width:var(--static-space-1)"></div><button class="ToggleButton-module-scss-module__9rlAba__button ToggleButton-module-scss-module__9rlAba__ghost ToggleButton-module-scss-module__9rlAba__m radius-m text-decoration-none button cursor-interactive fit-width justify-center" aria-label="Switch to dark mode"><span class="display-inline-flex position-relative fit color-inherit Icon-module-scss-module__glKzjG__xs " aria-hidden="true">
41<svg stroke="currentColor" fill="none" stroke-width="1.5" viewBox="0 0 24 24" aria-hidden="true" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" stroke-linejoin="round" d="M21.752 15.002A9.72 9.72 0 0 1 18 15.75c-5.385 0-9.75-4.365-9.75-9.75 0-1.33.266-2.597.748-3.752A9.753 9.753 0 0 0 3 11.25C3 16.635 7.365 21 12.75 21a9.753 9.753 0 0 0 9.002-5.998Z"></path></svg></span></button></div></div></div><div class="display-flex position-relative justify-end align-center min-width-0 fill-width "><div class="display-flex position-relative pr-12 g-20 justify-end align-center font-body font-default font-s "><div class="display-flex position-relative s-flex-hide"></div></div></div></header><div class="display-flex position-relative p-l flex-1 justify-center min-width-0 fill-width "><div class="display-flex position-relative justify-center min-width-0 fill-width " style="min-height:var(--static-space-0)"><div class="display-flex position-relative py-128 justify-center min-width-0 fill-width "><div class="display-flex position-relative center "><div class="display-flex position-relative center Spinner-module-scss-module__imkilW__m " role="status" aria-label="Loading"><div class="display-flex position-relative fill min-height-0 min-width-0 "><div class="display-flex position-absolute neutral-border-alpha-medium border-1 border-solid radius-full fill min-height-0 min-width-0 Spinner-module-scss-module__imkilW__size "></div><div class="display-flex position-relative border-solid radius-full fill min-height-0 min-width-0 Spinner-module-scss-module__imkilW__spinner Spinner-module-scss-module__imkilW__size "></div></div></div></div></div></div></div><footer class="display-flex position-relative p-8 justify-center min-width-0 fill-width s-flex-column"><div class="display-flex position-relative px-16 py-8 g-16 justify-between align-center fill-width Footer-module-scss-module__DkSkqG__mobile s-flex-column s-align-center" style="max-width:var(--responsive-width-m)"><span class="font-body font-default font-s neutral-on-background-strong"><span class="neutral-on-background-weak">© <!-- -->2026<!-- --> /</span><span class="px-4">Bhavya Verma</span><span class="neutral-on-background-weak">/ Built with 💜 using<!-- --> <a href="https://once-ui.com/products/magic-portfolio" target="_blank" rel="noreferrer" class="reset-button-styles focus-ring align-center display-inline-flex g-8 radius-s fit-width px-2 mx-2">Once UI</a></span></span><div class="display-flex position-relative g-16 "><div class="display-flex position-relative "><a href="https://github.com/beebombshell" target="_blank" rel="noreferrer" class="Button-module-scss-module__Z_19_G__button Button-module-scss-module__Z_19_G__ghost IconButton-module-scss-module__-vAwNG__s radius-m text-decoration-none button cursor-interactive" aria-label="GitHub"><div class="display-flex position-relative center fill min-height-0 min-width-0 "><span class="display-inline-flex position-relative fit color-inherit Icon-module-scss-module__glKzjG__s " aria-hidden="true"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 496 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"></path></svg></span></div></a></div><div class="display-flex position-relative "><a href="https://www.linkedin.com/in/beebombshell" target="_blank" rel="noreferrer" class="Button-module-scss-module__Z_19_G__button Button-module-scss-module__Z_19_G__ghost IconButton-module-scss-module__-vAwNG__s radius-m text-decoration-none button cursor-interactive" aria-label="LinkedIn"><div class="display-flex position-relative center fill min-height-0 min-width-0 "><span class="display-inline-flex position-relative fit color-inherit Icon-module-scss-module__glKzjG__s " aria-hidden="true"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 448 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z"></path></svg></span></div></a></div><div class="display-flex position-relative "><a href="https://x.com/bee_bombshell" target="_blank" rel="noreferrer" class="Button-module-scss-module__Z_19_G__button Button-module-scss-module__Z_19_G__ghost IconButton-module-scss-module__-vAwNG__s radius-m text-decoration-none button cursor-interactive" aria-label="X"><div class="display-flex position-relative center fill min-height-0 min-width-0 "><span class="display-inline-flex position-relative fit color-inherit Icon-module-scss-module__glKzjG__s " aria-hidden="true"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 512 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z"></path></svg></span></div></a></div><div class="display-flex position-relative "><a class="Button-module-scss-module__Z_19_G__button Button-module-scss-module__Z_19_G__ghost IconButton-module-scss-module__-vAwNG__s radius-m text-decoration-none button cursor-interactive" aria-label="Email" href="mailto:[email protected]"><div class="display-flex position-relative center fill min-height-0 min-width-0 "><span class="display-inline-flex position-relative fit color-inherit Icon-module-scss-module__glKzjG__s " aria-hidden="true"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 24 24" aria-hidden="true" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M1.5 8.67v8.58a3 3 0 0 0 3 3h15a3 3 0 0 0 3-3V8.67l-8.928 5.493a3 3 0 0 1-3.144 0L1.5 8.67Z"></path><path d="M22.5 6.908V6.75a3 3 0 0 0-3-3h-15a3 3 0 0 0-3 3v.158l9.714 5.978a1.5 1.5 0 0 0 1.572 0L22.5 6.908Z"></path></svg></span></div></a></div></div></div><div class="display-flex position-relative flex-hide s-flex-show" style="height:var(--static-space-80)"></div></footer>
41<script src="/_next/static/chunks/370d9903930d886d.js" id="_R_" async=""></script>
41<script>(self.__next_f=self.__next_f||[]).push([0])</script>
41<script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n3:I[339756,[\"/_next/static/chunks/d96012bcfc98706a.js\",\"/_next/static/chunks/73e3194f06db260e.js\"],\"default\"]\n4:I[837457,[\"/_next/static/chunks/d96012bcfc98706a.js\",\"/_next/static/chunks/73e3194f06db260e.js\"],\"default\"]\n5:I[273323,[\"/_next/static/chunks/234d212332a9799c.js\",\"/_next/static/chunks/532cfeeb52257029.js\",\"/_next/static/chunks/b1aa469869bea0fe.js\",\"/_next/static/chunks/79d032dd79c3b95c.js\",\"/_next/static/chunks/136acffeffc44697.js\",\"/_next/static/chunks/77c1917bfce7ffb0.js\"],\"Column\"]\n6:I[479520,[\"/_next/static/chunks/234d212332a9799c.js\",\"/_next/static/chunks/532cfeeb52257029.js\",\"/_next/static/chunks/b1aa469869bea0fe.js\",\"/_next/static/chunks/79d032dd79c3b95c.js\",\"/_next/static/chunks/136acffeffc44697.js\",\"/_next/static/chunks/77c1917bfce7ffb0.js\"],\"\"]\n7:I[696470,[\"/_next/static/chunks/234d212332a9799c.js\",\"/_next/static/chunks/532cfeeb52257029.js\",\"/_next/static/chunks/b1aa469869bea0fe.js\",\"/_next/static/chunks/79d032dd79c3b95c.js\",\"/_next/static/chunks/136acffeffc44697.js\",\"/_next/static/chunks/77c1917bfce7ffb0.js\"],\"ClientGrid\"]\n8:I[814360,[\"/_next/static/chunks/234d212332a9799c.js\",\"/_next/static/chunks/532cfeeb52257029.js\",\"/_next/static/chunks/b1aa469869bea0fe.js\",\"/_next/static/chunks/79d032dd79c3b95c.js\",\"/_next/static/chunks/136acffeffc44697.js\",\"/_next/static/chunks/77c1917bfce7ffb0.js\"],\"default\"]\nf:I[168027,[],\"default\"]\n:HL[\"/_next/static/chunks/93ac2d54f71ec8d4.css\",\"style\"]\n:HL[\"/_next/static/chunks/d20e0f0702cef329.css\",\"style\"]\n:HL[\"/_next/static/chunks/7bcc96f0d06e2ff5.css\",\"style\"]\n:HL[\"/_next/static/chunks/2a5b081f82bb5f58.css\",\"style\"]\n:HL[\"/_next/static/chunks/4c177a1c2b51a4c4.css\",\"style\"]\n:HL[\"/_next/static/media/797e433ab948586e-s.p.29207c2f.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/caa3a2e1cccd8315-s.p.3b6cae6d.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n9:Td20,"])</script>
41<script>self.__next_f.push([1,"\n## Keeping Framer CMS in Sync with Real Products\n\nI built CMS Data Sync while working on the BuildShip Integrations website, a Framer powered site with over 500 pages that needed to stay in sync with a fast moving product.\n\nFramer is exceptionally good at what it sets out to do. It makes layout, interaction, and visual polish feel almost effortless. But as the site grew and the product evolved, a quiet tension started to show up. The CMS was becoming a bottleneck.\n\nFramer does not support API calls or automations by design. Content is expected to be edited manually. For small sites, that is perfectly reasonable. For a product driven website, it slowly becomes brittle. Pages fall out of date. Schemas change. The website starts lagging behind the system it is supposed to represent.\n\nI wanted Framer to stay what it does best, a UI layer. I needed the data to come from somewhere else.\n\nYou can find the plugin on the [Framer Marketplace](https://www.framer.com/marketplace/plugins/cms-data-sync/).\n\n## Finding the Right Extension Point\n\nPlugins turned out to be the only place where this was possible. They are the one part of Framer that can reach outside, fetch data, and write back into the CMS.\n\nFramer already has plugins for specific tools like Google Sheets or Airtable. They work well for narrow use cases, but they lock you into a single source. What I needed was something more flexible. Something that could connect to anything, as long as it could return structured data.\n\nThat is where BuildShip fit naturally.\n\n\u003cMedia\n    src=\"/images/projects/buildship/framer-cms-2.jpg\"\n    alt=\"Framer CMS Plugin\"\n/\u003e\n\n## What CMS Data Sync Enables\n\nCMS Data Sync connects Framer CMS to BuildShip workflows and treats external systems as the source of truth.\n\nYou connect a workflow endpoint, preview the incoming data, map fields into CMS types, and sync everything in one controlled flow. A selected field acts as a stable identifier so repeated syncs update existing items instead of creating duplicates.\n\nThe CMS stops being something you constantly edit and starts behaving more like a projection of your product state.\n\n## A Tool People Actually Use\n\nToday, CMS Data Sync has more than 1300 active users. Many of them are using Framer beyond simple marketing pages, building documentation, integration directories, and product surfaces that change frequently.\n\nThe plugin is intentionally designed for developers, but without feeling hostile to designers. The UI tries to explain what is happening, surface good defaults, and avoid destructive actions. Automation should feel calm, not risky.\n\n\u003cMedia\n    src=\"/images/projects/buildship/framer-cms-3.jpg\"\n    alt=\"Framer CMS Plugin\"\n/\u003e\n\n## Why This Approach Matters\n\nRather than adding yet another point integration, CMS Data Sync takes a more general approach. By sitting on top of BuildShip, it can connect to databases, internal services, third party APIs, or computed workflows without changing how Framer is used.\n\nFor teams that want Framer’s speed and polish without giving up control over their data pipelines, this ends up being a surprisingly effective balance.\n\nYou can install the plugin from the [Framer Marketplace](https://www.framer.com/marketplace/plugins/cms-data-sync/), and there is a detailed setup guide available [here](https://docs.buildship.com/tutorials/framer-cms).\n"])</script>
41<script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"p3jR_fQ8Wsvst1xPCT9hK\",\"c\":[\"\",\"blog\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"blog\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/93ac2d54f71ec8d4.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/d20e0f0702cef329.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"2\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/7bcc96f0d06e2ff5.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"3\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/2a5b081f82bb5f58.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"4\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/4c177a1c2b51a4c4.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/234d212332a9799c.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/532cfeeb52257029.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-2\",{\"src\":\"/_next/static/chunks/b1aa469869bea0fe.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-3\",{\"src\":\"/_next/static/chunks/79d032dd79c3b95c.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-4\",{\"src\":\"/_next/static/chunks/136acffeffc44697.js\",\"async\":true,\"nonce\":\"$undefined\"}]],\"$L2\"]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L5\",null,{\"maxWidth\":\"m\",\"paddingTop\":\"24\",\"children\":[[\"$\",\"$L6\",null,{\"id\":\"schema-blogPosting-/blog\",\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"BlogPosting\\\",\\\"url\\\":\\\"https://beebombshell.com/blog\\\",\\\"sameAs\\\":[],\\\"headline\\\":\\\"Writing about design and tech...\\\",\\\"description\\\":\\\"Read what Bhavya Verma has been up to recently\\\",\\\"image\\\":\\\"https://beebombshell.com/api/og/generate?title=Writing%20about%20design%20and%20tech...\\\",\\\"author\\\":{\\\"@type\\\":\\\"Person\\\",\\\"name\\\":\\\"Bhavya Verma\\\",\\\"url\\\":\\\"https://beebombshell.com/blog\\\",\\\"image\\\":{\\\"@type\\\":\\\"ImageObject\\\",\\\"url\\\":\\\"https://beebombshell.com/images/avatar.jpg\\\"}}}\"}}],[\"$\",\"h1\",null,{\"className\":\"font-heading font-strong font-xl neutral-on-background-strong ml-24 mb-l\",\"style\":{\"textAlign\":\"$undefined\",\"textWrap\":\"balance\"},\"children\":\"Writing about design and tech...\"}],[\"$\",\"$L5\",null,{\"fillWidth\":true,\"flex\":1,\"gap\":\"40\",\"children\":[[\"$\",\"$L7\",null,{\"ref\":\"$undefined\",\"cursor\":\"$undefined\",\"xl\":\"$undefined\",\"l\":\"$undefined\",\"m\":\"$undefined\",\"s\":{\"columns\":1},\"xs\":\"$undefined\",\"style\":\"$undefined\",\"hide\":\"$undefined\",\"columns\":\"1\",\"fillWidth\":true,\"marginBottom\":\"40\",\"gap\":\"16\",\"children\":[[\"$\",\"$L8\",\"framer-cms-plugin\",{\"post\":{\"metadata\":{\"title\":\"Framer CMS Data Sync Plugin\",\"subtitle\":\"\",\"publishedAt\":\"2025-12-26\",\"summary\":\"Framer CMS plugin for Sync data from any source like Google Sheets, Airtable, Firebase, Supabase, Postgres etc to Framer CMS.\",\"image\":\"/images/projects/buildship/framer-cms.jpg\",\"images\":[],\"tag\":\"Framer CMS Plugin\",\"team\":[],\"link\":\"\",\"canonical\":\"\"},\"slug\":\"framer-cms-plugin\",\"content\":\"$9\"},\"thumbnail\":true,\"direction\":\"$undefined\"}]]}],\"$La\",\"$Lb\",false]}]]}],[\"$Lc\"],\"$Ld\"]}],{}
41,null,false,false]},null,false,false]},null,false,false],\"$Le\",false]],\"m\":\"$undefined\",\"G\":[\"$f\",[]],\"S\":true}\n"])</script>
41<script>self.__next_f.push([1,"13:I[303847,[\"/_next/static/chunks/234d212332a9799c.js\",\"/_next/static/chunks/532cfeeb52257029.js\",\"/_next/static/chunks/b1aa469869bea0fe.js\",\"/_next/static/chunks/79d032dd79c3b95c.js\",\"/_next/static/chunks/136acffeffc44697.js\",\"/_next/static/chunks/77c1917bfce7ffb0.js\"],\"Mailchimp\"]\n14:I[897367,[\"/_next/static/chunks/d96012bcfc98706a.js\",\"/_next/static/chunks/73e3194f06db260e.js\"],\"OutletBoundary\"]\n15:\"$Sreact.suspense\"\n17:I[897367,[\"/_next/static/chunks/d96012bcfc98706a.js\",\"/_next/static/chunks/73e3194f06db260e.js\"],\"ViewportBoundary\"]\n19:I[897367,[\"/_next/static/chunks/d96012bcfc98706a.js\",\"/_next/static/chunks/73e3194f06db260e.js\"],\"MetadataBoundary\"]\n1c:I[530824,[\"/_next/static/chunks/234d212332a9799c.js\",\"/_next/static/chunks/532cfeeb52257029.js\",\"/_next/static/chunks/b1aa469869bea0fe.js\",\"/_next/static/chunks/79d032dd79c3b95c.js\",\"/_next/static/chunks/136acffeffc44697.js\",\"/_next/static/chunks/77c1917bfce7ffb0.js\"],\"Providers\"]\n1d:I[621971,[\"/_next/static/chunks/234d212332a9799c.js\",\"/_next/static/chunks/532cfeeb52257029.js\",\"/_next/static/chunks/b1aa469869bea0fe.js\",\"/_next/static/chunks/79d032dd79c3b95c.js\",\"/_next/static/chunks/136acffeffc44697.js\",\"/_next/static/chunks/77c1917bfce7ffb0.js\"],\"RevealFx\"]\n1e:I[394412,[\"/_next/static/chunks/234d212332a9799c.js\",\"/_next/static/chunks/532cfeeb52257029.js\",\"/_next/static/chunks/b1aa469869bea0fe.js\",\"/_next/static/chunks/79d032dd79c3b95c.js\",\"/_next/static/chunks/136acffeffc44697.js\",\"/_next/static/chunks/77c1917bfce7ffb0.js\"],\"Background\"]\n1f:I[521247,[\"/_next/static/chunks/234d212332a9799c.js\",\"/_next/static/chunks/532cfeeb52257029.js\",\"/_next/static/chunks/b1aa469869bea0fe.js\",\"/_next/static/chunks/79d032dd79c3b95c.js\",\"/_next/static/chunks/136acffeffc44697.js\",\"/_next/static/chunks/77c1917bfce7ffb0.js\"],\"ClientFlex\"]\n20:I[402971,[\"/_next/static/chunks/234d212332a9799c.js\",\"/_next/static/chunks/532cfeeb52257029.js\",\"/_next/static/chunks/b1aa469869bea0fe.js\",\"/_next/static/chunks/79d032dd79c3b95c.js\",\"/_next/static/chunks/136acffeffc44697.js\",\"/_next/static/chunks/77c1917bfce7ffb0.js\"],\"Header\"]\n21:I[1166,[\"/_next/static/chunks/234d212332a9799c.js\",\"/_next/static/chunks/532cfeeb52257029.js\",\"/_next/static/chunks/b1aa469869bea0fe.js\",\"/_next/static/chunks/79d032dd79c3b95c.js\",\"/_next/static/chunks/136acffeffc44697.js\",\"/_next/static/chunks/77c1917bfce7ffb0.js\"],\"RouteGuard\"]\n10:T119a,"])</script>
41<script>self.__next_f.push([1,"\n## Bringing Computer Vision to Serverless Workflows\n\nComputer vision has rapidly become a core capability for modern software, enabling everything from automated inventory tracking and quality inspection to intelligent media moderation. However, traditionally integrating vision models into production applications required substantial infrastructure overhead: provisioning GPU or containerized backend servers, configuring Google Cloud service accounts and SDKs, parsing multi-part payloads, and calculating bounding box coordinate transforms.\n\nWhile building templates and nodes at BuildShip, I wanted to bridge this gap. The goal was to provide an end-to-end, production-ready template that packages Google Cloud Vision's object localization into a visual, low-code workflow that any developer can remix and customize in minutes.\n\n\n## Architecture of the Google Vision Workflow\n\nThe template exposes an HTTP endpoint that ingests an image URL, analyzes its contents via Google Vision API, detects objects, and returns both structured JSON metadata and an annotated image with colored bounding boxes and labels.\n\nHere is how the end-to-end pipeline operates:\n\n1. **HTTP Trigger (`/detectobjects`)**: The workflow starts with an incoming GET request that takes a query parameter, `imageURL`, pointing to the target image file.\n2. **Input Validation**: The URL is validated to ensure it points to a reachable, supported image format (JPEG, PNG, WebP).\n3. **Google Cloud Vision Node**: The image URL is passed to BuildShip's Google Vision localization node. Under the hood, this makes an authenticated request to the Google Vision API, executing an `OBJECT_LOCALIZATION` feature query.\n4. **Bounding Box Calculation**: Google Vision returns a list of detected objects, each with a localized name, confidence score (0.0 to 1.0), and normalized bounding polygon vertices.\n5. **Visual Annotation (Canvas / Headless Renderer)**: A downstream node computes the pixel coordinates from the normalized vertices and draws bounding boxes with category tags directly over the original image.\n6. **API Response**: The workflow responds with a clean JSON payload containing the detected entities along with the newly rendered annotated image asset.\n\n\u003cMedia\n  src=\"/images/blog/vision-workflow.jpeg\"\n  alt=\"Object Detection Workflow Architecture\"\n/\u003e\n\n## Real-World Use Cases\n\nIntegrating object detection as an API endpoint unlocks immediate automation opportunities across industries:\n\n- **E-Commerce \u0026 Inventory Management**: Automatically categorize items from warehouse cameras or seller product uploads, verifying that required items are present before listing.\n- **Smart Asset Tagging \u0026 DAM**: Ingest thousands of marketing assets, automatically tag visible items (e.g. laptops, clothing, vehicles), and index them for rapid internal search.\n- **Security \u0026 Workplace Safety**: Monitor facility imagery for required safety equipment like helmets and vests, triggering instant notifications when safety compliance standards are breached.\n- **Social \u0026 UGC Moderation**: Detect prohibited items or inappropriate objects in user uploads before they are published to public feeds.\n\n## Handling Coordinate Normalization\n\nA common gotcha when working with Google Vision API is handling coordinate geometry. Rather than returning absolute pixel values, Google Vision returns normalized vertices where $x$ and $y$ are floats between `0.0` and `1.0`, representing the proportion of the image width and height.\n\n```typescript\n// Transforming normalized vertices to canvas coordinates\nconst x = vertex.x * imageWidth;\nconst y = vertex.y * imageHeight;\nconst boxWidth = (normalizedRight - normalizedLeft) * imageWidth;\nconst boxHeight = (normalizedBottom - normalizedTop) * imageHeight;\n```\n\nBy abstracting this coordinate transformation inside the workflow node, consumers of the template do not have to write custom canvas drawing logic. They simply pass an image URL and receive the annotated result ready for downstream consumers.\n\n## Extensibility \u0026 Composable Pipelines\n\nThe true power of this template lies in its composability. Because BuildShip connects visual triggers and nodes seamlessly, you can branch the workflow to:\n\n- Store detected object tags directly in **Firestore**, **Supabase**, or **Postgres**.\n- Trigger alerts in **Slack** or **Discord** if a specific item or anomaly is identified.\n- Feed the detected labels into **OpenAI** or **Claude** to generate an automated descriptive summary of the scene.\n\n"])</script>
41<script>self.__next_f.push([1,"a:[\"$\",\"$L7\",null,{\"ref\":\"$undefined\",\"cursor\":\"$undefined\",\"xl\":\"$undefined\",\"l\":\"$undefined\",\"m\":\"$undefined\",\"s\":{\"columns\":1},\"xs\":\"$undefined\",\"style\":\"$undefined\",\"hide\":\"$undefined\",\"columns\":\"2\",\"fillWidth\":true,\"marginBottom\":\"40\",\"gap\":\"16\",\"children\":[[\"$\",\"$L8\",\"google-vision\",{\"post\":{\"metadata\":{\"title\":\"Object Detection with BuildShip's Google Vision API Template\",\"subtitle\":\"\",\"publishedAt\":\"2024-05-20\",\"summary\":\"Learn how to implement object detection in your workflows using the Google Vision API template on BuildShip.\",\"image\":\"/images/blog/google-vision.jpeg\",\"images\":[],\"tag\":\"AI \u0026 Vision\",\"team\":[],\"link\":\"https://buildship.com/blog/object-detection-with-buildship-s-google-vision-api-template\",\"canonical\":\"\"},\"slug\":\"google-vision\",\"content\":\"$10\"},\"thumbnail\":true,\"direction\":\"column\"}],\"$L11\",\"$L12\"]}]\nb:[\"$\",\"$L13\",null,{\"marginBottom\":\"l\"}]\nc:[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/77c1917bfce7ffb0.js\",\"async\":true,\"nonce\":\"$undefined\"}]\nd:[\"$\",\"$L14\",null,{\"children\":[\"$\",\"$15\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@16\"}]}]\ne:[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L17\",null,{\"children\":\"$L18\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L19\",null,{\"children\":[\"$\",\"$15\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L1a\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}]\n1b:T76e,"])</script>
41<script>self.__next_f.push([1,"\n              (function() {\n                try {\n                  const root = document.documentElement;\n                  const defaultTheme = 'system';\n                  \n                  // Set defaults from config\n                  const config = {\"brand\":\"indigo\",\"accent\":\"blue\",\"neutral\":\"gray\",\"solid\":\"contrast\",\"solid-style\":\"flat\",\"border\":\"playful\",\"surface\":\"translucent\",\"transition\":\"all\",\"scaling\":\"100\",\"viz-style\":\"gradient\"};\n                  \n                  // Apply default values\n                  Object.entries(config).forEach(([key, value]) =\u003e {\n                    root.setAttribute('data-' + key, value);\n                  });\n                  \n                  // Resolve theme\n                  const resolveTheme = (themeValue) =\u003e {\n                    if (!themeValue || themeValue === 'system') {\n                      return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n                    }\n                    return themeValue;\n                  };\n                  \n                  // Apply saved theme\n                  const savedTheme = localStorage.getItem('data-theme');\n                  const resolvedTheme = resolveTheme(savedTheme);\n                  root.setAttribute('data-theme', resolvedTheme);\n                  \n                  // Apply any saved style overrides\n                  const styleKeys = Object.keys(config);\n                  styleKeys.forEach(key =\u003e {\n                    const value = localStorage.getItem('data-' + key);\n                    if (value) {\n                      root.setAttribute('data-' + key, value);\n                    }\n                  });\n                } catch (e) {\n                  console.error('Failed to initialize theme:', e);\n                  document.documentElement.setAttribute('data-theme', 'dark');\n                }\n              })();\n            "])</script>
41<script>self.__next_f.push([1,"2:[\"$\",\"html\",null,{\"ref\":\"$undefined\",\"className\":\"display-flex position-relative min-width-0 fill-width geist_d82bf9db-module__Ifi_Dq__variable geist_250f8b91-module__B2UTAq__variable geist_4edd9b70-module__GC7HaW__variable geist_mono_90672d7c-module__qcY_rq__variable \",\"style\":{\"maxWidth\":\"$undefined\",\"minWidth\":\"$undefined\",\"minHeight\":\"$undefined\",\"maxHeight\":\"$undefined\",\"width\":\"$undefined\",\"height\":\"$undefined\",\"aspectRatio\":\"$undefined\",\"textAlign\":\"$undefined\",\"cursor\":\"$undefined\"},\"suppressHydrationWarning\":true,\"lang\":\"en\",\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"script\",null,{\"id\":\"theme-init\",\"dangerouslySetInnerHTML\":{\"__html\":\"$1b\"}}]}],[\"$\",\"$L1c\",null,{\"children\":[\"$\",\"$L5\",null,{\"as\":\"body\",\"background\":\"page\",\"fillWidth\":true,\"style\":{\"minHeight\":\"100vh\"},\"margin\":\"0\",\"padding\":\"0\",\"horizontal\":\"center\",\"children\":[[\"$\",\"$L1d\",null,{\"fill\":true,\"position\":\"absolute\",\"children\":[\"$\",\"$L1e\",null,{\"mask\":{\"x\":50,\"y\":0,\"radius\":100,\"cursor\":false},\"gradient\":{\"display\":false,\"opacity\":100,\"x\":50,\"y\":60,\"width\":100,\"height\":50,\"tilt\":0,\"colorStart\":\"accent-background-strong\",\"colorEnd\":\"page-background\"},\"dots\":{\"display\":true,\"opacity\":40,\"size\":\"2\",\"color\":\"brand-background-strong\"},\"grid\":{\"display\":true,\"opacity\":80,\"color\":\"neutral-alpha-medium\",\"width\":\"0.25rem\",\"height\":\"0.25rem\"},\"lines\":{\"display\":false,\"opacity\":100,\"size\":\"16\",\"thickness\":1,\"angle\":45,\"color\":\"neutral-alpha-weak\"}}]}],[\"$\",\"$L1f\",null,{\"ref\":\"$undefined\",\"cursor\":\"$undefined\",\"xl\":\"$undefined\",\"l\":\"$undefined\",\"m\":\"$undefined\",\"s\":{\"hide\":true},\"xs\":\"$undefined\",\"style\":\"$undefined\",\"hide\":\"$undefined\",\"fillWidth\":true,\"minHeight\":\"16\"}],[\"$\",\"$L20\",null,{}],[\"$\",\"div\",null,{\"ref\":\"$undefined\",\"className\":\"display-flex position-relative p-l flex-1 justify-center min-width-0 fill-width \",\"style\":{\"maxWidth\":\"$undefined\",\"minWidth\":\"$undefined\",\"minHeight\":\"$undefined\",\"maxHeight\":\"$undefined\",\"width\":\"$undefined\",\"height\":\"$undefined\",\"aspectRatio\":\"$undefined\",\"textAlign\":\"$undefined\",\"cursor\":\"$undefined\"},\"children\":[\"$\",\"div\",null,{\"ref\":\"$undefined\",\"className\":\"display-flex position-relative justify-center min-width-0 fill-width \",\"style\":{\"maxWidth\":\"$undefined\",\"minWidth\":\"$undefined\",\"minHeight\":\"var(--static-space-0)\",\"maxHeight\":\"$undefined\",\"width\":\"$undefined\",\"height\":\"$undefined\",\"aspectRatio\":\"$undefined\",\"textAlign\":\"$undefined\",\"cursor\":\"$undefined\"},\"children\":[\"$\",\"$L21\",null,{\"children\":\"$L22\"}]}]}],\"$L23\"]}]}]]}]\n"])</script>
41<script>self.__next_f.push([1,"26:I[778454,[\"/_next/static/chunks/234d212332a9799c.js\",\"/_next/static/chunks/532cfeeb52257029.js\",\"/_next/static/chunks/b1aa469869bea0fe.js\",\"/_next/static/chunks/79d032dd79c3b95c.js\",\"/_next/static/chunks/136acffeffc44697.js\",\"/_next/static/chunks/77c1917bfce7ffb0.js\"],\"Row\"]\n27:I[624379,[\"/_next/static/chunks/234d212332a9799c.js\",\"/_next/static/chunks/532cfeeb52257029.js\",\"/_next/static/chunks/b1aa469869bea0fe.js\",\"/_next/static/chunks/79d032dd79c3b95c.js\",\"/_next/static/chunks/136acffeffc44697.js\",\"/_next/static/chunks/77c1917bfce7ffb0.js\"],\"SmartLink\"]\n28:I[298229,[\"/_next/static/chunks/234d212332a9799c.js\",\"/_next/static/chunks/532cfeeb52257029.js\",\"/_next/static/chunks/b1aa469869bea0fe.js\",\"/_next/static/chunks/79d032dd79c3b95c.js\",\"/_next/static/chunks/136acffeffc44697.js\",\"/_next/static/chunks/77c1917bfce7ffb0.js\"],\"IconButton\"]\n24:T120c,"])</script>
41<script>self.__next_f.push([1,"\n## Why Telegram Bots Are the Ultimate Conversational Interface\n\nTelegram has one of the cleanest and most developer-friendly bot platforms available today. With millions of active users and rich client capabilities, bots on Telegram can handle everything from automated community moderation and customer support to personalized AI assistants and interactive games.\n\nTraditionally, deploying a custom Telegram bot required configuring persistent servers or serverless webhook endpoints, managing SSL certificates, registering webhook URLs through Telegram's HTTP API, and manually handling JSON request parsing.\n\nWith BuildShip, you can build and launch a fully featured, AI-powered Telegram bot in minutes completely visually, without managing servers or writing boilerplate glue code.\n\n\n## Step 1: Create Your Bot with BotFather\n\nEvery Telegram bot begins with **@BotFather**, Telegram's official bot creation tool:\n\n1. Open Telegram and search for `@BotFather` (ensure it has the verified blue badge).\n2. Send the `/newbot` command.\n3. Choose a display name for your bot (e.g., `My Assistant Bot`).\n4. Choose a unique username that ends in `bot` (e.g., `my_assistant_robot`).\n5. BotFather will provide you with an **HTTP API Token** (format: `123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ`). Copy this token and store it securely—this key authenticates all requests to Telegram on behalf of your bot.\n\n## Step 2: Configure the Telegram Bot Trigger in BuildShip\n\nNow that you have your Bot API Token, head over to BuildShip:\n\n1. Create a new workflow or remix the **Telegram Bot Template**.\n2. Select the **Telegram Bot Trigger** as the entry point of your workflow.\n3. Paste your Bot API Token into the trigger configuration.\n4. When you ship or test the workflow, BuildShip automatically calls Telegram's `setWebhook` endpoint behind the scenes, routing all incoming user messages directly to your workflow execution environment.\n\n\u003cMedia\n  src=\"/images/blog/telegram-trigger.jpeg\"\n  alt=\"Telegram Chatbot Workflow in BuildShip\"\n/\u003e\n\nWhenever a user sends a message, your workflow receives an event payload containing:\n- `chatId`: The unique identifier for the user or group conversation.\n- `message`: The raw text of the incoming message.\n- `from`: Metadata about the sender (first name, username, user ID).\n\n## Step 3: Injecting AI Intelligence with OpenAI\n\nA standard chatbot that only responds with rigid regex rules feels robotic. By chaining an **OpenAI GPT** node, your bot gains natural language reasoning:\n\n1. Add the **OpenAI Text Generator** node right after the Telegram trigger.\n2. Connect the incoming message text to the `prompt` input.\n3. Provide a custom `systemPrompt` defining your bot's behavior, tone, and constraints:\n\n```text\nYou are a helpful and concise AI assistant living inside a Telegram bot.\nKeep responses engaging, informative, and formatted with clean Markdown.\n```\n\n\nBecause BuildShip supports dynamic expressions, you can also inject the user's name (`{{trigger.from.first_name}}`) into the prompt for a personalized greeting.\n\n## Step 4: Dispatching Responses Back to Telegram\n\nThe final piece of the pipeline is sending the generated answer back to the user:\n\n\n1. Add the **Send Telegram Message** node to the workflow.\n2. Pass the `chatId` from the trigger into the `chat_id` field.\n3. Pass the generated text output from the OpenAI node into the `text` field.\n4. Set parse mode to `Markdown` or `HTML` if you want rich formatting like bold text, bullet points, or inline links.\n\n\n\u003cMedia\n  src=\"/images/blog/sending-messages.jpeg\"\n  alt=\"Telegram Chatbot Workflow in BuildShip\"\n/\u003e\n\nClick **Ship**, and your bot is immediately live in Telegram! Open your bot's conversation in Telegram, send a message or `/start`, and watch the bot respond in real time.\n\n## Expanding Your Bot: Memory, Tools, and Database Sync\n\nBecause BuildShip is an extensible backend builder, you aren't restricted to basic text replies:\n\n- **Conversational Memory**: Connect a **Firestore** or **Supabase** node to store conversation history by `chatId`, allowing the bot to remember context across multiple messages.\n- **Audio \u0026 Media**: Use Telegram's audio and photo action nodes to accept voice notes from users, transcribe them using **Whisper**, and send back audio responses.\n- **Webhook Integrations**: Trigger backend actions like creating a Linear issue, submitting a form, or notifying your team in Slack based on user commands.\n\n[**Read the original tutorial on Medium →**](https://medium.com/@beebombshell/how-to-create-a-telegram-bot-with-no-code-using-buildship-workflow-builder-2
41024-03207f2b1d68)\n"])</script>
41<script>self.__next_f.push([1,"11:[\"$\",\"$L8\",\"telegram-bot\",{\"post\":{\"metadata\":{\"title\":\"How to Create a Telegram Bot with No Code — using BuildShip (2024)\",\"subtitle\":\"\",\"publishedAt\":\"2024-04-12\",\"summary\":\"A step-by-step guide on building a powerful Telegram bot using BuildShip's workflow builder without any coding.\",\"image\":\"/images/blog/telegram-bot.jpeg\",\"images\":[],\"tag\":\"Automation \u0026 Bots\",\"team\":[],\"link\":\"\",\"canonical\":\"\"},\"slug\":\"telegram-bot\",\"content\":\"$24\"},\"thumbnail\":true,\"direction\":\"column\"}]\n25:T11f2,"])</script>
41<script>self.__next_f.push([1,"\n## The Content Bottleneck: Great Videos, Lost Discoverability\n\nDevelopers, tech educators, and product teams spend countless hours creating informative YouTube tutorials, tech talks, and conference presentations. While video is fantastic for deep visual learning, it has a significant limitation: search engines and developers looking for quick answers primarily consume and index written text.\n\nWhen a developer runs into a cryptic terminal error or wants to learn an API, they search on Google or developer forums. If your insight is buried inside minute 14 of a video, it is practically invisible to search queries.\n\nTranscribing and writing full technical blog posts manually can take 4 to 8 hours per video. In this post, I break down an automated pipeline built on BuildShip that converts YouTube videos into structured, SEO-optimized technical blog posts in seconds.\n\n## The End-to-End Pipeline Architecture\n\nTransforming spoken video dialogue into a readable, high-ranking technical post requires more than just dumping an audio transcript into a basic summarizer. The pipeline consists of five key stages:\n\n1. **Trigger \u0026 Video Ingestion**: A workflow trigger accepts a YouTube video URL or monitors a YouTube channel for newly published videos using the YouTube Trigger node.\n2. **Transcript Extraction**: Using the YouTube Caption Extractor node (or Whisper API for uncaptioned videos), the workflow fetches the raw timestamped subtitles.\n3. **Punctuation \u0026 Noise Reduction**: Raw auto-generated captions often lack punctuation, include filler words (\"um\", \"like\", \"you know\"), and contain spoken artifacts that need cleaning.\n4. **Structured LLM Synthesizer**: An OpenAI node with a specialized system prompt analyzes the cleaned transcript, identifies the core technical concepts, preserves code blocks, and outlines the tutorial.\n5. **SEO \u0026 Markdown Formatting**: The output is structured with clear `H2` and `H3` headings, a concise summary, key takeaways, and keyword-rich metadata ready for publication.\n\n\u003cMedia\n  src=\"/images/blog/seo-workflow.jpeg\"\n  alt=\"AI Pipeline for Generating Technical Blogs from YouTube Videos\"\n/\u003e\n\n## Prompt Engineering for Technical Precision\n\nGeneric summarization prompts tend to flatten code tutorials into vague summaries. For technical blogs, accuracy, code clarity, and structural hierarchy are paramount:\n\n```text\nYou are a senior technical writer and developer advocate.\nConvert the provided YouTube video transcript into an in-depth technical tutorial:\n- Maintain an authoritative, developer-to-developer tone.\n- Extract concrete code snippets, shell commands, and architectural patterns mentioned in the video.\n- Structure the content using semantic H2 and H3 headings.\n- Remove spoken filler, sponsor mentions, and call-to-actions (e.g. \"smash the subscribe button\").\n- Generate meta title, summary, and relevant SEO tags for developer search intent.\n```\n\n\nBy constraining the model to output clean Markdown with explicit code fences, the generated output can be published directly to CMS platforms like **Framer**, **Dev.to**, **Hashnode**, or **Ghost**.\n\n## Optimizing for Technical Search Intent\n\nTo ensure the resulting article ranks well and delivers genuine value to readers, the workflow incorporates specific SEO best practices:\n\n- **Targeted Long-Tail Headings**: Instead of generic headings like \"Next Step\", the model generates descriptive titles matching search queries (e.g., `## Configuring Environment Variables in Docker`).\n- **Skimmable Code Snippets**: Developers skim tutorials for code blocks first. Every command and configuration snippet is formatted with proper language tags.\n- **Fast Executive Summary \u0026 TL;DR**: A brief introductory overview that helps both search engine crawlers and busy engineers understand the core solution immediately.\n- **Structured Meta Description**: Automated generation of a 150-character meta description optimized for Google search snippets.\n\n\u003cMedia\n  src=\"/images/blog/postman.jpeg\"\n  alt=\"SEO Technical Blogs\"\n/\u003e\n\n## Scaling Content Distribution\n\nBy connecting the output of this workflow to automated distribution channels, teams can turn every video into a multi-platform content engine:\n\n- Syncing articles to a **Framer CMS** collection or Headless CMS.\n- Cross-posting draft articles to **Dev.to** and **Hashnode** via their respective APIs.\n- Pushing social media thread drafts to Slack for review.\n\nAutomating the conversion of rich video media into indexable, high-quality technical writing bridges the gap between great content creation and lasting organic discovery.\n\n"])</script>
41<script>self.__next_f.push([1,"12:[\"$\",\"$L8\",\"seo-technical-blogs\",{\"post\":{\"metadata\":{\"title\":\"How to Generate SEO-Friendly Technical Blogs from YouTube Videos\",\"subtitle\":\"\",\"publishedAt\":\"2024-02-10\",\"summary\":\"Automate your content creation by turning YouTube videos into high-quality technical blog posts using AI.\",\"image\":\"/images/blog/seo-technical-blogs.jpeg\",\"images\":[],\"tag\":\"AI \u0026 Content\",\"team\":[],\"link\":\"https://buildship.com/blog/how-to-generate-seo-friendly-technical-blogs-from-youtube-videos\",\"canonical\":\"\"},\"slug\":\"seo-technical-blogs\",\"content\":\"$25\"},\"thumbnail\":true,\"direction\":\"column\"}]\n22:[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"$L5\",null,{\"as\":\"section\",\"fill\":true,\"center\":true,\"paddingBottom\":\"160\",\"children\":[[\"$\",\"span\",null,{\"className\":\"font-display font-strong font-xl mb-s\",\"style\":{\"textAlign\":\"$undefined\",\"textWrap\":\"$undefined\"},\"children\":\"404\"}],[\"$\",\"h1\",null,{\"className\":\"font-display font-default font-xs neutral-on-background-strong mb-l\",\"style\":{\"textAlign\":\"$undefined\",\"textWrap\":\"balance\"},\"children\":\"Page Not Found\"}],[\"$\",\"span\",null,{\"className\":\"neutral-on-background-weak\",\"style\":{\"textAlign\":\"$undefined\",\"textWrap\":\"$undefined\"},\"children\":\"The page you are looking for does not exist.\"}]]}],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]\n"])</script>
41<script>self.__next_f.push([1,"23:[\"$\",\"$L26\",null,{\"as\":\"footer\",\"fillWidth\":true,\"padding\":\"8\",\"horizontal\":\"center\",\"s\":{\"direction\":\"column\"},\"children\":[[\"$\",\"$L26\",null,{\"className\":\"Footer-module-scss-module__DkSkqG__mobile\",\"maxWidth\":\"m\",\"paddingY\":\"8\",\"paddingX\":\"16\",\"gap\":\"16\",\"horizontal\":\"between\",\"vertical\":\"center\",\"s\":{\"direction\":\"column\",\"horizontal\":\"center\",\"align\":\"center\"},\"children\":[[\"$\",\"span\",null,{\"className\":\"font-body font-default font-s neutral-on-background-strong\",\"style\":{\"textAlign\":\"$undefined\",\"textWrap\":\"$undefined\"},\"children\":[[\"$\",\"span\",null,{\"className\":\"neutral-on-background-weak\",\"style\":{\"textAlign\":\"$undefined\",\"textWrap\":\"$undefined\"},\"children\":[\"© \",2026,\" /\"]}],[\"$\",\"span\",null,{\"className\":\"px-4\",\"style\":{\"textAlign\":\"$undefined\",\"textWrap\":\"$undefined\"},\"children\":\"Bhavya Verma\"}],[\"$\",\"span\",null,{\"className\":\"neutral-on-background-weak\",\"style\":{\"textAlign\":\"$undefined\",\"textWrap\":\"$undefined\"},\"children\":[\"/ Built with 💜 using\",\" \",[\"$\",\"$L27\",null,{\"href\":\"https://once-ui.com/products/magic-portfolio\",\"children\":\"Once UI\"}]]}]]}],[\"$\",\"$L26\",null,{\"gap\":\"16\",\"children\":[[\"$\",\"$L28\",\"GitHub\",{\"href\":\"https://github.com/beebombshell\",\"icon\":\"github\",\"tooltip\":\"GitHub\",\"size\":\"s\",\"variant\":\"ghost\"}],[\"$\",\"$L28\",\"LinkedIn\",{\"href\":\"https://www.linkedin.com/in/beebombshell\",\"icon\":\"linkedin\",\"tooltip\":\"LinkedIn\",\"size\":\"s\",\"variant\":\"ghost\"}],[\"$\",\"$L28\",\"X\",{\"href\":\"https://x.com/bee_bombshell\",\"icon\":\"twitter\",\"tooltip\":\"X\",\"size\":\"s\",\"variant\":\"ghost\"}],[\"$\",\"$L28\",\"Email\",{\"href\":\"mailto:[email protected]\",\"icon\":\"email\",\"tooltip\":\"Email\",\"size\":\"s\",\"variant\":\"ghost\"}]]}]]}],[\"$\",\"$L26\",null,{\"height\":\"80\",\"hide\":true,\"s\":{\"hide\":false}}]]}]\n"])</script>
41<script>self.__next_f.push([1,"18:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script>
41<script>self.__next_f.push([1,"29:I[27201,[\"/_next/static/chunks/d96012bcfc98706a.js\",\"/_next/static/chunks/73e3194f06db260e.js\"],\"IconMark\"]\n16:null\n1a:[[\"$\",\"title\",\"0\",{\"children\":\"Writing about design and tech...\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Read what Bhavya Verma has been up to recently\"}],[\"$\",\"meta\",\"2\",{\"property\":\"og:title\",\"content\":\"Writing about design and tech...\"}],[\"$\",\"meta\",\"3\",{\"property\":\"og:description\",\"content\":\"Read what Bhavya Verma has been up to recently\"}],[\"$\",\"meta\",\"4\",{\"property\":\"og:url\",\"content\":\"https://beebombshell.com/blog\"}],[\"$\",\"meta\",\"5\",{\"property\":\"og:image\",\"content\":\"https://beebombshell.com/api/og/generate?title=Writing%20about%20design%20and%20tech...\"}],[\"$\",\"meta\",\"6\",{\"property\":\"og:image:alt\",\"content\":\"Writing about design and tech...\"}],[\"$\",\"meta\",\"7\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"$\",\"meta\",\"8\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"9\",{\"name\":\"twitter:title\",\"content\":\"Writing about design and tech...\"}],[\"$\",\"meta\",\"10\",{\"name\":\"twitter:description\",\"content\":\"Read what Bhavya Verma has been up to recently\"}],[\"$\",\"meta\",\"11\",{\"name\":\"twitter:image\",\"content\":\"https://beebombshell.com/api/og/generate?title=Writing%20about%20design%20and%20tech...\"}],[\"$\",\"link\",\"12\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.d721a1bf.ico\",\"sizes\":\"32x32\",\"type\":\"image/x-icon\"}],[\"$\",\"$L29\",\"13\",{}]]\n"])</script>
41</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.