<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Rambarki Bhavani</title>
    <description>The latest articles on DEV Community by Rambarki Bhavani (@rambarki_bhavani).</description>
    <link>https://dev.to/rambarki_bhavani</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4149358%2Ff89c8339-80b7-479f-9da2-79397b69f7d2.jpg</url>
      <title>DEV Community: Rambarki Bhavani</title>
      <link>https://dev.to/rambarki_bhavani</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rambarki_bhavani"/>
    <language>en</language>
    <item>
      <title>I Optimized the Incident Path Without Removing Hindsight</title>
      <dc:creator>Rambarki Bhavani</dc:creator>
      <pubDate>Tue, 29 Sep 2026 10:56:49 +0000</pubDate>
      <link>https://dev.to/rambarki_bhavani/i-optimized-the-incident-path-without-removing-hindsight-2ln9</link>
      <guid>https://dev.to/rambarki_bhavani/i-optimized-the-incident-path-without-removing-hindsight-2ln9</guid>
      <description>&lt;p&gt;Incident response has an awkward performance requirement: the system can do several expensive things, but the engineer waiting for an answer still experiences &lt;strong&gt;one button click&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;IncidentMind performs remote memory retrieval, memory reflection, and LLM reasoning. The first complete analysis therefore takes longer than a local function call.&lt;/p&gt;

&lt;p&gt;My goal was not to pretend those operations were instantaneous.&lt;/p&gt;

&lt;p&gt;It was to make the cost understandable and avoid paying it repeatedly when the answer had already been computed.&lt;/p&gt;

&lt;p&gt;That led to two changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Staged progress in the UI&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Caching at the incident-analysis boundary&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔄 The Expensive Path Is Real
&lt;/h2&gt;

&lt;p&gt;A complete analysis involves several remote operations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Incident
  |
  +--&amp;gt; Hindsight Recall
  |
  +--&amp;gt; Hindsight Reflect
  |
  +--&amp;gt; Groq reasoning
  |
  v
Structured analysis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In local testing, the first analysis took roughly several seconds because each operation had real network and model latency.&lt;/p&gt;

&lt;p&gt;That is expected.&lt;/p&gt;

&lt;p&gt;The mistake would have been to remove the memory or reflection step simply because it made the request slower.&lt;/p&gt;

&lt;p&gt;Those steps are part of the product behavior.&lt;/p&gt;

&lt;p&gt;Instead, I looked at &lt;strong&gt;where the latency was actually being experienced&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  📊 The First Optimization Was Making Progress Truthful
&lt;/h2&gt;

&lt;p&gt;A generic spinner tells the engineer nothing.&lt;/p&gt;

&lt;p&gt;I changed the interface to expose the actual stages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Investigating telemetry
        ↓
Recalling organizational memories from Hindsight
        ↓
Comparing root causes and resolutions
        ↓
Generating triage recommendation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That sounds like a UX change, but it also reflects the architecture.&lt;/p&gt;

&lt;p&gt;Each stage corresponds to a real operation in the backend.&lt;/p&gt;

&lt;p&gt;The engineer can now understand whether the system is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;gathering current evidence&lt;/li&gt;
&lt;li&gt;waiting for memory retrieval&lt;/li&gt;
&lt;li&gt;comparing historical experiences&lt;/li&gt;
&lt;li&gt;generating the final recommendation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is much better than showing:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Analyzing...&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;for ten seconds.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 The Second Optimization Was Caching the Right Thing
&lt;/h2&gt;

&lt;p&gt;The incident analysis service now caches the completed analysis by incident ID.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cached&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;analysisCache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;incident&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cached&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;cached&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;analysis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;runFullAnalysis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;incident&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;analysisCache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;incident&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;analysis&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;analysis&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important part is the &lt;strong&gt;cache boundary&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I did not cache the Hindsight memory service independently and pretend the entire analysis was unchanged.&lt;/p&gt;

&lt;p&gt;I cache the result of the &lt;strong&gt;complete incident analysis&lt;/strong&gt; because that is what the user is repeatedly asking for.&lt;/p&gt;

