<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Signals & Noise]]></title><description><![CDATA[A publication that distills clarity from complexity across engineering, startups, and personal growth.
Filtering the signals from the noise in a world full of information overload.]]></description><link>https://blog.ankandutta.in</link><image><url>https://substackcdn.com/image/fetch/$s_!nTjR!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73d8e64c-b6bf-4a03-8700-234969b3cf66_1024x1024.png</url><title>Signals &amp; Noise</title><link>https://blog.ankandutta.in</link></image><generator>Substack</generator><lastBuildDate>Fri, 10 Apr 2026 15:14:56 GMT</lastBuildDate><atom:link href="https://blog.ankandutta.in/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Ankan Dutta]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[ankandutta@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[ankandutta@substack.com]]></itunes:email><itunes:name><![CDATA[Ankan Dutta]]></itunes:name></itunes:owner><itunes:author><![CDATA[Ankan Dutta]]></itunes:author><googleplay:owner><![CDATA[ankandutta@substack.com]]></googleplay:owner><googleplay:email><![CDATA[ankandutta@substack.com]]></googleplay:email><googleplay:author><![CDATA[Ankan Dutta]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Rethinking Profilis and Observability]]></title><description><![CDATA[Design decisions beyond the first major release]]></description><link>https://blog.ankandutta.in/p/rethinking-profilis-and-observability</link><guid isPermaLink="false">https://blog.ankandutta.in/p/rethinking-profilis-and-observability</guid><dc:creator><![CDATA[Ankan Dutta]]></dc:creator><pubDate>Thu, 12 Mar 2026 17:31:31 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/932bfe65-fe20-446a-8c39-d90e4e53c24d_1024x608.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>It&#8217;s been a while since I wrote a blog.</p><p>The last few months have mostly been spent building <strong><a href="https://github.com/ankan97dutta/profilis">Profilis</a></strong>, a lightweight observability tool for Python services. <code>v1.0.0</code> is now out, and it proved a few important ideas:</p><ul><li><p>Event creation should be extremely cheap.</p></li><li><p>Observability should never block the request path.</p></li><li><p>Instrumentation should remain framework agnostic.</p></li></ul><p>In other words, observability should behave like <strong>infrastructure</strong>, not an experiment.</p><p>But shipping the first version also surfaced new questions.</p><p>The architecture works, but several parts of the system still feel&#8230; fluid:</p><ul><li><p>the event schema is flexible but not formally defined</p></li><li><p>the collector works well in a single process but multiworker deployments need clearer guidance</p></li><li><p>exporters are powerful, but pipelines are implicit</p></li></ul><p>So before jumping into features, I started thinking about <strong>Profilis v2</strong> in a slightly different way.</p><p>Instead of designing features, I started asking a sequence of architectural questions.</p><div><hr></div><h2>The Current Architecture</h2><p>At its core, Profilis is a small telemetry pipeline.</p><p>Instrumentation produces events.<br>Those events are buffered asynchronously.<br>Then exporters consume batches.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dLHY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd728e063-252f-48bf-b767-8f8096cde678_2578x845.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dLHY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd728e063-252f-48bf-b767-8f8096cde678_2578x845.png 424w, https://substackcdn.com/image/fetch/$s_!dLHY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd728e063-252f-48bf-b767-8f8096cde678_2578x845.png 848w, https://substackcdn.com/image/fetch/$s_!dLHY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd728e063-252f-48bf-b767-8f8096cde678_2578x845.png 1272w, https://substackcdn.com/image/fetch/$s_!dLHY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd728e063-252f-48bf-b767-8f8096cde678_2578x845.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dLHY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd728e063-252f-48bf-b767-8f8096cde678_2578x845.png" width="1456" height="477" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d728e063-252f-48bf-b767-8f8096cde678_2578x845.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:477,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:522543,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.ankandutta.in/i/190711214?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd728e063-252f-48bf-b767-8f8096cde678_2578x845.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!dLHY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd728e063-252f-48bf-b767-8f8096cde678_2578x845.png 424w, https://substackcdn.com/image/fetch/$s_!dLHY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd728e063-252f-48bf-b767-8f8096cde678_2578x845.png 848w, https://substackcdn.com/image/fetch/$s_!dLHY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd728e063-252f-48bf-b767-8f8096cde678_2578x845.png 1272w, https://substackcdn.com/image/fetch/$s_!dLHY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd728e063-252f-48bf-b767-8f8096cde678_2578x845.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Profilis Architecture</figcaption></figure></div><p>The design goal is simple:</p><blockquote><p><em>Keep the hot path extremely cheap.</em></p></blockquote><p>Instrumentation emits small dictionary events, which the collector batches and forwards to exporters on a background thread.</p><p>This keeps observability from interfering with request latency.</p><p>But the current version also left several design questions open.</p><div><hr></div><h2>Should Profilis Have a Stable Event Schema?</h2><p>Right now events are simple dictionaries.</p><p>Example:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;json&quot;,&quot;nodeId&quot;:&quot;12f2ddda-154b-4d76-b1d4-d42d279bb981&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-json">{
  &#8220;kind&#8221;: &#8220;HTTP&#8221;,
  &#8220;method&#8221;: &#8220;GET&#8221;,
  &#8220;route&#8221;: &#8220;/orders&#8221;,
  &#8220;dur_ns&#8221;: 148200,
  &#8220;status&#8221;: 200
}</code></pre></div><p>This flexibility made development easy. Adapters could evolve quickly without worrying about strict schemas.</p><p>But over time this becomes risky.</p><p>Exporters need predictable fields.<br><br>Event evolution becomes implicit.<br><br>Backward compatibility becomes unclear.</p><p>So the first question is straightforward:</p><p><strong>Should events have a versioned schema?</strong></p><p>And I can think of two possible scenarios here</p><h4>1. Keep Flexible Dict Events</h4><p>Pros:</p><ul><li><p>adapters remain simple</p></li><li><p>schema evolution stays flexible</p></li></ul><p>Cons:</p><ul><li><p>exporters must tolerate schema drift</p></li><li><p>compatibility guarantees remain unclear</p></li></ul><h4>2. Introduce a Versioned Schema</h4><p>Events could include explicit metadata:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;json&quot;,&quot;nodeId&quot;:&quot;9a61686c-93fd-4d5e-a39a-3f391d4d2012&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-json">{
  &#8220;schema_version&#8221;: &#8220;2.0&#8221;,
  &#8220;profilis_version&#8221;: &#8220;2.x&#8221;,
  ...
}</code></pre></div><p>This allows exporters and processors to rely on a stable contract.</p><p>The likely direction for <code>v2</code> is a <strong>versioned schema</strong>, while still keeping <strong>plain dictionaries on the wire</strong> for performance.</p><p>Internally, typed contracts (<code>TypedDict</code>) can enforce structure without slowing down emission.</p><div><hr></div><h2>Should the Collector Become Async?</h2><p>Modern Python frameworks are increasingly async first.</p><p>That raises an obvious question.</p><p>Should <code>AsyncCollector</code> actually become an <code>asyncio</code> task?</p><p>A hypothetical async collector might look like this:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;3e6bd45e-f483-49d0-8e09-e69eb8e2fdaa&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">async def collector():
    while True:
        batch = await queue.get()
        await exporter.send(batch)</code></pre></div><p>At first glance this feels natural.</p><p>But there&#8217;s a subtle problem.</p><p>Profilis deliberately keeps the telemetry process <strong>separate from the application runtime</strong>.</p><p>If the collector depends on the application event loop:</p><ul><li><p>event loop congestion could affect telemetry</p></li><li><p>exporters could interfere with request scheduling</p></li><li><p>instrumentation behavior becomes framework dependent</p></li></ul><p>The current implementation avoids this entirely by using a <strong>dedicated worker thread</strong>.</p><p>So the design question becomes:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Oh8u!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faccddf80-497c-4e97-8cee-e12e7c19264d_993x440.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Oh8u!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faccddf80-497c-4e97-8cee-e12e7c19264d_993x440.png 424w, https://substackcdn.com/image/fetch/$s_!Oh8u!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faccddf80-497c-4e97-8cee-e12e7c19264d_993x440.png 848w, https://substackcdn.com/image/fetch/$s_!Oh8u!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faccddf80-497c-4e97-8cee-e12e7c19264d_993x440.png 1272w, https://substackcdn.com/image/fetch/$s_!Oh8u!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faccddf80-497c-4e97-8cee-e12e7c19264d_993x440.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Oh8u!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faccddf80-497c-4e97-8cee-e12e7c19264d_993x440.png" width="993" height="440" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/accddf80-497c-4e97-8cee-e12e7c19264d_993x440.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:440,&quot;width&quot;:993,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:197573,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.ankandutta.in/i/190711214?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faccddf80-497c-4e97-8cee-e12e7c19264d_993x440.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Oh8u!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faccddf80-497c-4e97-8cee-e12e7c19264d_993x440.png 424w, https://substackcdn.com/image/fetch/$s_!Oh8u!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faccddf80-497c-4e97-8cee-e12e7c19264d_993x440.png 848w, https://substackcdn.com/image/fetch/$s_!Oh8u!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faccddf80-497c-4e97-8cee-e12e7c19264d_993x440.png 1272w, https://substackcdn.com/image/fetch/$s_!Oh8u!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faccddf80-497c-4e97-8cee-e12e7c19264d_993x440.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>For now, the threaded collector remains the safer option.</p><p>It keeps the observability pipeline independent of whether the application is:</p><ul><li><p>synchronous</p></li><li><p>asynchronous</p></li><li><p>or a hybrid stack.</p></li></ul><div><hr></div><h2>How Should Profilis Work Across Workers?</h2><p>Single process applications are easy.</p><p>But production deployments often look like this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gYfj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936275e4-a47d-4ddb-82c9-c2b76307d5df_1054x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gYfj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936275e4-a47d-4ddb-82c9-c2b76307d5df_1054x900.png 424w, https://substackcdn.com/image/fetch/$s_!gYfj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936275e4-a47d-4ddb-82c9-c2b76307d5df_1054x900.png 848w, https://substackcdn.com/image/fetch/$s_!gYfj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936275e4-a47d-4ddb-82c9-c2b76307d5df_1054x900.png 1272w, https://substackcdn.com/image/fetch/$s_!gYfj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936275e4-a47d-4ddb-82c9-c2b76307d5df_1054x900.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gYfj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936275e4-a47d-4ddb-82c9-c2b76307d5df_1054x900.png" width="1054" height="900" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/936275e4-a47d-4ddb-82c9-c2b76307d5df_1054x900.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:900,&quot;width&quot;:1054,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:371005,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.ankandutta.in/i/190711214?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936275e4-a47d-4ddb-82c9-c2b76307d5df_1054x900.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!gYfj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936275e4-a47d-4ddb-82c9-c2b76307d5df_1054x900.png 424w, https://substackcdn.com/image/fetch/$s_!gYfj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936275e4-a47d-4ddb-82c9-c2b76307d5df_1054x900.png 848w, https://substackcdn.com/image/fetch/$s_!gYfj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936275e4-a47d-4ddb-82c9-c2b76307d5df_1054x900.png 1272w, https://substackcdn.com/image/fetch/$s_!gYfj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F936275e4-a47d-4ddb-82c9-c2b76307d5df_1054x900.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Each worker runs its own collector.</p><p>This works, but it fragments telemetry.</p><p>So <code>v2</code> raises an important design question:</p><p><strong>Should collectors remain process local, or should workers forward events to a shared pipeline?</strong></p><p>Possible directions I can think of from here:</p><h4>1. Per Worker Pipelines</h4><p>Each worker exports its own telemetry.</p><p>Pros:</p><ul><li><p>simplest architecture</p></li><li><p>no inter process communication</p></li></ul><p>Cons:</p><ul><li><p>fragmented aggregation</p></li></ul><h4>2. Shared Collector Process</h4><p>Workers forward events to a central collector.</p><p>Possible transports:</p><ul><li><p>Unix sockets</p></li><li><p>UDP</p></li><li><p>shared queues</p></li></ul><p>Pros:</p><ul><li><p>centralized processing</p></li><li><p>unified exporters</p></li></ul><p>Cons:</p><ul><li><p>increased complexity</p></li><li><p>potential bottlenecks</p></li></ul><p>The likely direction would be <strong>optional shared collectors</strong>, while keeping the default architecture simple.</p><div><hr></div><h2>Should Pipelines Become Explicit?</h2><p>In <code>v1</code> the collector sends batches directly to sinks.</p><p>But real telemetry pipelines often require intermediate processing:</p><ul><li><p>metadata enrichment</p></li><li><p>route normalization</p></li><li><p>PII redaction</p></li><li><p>sampling adjustments</p></li></ul><p>So another question emerges.</p><p>Should Profilis introduce a processing stage?</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8oLb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cd739a9-0417-49b9-8565-dc2d3c9f44ac_1392x160.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8oLb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cd739a9-0417-49b9-8565-dc2d3c9f44ac_1392x160.png 424w, https://substackcdn.com/image/fetch/$s_!8oLb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cd739a9-0417-49b9-8565-dc2d3c9f44ac_1392x160.png 848w, https://substackcdn.com/image/fetch/$s_!8oLb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cd739a9-0417-49b9-8565-dc2d3c9f44ac_1392x160.png 1272w, https://substackcdn.com/image/fetch/$s_!8oLb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cd739a9-0417-49b9-8565-dc2d3c9f44ac_1392x160.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8oLb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cd739a9-0417-49b9-8565-dc2d3c9f44ac_1392x160.png" width="1392" height="160" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4cd739a9-0417-49b9-8565-dc2d3c9f44ac_1392x160.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:160,&quot;width&quot;:1392,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:113401,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.ankandutta.in/i/190711214?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cd739a9-0417-49b9-8565-dc2d3c9f44ac_1392x160.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!8oLb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cd739a9-0417-49b9-8565-dc2d3c9f44ac_1392x160.png 424w, https://substackcdn.com/image/fetch/$s_!8oLb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cd739a9-0417-49b9-8565-dc2d3c9f44ac_1392x160.png 848w, https://substackcdn.com/image/fetch/$s_!8oLb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cd739a9-0417-49b9-8565-dc2d3c9f44ac_1392x160.png 1272w, https://substackcdn.com/image/fetch/$s_!8oLb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cd739a9-0417-49b9-8565-dc2d3c9f44ac_1392x160.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Processors could add functionality without complicating exporters.</p><p>But the key constraint remains performance.</p><p>If processors become expensive, they defeat the purpose of the architecture.</p><p>So if <code>v2</code> introduces processors, they must remain <strong>extremely lightweight</strong>.</p><div><hr></div><h2>Should Profilis Integrate with OpenTelemetry?</h2><p>OpenTelemetry has effectively become the default observability ecosystem.</p><p>That raises another design question.</p><p>Should Profilis become a wrapper around OpenTelemetry?</p><p>Two directions are possible.</p><h4>1. Native OpenTelemetry</h4><p>Profilis emits spans through OpenTelemetry APIs.</p><p>Pros:</p><ul><li><p>ecosystem compatibility</p></li><li><p>existing exporters</p></li></ul><p>Cons:</p><ul><li><p>larger runtime footprint</p></li><li><p>reduced control over performance</p></li></ul><h4>2. Lightweight Bridge</h4><p>Profilis keeps its own pipeline but:</p><ul><li><p>reads OTEL trace context</p></li><li><p>exports events via OTLP</p></li></ul><p>Pros:</p><ul><li><p>interoperability</p></li><li><p>minimal dependencies</p></li></ul><p>The second approach seems more aligned with Profilis&#8217; goals.</p><p>Interoperate with the ecosystem, but <strong>remain lightweight</strong>.</p><div><hr></div><h2>Should Profilis Become a Storage System?</h2><p>Another question surfaced while building the UI.</p><p>Should Profilis persist telemetry data?</p><p>Possible storage engines could include:</p><ul><li><p>SQLite</p></li><li><p>DuckDB</p></li><li><p>ClickHouse</p></li></ul><p>That would enable powerful analysis features.</p><p>But it would also fundamentally change the scope of the project.</p><p>Profilis currently treats exporters as <strong>pluggable sinks</strong>.</p><p>This keeps the core system focused on capturing and transporting telemetry.</p><p>The likely direction for <code>v2</code> is to keep Profilis as a <strong>pipeline</strong>, not a database.</p><p>Storage should remain the responsibility of exporters.</p><div><hr></div><h2>A Pattern Emerges</h2><p>Looking across these decisions, a pattern starts to emerge.</p><p>Profilis consistently optimizes for three things.</p><h4>Hot Path Safety</h4><p>Instrumentation must remain extremely cheap.</p><h4>Operational Safety</h4><p>The observability system should never endanger application stability.</p><h4>Architectural Simplicity</h4><p>The pipeline should remain small enough to reason about.</p><p>Every potential feature is evaluated against these constraints.</p><p>Not because complexity is bad.</p><p>But because complexity in observability systems often shows up at the worst possible time, when production is already on fire.</p><div><hr></div><h2>What Comes Next</h2><p>Profilis <code>v1</code> proved the architecture works.</p><p><code>v2</code> is about making that architecture more <strong>predictable</strong>, <strong>operable</strong>, and <strong>extensible</strong> without sacrificing the core principle:</p><blockquote><p><em>Observability should be cheap enough to leave on.</em></p></blockquote><p>The next few months will likely involve experimenting with some of these ideas in the open.</p><p>Some will make it into next version. Some probably won&#8217;t.</p><p>That&#8217;s part of the process.</p><p>But till then you can checkout the latest version on <em><strong><a href="https://github.com/ankan97dutta/profilis">github</a></strong></em>. Or try,</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:&quot;50d428fc-2169-49b9-815f-eceb2fae0ae4&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">pip install profilis</code></pre></div><p></p><p>If you have come this far, would love to hear your thoughts, ideas or suggestions on this article.</p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://blog.ankandutta.in" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Q_uo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff05a6b33-d297-44aa-8c6e-b4520227f193_1584x396.png 424w, https://substackcdn.com/image/fetch/$s_!Q_uo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff05a6b33-d297-44aa-8c6e-b4520227f193_1584x396.png 848w, https://substackcdn.com/image/fetch/$s_!Q_uo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff05a6b33-d297-44aa-8c6e-b4520227f193_1584x396.png 1272w, https://substackcdn.com/image/fetch/$s_!Q_uo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff05a6b33-d297-44aa-8c6e-b4520227f193_1584x396.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Q_uo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff05a6b33-d297-44aa-8c6e-b4520227f193_1584x396.png" width="1456" height="364" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f05a6b33-d297-44aa-8c6e-b4520227f193_1584x396.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:364,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:152728,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://blog.ankandutta.in&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.ankandutta.in/i/172791346?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff05a6b33-d297-44aa-8c6e-b4520227f193_1584x396.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Q_uo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff05a6b33-d297-44aa-8c6e-b4520227f193_1584x396.png 424w, https://substackcdn.com/image/fetch/$s_!Q_uo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff05a6b33-d297-44aa-8c6e-b4520227f193_1584x396.png 848w, https://substackcdn.com/image/fetch/$s_!Q_uo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff05a6b33-d297-44aa-8c6e-b4520227f193_1584x396.png 1272w, https://substackcdn.com/image/fetch/$s_!Q_uo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff05a6b33-d297-44aa-8c6e-b4520227f193_1584x396.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h5><a href="https://www.ankandutta.in/">Website</a> | <a href="https://github.com/ankan97dutta">GitHub</a> | <a href="https://linkedin.com/in/ankan-dutta">LinkedIn</a> | <a href="https://blog.ankandutta.in/">Signals &amp; Noise</a></h5>]]></content:encoded></item><item><title><![CDATA[I’m Already Living My 2026 Plan]]></title><description><![CDATA[Why I stopped waiting for Jan 1 and started treating my life like a system]]></description><link>https://blog.ankandutta.in/p/im-already-living-my-2026-plan</link><guid isPermaLink="false">https://blog.ankandutta.in/p/im-already-living-my-2026-plan</guid><dc:creator><![CDATA[Ankan Dutta]]></dc:creator><pubDate>Tue, 23 Dec 2025 15:28:30 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!YFdV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca12800f-c477-4484-8839-d670476fe419_1024x608.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YFdV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca12800f-c477-4484-8839-d670476fe419_1024x608.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YFdV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca12800f-c477-4484-8839-d670476fe419_1024x608.png 424w, https://substackcdn.com/image/fetch/$s_!YFdV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca12800f-c477-4484-8839-d670476fe419_1024x608.png 848w, https://substackcdn.com/image/fetch/$s_!YFdV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca12800f-c477-4484-8839-d670476fe419_1024x608.png 1272w, https://substackcdn.com/image/fetch/$s_!YFdV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca12800f-c477-4484-8839-d670476fe419_1024x608.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YFdV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca12800f-c477-4484-8839-d670476fe419_1024x608.png" width="1024" height="608" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ca12800f-c477-4484-8839-d670476fe419_1024x608.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:608,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!YFdV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca12800f-c477-4484-8839-d670476fe419_1024x608.png 424w, https://substackcdn.com/image/fetch/$s_!YFdV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca12800f-c477-4484-8839-d670476fe419_1024x608.png 848w, https://substackcdn.com/image/fetch/$s_!YFdV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca12800f-c477-4484-8839-d670476fe419_1024x608.png 1272w, https://substackcdn.com/image/fetch/$s_!YFdV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca12800f-c477-4484-8839-d670476fe419_1024x608.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Most people make serious commitments to their life on January 1.</p><p>New year. New plan. New discipline.<br>Same outcome.</p><p>I used to do that too, plan long term, feel motivated for a while, then slowly drift as life changed. And life always changes. New responsibilities. Health issues. Work pressure. Family. Fatigue. Reality.</p><p>At some point, it became obvious: waiting for a perfect start date is just procrastination with better branding.</p><p>So I stopped waiting.</p><div><hr></div><h2>The Lie of Long Term Planning</h2><p>The biggest problem with long term planning isn&#8217;t lack of ambition.<br>It&#8217;s the assumption that the future will stay stable.</p><p>People plan five years ahead as if:</p><ul><li><p>Their energy will remain constant</p></li><li><p>Their priorities won&#8217;t shift</p></li><li><p>Life won&#8217;t interfere</p></li></ul><p>That&#8217;s fantasy.</p><p>Instead, I capped my planning horizon to one year. Anything beyond that is direction, not a plan. The real work happens closer to the present.</p><p>Here&#8217;s how I operate now:</p><ul><li><p>Vision: 1 year</p></li><li><p>Planning: Monthly</p></li><li><p>Execution: Daily</p></li><li><p>Feedback: Weekly</p></li><li><p>Recalibration: Monthly</p></li></ul><p>Change isn&#8217;t treated as failure.<br>Change is expected and engineered.</p><div><hr></div><h2>From Goals to Systems (Life OS)</h2><p>I stopped planning goals and started operating my life like a system.</p><p>This became my Life OS.</p><p>The core shift was simple but uncomfortable:<br>I moved from task based planning to time based execution.</p><p>Tasks lie. Time doesn&#8217;t.</p><p>Tasks depend on motivation.<br>Time depends on structure.</p><p>When the day is full, nothing new gets added without removing something else. That single constraint kills most fake productivity.</p><p>My calendar now enforces my priorities. Not my mood.</p><p>This is the system I&#8217;m running my life on right now.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LFzr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98fcb280-4897-4bce-83dc-1533c2138f13_1181x1420.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LFzr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98fcb280-4897-4bce-83dc-1533c2138f13_1181x1420.png 424w, https://substackcdn.com/image/fetch/$s_!LFzr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98fcb280-4897-4bce-83dc-1533c2138f13_1181x1420.png 848w, https://substackcdn.com/image/fetch/$s_!LFzr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98fcb280-4897-4bce-83dc-1533c2138f13_1181x1420.png 1272w, https://substackcdn.com/image/fetch/$s_!LFzr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98fcb280-4897-4bce-83dc-1533c2138f13_1181x1420.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LFzr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98fcb280-4897-4bce-83dc-1533c2138f13_1181x1420.png" width="1181" height="1420" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/98fcb280-4897-4bce-83dc-1533c2138f13_1181x1420.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1420,&quot;width&quot;:1181,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:158294,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.ankandutta.in/i/182418314?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98fcb280-4897-4bce-83dc-1533c2138f13_1181x1420.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!LFzr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98fcb280-4897-4bce-83dc-1533c2138f13_1181x1420.png 424w, https://substackcdn.com/image/fetch/$s_!LFzr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98fcb280-4897-4bce-83dc-1533c2138f13_1181x1420.png 848w, https://substackcdn.com/image/fetch/$s_!LFzr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98fcb280-4897-4bce-83dc-1533c2138f13_1181x1420.png 1272w, https://substackcdn.com/image/fetch/$s_!LFzr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98fcb280-4897-4bce-83dc-1533c2138f13_1181x1420.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Direction stays stable. Execution stays small. Feedback is frequent. Change is intentional.</p><div><hr></div><h2>Daily Execution Is Time Based, Not Emotional</h2><p>Execution happens in fixed time blocks.<br>Not because I feel like it.<br>Not because I&#8217;m inspired.</p><p>But because the block exists.</p><p>This matters because motivation is unreliable. Structure isn&#8217;t.</p><p>Some days I execute fully.<br>Some days I barely scrape through.</p><p>Both days count.</p><div><hr></div><h2>Energy Is Not Constant, So the System Can&#8217;t Be Fragile</h2><p>One of the biggest realizations in the last three weeks was this:<br>Energy comes in phases.</p><p>Any long term plan moves through:</p><ul><li><p>High energy (happy) phases</p></li><li><p>Low energy (unhappy) phases</p></li><li><p>Mixed, messy middle phases</p></li></ul><p>Most systems are designed only for happy days.<br>That&#8217;s why they collapse.</p><p>I started thinking in simple paths:</p><ul><li><p>Happy path: full execution feels easy</p></li><li><p>Unhappy path: bare minimum, protect the streak</p></li><li><p>Mixed path: partial execution, no guilt</p></li></ul><p>The rule is brutal and simple:</p><blockquote><p>Showing up beats doing it perfectly.</p></blockquote><p>Life doesn&#8217;t care about my plans.<br>So my system had to work even on bad days.</p><p>On low energy days, I don&#8217;t renegotiate my life.<br>I shrink the effort, not abandon the system.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oNus!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e336c03-1284-44e3-a035-0af34d8bbc49_1112x702.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oNus!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e336c03-1284-44e3-a035-0af34d8bbc49_1112x702.png 424w, https://substackcdn.com/image/fetch/$s_!oNus!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e336c03-1284-44e3-a035-0af34d8bbc49_1112x702.png 848w, https://substackcdn.com/image/fetch/$s_!oNus!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e336c03-1284-44e3-a035-0af34d8bbc49_1112x702.png 1272w, https://substackcdn.com/image/fetch/$s_!oNus!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e336c03-1284-44e3-a035-0af34d8bbc49_1112x702.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oNus!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e336c03-1284-44e3-a035-0af34d8bbc49_1112x702.png" width="728" height="459.58273381294964" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8e336c03-1284-44e3-a035-0af34d8bbc49_1112x702.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:702,&quot;width&quot;:1112,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:96412,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.ankandutta.in/i/182418314?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e336c03-1284-44e3-a035-0af34d8bbc49_1112x702.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!oNus!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e336c03-1284-44e3-a035-0af34d8bbc49_1112x702.png 424w, https://substackcdn.com/image/fetch/$s_!oNus!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e336c03-1284-44e3-a035-0af34d8bbc49_1112x702.png 848w, https://substackcdn.com/image/fetch/$s_!oNus!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e336c03-1284-44e3-a035-0af34d8bbc49_1112x702.png 1272w, https://substackcdn.com/image/fetch/$s_!oNus!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e336c03-1284-44e3-a035-0af34d8bbc49_1112x702.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The block never disappears. Only the expectation changes.</p><div><hr></div><h2>Weekly Scores and Monthly Recalibration</h2><p>Every week, I give myself a score.</p><p>Not based on feelings.<br>Based on behavior.</p><p>Did I show up to the blocks?<br>Where did I break the system?<br>What pattern caused it?</p><p>A low score doesn&#8217;t trigger self hate.<br>It triggers investigation.</p><p>Monthly, I recalibrate:</p><ul><li><p>Drop what&#8217;s unrealistic</p></li><li><p>Narrow what&#8217;s bloated</p></li><li><p>Postpone without guilt</p></li></ul><p>This is the part most people avoid, because it forces honesty.</p><div><hr></div><h2>Why I Don&#8217;t Wait for The Right Time Anymore</h2><p>I stopped waiting for the perfect day to start.</p><p>Start today, and when that perfect day finally comes, you&#8217;ll already be far ahead.</p><p>I picked this up from Kunal Kapoor during an event:<br>Opportunity looks like luck only when preparation is invisible.</p><p>Life throws opportunities anyway.<br>Most people just aren&#8217;t ready when they arrive.</p><p>So the rule now is simple:</p><blockquote><p>Don&#8217;t waste time. Do the work.</p></blockquote><div><hr></div><h2>This Isn&#8217;t New, It&#8217;s Finally Internalized</h2><p>I&#8217;ve tried versions of this before.<br>The difference now is internalization.</p><p>It&#8217;s not a productivity experiment anymore.<br>It&#8217;s habit formation.</p><p>Cue &#8594; Action &#8594; Reward.<br>Repeat. (I picked it from Atomic Habits).</p><p>Will it work perfectly forever? Probably not.<br>But what&#8217;s the harm in doing something pragmatic instead of endlessly planning?</p><div><hr></div><h2>There Is No Finish Line</h2><p>There&#8217;s no winner spot.</p><p>There&#8217;s only one real question:</p><ul><li><p>Am I better than I was a year ago?</p></li><li><p>Did I accomplish most of what mattered?</p></li><li><p>Am I moving in the right direction?</p></li></ul><p>That&#8217;s it.</p><p>If the answer keeps improving year after year, the system is working.</p><p>And if someone still wants to wait for January 1 after reading this, that&#8217;s not ignorance anymore.</p><p>That&#8217;s a choice.</p>]]></content:encoded></item><item><title><![CDATA[Why I Built Another Profiling Library]]></title><description><![CDATA[Profilis is a lightweight, async safe profiling library for Python. Learn why it was built, what&#8217;s new, and how it helps developers track performance.]]></description><link>https://blog.ankandutta.in/p/why-i-built-another-profiling-library</link><guid isPermaLink="false">https://blog.ankandutta.in/p/why-i-built-another-profiling-library</guid><dc:creator><![CDATA[Ankan Dutta]]></dc:creator><pubDate>Wed, 24 Sep 2025 18:09:55 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!A0vR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab78836a-7cc6-4172-9990-1e88509260c0_2248x1220.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!A0vR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab78836a-7cc6-4172-9990-1e88509260c0_2248x1220.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!A0vR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab78836a-7cc6-4172-9990-1e88509260c0_2248x1220.png 424w, https://substackcdn.com/image/fetch/$s_!A0vR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab78836a-7cc6-4172-9990-1e88509260c0_2248x1220.png 848w, https://substackcdn.com/image/fetch/$s_!A0vR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab78836a-7cc6-4172-9990-1e88509260c0_2248x1220.png 1272w, https://substackcdn.com/image/fetch/$s_!A0vR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab78836a-7cc6-4172-9990-1e88509260c0_2248x1220.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!A0vR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab78836a-7cc6-4172-9990-1e88509260c0_2248x1220.png" width="1456" height="790" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ab78836a-7cc6-4172-9990-1e88509260c0_2248x1220.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:790,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:261521,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.ankandutta.in/i/172791346?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab78836a-7cc6-4172-9990-1e88509260c0_2248x1220.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!A0vR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab78836a-7cc6-4172-9990-1e88509260c0_2248x1220.png 424w, https://substackcdn.com/image/fetch/$s_!A0vR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab78836a-7cc6-4172-9990-1e88509260c0_2248x1220.png 848w, https://substackcdn.com/image/fetch/$s_!A0vR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab78836a-7cc6-4172-9990-1e88509260c0_2248x1220.png 1272w, https://substackcdn.com/image/fetch/$s_!A0vR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab78836a-7cc6-4172-9990-1e88509260c0_2248x1220.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Profilis Dashboard</figcaption></figure></div><p>Every time I start a new side project, I promise myself I won&#8217;t reinvent the wheel. Yet here I am, shipping <strong>Profilis,</strong> a modern profiling library for Python web apps.</p><p>Now, before you roll your eyes and say, &#8220;But don&#8217;t we already have cProfile, PyInstrument, py-spy &#8230;?&#8221; You&#8217;re absolutely right. We do. They&#8217;re great tools, powerful in their own right. But if you&#8217;ve ever tried plugging them into a real world project that isn&#8217;t a toy script, you probably know the friction:</p><ul><li><p>Some are CLI first, harder to integrate in app.</p></li><li><p>Some add a bit too much overhead.</p></li><li><p>Some make sense only if you&#8217;re profiling one off runs, not continuous monitoring.</p></li><li><p>And almost all of them feel heavy when all you want is a quick, no nonsense snapshot of what&#8217;s eating up time.</p></li></ul><p>That itch, that gap between too simple and too heavyweight, is why I built <strong>Profilis</strong>. </p><div><hr></div><h2>What I Learnt While Building It</h2><p>I&#8217;ll be honest: building Profilis wasn&#8217;t about replacing the giants. It was about learning by doing. And it taught me a few things worth sharing:</p><ol start="0"><li><p><strong>Simplicity &gt; Magic</strong><br>Developers don&#8217;t want black boxes. We want to know exactly what&#8217;s being measured and how. Profilis is intentionally minimal: a decorator, a context manager, a StatsStore. No hidden side effects.</p></li></ol><ol><li><p><strong>APIs Should Feel Native</strong><br>I obsessed over making usage Pythonic. A single import, a single line of code, and you&#8217;re profiling. If I had to look up docs every time, I failed.</p></li></ol><pre><code><code>from profilis.decorators.profile import profile_function

