<?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: Charmi Gajula</title>
    <description>The latest articles on DEV Community by Charmi Gajula (@charmi_gajula_f6a83fd455b).</description>
    <link>https://dev.to/charmi_gajula_f6a83fd455b</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3836787%2F8ed5017b-f05e-43fb-8c54-47de4808de6d.jpg</url>
      <title>DEV Community: Charmi Gajula</title>
      <link>https://dev.to/charmi_gajula_f6a83fd455b</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/charmi_gajula_f6a83fd455b"/>
    <language>en</language>
    <item>
      <title>🚀 Resume Feedback Is Easy — Until You Try Making It Context-Aware</title>
      <dc:creator>Charmi Gajula</dc:creator>
      <pubDate>Sat, 21 Mar 2026 09:35:50 +0000</pubDate>
      <link>https://dev.to/charmi_gajula_f6a83fd455b/resume-feedback-is-easy-until-you-try-making-it-context-aware-2bl6</link>
      <guid>https://dev.to/charmi_gajula_f6a83fd455b/resume-feedback-is-easy-until-you-try-making-it-context-aware-2bl6</guid>
      <description>&lt;p&gt;While building my AI Career Advisor, I initially assumed resume feedback would be one of the simplest features.&lt;/p&gt;

&lt;p&gt;Upload resume → analyze → give suggestions.&lt;/p&gt;

&lt;p&gt;There are already dozens of tools doing this, so it seemed straightforward.&lt;/p&gt;

&lt;p&gt;But once I introduced &lt;strong&gt;memory and user context&lt;/strong&gt;, things became much more complex.&lt;/p&gt;

&lt;p&gt;🧠 What the system actually needs to do&lt;/p&gt;

&lt;p&gt;At a basic level, the system should:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Parse a resume&lt;/li&gt;
&lt;li&gt;Extract skills and projects&lt;/li&gt;
&lt;li&gt;Compare them with target roles&lt;/li&gt;
&lt;li&gt;Suggest improvements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Simple enough — but in practice, this wasn’t sufficient.&lt;/p&gt;

&lt;p&gt;Because a resume is only a "snapshot", not the full story.&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2Fwde941svjg901lik2m55.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.amazonaws.com%2Fuploads%2Farticles%2Fwde941svjg901lik2m55.png" alt=" " width="800" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⚠️ The real problem: resumes are incomplete&lt;/p&gt;

&lt;p&gt;Users often:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Forget to include recent work&lt;/li&gt;
&lt;li&gt;Undersell their projects&lt;/li&gt;
&lt;li&gt;Omit important details&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the system only analyzes the uploaded resume, it misses critical context.&lt;/p&gt;

&lt;p&gt;So the real challenge became:&lt;/p&gt;

&lt;p&gt;👉 'How do we combine resume data with stored user memory?'&lt;/p&gt;

&lt;p&gt;❌ First attempt: treat resume as the source of truth&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;parsedResume&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parseResume&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&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;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Give resume feedback&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;parsedResume&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This worked — but only at a surface level.&lt;/p&gt;

&lt;p&gt;It couldn’t detect missing information or inconsistencies.&lt;/p&gt;

&lt;p&gt;✅ The fix: merge resume with memory&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;memory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;hindsight&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;retrieve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&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;resumeData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parseResume&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&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;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;resume&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;resumeData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;pastProjects&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;projects&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;skills&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;skills&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the model has access to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What the user wrote&lt;/li&gt;
&lt;li&gt;What the system already knows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💡 Why this matters&lt;/p&gt;

&lt;p&gt;This enables insights like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“You worked on X but didn’t include it”&lt;/li&gt;
&lt;li&gt;“Your project description is too vague compared to stored details”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This kind of feedback is impossible without memory.&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2F5bzfgckpnbbwmldug3m2.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.amazonaws.com%2Fuploads%2Farticles%2F5bzfgckpnbbwmldug3m2.png" alt=" " width="800" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔗 Using Hindsight for context&lt;/p&gt;

&lt;p&gt;The memory layer is powered by:&lt;br&gt;
👉 &lt;a href="https://github.com/vectorize-io/hindsight" rel="noopener noreferrer"&gt;https://github.com/vectorize-io/hindsight&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;More details:&lt;br&gt;
👉 &lt;a href="https://hindsight.vectorize.io/" rel="noopener noreferrer"&gt;https://hindsight.vectorize.io/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Concepts:&lt;br&gt;
👉 &lt;a href="https://vectorize.io/features/agent-memory" rel="noopener noreferrer"&gt;https://vectorize.io/features/agent-memory&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📈 What improved after this change&lt;/p&gt;

&lt;p&gt;Before:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generic resume tips&lt;/li&gt;
&lt;li&gt;Repetitive suggestions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Context-aware corrections&lt;/li&gt;
&lt;li&gt;Missing content detection&lt;/li&gt;
&lt;li&gt;Better personalization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;❌ What didn’t work&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Relying only on resume text&lt;/li&gt;
&lt;li&gt;Ignoring past interactions&lt;/li&gt;
&lt;li&gt;Overloading the model with full memory&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🧩 Lessons learned&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A resume is incomplete without history&lt;/li&gt;
&lt;li&gt;Memory enables comparison, not just analysis&lt;/li&gt;
&lt;li&gt;Context merging is more powerful than parsing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🏁 Final thought&lt;/p&gt;

&lt;p&gt;Resume feedback is easy to build.&lt;/p&gt;

&lt;p&gt;Context-aware resume feedback is not.&lt;/p&gt;

&lt;p&gt;And the difference is "memory".&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2Fh9u0zx2n983xvd0gx5i7.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.amazonaws.com%2Fuploads%2Farticles%2Fh9u0zx2n983xvd0gx5i7.png" alt=" " width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>career</category>
    </item>
  </channel>
</rss>