&lt;p&gt;If the engineer clicks &lt;strong&gt;Analyze&lt;/strong&gt; again without changing the incident, there is no reason to run Recall, Reflect, and LLM reasoning again.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚠️ Cache Invalidation Matters More Than Caching
&lt;/h2&gt;

&lt;p&gt;The cache would be dangerous if it survived an incident update.&lt;/p&gt;

&lt;p&gt;Suppose the initial analysis says database saturation is the likely cause.&lt;/p&gt;

&lt;p&gt;Then the engineer adds evidence showing that database health is normal and an upstream provider is timing out.&lt;/p&gt;

&lt;p&gt;Returning the original analysis would be worse than having no cache.&lt;/p&gt;

&lt;p&gt;The cache is therefore invalidated when the incident is updated or resolved.&lt;/p&gt;

&lt;p&gt;The rule is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Same incident state
    → cached analysis is reusable

Incident changes
    → invalidate

Incident resolved
    → invalidate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This keeps the optimization aligned with the data it represents.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A fast answer based on stale incident state is not an optimization. It is a correctness bug.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🔗 Hindsight Remains in the First Analysis
&lt;/h2&gt;

&lt;p&gt;One important constraint was &lt;strong&gt;not to “optimize” by removing Hindsight&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The first analysis still performs real Recall and Reflect operations against Hindsight Cloud.&lt;/p&gt;

&lt;p&gt;The LLM still receives the historical context.&lt;/p&gt;

&lt;p&gt;The cache only prevents repeated work &lt;strong&gt;after the analysis already exists&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That distinction matters because memory is not an implementation detail that can simply be removed for speed.&lt;/p&gt;

&lt;p&gt;It is part of the reason the analysis exists in the first place.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://hindsight.vectorize.io/" rel="noopener noreferrer"&gt;Hindsight documentation&lt;/a&gt; helped me think about memory operations as part of the agent's workflow rather than as a database lookup hidden underneath it.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⏱️ Timeouts Are Part of the Design
&lt;/h2&gt;

&lt;p&gt;Remote dependencies can fail.&lt;/p&gt;

&lt;p&gt;Hindsight can be slow or unavailable. The LLM can be slow. The browser can lose its connection.&lt;/p&gt;

&lt;p&gt;The frontend therefore uses an explicit request timeout rather than waiting indefinitely.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;controller&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;AbortController&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;timeout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abort&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;20000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;clearTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important thing is not the exact timeout value.&lt;/p&gt;

&lt;p&gt;It is that the request has a &lt;strong&gt;defined boundary&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;An incident tool that hangs forever is difficult to trust even if the underlying recommendation is good.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚦 Hindsight Throttling Taught Me Another Lesson
&lt;/h2&gt;

&lt;p&gt;During development, I also hit a problem caused by the way I initially initialized memory.&lt;/p&gt;

&lt;p&gt;The application was repeatedly trying to seed historical incidents before Recall.&lt;/p&gt;

&lt;p&gt;That meant several Retain operations could happen before a single analysis completed.&lt;/p&gt;

&lt;p&gt;Under real API limits, that produced &lt;strong&gt;503 responses&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The fix was not to add more retries.&lt;/p&gt;

&lt;p&gt;I changed the initialization strategy so that the application checks whether seeding is necessary without repeatedly writing the same historical memories.&lt;/p&gt;

&lt;p&gt;Recall is then performed normally, and the initial historical data exists in Hindsight rather than being recreated for every analysis.&lt;/p&gt;

&lt;p&gt;That reduced unnecessary API traffic and, more importantly, made the &lt;strong&gt;memory lifecycle correct&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  🛡️ Real Memory Should Stay Real
&lt;/h2&gt;

&lt;p&gt;Another optimization temptation was to keep local fallback data so the interface could always display historical incidents.&lt;/p&gt;

&lt;p&gt;I removed that shortcut from the real Recall path.&lt;/p&gt;

&lt;p&gt;If Hindsight returns five relevant memories, the application works with those memories.&lt;/p&gt;

