CINXE.COM
Sentry Engineering
<!DOCTYPE html><html lang="en" class="scroll-smooth"><head><meta charSet="utf-8"/><script>!function(){try {var d=document.documentElement.classList;d.remove('light','dark');var e=localStorage.getItem('theme');if("system"===e||(!e&&true)){var t="(prefers-color-scheme: dark)",m=window.matchMedia(t);m.media!==t||m.matches?d.add('dark'):d.add('light')}else if(e) d.add(e)}catch(e){}}()</script><meta content="width=device-width, initial-scale=1" name="viewport"/><title>Sentry Engineering</title><meta name="robots" content="follow, index"/><meta name="description" content="Learn about Sentry's engineering efforts, company culture, product developments and more."/><meta property="og:url" content="https://sentry.engineering/"/><meta property="og:type" content="website"/><meta property="og:site_name" content="Sentry Engineering"/><meta property="og:description" content="Learn about Sentry's engineering efforts, company culture, product developments and more."/><meta property="og:title" content="Sentry Engineering"/><meta property="og:image" content="https://sentry.engineering/images/sentry-engineering.png"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:site" content="https://twitter.com/getsentry"/><meta name="twitter:title" content="Sentry Engineering"/><meta name="twitter:description" content="Learn about Sentry's engineering efforts, company culture, product developments and more."/><meta name="twitter:image" content="https://sentry.engineering/images/sentry-engineering.png"/><link rel="canonical" href="https://sentry.engineering/"/><link rel="preload" as="image" imageSrcSet="/_next/image?url=%2Fimages%2Fhow-sentry-queries-unstructured-data-in-clickhouse-62x-faster%2Fhero.png&w=640&q=75 1x, /_next/image?url=%2Fimages%2Fhow-sentry-queries-unstructured-data-in-clickhouse-62x-faster%2Fhero.png&w=1920&q=75 2x" fetchpriority="high"/><link rel="preload" as="image" imageSrcSet="/_next/image?url=%2Fimages%2Fbetter-code-rendering-through-virtualization%2Funderstanding-root-cause-flamegraph-3.png&w=640&q=75 1x, /_next/image?url=%2Fimages%2Fbetter-code-rendering-through-virtualization%2Funderstanding-root-cause-flamegraph-3.png&w=1920&q=75 2x" fetchpriority="high"/><link rel="preload" as="image" imageSrcSet="/_next/image?url=%2Fimages%2Fenabling-out-of-the-box-performance-insights-in-the-unity-sdk%2Fhero.jpg&w=640&q=75 1x, /_next/image?url=%2Fimages%2Fenabling-out-of-the-box-performance-insights-in-the-unity-sdk%2Fhero.jpg&w=1920&q=75 2x" fetchpriority="high"/><meta name="next-head-count" content="21"/><link rel="apple-touch-icon" sizes="76x76" href="/static/favicons/apple-touch-icon.png"/><link rel="icon" type="image/png" sizes="32x32" href="/static/favicons/favicon-32x32.png"/><link rel="icon" type="image/png" sizes="16x16" href="/static/favicons/favicon-16x16.png"/><link rel="manifest" href="/static/favicons/site.webmanifest"/><link rel="mask-icon" href="/static/favicons/safari-pinned-tab.svg" color="#5bbad5"/><meta name="msapplication-TileColor" content="#000000"/><meta name="theme-color" media="(prefers-color-scheme: light)" content="#fff"/><meta name="theme-color" media="(prefers-color-scheme: dark)" content="#000"/><link rel="alternate" type="application/rss+xml" href="/feed.xml"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/d4d82fac08565598.css" as="style" crossorigin=""/><link rel="stylesheet" href="/_next/static/css/d4d82fac08565598.css" crossorigin="" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" crossorigin="" nomodule="" src="/_next/static/chunks/polyfills-c67a75d1b6f99dc8.js"></script><script src="/_next/static/chunks/webpack-43f0be4857aeb794.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/framework-84ac1466fca9af6f.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/main-3c87ae16d10b67d9.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/pages/_app-02fdf8e252c8a504.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/335-4e91cbc88754cf73.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/pages/index-20e0d1f95f065cac.js" defer="" crossorigin=""></script><script src="/_next/static/ydRpLbP6uXOHOpnd6Ok1e/_buildManifest.js" defer="" crossorigin=""></script><script src="/_next/static/ydRpLbP6uXOHOpnd6Ok1e/_ssgManifest.js" defer="" crossorigin=""></script></head><body class="bg-white text-black antialiased dark:bg-gray-900 dark:text-white"><div id="__next"><div class="mx-auto max-w-3xl px-4 sm:px-6 xl:max-w-5xl xl:px-0"><div class="flex h-screen flex-col justify-between"><header class="flex items-center justify-between py-10"><div><a aria-label="Sentry Engineering" href="/"><div class="flex items-center justify-between"><div class="mr-3"><svg class="css-lfbo6j e10nushx4 fill-[#362d59] dark:fill-white" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 72 66" width="50" height="46"><path d="M29,2.26a4.67,4.67,0,0,0-8,0L14.42,13.53A32.21,32.21,0,0,1,32.17,40.19H27.55A27.68,27.68,0,0,0,12.09,17.47L6,28a15.92,15.92,0,0,1,9.23,12.17H4.62A.76.76,0,0,1,4,39.06l2.94-5a10.74,10.74,0,0,0-3.36-1.9l-2.91,5a4.54,4.54,0,0,0,1.69,6.24A4.66,4.66,0,0,0,4.62,44H19.15a19.4,19.4,0,0,0-8-17.31l2.31-4A23.87,23.87,0,0,1,23.76,44H36.07a35.88,35.88,0,0,0-16.41-31.8l4.67-8a.77.77,0,0,1,1.05-.27c.53.29,20.29,34.77,20.66,35.17a.76.76,0,0,1-.68,1.13H40.6q.09,1.91,0,3.81h4.78A4.59,4.59,0,0,0,50,39.43a4.49,4.49,0,0,0-.62-2.28Z" transform="translate(11, 11)"></path></svg></div><div class="hidden h-6 text-2xl font-semibold sm:block" style="margin-top:-10px">Sentry Engineering</div></div></a></div><div class="flex items-center text-base leading-5"><div class="hidden sm:block"><a class="p-1 font-medium text-gray-900 dark:text-gray-100 sm:p-4" href="/tags/web">Web</a><a class="p-1 font-medium text-gray-900 dark:text-gray-100 sm:p-4" href="/tags/infrastructure">Infrastructure</a><a class="p-1 font-medium text-gray-900 dark:text-gray-100 sm:p-4" href="/tags/building-sentry">Building Sentry</a><a class="p-1 font-medium text-gray-900 dark:text-gray-100 sm:p-4" href="/tags">Tags</a><a target="_blank" rel="noopener noreferrer" href="https://open.sentry.io/" class="p-1 font-medium text-gray-900 dark:text-gray-100 sm:p-4">Open Source</a></div><button aria-label="Toggle Dark Mode" type="button" class="ml-1 mr-1 h-8 w-8 rounded p-1 sm:ml-4"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="text-gray-900 dark:text-gray-100"><path d="M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z"></path></svg></button><div class="sm:hidden"><button type="button" class="ml-1 mr-1 h-8 w-8 rounded py-1" aria-label="Toggle Menu"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="text-gray-900 dark:text-gray-100"><path fill-rule="evenodd" d="M3 5a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 10a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 15a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1z" clip-rule="evenodd"></path></svg></button><div class="fixed left-0 top-0 z-10 h-full w-full transform bg-gray-200 opacity-95 duration-300 ease-in-out dark:bg-gray-800 translate-x-full"><div class="flex justify-end"><button type="button" class="mr-5 mt-11 h-8 w-8 rounded" aria-label="Toggle Menu"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="text-gray-900 dark:text-gray-100"><path fill-rule="evenodd" d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z" clip-rule="evenodd"></path></svg></button></div><nav class="fixed mt-8 h-full"><div class="px-12 py-4"><a class="text-2xl font-bold tracking-widest text-gray-900 dark:text-gray-100" href="/tags/web">Web</a></div><div class="px-12 py-4"><a class="text-2xl font-bold tracking-widest text-gray-900 dark:text-gray-100" href="/tags/infrastructure">Infrastructure</a></div><div class="px-12 py-4"><a class="text-2xl font-bold tracking-widest text-gray-900 dark:text-gray-100" href="/tags/building-sentry">Building Sentry</a></div><div class="px-12 py-4"><a class="text-2xl font-bold tracking-widest text-gray-900 dark:text-gray-100" href="/tags">Tags</a></div><div class="px-12 py-4"><a target="_blank" rel="noopener noreferrer" href="https://open.sentry.io/" class="text-2xl font-bold tracking-widest text-gray-900 dark:text-gray-100">Open Source</a></div></nav></div></div></div></header><main class="mb-auto"><div class="divide-y divide-gray-200 border-none dark:divide-gray-700"><div class="space-y-2 pb-8 pt-6 md:space-y-5"><h1 class="text-3xl font-extrabold leading-9 tracking-tight text-gray-900 dark:text-gray-100 sm:text-4xl sm:leading-10 md:text-6xl md:leading-14">Latest</h1><p class="text-lg leading-7 text-gray-500 dark:text-gray-400">Learn about Sentry's engineering efforts, company culture, product developments and more.</p></div><div class="grid border-none lg:grid-cols-3"><div class="mr-8 max-w-sm overflow-hidden rounded shadow-lg"><a class="text-gray-900 dark:text-gray-100" href="/blog/how-sentry-queries-unstructured-data-in-clickhouse-62x-faster"><img alt="Post hero image" fetchpriority="high" width="640" height="1550" decoding="async" data-nimg="1" class="h-32 w-full" style="color:transparent" srcSet="/_next/image?url=%2Fimages%2Fhow-sentry-queries-unstructured-data-in-clickhouse-62x-faster%2Fhero.png&w=640&q=75 1x, /_next/image?url=%2Fimages%2Fhow-sentry-queries-unstructured-data-in-clickhouse-62x-faster%2Fhero.png&w=1920&q=75 2x" src="/_next/image?url=%2Fimages%2Fhow-sentry-queries-unstructured-data-in-clickhouse-62x-faster%2Fhero.png&w=1920&q=75"/></a><div class="px-6 py-4"><div class="mb-2 text-xl font-bold"><a class="text-gray-900 dark:text-gray-100" href="/blog/how-sentry-queries-unstructured-data-in-clickhouse-62x-faster">How Sentry queries unstructured data in ClickHouse 62x faster</a></div><p class="text-base text-gray-500 dark:text-gray-400">We repurposed a hashtable to make ClickHouse significantly faster for analytical queries<!-- --> <a class="text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" aria-label="Read "How Sentry queries unstructured data in ClickHouse 62x faster"" href="/blog/how-sentry-queries-unstructured-data-in-clickhouse-62x-faster">Read more →</a></p></div><div class="px-6 pb-2 pt-4"><li class="flex items-center space-x-2"><img alt="avatar" loading="lazy" width="38" height="38" decoding="async" data-nimg="1" class="h-10 w-10 rounded-full" style="color:transparent" srcSet="/_next/image?url=%2Fstatic%2Favatars%2Fcolinchartier.jpeg&w=48&q=75 1x, /_next/image?url=%2Fstatic%2Favatars%2Fcolinchartier.jpeg&w=96&q=75 2x" src="/_next/image?url=%2Fstatic%2Favatars%2Fcolinchartier.jpeg&w=96&q=75"/><dl class="whitespace-nowrap text-sm font-medium leading-5"><dt class="sr-only">Name</dt><dd class="text-gray-900 dark:text-gray-100"><a class="text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/about/colinchartier">Colin Chartier</a></dd><dt class="sr-only">Twitter</dt><dd></dd></dl></li></div></div><div class="mr-8 max-w-sm overflow-hidden rounded shadow-lg"><a class="text-gray-900 dark:text-gray-100" href="/blog/better-code-rendering-through-virtualization"><img alt="Post hero image" fetchpriority="high" width="640" height="1550" decoding="async" data-nimg="1" class="h-32 w-full" style="color:transparent" srcSet="/_next/image?url=%2Fimages%2Fbetter-code-rendering-through-virtualization%2Funderstanding-root-cause-flamegraph-3.png&w=640&q=75 1x, /_next/image?url=%2Fimages%2Fbetter-code-rendering-through-virtualization%2Funderstanding-root-cause-flamegraph-3.png&w=1920&q=75 2x" src="/_next/image?url=%2Fimages%2Fbetter-code-rendering-through-virtualization%2Funderstanding-root-cause-flamegraph-3.png&w=1920&q=75"/></a><div class="px-6 py-4"><div class="mb-2 text-xl font-bold"><a class="text-gray-900 dark:text-gray-100" href="/blog/better-code-rendering-through-virtualization">Better Code Rendering Through Virtualization</a></div><p class="text-base text-gray-500 dark:text-gray-400">How we rebuilt Codecov's code renderer from the ground up to be faster and more efficient, utilizing virtualization.<!-- --> <a class="text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" aria-label="Read "Better Code Rendering Through Virtualization"" href="/blog/better-code-rendering-through-virtualization">Read more →</a></p></div><div class="px-6 pb-2 pt-4"><li class="flex items-center space-x-2"><img alt="avatar" loading="lazy" width="38" height="38" decoding="async" data-nimg="1" class="h-10 w-10 rounded-full" style="color:transparent" srcSet="/_next/image?url=%2Fstatic%2Favatars%2Fnicholasdeschenes.png&w=48&q=75 1x, /_next/image?url=%2Fstatic%2Favatars%2Fnicholasdeschenes.png&w=96&q=75 2x" src="/_next/image?url=%2Fstatic%2Favatars%2Fnicholasdeschenes.png&w=96&q=75"/><dl class="whitespace-nowrap text-sm font-medium leading-5"><dt class="sr-only">Name</dt><dd class="text-gray-900 dark:text-gray-100"><a class="text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/about/nicholasdeschenes">Nicholas Deschenes</a></dd><dt class="sr-only">Twitter</dt><dd><a target="_blank" rel="noopener noreferrer" href="https://twitter.com/_Idez_" class="text-xs text-primary-500 hover:text-primary-600 dark:hover:text-primary-400">@_Idez_</a></dd></dl></li></div></div><div class="mr-8 max-w-sm overflow-hidden rounded shadow-lg"><a class="text-gray-900 dark:text-gray-100" href="/blog/enabling-out-of-the-box-performance-insights-in-the-unity-sdk"><img alt="Post hero image" fetchpriority="high" width="640" height="1550" decoding="async" data-nimg="1" class="h-32 w-full" style="color:transparent" srcSet="/_next/image?url=%2Fimages%2Fenabling-out-of-the-box-performance-insights-in-the-unity-sdk%2Fhero.jpg&w=640&q=75 1x, /_next/image?url=%2Fimages%2Fenabling-out-of-the-box-performance-insights-in-the-unity-sdk%2Fhero.jpg&w=1920&q=75 2x" src="/_next/image?url=%2Fimages%2Fenabling-out-of-the-box-performance-insights-in-the-unity-sdk%2Fhero.jpg&w=1920&q=75"/></a><div class="px-6 py-4"><div class="mb-2 text-xl font-bold"><a class="text-gray-900 dark:text-gray-100" href="/blog/enabling-out-of-the-box-performance-insights-in-the-unity-sdk">Enabling Out-of-the-Box Performance Insights in Unity Games with the Sentry SDK</a></div><p class="text-base text-gray-500 dark:text-gray-400">Learn how we built the autoinstrumentation in the Unity SDK via IL Weaving<!-- --> <a class="text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" aria-label="Read "Enabling Out-of-the-Box Performance Insights in Unity Games with the Sentry SDK"" href="/blog/enabling-out-of-the-box-performance-insights-in-the-unity-sdk">Read more →</a></p></div><div class="px-6 pb-2 pt-4"><li class="flex items-center space-x-2"><img alt="avatar" loading="lazy" width="38" height="38" decoding="async" data-nimg="1" class="h-10 w-10 rounded-full" style="color:transparent" srcSet="/_next/image?url=%2Fstatic%2Favatars%2Fstefanjandl.png&w=48&q=75 1x, /_next/image?url=%2Fstatic%2Favatars%2Fstefanjandl.png&w=96&q=75 2x" src="/_next/image?url=%2Fstatic%2Favatars%2Fstefanjandl.png&w=96&q=75"/><dl class="whitespace-nowrap text-sm font-medium leading-5"><dt class="sr-only">Name</dt><dd class="text-gray-900 dark:text-gray-100"><a class="text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/about/stefanjandl">Stefan Jandl</a></dd><dt class="sr-only">Twitter</dt><dd><a target="_blank" rel="noopener noreferrer" href="https://twitter.com/bitsandfoxes" class="text-xs text-primary-500 hover:text-primary-600 dark:hover:text-primary-400">@bitsandfoxes</a></dd></dl></li></div></div></div><ul class="divide-y divide-gray-200 border-none dark:divide-gray-700"><li class="py-12"><article><div class="space-y-2 xl:grid xl:grid-cols-4 xl:items-baseline xl:space-y-0"><dl><dt class="sr-only">Published on</dt><dd class="text-base font-medium leading-6 text-gray-500 dark:text-gray-400"><time dateTime="2024-10-18T00:00:00.000Z">October 18, 2024</time></dd></dl><div class="space-y-5 xl:col-span-3"><div class="space-y-6"><div><h2 class="text-2xl font-bold leading-8 tracking-tight"><a class="text-gray-900 dark:text-gray-100" href="/blog/perfectly-fitting-text-to-container-in-react">Perfectly Fitting Text to Container in React</a></h2><div class="flex flex-wrap"><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/react">react</a><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/web">web</a><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/javascript">javascript</a></div></div><div class="prose max-w-none text-gray-500 dark:text-gray-400">Building a React component that automatically updates its font size to fill its parent element as fully as possible.</div></div><div class="text-base font-medium leading-6"><a class="text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" aria-label="Read "Perfectly Fitting Text to Container in React"" href="/blog/perfectly-fitting-text-to-container-in-react">Read more →</a></div></div></div></article></li><li class="py-12"><article><div class="space-y-2 xl:grid xl:grid-cols-4 xl:items-baseline xl:space-y-0"><dl><dt class="sr-only">Published on</dt><dd class="text-base font-medium leading-6 text-gray-500 dark:text-gray-400"><time dateTime="2024-09-27T00:00:00.000Z">September 27, 2024</time></dd></dl><div class="space-y-5 xl:col-span-3"><div class="space-y-6"><div><h2 class="text-2xl font-bold leading-8 tracking-tight"><a class="text-gray-900 dark:text-gray-100" href="/blog/mobile-app-launch-profiling">Mobile App Launch Profiling</a></h2><div class="flex flex-wrap"><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/mobile">mobile</a><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/ios">ios</a><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/android">android</a><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/profiling">profiling</a></div></div><div class="prose max-w-none text-gray-500 dark:text-gray-400">See what's happening in your app before your first line of code can even run.</div></div><div class="text-base font-medium leading-6"><a class="text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" aria-label="Read "Mobile App Launch Profiling"" href="/blog/mobile-app-launch-profiling">Read more →</a></div></div></div></article></li><li class="py-12"><article><div class="space-y-2 xl:grid xl:grid-cols-4 xl:items-baseline xl:space-y-0"><dl><dt class="sr-only">Published on</dt><dd class="text-base font-medium leading-6 text-gray-500 dark:text-gray-400"><time dateTime="2024-09-23T00:00:00.000Z">September 23, 2024</time></dd></dl><div class="space-y-5 xl:col-span-3"><div class="space-y-6"><div><h2 class="text-2xl font-bold leading-8 tracking-tight"><a class="text-gray-900 dark:text-gray-100" href="/blog/splitting-production-databases-with-minimal-downtime">Splitting production databases with minimal downtime</a></h2><div class="flex flex-wrap"><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/multiregion">multiregion</a><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/building-sentry">building-sentry</a></div></div><div class="prose max-w-none text-gray-500 dark:text-gray-400">As we scale Sentry, we need to expand Postgres capacity by splitting up workloads across multiple primaries.</div></div><div class="text-base font-medium leading-6"><a class="text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" aria-label="Read "Splitting production databases with minimal downtime"" href="/blog/splitting-production-databases-with-minimal-downtime">Read more →</a></div></div></div></article></li><li class="py-12"><article><div class="space-y-2 xl:grid xl:grid-cols-4 xl:items-baseline xl:space-y-0"><dl><dt class="sr-only">Published on</dt><dd class="text-base font-medium leading-6 text-gray-500 dark:text-gray-400"><time dateTime="2024-09-06T00:00:00.000Z">September 6, 2024</time></dd></dl><div class="space-y-5 xl:col-span-3"><div class="space-y-6"><div><h2 class="text-2xl font-bold leading-8 tracking-tight"><a class="text-gray-900 dark:text-gray-100" href="/blog/preact-or-svelte-an-embedded-widget-use-case">Preact or Svelte? An Embedded Widget Use Case</a></h2><div class="flex flex-wrap"><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/javascript">javascript</a><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/sdk">sdk</a></div></div><div class="prose max-w-none text-gray-500 dark:text-gray-400">Preact or Svelte, which framework is best for building an embedded user feedback widget?</div></div><div class="text-base font-medium leading-6"><a class="text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" aria-label="Read "Preact or Svelte? An Embedded Widget Use Case"" href="/blog/preact-or-svelte-an-embedded-widget-use-case">Read more →</a></div></div></div></article></li><li class="py-12"><article><div class="space-y-2 xl:grid xl:grid-cols-4 xl:items-baseline xl:space-y-0"><dl><dt class="sr-only">Published on</dt><dd class="text-base font-medium leading-6 text-gray-500 dark:text-gray-400"><time dateTime="2024-08-23T00:00:00.000Z">August 23, 2024</time></dd></dl><div class="space-y-5 xl:col-span-3"><div class="space-y-6"><div><h2 class="text-2xl font-bold leading-8 tracking-tight"><a class="text-gray-900 dark:text-gray-100" href="/blog/js-mutation-testing-our-sdks">Mutation-testing our JavaScript SDKs</a></h2><div class="flex flex-wrap"><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/javascript">javascript</a><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/web">web</a><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/testing">testing</a><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/coverage">coverage</a><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/mutation-testing">mutation-testing</a></div></div><div class="prose max-w-none text-gray-500 dark:text-gray-400">Let's dive into mutation testing. In this post we talk about how mutation testing works, the state of it in JavaScript and we share our results of applying it to our JavaScript SDK repository</div></div><div class="text-base font-medium leading-6"><a class="text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" aria-label="Read "Mutation-testing our JavaScript SDKs"" href="/blog/js-mutation-testing-our-sdks">Read more →</a></div></div></div></article></li><li class="py-12"><article><div class="space-y-2 xl:grid xl:grid-cols-4 xl:items-baseline xl:space-y-0"><dl><dt class="sr-only">Published on</dt><dd class="text-base font-medium leading-6 text-gray-500 dark:text-gray-400"><time dateTime="2024-08-19T00:00:00.000Z">August 19, 2024</time></dd></dl><div class="space-y-5 xl:col-span-3"><div class="space-y-6"><div><h2 class="text-2xl font-bold leading-8 tracking-tight"><a class="text-gray-900 dark:text-gray-100" href="/blog/how-we-fixed-incorrect-codecov-bundle-size-reporting">How we fixed incorrect Codecov bundle size reporting</a></h2><div class="flex flex-wrap"><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/javascript">javascript</a><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/bundler">bundler</a><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/bundle-analysis">bundle-analysis</a><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/codecov">codecov</a><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/git">git</a><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/github">github</a><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/ci">ci</a><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/github-actions">github-actions</a></div></div><div class="prose max-w-none text-gray-500 dark:text-gray-400">How we resolved incorrect Codecov bundle size reporting when using GitHub Actions.</div></div><div class="text-base font-medium leading-6"><a class="text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" aria-label="Read "How we fixed incorrect Codecov bundle size reporting"" href="/blog/how-we-fixed-incorrect-codecov-bundle-size-reporting">Read more →</a></div></div></div></article></li><li class="py-12"><article><div class="space-y-2 xl:grid xl:grid-cols-4 xl:items-baseline xl:space-y-0"><dl><dt class="sr-only">Published on</dt><dd class="text-base font-medium leading-6 text-gray-500 dark:text-gray-400"><time dateTime="2024-07-16T00:00:00.000Z">July 16, 2024</time></dd></dl><div class="space-y-5 xl:col-span-3"><div class="space-y-6"><div><h2 class="text-2xl font-bold leading-8 tracking-tight"><a class="text-gray-900 dark:text-gray-100" href="/blog/js-sdk-v8-retrospective">Sentry JavaScript SDK v8 - A Retrospective</a></h2><div class="flex flex-wrap"><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/javascript">javascript</a><a class="mr-3 text-sm font-medium uppercase text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" href="/tags/sdk">sdk</a></div></div><div class="prose max-w-none text-gray-500 dark:text-gray-400">This post will outline learnings the Sentry SDK team had from releasing v8 of the JavaScript SDKs.</div></div><div class="text-base font-medium leading-6"><a class="text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" aria-label="Read "Sentry JavaScript SDK v8 - A Retrospective"" href="/blog/js-sdk-v8-retrospective">Read more →</a></div></div></div></article></li></ul></div><div class="flex justify-end text-base font-medium leading-6"><a class="text-primary-500 hover:text-primary-600 dark:hover:text-primary-400" aria-label="all posts" href="/blog/page/2">Next Page →</a></div></main><footer><div class="mt-16 flex flex-col items-center"><div class="mb-3 flex space-x-4"><a class="mx-1 text-sm text-gray-500 transition hover:text-gray-600" target="_blank" rel="noopener noreferrer" href="https://github.com/getsentry/sentry"><span class="sr-only">github</span><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" class="fill-current text-gray-700 hover:text-blue-500 dark:text-gray-200 dark:hover:text-blue-400 h-6 w-6"><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></a><a class="mx-1 text-sm text-gray-500 transition hover:text-gray-600" target="_blank" rel="noopener noreferrer" href="https://www.youtube.com/channel/UCP_sweTJ0DQmMlpvNSOpEJg"><span class="sr-only">youtube</span><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="fill-current text-gray-700 hover:text-blue-500 dark:text-gray-200 dark:hover:text-blue-400 h-6 w-6"><path d="M23.499 6.203a3.008 3.008 0 0 0-2.089-2.089c-1.87-.501-9.4-.501-9.4-.501s-7.509-.01-9.399.501a3.008 3.008 0 0 0-2.088 2.09A31.258 31.26 0 0 0 0 12.01a31.258 31.26 0 0 0 .523 5.785 3.008 3.008 0 0 0 2.088 2.089c1.869.502 9.4.502 9.4.502s7.508 0 9.399-.502a3.008 3.008 0 0 0 2.089-2.09 31.258 31.26 0 0 0 .5-5.784 31.258 31.26 0 0 0-.5-5.808zm-13.891 9.4V8.407l6.266 3.604z"></path></svg></a><a class="mx-1 text-sm text-gray-500 transition hover:text-gray-600" target="_blank" rel="noopener noreferrer" href="https://www.linkedin.com/company/getsentry/"><span class="sr-only">linkedin</span><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" class="fill-current text-gray-700 hover:text-blue-500 dark:text-gray-200 dark:hover:text-blue-400 h-6 w-6"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 0 1-2.063-2.065 2.064 2.064 0 1 1 2.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"></path></svg></a><a class="mx-1 text-sm text-gray-500 transition hover:text-gray-600" target="_blank" rel="noopener noreferrer" href="https://twitter.com/getsentry"><span class="sr-only">twitter</span><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="fill-current text-gray-700 hover:text-blue-500 dark:text-gray-200 dark:hover:text-blue-400 h-6 w-6"><path d="M23.953 4.57a10 10 0 0 1-2.825.775 4.958 4.958 0 0 0 2.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 0 0-8.384 4.482C7.69 8.095 4.067 6.13 1.64 3.162a4.822 4.822 0 0 0-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 0 1-2.228-.616v.06a4.923 4.923 0 0 0 3.946 4.827 4.996 4.996 0 0 1-2.212.085 4.936 4.936 0 0 0 4.604 3.417 9.867 9.867 0 0 1-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 0 0 7.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0 0 24 4.59z"></path></svg></a></div><div class="mb-2 flex space-x-2 text-sm text-gray-500 dark:text-gray-400"><div>© 2025</div><div> • </div><a href="/">Sentry Engineering</a><div> • </div><a href="/feed.xml">RSS</a><div> • </div><a target="_blank" rel="noopener noreferrer" href="https://sentry.io/changelog/">Changelog</a></div></div></footer></div></div></div><script id="__NEXT_DATA__" type="application/json" crossorigin="">{"props":{"pageProps":{"posts":[{"title":"How Sentry queries unstructured data in ClickHouse 62x faster","date":"2025-03-24T00:00:00.000Z","tags":["clickhouse","web","optimization"],"draft":false,"summary":"We repurposed a hashtable to make ClickHouse significantly faster for analytical queries","images":["/images/how-sentry-queries-unstructured-data-in-clickhouse-62x-faster/hero.png"],"layout":"PostLayout","canonicalUrl":null,"authors":["colinchartier"],"slug":"how-sentry-queries-unstructured-data-in-clickhouse-62x-faster"},{"title":"Better Code Rendering Through Virtualization","date":"2024-12-03T00:00:00.000Z","tags":["javascript","codecov","virtualization","react"],"draft":false,"summary":"How we rebuilt Codecov's code renderer from the ground up to be faster and more efficient, utilizing virtualization.","images":["/images/better-code-rendering-through-virtualization/understanding-root-cause-flamegraph-3.png"],"layout":"PostLayout","canonicalUrl":null,"authors":["nicholasdeschenes"],"slug":"better-code-rendering-through-virtualization"},{"title":"Enabling Out-of-the-Box Performance Insights in Unity Games with the Sentry SDK","date":"2024-11-04T00:00:00.000Z","tags":["unity","sdk","c#"],"draft":false,"summary":"Learn how we built the autoinstrumentation in the Unity SDK via IL Weaving","images":["/images/enabling-out-of-the-box-performance-insights-in-the-unity-sdk/hero.jpg"],"layout":"PostLayout","canonicalUrl":null,"authors":["stefanjandl"],"slug":"enabling-out-of-the-box-performance-insights-in-the-unity-sdk"},{"title":"Perfectly Fitting Text to Container in React","date":"2024-10-18T00:00:00.000Z","tags":["react","web","javascript"],"draft":false,"summary":"Building a React component that automatically updates its font size to fill its parent element as fully as possible.","images":["/images/perfectly-fitting-text-to-container-in-react/hero.png"],"layout":"PostLayout","canonicalUrl":null,"authors":["georgegritsouk"],"slug":"perfectly-fitting-text-to-container-in-react"},{"title":"Mobile App Launch Profiling","date":"2024-09-27T00:00:00.000Z","tags":["mobile","ios","android","profiling"],"draft":false,"summary":"See what's happening in your app before your first line of code can even run.","images":["/images/mobile-app-launch-profiling/launch-profile.png"],"layout":"PostLayout","canonicalUrl":"mobile-app-launch-profiling","authors":["andrewmcknight"],"slug":"mobile-app-launch-profiling"},{"title":"Splitting production databases with minimal downtime","date":"2024-09-23T00:00:00.000Z","tags":["multiregion","building sentry"],"draft":false,"summary":"As we scale Sentry, we need to expand Postgres capacity by splitting up workloads across multiple primaries.","images":["/images/splitting-production-databases-with-minimal-downtime/physical-separation-pt1.png","/images/splitting-production-databases-with-minimal-downtime/initial-operations.png","/images/splitting-production-databases-with-minimal-downtime/physical-separation-pt2.png","/images/splitting-production-databases-with-minimal-downtime/physical-separation-pt3.png"],"layout":"PostLayout","authors":["markstory"],"slug":"splitting-production-databases-with-minimal-downtime"},{"title":"Preact or Svelte? An Embedded Widget Use Case","date":"2024-09-06T00:00:00.000Z","tags":["javascript","sdk"],"draft":false,"summary":"Preact or Svelte, which framework is best for building an embedded user feedback widget?","images":["/images/preact-or-svelte-an-embedded-widget-use-case/hero.jpg"],"layout":"PostLayout","authors":["catherinelee"],"slug":"preact-or-svelte-an-embedded-widget-use-case"},{"title":"Mutation-testing our JavaScript SDKs","date":"2024-08-23T00:00:00.000Z","tags":["javascript","web","testing","coverage","mutation-testing"],"draft":false,"summary":"Let's dive into mutation testing. In this post we talk about how mutation testing works, the state of it in JavaScript and we share our results of applying it to our JavaScript SDK repository","images":["/images/js-mutation-testing-our-sdks/hero.jpg"],"layout":"PostLayout","canonicalUrl":"mutation-testing-js-sdks","authors":["lukasstracke"],"slug":"js-mutation-testing-our-sdks"},{"title":"How we fixed incorrect Codecov bundle size reporting","date":"2024-08-19T00:00:00.000Z","tags":["javascript","bundler","bundle analysis","codecov","git","github","ci","github actions"],"draft":false,"summary":"How we resolved incorrect Codecov bundle size reporting when using GitHub Actions.","images":["/images/how-we-fixed-incorrect-codecov-bundle-size-reporting/codecov-classroom-hero.jpg"],"layout":"PostLayout","canonicalUrl":null,"authors":["nicholasdeschenes"],"slug":"how-we-fixed-incorrect-codecov-bundle-size-reporting"},{"title":"Sentry JavaScript SDK v8 - A Retrospective","date":"2024-07-16T00:00:00.000Z","tags":["javascript","sdk"],"draft":false,"summary":"This post will outline learnings the Sentry SDK team had from releasing v8 of the JavaScript SDKs.","images":["/images/js-sdk-v8-retrospective/hero.jpg"],"layout":"PostLayout","canonicalUrl":"https://sentry.engineering/blog/js-sdk-v8-retrospective","authors":["francesconovy"],"slug":"js-sdk-v8-retrospective"},{"title":"How to Refactor and Not Break Things","date":"2024-07-08T00:00:00.000Z","tags":["python","refactoring","sdk"],"draft":false,"summary":"How we completed a huge refactoring of a software used by thousands of developers without breaking things.","images":["/images/how-to-refactor-and-not-break-things/hero.jpg"],"layout":"PostLayout","authors":["antonpirker"],"slug":"how-to-refactor-and-not-break-things"},{"title":"Designing Sentry's cross-region replication","date":"2024-06-28T00:00:00.000Z","tags":["multiregion","building sentry"],"draft":false,"summary":"Cross-region replication is a foundational subsystem in multi-region Sentry. This post explores our design process.","images":["/images/designing-sentrys-cross-region-replication/scenario-outline.png","/images/designing-sentrys-cross-region-replication/cdc-kafka.png","/images/designing-sentrys-cross-region-replication/outbox-sequence.png"],"layout":"PostLayout","authors":["markstory"],"slug":"designing-sentrys-cross-region-replication"},{"title":"Improving DX: From Unreadable CSS Selectors to Clear React Component Names","date":"2024-05-30T00:00:00.000Z","tags":["web","react","debugging"],"draft":false,"summary":"How to transform unreadable CSS selectors to React component names.","images":["/images/improving-developer-experience-from-unreadable-css-selectors-to-clear-component-names/hero.jpg"],"layout":"PostLayout","authors":["catherinelee","ashanand"],"slug":"improving-developer-experience-from-unreadable-css-selectors-to-clear-component-names"},{"title":"Removing risk from our multi-region design with simulations","date":"2024-05-16T00:00:00.000Z","tags":["multiregion","building sentry"],"draft":false,"summary":"Before splitting our application database and infrastructure up, we wanted to have confidence in where the boundaries would be.","images":["/images/removing-risk-from-our-multiregion-design-with-simulations/before-state.png","/images/removing-risk-from-our-multiregion-design-with-simulations/after-state.png"],"layout":"PostLayout","authors":["markstory"],"slug":"removing-risk-from-our-multiregion-design-with-simulations"},{"title":"How open PR comments work","date":"2024-04-18T00:00:00.000Z","tags":["integrations","github","pr-comments"],"draft":false,"summary":"This is how we manage to comment Sentry issues related to code you're modifying in a pull request within seconds.","images":["/images/open-pr-comments/hero.jpeg"],"layout":"PostLayout","canonicalUrl":"open-pr-comments","authors":["cathyteng"],"slug":"how-open-pr-comments-work"},{"title":"How we improved Performance Score accuracy","date":"2024-01-17T00:00:00.000Z","tags":["javascript","performance","web"],"draft":false,"summary":"We're making updates to how Performance Scores are calculated in the Web Vitals module, which will bring them closer to what your users experience.","images":["/images/how-we-improved-performance-score-accuracy/hero.jpg"],"layout":"PostLayout","canonicalUrl":"performance-score-improvements","authors":["edwardgou"],"slug":"how-we-improved-performance-score-accuracy"},{"title":"Should you, could you AOT?","date":"2024-01-16T00:00:00.000Z","tags":["native","aot",".net","sdk","building sentry"],"summary":"How ASP.NET Core application developers can make the transition from JIT (Just-in-Time) to AOT (Ahead-of-Time) compilation, using the Sentry SDK for .NET as a case study.","images":["/images/should-you-could-you-aot/hero.jpeg"],"layout":"PostLayout","authors":["jamescrosswell"],"slug":"should-you-could-you-aot"},{"title":"How to publish binaries on npm","date":"2024-01-05T00:00:00.000Z","tags":["npm","binary","cli","web"],"draft":false,"summary":"A comprehensive guide on how to publish binaries on npm without getting fired.","images":["/images/publishing-binaries-on-npm/hero.jpeg"],"layout":"PostLayout","canonicalUrl":"https://sentry.engineering/blog/publishing-binaries-on-npm","authors":["lucaforstner"],"slug":"publishing-binaries-on-npm"},{"title":"Improving Node.js loader performance","date":"2023-12-12T00:00:00.000Z","tags":["node.js","performance","esm","cjs","commonjs"],"summary":"CommonJS and ES modules are 2 sides of a coin. Node.js supports both of them. So, how can we improve the performance of Node.js loaders?","images":["/images/improving-nodejs-loader-performance/hero.jpg"],"layout":"PostLayout","canonicalUrl":"improving-nodejs-loader-performance","authors":["yagiznizipli"],"slug":"improving-nodejs-loader-performance"},{"title":"A $3,000,000 Dropdown","date":"2023-11-15T00:00:00.000Z","tags":["building sentry","multiregion"],"draft":false,"summary":"Almost 2 years ago, Sentry embarked on a project to bring true EU data residency to Sentry's customers. We decided to do it the hard way.","images":["/images/locking-war-story-title.png"],"layout":"PostLayout","authors":["mikeihbe"],"slug":"3m-dollar-dropdown"},{"title":"Scaling Cron Monitoring","date":"2023-11-14T00:00:00.000Z","tags":["crons","database","infrastructure"],"draft":false,"summary":"We just surpassed over 7 million check-ins per day. Let's talk about what it took to go from prototype to production ready cron monitoring.","images":["/images/scaling-cron-monitoring/hero.jpg"],"layout":"PostLayout","canonicalUrl":"scaling-cron-monitoring","authors":["evanpurkhiser"],"slug":"scaling-cron-monitoring"},{"title":"How We Reduced Replay SDK Bundle Size by 35%","date":"2023-11-14T00:00:00.000Z","tags":["sdk","javascript","replay","session-replay"],"draft":false,"summary":"An in-depth analysis of how we managed to cut the Session Replay SDK bundle size by 35%.","images":["/images/session-replay-sdk-bundle-size-optimizations/hero.jpg"],"layout":"PostLayout","canonicalUrl":"https://sentry.engineering/blog/session-replay-sdk-bundle-size-optimizations","authors":["francesconovy"],"slug":"session-replay-sdk-bundle-size-optimizations"},{"title":"Lost in the Haystack: Optimizing an Expensive ClickHouse Query","date":"2023-09-18T00:00:00.000Z","tags":["clickhouse","replay","database"],"summary":"Finding a needle in a haystack is really difficult. Why make it harder than it needs to be?","images":["/images/lost-in-the-haystack/SnubaIntro.gif"],"layout":"PostLayout","canonicalUrl":"lost-in-the-haystack","authors":["coltonallen"],"slug":"lost-in-the-haystack"},{"title":"Measuring Session Replay Overhead","date":"2023-07-05T00:00:00.000Z","tags":["session replay","replay","web","javascript","sdk","performance"],"draft":false,"summary":"The best way to figure out how overhead impacts you is to measure it yourself. Follow along as we show you how we went about measuring overhead on Sentry and how you can measure it on your own applications.","images":["/images/measuring-session-replay-overhead/hero.jpg"],"layout":"PostSimple","canonicalUrl":null,"authors":["billyvong"],"slug":"measuring-session-replay-overhead"},{"title":"A locking war story","date":"2023-05-16T00:00:00.000Z","tags":["processing","symbolicator","rust"],"draft":false,"summary":"We recently migrated JavaScript/SourceMap processing to Rust where we were hitting a lock contention problem in our processing infrastructure that kept people up for a few days. What happened, why and how did we solve it?","images":["/images/locking-war-story-title.png"],"layout":"PostLayout","canonicalUrl":"https://swatinem.de/blog/locking-war-story/","authors":["arpadborsos"],"slug":"locking-war-story"},{"title":"How we built user interaction tracking for Jetpack Compose","date":"2023-04-21T00:00:00.000Z","tags":["Android","Jetpack Compose","Kotlin","Mobile"],"draft":false,"summary":"Knowing the user interactions which happened in your app right before it crashed is crucial context information for fixing errors. Tracking interactions like click and swipes manually can be tedious, so we at sentry looked into ways on how to do that automatically for your Jetpack Compose enabled Android app. Learn how you can intercept any touch event, how to determine Composable identifiers and ultimately how our sentry Android SDK ties it all together.","images":["/images/how-we-built-user-interaction-tracking-for-jetpack-compose/compose_hero.jpg"],"layout":"PostLayout","canonicalUrl":"https://proandroiddev.com/how-we-built-user-interaction-tracking-for-jetpack-compose-e3b1dd24f0ae","authors":["markushintersteiner"],"slug":"how-we-built-user-interaction-tracking-for-jetpack-compose"},{"title":"Self Identifying JavaScript Source Maps: The Case for Debug IDs","date":"2023-04-03T00:00:00.000Z","tags":["source maps","debugging","building sentry"],"draft":false,"summary":"What is a self identifying file, what are debug IDs and why do we want a fundamental change in the web ecosystem for source maps.","images":["/images/building-sentry-source-maps-and-their-problems/sourcemaps.gif"],"layout":"PostLayout","authors":["arminronacher"],"slug":"the-case-for-debug-ids"},{"title":"How we reduced CI time by 35% with Nx Caching","date":"2023-03-31T00:00:00.000Z","tags":["sdk","ci","javascript","building-sentry"],"draft":false,"summary":"Sentry is a very fast-moving company. In just one month we merged 165 pull requests from 19 authors and changed over 800 files, with a total of over 22,000 additions and almost 10,000 deletions. By updating to Lerna 6 with Nx caching, we were able to reduce our CI run times by about 35%. ","images":["/images/reduce-ci-time-with-nx-caching/hero.jpg"],"layout":"PostLayout","canonicalUrl":"https://sentry.engineering/blog/reduce-ci-time-with-nx-caching","authors":["francesconovy","nx_jameshenry","nx_miroslavjonas"],"slug":"reduce-ci-time-with-nx-caching"},{"title":"Sentry’s Frontend Tests: Migrating from Enzyme to React Testing Library","date":"2023-02-23T00:00:00.000Z","tags":["react","web","react testing library","enzyme"],"draft":false,"summary":"With over 700 pull requests a month, making sure Sentry's test suite runs quicky is extremely important. This post will talk about our journey converting our component tests from Enzyme to React Testing Library that took almost 18 months, 17 engineers and almost 5000 tests.","images":["/images/sentrys-frontend-tests-migrating-from-enzyme-to-react-testing-library/hero.jpg"],"layout":"PostLayout","canonicalUrl":"https://blog.sentry.io/2023/02/23/sentrys-frontend-tests-migrating-from-enzyme-to-react-testing-library/","authors":["priscilaoliveira","scottcooper"],"slug":"sentrys-frontend-tests-migrating-from-enzyme-to-react-testing-library"},{"title":"Getting Started with Jetpack Compose","date":"2023-02-15T00:00:00.000Z","tags":["mobile","jetpack compose","android"],"draft":false,"summary":"Jetpack Compose, a new declarative UI toolkit by Google made for building native Android apps, is rapidly gaining traction. The main advantage of using Jetpack Compose is that it allows you to write UI code that is more concise and easier to understand. This leads to improved maintainability and reduced development time. The main advantage of using Jetpack Compose is that it allows you to write UI code that is more concise and easier to understand. This leads to improved maintainability and reduced development time.","images":["/images/getting-started-with-jetpack-compose/jetpackcompose-hero.jpg"],"layout":"PostLayout","canonicalUrl":"https://blog.sentry.io/2023/02/15/getting-started-with-jetpack-compose/","authors":["lazarnikolov"],"slug":"getting-started-with-jetpack-compose"},{"title":"Mobile: The Future is Declarative","date":"2022-12-07T00:00:00.000Z","tags":["mobile","declarative ui","react native","flutter"],"draft":false,"summary":"The mobile development ecosystem has always been very diverse, arguably more diverse than the web development ecosystem. Both React Native and Flutter have a declarative approach from the start, but with Android and iOS now joining the declarative bandwagon, we can see that the future of mobile development is declarative.","images":["/images/mobile-the-future-is-declarative/hero.jpeg"],"layout":"PostLayout","canonicalUrl":"https://blog.sentry.io/2022/12/07/mobile-the-future-is-declarative/","authors":["lazarnikolov"],"slug":"mobile-the-future-is-declarative"},{"title":"How We Made JavaScript Stack Traces Awesome","date":"2022-11-30T00:00:00.000Z","tags":["javascript","errors","stack traces"],"draft":false,"summary":"Sentry helps every developer diagnose, fix, and optimize the performance of their code, and we need to deliver high quality stack traces in order to do so. In this blog post, we want to explain why source maps are insufficient for solving this problem, the challenges we faced, and how we eventually pulled it off by parsing JavaScript.","images":["/images/how-we-made-javascript-stack-traces-awesome/sourcemaps.png"],"layout":"PostLayout","canonicalUrl":"In this blog post, we want to explain why source maps are insufficient for solving this problem, the challenges we faced, and how we eventually pulled it off by parsing JavaScript.","authors":["arminronacher","arpadborsos","kamilogorek"],"slug":"how-we-made-javascript-stack-traces-awesome"},{"title":"How we run our Python tests in hundreds of environments really fast","date":"2022-11-14T00:00:00.000Z","tags":["python","sdk","testing"],"draft":false,"summary":"One of Sentries core company values is “for every developer”. We want to support every developer out there with our tools. But not every developer uses the newest or widely adopted tech stack, so we also try to support older versions of libraries and frameworks. To make sure that our SDK works correctly we have around 450 automated tests in our test suite that run for each change we make to the SDK.","images":[],"layout":"PostLayout","canonicalUrl":"https://blog.sentry.io/2022/11/14/how-we-run-our-python-tests-in-hundreds-of-environments-really-fast/","authors":["antonpirker"],"slug":"how-we-run-our-python-tests-in-hundreds-of-environments-really-fast"},{"title":"Building a Performant iOS Profiler","date":"2022-10-06T00:00:00.000Z","tags":["profiling","mobile","iOS"],"draft":false,"summary":"Profilers measure the performance of a program at runtime by adding instrumentation to collect information about the frequency and duration of function calls. They are crucial tools for understanding the real-world performance characteristics of code and are often the first step in optimizing a program. In this post, we’ll walk through how we built Sentry’s iOS profiler, which is capable of collecting high quality profiling data from real user devices in production with minimal overhead.","images":[],"layout":"PostLayout","canonicalUrl":"https://blog.sentry.io/2022/10/06/building-an-ios-profiler/","authors":["indragiekarunaratne"],"slug":"building-a-performant-ios-profiler"},{"title":"Relay as a Lambda Extension Using the Actor Model in Rust","date":"2022-09-22T00:00:00.000Z","tags":["rust","relay","infrastructure"],"draft":false,"summary":"Relay is an open source project by Sentry that receives data from Sentry SDKs for pre-processing. We wanted to make Relay behave like an AWS Lambda Extension moving our service closer to your code, and decreasing the latency of your Lambda functions. In this blog post, I’ll share how we used the actor model to set up Relay to behave like a Lambda Extension.","images":[],"layout":"PostLayout","canonicalUrl":"https://blog.sentry.io/2022/09/22/relay-as-a-lambda-extension-using-the-actor-model-in-rust/","authors":["antonpirker"],"slug":"relay-as-a-lambda-extension-using-the-actor-model-in-rust"},{"title":"Understanding the Performance Impact of Generated JavaScript","date":"2022-07-22T00:00:00.000Z","tags":["javascript","performance","sdk"],"draft":false,"summary":"In the modern web, the JavaScript you write is often down-compiled using a compiler like Babel to make sure your JavaScript is compatible with older browsers or environments. In addition, if you are using TypeScript (like the Sentry SDK’s do) or something similar, you’ll have to transpile your TypeScript to JavaScript. Understanding how your code is being transpiled and downcompiled is important, because your bundle size is affected by your final generated JavaScript. This post is all about the technical prep work needed to ship a 0 bug reported major issue.","images":[],"layout":"PostLayout","canonicalUrl":"https://blog.sentry.io/2022/07/22/performance-impact-of-generated-javascript/","authors":["abhijeetprasad","katiebyers"],"slug":"understanding-the-performance-impact-of-generated-javascript"},{"title":"JavaScript SDK “Package Size is Massive” - So we reduced it by 29%","date":"2022-07-19T00:00:00.000Z","tags":["javascript","sdk","web"],"draft":false,"summary":"Developers started to notice just how big our JavaScript package was and yeah, we knew. We weren’t ignoring the issues; after all, we don’t want the Sentry package to be the cause of a slowdown. But to reduce our JavaScript SDK package size effectively we had to account for shipping new capabilities, like being able to manage the health of a release and performance monitoring, while maintaining a manageable bundle size. After all, new features == bigger package - usually.","images":[],"layout":"PostLayout","canonicalUrl":"https://blog.sentry.io/2022/07/19/javascript-sdk-package-reduced/","authors":["abhijeetprasad"],"slug":"javascript-sdk-package-reduced"},{"title":"Sentry Points of Presence: How We Built a Distributed Ingestion Infrastructure","date":"2022-03-31T00:00:00.000Z","tags":["infrastructure","relay","points of presence"],"draft":false,"summary":"Event ingestion is one of the most mission-critical components at Sentry, so it’s only natural that we constantly strive to improve its scalability and efficiency. In this blog post, we want to share our journey of designing and building a distributed ingestion infrastructure—Sentry Points of Presence— that handles billions of events per day and helps thousands of organizations see what actually matters and solve critical issues quickly.","images":[],"layout":"PostLayout","canonicalUrl":"https://blog.sentry.io/2022/03/31/sentry-points-of-presence-how-we-built-a-distributed-ingestion/","authors":["antonovchinnikov"],"slug":"sentry-points-of-presence-how-we-built-a-distributed-ingestion-infrastructure"},{"title":"How we trimmed the Sentry JavaScript SDK file size by 20%","date":"2022-02-28T00:00:00.000Z","tags":["javascript","web","sdk"],"draft":false,"summary":"SDKs naturally increase in size over time. After all, it does take more bytes to implement more features. This is not a big deal for most languages—the relative size of each new feature is small, and load times and storage aren’t big concerns for code running on a server. Larger JS bundles mean longer load times, which in turn increase user misery, which then can cause the user to leave pages entirely.","images":[],"layout":"PostLayout","canonicalUrl":"https://blog.sentry.io/2022/02/28/js-browser-sdk-bundle-size-matters/","authors":["abhijeetprasad","katiebyers","steveneubank"],"slug":"js-browser-sdk-bundle-size-matters"},{"title":"Alias: An approach to .NET Assembly Conflict Resolution","date":"2022-02-24T00:00:00.000Z","tags":[".net","sdk"],"draft":false,"summary":"Most plugin based models load all assemblies into a single shared context. This is a common approach because it has better memory usage and startup performance. The history and rules of assembly loading in .NET is convoluted; its current status makes it difficult (and sometimes impossible) to load multiple different versions of the same assembly into a shared context. Instead of trying to struggle with existing options we decided to build a new tool: Alias.","images":[],"layout":"PostLayout","canonicalUrl":"https://blog.sentry.io/2022/02/24/alias-an-approach-to-net-assembly-conflict-resolution/","authors":["brunogarcia","simoncropp"],"slug":"alias-an-approach-to-net-assembly-conflict-resolution"},{"title":"Distributed Tracing 101 for Full Stack Developers","date":"2021-08-12T00:00:00.000Z","tags":["performance","web","distributed tracing"],"draft":false,"summary":"In today’s modern web stack it’s anything but. Full stack developers are expected to write JavaScript executing in the browser, interop with multiple database technologies, and deploy server side code on different server architectures (e.g. serverless). Without the right tools, understanding how a user interaction in the browser cascades into a 500 server error deep in your server stack is nigh-impossible. Enter: distributed tracing.","images":[],"layout":"PostLayout","canonicalUrl":"https://blog.sentry.io/2021/08/12/distributed-tracing-101-for-full-stack-developers/","authors":["benvinegar"],"slug":"distributed-tracing-101-for-full-stack-developers"},{"title":"Slow and Steady: Converting Sentry’s Entire Frontend to TypeScript","date":"2021-04-12T00:00:00.000Z","tags":["typescript","web","react","javascript"],"draft":false,"summary":"Recently, Sentry converted 100% of its frontend React codebase from JavaScript to TypeScript. This year-long effort spanned over a dozen members of the engineering team, 1,100 files, and 95,000 lines of code.\nIn this blog post, we share our process, techniques, challenges, and ultimately, what we learned along this journey.","images":[],"layout":"PostLayout","canonicalUrl":"https://blog.sentry.io/2021/04/12/slow-and-steady-converting-sentrys-entire-frontend-to-typescript/","authors":["markstory","priscilaoliveira"],"slug":"slow-and-steady-converting-sentrys-entire-frontend-to-typescript"},{"title":"How we grew Sentry's monthly active users by rethinking invitations","date":"2020-02-12T00:00:00.000Z","tags":["building sentry","growth"],"draft":false,"summary":"At its core, Sentry is a tool that alerts you to defects in your production software. But it does more than blast stack traces into your inbox: Sentry provides powerful workflows to help your team determine root cause, triage issues to your team, and keep tabs on ongoing concerns with comments and notifications. At the end of 2019, the Growth team made it our mission to make it easier for our users to invite their teammates to join them on Sentry. Our theory: improving the user experience of inviting users, as well as democratizing the process to include all team members would lead to a significant increase in team-wide adoption. (Narrator: it did.)","images":["/images/how-we-grew-sentrys-monthly-active-users-by-rethinking-invitations/hero.jpg"],"layout":"PostLayout","canonicalUrl":"https://blog.sentry.io/2020/02/12/how-we-grew-sentrys-monthly-active-users-by-rethinking-invitations/","authors":["benvinegar","evanpurkhiser"],"slug":"how-we-grew-sentrys-monthly-active-users-by-rethinking-invitations"},{"title":"How to Mutate Data in a System Designed for Immutable Data","date":"2019-10-25T00:00:00.000Z","tags":["clickhouse","databases","building sentry"],"draft":false,"summary":"Sentry’s growth led to increased write and read load on our databases, and, even after countless rounds of query and index optimizations, we felt that our databases were always a hair’s breadth from the next performance tipping point or query planner meltdown. Increased write load also led to increased storage requirements (if you’re doing more writes, you’re going to need more places to put them), and we were running what felt like an inordinate number of servers with a lot of disks for the data they were responsible for storing. Here’s a look at how we attempted to understand which database system was right for us and how we adapted our approach when we encountered some unexpected challenges.","images":["/images/how-to-mutate-data-in-a-system-designed-for-immutable-data/hero.gif"],"layout":"PostLayout","canonicalUrl":"https://blog.sentry.io/2019/10/25/how-to-mutate-data-in-a-system-designed-for-immutable-data/","authors":["filippopacifici","jamescunningham","tedkaemming"],"slug":"how-to-mutate-data-in-a-system-designed-for-immutable-data"},{"title":"Building Sentry: Source maps and their problems","date":"2019-07-16T00:00:00.000Z","tags":["source maps","debugging","building sentry"],"draft":false,"summary":"Other than Python, JavaScript is the oldest platform that Sentry properly supports, which makes sense considering many Python services (including Sentry itself) have a JavaScript front-end. The system that almost everybody uses to debug transpiled code (and the hopefully apparent subject of this blog post) is source maps. Today, we want to focus on some of the their shortcomings and why source maps cause problems for platforms like Sentry.","images":["/images/building-sentry-source-maps-and-their-problems/sourcemaps.gif"],"layout":"PostLayout","canonicalUrl":"https://blog.sentry.io/2019/07/16/building-sentry-source-maps-and-their-problems/","authors":["arminronacher"],"slug":"building-sentry-source-maps-and-their-problems"},{"title":"Building Sentry: Symbolicator","date":"2019-06-13T00:00:00.000Z","tags":["symbolicator","building sentry","native"],"draft":false,"summary":"Over two years ago, Sentry started supporting its first native platform: iOS. Since then, we’ve added support for many other platforms via minidumps and recently introduced our own SDK for native applications to make capturing all that precious information more accessible. Now, the time has come to lift the curtain and show you how we handle native crashes in Sentry. Join us on a multi-year journey from our first baby-steps at native crash analysis to Symbolicator, the reusable open-source service that we’ve built to make native crash reporting easier than ever.","images":["/images/building-sentry-symbolicator/symbolicator.gif"],"layout":"PostLayout","canonicalUrl":"https://blog.sentry.io/2019/06/13/building-a-sentry-symbolicator/","authors":["janmichaelauer"],"slug":"building-sentry-symbolicator"},{"title":"Introducing Snuba: Sentry's New Search Infrastructure","date":"2019-05-16T00:00:00.000Z","tags":["building sentry","database","clickhouse","snuba"],"draft":false,"summary":"For most of 2018, we worked on an overhaul of our underlying event storage system. We’d like to introduce you to the result of this work — Snuba, the primary storage and query service for event data that powers Sentry in production.","images":["/images/introducing-snuba-sentrys-new-search-infrastructure/SnubaIntro.gif"],"layout":"PostLayout","canonicalUrl":"https://blog.sentry.io/2019/05/16/introducing-snuba-sentrys-new-search-infrastructure/","authors":["default"],"slug":"introducing-snuba-sentrys-new-search-infrastructure"}],"authorDetails":[{"name":"Abhijeet Prasad","avatar":"/static/avatars/default.png","occupation":"Senior Software Engineer","twitter":"https://twitter.com/imabhiprasad","github":"https://github.com/AbhiPrasad","slug":"abhijeetprasad","date":null},{"name":"Adam McKerlie","avatar":"/static/avatars/adammckerlie.png","occupation":"Director of Engineering","twitter":"https://twitter.com/adammckerlie","linkedin":"https://www.linkedin.com/adammckerlie","url":"https://mckerlie.com","slug":"adammckerlie","date":null},{"name":"Andrew McKnight","avatar":"/static/avatars/andrewmcknight.jpg","occupation":"Senior Software Engineer","github":"https://github.com/armcknight","url":"https://armcknight.com","slug":"andrewmcknight","date":null},{"name":"Anton Ovchinnikov","avatar":"/static/avatars/antonovchinnikov.png","occupation":"Senior Software Engineer","github":"https://github.com/tonyo","url":"https://tonyo.info/","slug":"antonovchinnikov","date":null},{"name":"Anton Pirker","avatar":"/static/avatars/antonpirker.png","occupation":"Senior Software Engineer","url":"https://anton-pirker.at/","github":"https://github.com/antonpirker/","linkedin":"https://www.linkedin.com/in/antonpirker/","slug":"antonpirker","date":null},{"name":"Armin Ronacher","avatar":"/static/avatars/arminronacher.png","occupation":"Principal Architect","stackoverflow":"https://stackoverflow.com/users/19990/armin-ronacher","twitter":"https://twitter.com/mitsuhiko","slug":"arminronacher","date":null},{"name":"Arpad Borsos","avatar":"/static/avatars/arpadborsos.png","occupation":"Senior Software Engineer","url":"https://swatinem.de/","github":"https://github.com/Swatinem","slug":"arpadborsos","date":null},{"name":"Ash Anand","avatar":"/static/avatars/default.png","occupation":"Software Engineer","github":"https://github.com/0Calories","slug":"ashanand","date":null},{"name":"Ben Vinegar","avatar":"/static/avatars/benvinegar.png","occupation":"VP of Emerging Technologies","twitter":"https://twitter.com/bentlegen","github":"https://github.com/benvinegar","linkedin":"https://www.linkedin.com/in/benvinegar/","url":"https://benv.ca/","slug":"benvinegar","date":null},{"name":"Billy Vong","avatar":"/static/avatars/billyvong.png","occupation":"Senior Software Engineer","twitter":"https://twitter.com/billyvg","github":"https://github.com/billyvg","slug":"billyvong","date":null},{"name":"Bruno Garcia","avatar":"/static/avatars/brunogarcia.png","occupation":"Engineering Manager","twitter":"https://twitter.com/brungarc","stackoverflow":"https://stackoverflow.com/users/1977143/bruno-garcia","github":"https://github.com/bruno-garcia","url":"https://garcia.in","slug":"brunogarcia","date":null},{"name":"Catherine Lee","avatar":"/static/avatars/catherinelee.jpg","occupation":"Software Engineer","github":"https://github.com/c298lee","linkedin":"https://www.linkedin.com/in/catherine-lee-uw/","slug":"catherinelee","date":null},{"name":"Cathy Teng","avatar":"https://avatars.githubusercontent.com/u/70817427","occupation":"Software Engineer","github":"https://github.com/cathteng","linkedin":"https://www.linkedin.com/in/cathyteng/","slug":"cathyteng","date":null},{"name":"Colin Chartier","avatar":"/static/avatars/colinchartier.jpeg","occupation":"Software","github":"https://github.com/colinchartier","url":"https://colinchartier.com","slug":"colinchartier","date":null},{"name":"Colton Allen","avatar":"/static/avatars/coltonallen.jpg","occupation":"Senior Software Engineer","github":"https://github.com/cmanallen","slug":"coltonallen","date":null},{"name":"Sentry Engineer","avatar":"/static/avatars/default.png","twitter":"https://twitter.com/getsentry","github":"https://github.com/getsentry/sentry","slug":"default","date":null},{"name":"Edward Gou","avatar":"/static/avatars/default.png","occupation":"Software Engineer","github":"https://github.com/edwardgou-sentry","slug":"edwardgou","date":null},{"name":"Evan Purkhiser","avatar":"/static/avatars/evanpurkhiser.png","occupation":"Senior Software Engineer","ur":"https://evanpurkhiser.com/","github":"https://github.com/evanpurkhiser","slug":"evanpurkhiser","date":null},{"name":"Filippo Pacifici","avatar":"/static/avatars/filippopacifici.png","occupation":"Staff Engineer","twitter":"https://twitter.com/filippopacifici","slug":"filippopacifici","date":null},{"name":"Francesco Novy","avatar":"/static/avatars/francesconovy.jpeg","occupation":"Senior Software Engineer","github":"https://github.com/mydea","url":"https://fnovy.com/","slug":"francesconovy","date":null},{"name":"George Gritsouk","avatar":"/static/avatars/georgegritsouk.png","occupation":"Senior Software Engineer","github":"https://github.com/gggritso/","url":"https://strict-machine.com/","slug":"georgegritsouk","date":null},{"name":"Indragie Karunaratne","avatar":"/static/avatars/indragiekarunaratne.png","occupation":"Director of Engineering","twitter":"https://twitter.com/indragie","linkedin":"https://linkedin.com/in/indragie/","stackoverflow":"https://stackoverflow.com/users/153112/indragie","url":"https://indragie.com/","slug":"indragiekarunaratne","date":null},{"name":"James Crosswell","avatar":"/static/avatars/jamescrosswell.jpg","occupation":"Software Engineering Contractor","twitter":"https://twitter.com/jamescrosswell","stackoverflow":"https://stackoverflow.com/users/1182461/james-crosswell","github":"https://github.com/jamescrosswell","linkedin":"https://www.linkedin.com/in/jamescrosswell/","slug":"jamescrosswell","date":null},{"name":"James Cunningham","avatar":"/static/avatars/james.png","occupation":"Engineer","twitter":"https://twitter.com/jtcunning","slug":"jamescunningham","date":null},{"name":"Jan Michael Auer","avatar":"/static/avatars/jan.png","occupation":"Staff Engineering","twitter":"https://twitter.com/jan_auer","stackoverflow":"https://stackoverflow.com/users/4228225/jan-michael-auer","github":"https://github.com/jan-auer","slug":"janmichaelauer","date":null},{"name":"Kamil Ogórek","avatar":"/static/avatars/kamilogorek.png","occupation":"Senior Software Engineer","twitter":"https://twitter.com/kamilogorek","stackoverflow":"https://stackoverflow.com/users/1690906/kamil-og%c3%b3rek","linkedin":"https://linkedin.com/in/kamilogorek/","slug":"kamilogorek","date":null},{"name":"Katie Byers","avatar":"/static/avatars/katiebyers.jpeg","occupation":"Software Engineer","github":"https://github.com/lobsterkatie","linkedin":"https://www.linkedin.com/in/byerskatie/","slug":"katiebyers","date":null},{"name":"Lazar Nikolov","avatar":"/static/avatars/lazarnikolov.png","occupation":"Developer Advocate","twitter":"https://twitter.com/NikolovLazar","slug":"lazarnikolov","date":null},{"name":"Luca Forstner","avatar":"/static/avatars/default.png","occupation":"Software Engineer","twitter":"https://twitter.com/LucaForstner","github":"https://github.com/lforst","slug":"lucaforstner","date":null},{"name":"Lukas Stracke","avatar":"/static/avatars/lukasstracke.jpg","occupation":"Software Engineer","twitter":"https://twitter.com/lukasstracke","github":"https://github.com/Lms24","url":"https://stracke.tech/","slug":"lukasstracke","date":null},{"name":"Mark Story","avatar":"/static/avatars/markstory.png","occupation":"Staff Engineer","stackoverflow":"https://stackoverflow.com/users/186379/mark-story","twitter":"https://mastodon.social/@markstory","github":"https://github.com/markstory","url":"https://mark-story.com","slug":"markstory","date":null},{"name":"Markus Hintersteiner","avatar":"/static/avatars/markushintersteiner.jpg","twitter":"https://twitter.com/markushi_","github":"https://github.com/markushi","url":"https://androiddev.social/@markushi","slug":"markushintersteiner","date":null},{"name":"Mike Ihbe","avatar":"/static/avatars/mikeihbe.png","occupation":"Director of Engineering","twitter":"https://twitter.com/mikeihbe","github":"https://github.com/mikejihbe","linkedin":"https://www.linkedin.com/in/mike-ihbe/","slug":"mikeihbe","date":null},{"name":"Nicholas Deschenes","avatar":"/static/avatars/nicholasdeschenes.png","occupation":"Software Engineer","twitter":"https://twitter.com/_Idez_","github":"https://github.com/nsdeschenes","slug":"nicholasdeschenes","date":null},{"name":"James Henry (Nx)","avatar":"/static/avatars/default.png","occupation":"Director of Engineering @ Nx","twitter":"https://twitter.com/mrjameshenry","github":"https://github.com/JamesHenry","slug":"nx_jameshenry","date":null},{"name":"Miroslav Jonaš (Nx)","avatar":"/static/avatars/default.png","occupation":"Software Engineer @ Nx","twitter":"https://twitter.com/meeroslav","github":"https://github.com/meeroslav","slug":"nx_miroslavjonas","date":null},{"name":"Priscila Oliveira","avatar":"/static/avatars/priscilaoliveira.png","occupation":"Software Engineer","twitter":"https://twitter.com/priscilawebdev","url":"https://priscilawebdev.github.io/priscilaoliveira/","linkedin":"https://www.linkedin.com/in/priscilawebdev","github":"https://github.com/priscilawebdev","slug":"priscilaoliveira","date":null},{"name":"Scott Cooper","avatar":"/static/avatars/scottcooper.png","occupation":"Senior Software Engineer","twitter":"https://twitter.com/scttcper","slug":"scottcooper","date":null},{"name":"Simon Cropp","avatar":"/static/avatars/default.png","stackoverflow":"https://stackoverflow.com/users/53158/simon","github":"https://github.com/SimonCropp","slug":"simoncropp","date":null},{"name":"Stefan Jandl","avatar":"/static/avatars/stefanjandl.png","occupation":"Software Engineer","twitter":"https://twitter.com/bitsandfoxes","github":"https://github.com/bitsandfoxes","slug":"stefanjandl","date":null},{"name":"Steven Eubank","avatar":"/static/avatars/default.png","occupation":"Product Manager","twitter":"https://twitter.com/steven_boKnows","linkedin":"https://linkedin.com/in/https://www.linkedin.com/in/steven-eubank-72a2316b//","slug":"steveneubank","date":null},{"name":"Ted Kaemming","avatar":"/static/avatars/ted.png","occupation":"Engineer","twitter":"https://twitter.com/tkaemming","slug":"tedkaemming","date":null},{"name":"Yagiz Nizipli","avatar":"https://avatars.githubusercontent.com/u/1935246?v=4","occupation":"Senior Software Engineer","twitter":"https://twitter.com/yagiznizipli","github":"https://github.com/anonrig","slug":"yagiznizipli","date":null}]},"__N_SSG":true},"page":"/","query":{},"buildId":"ydRpLbP6uXOHOpnd6Ok1e","isFallback":false,"gsp":true,"scriptLoader":[]}</script></body></html>