Help
RSS
API
Feed
Maltego
Contact
Domain > chrisgavin.dev
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2025-09-19
104.21.94.153
(
ClassC
)
2025-10-24
172.67.137.200
(
ClassC
)
Port 80
HTTP/1.1 200 OKDate: Fri, 24 Oct 2025 16:56:51 GMTContent-Type: text/html; charsetutf-8Transfer-Encoding: chunkedConnection: keep-aliveCache-Control: s-maxage31536000ETag: jce2ruiypg1nhzVary: RSC, Next-Router-State-Tree, Next-Router-Prefetch, Next-Router-Segment-Prefetch, accept-encodingx-nextjs-cache: MISSx-nextjs-prerender: 1x-nextjs-stale-time: 300x-opennext: 1x-powered-by: Next.jsReport-To: {group:cf-nel,max_age:604800,endpoints:{url:https://a.nel.cloudflare.com/report/v4?sGGEvgjuP4bGe4P57%2BLDbVWIYIdgLx%2BJc5NkHAM04eSrARHLOW%2B0TTiRQJRkS045Wg7ueUolVVfdywM2I0is1aoxtrFE6z9qlBdJzOA%3D%3D}}Nel: {report_to:cf-nel,success_fraction:0.0,max_age:604800}Server: cloudflareCF-RAY: 993b0284499e5edd-PDXalt-svc: h3:443; ma86400 !DOCTYPE html>html langen class__variable_a4bae9 __variable_9a8899 scroll-pt-15 scroll-smooth bg-primary>head>meta charSetutf-8/>meta nameviewport contentwidthdevice-width, initial-scale1/>link relpreload href/_next/static/media/93f479601ee12b01-s.p.woff2 asfont crossorigin typefont/woff2/>link relpreload href/_next/static/media/9d5a263311222317-s.p.woff2 asfont crossorigin typefont/woff2/>link relpreload asimage imageSrcSet/cdn-cgi/image/width640/_next/static/media/nextjs-on-cloudflare-hero.c4a143b5.png 640w, /cdn-cgi/image/width750/_next/static/media/nextjs-on-cloudflare-hero.c4a143b5.png 750w, /cdn-cgi/image/width828/_next/static/media/nextjs-on-cloudflare-hero.c4a143b5.png 828w, /cdn-cgi/image/width1080/_next/static/media/nextjs-on-cloudflare-hero.c4a143b5.png 1080w, /cdn-cgi/image/width1200/_next/static/media/nextjs-on-cloudflare-hero.c4a143b5.png 1200w, /cdn-cgi/image/width1920/_next/static/media/nextjs-on-cloudflare-hero.c4a143b5.png 1920w, /cdn-cgi/image/width2048/_next/static/media/nextjs-on-cloudflare-hero.c4a143b5.png 2048w, /cdn-cgi/image/width3840/_next/static/media/nextjs-on-cloudflare-hero.c4a143b5.png 3840w imageSizes(max-width: 640px) 100vw, 600px/>link relpreload asimage imageSrcSet/cdn-cgi/image/width640/_next/static/media/blog-building-hero.141dda18.png 640w, /cdn-cgi/image/width750/_next/static/media/blog-building-hero.141dda18.png 750w, /cdn-cgi/image/width828/_next/static/media/blog-building-hero.141dda18.png 828w, /cdn-cgi/image/width1080/_next/static/media/blog-building-hero.141dda18.png 1080w, /cdn-cgi/image/width1200/_next/static/media/blog-building-hero.141dda18.png 1200w, /cdn-cgi/image/width1920/_next/static/media/blog-building-hero.141dda18.png 1920w, /cdn-cgi/image/width2048/_next/static/media/blog-building-hero.141dda18.png 2048w, /cdn-cgi/image/width3840/_next/static/media/blog-building-hero.141dda18.png 3840w imageSizes(max-width: 640px) 100vw, 200px/>link relpreload asimage imageSrcSet/cdn-cgi/image/width640/_next/static/media/intro-hero.31af4825.png 640w, /cdn-cgi/image/width750/_next/static/media/intro-hero.31af4825.png 750w, /cdn-cgi/image/width828/_next/static/media/intro-hero.31af4825.png 828w, /cdn-cgi/image/width1080/_next/static/media/intro-hero.31af4825.png 1080w, /cdn-cgi/image/width1200/_next/static/media/intro-hero.31af4825.png 1200w, /cdn-cgi/image/width1920/_next/static/media/intro-hero.31af4825.png 1920w, /cdn-cgi/image/width2048/_next/static/media/intro-hero.31af4825.png 2048w, /cdn-cgi/image/width3840/_next/static/media/intro-hero.31af4825.png 3840w imageSizes(max-width: 640px) 100vw, 200px/>link relstylesheet href/_next/static/css/11a346bd84c2e1db.css data-precedencenext/>link relstylesheet href/_next/static/css/062c6f53f13267f6.css data-precedencenext/>link relpreload asscript fetchPrioritylow href/_next/static/chunks/webpack-7f3a97f87ff505ad.js/>script src/_next/static/chunks/bcb818fd-979207f372921194.js async>/script>script src/_next/static/chunks/664-03ce7513a1740d46.js async>/script>script src/_next/static/chunks/main-app-762a426da7d16290.js async>/script>script src/_next/static/chunks/2d633d72-a58f155fdb92da19.js async>/script>script src/_next/static/chunks/966-5eda3e28bb8654a7.js async>/script>script src/_next/static/chunks/978-3e912a4dd7964a2a.js async>/script>script src/_next/static/chunks/100-721cf1a2c5848fe9.js async>/script>script src/_next/static/chunks/app/(site)/page-65c794d61a0b675f.js async>/script>script src/_next/static/chunks/34-ded094602038367d.js async>/script>script src/_next/static/chunks/app/(site)/layout-2895354f2751fd96.js async>/script>meta namenext-size-adjust content/>title>Chris Gavin's Blog/title>meta namedescription contentTechnology, personal development and more.../>link relauthor hrefhttps://chrisgavin.dev/>meta nameauthor contentChris Gavin/>meta namekeywords contentblog,technology,personal development,Chris Gavin/>meta propertyog:title contentChris Gavin's Blog/>meta propertyog:description contentTechnology, personal development and more.../>meta propertyog:url contenthttps://chrisgavin.dev/>meta propertyog:image contenthttps://chrisgavin.dev/chris-lego-smiling.png/>meta propertyog:type contentwebsite/>meta nametwitter:card contentsummary_large_image/>meta nametwitter:title contentChris Gavin's Blog/>meta nametwitter:description contentTechnology, personal development and more.../>meta nametwitter:image contenthttps://chrisgavin.dev/chris-lego-smiling.png/>link relicon href/favicon.ico typeimage/x-icon sizes149x147/>script src/_next/static/chunks/polyfills-42372ed130431b0a.js noModule>/script>/head>body classflex flex-col overflow-auto min-h-100dvh>header classsticky top-0 z-50 bg-primary text-primary-foreground border-b-white/10 border-b-1/2>div classflex items-center flex-justify-between py-3 sm:hidden>div classflex-1 flex>img altChris Gavin loadinglazy width400 height400 decodingasync data-nimg1 classrounded-full shrink-0 overflow-hidden aspect-square transition-opacity duration-500 mx-4 size-8 stylecolor:transparent srcSet/cdn-cgi/image/width640/chris-avatar.jpeg 1x, /cdn-cgi/image/width828/chris-avatar.jpeg 2x src/cdn-cgi/image/width828/chris-avatar.jpeg/>a classtext-lg font-semibold mr-4 href/>chrisgavin.dev/a>/div>button data-slotbutton classinline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 &_svg:pointer-events-none &_svg:not(class*'size-'):size-4 shrink-0 &_svg:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-3px aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50 h-9 px-4 py-2 has->svg:px-3 typebutton aria-haspopupdialog aria-expandedfalse aria-controlsradix-«R9nb» data-stateclosed>svg xmlnshttp://www.w3.org/2000/svg width24 height24 viewBox0 0 24 24 fillnone strokecurrentColor stroke-width2 stroke-linecapround stroke-linejoinround classlucide lucide-menu size-6 aria-hiddentrue>path dM4 12h16>/path>path dM4 18h16>/path>path dM4 6h16>/path>/svg>/button>/div>div classbg-primary text-primary-foreground border-b-white/10 border-b-1 hidden sm:block>div classmax-w-7xl mx-auto p-4>div classflex items-center justify-between h-5>img altChris Gavin loadinglazy width400 height400 decodingasync data-nimg1 classrounded-full shrink-0 overflow-hidden aspect-square transition-opacity duration-500 mx-4 size-8 stylecolor:transparent srcSet/cdn-cgi/image/width640/chris-avatar.jpeg 1x, /cdn-cgi/image/width828/chris-avatar.jpeg 2x src/cdn-cgi/image/width828/chris-avatar.jpeg/>a classtext-lg font-semibold mr-4 transition-transform duration-200 ease-in-out hover:scale-110 active:scale-90 href/>chrisgavin.dev/a>div data-orientationvertical rolenone data-slotseparator classshrink-0 data-orientationhorizontal:h-px data-orientationhorizontal:w-full data-orientationvertical:h-full data-orientationvertical:w-px bg-zinc-950/10 dark:bg-white/10>/div>nav classgrow>div classml-10 flex items-baseline space-x-4>div classrelative>div classabsolute inset-0 rounded-md bg-white/10>/div>div classpy-2 tabindex0>a aria-currentpage classrounded-md px-4 text-sm font-medium href/>Home/a>/div>/div>div classrelative>div classpy-2 tabindex0>a classrounded-md px-4 text-sm font-medium href/blog/nextjs-on-cloudflare>Latest/a>/div>/div>div classrelative>div classpy-2 tabindex0>a classrounded-md px-4 text-sm font-medium href/about>About/a>/div>/div>/div>/nav>div classflex items-center>a classmr-6 transition-transform duration-200 ease-in-out hover:scale-140 active:scale-80 target_blank hrefhttps://github.com/christogav>svg width15 height15 viewBox0 0 15 15 fillnone xmlnshttp://www.w3.org/2000/svg>path dM7.49933 0.25C3.49635 0.25 0.25 3.49593 0.25 7.50024C0.25 10.703 2.32715 13.4206 5.2081 14.3797C5.57084 14.446 5.70302 14.2222 5.70302 14.0299C5.70302 13.8576 5.69679 13.4019 5.69323 12.797C3.67661 13.235 3.25112 11.825 3.25112 11.825C2.92132 10.9874 2.44599 10.7644 2.44599 10.7644C1.78773 10.3149 2.49584 10.3238 2.49584 10.3238C3.22353 10.375 3.60629 11.0711 3.60629 11.0711C4.25298 12.1788 5.30335 11.8588 5.71638 11.6732C5.78225 11.205 5.96962 10.8854 6.17658 10.7043C4.56675 10.5209 2.87415 9.89918 2.87415 7.12104C2.87415 6.32925 3.15677 5.68257 3.62053 5.17563C3.54576 4.99226 3.29697 4.25521 3.69174 3.25691C3.69174 3.25691 4.30015 3.06196 5.68522 3.99973C6.26337 3.83906 6.8838 3.75895 7.50022 3.75583C8.1162 3.75895 8.73619 3.83906 9.31523 3.99973C10.6994 3.06196 11.3069 3.25691 11.3069 3.25691C11.7026 4.25521 11.4538 4.99226 11.3795 5.17563C11.8441 5.68257 12.1245 6.32925 12.1245 7.12104C12.1245 9.9063 10.4292 10.5192 8.81452 10.6985C9.07444 10.9224 9.30633 11.3648 9.30633 12.0413C9.30633 13.0102 9.29742 13.7922 9.29742 14.0299C9.29742 14.2239 9.42828 14.4496 9.79591 14.3788C12.6746 13.4179 14.75 10.7025 14.75 7.50024C14.75 3.49593 11.5036 0.25 7.49933 0.25Z fillcurrentColor fill-ruleevenodd clip-ruleevenodd>/path>/svg>/a>a classmr-6 transition-transform duration-200 ease-in-out hover:scale-140 active:scale-80 target_blank hrefhttps://www.linkedin.com/in/chris-gavin-91388b28/>svg width15 height15 viewBox0 0 15 15 fillnone xmlnshttp://www.w3.org/2000/svg>path dM2 1C1.44772 1 1 1.44772 1 2V13C1 13.5523 1.44772 14 2 14H13C13.5523 14 14 13.5523 14 13V2C14 1.44772 13.5523 1 13 1H2ZM3.05 6H4.95V12H3.05V6ZM5.075 4.005C5.075 4.59871 4.59371 5.08 4 5.08C3.4063 5.08 2.925 4.59871 2.925 4.005C2.925 3.41129 3.4063 2.93 4 2.93C4.59371 2.93 5.075 3.41129 5.075 4.005ZM12 8.35713C12 6.55208 10.8334 5.85033 9.67449 5.85033C9.29502 5.83163 8.91721 5.91119 8.57874 6.08107C8.32172 6.21007 8.05265 6.50523 7.84516 7.01853H7.79179V6.00044H6V12.0047H7.90616V8.8112C7.8786 8.48413 7.98327 8.06142 8.19741 7.80987C8.41156 7.55832 8.71789 7.49825 8.95015 7.46774H9.02258C9.62874 7.46774 10.0786 7.84301 10.0786 8.78868V12.0047H11.9847L12 8.35713Z fillcurrentColor fill-ruleevenodd clip-ruleevenodd>/path>/svg>/a>/div>/div>/div>/div>/header>main classflex-1 flex flex-col bg-primary text-primary-foreground>div classcontainer mx-auto px-2 py-2 sm:max-w-7xl sm:flex flex-row-reverse items-center relative overflow-visible>div classhidden sm:block w-1/4 justify-center>img altChris Gavin loadinglazy width120 height120 decodingasync data-nimg1 stylecolor:transparent srcSet/cdn-cgi/image/width128/chris-lego-smiling.png 1x, /cdn-cgi/image/width256/chris-lego-smiling.png 2x src/cdn-cgi/image/width256/chris-lego-smiling.png/>/div>div classw-full sm:w-3/4 px-4 px-auto sm:pl-20 pb-10 sm:pb-0>h1 classtext-3xl sm:text-5xl text-shadow-lg font-bold>Chris Gavin's Dev Blog/h1>p classtext-xs sm:text-base color-muted-foreground>Technology, personal development and more.../p>/div>img altChris Gavin loadinglazy width100 height50 decodingasync data-nimg1 classsm:hidden absolute right-5 bottom--5px overflow-visible stylecolor:transparent srcSet/cdn-cgi/image/width128/chris-lego-peeking.png 1x, /cdn-cgi/image/width256/chris-lego-peeking.png 2x src/cdn-cgi/image/width256/chris-lego-peeking.png/>/div>div classbg-white flex-1>div classcontainer mx-auto px-2 py-8 max-w-7xl columns-1 md:columns-2 md:gap-15 relative>article classflex flex-col text-black items-center relative overflow-visible break-inside-avoid mb-5 preview sm:breakp-after-column>img altBlog Post Image width200 height140 decodingasync data-nimg1 classshadow-md shadow-black/80 mb-4 sm:mb-0 transition-transform duration-200 ease-in-out preview-image rounded-lg w-full object-cover stylecolor:transparent sizes(max-width: 640px) 100vw, 600px srcSet/cdn-cgi/image/width640/_next/static/media/nextjs-on-cloudflare-hero.c4a143b5.png 640w, /cdn-cgi/image/width750/_next/static/media/nextjs-on-cloudflare-hero.c4a143b5.png 750w, /cdn-cgi/image/width828/_next/static/media/nextjs-on-cloudflare-hero.c4a143b5.png 828w, /cdn-cgi/image/width1080/_next/static/media/nextjs-on-cloudflare-hero.c4a143b5.png 1080w, /cdn-cgi/image/width1200/_next/static/media/nextjs-on-cloudflare-hero.c4a143b5.png 1200w, /cdn-cgi/image/width1920/_next/static/media/nextjs-on-cloudflare-hero.c4a143b5.png 1920w, /cdn-cgi/image/width2048/_next/static/media/nextjs-on-cloudflare-hero.c4a143b5.png 2048w, /cdn-cgi/image/width3840/_next/static/media/nextjs-on-cloudflare-hero.c4a143b5.png 3840w src/cdn-cgi/image/width3840/_next/static/media/nextjs-on-cloudflare-hero.c4a143b5.png/>div classflex-1 sm:pt-4>p classtext-sm text-muted-foreground mb-1 z-2>a classmr-2 relative z-2 hover:underline href/tag/hosting>HOSTING/a>a classmr-2 relative z-2 hover:underline href/tag/nextjs>NEXTJS/a>a classmr-2 relative z-2 hover:underline href/tag/cloudflare>CLOUDFLARE/a>/p>a classtext-xl font-bold pb-2 sm:pb-0 hover:underline preview-link href/blog/nextjs-on-cloudflare>Hosting Next.js on Cloudflare/a>p classtext-muted-foreground text-base pb-2 sm:pb-0 sm:text-sm>Hosting Next.js on Cloudflare is cheap, performant and easy to setup. Read on and find out how./p>div classflex items-center text-sm>div classflex-1>p>25 June 2025/p>/div>svg width15 height15 viewBox0 0 15 15 fillnone xmlnshttp://www.w3.org/2000/svg classmr-2>path dM7.49998 0.849976C7.22383 0.849976 6.99998 1.07383 6.99998 1.34998V3.52234C6.99998 3.79848 7.22383 4.02234 7.49998 4.02234C7.77612 4.02234 7.99998 3.79848 7.99998 3.52234V1.8718C10.8862 2.12488 13.15 4.54806 13.15 7.49998C13.15 10.6204 10.6204 13.15 7.49998 13.15C4.37957 13.15 1.84998 10.6204 1.84998 7.49998C1.84998 6.10612 2.35407 4.83128 3.19049 3.8459C3.36919 3.63538 3.34339 3.31985 3.13286 3.14115C2.92234 2.96245 2.60681 2.98825 2.42811 3.19877C1.44405 4.35808 0.849976 5.86029 0.849976 7.49998C0.849976 11.1727 3.82728 14.15 7.49998 14.15C11.1727 14.15 14.15 11.1727 14.15 7.49998C14.15 3.82728 11.1727 0.849976 7.49998 0.849976ZM6.74049 8.08072L4.22363 4.57237C4.15231 4.47295 4.16346 4.33652 4.24998 4.25C4.33649 4.16348 4.47293 4.15233 4.57234 4.22365L8.08069 6.74051C8.56227 7.08599 8.61906 7.78091 8.19998 8.2C7.78089 8.61909 7.08597 8.56229 6.74049 8.08072Z fillcurrentColor fill-ruleevenodd clip-ruleevenodd>/path>/svg>p>6 min read/p>/div>/div>/article>article classflex flex-col text-black items-center relative overflow-visible break-inside-avoid mb-5 preview sm:flex-row>img altBlog Post Image width200 height140 decodingasync data-nimg1 classshadow-md shadow-black/80 mb-4 sm:mb-0 transition-transform duration-200 ease-in-out preview-image rounded-sm w-full h-auto sm:w-250px stylecolor:transparent sizes(max-width: 640px) 100vw, 200px srcSet/cdn-cgi/image/width640/_next/static/media/blog-building-hero.141dda18.png 640w, /cdn-cgi/image/width750/_next/static/media/blog-building-hero.141dda18.png 750w, /cdn-cgi/image/width828/_next/static/media/blog-building-hero.141dda18.png 828w, /cdn-cgi/image/width1080/_next/static/media/blog-building-hero.141dda18.png 1080w, /cdn-cgi/image/width1200/_next/static/media/blog-building-hero.141dda18.png 1200w, /cdn-cgi/image/width1920/_next/static/media/blog-building-hero.141dda18.png 1920w, /cdn-cgi/image/width2048/_next/static/media/blog-building-hero.141dda18.png 2048w, /cdn-cgi/image/width3840/_next/static/media/blog-building-hero.141dda18.png 3840w src/cdn-cgi/image/width3840/_next/static/media/blog-building-hero.141dda18.png/>div classflex-1 sm:pl-4>p classtext-sm text-muted-foreground mb-1 z-2>a classmr-2 relative z-2 hover:underline href/tag/blog>BLOG/a>a classmr-2 relative z-2 hover:underline href/tag/nextjs>NEXTJS/a>a classmr-2 relative z-2 hover:underline href/tag/web>WEB/a>/p>a classtext-xl font-bold pb-2 sm:pb-0 hover:underline preview-link href/blog/blog-building>Building a blog in Next.js/a>p classtext-muted-foreground text-base pb-2 sm:pb-0 sm:text-sm>Journey into building a modern blog with Next.js and MDX. Explore how code, content, and creativity come together to craft a dynamic, developer-friendly publishing platform./p>div classflex items-center text-sm>div classflex-1>p>15 June 2025/p>/div>svg width15 height15 viewBox0 0 15 15 fillnone xmlnshttp://www.w3.org/2000/svg classmr-2>path dM7.49998 0.849976C7.22383 0.849976 6.99998 1.07383 6.99998 1.34998V3.52234C6.99998 3.79848 7.22383 4.02234 7.49998 4.02234C7.77612 4.02234 7.99998 3.79848 7.99998 3.52234V1.8718C10.8862 2.12488 13.15 4.54806 13.15 7.49998C13.15 10.6204 10.6204 13.15 7.49998 13.15C4.37957 13.15 1.84998 10.6204 1.84998 7.49998C1.84998 6.10612 2.35407 4.83128 3.19049 3.8459C3.36919 3.63538 3.34339 3.31985 3.13286 3.14115C2.92234 2.96245 2.60681 2.98825 2.42811 3.19877C1.44405 4.35808 0.849976 5.86029 0.849976 7.49998C0.849976 11.1727 3.82728 14.15 7.49998 14.15C11.1727 14.15 14.15 11.1727 14.15 7.49998C14.15 3.82728 11.1727 0.849976 7.49998 0.849976ZM6.74049 8.08072L4.22363 4.57237C4.15231 4.47295 4.16346 4.33652 4.24998 4.25C4.33649 4.16348 4.47293 4.15233 4.57234 4.22365L8.08069 6.74051C8.56227 7.08599 8.61906 7.78091 8.19998 8.2C7.78089 8.61909 7.08597 8.56229 6.74049 8.08072Z fillcurrentColor fill-ruleevenodd clip-ruleevenodd>/path>/svg>p>8 min read/p>/div>/div>/article>article classflex flex-col text-black items-center relative overflow-visible break-inside-avoid mb-5 preview sm:flex-row>img altBlog Post Image width200 height140 decodingasync data-nimg1 classshadow-md shadow-black/80 mb-4 sm:mb-0 transition-transform duration-200 ease-in-out preview-image rounded-sm w-full h-auto sm:w-250px stylecolor:transparent sizes(max-width: 640px) 100vw, 200px srcSet/cdn-cgi/image/width640/_next/static/media/intro-hero.31af4825.png 640w, /cdn-cgi/image/width750/_next/static/media/intro-hero.31af4825.png 750w, /cdn-cgi/image/width828/_next/static/media/intro-hero.31af4825.png 828w, /cdn-cgi/image/width1080/_next/static/media/intro-hero.31af4825.png 1080w, /cdn-cgi/image/width1200/_next/static/media/intro-hero.31af4825.png 1200w, /cdn-cgi/image/width1920/_next/static/media/intro-hero.31af4825.png 1920w, /cdn-cgi/image/width2048/_next/static/media/intro-hero.31af4825.png 2048w, /cdn-cgi/image/width3840/_next/static/media/intro-hero.31af4825.png 3840w src/cdn-cgi/image/width3840/_next/static/media/intro-hero.31af4825.png/>div classflex-1 sm:pl-4>p classtext-sm text-muted-foreground mb-1 z-2>a classmr-2 relative z-2 hover:underline href/tag/blog>BLOG/a>/p>a classtext-xl font-bold pb-2 sm:pb-0 hover:underline preview-link href/blog/intro>Starting a blog/a>p classtext-muted-foreground text-base pb-2 sm:pb-0 sm:text-sm>Why I started a blog, my thought process in how to approach writing articles and some of the content I will share./p>div classflex items-center text-sm>div classflex-1>p>1 June 2025/p>/div>svg width15 height15 viewBox0 0 15 15 fillnone xmlnshttp://www.w3.org/2000/svg classmr-2>path dM7.49998 0.849976C7.22383 0.849976 6.99998 1.07383 6.99998 1.34998V3.52234C6.99998 3.79848 7.22383 4.02234 7.49998 4.02234C7.77612 4.02234 7.99998 3.79848 7.99998 3.52234V1.8718C10.8862 2.12488 13.15 4.54806 13.15 7.49998C13.15 10.6204 10.6204 13.15 7.49998 13.15C4.37957 13.15 1.84998 10.6204 1.84998 7.49998C1.84998 6.10612 2.35407 4.83128 3.19049 3.8459C3.36919 3.63538 3.34339 3.31985 3.13286 3.14115C2.92234 2.96245 2.60681 2.98825 2.42811 3.19877C1.44405 4.35808 0.849976 5.86029 0.849976 7.49998C0.849976 11.1727 3.82728 14.15 7.49998 14.15C11.1727 14.15 14.15 11.1727 14.15 7.49998C14.15 3.82728 11.1727 0.849976 7.49998 0.849976ZM6.74049 8.08072L4.22363 4.57237C4.15231 4.47295 4.16346 4.33652 4.24998 4.25C4.33649 4.16348 4.47293 4.15233 4.57234 4.22365L8.08069 6.74051C8.56227 7.08599 8.61906 7.78091 8.19998 8.2C7.78089 8.61909 7.08597 8.56229 6.74049 8.08072Z fillcurrentColor fill-ruleevenodd clip-ruleevenodd>/path>/svg>p>4 min read/p>/div>/div>/article>/div>div classcontainer mx-auto px-2 max-w-7xl relative py-10>div data-orientationhorizontal rolenone data-slotseparator classshrink-0 data-orientationhorizontal:h-px data-orientationhorizontal:w-full data-orientationvertical:h-full data-orientationvertical:w-px bg-black>/div>div data-orientationhorizontal rolenone data-slotseparator classshrink-0 data-orientationhorizontal:h-px data-orientationhorizontal:w-full data-orientationvertical:h-full data-orientationvertical:w-px bg-black>/div>div data-orientationhorizontal rolenone data-slotseparator classshrink-0 data-orientationhorizontal:h-px data-orientationhorizontal:w-full data-orientationvertical:h-full data-orientationvertical:w-px bg-black>/div>/div>/div>div classflex-1 flex flex-col content-center items-center pt-5 sm:pb-5 bg-stone-600/40>h1 classtext-3xl font-bold pb-10>Find out more/h1>div classcontainer mx-auto px-2 max-w-7xl relative flex flex-col lg:flex-row gap-5 items-stretch>div classflex-1>/div>div data-slotcard classtext-card-foreground flex flex-col gap-6 rounded-xl py-6 flex-1 my-5 shadow-md shadow-black/80 bg-neutral-300 border-black border-2>div data-slotcard-header class@container/card-header grid auto-rows-min grid-rows-auto_auto items-start gap-1.5 px-6 has-data-slotcard-action:grid-cols-1fr_auto .border-b:pb-6>div classflex flex-row items-center>div data-slotcard-title classleading-none font-semibold flex-1>Github Repositories/div>svg width15 height15 viewBox0 0 15 15 fillnone xmlnshttp://www.w3.org/2000/svg classsize-5>path dM7.49933 0.25C3.49635 0.25 0.25 3.49593 0.25 7.50024C0.25 10.703 2.32715 13.4206 5.2081 14.3797C5.57084 14.446 5.70302 14.2222 5.70302 14.0299C5.70302 13.8576 5.69679 13.4019 5.69323 12.797C3.67661 13.235 3.25112 11.825 3.25112 11.825C2.92132 10.9874 2.44599 10.7644 2.44599 10.7644C1.78773 10.3149 2.49584 10.3238 2.49584 10.3238C3.22353 10.375 3.60629 11.0711 3.60629 11.0711C4.25298 12.1788 5.30335 11.8588 5.71638 11.6732C5.78225 11.205 5.96962 10.8854 6.17658 10.7043C4.56675 10.5209 2.87415 9.89918 2.87415 7.12104C2.87415 6.32925 3.15677 5.68257 3.62053 5.17563C3.54576 4.99226 3.29697 4.25521 3.69174 3.25691C3.69174 3.25691 4.30015 3.06196 5.68522 3.99973C6.26337 3.83906 6.8838 3.75895 7.50022 3.75583C8.1162 3.75895 8.73619 3.83906 9.31523 3.99973C10.6994 3.06196 11.3069 3.25691 11.3069 3.25691C11.7026 4.25521 11.4538 4.99226 11.3795 5.17563C11.8441 5.68257 12.1245 6.32925 12.1245 7.12104C12.1245 9.9063 10.4292 10.5192 8.81452 10.6985C9.07444 10.9224 9.30633 11.3648 9.30633 12.0413C9.30633 13.0102 9.29742 13.7922 9.29742 14.0299C9.29742 14.2239 9.42828 14.4496 9.79591 14.3788C12.6746 13.4179 14.75 10.7025 14.75 7.50024C14.75 3.49593 11.5036 0.25 7.49933 0.25Z fillcurrentColor fill-ruleevenodd clip-ruleevenodd>/path>/svg>/div>/div>div data-slotcard-content classpx-6 flex-1 text-stone-500>p class>Explore Chris's projects and contributions on Github./p>/div>div data-slotcard-footer classflex items-center px-6 .border-t:pt-6>a target_blank classhover:underline flex flex-row items-center text-blue-600 font-semibold hrefhttps://github.com/christogav>Learn moresvg width15 height15 viewBox0 0 15 15 fillnone xmlnshttp://www.w3.org/2000/svg classml-2>path dM3 2C2.44772 2 2 2.44772 2 3V12C2 12.5523 2.44772 13 3 13H12C12.5523 13 13 12.5523 13 12V8.5C13 8.22386 12.7761 8 12.5 8C12.2239 8 12 8.22386 12 8.5V12H3V3L6.5 3C6.77614 3 7 2.77614 7 2.5C7 2.22386 6.77614 2 6.5 2H3ZM12.8536 2.14645C12.9015 2.19439 12.9377 2.24964 12.9621 2.30861C12.9861 2.36669 12.9996 2.4303 13 2.497L13 2.5V2.50049V5.5C13 5.77614 12.7761 6 12.5 6C12.2239 6 12 5.77614 12 5.5V3.70711L6.85355 8.85355C6.65829 9.04882 6.34171 9.04882 6.14645 8.85355C5.95118 8.65829 5.95118 8.34171 6.14645 8.14645L11.2929 3H9.5C9.22386 3 9 2.77614 9 2.5C9 2.22386 9.22386 2 9.5 2H12.4999H12.5C12.5678 2 12.6324 2.01349 12.6914 2.03794C12.7504 2.06234 12.8056 2.09851 12.8536 2.14645Z fillcurrentColor fill-ruleevenodd clip-ruleevenodd>/path>/svg>/a>/div>/div>img altChris Gavin loadinglazy width150 height150 decodingasync data-nimg1 classsize-2/3 sm:size-1/5 mx-auto aspect-auto self-center stylecolor:transparent srcSet/cdn-cgi/image/width256/chris-lego-desk.png 1x, /cdn-cgi/image/width384/chris-lego-desk.png 2x src/cdn-cgi/image/width384/chris-lego-desk.png/>div data-slotcard classtext-card-foreground flex flex-col gap-6 rounded-xl py-6 flex-1 my-5 shadow-md shadow-black/80 bg-neutral-300 border-black border-2>div data-slotcard-header class@container/card-header grid auto-rows-min grid-rows-auto_auto items-start gap-1.5 px-6 has-data-slotcard-action:grid-cols-1fr_auto .border-b:pb-6>div classflex flex-row items-center>div data-slotcard-title classleading-none font-semibold flex-1>Professional/div>svg width15 height15 viewBox0 0 15 15 fillnone xmlnshttp://www.w3.org/2000/svg classsize-5>path dM2 1C1.44772 1 1 1.44772 1 2V13C1 13.5523 1.44772 14 2 14H13C13.5523 14 14 13.5523 14 13V2C14 1.44772 13.5523 1 13 1H2ZM3.05 6H4.95V12H3.05V6ZM5.075 4.005C5.075 4.59871 4.59371 5.08 4 5.08C3.4063 5.08 2.925 4.59871 2.925 4.005C2.925 3.41129 3.4063 2.93 4 2.93C4.59371 2.93 5.075 3.41129 5.075 4.005ZM12 8.35713C12 6.55208 10.8334 5.85033 9.67449 5.85033C9.29502 5.83163 8.91721 5.91119 8.57874 6.08107C8.32172 6.21007 8.05265 6.50523 7.84516 7.01853H7.79179V6.00044H6V12.0047H7.90616V8.8112C7.8786 8.48413 7.98327 8.06142 8.19741 7.80987C8.41156 7.55832 8.71789 7.49825 8.95015 7.46774H9.02258C9.62874 7.46774 10.0786 7.84301 10.0786 8.78868V12.0047H11.9847L12 8.35713Z fillcurrentColor fill-ruleevenodd clip-ruleevenodd>/path>/svg>/div>/div>div data-slotcard-content classpx-6 flex-1 text-stone-500>p>My professional career, where I've worked and a bit about what I did there./p>/div>div data-slotcard-footer classflex items-center px-6 .border-t:pt-6>a target_blank classhover:underline flex flex-row items-center text-blue-600 font-semibold hrefhttps://www.linkedin.com/in/chrisgavin/>Learn moresvg width15 height15 viewBox0 0 15 15 fillnone xmlnshttp://www.w3.org/2000/svg classml-2>path dM3 2C2.44772 2 2 2.44772 2 3V12C2 12.5523 2.44772 13 3 13H12C12.5523 13 13 12.5523 13 12V8.5C13 8.22386 12.7761 8 12.5 8C12.2239 8 12 8.22386 12 8.5V12H3V3L6.5 3C6.77614 3 7 2.77614 7 2.5C7 2.22386 6.77614 2 6.5 2H3ZM12.8536 2.14645C12.9015 2.19439 12.9377 2.24964 12.9621 2.30861C12.9861 2.36669 12.9996 2.4303 13 2.497L13 2.5V2.50049V5.5C13 5.77614 12.7761 6 12.5 6C12.2239 6 12 5.77614 12 5.5V3.70711L6.85355 8.85355C6.65829 9.04882 6.34171 9.04882 6.14645 8.85355C5.95118 8.65829 5.95118 8.34171 6.14645 8.14645L11.2929 3H9.5C9.22386 3 9 2.77614 9 2.5C9 2.22386 9.22386 2 9.5 2H12.4999H12.5C12.5678 2 12.6324 2.01349 12.6914 2.03794C12.7504 2.06234 12.8056 2.09851 12.8536 2.14645Z fillcurrentColor fill-ruleevenodd clip-ruleevenodd>/path>/svg>/a>/div>/div>div classflex-1>/div>/div>/div>div classbg-white flex-1>div classcontainer mx-auto px-2 max-w-7xl relative pt-10>div data-orientationhorizontal rolenone data-slotseparator classshrink-0 data-orientationhorizontal:h-px data-orientationhorizontal:w-full data-orientationvertical:h-full data-orientationvertical:w-px bg-black>/div>div data-orientationhorizontal rolenone data-slotseparator classshrink-0 data-orientationhorizontal:h-px data-orientationhorizontal:w-full data-orientationvertical:h-full data-orientationvertical:w-px bg-black>/div>div data-orientationhorizontal rolenone data-slotseparator classshrink-0 data-orientationhorizontal:h-px data-orientationhorizontal:w-full data-orientationvertical:h-full data-orientationvertical:w-px bg-black>/div>div classpt-5 flex flex-row content-center items-center text-foreground>h1 classfont-bold text-2xl mr-5>Older posts/h1>p>Filter by: /p>button data-slotdropdown-menu-trigger classinline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 &_svg:pointer-events-none &_svg:not(class*'size-'):size-4 shrink-0 &_svg:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-3px aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive underline-offset-4 hover:underline h-9 px-4 py-2 has->svg:px-3 text-foreground typebutton idradix-«R731qnb» aria-haspopupmenu aria-expandedfalse data-stateclosed>All/button>/div>/div>div classcontainer mx-auto px-2 py-8 max-w-7xl columns-1 md:columns-2 md:gap-15 pb-20 relative>/div>/div>/main>footer classbg-primary text-primary-foreground p-4 border-b-zinc-950/10 border-b-1 flex sm:px-10 py-4 relative>div classcontainer mx-auto px-2 max-w-7xl text-gray columns sm:flex>img altChris Gavin loadinglazy width100 height50 decodingasync data-nimg1 classabsolute -top-64px overflow-visible stylecolor:transparent srcSet/cdn-cgi/image/width128/chris-lego-peeking.png 1x, /cdn-cgi/image/width256/chris-lego-peeking.png 2x src/cdn-cgi/image/width256/chris-lego-peeking.png/>p classmr-3>© 2025-present Chris Gavin. All Rights Reserved./p>div classgrow>/div>div classflex items-center pt-5 sm:pt-0>a classmr-6 transition-transform duration-200 ease-in-out hover:scale-140 active:scale-80 target_blank hrefhttps://github.com/christogav>svg width15 height15 viewBox0 0 15 15 fillnone xmlnshttp://www.w3.org/2000/svg>path dM7.49933 0.25C3.49635 0.25 0.25 3.49593 0.25 7.50024C0.25 10.703 2.32715 13.4206 5.2081 14.3797C5.57084 14.446 5.70302 14.2222 5.70302 14.0299C5.70302 13.8576 5.69679 13.4019 5.69323 12.797C3.67661 13.235 3.25112 11.825 3.25112 11.825C2.92132 10.9874 2.44599 10.7644 2.44599 10.7644C1.78773 10.3149 2.49584 10.3238 2.49584 10.3238C3.22353 10.375 3.60629 11.0711 3.60629 11.0711C4.25298 12.1788 5.30335 11.8588 5.71638 11.6732C5.78225 11.205 5.96962 10.8854 6.17658 10.7043C4.56675 10.5209 2.87415 9.89918 2.87415 7.12104C2.87415 6.32925 3.15677 5.68257 3.62053 5.17563C3.54576 4.99226 3.29697 4.25521 3.69174 3.25691C3.69174 3.25691 4.30015 3.06196 5.68522 3.99973C6.26337 3.83906 6.8838 3.75895 7.50022 3.75583C8.1162 3.75895 8.73619 3.83906 9.31523 3.99973C10.6994 3.06196 11.3069 3.25691 11.3069 3.25691C11.7026 4.25521 11.4538 4.99226 11.3795 5.17563C11.8441 5.68257 12.1245 6.32925 12.1245 7.12104C12.1245 9.9063 10.4292 10.5192 8.81452 10.6985C9.07444 10.9224 9.30633 11.3648 9.30633 12.0413C9.30633 13.0102 9.29742 13.7922 9.29742 14.0299C9.29742 14.2239 9.42828 14.4496 9.79591 14.3788C12.6746 13.4179 14.75 10.7025 14.75 7.50024C14.75 3.49593 11.5036 0.25 7.49933 0.25Z fillcurrentColor fill-ruleevenodd clip-ruleevenodd>/path>/svg>/a>a classmr-6 transition-transform duration-200 ease-in-out hover:scale-140 active:scale-80 target_blank hrefhttps://www.linkedin.com/in/chris-gavin-91388b28/>svg width15 height15 viewBox0 0 15 15 fillnone xmlnshttp://www.w3.org/2000/svg>path dM2 1C1.44772 1 1 1.44772 1 2V13C1 13.5523 1.44772 14 2 14H13C13.5523 14 14 13.5523 14 13V2C14 1.44772 13.5523 1 13 1H2ZM3.05 6H4.95V12H3.05V6ZM5.075 4.005C5.075 4.59871 4.59371 5.08 4 5.08C3.4063 5.08 2.925 4.59871 2.925 4.005C2.925 3.41129 3.4063 2.93 4 2.93C4.59371 2.93 5.075 3.41129 5.075 4.005ZM12 8.35713C12 6.55208 10.8334 5.85033 9.67449 5.85033C9.29502 5.83163 8.91721 5.91119 8.57874 6.08107C8.32172 6.21007 8.05265 6.50523 7.84516 7.01853H7.79179V6.00044H6V12.0047H7.90616V8.8112C7.8786 8.48413 7.98327 8.06142 8.19741 7.80987C8.41156 7.55832 8.71789 7.49825 8.95015 7.46774H9.02258C9.62874 7.46774 10.0786 7.84301 10.0786 8.78868V12.0047H11.9847L12 8.35713Z fillcurrentColor fill-ruleevenodd clip-ruleevenodd>/path>/svg>/a>/div>/div>/footer>script defer srchttps://static.cloudflareinsights.com/beacon.min.js data-cf-beacon{"token": "bf2226f90625430bac1db865565948c3"}>/script>script src/_next/static/chunks/webpack-7f3a97f87ff505ad.js async>/script>script>(self.__next_fself.__next_f||).push(0)/script>script>self.__next_f.push(1,1:\$Sreact.fragment\\n2:I2979,,\\\n3:I5391,,\\\n6:I625,,\OutletBoundary\\n9:I625,,\ViewportBoundary\\nb:I625,,\MetadataBoundary\\nd:I3238,,\\\n:HL\/_next/static/media/93f479601ee12b01-s.p.woff2\,\font\,{\crossOrigin\:\\,\type\:\font/woff2\}\n:HL\/_next/static/media/9d5a263311222317-s.p.woff2\,\font\,{\crossOrigin\:\\,\type\:\font/woff2\}\n:HL\/_next/static/css/11a346bd84c2e1db.css\,\style\\n:HL\/_next/static/css/062c6f53f13267f6.css\,\style\\n)/script>script>self.__next_f.push(1,0:{\P\:null,\b\:\SH5S6wgEvYUW5EOu7SSPJ\,\p\:\\,\c\:\\,\\,\i\:false,\f\:\\,{\children\:\(site)\,{\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\:\(site)\,\$\,\$1\,\c\,{\children\:\$\,\link\,\0\,{\rel\:\stylesheet\,\href\:\/_next/static/css/11a346bd84c2e1db.css\,\precedence\:\next\,\crossOrigin\:\$undefined\,\nonce\:\$undefined\},\$\,\link\,\1\,{\rel\:\stylesheet\,\href\:\/_next/static/css/062c6f53f13267f6.css\,\precedence\:\next\,\crossOrigin\:\$undefined\,\nonce\:\$undefined\},\$L4\},{\children\:\__PAGE__\,\$\,\$1\,\c\,{\children\:\$L5\,\$undefined\,null,\$\,\$L6\,null,{\children\:\$L7\,\$L8\,null}},{},null,false},null,false},null,false,\$\,\$1\,\h\,{\children\:null,\$\,\$1\,\Q5yBWTlM_WzLfYrK3jjy0\,{\children\:\$\,\$L9\,null,{\children\:\$La\},\$\,\meta\,null,{\name\:\next-size-adjust\,\content\:\\}},\$\,\$Lb\,null,{\children\:\$Lc\}},false,\m\:\$undefined\,\G\:\$d\,\$undefined\,\s\:false,\S\:true}\n4:\$\,\html\,null,{\lang\:\en\,\className\:\__variable_a4bae9 __variable_9a8899 scroll-pt-15 scroll-smooth bg-primary\,\children\:\$\,\body\,null,{\className\:\flex flex-col overflow-auto min-h-100dvh\,\children\:\$Le\,\$\,\main\,null,{\className\:\flex-1 flex flex-col bg-primary text-primary-foreground\,\children\:\$\,\$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\:\$0:f:0:1:1:props:children:1:props:notFound:0:1:props:style\,\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\:\$0:f:0:1:1:props:children:1:props:notFound:0:1:props:children:props:children:1:props:style\,\children\:404},\$\,\div\,null,{\style\:\$0:f:0:1:1:props:children:1:props:notFound:0:1:props:children:props:children:2:props:style\,\children\:\$\,\h2\,null,{\style\:\$0:f:0:1:1:props:children:1:props:notFound:0:1:props:children:props:children:2:props:children:props:style\,\children\:\This page could not be found.\}}}},,\forbidden\:\$undefined\,\unauthorized\:\$undefined\}},\$Lf\,\$\,\script\,null,{\defer\:true,\src\:\https://static.cloudflareinsights.com/beacon.min.js\,\data-cf-beacon\:\{\\\token\\\: \\\bf2226f906)/script>script>self.__next_f.push(1,25430bac1db865565948c3\\\}\}}}\n)/script>script>self.__next_f.push(1,10:I4583,\78\,\static/chunks/2d633d72-a58f155fdb92da19.js\,\966\,\static/chunks/966-5eda3e28bb8654a7.js\,\978\,\static/chunks/978-3e912a4dd7964a2a.js\,\100\,\static/chunks/100-721cf1a2c5848fe9.js\,\13\,\static/chunks/app/(site)/page-65c794d61a0b675f.js\,\Image\\n11:I4970,\78\,\static/chunks/2d633d72-a58f155fdb92da19.js\,\966\,\static/chunks/966-5eda3e28bb8654a7.js\,\978\,\static/chunks/978-3e912a4dd7964a2a.js\,\100\,\static/chunks/100-721cf1a2c5848fe9.js\,\13\,\static/chunks/app/(site)/page-65c794d61a0b675f.js\,\\\n12:T49a,M7.49933 0.25C3.49635 0.25 0.25 3.49593 0.25 7.50024C0.25 10.703 2.32715 13.4206 5.2081 14.3797C5.57084 14.446 5.70302 14.2222 5.70302 14.0299C5.70302 13.8576 5.69679 13.4019 5.69323 12.797C3.67661 13.235 3.25112 11.825 3.25112 11.825C2.92132 10.9874 2.44599 10.7644 2.44599 10.7644C1.78773 10.3149 2.49584 10.3238 2.49584 10.3238C3.22353 10.375 3.60629 11.0711 3.60629 11.0711C4.25298 12.1788 5.30335 11.8588 5.71638 11.6732C5.78225 11.205 5.96962 10.8854 6.17658 10.7043C4.56675 10.5209 2.87415 9.89918 2.87415 7.12104C2.87415 6.32925 3.15677 5.68257 3.62053 5.17563C3.54576 4.99226 3.29697 4.25521 3.69174 3.25691C3.69174 3.25691 4.30015 3.06196 5.68522 3.99973C6.26337 3.83906 6.8838 3.75895 7.50022 3.75583C8.1162 3.75895 8.73619 3.83906 9.31523 3.99973C10.6994 3.06196 11.3069 3.25691 11.3069 3.25691C11.7026 4.25521 11.4538 4.99226 11.3795 5.17563C11.8441 5.68257 12.1245 6.32925 12.1245 7.12104C12.1245 9.9063 10.4292 10.5192 8.81452 10.6985C9.07444 10.9224 9.30633 11.3648 9.30633 12.0413C9.30633 13.0102 9.29742 13.7922 9.29742 14.0299C9.29742 14.2239 9.42828 14.4496 9.79591 14.3788C12.6746 13.4179 14.75 10.7025 14.75 7.50024C14.75 3.49593 11.5036 0.25 7.49933 0.25Zf:\$\,\footer\,null,{\className\:\bg-primary text-primary-foreground p-4 border-b-zinc-950/10 border-b-1 flex sm:px-10 py-4 relative\,\children\:\$\,\div\,null,{\className\:\container mx-auto px-2 max-w-7xl text-gray columns sm:flex\,\children\:\$\,\$L10\,null,{\src\:\/chris-lego-peeking.png\,\alt\:\Chris Gavin\,\width\:100,\height\:50,\className\:\absolute -top-64px overflow-visible\},\$\,\p\,null,{\className\:\mr-3\,\children\:\© 2025-present Chris Gavin. All Rights Reserved.\},\$\,\div\,null,{\className\:\grow\},\$\,\div\,null,{\className\:\flex items-center pt-5 sm:pt-0\,\children\:false,\$\,\$L11\,null,{\href\:\https://github.com/christogav\,\className\:\mr-6 transition-transform duration-200 ease-in-out hover:scale-140 active:scale-80\,\target\:\_blank\,\children\:\$\,\svg\,null,{\width\:\15\,\height\:\15\,\viewBox\:\0 0 15 15\,\fill\:\none\,\xmlns\:\http://www.w3.org/2000/svg\,\ref\:\$undefined\,\children\:\$\,\path\,null,{\d\:\$12\,\fill\:\currentColor\,\fillRule\:\evenodd\,\clipRule\:\evenodd\}}},\$\,\$L11\,null,{\href\:\https://www.linkedin.com/in/chris-gavin-91388b28/\,\className\:\mr-6 transition-transform duration-200 ease-in-out hover:scale-140 active:scale-80\,\target\:\_blank\,\children\:\$\,\svg\,null,{\width\:\15\,\height\:\15\,\viewBox\:\0 0 15 15\,\fill\:\none\,\xmlns\:\http://www.w3.org/2000/svg\,\ref\:\$undefined\,\children\:\$\,\path\,null,{\d\:\M2 1C1.44772 1 1 1.44772 1 2V13C1 13.5523 1.44772 14 2 14H13C13.5523 14 14 13.5523 14 13V2C14 1.44772 13.5523 1 13 1H2ZM3.05 6H4.95V12H3.05V6ZM5.075 4.005C5.075 4.59871 4.59371 5.08 4 5.08C3.4063 5.08 2.925 4.59871 2.925 4.005C2.925 3.41129 3.4063 2.93 4 2.93C4.59371 2.93 5.075 3.41129 5.075 4.005ZM12 8.35713C12 6.55208 10.8334 5.85033 9.67449 5.85033C9.29502 5.83163 8.91721 5.91119 8.57874 6.08107C8.32172 6.21007 8.05265 6.50523 7.84516 7.01853H7.79179V6.00044H6V12.0047H7.90616V8.8112C7.8786 8.48413 7.98327 8.06142 8.19741 7.80987C8.41156 7.55832 8.71789 7.49825 8.95015 7.46774H9.02258C9.62874 7.46774 10.0786 7.84301 10.0786 8.78868V12.0047H11.9847L12 8.35713Z\,\fill\:\currentColor\,\fillRule\:\evenodd\,\clipRule\:\evenodd\}}}}}}\n)/script>script>self.__next_f.push(1,13:I296,\78\,\static/chunks/2d633d72-a58f155fdb92da19.js\,\966\,\static/chunks/966-5eda3e28bb8654a7.js\,\978\,\static/chunks/978-3e912a4dd7964a2a.js\,\100\,\static/chunks/100-721cf1a2c5848fe9.js\,\13\,\static/chunks/app/(site)/page-65c794d61a0b675f.js\,\HomeHighlightPosts\\n14:I6430,\78\,\static/chunks/2d633d72-a58f155fdb92da19.js\,\966\,\static/chunks/966-5eda3e28bb8654a7.js\,\978\,\static/chunks/978-3e912a4dd7964a2a.js\,\100\,\static/chunks/100-721cf1a2c5848fe9.js\,\13\,\static/chunks/app/(site)/page-65c794d61a0b675f.js\,\Separator\\n16:I931,\78\,\static/chunks/2d633d72-a58f155fdb92da19.js\,\966\,\static/chunks/966-5eda3e28bb8654a7.js\,\978\,\static/chunks/978-3e912a4dd7964a2a.js\,\100\,\static/chunks/100-721cf1a2c5848fe9.js\,\13\,\static/chunks/app/(site)/page-65c794d61a0b675f.js\,\HomeOldPosts\\n15:T49a,M7.49933 0.25C3.49635 0.25 0.25 3.49593 0.25 7.50024C0.25 10.703 2.32715 13.4206 5.2081 14.3797C5.57084 14.446 5.70302 14.2222 5.70302 14.0299C5.70302 13.8576 5.69679 13.4019 5.69323 12.797C3.67661 13.235 3.25112 11.825 3.25112 11.825C2.92132 10.9874 2.44599 10.7644 2.44599 10.7644C1.78773 10.3149 2.49584 10.3238 2.49584 10.3238C3.22353 10.375 3.60629 11.0711 3.60629 11.0711C4.25298 12.1788 5.30335 11.8588 5.71638 11.6732C5.78225 11.205 5.96962 10.8854 6.17658 10.7043C4.56675 10.5209 2.87415 9.89918 2.87415 7.12104C2.87415 6.32925 3.15677 5.68257 3.62053 5.17563C3.54576 4.99226 3.29697 4.25521 3.69174 3.25691C3.69174 3.25691 4.30015 3.06196 5.68522 3.99973C6.26337 3.83906 6.8838 3.75895 7.50022 3.75583C8.1162 3.75895 8.73619 3.83906 9.31523 3.99973C10.6994 3.06196 11.3069 3.25691 11.3069 3.25691C11.7026 4.25521 11.4538 4.99226 11.3795 5.17563C11.8441 5.68257 12.1245 6.32925 12.1245 7.12104C12.1245 9.9063 10.4292 10.5192 8.81452 10.6985C9.07444 10.9224 9.30633 11.3648 9.30633 12.0413C9.30633 13.0102 9.29742 13.7922 9.29742 14.0299C9.29742 14.2239 9.42828 14.4496 9.79591 14.3788C12.6746 13.4179 14.75 10.7025 14.75 7.50024C14.75 3.49593 11.5036 0.25 7.49933 0.25Z)/script>script>self.__next_f.push(1,5:\$\,\div\,null,{\className\:\container mx-auto px-2 py-2 sm:max-w-7xl sm:flex flex-row-reverse items-center relative overflow-visible\,\children\:\$\,\div\,null,{\className\:\hidden sm:block w-1/4 justify-center\,\children\:\$\,\$L10\,null,{\src\:\/chris-lego-smiling.png\,\alt\:\Chris Gavin\,\width\:120,\height\:120}},\$\,\div\,null,{\className\:\w-full sm:w-3/4 px-4 px-auto sm:pl-20 pb-10 sm:pb-0\,\children\:\$\,\h1\,null,{\className\:\text-3xl sm:text-5xl text-shadow-lg font-bold\,\children\:\Chris Gavins Dev Blog\},\$\,\p\,null,{\className\:\text-xs sm:text-base color-muted-foreground\,\children\:\Technology, personal development and more...\}},\$\,\$L10\,null,{\src\:\/chris-lego-peeking.png\,\alt\:\Chris Gavin\,\width\:100,\height\:50,\className\:\sm:hidden absolute right-5 bottom--5px overflow-visible\}},\$\,\div\,null,{\className\:\bg-white flex-1\,\children\:\$\,\$L13\,null,{\posts\:{\slug\:\mdx-in-nextjs\,\metadata\:{\title\:\MDX to render markdown in Next.js\,\description\:\A practical, production-ready guide to rendering Markdown with MDX in Next.js.\,\image\:\/blog-building-hero.png\,\date\:\2025-07-15\,\tags\:\blog\,\nextjs\,\mdx\,\draft\:true,\readingTime\:{\text\:\3 min read\,\minutes\:2.695,\time\:161700,\words\:539},\headings\:{\depth\:2,\value\:\Why MDX for a Next.js blog/docs site?\,\slug\:\why-mdx-for-a-nextjs-blogdocs-site\,\children\:},{\depth\:2,\value\:\The three common approaches (pick one)\,\slug\:\the-three-common-approaches-pick-one\,\children\:},{\depth\:2,\value\:\Directory shape\,\slug\:\directory-shape\,\children\:},{\depth\:2,\value\:\Step 1 — Install the pieces\,\slug\:\step-1--install-the-pieces\,\children\:},{\depth\:2,\value\:\Step 2 — Wire up @next/mdx in next.config.mjs\,\slug\:\step-2--wire-up-nextmdx-in-nextconfigmjs\,\children\:},{\depth\:2,\value\:\Step 3 — Author an MDX post with frontmatter\,\slug\:\step-3--author-an-mdx-post-with-frontmatter\,\children\:},{\depth\:2,\value\:\Step 4 — Server‑only MDX components mapping\,\slug\:\step-4--serveronly-mdx-components-mapping\,\children\:},\headingRefs\:\why-mdx-for-a-nextjs-blogdocs-site\,\the-three-common-approaches-pick-one\,\directory-shape\,\step-1--install-the-pieces\,\step-2--wire-up-nextmdx-in-nextconfigmjs\,\step-3--author-an-mdx-post-with-frontmatter\,\step-4--serveronly-mdx-components-mapping\},\hero\:{\src\:\/_next/static/media/blog-building-hero.141dda18.png\,\height\:1024,\width\:1536,\blurDataURL\:\data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAMAAABPT11nAAAARVBMVEUFGkExEkM+HSgzOWYPESYrFC8DCiIGHE0OJGYbEi8EGjhCT3xMN0gDLolpf5EWKW5jYI4gHDmPmMszJ0OGiqMUPJ7+///ttqsPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAMUlEQVR4nAXBBwLAIAgAsXMCQod2/P+pJgiUu9SOjn7+b2scgi+3xKeXqOUEz7SIXDcdIAFa5CdxIAAAAABJRU5ErkJggg\,\blurWidth\:8,\blurHeight\:5}},{\slug\:\temporal-data-management\,\metadata\:{\title\:\Managing State in Temporal\,\description\:\Temporal is a powerful tool for managing state in distributed systems. This post explores how to effectively use Temporal to handle complex workflows and state management challenges.\,\image\:\/temporal-data-management-hero.png\,\date\:\2025-07-10\,\tags\:\temporal\,\state management\,\workflows\,\draft\:true,\readingTime\:{\text\:\0 min read\,\minutes\:0,\time\:0,\words\:0},\headings\:,\headingRefs\:},\hero\:{\src\:\/_next/static/media/temporal-data-management-hero.a8bf83c8.png\,\height\:1024,\width\:1536,\blurDataURL\:\data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAMAAABPT11nAAAAPFBMVEUWEXJJR9keOakuLsQwKqopLLdnYuwXEWQYHXwbHpI3MawbHp5SYe4uX9gtRdMsH5UYGohKM8RGKJ5tNq2FiaI5AAAACXBIWXMAAAsTAAALEwEAmpwYAAAALklEQVR4nAXBhwHAIAzAMBMyu1j//1qJBNhnkVWXWutIN3eTyfvdqpXB0wZExA8YUQEUEXvDzgAAAABJRU5ErkJggg\,\blurWidth\:8,\blurHeight\:5}},{\slug\:\beam-spanner-changestreams\,\metadata\:{\title\:\Apache Beam, Spanner Change Streams in Go\,\description\:\Apache Beam is a solid ETL framework however the Go SDK needs some work. I decided to implement Google Spanner ChangeStream in the Go SDK.\,\image\:\/blog-building-hero.png\,\date\:\2025-07-05\)/script>script>self.__next_f.push(1,,\tags\:\etl\,\beam\,\data\,\draft\:true,\readingTime\:{\text\:\0 min read\,\minutes\:0,\time\:0,\words\:0},\headings\:,\headingRefs\:},\hero\:\$5:1:props:children:0:props:posts:0:hero\},{\slug\:\nextjs-on-cloudflare\,\metadata\:{\title\:\Hosting Next.js on Cloudflare\,\description\:\Hosting Next.js on Cloudflare is cheap, performant and easy to setup. Read on and find out how.\,\image\:\/nextjs-on-cloudflare-hero.png\,\date\:\2025-06-25\,\tags\:\hosting\,\nextjs\,\cloudflare\,\readingTime\:{\text\:\6 min read\,\minutes\:5.98,\time\:358800,\words\:1196},\headings\:{\depth\:1,\value\:\Hosting Next.js on Cloudflare in 2025\,\slug\:\hosting-nextjs-on-cloudflare-in-2025\,\children\:{\depth\:2,\value\:\Why Cloudflare for Next.js?\,\slug\:\why-cloudflare-for-nextjs\,\children\:},{\depth\:2,\value\:\Decision guide\,\slug\:\decision-guide\,\children\:},{\depth\:2,\value\:\Prerequisites\,\slug\:\prerequisites\,\children\:},{\depth\:2,\value\:\Path A — Next.js on Cloudflare Workers (recommended)\,\slug\:\path-a--nextjs-on-cloudflare-workers-recommended\,\children\:},{\depth\:2,\value\:\Path B — Next.js on Cloudflare Pages (Edge runtime)\,\slug\:\path-b--nextjs-on-cloudflare-pages-edge-runtime\,\children\:},{\depth\:2,\value\:\Image optimization the Cloudflare way\,\slug\:\image-optimization-the-cloudflare-way\,\children\:},{\depth\:2,\value\:\Caching \u0026 data revalidation\,\slug\:\caching--data-revalidation\,\children\:},{\depth\:2,\value\:\Storage \u0026 platform bindings\,\slug\:\storage--platform-bindings\,\children\:},{\depth\:2,\value\:\CI/CD options\,\slug\:\cicd-options\,\children\:},{\depth\:2,\value\:\Monitoring \u0026 analytics\,\slug\:\monitoring--analytics\,\children\:},{\depth\:2,\value\:\Common pitfalls \u0026 fixes\,\slug\:\common-pitfalls--fixes\,\children\:},{\depth\:2,\value\:\Cheatsheet\,\slug\:\cheatsheet\,\children\:},{\depth\:2,\value\:\Appendix: minimal templates\,\slug\:\appendix-minimal-templates\,\children\:}},\headingRefs\:\hosting-nextjs-on-cloudflare-in-2025\,\why-cloudflare-for-nextjs\,\decision-guide\,\prerequisites\,\path-a--nextjs-on-cloudflare-workers-recommended\,\path-b--nextjs-on-cloudflare-pages-edge-runtime\,\image-optimization-the-cloudflare-way\,\caching--data-revalidation\,\storage--platform-bindings\,\cicd-options\,\monitoring--analytics\,\common-pitfalls--fixes\,\cheatsheet\,\appendix-minimal-templates\},\hero\:{\src\:\/_next/static/media/nextjs-on-cloudflare-hero.c4a143b5.png\,\height\:1024,\width\:1536,\blurDataURL\:\data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAMAAABPT11nAAAAHlBMVEUCDBoCEB8HIjcAFigTERgLN00THS5NJRYaNUYOLkNa/vE8AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAKElEQVR4nB3GwQ0AMAjDwCQG2v0nrqgfJ8ume1wyyZ1TUiKy4wD6eX0KewBdPBAlfAAAAABJRU5ErkJggg\,\blurWidth\:8,\blurHeight\:5}},{\slug\:\blog-building\,\metadata\:{\title\:\Building a blog in Next.js\,\description\:\Journey into building a modern blog with Next.js and MDX. Explore how code, content, and creativity come together to craft a dynamic, developer-friendly publishing platform.\,\image\:\/blog-building-hero.png\,\date\:\2025-06-15\,\tags\:\blog\,\nextjs\,\web\,\readingTime\:{\text\:\8 min read\,\minutes\:7.91,\time\:474600,\words\:1582},\headings\:{\depth\:2,\value\:\Setting goals\,\slug\:\setting-goals\,\children\:},{\depth\:2,\value\:\Choosing the right framework\,\slug\:\choosing-the-right-framework\,\children\:},{\depth\:2,\value\:\Project setup \u0026 structure\,\slug\:\project-setup--structure\,\children\:{\depth\:3,\value\:\Posts in MDX\,\slug\:\posts-in-mdx\,\children\:},{\depth\:3,\value\:\Routing \u0026 slugs\,\slug\:\routing--slugs\,\children\:},{\depth\:3,\value\:\Tooling\,\slug\:\tooling\,\children\:}},{\depth\:2,\value\:\Whats next?\,\slug\:\whats-next\,\children\:},\headingRefs\:\setting-goals\,\choosing-the-right-framework\,\project-setup--structure\,\posts-in-mdx\,\routing--slugs\,\tooling\,\whats-next\},\hero\:\$5:1:props:children:0:props:posts:0:hero\},{\slug\:\intro\,\metadata\:{\title\:\Starting a blog\,\description\:\Why I started a blog, my thought process in how )/script>script>self.__next_f.push(1,to approach writing articles and some of the content I will share.\,\image\:\/intro-hero.png\,\date\:\2025-06-01\,\tags\:\blog\,\readingTime\:{\text\:\4 min read\,\minutes\:3.18,\time\:190800,\words\:636},\headings\:{\depth\:2,\value\:\Why start a blog?\,\slug\:\why-start-a-blog\,\children\:},{\depth\:2,\value\:\Whats the plan?\,\slug\:\whats-the-plan\,\children\:},{\depth\:2,\value\:\What will I write about?\,\slug\:\what-will-i-write-about\,\children\:},{\depth\:2,\value\:\Final thoughts\,\slug\:\final-thoughts\,\children\:},\headingRefs\:\why-start-a-blog\,\whats-the-plan\,\what-will-i-write-about\,\final-thoughts\},\hero\:{\src\:\/_next/static/media/intro-hero.31af4825.png\,\height\:1024,\width\:1536,\blurDataURL\:\data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAMAAABPT11nAAAAPFBMVEXR0dU+Q0l8gIjZ296dnqNXXGTt7e+tsLZGTFMoLjbg5OczOD/HxciHhou+v8UQGyMIJzxGa4V1mbJfeYuW+jW+AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAL0lEQVR4nAXBhwHAIAzAMAcyy+jg/18r4d9rLbLw89wpVXikNJPBRWgwjQ57qeYPHLUBIITGhdYAAAAASUVORK5CYII\,\blurWidth\:8,\blurHeight\:5}}},\$\,\div\,null,{\className\:\container mx-auto px-2 max-w-7xl relative py-10\,\children\:\$\,\$L14\,null,{\className\:\bg-black\},\$\,\$L14\,null,{\className\:\bg-black\},\$\,\$L14\,null,{\className\:\bg-black\}}},\$\,\div\,null,{\className\:\flex-1 flex flex-col content-center items-center pt-5 sm:pb-5 bg-stone-600/40\,\children\:\$\,\h1\,null,{\className\:\text-3xl font-bold pb-10\,\children\:\Find out more\},\$\,\div\,null,{\className\:\container mx-auto px-2 max-w-7xl relative flex flex-col lg:flex-row gap-5 items-stretch\,\children\:\$\,\div\,null,{\className\:\flex-1\},\$\,\div\,null,{\data-slot\:\card\,\className\:\text-card-foreground flex flex-col gap-6 rounded-xl py-6 flex-1 my-5 shadow-md shadow-black/80 bg-neutral-300 border-black border-2\,\children\:\$\,\div\,null,{\data-slot\:\card-header\,\className\:\@container/card-header grid auto-rows-min grid-rows-auto_auto items-start gap-1.5 px-6 has-data-slotcard-action:grid-cols-1fr_auto .border-b:pb-6\,\children\:\$\,\div\,null,{\className\:\flex flex-row items-center\,\children\:\$\,\div\,null,{\data-slot\:\card-title\,\className\:\leading-none font-semibold flex-1\,\children\:\Github Repositories\},\$\,\svg\,null,{\width\:\15\,\height\:\15\,\viewBox\:\0 0 15 15\,\fill\:\none\,\xmlns\:\http://www.w3.org/2000/svg\,\className\:\size-5\,\ref\:\$undefined\,\children\:\$\,\path\,null,{\d\:\$15\,\fill\:\currentColor\,\fillRule\:\evenodd\,\clipRule\:\evenodd\}}}},\$\,\div\,null,{\data-slot\:\card-content\,\className\:\px-6 flex-1 text-stone-500\,\children\:\$\,\p\,null,{\className\:\\,\children\:\Explore Chriss projects and contributions on Github.\}},\$\,\div\,null,{\data-slot\:\card-footer\,\className\:\flex items-center px-6 .border-t:pt-6\,\children\:\$\,\$L11\,null,{\href\:\https://github.com/christogav\,\target\:\_blank\,\className\:\hover:underline flex flex-row items-center text-blue-600 font-semibold\,\children\:\Learn more\,\$\,\svg\,null,{\width\:\15\,\height\:\15\,\viewBox\:\0 0 15 15\,\fill\:\none\,\xmlns\:\http://www.w3.org/2000/svg\,\className\:\ml-2\,\ref\:\$undefined\,\children\:\$\,\path\,null,{\d\:\M3 2C2.44772 2 2 2.44772 2 3V12C2 12.5523 2.44772 13 3 13H12C12.5523 13 13 12.5523 13 12V8.5C13 8.22386 12.7761 8 12.5 8C12.2239 8 12 8.22386 12 8.5V12H3V3L6.5 3C6.77614 3 7 2.77614 7 2.5C7 2.22386 6.77614 2 6.5 2H3ZM12.8536 2.14645C12.9015 2.19439 12.9377 2.24964 12.9621 2.30861C12.9861 2.36669 12.9996 2.4303 13 2.497L13 2.5V2.50049V5.5C13 5.77614 12.7761 6 12.5 6C12.2239 6 12 5.77614 12 5.5V3.70711L6.85355 8.85355C6.65829 9.04882 6.34171 9.04882 6.14645 8.85355C5.95118 8.65829 5.95118 8.34171 6.14645 8.14645L11.2929 3H9.5C9.22386 3 9 2.77614 9 2.5C9 2.22386 9.22386 2 9.5 2H12.4999H12.5C12.5678 2 12.6324 2.01349 12.6914 2.03794C12.7504 2.06234 12.8056 2.09851 12.8536 2.14645Z\,\fill\:\currentColor\,\fillRule\:\evenodd\,\clipRule\:\evenodd\}}}}},\$\,\$L10\,null,{\src\:\/chris-lego-desk.png\,\width\:150,\height\:150,\alt\:\Chris Gavin\,\className\:\)/script>script>self.__next_f.push(1,size-2/3 sm:size-1/5 mx-auto aspect-auto self-center\},\$\,\div\,null,{\data-slot\:\card\,\className\:\text-card-foreground flex flex-col gap-6 rounded-xl py-6 flex-1 my-5 shadow-md shadow-black/80 bg-neutral-300 border-black border-2\,\children\:\$\,\div\,null,{\data-slot\:\card-header\,\className\:\@container/card-header grid auto-rows-min grid-rows-auto_auto items-start gap-1.5 px-6 has-data-slotcard-action:grid-cols-1fr_auto .border-b:pb-6\,\children\:\$\,\div\,null,{\className\:\flex flex-row items-center\,\children\:\$\,\div\,null,{\data-slot\:\card-title\,\className\:\leading-none font-semibold flex-1\,\children\:\Professional\},\$\,\svg\,null,{\width\:\15\,\height\:\15\,\viewBox\:\0 0 15 15\,\fill\:\none\,\xmlns\:\http://www.w3.org/2000/svg\,\className\:\size-5\,\ref\:\$undefined\,\children\:\$\,\path\,null,{\d\:\M2 1C1.44772 1 1 1.44772 1 2V13C1 13.5523 1.44772 14 2 14H13C13.5523 14 14 13.5523 14 13V2C14 1.44772 13.5523 1 13 1H2ZM3.05 6H4.95V12H3.05V6ZM5.075 4.005C5.075 4.59871 4.59371 5.08 4 5.08C3.4063 5.08 2.925 4.59871 2.925 4.005C2.925 3.41129 3.4063 2.93 4 2.93C4.59371 2.93 5.075 3.41129 5.075 4.005ZM12 8.35713C12 6.55208 10.8334 5.85033 9.67449 5.85033C9.29502 5.83163 8.91721 5.91119 8.57874 6.08107C8.32172 6.21007 8.05265 6.50523 7.84516 7.01853H7.79179V6.00044H6V12.0047H7.90616V8.8112C7.8786 8.48413 7.98327 8.06142 8.19741 7.80987C8.41156 7.55832 8.71789 7.49825 8.95015 7.46774H9.02258C9.62874 7.46774 10.0786 7.84301 10.0786 8.78868V12.0047H11.9847L12 8.35713Z\,\fill\:\currentColor\,\fillRule\:\evenodd\,\clipRule\:\evenodd\}}}},\$\,\div\,null,{\data-slot\:\card-content\,\className\:\px-6 flex-1 text-stone-500\,\children\:\$\,\p\,null,{\children\:\My professional career, where Ive worked and a bit about what I did there.\}},\$\,\div\,null,{\data-slot\:\card-footer\,\className\:\flex items-center px-6 .border-t:pt-6\,\children\:\$\,\$L11\,null,{\href\:\https://www.linkedin.com/in/chrisgavin/\,\target\:\_blank\,\className\:\hover:underline flex flex-row items-center text-blue-600 font-semibold\,\children\:\Learn more\,\$\,\svg\,null,{\width\:\15\,\height\:\15\,\viewBox\:\0 0 15 15\,\fill\:\none\,\xmlns\:\http://www.w3.org/2000/svg\,\className\:\ml-2\,\ref\:\$undefined\,\children\:\$\,\path\,null,{\d\:\M3 2C2.44772 2 2 2.44772 2 3V12C2 12.5523 2.44772 13 3 13H12C12.5523 13 13 12.5523 13 12V8.5C13 8.22386 12.7761 8 12.5 8C12.2239 8 12 8.22386 12 8.5V12H3V3L6.5 3C6.77614 3 7 2.77614 7 2.5C7 2.22386 6.77614 2 6.5 2H3ZM12.8536 2.14645C12.9015 2.19439 12.9377 2.24964 12.9621 2.30861C12.9861 2.36669 12.9996 2.4303 13 2.497L13 2.5V2.50049V5.5C13 5.77614 12.7761 6 12.5 6C12.2239 6 12 5.77614 12 5.5V3.70711L6.85355 8.85355C6.65829 9.04882 6.34171 9.04882 6.14645 8.85355C5.95118 8.65829 5.95118 8.34171 6.14645 8.14645L11.2929 3H9.5C9.22386 3 9 2.77614 9 2.5C9 2.22386 9.22386 2 9.5 2H12.4999H12.5C12.5678 2 12.6324 2.01349 12.6914 2.03794C12.7504 2.06234 12.8056 2.09851 12.8536 2.14645Z\,\fill\:\currentColor\,\fillRule\:\evenodd\,\clipRule\:\evenodd\}}}}},\$\,\div\,null,{\className\:\flex-1\}}},\$\,\div\,null,{\className\:\bg-white flex-1\,\children\:\$\,\$L16\,null,{\posts\:{\slug\:\mdx-in-nextjs\,\metadata\:\$5:1:props:children:0:props:posts:0:metadata\,\hero\:\$5:1:props:children:0:props:posts:0:hero\},{\slug\:\temporal-data-management\,\metadata\:\$5:1:props:children:0:props:posts:1:metadata\,\hero\:\$5:1:props:children:0:props:posts:1:hero\},{\slug\:\beam-spanner-changestreams\,\metadata\:\$5:1:props:children:0:props:posts:2:metadata\,\hero\:\$5:1:props:children:0:props:posts:0:hero\},{\slug\:\nextjs-on-cloudflare\,\metadata\:\$5:1:props:children:0:props:posts:3:metadata\,\hero\:\$5:1:props:children:0:props:posts:3:hero\},{\slug\:\blog-building\,\metadata\:\$5:1:props:children:0:props:posts:4:metadata\,\hero\:\$5:1:props:children:0:props:posts:0:hero\},{\slug\:\intro\,\metadata\:\$5:1:props:children:0:props:posts:5:metadata\,\hero\:\$5:1:props:children:0:props:posts:5:hero\}}}\n17:I850,\78\,\static/chunks/2d633d72-a58f155fdb92da19.js\,\966\,\static/chunks/96)/script>script>self.__next_f.push(1,6-5eda3e28bb8654a7.js\,\978\,\static/chunks/978-3e912a4dd7964a2a.js\,\34\,\static/chunks/34-ded094602038367d.js\,\750\,\static/chunks/app/(site)/layout-2895354f2751fd96.js\,\Sheet\\n18:I850,\78\,\static/chunks/2d633d72-a58f155fdb92da19.js\,\966\,\static/chunks/966-5eda3e28bb8654a7.js\,\978\,\static/chunks/978-3e912a4dd7964a2a.js\,\34\,\static/chunks/34-ded094602038367d.js\,\750\,\static/chunks/app/(site)/layout-2895354f2751fd96.js\,\SheetTrigger\\n19:I850,\78\,\static/chunks/2d633d72-a58f155fdb92da19.js\,\966\,\static/chunks/966-5eda3e28bb8654a7.js\,\978\,\static/chunks/978-3e912a4dd7964a2a.js\,\34\,\static/chunks/34-ded094602038367d.js\,\750\,\static/chunks/app/(site)/layout-2895354f2751fd96.js\,\SheetContent\\n1a:I850,\78\,\static/chunks/2d633d72-a58f155fdb92da19.js\,\966\,\static/chunks/966-5eda3e28bb8654a7.js\,\978\,\static/chunks/978-3e912a4dd7964a2a.js\,\34\,\static/chunks/34-ded094602038367d.js\,\750\,\static/chunks/app/(site)/layout-2895354f2751fd96.js\,\SheetClose\\n1c:I2709,\78\,\static/chunks/2d633d72-a58f155fdb92da19.js\,\966\,\static/chunks/966-5eda3e28bb8654a7.js\,\978\,\static/chunks/978-3e912a4dd7964a2a.js\,\34\,\static/chunks/34-ded094602038367d.js\,\750\,\static/chunks/app/(site)/layout-2895354f2751fd96.js\,\NavBarMainLink\\n1b:T49a,M7.49933 0.25C3.49635 0.25 0.25 3.49593 0.25 7.50024C0.25 10.703 2.32715 13.4206 5.2081 14.3797C5.57084 14.446 5.70302 14.2222 5.70302 14.0299C5.70302 13.8576 5.69679 13.4019 5.69323 12.797C3.67661 13.235 3.25112 11.825 3.25112 11.825C2.92132 10.9874 2.44599 10.7644 2.44599 10.7644C1.78773 10.3149 2.49584 10.3238 2.49584 10.3238C3.22353 10.375 3.60629 11.0711 3.60629 11.0711C4.25298 12.1788 5.30335 11.8588 5.71638 11.6732C5.78225 11.205 5.96962 10.8854 6.17658 10.7043C4.56675 10.5209 2.87415 9.89918 2.87415 7.12104C2.87415 6.32925 3.15677 5.68257 3.62053 5.17563C3.54576 4.99226 3.29697 4.25521 3.69174 3.25691C3.69174 3.25691 4.30015 3.06196 5.68522 3.99973C6.26337 3.83906 6.8838 3.75895 7.50022 3.75583C8.1162 3.75895 8.73619 3.83906 9.31523 3.99973C10.6994 3.06196 11.3069 3.25691 11.3069 3.25691C11.7026 4.25521 11.4538 4.99226 11.3795 5.17563C11.8441 5.68257 12.1245 6.32925 12.1245 7.12104C12.1245 9.9063 10.4292 10.5192 8.81452 10.6985C9.07444 10.9224 9.30633 11.3648 9.30633 12.0413C9.30633 13.0102 9.29742 13.7922 9.29742 14.0299C9.29742 14.2239 9.42828 14.4496 9.79591 14.3788C12.6746 13.4179 14.75 10.7025 14.75 7.50024C14.75 3.49593 11.5036 0.25 7.49933 0.25Z1d:T49a,M7.49933 0.25C3.49635 0.25 0.25 3.49593 0.25 7.50024C0.25 10.703 2.32715 13.4206 5.2081 14.3797C5.57084 14.446 5.70302 14.2222 5.70302 14.0299C5.70302 13.8576 5.69679 13.4019 5.69323 12.797C3.67661 13.235 3.25112 11.825 3.25112 11.825C2.92132 10.9874 2.44599 10.7644 2.44599 10.7644C1.78773 10.3149 2.49584 10.3238 2.49584 10.3238C3.22353 10.375 3.60629 11.0711 3.60629 11.0711C4.25298 12.1788 5.30335 11.8588 5.71638 11.6732C5.78225 11.205 5.96962 10.8854 6.17658 10.7043C4.56675 10.5209 2.87415 9.89918 2.87415 7.12104C2.87415 6.32925 3.15677 5.68257 3.62053 5.17563C3.54576 4.99226 3.29697 4.25521 3.69174 3.25691C3.69174 3.25691 4.30015 3.06196 5.68522 3.99973C6.26337 3.83906 6.8838 3.75895 7.50022 3.75583C8.1162 3.75895 8.73619 3.83906 9.31523 3.99973C10.6994 3.06196 11.3069 3.25691 11.3069 3.25691C11.7026 4.25521 11.4538 4.99226 11.3795 5.17563C11.8441 5.68257 12.1245 6.32925 12.1245 7.12104C12.1245 9.9063 10.4292 10.5192 8.81452 10.6985C9.07444 10.9224 9.30633 11.3648 9.30633 12.0413C9.30633 13.0102 9.29742 13.7922 9.29742 14.0299C9.29742 14.2239 9.42828 14.4496 9.79591 14.3788C12.6746 13.4179 14.75 10.7025 14.75 7.50024C14.75 3.49593 11.5036 0.25 7.49933 0.25Ze:\$\,\header\,null,{\className\:\sticky top-0 z-50 bg-primary text-primary-foreground border-b-white/10 border-b-1/2\,\children\:\$\,\$L17\,null,{\children\:\$\,\div\,null,{\className\:\flex items-center flex-justify-between py-3 sm:hidden\,\children\:\$\,\div\,null,{\className\:\flex-1 flex\,\children\:\$\,\$L10\,null,{\src\:\/chris-avatar.jpeg\,\alt\:\Chris Gavin\,\className\:\rounded-full shrink-0 overflow-hidden aspect-square tran)/script>script>self.__next_f.push(1,sition-opacity duration-500 mx-4 size-8\,\width\:400,\height\:400},\$\,\$L11\,null,{\href\:\/\,\className\:\text-lg font-semibold mr-4\,\children\:\chrisgavin.dev\}},\$\,\$L18\,null,{\asChild\:true,\children\:\$\,\button\,null,{\data-slot\:\button\,\className\:\inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 \u0026_svg:pointer-events-none \u0026_svg:not(class*size-):size-4 shrink-0 \u0026_svg:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-3px aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50 h-9 px-4 py-2 has-\u003esvg:px-3\,\children\:\$\,\svg\,null,{\ref\:\$undefined\,\xmlns\:\http://www.w3.org/2000/svg\,\width\:24,\height\:24,\viewBox\:\0 0 24 24\,\fill\:\none\,\stroke\:\currentColor\,\strokeWidth\:2,\strokeLinecap\:\round\,\strokeLinejoin\:\round\,\className\:\lucide lucide-menu size-6\,\aria-hidden\:\true\,\children\:\$\,\path\,\1lakjw\,{\d\:\M4 12h16\},\$\,\path\,\19g7jn\,{\d\:\M4 18h16\},\$\,\path\,\1o0s65\,{\d\:\M4 6h16\},\$undefined\}}}},\$\,\$L19\,null,{\side\:\right\,\className\:\p-4 border-b-white/10 border-b-1\,\children\:\$\,\$L11\,null,{\href\:\#\,\className\:\mr-6 hidden lg:flex\,\prefetch\:false,\children\:\$\,\svg\,null,{\ref\:\$undefined\,\xmlns\:\http://www.w3.org/2000/svg\,\width\:24,\height\:24,\viewBox\:\0 0 24 24\,\fill\:\none\,\stroke\:\currentColor\,\strokeWidth\:2,\strokeLinecap\:\round\,\strokeLinejoin\:\round\,\className\:\lucide lucide-mountain h-6 w-6\,\aria-hidden\:\true\,\children\:\$\,\path\,\otkl63\,{\d\:\m8 3 4 8 5-5 5 15H2L8 3z\},\$undefined\},\$\,\span\,null,{\className\:\sr-only\,\children\:\Chris Gavin\}},\$\,\div\,null,{\className\:\grid gap-2 py-6\,\children\:false,\$\,\$L14\,null,{\orientation\:\horizontal\},\$\,\$L1a\,\Home\,{\asChild\:true,\children\:\$\,\$L11\,\Home\,{\href\:\/\,\className\:\rounded-md px-4 font-medium aria-currentpage:bg-white/10\,\children\:\Home\}},\$\,\$L1a\,\Latest\,{\asChild\:true,\children\:\$\,\$L11\,\Latest\,{\href\:\/blog/nextjs-on-cloudflare\,\className\:\rounded-md px-4 font-medium aria-currentpage:bg-white/10\,\children\:\Latest\}},\$\,\$L1a\,\About\,{\asChild\:true,\children\:\$\,\$L11\,\About\,{\href\:\/about\,\className\:\rounded-md px-4 font-medium aria-currentpage:bg-white/10\,\children\:\About\}},\$\,\$L14\,null,{\orientation\:\horizontal\},\$\,\$L1a\,null,{\asChild\:true,\children\:\$\,\$L11\,null,{\href\:\https://github.com/christogav\,\target\:\_blank\,\className\:\rounded-md px-4 font-medium aria-currentpage:bg-white/10 flex flex-wrap items-center\,\children\:\$\,\svg\,null,{\width\:\15\,\height\:\15\,\viewBox\:\0 0 15 15\,\fill\:\none\,\xmlns\:\http://www.w3.org/2000/svg\,\ref\:\$undefined\,\children\:\$\,\path\,null,{\d\:\$1b\,\fill\:\currentColor\,\fillRule\:\evenodd\,\clipRule\:\evenodd\}},\ \,\$\,\p\,null,{\className\:\pl-2\,\children\:\Github\}}},\$\,\$L1a\,null,{\asChild\:true,\children\:\$\,\$L11\,null,{\href\:\https://www.linkedin.com/in/chris-gavin-91388b28/\,\target\:\_blank\,\className\:\rounded-md px-4 font-medium aria-currentpage:bg-white/10 flex flex-wrap items-center\,\children\:\$\,\svg\,null,{\width\:\15\,\height\:\15\,\viewBox\:\0 0 15 15\,\fill\:\none\,\xmlns\:\http://www.w3.org/2000/svg\,\ref\:\$undefined\,\children\:\$\,\path\,null,{\d\:\M2 1C1.44772 1 1 1.44772 1 2V13C1 13.5523 1.44772 14 2 14H13C13.5523 14 14 13.5523 14 13V2C14 1.44772 13.5523 1 13 1H2ZM3.05 6H4.95V12H3.05V6ZM5.075 4.005C5.075 4.59871 4.59371 5.08 4 5.08C3.4063 5.08 2.925 4.59871 2.925 4.005C2.925 3.41129 3.4063 2.93 4 2.93C4.59371 2.93 5.075 3.41129 5.075 4.005ZM12 8.35713C12 6.55208 10.8334 5.85033 9.67449 5.85033C9.29502 5.83163 8.91721 5.91119 8.57874 6.08107C8.32172 6.21007 8.05265 6.50523 7.84516 7.01853H7.79179V6.00044H6V12.0047H7.90616V8.8112C7.8786 8.48413 7.98327 8.06142 8.19741 7.)/script>script>self.__next_f.push(1,80987C8.41156 7.55832 8.71789 7.49825 8.95015 7.46774H9.02258C9.62874 7.46774 10.0786 7.84301 10.0786 8.78868V12.0047H11.9847L12 8.35713Z\,\fill\:\currentColor\,\fillRule\:\evenodd\,\clipRule\:\evenodd\}},\ \,\$\,\p\,null,{\className\:\pl-2\,\children\:\Linkedin\}}}}}},\$\,\div\,null,{\className\:\bg-primary text-primary-foreground border-b-white/10 border-b-1 hidden sm:block\,\children\:\$\,\div\,null,{\className\:\max-w-7xl mx-auto p-4\,\children\:\$\,\div\,null,{\className\:\flex items-center justify-between h-5\,\children\:\$\,\$L10\,null,{\src\:\/chris-avatar.jpeg\,\alt\:\Chris Gavin\,\className\:\rounded-full shrink-0 overflow-hidden aspect-square transition-opacity duration-500 mx-4 size-8\,\width\:400,\height\:400},\$\,\$L11\,null,{\href\:\/\,\className\:\text-lg font-semibold mr-4 transition-transform duration-200 ease-in-out hover:scale-110 active:scale-90\,\children\:\chrisgavin.dev\},\$\,\$L14\,null,{\orientation\:\vertical\,\className\:\bg-zinc-950/10 dark:bg-white/10\},\$\,\nav\,null,{\className\:\grow\,\children\:\$\,\div\,null,{\className\:\ml-10 flex items-baseline space-x-4\,\children\:\$\,\$L1c\,\Home\,{\href\:\/\,\name\:\Home\},\$\,\$L1c\,\Latest\,{\href\:\/blog/nextjs-on-cloudflare\,\name\:\Latest\},\$\,\$L1c\,\About\,{\href\:\/about\,\name\:\About\}}},\$\,\div\,null,{\className\:\flex items-center\,\children\:false,\$\,\$L11\,null,{\href\:\https://github.com/christogav\,\className\:\mr-6 transition-transform duration-200 ease-in-out hover:scale-140 active:scale-80\,\target\:\_blank\,\children\:\$\,\svg\,null,{\width\:\15\,\height\:\15\,\viewBox\:\0 0 15 15\,\fill\:\none\,\xmlns\:\http://www.w3.org/2000/svg\,\ref\:\$undefined\,\children\:\$\,\path\,null,{\d\:\$1d\,\fill\:\currentColor\,\fillRule\:\evenodd\,\clipRule\:\evenodd\}}},\$\,\$L11\,null,{\href\:\https://www.linkedin.com/in/chris-gavin-91388b28/\,\className\:\mr-6 transition-transform duration-200 ease-in-out hover:scale-140 active:scale-80\,\target\:\_blank\,\children\:\$\,\svg\,null,{\width\:\15\,\height\:\15\,\viewBox\:\0 0 15 15\,\fill\:\none\,\xmlns\:\http://www.w3.org/2000/svg\,\ref\:\$undefined\,\children\:\$\,\path\,null,{\d\:\M2 1C1.44772 1 1 1.44772 1 2V13C1 13.5523 1.44772 14 2 14H13C13.5523 14 14 13.5523 14 13V2C14 1.44772 13.5523 1 13 1H2ZM3.05 6H4.95V12H3.05V6ZM5.075 4.005C5.075 4.59871 4.59371 5.08 4 5.08C3.4063 5.08 2.925 4.59871 2.925 4.005C2.925 3.41129 3.4063 2.93 4 2.93C4.59371 2.93 5.075 3.41129 5.075 4.005ZM12 8.35713C12 6.55208 10.8334 5.85033 9.67449 5.85033C9.29502 5.83163 8.91721 5.91119 8.57874 6.08107C8.32172 6.21007 8.05265 6.50523 7.84516 7.01853H7.79179V6.00044H6V12.0047H7.90616V8.8112C7.8786 8.48413 7.98327 8.06142 8.19741 7.80987C8.41156 7.55832 8.71789 7.49825 8.95015 7.46774H9.02258C9.62874 7.46774 10.0786 7.84301 10.0786 8.78868V12.0047H11.9847L12 8.35713Z\,\fill\:\currentColor\,\fillRule\:\evenodd\,\clipRule\:\evenodd\}}}}}}}}\na:\$\,\meta\,\0\,{\charSet\:\utf-8\},\$\,\meta\,\1\,{\name\:\viewport\,\content\:\widthdevice-width, initial-scale1\}\n7:null\n)/script>script>self.__next_f.push(1,8:null\nc:\$\,\title\,\0\,{\children\:\Chris Gavins Blog\},\$\,\meta\,\1\,{\name\:\description\,\content\:\Technology, personal development and more...\},\$\,\link\,\2\,{\rel\:\author\,\href\:\https://chrisgavin.dev\},\$\,\meta\,\3\,{\name\:\author\,\content\:\Chris Gavin\},\$\,\meta\,\4\,{\name\:\keywords\,\content\:\blog,technology,personal development,Chris Gavin\},\$\,\meta\,\5\,{\property\:\og:title\,\content\:\Chris Gavins Blog\},\$\,\meta\,\6\,{\property\:\og:description\,\content\:\Technology, personal development and more...\},\$\,\meta\,\7\,{\property\:\og:url\,\content\:\https://chrisgavin.dev\},\$\,\meta\,\8\,{\property\:\og:image\,\content\:\https://chrisgavin.dev/chris-lego-smiling.png\},\$\,\meta\,\9\,{\property\:\og:type\,\content\:\website\},\$\,\meta\,\10\,{\name\:\twitter:card\,\content\:\summary_large_image\},\$\,\meta\,\11\,{\name\:\twitter:title\,\content\:\Chris Gavins Blog\},\$\,\meta\,\12\,{\name\:\twitter:description\,\content\:\Technology, personal development and more...\},\$\,\meta\,\13\,{\name\:\twitter:image\,\content\:\https://chrisgavin.dev/chris-lego-smiling.png\},\$\,\link\,\14\,{\rel\:\icon\,\href\:\/favicon.ico\,\type\:\image/x-icon\,\sizes\:\149x147\}\n)/script>/body>/html>
Port 443
HTTP/1.1 200 OKDate: Fri, 24 Oct 2025 16:56:51 GMTContent-Type: text/html; charsetutf-8Transfer-Encoding: chunkedConnection: keep-aliveCache-Control: s-maxage31536000ETag: 11t85h02wym1nhzVary: RSC, Next-Router-State-Tree, Next-Router-Prefetch, Next-Router-Segment-Prefetch, accept-encodingx-nextjs-cache: MISSx-nextjs-prerender: 1x-nextjs-stale-time: 300x-opennext: 1x-powered-by: Next.jsReport-To: {group:cf-nel,max_age:604800,endpoints:{url:https://a.nel.cloudflare.com/report/v4?sFC%2B%2F2aC2bAHfA%2BLfbP4ZHGis3pkJA7ff3eWFmWfxB%2B4gquEwYFAGFyxt5LGIpBPtmu0CT1m9AZwjpp5x2ItxHJkRGuMDooP46rBcjg%3D%3D}}Nel: {report_to:cf-nel,success_fraction:0.0,max_age:604800}Server: cloudflareCF-RAY: 993b02880de1ef3f-PDXalt-svc: h3:443; ma86400 !DOCTYPE html>html langen class__variable_a4bae9 __variable_9a8899 scroll-pt-15 scroll-smooth bg-primary>head>meta charSetutf-8/>meta nameviewport contentwidthdevice-width, initial-scale1/>link relpreload href/_next/static/media/93f479601ee12b01-s.p.woff2 asfont crossorigin typefont/woff2/>link relpreload href/_next/static/media/9d5a263311222317-s.p.woff2 asfont crossorigin typefont/woff2/>link relpreload asimage imageSrcSet/cdn-cgi/image/width640/_next/static/media/nextjs-on-cloudflare-hero.c4a143b5.png 640w, /cdn-cgi/image/width750/_next/static/media/nextjs-on-cloudflare-hero.c4a143b5.png 750w, /cdn-cgi/image/width828/_next/static/media/nextjs-on-cloudflare-hero.c4a143b5.png 828w, /cdn-cgi/image/width1080/_next/static/media/nextjs-on-cloudflare-hero.c4a143b5.png 1080w, /cdn-cgi/image/width1200/_next/static/media/nextjs-on-cloudflare-hero.c4a143b5.png 1200w, /cdn-cgi/image/width1920/_next/static/media/nextjs-on-cloudflare-hero.c4a143b5.png 1920w, /cdn-cgi/image/width2048/_next/static/media/nextjs-on-cloudflare-hero.c4a143b5.png 2048w, /cdn-cgi/image/width3840/_next/static/media/nextjs-on-cloudflare-hero.c4a143b5.png 3840w imageSizes(max-width: 640px) 100vw, 600px/>link relpreload asimage imageSrcSet/cdn-cgi/image/width640/_next/static/media/blog-building-hero.141dda18.png 640w, /cdn-cgi/image/width750/_next/static/media/blog-building-hero.141dda18.png 750w, /cdn-cgi/image/width828/_next/static/media/blog-building-hero.141dda18.png 828w, /cdn-cgi/image/width1080/_next/static/media/blog-building-hero.141dda18.png 1080w, /cdn-cgi/image/width1200/_next/static/media/blog-building-hero.141dda18.png 1200w, /cdn-cgi/image/width1920/_next/static/media/blog-building-hero.141dda18.png 1920w, /cdn-cgi/image/width2048/_next/static/media/blog-building-hero.141dda18.png 2048w, /cdn-cgi/image/width3840/_next/static/media/blog-building-hero.141dda18.png 3840w imageSizes(max-width: 640px) 100vw, 200px/>link relpreload asimage imageSrcSet/cdn-cgi/image/width640/_next/static/media/intro-hero.31af4825.png 640w, /cdn-cgi/image/width750/_next/static/media/intro-hero.31af4825.png 750w, /cdn-cgi/image/width828/_next/static/media/intro-hero.31af4825.png 828w, /cdn-cgi/image/width1080/_next/static/media/intro-hero.31af4825.png 1080w, /cdn-cgi/image/width1200/_next/static/media/intro-hero.31af4825.png 1200w, /cdn-cgi/image/width1920/_next/static/media/intro-hero.31af4825.png 1920w, /cdn-cgi/image/width2048/_next/static/media/intro-hero.31af4825.png 2048w, /cdn-cgi/image/width3840/_next/static/media/intro-hero.31af4825.png 3840w imageSizes(max-width: 640px) 100vw, 200px/>link relstylesheet href/_next/static/css/11a346bd84c2e1db.css data-precedencenext/>link relstylesheet href/_next/static/css/062c6f53f13267f6.css data-precedencenext/>link relpreload asscript fetchPrioritylow href/_next/static/chunks/webpack-7f3a97f87ff505ad.js/>script src/_next/static/chunks/bcb818fd-979207f372921194.js async>/script>script src/_next/static/chunks/664-03ce7513a1740d46.js async>/script>script src/_next/static/chunks/main-app-762a426da7d16290.js async>/script>script src/_next/static/chunks/2d633d72-a58f155fdb92da19.js async>/script>script src/_next/static/chunks/966-5eda3e28bb8654a7.js async>/script>script src/_next/static/chunks/978-3e912a4dd7964a2a.js async>/script>script src/_next/static/chunks/100-721cf1a2c5848fe9.js async>/script>script src/_next/static/chunks/app/(site)/page-65c794d61a0b675f.js async>/script>script src/_next/static/chunks/34-ded094602038367d.js async>/script>script src/_next/static/chunks/app/(site)/layout-2895354f2751fd96.js async>/script>meta namenext-size-adjust content/>title>Chris Gavin's Blog/title>meta namedescription contentTechnology, personal development and more.../>link relauthor hrefhttps://chrisgavin.dev/>meta nameauthor contentChris Gavin/>meta namekeywords contentblog,technology,personal development,Chris Gavin/>meta propertyog:title contentChris Gavin's Blog/>meta propertyog:description contentTechnology, personal development and more.../>meta propertyog:url contenthttps://chrisgavin.dev/>meta propertyog:image contenthttps://chrisgavin.dev/chris-lego-smiling.png/>meta propertyog:type contentwebsite/>meta nametwitter:card contentsummary_large_image/>meta nametwitter:title contentChris Gavin's Blog/>meta nametwitter:description contentTechnology, personal development and more.../>meta nametwitter:image contenthttps://chrisgavin.dev/chris-lego-smiling.png/>link relicon href/favicon.ico typeimage/x-icon sizes149x147/>script src/_next/static/chunks/polyfills-42372ed130431b0a.js noModule>/script>/head>body classflex flex-col overflow-auto min-h-100dvh>header classsticky top-0 z-50 bg-primary text-primary-foreground border-b-white/10 border-b-1/2>div classflex items-center flex-justify-between py-3 sm:hidden>div classflex-1 flex>img altChris Gavin loadinglazy width400 height400 decodingasync data-nimg1 classrounded-full shrink-0 overflow-hidden aspect-square transition-opacity duration-500 mx-4 size-8 stylecolor:transparent srcSet/cdn-cgi/image/width640/chris-avatar.jpeg 1x, /cdn-cgi/image/width828/chris-avatar.jpeg 2x src/cdn-cgi/image/width828/chris-avatar.jpeg/>a classtext-lg font-semibold mr-4 href/>chrisgavin.dev/a>/div>button data-slotbutton classinline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 &_svg:pointer-events-none &_svg:not(class*'size-'):size-4 shrink-0 &_svg:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-3px aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50 h-9 px-4 py-2 has->svg:px-3 typebutton aria-haspopupdialog aria-expandedfalse aria-controlsradix-«R9nb» data-stateclosed>svg xmlnshttp://www.w3.org/2000/svg width24 height24 viewBox0 0 24 24 fillnone strokecurrentColor stroke-width2 stroke-linecapround stroke-linejoinround classlucide lucide-menu size-6 aria-hiddentrue>path dM4 12h16>/path>path dM4 18h16>/path>path dM4 6h16>/path>/svg>/button>/div>div classbg-primary text-primary-foreground border-b-white/10 border-b-1 hidden sm:block>div classmax-w-7xl mx-auto p-4>div classflex items-center justify-between h-5>img altChris Gavin loadinglazy width400 height400 decodingasync data-nimg1 classrounded-full shrink-0 overflow-hidden aspect-square transition-opacity duration-500 mx-4 size-8 stylecolor:transparent srcSet/cdn-cgi/image/width640/chris-avatar.jpeg 1x, /cdn-cgi/image/width828/chris-avatar.jpeg 2x src/cdn-cgi/image/width828/chris-avatar.jpeg/>a classtext-lg font-semibold mr-4 transition-transform duration-200 ease-in-out hover:scale-110 active:scale-90 href/>chrisgavin.dev/a>div data-orientationvertical rolenone data-slotseparator classshrink-0 data-orientationhorizontal:h-px data-orientationhorizontal:w-full data-orientationvertical:h-full data-orientationvertical:w-px bg-zinc-950/10 dark:bg-white/10>/div>nav classgrow>div classml-10 flex items-baseline space-x-4>div classrelative>div classabsolute inset-0 rounded-md bg-white/10>/div>div classpy-2 tabindex0>a aria-currentpage classrounded-md px-4 text-sm font-medium href/>Home/a>/div>/div>div classrelative>div classpy-2 tabindex0>a classrounded-md px-4 text-sm font-medium href/blog/nextjs-on-cloudflare>Latest/a>/div>/div>div classrelative>div classpy-2 tabindex0>a classrounded-md px-4 text-sm font-medium href/about>About/a>/div>/div>/div>/nav>div classflex items-center>a classmr-6 transition-transform duration-200 ease-in-out hover:scale-140 active:scale-80 target_blank hrefhttps://github.com/christogav>svg width15 height15 viewBox0 0 15 15 fillnone xmlnshttp://www.w3.org/2000/svg>path dM7.49933 0.25C3.49635 0.25 0.25 3.49593 0.25 7.50024C0.25 10.703 2.32715 13.4206 5.2081 14.3797C5.57084 14.446 5.70302 14.2222 5.70302 14.0299C5.70302 13.8576 5.69679 13.4019 5.69323 12.797C3.67661 13.235 3.25112 11.825 3.25112 11.825C2.92132 10.9874 2.44599 10.7644 2.44599 10.7644C1.78773 10.3149 2.49584 10.3238 2.49584 10.3238C3.22353 10.375 3.60629 11.0711 3.60629 11.0711C4.25298 12.1788 5.30335 11.8588 5.71638 11.6732C5.78225 11.205 5.96962 10.8854 6.17658 10.7043C4.56675 10.5209 2.87415 9.89918 2.87415 7.12104C2.87415 6.32925 3.15677 5.68257 3.62053 5.17563C3.54576 4.99226 3.29697 4.25521 3.69174 3.25691C3.69174 3.25691 4.30015 3.06196 5.68522 3.99973C6.26337 3.83906 6.8838 3.75895 7.50022 3.75583C8.1162 3.75895 8.73619 3.83906 9.31523 3.99973C10.6994 3.06196 11.3069 3.25691 11.3069 3.25691C11.7026 4.25521 11.4538 4.99226 11.3795 5.17563C11.8441 5.68257 12.1245 6.32925 12.1245 7.12104C12.1245 9.9063 10.4292 10.5192 8.81452 10.6985C9.07444 10.9224 9.30633 11.3648 9.30633 12.0413C9.30633 13.0102 9.29742 13.7922 9.29742 14.0299C9.29742 14.2239 9.42828 14.4496 9.79591 14.3788C12.6746 13.4179 14.75 10.7025 14.75 7.50024C14.75 3.49593 11.5036 0.25 7.49933 0.25Z fillcurrentColor fill-ruleevenodd clip-ruleevenodd>/path>/svg>/a>a classmr-6 transition-transform duration-200 ease-in-out hover:scale-140 active:scale-80 target_blank hrefhttps://www.linkedin.com/in/chris-gavin-91388b28/>svg width15 height15 viewBox0 0 15 15 fillnone xmlnshttp://www.w3.org/2000/svg>path dM2 1C1.44772 1 1 1.44772 1 2V13C1 13.5523 1.44772 14 2 14H13C13.5523 14 14 13.5523 14 13V2C14 1.44772 13.5523 1 13 1H2ZM3.05 6H4.95V12H3.05V6ZM5.075 4.005C5.075 4.59871 4.59371 5.08 4 5.08C3.4063 5.08 2.925 4.59871 2.925 4.005C2.925 3.41129 3.4063 2.93 4 2.93C4.59371 2.93 5.075 3.41129 5.075 4.005ZM12 8.35713C12 6.55208 10.8334 5.85033 9.67449 5.85033C9.29502 5.83163 8.91721 5.91119 8.57874 6.08107C8.32172 6.21007 8.05265 6.50523 7.84516 7.01853H7.79179V6.00044H6V12.0047H7.90616V8.8112C7.8786 8.48413 7.98327 8.06142 8.19741 7.80987C8.41156 7.55832 8.71789 7.49825 8.95015 7.46774H9.02258C9.62874 7.46774 10.0786 7.84301 10.0786 8.78868V12.0047H11.9847L12 8.35713Z fillcurrentColor fill-ruleevenodd clip-ruleevenodd>/path>/svg>/a>/div>/div>/div>/div>/header>main classflex-1 flex flex-col bg-primary text-primary-foreground>div classcontainer mx-auto px-2 py-2 sm:max-w-7xl sm:flex flex-row-reverse items-center relative overflow-visible>div classhidden sm:block w-1/4 justify-center>img altChris Gavin loadinglazy width120 height120 decodingasync data-nimg1 stylecolor:transparent srcSet/cdn-cgi/image/width128/chris-lego-smiling.png 1x, /cdn-cgi/image/width256/chris-lego-smiling.png 2x src/cdn-cgi/image/width256/chris-lego-smiling.png/>/div>div classw-full sm:w-3/4 px-4 px-auto sm:pl-20 pb-10 sm:pb-0>h1 classtext-3xl sm:text-5xl text-shadow-lg font-bold>Chris Gavin's Dev Blog/h1>p classtext-xs sm:text-base color-muted-foreground>Technology, personal development and more.../p>/div>img altChris Gavin loadinglazy width100 height50 decodingasync data-nimg1 classsm:hidden absolute right-5 bottom--5px overflow-visible stylecolor:transparent srcSet/cdn-cgi/image/width128/chris-lego-peeking.png 1x, /cdn-cgi/image/width256/chris-lego-peeking.png 2x src/cdn-cgi/image/width256/chris-lego-peeking.png/>/div>div classbg-white flex-1>div classcontainer mx-auto px-2 py-8 max-w-7xl columns-1 md:columns-2 md:gap-15 relative>article classflex flex-col text-black items-center relative overflow-visible break-inside-avoid mb-5 preview sm:breakp-after-column>img altBlog Post Image width200 height140 decodingasync data-nimg1 classshadow-md shadow-black/80 mb-4 sm:mb-0 transition-transform duration-200 ease-in-out preview-image rounded-lg w-full object-cover stylecolor:transparent sizes(max-width: 640px) 100vw, 600px srcSet/cdn-cgi/image/width640/_next/static/media/nextjs-on-cloudflare-hero.c4a143b5.png 640w, /cdn-cgi/image/width750/_next/static/media/nextjs-on-cloudflare-hero.c4a143b5.png 750w, /cdn-cgi/image/width828/_next/static/media/nextjs-on-cloudflare-hero.c4a143b5.png 828w, /cdn-cgi/image/width1080/_next/static/media/nextjs-on-cloudflare-hero.c4a143b5.png 1080w, /cdn-cgi/image/width1200/_next/static/media/nextjs-on-cloudflare-hero.c4a143b5.png 1200w, /cdn-cgi/image/width1920/_next/static/media/nextjs-on-cloudflare-hero.c4a143b5.png 1920w, /cdn-cgi/image/width2048/_next/static/media/nextjs-on-cloudflare-hero.c4a143b5.png 2048w, /cdn-cgi/image/width3840/_next/static/media/nextjs-on-cloudflare-hero.c4a143b5.png 3840w src/cdn-cgi/image/width3840/_next/static/media/nextjs-on-cloudflare-hero.c4a143b5.png/>div classflex-1 sm:pt-4>p classtext-sm text-muted-foreground mb-1 z-2>a classmr-2 relative z-2 hover:underline href/tag/hosting>HOSTING/a>a classmr-2 relative z-2 hover:underline href/tag/nextjs>NEXTJS/a>a classmr-2 relative z-2 hover:underline href/tag/cloudflare>CLOUDFLARE/a>/p>a classtext-xl font-bold pb-2 sm:pb-0 hover:underline preview-link href/blog/nextjs-on-cloudflare>Hosting Next.js on Cloudflare/a>p classtext-muted-foreground text-base pb-2 sm:pb-0 sm:text-sm>Hosting Next.js on Cloudflare is cheap, performant and easy to setup. Read on and find out how./p>div classflex items-center text-sm>div classflex-1>p>25 June 2025/p>/div>svg width15 height15 viewBox0 0 15 15 fillnone xmlnshttp://www.w3.org/2000/svg classmr-2>path dM7.49998 0.849976C7.22383 0.849976 6.99998 1.07383 6.99998 1.34998V3.52234C6.99998 3.79848 7.22383 4.02234 7.49998 4.02234C7.77612 4.02234 7.99998 3.79848 7.99998 3.52234V1.8718C10.8862 2.12488 13.15 4.54806 13.15 7.49998C13.15 10.6204 10.6204 13.15 7.49998 13.15C4.37957 13.15 1.84998 10.6204 1.84998 7.49998C1.84998 6.10612 2.35407 4.83128 3.19049 3.8459C3.36919 3.63538 3.34339 3.31985 3.13286 3.14115C2.92234 2.96245 2.60681 2.98825 2.42811 3.19877C1.44405 4.35808 0.849976 5.86029 0.849976 7.49998C0.849976 11.1727 3.82728 14.15 7.49998 14.15C11.1727 14.15 14.15 11.1727 14.15 7.49998C14.15 3.82728 11.1727 0.849976 7.49998 0.849976ZM6.74049 8.08072L4.22363 4.57237C4.15231 4.47295 4.16346 4.33652 4.24998 4.25C4.33649 4.16348 4.47293 4.15233 4.57234 4.22365L8.08069 6.74051C8.56227 7.08599 8.61906 7.78091 8.19998 8.2C7.78089 8.61909 7.08597 8.56229 6.74049 8.08072Z fillcurrentColor fill-ruleevenodd clip-ruleevenodd>/path>/svg>p>6 min read/p>/div>/div>/article>article classflex flex-col text-black items-center relative overflow-visible break-inside-avoid mb-5 preview sm:flex-row>img altBlog Post Image width200 height140 decodingasync data-nimg1 classshadow-md shadow-black/80 mb-4 sm:mb-0 transition-transform duration-200 ease-in-out preview-image rounded-sm w-full h-auto sm:w-250px stylecolor:transparent sizes(max-width: 640px) 100vw, 200px srcSet/cdn-cgi/image/width640/_next/static/media/blog-building-hero.141dda18.png 640w, /cdn-cgi/image/width750/_next/static/media/blog-building-hero.141dda18.png 750w, /cdn-cgi/image/width828/_next/static/media/blog-building-hero.141dda18.png 828w, /cdn-cgi/image/width1080/_next/static/media/blog-building-hero.141dda18.png 1080w, /cdn-cgi/image/width1200/_next/static/media/blog-building-hero.141dda18.png 1200w, /cdn-cgi/image/width1920/_next/static/media/blog-building-hero.141dda18.png 1920w, /cdn-cgi/image/width2048/_next/static/media/blog-building-hero.141dda18.png 2048w, /cdn-cgi/image/width3840/_next/static/media/blog-building-hero.141dda18.png 3840w src/cdn-cgi/image/width3840/_next/static/media/blog-building-hero.141dda18.png/>div classflex-1 sm:pl-4>p classtext-sm text-muted-foreground mb-1 z-2>a classmr-2 relative z-2 hover:underline href/tag/blog>BLOG/a>a classmr-2 relative z-2 hover:underline href/tag/nextjs>NEXTJS/a>a classmr-2 relative z-2 hover:underline href/tag/web>WEB/a>/p>a classtext-xl font-bold pb-2 sm:pb-0 hover:underline preview-link href/blog/blog-building>Building a blog in Next.js/a>p classtext-muted-foreground text-base pb-2 sm:pb-0 sm:text-sm>Journey into building a modern blog with Next.js and MDX. Explore how code, content, and creativity come together to craft a dynamic, developer-friendly publishing platform./p>div classflex items-center text-sm>div classflex-1>p>15 June 2025/p>/div>svg width15 height15 viewBox0 0 15 15 fillnone xmlnshttp://www.w3.org/2000/svg classmr-2>path dM7.49998 0.849976C7.22383 0.849976 6.99998 1.07383 6.99998 1.34998V3.52234C6.99998 3.79848 7.22383 4.02234 7.49998 4.02234C7.77612 4.02234 7.99998 3.79848 7.99998 3.52234V1.8718C10.8862 2.12488 13.15 4.54806 13.15 7.49998C13.15 10.6204 10.6204 13.15 7.49998 13.15C4.37957 13.15 1.84998 10.6204 1.84998 7.49998C1.84998 6.10612 2.35407 4.83128 3.19049 3.8459C3.36919 3.63538 3.34339 3.31985 3.13286 3.14115C2.92234 2.96245 2.60681 2.98825 2.42811 3.19877C1.44405 4.35808 0.849976 5.86029 0.849976 7.49998C0.849976 11.1727 3.82728 14.15 7.49998 14.15C11.1727 14.15 14.15 11.1727 14.15 7.49998C14.15 3.82728 11.1727 0.849976 7.49998 0.849976ZM6.74049 8.08072L4.22363 4.57237C4.15231 4.47295 4.16346 4.33652 4.24998 4.25C4.33649 4.16348 4.47293 4.15233 4.57234 4.22365L8.08069 6.74051C8.56227 7.08599 8.61906 7.78091 8.19998 8.2C7.78089 8.61909 7.08597 8.56229 6.74049 8.08072Z fillcurrentColor fill-ruleevenodd clip-ruleevenodd>/path>/svg>p>8 min read/p>/div>/div>/article>article classflex flex-col text-black items-center relative overflow-visible break-inside-avoid mb-5 preview sm:flex-row>img altBlog Post Image width200 height140 decodingasync data-nimg1 classshadow-md shadow-black/80 mb-4 sm:mb-0 transition-transform duration-200 ease-in-out preview-image rounded-sm w-full h-auto sm:w-250px stylecolor:transparent sizes(max-width: 640px) 100vw, 200px srcSet/cdn-cgi/image/width640/_next/static/media/intro-hero.31af4825.png 640w, /cdn-cgi/image/width750/_next/static/media/intro-hero.31af4825.png 750w, /cdn-cgi/image/width828/_next/static/media/intro-hero.31af4825.png 828w, /cdn-cgi/image/width1080/_next/static/media/intro-hero.31af4825.png 1080w, /cdn-cgi/image/width1200/_next/static/media/intro-hero.31af4825.png 1200w, /cdn-cgi/image/width1920/_next/static/media/intro-hero.31af4825.png 1920w, /cdn-cgi/image/width2048/_next/static/media/intro-hero.31af4825.png 2048w, /cdn-cgi/image/width3840/_next/static/media/intro-hero.31af4825.png 3840w src/cdn-cgi/image/width3840/_next/static/media/intro-hero.31af4825.png/>div classflex-1 sm:pl-4>p classtext-sm text-muted-foreground mb-1 z-2>a classmr-2 relative z-2 hover:underline href/tag/blog>BLOG/a>/p>a classtext-xl font-bold pb-2 sm:pb-0 hover:underline preview-link href/blog/intro>Starting a blog/a>p classtext-muted-foreground text-base pb-2 sm:pb-0 sm:text-sm>Why I started a blog, my thought process in how to approach writing articles and some of the content I will share./p>div classflex items-center text-sm>div classflex-1>p>1 June 2025/p>/div>svg width15 height15 viewBox0 0 15 15 fillnone xmlnshttp://www.w3.org/2000/svg classmr-2>path dM7.49998 0.849976C7.22383 0.849976 6.99998 1.07383 6.99998 1.34998V3.52234C6.99998 3.79848 7.22383 4.02234 7.49998 4.02234C7.77612 4.02234 7.99998 3.79848 7.99998 3.52234V1.8718C10.8862 2.12488 13.15 4.54806 13.15 7.49998C13.15 10.6204 10.6204 13.15 7.49998 13.15C4.37957 13.15 1.84998 10.6204 1.84998 7.49998C1.84998 6.10612 2.35407 4.83128 3.19049 3.8459C3.36919 3.63538 3.34339 3.31985 3.13286 3.14115C2.92234 2.96245 2.60681 2.98825 2.42811 3.19877C1.44405 4.35808 0.849976 5.86029 0.849976 7.49998C0.849976 11.1727 3.82728 14.15 7.49998 14.15C11.1727 14.15 14.15 11.1727 14.15 7.49998C14.15 3.82728 11.1727 0.849976 7.49998 0.849976ZM6.74049 8.08072L4.22363 4.57237C4.15231 4.47295 4.16346 4.33652 4.24998 4.25C4.33649 4.16348 4.47293 4.15233 4.57234 4.22365L8.08069 6.74051C8.56227 7.08599 8.61906 7.78091 8.19998 8.2C7.78089 8.61909 7.08597 8.56229 6.74049 8.08072Z fillcurrentColor fill-ruleevenodd clip-ruleevenodd>/path>/svg>p>4 min read/p>/div>/div>/article>/div>div classcontainer mx-auto px-2 max-w-7xl relative py-10>div data-orientationhorizontal rolenone data-slotseparator classshrink-0 data-orientationhorizontal:h-px data-orientationhorizontal:w-full data-orientationvertical:h-full data-orientationvertical:w-px bg-black>/div>div data-orientationhorizontal rolenone data-slotseparator classshrink-0 data-orientationhorizontal:h-px data-orientationhorizontal:w-full data-orientationvertical:h-full data-orientationvertical:w-px bg-black>/div>div data-orientationhorizontal rolenone data-slotseparator classshrink-0 data-orientationhorizontal:h-px data-orientationhorizontal:w-full data-orientationvertical:h-full data-orientationvertical:w-px bg-black>/div>/div>/div>div classflex-1 flex flex-col content-center items-center pt-5 sm:pb-5 bg-stone-600/40>h1 classtext-3xl font-bold pb-10>Find out more/h1>div classcontainer mx-auto px-2 max-w-7xl relative flex flex-col lg:flex-row gap-5 items-stretch>div classflex-1>/div>div data-slotcard classtext-card-foreground flex flex-col gap-6 rounded-xl py-6 flex-1 my-5 shadow-md shadow-black/80 bg-neutral-300 border-black border-2>div data-slotcard-header class@container/card-header grid auto-rows-min grid-rows-auto_auto items-start gap-1.5 px-6 has-data-slotcard-action:grid-cols-1fr_auto .border-b:pb-6>div classflex flex-row items-center>div data-slotcard-title classleading-none font-semibold flex-1>Github Repositories/div>svg width15 height15 viewBox0 0 15 15 fillnone xmlnshttp://www.w3.org/2000/svg classsize-5>path dM7.49933 0.25C3.49635 0.25 0.25 3.49593 0.25 7.50024C0.25 10.703 2.32715 13.4206 5.2081 14.3797C5.57084 14.446 5.70302 14.2222 5.70302 14.0299C5.70302 13.8576 5.69679 13.4019 5.69323 12.797C3.67661 13.235 3.25112 11.825 3.25112 11.825C2.92132 10.9874 2.44599 10.7644 2.44599 10.7644C1.78773 10.3149 2.49584 10.3238 2.49584 10.3238C3.22353 10.375 3.60629 11.0711 3.60629 11.0711C4.25298 12.1788 5.30335 11.8588 5.71638 11.6732C5.78225 11.205 5.96962 10.8854 6.17658 10.7043C4.56675 10.5209 2.87415 9.89918 2.87415 7.12104C2.87415 6.32925 3.15677 5.68257 3.62053 5.17563C3.54576 4.99226 3.29697 4.25521 3.69174 3.25691C3.69174 3.25691 4.30015 3.06196 5.68522 3.99973C6.26337 3.83906 6.8838 3.75895 7.50022 3.75583C8.1162 3.75895 8.73619 3.83906 9.31523 3.99973C10.6994 3.06196 11.3069 3.25691 11.3069 3.25691C11.7026 4.25521 11.4538 4.99226 11.3795 5.17563C11.8441 5.68257 12.1245 6.32925 12.1245 7.12104C12.1245 9.9063 10.4292 10.5192 8.81452 10.6985C9.07444 10.9224 9.30633 11.3648 9.30633 12.0413C9.30633 13.0102 9.29742 13.7922 9.29742 14.0299C9.29742 14.2239 9.42828 14.4496 9.79591 14.3788C12.6746 13.4179 14.75 10.7025 14.75 7.50024C14.75 3.49593 11.5036 0.25 7.49933 0.25Z fillcurrentColor fill-ruleevenodd clip-ruleevenodd>/path>/svg>/div>/div>div data-slotcard-content classpx-6 flex-1 text-stone-500>p class>Explore Chris's projects and contributions on Github./p>/div>div data-slotcard-footer classflex items-center px-6 .border-t:pt-6>a target_blank classhover:underline flex flex-row items-center text-blue-600 font-semibold hrefhttps://github.com/christogav>Learn moresvg width15 height15 viewBox0 0 15 15 fillnone xmlnshttp://www.w3.org/2000/svg classml-2>path dM3 2C2.44772 2 2 2.44772 2 3V12C2 12.5523 2.44772 13 3 13H12C12.5523 13 13 12.5523 13 12V8.5C13 8.22386 12.7761 8 12.5 8C12.2239 8 12 8.22386 12 8.5V12H3V3L6.5 3C6.77614 3 7 2.77614 7 2.5C7 2.22386 6.77614 2 6.5 2H3ZM12.8536 2.14645C12.9015 2.19439 12.9377 2.24964 12.9621 2.30861C12.9861 2.36669 12.9996 2.4303 13 2.497L13 2.5V2.50049V5.5C13 5.77614 12.7761 6 12.5 6C12.2239 6 12 5.77614 12 5.5V3.70711L6.85355 8.85355C6.65829 9.04882 6.34171 9.04882 6.14645 8.85355C5.95118 8.65829 5.95118 8.34171 6.14645 8.14645L11.2929 3H9.5C9.22386 3 9 2.77614 9 2.5C9 2.22386 9.22386 2 9.5 2H12.4999H12.5C12.5678 2 12.6324 2.01349 12.6914 2.03794C12.7504 2.06234 12.8056 2.09851 12.8536 2.14645Z fillcurrentColor fill-ruleevenodd clip-ruleevenodd>/path>/svg>/a>/div>/div>img altChris Gavin loadinglazy width150 height150 decodingasync data-nimg1 classsize-2/3 sm:size-1/5 mx-auto aspect-auto self-center stylecolor:transparent srcSet/cdn-cgi/image/width256/chris-lego-desk.png 1x, /cdn-cgi/image/width384/chris-lego-desk.png 2x src/cdn-cgi/image/width384/chris-lego-desk.png/>div data-slotcard classtext-card-foreground flex flex-col gap-6 rounded-xl py-6 flex-1 my-5 shadow-md shadow-black/80 bg-neutral-300 border-black border-2>div data-slotcard-header class@container/card-header grid auto-rows-min grid-rows-auto_auto items-start gap-1.5 px-6 has-data-slotcard-action:grid-cols-1fr_auto .border-b:pb-6>div classflex flex-row items-center>div data-slotcard-title classleading-none font-semibold flex-1>Professional/div>svg width15 height15 viewBox0 0 15 15 fillnone xmlnshttp://www.w3.org/2000/svg classsize-5>path dM2 1C1.44772 1 1 1.44772 1 2V13C1 13.5523 1.44772 14 2 14H13C13.5523 14 14 13.5523 14 13V2C14 1.44772 13.5523 1 13 1H2ZM3.05 6H4.95V12H3.05V6ZM5.075 4.005C5.075 4.59871 4.59371 5.08 4 5.08C3.4063 5.08 2.925 4.59871 2.925 4.005C2.925 3.41129 3.4063 2.93 4 2.93C4.59371 2.93 5.075 3.41129 5.075 4.005ZM12 8.35713C12 6.55208 10.8334 5.85033 9.67449 5.85033C9.29502 5.83163 8.91721 5.91119 8.57874 6.08107C8.32172 6.21007 8.05265 6.50523 7.84516 7.01853H7.79179V6.00044H6V12.0047H7.90616V8.8112C7.8786 8.48413 7.98327 8.06142 8.19741 7.80987C8.41156 7.55832 8.71789 7.49825 8.95015 7.46774H9.02258C9.62874 7.46774 10.0786 7.84301 10.0786 8.78868V12.0047H11.9847L12 8.35713Z fillcurrentColor fill-ruleevenodd clip-ruleevenodd>/path>/svg>/div>/div>div data-slotcard-content classpx-6 flex-1 text-stone-500>p>My professional career, where I've worked and a bit about what I did there./p>/div>div data-slotcard-footer classflex items-center px-6 .border-t:pt-6>a target_blank classhover:underline flex flex-row items-center text-blue-600 font-semibold hrefhttps://www.linkedin.com/in/chrisgavin/>Learn moresvg width15 height15 viewBox0 0 15 15 fillnone xmlnshttp://www.w3.org/2000/svg classml-2>path dM3 2C2.44772 2 2 2.44772 2 3V12C2 12.5523 2.44772 13 3 13H12C12.5523 13 13 12.5523 13 12V8.5C13 8.22386 12.7761 8 12.5 8C12.2239 8 12 8.22386 12 8.5V12H3V3L6.5 3C6.77614 3 7 2.77614 7 2.5C7 2.22386 6.77614 2 6.5 2H3ZM12.8536 2.14645C12.9015 2.19439 12.9377 2.24964 12.9621 2.30861C12.9861 2.36669 12.9996 2.4303 13 2.497L13 2.5V2.50049V5.5C13 5.77614 12.7761 6 12.5 6C12.2239 6 12 5.77614 12 5.5V3.70711L6.85355 8.85355C6.65829 9.04882 6.34171 9.04882 6.14645 8.85355C5.95118 8.65829 5.95118 8.34171 6.14645 8.14645L11.2929 3H9.5C9.22386 3 9 2.77614 9 2.5C9 2.22386 9.22386 2 9.5 2H12.4999H12.5C12.5678 2 12.6324 2.01349 12.6914 2.03794C12.7504 2.06234 12.8056 2.09851 12.8536 2.14645Z fillcurrentColor fill-ruleevenodd clip-ruleevenodd>/path>/svg>/a>/div>/div>div classflex-1>/div>/div>/div>div classbg-white flex-1>div classcontainer mx-auto px-2 max-w-7xl relative pt-10>div data-orientationhorizontal rolenone data-slotseparator classshrink-0 data-orientationhorizontal:h-px data-orientationhorizontal:w-full data-orientationvertical:h-full data-orientationvertical:w-px bg-black>/div>div data-orientationhorizontal rolenone data-slotseparator classshrink-0 data-orientationhorizontal:h-px data-orientationhorizontal:w-full data-orientationvertical:h-full data-orientationvertical:w-px bg-black>/div>div data-orientationhorizontal rolenone data-slotseparator classshrink-0 data-orientationhorizontal:h-px data-orientationhorizontal:w-full data-orientationvertical:h-full data-orientationvertical:w-px bg-black>/div>div classpt-5 flex flex-row content-center items-center text-foreground>h1 classfont-bold text-2xl mr-5>Older posts/h1>p>Filter by: /p>button data-slotdropdown-menu-trigger classinline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 &_svg:pointer-events-none &_svg:not(class*'size-'):size-4 shrink-0 &_svg:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-3px aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive underline-offset-4 hover:underline h-9 px-4 py-2 has->svg:px-3 text-foreground typebutton idradix-«R731qnb» aria-haspopupmenu aria-expandedfalse data-stateclosed>All/button>/div>/div>div classcontainer mx-auto px-2 py-8 max-w-7xl columns-1 md:columns-2 md:gap-15 pb-20 relative>/div>/div>/main>footer classbg-primary text-primary-foreground p-4 border-b-zinc-950/10 border-b-1 flex sm:px-10 py-4 relative>div classcontainer mx-auto px-2 max-w-7xl text-gray columns sm:flex>img altChris Gavin loadinglazy width100 height50 decodingasync data-nimg1 classabsolute -top-64px overflow-visible stylecolor:transparent srcSet/cdn-cgi/image/width128/chris-lego-peeking.png 1x, /cdn-cgi/image/width256/chris-lego-peeking.png 2x src/cdn-cgi/image/width256/chris-lego-peeking.png/>p classmr-3>© 2025-present Chris Gavin. All Rights Reserved./p>div classgrow>/div>div classflex items-center pt-5 sm:pt-0>a classmr-6 transition-transform duration-200 ease-in-out hover:scale-140 active:scale-80 target_blank hrefhttps://github.com/christogav>svg width15 height15 viewBox0 0 15 15 fillnone xmlnshttp://www.w3.org/2000/svg>path dM7.49933 0.25C3.49635 0.25 0.25 3.49593 0.25 7.50024C0.25 10.703 2.32715 13.4206 5.2081 14.3797C5.57084 14.446 5.70302 14.2222 5.70302 14.0299C5.70302 13.8576 5.69679 13.4019 5.69323 12.797C3.67661 13.235 3.25112 11.825 3.25112 11.825C2.92132 10.9874 2.44599 10.7644 2.44599 10.7644C1.78773 10.3149 2.49584 10.3238 2.49584 10.3238C3.22353 10.375 3.60629 11.0711 3.60629 11.0711C4.25298 12.1788 5.30335 11.8588 5.71638 11.6732C5.78225 11.205 5.96962 10.8854 6.17658 10.7043C4.56675 10.5209 2.87415 9.89918 2.87415 7.12104C2.87415 6.32925 3.15677 5.68257 3.62053 5.17563C3.54576 4.99226 3.29697 4.25521 3.69174 3.25691C3.69174 3.25691 4.30015 3.06196 5.68522 3.99973C6.26337 3.83906 6.8838 3.75895 7.50022 3.75583C8.1162 3.75895 8.73619 3.83906 9.31523 3.99973C10.6994 3.06196 11.3069 3.25691 11.3069 3.25691C11.7026 4.25521 11.4538 4.99226 11.3795 5.17563C11.8441 5.68257 12.1245 6.32925 12.1245 7.12104C12.1245 9.9063 10.4292 10.5192 8.81452 10.6985C9.07444 10.9224 9.30633 11.3648 9.30633 12.0413C9.30633 13.0102 9.29742 13.7922 9.29742 14.0299C9.29742 14.2239 9.42828 14.4496 9.79591 14.3788C12.6746 13.4179 14.75 10.7025 14.75 7.50024C14.75 3.49593 11.5036 0.25 7.49933 0.25Z fillcurrentColor fill-ruleevenodd clip-ruleevenodd>/path>/svg>/a>a classmr-6 transition-transform duration-200 ease-in-out hover:scale-140 active:scale-80 target_blank hrefhttps://www.linkedin.com/in/chris-gavin-91388b28/>svg width15 height15 viewBox0 0 15 15 fillnone xmlnshttp://www.w3.org/2000/svg>path dM2 1C1.44772 1 1 1.44772 1 2V13C1 13.5523 1.44772 14 2 14H13C13.5523 14 14 13.5523 14 13V2C14 1.44772 13.5523 1 13 1H2ZM3.05 6H4.95V12H3.05V6ZM5.075 4.005C5.075 4.59871 4.59371 5.08 4 5.08C3.4063 5.08 2.925 4.59871 2.925 4.005C2.925 3.41129 3.4063 2.93 4 2.93C4.59371 2.93 5.075 3.41129 5.075 4.005ZM12 8.35713C12 6.55208 10.8334 5.85033 9.67449 5.85033C9.29502 5.83163 8.91721 5.91119 8.57874 6.08107C8.32172 6.21007 8.05265 6.50523 7.84516 7.01853H7.79179V6.00044H6V12.0047H7.90616V8.8112C7.8786 8.48413 7.98327 8.06142 8.19741 7.80987C8.41156 7.55832 8.71789 7.49825 8.95015 7.46774H9.02258C9.62874 7.46774 10.0786 7.84301 10.0786 8.78868V12.0047H11.9847L12 8.35713Z fillcurrentColor fill-ruleevenodd clip-ruleevenodd>/path>/svg>/a>/div>/div>/footer>script defer srchttps://static.cloudflareinsights.com/beacon.min.js data-cf-beacon{"token": "bf2226f90625430bac1db865565948c3"}>/script>script src/_next/static/chunks/webpack-7f3a97f87ff505ad.js async>/script>script>(self.__next_fself.__next_f||).push(0)/script>script>self.__next_f.push(1,1:\$Sreact.fragment\\n2:I2979,,\\\n3:I5391,,\\\n6:I625,,\OutletBoundary\\n9:I625,,\ViewportBoundary\\nb:I625,,\MetadataBoundary\\nd:I3238,,\\\n:HL\/_next/static/media/93f479601ee12b01-s.p.woff2\,\font\,{\crossOrigin\:\\,\type\:\font/woff2\}\n:HL\/_next/static/media/9d5a263311222317-s.p.woff2\,\font\,{\crossOrigin\:\\,\type\:\font/woff2\}\n:HL\/_next/static/css/11a346bd84c2e1db.css\,\style\\n:HL\/_next/static/css/062c6f53f13267f6.css\,\style\\n)/script>script>self.__next_f.push(1,0:{\P\:null,\b\:\SH5S6wgEvYUW5EOu7SSPJ\,\p\:\\,\c\:\\,\\,\i\:false,\f\:\\,{\children\:\(site)\,{\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\:\(site)\,\$\,\$1\,\c\,{\children\:\$\,\link\,\0\,{\rel\:\stylesheet\,\href\:\/_next/static/css/11a346bd84c2e1db.css\,\precedence\:\next\,\crossOrigin\:\$undefined\,\nonce\:\$undefined\},\$\,\link\,\1\,{\rel\:\stylesheet\,\href\:\/_next/static/css/062c6f53f13267f6.css\,\precedence\:\next\,\crossOrigin\:\$undefined\,\nonce\:\$undefined\},\$L4\},{\children\:\__PAGE__\,\$\,\$1\,\c\,{\children\:\$L5\,\$undefined\,null,\$\,\$L6\,null,{\children\:\$L7\,\$L8\,null}},{},null,false},null,false},null,false,\$\,\$1\,\h\,{\children\:null,\$\,\$1\,\hP6mi_VQWJic8tTUYqRkO\,{\children\:\$\,\$L9\,null,{\children\:\$La\},\$\,\meta\,null,{\name\:\next-size-adjust\,\content\:\\}},\$\,\$Lb\,null,{\children\:\$Lc\}},false,\m\:\$undefined\,\G\:\$d\,\$undefined\,\s\:false,\S\:true}\n4:\$\,\html\,null,{\lang\:\en\,\className\:\__variable_a4bae9 __variable_9a8899 scroll-pt-15 scroll-smooth bg-primary\,\children\:\$\,\body\,null,{\className\:\flex flex-col overflow-auto min-h-100dvh\,\children\:\$Le\,\$\,\main\,null,{\className\:\flex-1 flex flex-col bg-primary text-primary-foreground\,\children\:\$\,\$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\:\$0:f:0:1:1:props:children:1:props:notFound:0:1:props:style\,\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\:\$0:f:0:1:1:props:children:1:props:notFound:0:1:props:children:props:children:1:props:style\,\children\:404},\$\,\div\,null,{\style\:\$0:f:0:1:1:props:children:1:props:notFound:0:1:props:children:props:children:2:props:style\,\children\:\$\,\h2\,null,{\style\:\$0:f:0:1:1:props:children:1:props:notFound:0:1:props:children:props:children:2:props:children:props:style\,\children\:\This page could not be found.\}}}},,\forbidden\:\$undefined\,\unauthorized\:\$undefined\}},\$Lf\,\$\,\script\,null,{\defer\:true,\src\:\https://static.cloudflareinsights.com/beacon.min.js\,\data-cf-beacon\:\{\\\token\\\: \\\bf2226f906)/script>script>self.__next_f.push(1,25430bac1db865565948c3\\\}\}}}\n)/script>script>self.__next_f.push(1,10:I4583,\78\,\static/chunks/2d633d72-a58f155fdb92da19.js\,\966\,\static/chunks/966-5eda3e28bb8654a7.js\,\978\,\static/chunks/978-3e912a4dd7964a2a.js\,\100\,\static/chunks/100-721cf1a2c5848fe9.js\,\13\,\static/chunks/app/(site)/page-65c794d61a0b675f.js\,\Image\\n11:I4970,\78\,\static/chunks/2d633d72-a58f155fdb92da19.js\,\966\,\static/chunks/966-5eda3e28bb8654a7.js\,\978\,\static/chunks/978-3e912a4dd7964a2a.js\,\100\,\static/chunks/100-721cf1a2c5848fe9.js\,\13\,\static/chunks/app/(site)/page-65c794d61a0b675f.js\,\\\n12:T49a,M7.49933 0.25C3.49635 0.25 0.25 3.49593 0.25 7.50024C0.25 10.703 2.32715 13.4206 5.2081 14.3797C5.57084 14.446 5.70302 14.2222 5.70302 14.0299C5.70302 13.8576 5.69679 13.4019 5.69323 12.797C3.67661 13.235 3.25112 11.825 3.25112 11.825C2.92132 10.9874 2.44599 10.7644 2.44599 10.7644C1.78773 10.3149 2.49584 10.3238 2.49584 10.3238C3.22353 10.375 3.60629 11.0711 3.60629 11.0711C4.25298 12.1788 5.30335 11.8588 5.71638 11.6732C5.78225 11.205 5.96962 10.8854 6.17658 10.7043C4.56675 10.5209 2.87415 9.89918 2.87415 7.12104C2.87415 6.32925 3.15677 5.68257 3.62053 5.17563C3.54576 4.99226 3.29697 4.25521 3.69174 3.25691C3.69174 3.25691 4.30015 3.06196 5.68522 3.99973C6.26337 3.83906 6.8838 3.75895 7.50022 3.75583C8.1162 3.75895 8.73619 3.83906 9.31523 3.99973C10.6994 3.06196 11.3069 3.25691 11.3069 3.25691C11.7026 4.25521 11.4538 4.99226 11.3795 5.17563C11.8441 5.68257 12.1245 6.32925 12.1245 7.12104C12.1245 9.9063 10.4292 10.5192 8.81452 10.6985C9.07444 10.9224 9.30633 11.3648 9.30633 12.0413C9.30633 13.0102 9.29742 13.7922 9.29742 14.0299C9.29742 14.2239 9.42828 14.4496 9.79591 14.3788C12.6746 13.4179 14.75 10.7025 14.75 7.50024C14.75 3.49593 11.5036 0.25 7.49933 0.25Zf:\$\,\footer\,null,{\className\:\bg-primary text-primary-foreground p-4 border-b-zinc-950/10 border-b-1 flex sm:px-10 py-4 relative\,\children\:\$\,\div\,null,{\className\:\container mx-auto px-2 max-w-7xl text-gray columns sm:flex\,\children\:\$\,\$L10\,null,{\src\:\/chris-lego-peeking.png\,\alt\:\Chris Gavin\,\width\:100,\height\:50,\className\:\absolute -top-64px overflow-visible\},\$\,\p\,null,{\className\:\mr-3\,\children\:\© 2025-present Chris Gavin. All Rights Reserved.\},\$\,\div\,null,{\className\:\grow\},\$\,\div\,null,{\className\:\flex items-center pt-5 sm:pt-0\,\children\:false,\$\,\$L11\,null,{\href\:\https://github.com/christogav\,\className\:\mr-6 transition-transform duration-200 ease-in-out hover:scale-140 active:scale-80\,\target\:\_blank\,\children\:\$\,\svg\,null,{\width\:\15\,\height\:\15\,\viewBox\:\0 0 15 15\,\fill\:\none\,\xmlns\:\http://www.w3.org/2000/svg\,\ref\:\$undefined\,\children\:\$\,\path\,null,{\d\:\$12\,\fill\:\currentColor\,\fillRule\:\evenodd\,\clipRule\:\evenodd\}}},\$\,\$L11\,null,{\href\:\https://www.linkedin.com/in/chris-gavin-91388b28/\,\className\:\mr-6 transition-transform duration-200 ease-in-out hover:scale-140 active:scale-80\,\target\:\_blank\,\children\:\$\,\svg\,null,{\width\:\15\,\height\:\15\,\viewBox\:\0 0 15 15\,\fill\:\none\,\xmlns\:\http://www.w3.org/2000/svg\,\ref\:\$undefined\,\children\:\$\,\path\,null,{\d\:\M2 1C1.44772 1 1 1.44772 1 2V13C1 13.5523 1.44772 14 2 14H13C13.5523 14 14 13.5523 14 13V2C14 1.44772 13.5523 1 13 1H2ZM3.05 6H4.95V12H3.05V6ZM5.075 4.005C5.075 4.59871 4.59371 5.08 4 5.08C3.4063 5.08 2.925 4.59871 2.925 4.005C2.925 3.41129 3.4063 2.93 4 2.93C4.59371 2.93 5.075 3.41129 5.075 4.005ZM12 8.35713C12 6.55208 10.8334 5.85033 9.67449 5.85033C9.29502 5.83163 8.91721 5.91119 8.57874 6.08107C8.32172 6.21007 8.05265 6.50523 7.84516 7.01853H7.79179V6.00044H6V12.0047H7.90616V8.8112C7.8786 8.48413 7.98327 8.06142 8.19741 7.80987C8.41156 7.55832 8.71789 7.49825 8.95015 7.46774H9.02258C9.62874 7.46774 10.0786 7.84301 10.0786 8.78868V12.0047H11.9847L12 8.35713Z\,\fill\:\currentColor\,\fillRule\:\evenodd\,\clipRule\:\evenodd\}}}}}}\n)/script>script>self.__next_f.push(1,13:I296,\78\,\static/chunks/2d633d72-a58f155fdb92da19.js\,\966\,\static/chunks/966-5eda3e28bb8654a7.js\,\978\,\static/chunks/978-3e912a4dd7964a2a.js\,\100\,\static/chunks/100-721cf1a2c5848fe9.js\,\13\,\static/chunks/app/(site)/page-65c794d61a0b675f.js\,\HomeHighlightPosts\\n14:I6430,\78\,\static/chunks/2d633d72-a58f155fdb92da19.js\,\966\,\static/chunks/966-5eda3e28bb8654a7.js\,\978\,\static/chunks/978-3e912a4dd7964a2a.js\,\100\,\static/chunks/100-721cf1a2c5848fe9.js\,\13\,\static/chunks/app/(site)/page-65c794d61a0b675f.js\,\Separator\\n16:I931,\78\,\static/chunks/2d633d72-a58f155fdb92da19.js\,\966\,\static/chunks/966-5eda3e28bb8654a7.js\,\978\,\static/chunks/978-3e912a4dd7964a2a.js\,\100\,\static/chunks/100-721cf1a2c5848fe9.js\,\13\,\static/chunks/app/(site)/page-65c794d61a0b675f.js\,\HomeOldPosts\\n15:T49a,M7.49933 0.25C3.49635 0.25 0.25 3.49593 0.25 7.50024C0.25 10.703 2.32715 13.4206 5.2081 14.3797C5.57084 14.446 5.70302 14.2222 5.70302 14.0299C5.70302 13.8576 5.69679 13.4019 5.69323 12.797C3.67661 13.235 3.25112 11.825 3.25112 11.825C2.92132 10.9874 2.44599 10.7644 2.44599 10.7644C1.78773 10.3149 2.49584 10.3238 2.49584 10.3238C3.22353 10.375 3.60629 11.0711 3.60629 11.0711C4.25298 12.1788 5.30335 11.8588 5.71638 11.6732C5.78225 11.205 5.96962 10.8854 6.17658 10.7043C4.56675 10.5209 2.87415 9.89918 2.87415 7.12104C2.87415 6.32925 3.15677 5.68257 3.62053 5.17563C3.54576 4.99226 3.29697 4.25521 3.69174 3.25691C3.69174 3.25691 4.30015 3.06196 5.68522 3.99973C6.26337 3.83906 6.8838 3.75895 7.50022 3.75583C8.1162 3.75895 8.73619 3.83906 9.31523 3.99973C10.6994 3.06196 11.3069 3.25691 11.3069 3.25691C11.7026 4.25521 11.4538 4.99226 11.3795 5.17563C11.8441 5.68257 12.1245 6.32925 12.1245 7.12104C12.1245 9.9063 10.4292 10.5192 8.81452 10.6985C9.07444 10.9224 9.30633 11.3648 9.30633 12.0413C9.30633 13.0102 9.29742 13.7922 9.29742 14.0299C9.29742 14.2239 9.42828 14.4496 9.79591 14.3788C12.6746 13.4179 14.75 10.7025 14.75 7.50024C14.75 3.49593 11.5036 0.25 7.49933 0.25Z)/script>script>self.__next_f.push(1,5:\$\,\div\,null,{\className\:\container mx-auto px-2 py-2 sm:max-w-7xl sm:flex flex-row-reverse items-center relative overflow-visible\,\children\:\$\,\div\,null,{\className\:\hidden sm:block w-1/4 justify-center\,\children\:\$\,\$L10\,null,{\src\:\/chris-lego-smiling.png\,\alt\:\Chris Gavin\,\width\:120,\height\:120}},\$\,\div\,null,{\className\:\w-full sm:w-3/4 px-4 px-auto sm:pl-20 pb-10 sm:pb-0\,\children\:\$\,\h1\,null,{\className\:\text-3xl sm:text-5xl text-shadow-lg font-bold\,\children\:\Chris Gavins Dev Blog\},\$\,\p\,null,{\className\:\text-xs sm:text-base color-muted-foreground\,\children\:\Technology, personal development and more...\}},\$\,\$L10\,null,{\src\:\/chris-lego-peeking.png\,\alt\:\Chris Gavin\,\width\:100,\height\:50,\className\:\sm:hidden absolute right-5 bottom--5px overflow-visible\}},\$\,\div\,null,{\className\:\bg-white flex-1\,\children\:\$\,\$L13\,null,{\posts\:{\slug\:\mdx-in-nextjs\,\metadata\:{\title\:\MDX to render markdown in Next.js\,\description\:\A practical, production-ready guide to rendering Markdown with MDX in Next.js.\,\image\:\/blog-building-hero.png\,\date\:\2025-07-15\,\tags\:\blog\,\nextjs\,\mdx\,\draft\:true,\readingTime\:{\text\:\3 min read\,\minutes\:2.695,\time\:161700,\words\:539},\headings\:{\depth\:2,\value\:\Why MDX for a Next.js blog/docs site?\,\slug\:\why-mdx-for-a-nextjs-blogdocs-site\,\children\:},{\depth\:2,\value\:\The three common approaches (pick one)\,\slug\:\the-three-common-approaches-pick-one\,\children\:},{\depth\:2,\value\:\Directory shape\,\slug\:\directory-shape\,\children\:},{\depth\:2,\value\:\Step 1 — Install the pieces\,\slug\:\step-1--install-the-pieces\,\children\:},{\depth\:2,\value\:\Step 2 — Wire up @next/mdx in next.config.mjs\,\slug\:\step-2--wire-up-nextmdx-in-nextconfigmjs\,\children\:},{\depth\:2,\value\:\Step 3 — Author an MDX post with frontmatter\,\slug\:\step-3--author-an-mdx-post-with-frontmatter\,\children\:},{\depth\:2,\value\:\Step 4 — Server‑only MDX components mapping\,\slug\:\step-4--serveronly-mdx-components-mapping\,\children\:},\headingRefs\:\why-mdx-for-a-nextjs-blogdocs-site\,\the-three-common-approaches-pick-one\,\directory-shape\,\step-1--install-the-pieces\,\step-2--wire-up-nextmdx-in-nextconfigmjs\,\step-3--author-an-mdx-post-with-frontmatter\,\step-4--serveronly-mdx-components-mapping\},\hero\:{\src\:\/_next/static/media/blog-building-hero.141dda18.png\,\height\:1024,\width\:1536,\blurDataURL\:\data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAMAAABPT11nAAAARVBMVEUFGkExEkM+HSgzOWYPESYrFC8DCiIGHE0OJGYbEi8EGjhCT3xMN0gDLolpf5EWKW5jYI4gHDmPmMszJ0OGiqMUPJ7+///ttqsPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAMUlEQVR4nAXBBwLAIAgAsXMCQod2/P+pJgiUu9SOjn7+b2scgi+3xKeXqOUEz7SIXDcdIAFa5CdxIAAAAABJRU5ErkJggg\,\blurWidth\:8,\blurHeight\:5}},{\slug\:\temporal-data-management\,\metadata\:{\title\:\Managing State in Temporal\,\description\:\Temporal is a powerful tool for managing state in distributed systems. This post explores how to effectively use Temporal to handle complex workflows and state management challenges.\,\image\:\/temporal-data-management-hero.png\,\date\:\2025-07-10\,\tags\:\temporal\,\state management\,\workflows\,\draft\:true,\readingTime\:{\text\:\0 min read\,\minutes\:0,\time\:0,\words\:0},\headings\:,\headingRefs\:},\hero\:{\src\:\/_next/static/media/temporal-data-management-hero.a8bf83c8.png\,\height\:1024,\width\:1536,\blurDataURL\:\data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAMAAABPT11nAAAAPFBMVEUWEXJJR9keOakuLsQwKqopLLdnYuwXEWQYHXwbHpI3MawbHp5SYe4uX9gtRdMsH5UYGohKM8RGKJ5tNq2FiaI5AAAACXBIWXMAAAsTAAALEwEAmpwYAAAALklEQVR4nAXBhwHAIAzAMBMyu1j//1qJBNhnkVWXWutIN3eTyfvdqpXB0wZExA8YUQEUEXvDzgAAAABJRU5ErkJggg\,\blurWidth\:8,\blurHeight\:5}},{\slug\:\beam-spanner-changestreams\,\metadata\:{\title\:\Apache Beam, Spanner Change Streams in Go\,\description\:\Apache Beam is a solid ETL framework however the Go SDK needs some work. I decided to implement Google Spanner ChangeStream in the Go SDK.\,\image\:\/blog-building-hero.png\,\date\:\2025-07-05\)/script>script>self.__next_f.push(1,,\tags\:\etl\,\beam\,\data\,\draft\:true,\readingTime\:{\text\:\0 min read\,\minutes\:0,\time\:0,\words\:0},\headings\:,\headingRefs\:},\hero\:\$5:1:props:children:0:props:posts:0:hero\},{\slug\:\nextjs-on-cloudflare\,\metadata\:{\title\:\Hosting Next.js on Cloudflare\,\description\:\Hosting Next.js on Cloudflare is cheap, performant and easy to setup. Read on and find out how.\,\image\:\/nextjs-on-cloudflare-hero.png\,\date\:\2025-06-25\,\tags\:\hosting\,\nextjs\,\cloudflare\,\readingTime\:{\text\:\6 min read\,\minutes\:5.98,\time\:358800,\words\:1196},\headings\:{\depth\:1,\value\:\Hosting Next.js on Cloudflare in 2025\,\slug\:\hosting-nextjs-on-cloudflare-in-2025\,\children\:{\depth\:2,\value\:\Why Cloudflare for Next.js?\,\slug\:\why-cloudflare-for-nextjs\,\children\:},{\depth\:2,\value\:\Decision guide\,\slug\:\decision-guide\,\children\:},{\depth\:2,\value\:\Prerequisites\,\slug\:\prerequisites\,\children\:},{\depth\:2,\value\:\Path A — Next.js on Cloudflare Workers (recommended)\,\slug\:\path-a--nextjs-on-cloudflare-workers-recommended\,\children\:},{\depth\:2,\value\:\Path B — Next.js on Cloudflare Pages (Edge runtime)\,\slug\:\path-b--nextjs-on-cloudflare-pages-edge-runtime\,\children\:},{\depth\:2,\value\:\Image optimization the Cloudflare way\,\slug\:\image-optimization-the-cloudflare-way\,\children\:},{\depth\:2,\value\:\Caching \u0026 data revalidation\,\slug\:\caching--data-revalidation\,\children\:},{\depth\:2,\value\:\Storage \u0026 platform bindings\,\slug\:\storage--platform-bindings\,\children\:},{\depth\:2,\value\:\CI/CD options\,\slug\:\cicd-options\,\children\:},{\depth\:2,\value\:\Monitoring \u0026 analytics\,\slug\:\monitoring--analytics\,\children\:},{\depth\:2,\value\:\Common pitfalls \u0026 fixes\,\slug\:\common-pitfalls--fixes\,\children\:},{\depth\:2,\value\:\Cheatsheet\,\slug\:\cheatsheet\,\children\:},{\depth\:2,\value\:\Appendix: minimal templates\,\slug\:\appendix-minimal-templates\,\children\:}},\headingRefs\:\hosting-nextjs-on-cloudflare-in-2025\,\why-cloudflare-for-nextjs\,\decision-guide\,\prerequisites\,\path-a--nextjs-on-cloudflare-workers-recommended\,\path-b--nextjs-on-cloudflare-pages-edge-runtime\,\image-optimization-the-cloudflare-way\,\caching--data-revalidation\,\storage--platform-bindings\,\cicd-options\,\monitoring--analytics\,\common-pitfalls--fixes\,\cheatsheet\,\appendix-minimal-templates\},\hero\:{\src\:\/_next/static/media/nextjs-on-cloudflare-hero.c4a143b5.png\,\height\:1024,\width\:1536,\blurDataURL\:\data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAMAAABPT11nAAAAHlBMVEUCDBoCEB8HIjcAFigTERgLN00THS5NJRYaNUYOLkNa/vE8AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAKElEQVR4nB3GwQ0AMAjDwCQG2v0nrqgfJ8ume1wyyZ1TUiKy4wD6eX0KewBdPBAlfAAAAABJRU5ErkJggg\,\blurWidth\:8,\blurHeight\:5}},{\slug\:\blog-building\,\metadata\:{\title\:\Building a blog in Next.js\,\description\:\Journey into building a modern blog with Next.js and MDX. Explore how code, content, and creativity come together to craft a dynamic, developer-friendly publishing platform.\,\image\:\/blog-building-hero.png\,\date\:\2025-06-15\,\tags\:\blog\,\nextjs\,\web\,\readingTime\:{\text\:\8 min read\,\minutes\:7.91,\time\:474600,\words\:1582},\headings\:{\depth\:2,\value\:\Setting goals\,\slug\:\setting-goals\,\children\:},{\depth\:2,\value\:\Choosing the right framework\,\slug\:\choosing-the-right-framework\,\children\:},{\depth\:2,\value\:\Project setup \u0026 structure\,\slug\:\project-setup--structure\,\children\:{\depth\:3,\value\:\Posts in MDX\,\slug\:\posts-in-mdx\,\children\:},{\depth\:3,\value\:\Routing \u0026 slugs\,\slug\:\routing--slugs\,\children\:},{\depth\:3,\value\:\Tooling\,\slug\:\tooling\,\children\:}},{\depth\:2,\value\:\Whats next?\,\slug\:\whats-next\,\children\:},\headingRefs\:\setting-goals\,\choosing-the-right-framework\,\project-setup--structure\,\posts-in-mdx\,\routing--slugs\,\tooling\,\whats-next\},\hero\:\$5:1:props:children:0:props:posts:0:hero\},{\slug\:\intro\,\metadata\:{\title\:\Starting a blog\,\description\:\Why I started a blog, my thought process in how )/script>script>self.__next_f.push(1,to approach writing articles and some of the content I will share.\,\image\:\/intro-hero.png\,\date\:\2025-06-01\,\tags\:\blog\,\readingTime\:{\text\:\4 min read\,\minutes\:3.18,\time\:190800,\words\:636},\headings\:{\depth\:2,\value\:\Why start a blog?\,\slug\:\why-start-a-blog\,\children\:},{\depth\:2,\value\:\Whats the plan?\,\slug\:\whats-the-plan\,\children\:},{\depth\:2,\value\:\What will I write about?\,\slug\:\what-will-i-write-about\,\children\:},{\depth\:2,\value\:\Final thoughts\,\slug\:\final-thoughts\,\children\:},\headingRefs\:\why-start-a-blog\,\whats-the-plan\,\what-will-i-write-about\,\final-thoughts\},\hero\:{\src\:\/_next/static/media/intro-hero.31af4825.png\,\height\:1024,\width\:1536,\blurDataURL\:\data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAMAAABPT11nAAAAPFBMVEXR0dU+Q0l8gIjZ296dnqNXXGTt7e+tsLZGTFMoLjbg5OczOD/HxciHhou+v8UQGyMIJzxGa4V1mbJfeYuW+jW+AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAL0lEQVR4nAXBhwHAIAzAMAcyy+jg/18r4d9rLbLw89wpVXikNJPBRWgwjQ57qeYPHLUBIITGhdYAAAAASUVORK5CYII\,\blurWidth\:8,\blurHeight\:5}}},\$\,\div\,null,{\className\:\container mx-auto px-2 max-w-7xl relative py-10\,\children\:\$\,\$L14\,null,{\className\:\bg-black\},\$\,\$L14\,null,{\className\:\bg-black\},\$\,\$L14\,null,{\className\:\bg-black\}}},\$\,\div\,null,{\className\:\flex-1 flex flex-col content-center items-center pt-5 sm:pb-5 bg-stone-600/40\,\children\:\$\,\h1\,null,{\className\:\text-3xl font-bold pb-10\,\children\:\Find out more\},\$\,\div\,null,{\className\:\container mx-auto px-2 max-w-7xl relative flex flex-col lg:flex-row gap-5 items-stretch\,\children\:\$\,\div\,null,{\className\:\flex-1\},\$\,\div\,null,{\data-slot\:\card\,\className\:\text-card-foreground flex flex-col gap-6 rounded-xl py-6 flex-1 my-5 shadow-md shadow-black/80 bg-neutral-300 border-black border-2\,\children\:\$\,\div\,null,{\data-slot\:\card-header\,\className\:\@container/card-header grid auto-rows-min grid-rows-auto_auto items-start gap-1.5 px-6 has-data-slotcard-action:grid-cols-1fr_auto .border-b:pb-6\,\children\:\$\,\div\,null,{\className\:\flex flex-row items-center\,\children\:\$\,\div\,null,{\data-slot\:\card-title\,\className\:\leading-none font-semibold flex-1\,\children\:\Github Repositories\},\$\,\svg\,null,{\width\:\15\,\height\:\15\,\viewBox\:\0 0 15 15\,\fill\:\none\,\xmlns\:\http://www.w3.org/2000/svg\,\className\:\size-5\,\ref\:\$undefined\,\children\:\$\,\path\,null,{\d\:\$15\,\fill\:\currentColor\,\fillRule\:\evenodd\,\clipRule\:\evenodd\}}}},\$\,\div\,null,{\data-slot\:\card-content\,\className\:\px-6 flex-1 text-stone-500\,\children\:\$\,\p\,null,{\className\:\\,\children\:\Explore Chriss projects and contributions on Github.\}},\$\,\div\,null,{\data-slot\:\card-footer\,\className\:\flex items-center px-6 .border-t:pt-6\,\children\:\$\,\$L11\,null,{\href\:\https://github.com/christogav\,\target\:\_blank\,\className\:\hover:underline flex flex-row items-center text-blue-600 font-semibold\,\children\:\Learn more\,\$\,\svg\,null,{\width\:\15\,\height\:\15\,\viewBox\:\0 0 15 15\,\fill\:\none\,\xmlns\:\http://www.w3.org/2000/svg\,\className\:\ml-2\,\ref\:\$undefined\,\children\:\$\,\path\,null,{\d\:\M3 2C2.44772 2 2 2.44772 2 3V12C2 12.5523 2.44772 13 3 13H12C12.5523 13 13 12.5523 13 12V8.5C13 8.22386 12.7761 8 12.5 8C12.2239 8 12 8.22386 12 8.5V12H3V3L6.5 3C6.77614 3 7 2.77614 7 2.5C7 2.22386 6.77614 2 6.5 2H3ZM12.8536 2.14645C12.9015 2.19439 12.9377 2.24964 12.9621 2.30861C12.9861 2.36669 12.9996 2.4303 13 2.497L13 2.5V2.50049V5.5C13 5.77614 12.7761 6 12.5 6C12.2239 6 12 5.77614 12 5.5V3.70711L6.85355 8.85355C6.65829 9.04882 6.34171 9.04882 6.14645 8.85355C5.95118 8.65829 5.95118 8.34171 6.14645 8.14645L11.2929 3H9.5C9.22386 3 9 2.77614 9 2.5C9 2.22386 9.22386 2 9.5 2H12.4999H12.5C12.5678 2 12.6324 2.01349 12.6914 2.03794C12.7504 2.06234 12.8056 2.09851 12.8536 2.14645Z\,\fill\:\currentColor\,\fillRule\:\evenodd\,\clipRule\:\evenodd\}}}}},\$\,\$L10\,null,{\src\:\/chris-lego-desk.png\,\width\:150,\height\:150,\alt\:\Chris Gavin\,\className\:\)/script>script>self.__next_f.push(1,size-2/3 sm:size-1/5 mx-auto aspect-auto self-center\},\$\,\div\,null,{\data-slot\:\card\,\className\:\text-card-foreground flex flex-col gap-6 rounded-xl py-6 flex-1 my-5 shadow-md shadow-black/80 bg-neutral-300 border-black border-2\,\children\:\$\,\div\,null,{\data-slot\:\card-header\,\className\:\@container/card-header grid auto-rows-min grid-rows-auto_auto items-start gap-1.5 px-6 has-data-slotcard-action:grid-cols-1fr_auto .border-b:pb-6\,\children\:\$\,\div\,null,{\className\:\flex flex-row items-center\,\children\:\$\,\div\,null,{\data-slot\:\card-title\,\className\:\leading-none font-semibold flex-1\,\children\:\Professional\},\$\,\svg\,null,{\width\:\15\,\height\:\15\,\viewBox\:\0 0 15 15\,\fill\:\none\,\xmlns\:\http://www.w3.org/2000/svg\,\className\:\size-5\,\ref\:\$undefined\,\children\:\$\,\path\,null,{\d\:\M2 1C1.44772 1 1 1.44772 1 2V13C1 13.5523 1.44772 14 2 14H13C13.5523 14 14 13.5523 14 13V2C14 1.44772 13.5523 1 13 1H2ZM3.05 6H4.95V12H3.05V6ZM5.075 4.005C5.075 4.59871 4.59371 5.08 4 5.08C3.4063 5.08 2.925 4.59871 2.925 4.005C2.925 3.41129 3.4063 2.93 4 2.93C4.59371 2.93 5.075 3.41129 5.075 4.005ZM12 8.35713C12 6.55208 10.8334 5.85033 9.67449 5.85033C9.29502 5.83163 8.91721 5.91119 8.57874 6.08107C8.32172 6.21007 8.05265 6.50523 7.84516 7.01853H7.79179V6.00044H6V12.0047H7.90616V8.8112C7.8786 8.48413 7.98327 8.06142 8.19741 7.80987C8.41156 7.55832 8.71789 7.49825 8.95015 7.46774H9.02258C9.62874 7.46774 10.0786 7.84301 10.0786 8.78868V12.0047H11.9847L12 8.35713Z\,\fill\:\currentColor\,\fillRule\:\evenodd\,\clipRule\:\evenodd\}}}},\$\,\div\,null,{\data-slot\:\card-content\,\className\:\px-6 flex-1 text-stone-500\,\children\:\$\,\p\,null,{\children\:\My professional career, where Ive worked and a bit about what I did there.\}},\$\,\div\,null,{\data-slot\:\card-footer\,\className\:\flex items-center px-6 .border-t:pt-6\,\children\:\$\,\$L11\,null,{\href\:\https://www.linkedin.com/in/chrisgavin/\,\target\:\_blank\,\className\:\hover:underline flex flex-row items-center text-blue-600 font-semibold\,\children\:\Learn more\,\$\,\svg\,null,{\width\:\15\,\height\:\15\,\viewBox\:\0 0 15 15\,\fill\:\none\,\xmlns\:\http://www.w3.org/2000/svg\,\className\:\ml-2\,\ref\:\$undefined\,\children\:\$\,\path\,null,{\d\:\M3 2C2.44772 2 2 2.44772 2 3V12C2 12.5523 2.44772 13 3 13H12C12.5523 13 13 12.5523 13 12V8.5C13 8.22386 12.7761 8 12.5 8C12.2239 8 12 8.22386 12 8.5V12H3V3L6.5 3C6.77614 3 7 2.77614 7 2.5C7 2.22386 6.77614 2 6.5 2H3ZM12.8536 2.14645C12.9015 2.19439 12.9377 2.24964 12.9621 2.30861C12.9861 2.36669 12.9996 2.4303 13 2.497L13 2.5V2.50049V5.5C13 5.77614 12.7761 6 12.5 6C12.2239 6 12 5.77614 12 5.5V3.70711L6.85355 8.85355C6.65829 9.04882 6.34171 9.04882 6.14645 8.85355C5.95118 8.65829 5.95118 8.34171 6.14645 8.14645L11.2929 3H9.5C9.22386 3 9 2.77614 9 2.5C9 2.22386 9.22386 2 9.5 2H12.4999H12.5C12.5678 2 12.6324 2.01349 12.6914 2.03794C12.7504 2.06234 12.8056 2.09851 12.8536 2.14645Z\,\fill\:\currentColor\,\fillRule\:\evenodd\,\clipRule\:\evenodd\}}}}},\$\,\div\,null,{\className\:\flex-1\}}},\$\,\div\,null,{\className\:\bg-white flex-1\,\children\:\$\,\$L16\,null,{\posts\:{\slug\:\mdx-in-nextjs\,\metadata\:\$5:1:props:children:0:props:posts:0:metadata\,\hero\:\$5:1:props:children:0:props:posts:0:hero\},{\slug\:\temporal-data-management\,\metadata\:\$5:1:props:children:0:props:posts:1:metadata\,\hero\:\$5:1:props:children:0:props:posts:1:hero\},{\slug\:\beam-spanner-changestreams\,\metadata\:\$5:1:props:children:0:props:posts:2:metadata\,\hero\:\$5:1:props:children:0:props:posts:0:hero\},{\slug\:\nextjs-on-cloudflare\,\metadata\:\$5:1:props:children:0:props:posts:3:metadata\,\hero\:\$5:1:props:children:0:props:posts:3:hero\},{\slug\:\blog-building\,\metadata\:\$5:1:props:children:0:props:posts:4:metadata\,\hero\:\$5:1:props:children:0:props:posts:0:hero\},{\slug\:\intro\,\metadata\:\$5:1:props:children:0:props:posts:5:metadata\,\hero\:\$5:1:props:children:0:props:posts:5:hero\}}}\n17:I850,\78\,\static/chunks/2d633d72-a58f155fdb92da19.js\,\966\,\static/chunks/96)/script>script>self.__next_f.push(1,6-5eda3e28bb8654a7.js\,\978\,\static/chunks/978-3e912a4dd7964a2a.js\,\34\,\static/chunks/34-ded094602038367d.js\,\750\,\static/chunks/app/(site)/layout-2895354f2751fd96.js\,\Sheet\\n18:I850,\78\,\static/chunks/2d633d72-a58f155fdb92da19.js\,\966\,\static/chunks/966-5eda3e28bb8654a7.js\,\978\,\static/chunks/978-3e912a4dd7964a2a.js\,\34\,\static/chunks/34-ded094602038367d.js\,\750\,\static/chunks/app/(site)/layout-2895354f2751fd96.js\,\SheetTrigger\\n19:I850,\78\,\static/chunks/2d633d72-a58f155fdb92da19.js\,\966\,\static/chunks/966-5eda3e28bb8654a7.js\,\978\,\static/chunks/978-3e912a4dd7964a2a.js\,\34\,\static/chunks/34-ded094602038367d.js\,\750\,\static/chunks/app/(site)/layout-2895354f2751fd96.js\,\SheetContent\\n1a:I850,\78\,\static/chunks/2d633d72-a58f155fdb92da19.js\,\966\,\static/chunks/966-5eda3e28bb8654a7.js\,\978\,\static/chunks/978-3e912a4dd7964a2a.js\,\34\,\static/chunks/34-ded094602038367d.js\,\750\,\static/chunks/app/(site)/layout-2895354f2751fd96.js\,\SheetClose\\n1c:I2709,\78\,\static/chunks/2d633d72-a58f155fdb92da19.js\,\966\,\static/chunks/966-5eda3e28bb8654a7.js\,\978\,\static/chunks/978-3e912a4dd7964a2a.js\,\34\,\static/chunks/34-ded094602038367d.js\,\750\,\static/chunks/app/(site)/layout-2895354f2751fd96.js\,\NavBarMainLink\\n1b:T49a,M7.49933 0.25C3.49635 0.25 0.25 3.49593 0.25 7.50024C0.25 10.703 2.32715 13.4206 5.2081 14.3797C5.57084 14.446 5.70302 14.2222 5.70302 14.0299C5.70302 13.8576 5.69679 13.4019 5.69323 12.797C3.67661 13.235 3.25112 11.825 3.25112 11.825C2.92132 10.9874 2.44599 10.7644 2.44599 10.7644C1.78773 10.3149 2.49584 10.3238 2.49584 10.3238C3.22353 10.375 3.60629 11.0711 3.60629 11.0711C4.25298 12.1788 5.30335 11.8588 5.71638 11.6732C5.78225 11.205 5.96962 10.8854 6.17658 10.7043C4.56675 10.5209 2.87415 9.89918 2.87415 7.12104C2.87415 6.32925 3.15677 5.68257 3.62053 5.17563C3.54576 4.99226 3.29697 4.25521 3.69174 3.25691C3.69174 3.25691 4.30015 3.06196 5.68522 3.99973C6.26337 3.83906 6.8838 3.75895 7.50022 3.75583C8.1162 3.75895 8.73619 3.83906 9.31523 3.99973C10.6994 3.06196 11.3069 3.25691 11.3069 3.25691C11.7026 4.25521 11.4538 4.99226 11.3795 5.17563C11.8441 5.68257 12.1245 6.32925 12.1245 7.12104C12.1245 9.9063 10.4292 10.5192 8.81452 10.6985C9.07444 10.9224 9.30633 11.3648 9.30633 12.0413C9.30633 13.0102 9.29742 13.7922 9.29742 14.0299C9.29742 14.2239 9.42828 14.4496 9.79591 14.3788C12.6746 13.4179 14.75 10.7025 14.75 7.50024C14.75 3.49593 11.5036 0.25 7.49933 0.25Z1d:T49a,M7.49933 0.25C3.49635 0.25 0.25 3.49593 0.25 7.50024C0.25 10.703 2.32715 13.4206 5.2081 14.3797C5.57084 14.446 5.70302 14.2222 5.70302 14.0299C5.70302 13.8576 5.69679 13.4019 5.69323 12.797C3.67661 13.235 3.25112 11.825 3.25112 11.825C2.92132 10.9874 2.44599 10.7644 2.44599 10.7644C1.78773 10.3149 2.49584 10.3238 2.49584 10.3238C3.22353 10.375 3.60629 11.0711 3.60629 11.0711C4.25298 12.1788 5.30335 11.8588 5.71638 11.6732C5.78225 11.205 5.96962 10.8854 6.17658 10.7043C4.56675 10.5209 2.87415 9.89918 2.87415 7.12104C2.87415 6.32925 3.15677 5.68257 3.62053 5.17563C3.54576 4.99226 3.29697 4.25521 3.69174 3.25691C3.69174 3.25691 4.30015 3.06196 5.68522 3.99973C6.26337 3.83906 6.8838 3.75895 7.50022 3.75583C8.1162 3.75895 8.73619 3.83906 9.31523 3.99973C10.6994 3.06196 11.3069 3.25691 11.3069 3.25691C11.7026 4.25521 11.4538 4.99226 11.3795 5.17563C11.8441 5.68257 12.1245 6.32925 12.1245 7.12104C12.1245 9.9063 10.4292 10.5192 8.81452 10.6985C9.07444 10.9224 9.30633 11.3648 9.30633 12.0413C9.30633 13.0102 9.29742 13.7922 9.29742 14.0299C9.29742 14.2239 9.42828 14.4496 9.79591 14.3788C12.6746 13.4179 14.75 10.7025 14.75 7.50024C14.75 3.49593 11.5036 0.25 7.49933 0.25Ze:\$\,\header\,null,{\className\:\sticky top-0 z-50 bg-primary text-primary-foreground border-b-white/10 border-b-1/2\,\children\:\$\,\$L17\,null,{\children\:\$\,\div\,null,{\className\:\flex items-center flex-justify-between py-3 sm:hidden\,\children\:\$\,\div\,null,{\className\:\flex-1 flex\,\children\:\$\,\$L10\,null,{\src\:\/chris-avatar.jpeg\,\alt\:\Chris Gavin\,\className\:\rounded-full shrink-0 overflow-hidden aspect-square tran)/script>script>self.__next_f.push(1,sition-opacity duration-500 mx-4 size-8\,\width\:400,\height\:400},\$\,\$L11\,null,{\href\:\/\,\className\:\text-lg font-semibold mr-4\,\children\:\chrisgavin.dev\}},\$\,\$L18\,null,{\asChild\:true,\children\:\$\,\button\,null,{\data-slot\:\button\,\className\:\inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 \u0026_svg:pointer-events-none \u0026_svg:not(class*size-):size-4 shrink-0 \u0026_svg:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-3px aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50 h-9 px-4 py-2 has-\u003esvg:px-3\,\children\:\$\,\svg\,null,{\ref\:\$undefined\,\xmlns\:\http://www.w3.org/2000/svg\,\width\:24,\height\:24,\viewBox\:\0 0 24 24\,\fill\:\none\,\stroke\:\currentColor\,\strokeWidth\:2,\strokeLinecap\:\round\,\strokeLinejoin\:\round\,\className\:\lucide lucide-menu size-6\,\aria-hidden\:\true\,\children\:\$\,\path\,\1lakjw\,{\d\:\M4 12h16\},\$\,\path\,\19g7jn\,{\d\:\M4 18h16\},\$\,\path\,\1o0s65\,{\d\:\M4 6h16\},\$undefined\}}}},\$\,\$L19\,null,{\side\:\right\,\className\:\p-4 border-b-white/10 border-b-1\,\children\:\$\,\$L11\,null,{\href\:\#\,\className\:\mr-6 hidden lg:flex\,\prefetch\:false,\children\:\$\,\svg\,null,{\ref\:\$undefined\,\xmlns\:\http://www.w3.org/2000/svg\,\width\:24,\height\:24,\viewBox\:\0 0 24 24\,\fill\:\none\,\stroke\:\currentColor\,\strokeWidth\:2,\strokeLinecap\:\round\,\strokeLinejoin\:\round\,\className\:\lucide lucide-mountain h-6 w-6\,\aria-hidden\:\true\,\children\:\$\,\path\,\otkl63\,{\d\:\m8 3 4 8 5-5 5 15H2L8 3z\},\$undefined\},\$\,\span\,null,{\className\:\sr-only\,\children\:\Chris Gavin\}},\$\,\div\,null,{\className\:\grid gap-2 py-6\,\children\:false,\$\,\$L14\,null,{\orientation\:\horizontal\},\$\,\$L1a\,\Home\,{\asChild\:true,\children\:\$\,\$L11\,\Home\,{\href\:\/\,\className\:\rounded-md px-4 font-medium aria-currentpage:bg-white/10\,\children\:\Home\}},\$\,\$L1a\,\Latest\,{\asChild\:true,\children\:\$\,\$L11\,\Latest\,{\href\:\/blog/nextjs-on-cloudflare\,\className\:\rounded-md px-4 font-medium aria-currentpage:bg-white/10\,\children\:\Latest\}},\$\,\$L1a\,\About\,{\asChild\:true,\children\:\$\,\$L11\,\About\,{\href\:\/about\,\className\:\rounded-md px-4 font-medium aria-currentpage:bg-white/10\,\children\:\About\}},\$\,\$L14\,null,{\orientation\:\horizontal\},\$\,\$L1a\,null,{\asChild\:true,\children\:\$\,\$L11\,null,{\href\:\https://github.com/christogav\,\target\:\_blank\,\className\:\rounded-md px-4 font-medium aria-currentpage:bg-white/10 flex flex-wrap items-center\,\children\:\$\,\svg\,null,{\width\:\15\,\height\:\15\,\viewBox\:\0 0 15 15\,\fill\:\none\,\xmlns\:\http://www.w3.org/2000/svg\,\ref\:\$undefined\,\children\:\$\,\path\,null,{\d\:\$1b\,\fill\:\currentColor\,\fillRule\:\evenodd\,\clipRule\:\evenodd\}},\ \,\$\,\p\,null,{\className\:\pl-2\,\children\:\Github\}}},\$\,\$L1a\,null,{\asChild\:true,\children\:\$\,\$L11\,null,{\href\:\https://www.linkedin.com/in/chris-gavin-91388b28/\,\target\:\_blank\,\className\:\rounded-md px-4 font-medium aria-currentpage:bg-white/10 flex flex-wrap items-center\,\children\:\$\,\svg\,null,{\width\:\15\,\height\:\15\,\viewBox\:\0 0 15 15\,\fill\:\none\,\xmlns\:\http://www.w3.org/2000/svg\,\ref\:\$undefined\,\children\:\$\,\path\,null,{\d\:\M2 1C1.44772 1 1 1.44772 1 2V13C1 13.5523 1.44772 14 2 14H13C13.5523 14 14 13.5523 14 13V2C14 1.44772 13.5523 1 13 1H2ZM3.05 6H4.95V12H3.05V6ZM5.075 4.005C5.075 4.59871 4.59371 5.08 4 5.08C3.4063 5.08 2.925 4.59871 2.925 4.005C2.925 3.41129 3.4063 2.93 4 2.93C4.59371 2.93 5.075 3.41129 5.075 4.005ZM12 8.35713C12 6.55208 10.8334 5.85033 9.67449 5.85033C9.29502 5.83163 8.91721 5.91119 8.57874 6.08107C8.32172 6.21007 8.05265 6.50523 7.84516 7.01853H7.79179V6.00044H6V12.0047H7.90616V8.8112C7.8786 8.48413 7.98327 8.06142 8.19741 7.)/script>script>self.__next_f.push(1,80987C8.41156 7.55832 8.71789 7.49825 8.95015 7.46774H9.02258C9.62874 7.46774 10.0786 7.84301 10.0786 8.78868V12.0047H11.9847L12 8.35713Z\,\fill\:\currentColor\,\fillRule\:\evenodd\,\clipRule\:\evenodd\}},\ \,\$\,\p\,null,{\className\:\pl-2\,\children\:\Linkedin\}}}}}},\$\,\div\,null,{\className\:\bg-primary text-primary-foreground border-b-white/10 border-b-1 hidden sm:block\,\children\:\$\,\div\,null,{\className\:\max-w-7xl mx-auto p-4\,\children\:\$\,\div\,null,{\className\:\flex items-center justify-between h-5\,\children\:\$\,\$L10\,null,{\src\:\/chris-avatar.jpeg\,\alt\:\Chris Gavin\,\className\:\rounded-full shrink-0 overflow-hidden aspect-square transition-opacity duration-500 mx-4 size-8\,\width\:400,\height\:400},\$\,\$L11\,null,{\href\:\/\,\className\:\text-lg font-semibold mr-4 transition-transform duration-200 ease-in-out hover:scale-110 active:scale-90\,\children\:\chrisgavin.dev\},\$\,\$L14\,null,{\orientation\:\vertical\,\className\:\bg-zinc-950/10 dark:bg-white/10\},\$\,\nav\,null,{\className\:\grow\,\children\:\$\,\div\,null,{\className\:\ml-10 flex items-baseline space-x-4\,\children\:\$\,\$L1c\,\Home\,{\href\:\/\,\name\:\Home\},\$\,\$L1c\,\Latest\,{\href\:\/blog/nextjs-on-cloudflare\,\name\:\Latest\},\$\,\$L1c\,\About\,{\href\:\/about\,\name\:\About\}}},\$\,\div\,null,{\className\:\flex items-center\,\children\:false,\$\,\$L11\,null,{\href\:\https://github.com/christogav\,\className\:\mr-6 transition-transform duration-200 ease-in-out hover:scale-140 active:scale-80\,\target\:\_blank\,\children\:\$\,\svg\,null,{\width\:\15\,\height\:\15\,\viewBox\:\0 0 15 15\,\fill\:\none\,\xmlns\:\http://www.w3.org/2000/svg\,\ref\:\$undefined\,\children\:\$\,\path\,null,{\d\:\$1d\,\fill\:\currentColor\,\fillRule\:\evenodd\,\clipRule\:\evenodd\}}},\$\,\$L11\,null,{\href\:\https://www.linkedin.com/in/chris-gavin-91388b28/\,\className\:\mr-6 transition-transform duration-200 ease-in-out hover:scale-140 active:scale-80\,\target\:\_blank\,\children\:\$\,\svg\,null,{\width\:\15\,\height\:\15\,\viewBox\:\0 0 15 15\,\fill\:\none\,\xmlns\:\http://www.w3.org/2000/svg\,\ref\:\$undefined\,\children\:\$\,\path\,null,{\d\:\M2 1C1.44772 1 1 1.44772 1 2V13C1 13.5523 1.44772 14 2 14H13C13.5523 14 14 13.5523 14 13V2C14 1.44772 13.5523 1 13 1H2ZM3.05 6H4.95V12H3.05V6ZM5.075 4.005C5.075 4.59871 4.59371 5.08 4 5.08C3.4063 5.08 2.925 4.59871 2.925 4.005C2.925 3.41129 3.4063 2.93 4 2.93C4.59371 2.93 5.075 3.41129 5.075 4.005ZM12 8.35713C12 6.55208 10.8334 5.85033 9.67449 5.85033C9.29502 5.83163 8.91721 5.91119 8.57874 6.08107C8.32172 6.21007 8.05265 6.50523 7.84516 7.01853H7.79179V6.00044H6V12.0047H7.90616V8.8112C7.8786 8.48413 7.98327 8.06142 8.19741 7.80987C8.41156 7.55832 8.71789 7.49825 8.95015 7.46774H9.02258C9.62874 7.46774 10.0786 7.84301 10.0786 8.78868V12.0047H11.9847L12 8.35713Z\,\fill\:\currentColor\,\fillRule\:\evenodd\,\clipRule\:\evenodd\}}}}}}}}\na:\$\,\meta\,\0\,{\charSet\:\utf-8\},\$\,\meta\,\1\,{\name\:\viewport\,\content\:\widthdevice-width, initial-scale1\}\n7:null\n)/script>script>self.__next_f.push(1,8:null\nc:\$\,\title\,\0\,{\children\:\Chris Gavins Blog\},\$\,\meta\,\1\,{\name\:\description\,\content\:\Technology, personal development and more...\},\$\,\link\,\2\,{\rel\:\author\,\href\:\https://chrisgavin.dev\},\$\,\meta\,\3\,{\name\:\author\,\content\:\Chris Gavin\},\$\,\meta\,\4\,{\name\:\keywords\,\content\:\blog,technology,personal development,Chris Gavin\},\$\,\meta\,\5\,{\property\:\og:title\,\content\:\Chris Gavins Blog\},\$\,\meta\,\6\,{\property\:\og:description\,\content\:\Technology, personal development and more...\},\$\,\meta\,\7\,{\property\:\og:url\,\content\:\https://chrisgavin.dev\},\$\,\meta\,\8\,{\property\:\og:image\,\content\:\https://chrisgavin.dev/chris-lego-smiling.png\},\$\,\meta\,\9\,{\property\:\og:type\,\content\:\website\},\$\,\meta\,\10\,{\name\:\twitter:card\,\content\:\summary_large_image\},\$\,\meta\,\11\,{\name\:\twitter:title\,\content\:\Chris Gavins Blog\},\$\,\meta\,\12\,{\name\:\twitter:description\,\content\:\Technology, personal development and more...\},\$\,\meta\,\13\,{\name\:\twitter:image\,\content\:\https://chrisgavin.dev/chris-lego-smiling.png\},\$\,\link\,\14\,{\rel\:\icon\,\href\:\/favicon.ico\,\type\:\image/x-icon\,\sizes\:\149x147\}\n)/script>/body>/html>
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]