&lt;p&gt;If Hindsight returns zero, the application receives zero.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hindsight returns 5 memories
        ↓
Use those 5 memories

Hindsight returns 0 memories
        ↓
Use 0 memories
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes performance testing and correctness testing much more meaningful because the system is measuring the &lt;strong&gt;real dependency instead of a local imitation&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏗️ The Architecture After the Changes
&lt;/h2&gt;

&lt;p&gt;The resulting path is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Current Incident
      ↓
Analysis Cache
      ↓
Cache miss?
      ↓
Hindsight Recall
      ↓
Hindsight Reflect
      ↓
Groq LLM Reasoning
      ↓
Cached Result
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This keeps the expensive first analysis intact while making repeated analysis cheap.&lt;/p&gt;

&lt;h2&gt;
  
  
  📈 Before and After
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Before the Optimization Work
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Analyze
  → Recall
  → Reflect
  → LLM
  → repeat the same work if Analyze is clicked again
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  After the Optimization
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Analyze
  → check analysis cache
      → hit: return existing analysis
      → miss: Recall → Reflect → LLM → cache result
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first analysis still uses the real memory path.&lt;/p&gt;

&lt;p&gt;The optimization mainly removes &lt;strong&gt;unnecessary repeated work&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 What I Learned
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Optimize Repeated Work Before Removing Useful Work
&lt;/h3&gt;

&lt;p&gt;The first question should be:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;“Are we doing this operation unnecessarily?”&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;rather than:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;“Can we delete the operation?”&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hindsight Recall and Reflect are essential to the product behavior.&lt;/p&gt;

&lt;p&gt;Re-running them for an unchanged incident is not.&lt;/p&gt;

&lt;h3&gt;
  
  
  UX Should Expose Real System Stages
&lt;/h3&gt;

&lt;p&gt;The progress UI is more useful because it corresponds to actual backend work.&lt;/p&gt;

&lt;p&gt;It is not just a decorative loading animation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cache at a Semantic Boundary
&lt;/h3&gt;

&lt;p&gt;Caching the complete analysis by incident state was easier to reason about than scattering caches across every service.&lt;/p&gt;

&lt;h3&gt;
  
  
  Invalidation Is Part of the Feature
&lt;/h3&gt;

&lt;p&gt;A cache without a clear invalidation rule is a correctness problem waiting to happen.&lt;/p&gt;

&lt;h3&gt;
  
  
  API Errors Should Change Architecture, Not Just Retry Counts
&lt;/h3&gt;

&lt;p&gt;The Hindsight 503 problem came from unnecessary Retain operations.&lt;/p&gt;

&lt;p&gt;The correct fix was to stop generating unnecessary traffic, not to keep retrying it.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Project and References
&lt;/h2&gt;

&lt;p&gt;The complete IncidentMind project is available in the &lt;a href="https://github.com/gunja-ramana/incidentmind" rel="noopener noreferrer"&gt;IncidentMind GitHub repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For implementation details and background, see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/vectorize-io/hindsight" rel="noopener noreferrer"&gt;Hindsight GitHub repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hindsight.vectorize.io/" rel="noopener noreferrer"&gt;Hindsight Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://vectorize.io/what-is-agent-memory" rel="noopener noreferrer"&gt;Vectorize: What Is Agent Memory?&lt;/a&gt;
### Architecture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr06yv21ajn0g8uu64w0h.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr06yv21ajn0g8uu64w0h.jpeg" alt="IncidentMind Architecture" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  UI
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgntzisid93fj5imomzzf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgntzisid93fj5imomzzf.png" alt="IncidentMind Screenshot" width="800" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  recall
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffutqztiecc1iuot5m5ih.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffutqztiecc1iuot5m5ih.png" alt="Hindsight Recall Screenshot" width="799" height="343"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  retain
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F09g3xsd5mitsexyr2wag.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F09g3xsd5mitsexyr2wag.png" alt="Hindsight Retain Screenshot" width="799" height="505"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