@profile_function(emitter)
def expensive_calculation(n: int) -&gt; int:
    """This function will be automatically profiled."""
    result = sum(i * i for i in range(n))
    return result
</code></code></pre><ol start="2"><li><p><strong>Visibility Matters</strong><br>Profiling isn&#8217;t useful if it stays in logs. That&#8217;s why Profilis ships with a tiny JSON + HTML dashboard baked into Flask. You get a view of KPIs and bottlenecks at a glance right in your browser.</p><p></p></li><li><p><strong>Constraints Are a Gift</strong><br>By forcing myself to ship a <strong>0.1.0 MVP</strong>, I avoided rabbit holes. No over engineering. Just enough to prove value.</p></li></ol><div><hr></div><h2>Why It Helps the Dev Community</h2><p>Profilis isn&#8217;t here to &#8220;win&#8221; against cProfile or py-spy. It&#8217;s here to serve a specific slice of developers:</p><ul><li><p><strong>Builders</strong> who want quick performance insights inside their app.</p></li><li><p><strong>Teams</strong> who prefer lightweight instrumentation without extra dependencies.</p></li><li><p><strong>Learners</strong> who want to peek under the hood of how profilers work.</p></li></ul><p>By keeping it simple and pluggable, my hope is that Profilis lowers the barrier to actually caring about performance. Because let&#8217;s be real, most of us only reach for profilers when things are already on fire. What if instead, it was easy enough to profile continuously, like logging?</p><div><hr></div><h2>What&#8217;s Next</h2><p>This is just the start. v0.1.0 ships with the basics including decorators, context managers, stats collection, and a dashboard. The roadmap includes:</p><ul><li><p>Richer visualizations and charts</p></li><li><p>More granular insights (per function, per route, DB calls)</p></li><li><p>Including support for popular databases</p></li><li><p>Integrations with modern monitoring stacks</p></li></ul><p>And of course, community feedback will shape where it goes.</p><div><hr></div><h2>Closing Thoughts</h2><p>I didn&#8217;t build <a href="https://github.com/ankan97dutta/profilis">Profilis</a> to compete. I built it to learn, to scratch an itch, and hopefully to make performance profiling a little less scary for the next developer who just wants to know what&#8217;s slow.</p><p>If that sounds like you, give it a spin:</p><pre><code><code>pip install profilis</code></code></pre><p>Would love to hear your thoughts, feedback, and ideas.</p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://blog.ankandutta.in" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Q_uo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff05a6b33-d297-44aa-8c6e-b4520227f193_1584x396.png 424w, https://substackcdn.com/image/fetch/$s_!Q_uo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff05a6b33-d297-44aa-8c6e-b4520227f193_1584x396.png 848w, https://substackcdn.com/image/fetch/$s_!Q_uo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff05a6b33-d297-44aa-8c6e-b4520227f193_1584x396.png 1272w, https://substackcdn.com/image/fetch/$s_!Q_uo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff05a6b33-d297-44aa-8c6e-b4520227f193_1584x396.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Q_uo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff05a6b33-d297-44aa-8c6e-b4520227f193_1584x396.png" width="1456" height="364" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f05a6b33-d297-44aa-8c6e-b4520227f193_1584x396.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:364,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:152728,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://blog.ankandutta.in&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.ankandutta.in/i/172791346?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff05a6b33-d297-44aa-8c6e-b4520227f193_1584x396.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Q_uo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff05a6b33-d297-44aa-8c6e-b4520227f193_1584x396.png 424w, https://substackcdn.com/image/fetch/$s_!Q_uo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff05a6b33-d297-44aa-8c6e-b4520227f193_1584x396.png 848w, https://substackcdn.com/image/fetch/$s_!Q_uo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff05a6b33-d297-44aa-8c6e-b4520227f193_1584x396.png 1272w, https://substackcdn.com/image/fetch/$s_!Q_uo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff05a6b33-d297-44aa-8c6e-b4520227f193_1584x396.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h5><a href="https://www.ankandutta.in/">Website</a> | <a href="https://github.com/ankan97dutta">GitHub</a> | <a href="https://linkedin.com/in/ankan-dutta">LinkedIn</a> | <a href="https://blog.ankandutta.in/">Signals &amp; Noise</a></h5><p></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[Too Many Things, Not Enough Progress]]></title><description><![CDATA[Sometimes choosing one path becomes harder than starting. Here&#8217;s what I&#8217;ve learned about clarity, capability, and cutting through the noise.]]></description><link>https://blog.ankandutta.in/p/too-many-things-not-enough-progress</link><guid isPermaLink="false">https://blog.ankandutta.in/p/too-many-things-not-enough-progress</guid><dc:creator><![CDATA[Ankan Dutta]]></dc:creator><pubDate>Sat, 26 Jul 2025 18:30:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!a5a_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f1b6dd2-ec74-466c-b4eb-0cf478d65c9c_1024x608.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!a5a_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f1b6dd2-ec74-466c-b4eb-0cf478d65c9c_1024x608.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!a5a_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f1b6dd2-ec74-466c-b4eb-0cf478d65c9c_1024x608.png 424w, https://substackcdn.com/image/fetch/$s_!a5a_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f1b6dd2-ec74-466c-b4eb-0cf478d65c9c_1024x608.png 848w, https://substackcdn.com/image/fetch/$s_!a5a_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f1b6dd2-ec74-466c-b4eb-0cf478d65c9c_1024x608.png 1272w, https://substackcdn.com/image/fetch/$s_!a5a_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f1b6dd2-ec74-466c-b4eb-0cf478d65c9c_1024x608.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!a5a_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f1b6dd2-ec74-466c-b4eb-0cf478d65c9c_1024x608.png" width="1024" height="608" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2f1b6dd2-ec74-466c-b4eb-0cf478d65c9c_1024x608.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:608,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!a5a_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f1b6dd2-ec74-466c-b4eb-0cf478d65c9c_1024x608.png 424w, https://substackcdn.com/image/fetch/$s_!a5a_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f1b6dd2-ec74-466c-b4eb-0cf478d65c9c_1024x608.png 848w, https://substackcdn.com/image/fetch/$s_!a5a_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f1b6dd2-ec74-466c-b4eb-0cf478d65c9c_1024x608.png 1272w, https://substackcdn.com/image/fetch/$s_!a5a_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f1b6dd2-ec74-466c-b4eb-0cf478d65c9c_1024x608.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Some weeks, I feel like I&#8217;m in motion constantly planning, designing, coding, writing, mapping out ideas and still end the week unsure what I actually finished.</p><p>It's not burnout.<br>It&#8217;s saturation.</p><p>Not because I'm lost. I know what I care about.<br>But when everything feels important, focus becomes a luxury.</p><div><hr></div><h3>The pattern I keep seeing in myself</h3><p>I&#8217;ve always been someone who can juggle multiple domains engineering, product, design, content, even business models. I like building things end to end.</p><p>But over time, that strength turned into noise.</p><p>I&#8217;d start writing a blog series.<br>Midway, I&#8217;d sketch out a new product.<br>Then context switch into interview prep.<br>Follow that with a deck for a freelance pitch.<br>And somewhere in between, planning for future and design a personal finance app.</p><p>It wasn&#8217;t the workload that wore me down, it was the number of open loops.</p><div><hr></div><h3>This isn't about motivation</h3><p>I&#8217;m not struggling to get started. I&#8217;m struggling to choose.</p><p>And that&#8217;s harder in some ways. Because when you're capable of doing many things, choosing one feels like closing doors you know you could open later.</p><p>But that&#8217;s the trap.</p><blockquote><p>Everything can&#8217;t be a priority.<br>Everything can&#8217;t matter equally.<br>And just because I can build it, doesn&#8217;t mean I should, right ?</p></blockquote><div><hr></div><h3>The illusion of momentum</h3><p>When you're good at thinking across contexts, you start mistaking motion for progress. I did.</p><p>I could make progress on 5 different things every week, but none of them felt like they were compounding.<br>I was building sideways, not forward.</p><p>It got to a point where I had to pause and ask:</p><blockquote><p>What am I actually moving forward?</p></blockquote><p>I didn&#8217;t like how long it took to answer.</p><div><hr></div><h3>So I made one decision</h3><p>Not a productivity hack. Not a new app. Just a call.</p><p>For this stretch, I&#8217;m choosing depth over variety.</p><p>That means fewer moving parts.<br>Not because the other ideas aren&#8217;t worth doing, but because trying to do them all at once is the reason they aren&#8217;t moving.</p><p>So right now, I&#8217;m focused on rebuilding my technical edge through structured prep, focused problem solving, and some personal technical writing.</p><p>Not to get a job or be relevant. Just to clear mental space, sharpen execution, and rebuild momentum on my own terms.</p><div><hr></div><h3>My system now is simple</h3><p>Google sheet with three columns:</p><ul><li><p>Now: top priorities for this cycle</p></li><li><p>Next: queued up, but not urgent</p></li><li><p>Later: I still care, but they can wait</p></li></ul><p>And I work in 6 day cycles.<br>Each cycle gets three things.<br>That&#8217;s it.</p><p>No overthinking. No guilt for what&#8217;s paused.</p><div><hr></div><h3>What I&#8217;ve learned so far</h3><p>You don&#8217;t need to do everything right now.<br>You need to do something clearly.</p><p>Letting go of that internal pressure, to act on every idea the moment it shows up, is a skill I&#8217;m still learning. But every time I do it, I get a little more energy back.</p><div><hr></div><h3>What&#8217;s changed since</h3><p>I&#8217;ve started finishing things again.<br>Small things. Focused things. But they&#8217;re shipping.<br>And that feeling of closing loops instead of creating new ones is underrated.</p><p>It&#8217;s also the only way I&#8217;ll ever get the big things out into the world.</p><div><hr></div><h3>If you're wired like me</h3><p>If you&#8217;re someone who can see too much, too fast, you&#8217;re not broken.<br>You&#8217;re just saturated.</p><p>And clarity isn&#8217;t going to come from journaling or buying another productivity app.<br>It comes from making a call.</p><blockquote><p>What&#8217;s the one thing that, if done, would make the rest easier?</p></blockquote><p>Pick that.<br>Let the others wait.</p><p>Not forever.<br>Just for now.</p>]]></content:encoded></item><item><title><![CDATA[When Your Best People Quietly Walk Away]]></title><description><![CDATA[Not everyone quits loudly. Some just stop trying. Then they leave.]]></description><link>https://blog.ankandutta.in/p/when-your-best-people-quietly-walk</link><guid isPermaLink="false">https://blog.ankandutta.in/p/when-your-best-people-quietly-walk</guid><dc:creator><![CDATA[Ankan Dutta]]></dc:creator><pubDate>Fri, 13 Jun 2025 19:11:21 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!rAke!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6cc8760-e509-4da8-8c05-1438b59188f1_1024x608.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rAke!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6cc8760-e509-4da8-8c05-1438b59188f1_1024x608.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rAke!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6cc8760-e509-4da8-8c05-1438b59188f1_1024x608.png 424w, https://substackcdn.com/image/fetch/$s_!rAke!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6cc8760-e509-4da8-8c05-1438b59188f1_1024x608.png 848w, https://substackcdn.com/image/fetch/$s_!rAke!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6cc8760-e509-4da8-8c05-1438b59188f1_1024x608.png 1272w, https://substackcdn.com/image/fetch/$s_!rAke!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6cc8760-e509-4da8-8c05-1438b59188f1_1024x608.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rAke!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6cc8760-e509-4da8-8c05-1438b59188f1_1024x608.png" width="1024" height="608" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c6cc8760-e509-4da8-8c05-1438b59188f1_1024x608.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:608,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!rAke!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6cc8760-e509-4da8-8c05-1438b59188f1_1024x608.png 424w, https://substackcdn.com/image/fetch/$s_!rAke!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6cc8760-e509-4da8-8c05-1438b59188f1_1024x608.png 848w, https://substackcdn.com/image/fetch/$s_!rAke!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6cc8760-e509-4da8-8c05-1438b59188f1_1024x608.png 1272w, https://substackcdn.com/image/fetch/$s_!rAke!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6cc8760-e509-4da8-8c05-1438b59188f1_1024x608.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>I&#8217;ve seen it more than once, people with range. Folks who can lead, design, ship, scale, mentor, even navigate product and GTM discussions. People who can do the work of three, but are asked to fill just one box on the org chart.</p><p>At first, they over deliver. Then they start asking for more impact, more trust, more learning. If nothing changes, they slow down. They stop volunteering ideas. They quietly detach. And eventually, they leave.</p><p>This isn&#8217;t about one company. It&#8217;s a pattern. High performers who aren't challenged, trusted, or grown will always move on, even when compensation is &#8220;okay&#8221; and the culture looks fine on paper.</p><div><hr></div><h3>Why It Happens</h3><p>It&#8217;s easy to assume people quit because they got a better offer or weren&#8217;t a culture fit. But often, it&#8217;s subtler than that:</p><ul><li><p><strong>They&#8217;re capable of more.</strong> But no one&#8217;s paying attention.</p></li><li><p><strong>They want to grow.</strong> But the work doesn&#8217;t stretch them.</p></li><li><p><strong>They seek trust.</strong> But they&#8217;re still being second guessed.</p></li><li><p><strong>They want to make an impact.</strong> But they&#8217;re stuck in a delivery treadmill.</p></li></ul><p>These aren't complaints, they&#8217;re early signals. And if no one is listening, even your most committed team members will eventually start to check out.</p><div><hr></div><h3>What You Might Not Notice</h3><p>High performers don&#8217;t always say, &#8220;I&#8217;m unhappy.&#8221; They just:</p><ul><li><p>Stop raising their hand for hard things</p></li><li><p>Avoid long term ownership</p></li><li><p>Show up, do the job, log off</p></li><li><p>Smile in meetings but go quiet in 1:1s</p></li><li><p>Keep hitting goals but the spark&#8217;s gone</p></li></ul><p>That&#8217;s the quiet quitting phase. The exit is just a formality.</p><div><hr></div><h3>Why They Leave</h3><p>It&#8217;s rarely one thing that makes high performers leave. More often, it&#8217;s a slow accumulation, burnout that goes unnoticed, health taking a hit from unsustainable pace, trust quietly eroding, and a growing feeling that they&#8217;re not learning anything new.</p><p>They&#8217;re not unhappy all the time. But they&#8217;re not growing either. Not challenged, not stretched, not seen. And that&#8217;s when disengagement sets in.</p><blockquote><p><em>The scariest part? They don&#8217;t always leave with a complaint or conflict. Most often, they leave quietly.</em></p></blockquote><div><hr></div><h3>What Leaders Can Do Differently</h3><p>This isn&#8217;t fixed by motivational talks or a Friday fun event. It&#8217;s about systemic action. Here's where it starts:</p><h4>0. <strong>Create Space for Stretch</strong></h4><p>Let them try things beyond their role. Assign ownership of new, ambiguous problems. Let them fail and learn.</p><h4>1. <strong>Talk About Growth, Not Just Goals</strong></h4><p>Not just &#8220;What are you delivering?&#8221; but &#8220;What are you excited to learn?&#8221;<br>Build the roadmap around that too.</p><h4>2. <strong>Audit Their Utilization Honestly</strong></h4><p>If someone can work across frontend, backend, infra, ML and you&#8217;re only giving them UI tickets, that&#8217;s a design flaw, not a resource issue.</p><h4>3. <strong>Don't Wait for Feedback Loops</strong></h4><p>By the time someone says they&#8217;re not learning, the damage is already done. Use regular checkins to ask about challenge, energy, and growth, not just timelines and blockers.</p><h4>4. <strong>Trust Out Loud</strong></h4><p>Trust isn't just delegation. It's telling them you believe in them, backing them publicly, and getting out of the way.</p><div><hr></div><h3>Before I wrap up</h3><p>Sometimes, the people who leave are the ones who wanted to stay the most. They brought energy, took ownership, and gave their best, but somewhere along the way, the system didn&#8217;t evolve to meet their growth.</p><p>If you&#8217;re in a position to design orgs, shape culture, or retain talent, don&#8217;t just focus on who's underperforming. Pay attention to your silent overachievers too.</p><p>Because when they leave, it won&#8217;t be loud. It&#8217;ll be clean, calm, and quiet. And by the time you notice, it&#8217;ll already be too late.</p>]]></content:encoded></item><item><title><![CDATA[The Side of Passion No One Talks About]]></title><description><![CDATA[Burnout isn&#8217;t just about overwork, it&#8217;s about losing yourself in the process. Here&#8217;s my raw, personal journey through anxiety, depression, and how I found my way back to life and code. This is for every software engineer silently struggling.]]></description><link>https://blog.ankandutta.in/p/the-side-of-passion-no-one-talks</link><guid isPermaLink="false">https://blog.ankandutta.in/p/the-side-of-passion-no-one-talks</guid><dc:creator><![CDATA[Ankan Dutta]]></dc:creator><pubDate>Wed, 23 Apr 2025 11:31:59 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1252469d-069e-4339-bc0b-ad32ef645589_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ca9w!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1252469d-069e-4339-bc0b-ad32ef645589_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ca9w!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1252469d-069e-4339-bc0b-ad32ef645589_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Ca9w!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1252469d-069e-4339-bc0b-ad32ef645589_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Ca9w!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1252469d-069e-4339-bc0b-ad32ef645589_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Ca9w!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1252469d-069e-4339-bc0b-ad32ef645589_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ca9w!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1252469d-069e-4339-bc0b-ad32ef645589_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1252469d-069e-4339-bc0b-ad32ef645589_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2044643,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://ankandutta.substack.com/i/161515726?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1252469d-069e-4339-bc0b-ad32ef645589_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Ca9w!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1252469d-069e-4339-bc0b-ad32ef645589_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Ca9w!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1252469d-069e-4339-bc0b-ad32ef645589_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Ca9w!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1252469d-069e-4339-bc0b-ad32ef645589_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Ca9w!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1252469d-069e-4339-bc0b-ad32ef645589_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In 2023, I hit one of the lowest points of my life.</p><p>It wasn&#8217;t triggered by a toxic boss or an overwhelming deadline. It wasn&#8217;t because someone pushed me too hard.<br><strong>I did it to myself.</strong> I worked like hell, not because I had to, but because I loved doing it. I poured myself into work, into code, into problems I couldn&#8217;t stop thinking about. It gave me purpose. It made me feel alive.</p><p>Until one day, it didn&#8217;t.</p><div><hr></div><h3><strong>The Downfall I Didn&#8217;t See Coming</strong></h3><p>At first, it was just fatigue. I thought I was just tired, a few days of rest and I&#8217;d bounce back.<br>But the tiredness lingered. My mind stopped working the way it used to. I began feeling anxious for no reason. My sleep went for a toss. I couldn&#8217;t focus, couldn&#8217;t think straight.<br>And then something even worse happened: <strong>I stopped feeling like myself.</strong></p><p>The very thing that brought me joy&#8230; coding, building, solving, became unbearable. I couldn&#8217;t even look at my laptop. I didn&#8217;t want to. I physically couldn&#8217;t bring myself to open it.</p><p>Life felt empty. The world around me felt disconnected. Everything I once enjoyed became&#8230; dull.<br>And then came the thoughts, the fear that something terrible was going to happen.<br>I remember waking up with a tight chest and a heavy heart, unsure if I&#8217;d even want to get through the day. Touchwood, that was a dark phase.</p><div><hr></div><h3><strong>The World Didn&#8217;t Get It</strong></h3><p>The worst part? Very few understood.</p><p>When you break your leg, people see it. When you burn out, it&#8217;s invisible. And when you&#8217;re someone who&#8217;s always been driven and high-performing, it&#8217;s even harder for people to believe something&#8217;s wrong.</p><p>Some thought I was just slacking. Some thought I was overreacting.<br>But burnout isn&#8217;t &#8220;in your head.&#8221; It&#8217;s real. It crushes your confidence, wrecks your routines, and flips your personality inside out.</p><p>I wasn&#8217;t lazy. I wasn&#8217;t weak. I was broken, quietly, deeply, and completely.</p><div><hr></div><h3><strong>The Slow Road to Recovery</strong></h3><p>Getting out of that state wasn&#8217;t easy.<br>It didn&#8217;t happen in a week or a month. It took over a year to fully recover. And honestly, it didn&#8217;t come from a therapist or a miracle cure. It came from slowly, painfully, reconnecting with life.</p><p>Here&#8217;s what helped me:</p><ul><li><p><strong>Meditation</strong> - just sitting with myself, quietly, without pressure.</p></li><li><p><strong>Walking and light running</strong> - moving my body when my mind refused to move.</p></li><li><p><strong>Watching movies and traveling</strong> - things I stopped doing in the name of work.</p></li><li><p><strong>Talking to friends</strong> - people who didn&#8217;t need to understand fully, just stayed present.</p></li><li><p><strong>Reading books</strong> - slowly reigniting curiosity again.</p></li><li><p><strong>Acceptance</strong> - this was the biggest one.<br>That it&#8217;s okay to be where I am. That I don&#8217;t need to be &#8220;fixed.&#8221; That it&#8217;s okay to slow down, to fall apart, and to take my time rebuilding.</p></li></ul><p>These sound simple, but they saved me. They gave me breath again. One day at a time, they helped me come back, not to who I was, but to someone more grounded.</p><div><hr></div><h3><strong>What Burnout Taught Me</strong></h3><p>It taught me what&#8217;s actually important in life, and what&#8217;s not.<br>It taught me that <strong>rest is productive.</strong> That doing something slowly doesn&#8217;t mean doing it badly. That I&#8217;m not my output. That success doesn&#8217;t mean sprinting all the time.</p><p>It also taught me empathy. Now when I see someone zoned out, detached, or unmotivated, I don&#8217;t judge. I wonder what they&#8217;re going through underneath. Because I know how hard it is to function when you&#8217;re burning inside.</p><p>And I&#8217;ve learned to protect myself better now, with boundaries, balance, and space. The grind will always be there. But I won&#8217;t, if I keep ignoring my limits.</p><h3><strong>To Those Going Through It Right Now</strong></h3><p>If you&#8217;re going through something similar, I want you to know this:</p><p>You&#8217;re not alone.<br>You&#8217;re not broken.<br>And you won&#8217;t feel like this forever.</p><p>Burnout is real. It&#8217;s valid. It doesn&#8217;t make you any less smart, talented, or worthy.<br>You don&#8217;t have to bounce back immediately. You don&#8217;t have to pretend you&#8217;re okay. You just need to start small, breathe, rest, walk, talk, cry if you need to. It&#8217;s okay.</p><p>You&#8217;ll come back. Maybe not as the old you. Maybe as someone stronger, slower, wiser, kinder.</p><h3><strong>The Part That&#8217;s Rarely Spoken About</strong></h3><p>Burnout in tech, especially among people who love what they do, is under-discussed.<br>We celebrate sleepless nights, late pushes, and always being &#8220;on.&#8221; But we don&#8217;t talk enough about what happens when that fire turns into a flameout.</p><blockquote><p><em>Burnout isn&#8217;t a badge of honor. It&#8217;s a warning sign.<br>Let&#8217;s stop pretending it&#8217;s not real. Let&#8217;s talk about it. Let&#8217;s support each other through it.</em></p><p><em>Because no amount of success is worth losing yourself.</em></p></blockquote><p></p><p><strong>Take care of yourself. The world can wait.</strong><br>And if you're in that phase right now, I see you. You&#8217;ll find your way back.<br>You already took the hardest step: acknowledging it.</p>]]></content:encoded></item><item><title><![CDATA[Dealing with a Difficult Client]]></title><description><![CDATA[Ever dealt with a client who belittles your team? Someone who makes collaboration harder than it should be? One who shifts blame but takes no responsibility? So, how do you handle a toxic client without losing your sanity?]]></description><link>https://blog.ankandutta.in/p/dealing-with-a-difficult-client</link><guid isPermaLink="false">https://blog.ankandutta.in/p/dealing-with-a-difficult-client</guid><dc:creator><![CDATA[Ankan Dutta]]></dc:creator><pubDate>Sat, 01 Mar 2025 13:54:23 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Q0vI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71379324-ae41-4c60-8d8b-fe681cf1b53b_1024x608.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Q0vI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71379324-ae41-4c60-8d8b-fe681cf1b53b_1024x608.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Q0vI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71379324-ae41-4c60-8d8b-fe681cf1b53b_1024x608.png 424w, https://substackcdn.com/image/fetch/$s_!Q0vI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71379324-ae41-4c60-8d8b-fe681cf1b53b_1024x608.png 848w, https://substackcdn.com/image/fetch/$s_!Q0vI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71379324-ae41-4c60-8d8b-fe681cf1b53b_1024x608.png 1272w, https://substackcdn.com/image/fetch/$s_!Q0vI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71379324-ae41-4c60-8d8b-fe681cf1b53b_1024x608.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Q0vI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71379324-ae41-4c60-8d8b-fe681cf1b53b_1024x608.png" width="724" height="429.875" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/71379324-ae41-4c60-8d8b-fe681cf1b53b_1024x608.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:608,&quot;width&quot;:1024,&quot;resizeWidth&quot;:724,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;How to deal with difficult client&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="How to deal with difficult client" title="How to deal with difficult client" srcset="https://substackcdn.com/image/fetch/$s_!Q0vI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71379324-ae41-4c60-8d8b-fe681cf1b53b_1024x608.png 424w, https://substackcdn.com/image/fetch/$s_!Q0vI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71379324-ae41-4c60-8d8b-fe681cf1b53b_1024x608.png 848w, https://substackcdn.com/image/fetch/$s_!Q0vI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71379324-ae41-4c60-8d8b-fe681cf1b53b_1024x608.png 1272w, https://substackcdn.com/image/fetch/$s_!Q0vI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71379324-ae41-4c60-8d8b-fe681cf1b53b_1024x608.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>Getting onboarded onto a new project is always an interesting phase, new challenges, a different team dynamic, and the opportunity to create impact. But sometimes, the unexpected hits you in ways you didn&#8217;t quite anticipate.</p><p>Recently, I got assigned to a project from a reputed client. Given their stature, I expected a level of professionalism, clear ownership, and structured collaboration. Turns out, I was wrong.</p><h2>The Reality Check</h2><p>From day one, the client made it clear this wasn&#8217;t going to be smooth sailing. Instead of constructive discussions, we got belittling remarks for minor things. Instead of shared responsibility, we saw a blame game. And instead of professionalism, we got a frustrating mix of arrogance and unaccountability.</p><p>It&#8217;s one thing to have a demanding client pressure is part of the job. But when that pressure turns into toxic interactions, it starts impacting morale and efficiency.</p><h2>How to handle a rude client &#8230; without losing your mind :) </h2><p>If you ever find yourself dealing with a client who is more of a problem than a partner, here&#8217;s what has helped me navigate the situation:</p><h3>0. Don&#8217;t take it personally</h3><p>The first instinct when someone disrespects you is to react emotionally. But stepping back and treating it as a professional challenge rather than a personal attack helps in keeping your composure. Most of the time, their attitude has nothing to do with you and everything to do with their own stress, ego, or insecurities.</p><h3>1. Stay professional, no matter what</h3><p>You can&#8217;t control how they act, but you can control how you respond. Keeping your communication crisp, professional, and objective prevents the situation from escalating. Sometimes, the best way to handle rudeness is to not give it the reaction it seeks.</p><h3>2. Document everything</h3><p>When dealing with a client who shifts blame, documentation is your best friend. Every decision, discussion, or agreement put it in writing. Emails, meeting notes, and task trackers help ensure that when accountability comes into question, the facts are on your side.</p><h3>3. Set boundaries on communication</h3><p>Some clients don&#8217;t respect work life balance or the effort teams put in. It&#8217;s important to set clear expectations on communication what&#8217;s acceptable, what isn&#8217;t, and what will not be tolerated. If a client is rude in calls, subtly redirect them to email, where their words will be recorded.</p><h3>4. Escalate if needed</h3><p>If the situation gets out of hand, if the client&#8217;s behaviour is affecting the team&#8217;s productivity or well being, it&#8217;s worth raising the issue with leadership. They likely have experience handling difficult clients and can step in if necessary. Some clients need that pushback to realize they can&#8217;t treat teams like that.</p><h2>Lessons Learned </h2><p>Difficult clients exist in every industry, but how we deal with them defines our professional growth. Some clients will always be challenging, but staying professional, setting boundaries, and focusing on the work (rather than their attitude) is often the best approach.</p><p>At the end of the day, you can&#8217;t control their behaviour, but you can control how much it affects you. And sometimes, that&#8217;s enough to turn a frustrating experience into a learning one.</p>]]></content:encoded></item></channel></rss>