<?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"><channel><title><![CDATA[Feroan's Notes]]></title><description><![CDATA[Notes on what Feroan builds, the systems behind it, and the discoveries that come from developing software and AI.
]]></description><link>https://feroan.hashnode.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/6aa5a6144e636d310d3464e1/aad45bfa-b396-446f-b99d-79e314df9b63.jpg</url><title>Feroan&apos;s Notes</title><link>https://feroan.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Tue, 15 Sep 2026 22:59:25 GMT</lastBuildDate><atom:link href="https://feroan.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[What Building on Old Hardware Taught Me About Software]]></title><description><![CDATA[Everything Has a Cost
I don't develop on a powerful machine.
My main development laptop has 4 GB of RAM, limited graphics memory, and just enough storage to make me think twice before installing anoth]]></description><link>https://feroan.hashnode.dev/what-building-on-old-hardware-taught-me-about-software</link><guid isPermaLink="true">https://feroan.hashnode.dev/what-building-on-old-hardware-taught-me-about-software</guid><dc:creator><![CDATA[Feroan Mothy]]></dc:creator><pubDate>Tue, 15 Sep 2026 18:09:39 GMT</pubDate><content:encoded><![CDATA[<h2>Everything Has a Cost</h2>
<p>I don't develop on a powerful machine.</p>
<p>My main development laptop has 4 GB of RAM, limited graphics memory, and just enough storage to make me think twice before installing another tool I probably don't need.</p>
<p>It's not the kind of machine you'd look at and think, "perfect development environment."</p>
<p>But I've spent a lot of time building software on it.</p>
<p>And it taught me something I probably wouldn't have learned from a much more powerful machine:</p>
<p><strong>Hardware constraints make software impossible to ignore.</strong></p>
<p>When you have plenty of resources, inefficient software can hide behind them.</p>
<p>When you don't, it introduces itself immediately.</p>
<h2>Powerful Hardware Can Hide Bad Decisions</h2>
<p>This is probably the biggest lesson.</p>
<p>If an application consumes an extra 500 MB of memory on a machine with 32 GB, you might never notice.</p>
<p>On a machine with 4 GB, you definitely will.</p>
<p>The underlying software hasn't changed.</p>
<p>Only the amount of room available to hide its inefficiencies has changed.</p>
<p>That made me appreciate something simple:</p>
<p><strong>Performance isn't just a benchmark number.</strong></p>
<p>It's also about how much unnecessary work your software does.</p>
<p>How much memory it holds.</p>
<p>How many processes it starts.</p>
<p>How much it keeps running in the background.</p>
<p>How much data it moves around.</p>
<p>How many dependencies it needs before it can do something useful.</p>
<h2>I Started Caring About Lightweight Tools</h2>
<p>This changed the tools I choose.</p>
<p>I started preferring software that does one thing well without bringing an entire ecosystem with it.</p>
<p>Command-line tools became more attractive.</p>
<p>Simple utilities became more attractive.</p>
<p>SQLite became more attractive.</p>
<p>Local scripts became more attractive.</p>
<p>I started paying attention to applications that didn't need a dozen background processes just to open a window.</p>
<p>This isn't an argument that everyone should abandon modern tools.</p>
<p>Sometimes a heavier tool is absolutely worth the resources it uses.</p>
<p>The point is knowing that the resources are being spent.</p>
<h2>Linux Made This More Obvious</h2>
<p>Using Linux made this even more interesting.</p>
<p>The system exposes a lot more of what's happening underneath.</p>
<p>Processes.</p>
<p>Memory.</p>
<p>CPU usage.</p>
<p>Disk usage.</p>
<p>Services.</p>
<p>Logs.</p>
<p>Network connections.</p>
<p>You can inspect things instead of treating the operating system as a sealed box.</p>
<p>That changed the way I think about my development environment.</p>
<p>If something is slow, I want to know why.</p>
<p>If something is consuming memory, I want to know what it is doing.</p>
<p>If something is running in the background, I want to know whether I actually need it.</p>
<p>The machine became part of the development process rather than something I simply use to run an editor.</p>
<h2>Constraints Change Architecture</h2>
<p>Hardware limitations don't only affect which applications you install.</p>
<p>They can influence how you build software.</p>
<p>Running everything locally isn't always the best choice.</p>
<p>A local database might be perfectly reasonable.</p>
<p>A local API might be fine.</p>
<p>But running several containers, a database, a local model, a frontend development server, and multiple supporting services simultaneously can turn a small laptop into a space heater with a keyboard.</p>
<p>Sometimes the better architecture is:</p>
<p><strong>Local development → lightweight services → expensive workloads elsewhere</strong></p>
<p>That might mean using an API instead of running a large model locally.</p>
<p>Or using SQLite instead of running a database server when a server isn't necessary.</p>
<p>Or shutting down services when they're not being used.</p>
<p>The goal isn't to avoid complexity at all costs.</p>
<p>It's to make complexity intentional.</p>
<h2>I Started Looking at Dependencies Differently</h2>
<p>Dependencies are easy to accumulate.</p>
<p>You need something.</p>
<p>You install a package.</p>
<p>Then another.</p>
<p>Then another package pulls in five more.</p>
<p>Eventually your project works, but you don't really know how much machinery is underneath it.</p>
<p>Limited hardware makes that uncomfortable.</p>
<p>It encourages a different question:</p>
<blockquote>
<p>Do I actually need this?</p>
</blockquote>
<p>Sometimes the answer is yes.</p>
<p>Sometimes the answer is:</p>
<blockquote>
<p>I could write this myself in twenty lines.</p>
</blockquote>
<p>And sometimes the answer is:</p>
<blockquote>
<p>This dependency is absolutely worth it.</p>
</blockquote>
<p>All three are valid.</p>
<p>The important part is making the decision consciously.</p>
<h2>Small Tools Started Feeling More Valuable</h2>
<p>One of the reasons I enjoy building developer tools is probably connected to this.</p>
<p>A small CLI can sometimes solve a problem without requiring an entire application around it.</p>
<p>You run a command.</p>
<p>It does the work.</p>
<p>It prints the result.</p>
<p>You move on.</p>
<p>That's part of why I built <strong>Machine</strong>, a Linux diagnostics CLI.</p>
<p>The project started from a simple idea: I wanted a practical way to inspect my system without manually digging through different commands and files.</p>
<p>It eventually became more than that, with structured output, verbose modes, and snapshots.</p>
<p>But the basic philosophy stayed the same:</p>
<p><strong>Give me the information I need without making me fight the tool.</strong></p>
<h2>Resource Constraints Also Improve Debugging</h2>
<p>There is another unexpected benefit.</p>
<p>When resources are limited, problems become easier to notice.</p>
<p>A process leaking memory doesn't quietly disappear into 64 GB of RAM.</p>
<p>A build that suddenly becomes expensive is obvious.</p>
<p>A background service consuming CPU gets noticed.</p>
<p>A badly designed application can make the entire machine feel worse.</p>
<p>That feedback loop is valuable.</p>
<p>It forces you to investigate.</p>
<p>You learn to look at processes.</p>
<p>You learn to inspect logs.</p>
<p>You learn what swap actually does.</p>
<p>You learn the difference between something being slow and something simply waiting on I/O.</p>
<p>You learn that "the computer is slow" isn't a useful diagnosis.</p>
<p>Something is causing it.</p>
<p>Find the something.</p>
<h2>It Changed How I Think About Optimization</h2>
<p>I used to think of optimization as something you do after the software works.</p>
<p>Now I think there is a difference between <strong>optimization</strong> and <strong>awareness</strong>.</p>
<p>You don't need to prematurely optimize every function.</p>
<p>You do need to understand what your software costs.</p>
<p>There is a big difference between:</p>
<blockquote>
<p>Make everything as fast as possible.</p>
</blockquote>
<p>and:</p>
<blockquote>
<p>Don't waste resources for no reason.</p>
</blockquote>
<p>The second one is much more practical.</p>
<h2>Constraints Are Also a Design Tool</h2>
<p>This is probably the most useful lesson I've taken from working with old hardware.</p>
<p>Constraints aren't always just obstacles.</p>
<p>They can be design feedback.</p>
<p>If your application only works comfortably on a machine with huge amounts of RAM, maybe that's completely justified.</p>
<p>Or maybe you've accidentally built something much heavier than it needs to be.</p>
<p>If your development environment requires ten services just to start the project, maybe that's necessary.</p>
<p>Or maybe there's a simpler architecture hiding underneath.</p>
<p>The constraint doesn't tell you which answer is correct.</p>
<p>It makes you ask the question.</p>
<h2>I Still Want a Better Laptop</h2>
<p>This isn't a heroic story about embracing suffering and never upgrading.</p>
<p>I would absolutely enjoy having more RAM.</p>
<p>I'd like faster builds.</p>
<p>I'd like to run more things simultaneously.</p>
<p>I'd like to experiment with larger local models without watching memory disappear in real time.</p>
<p>Having better hardware is useful.</p>
<p>But I also don't want to forget what the limited hardware taught me.</p>
<p>Because once you develop on a machine where every resource matters, you start noticing things.</p>
<p>You notice unnecessary processes.</p>
<p>You notice bloated applications.</p>
<p>You notice dependencies.</p>
<p>You notice architecture.</p>
<p>You notice what your software is actually doing.</p>
<p>And that awareness follows you even when the hardware gets better.</p>
<h2>The Machine Is Part of the Software</h2>
<p>I think that's the biggest thing I took away.</p>
<p>Software doesn't exist in isolation.</p>
<p>It runs somewhere.</p>
<p>On a CPU.</p>
<p>Using memory.</p>
<p>Reading from storage.</p>
<p>Talking over a network.</p>
<p>Competing with other processes.</p>
<p>Waiting for hardware.</p>
<p>Those details are easy to ignore when everything feels instantaneous.</p>
<p>They're much harder to ignore when your machine makes you wait.</p>
<p>And maybe that's useful.</p>
<p>Because good software isn't just software that works.</p>
<p>It's software that understands the environment it has to work in.</p>
<p>Building on old hardware didn't make me a better programmer by magically teaching me some secret optimization technique.</p>
<p>It made me <strong>pay attention</strong>.</p>
<p>And sometimes, paying attention is where good engineering starts.</p>
]]></content:encoded></item><item><title><![CDATA[The Problem With Giving AI Agents Too Much Context]]></title><description><![CDATA[When an AI agent gives a bad answer, the instinct is often to give it more context.
More files.
More conversation history.
More documentation.
More retrieved chunks.
More memory.
It feels logical.
If ]]></description><link>https://feroan.hashnode.dev/the-problem-with-giving-ai-agents-too-much-context</link><guid isPermaLink="true">https://feroan.hashnode.dev/the-problem-with-giving-ai-agents-too-much-context</guid><category><![CDATA[AI]]></category><category><![CDATA[context engineering]]></category><category><![CDATA[ai agents]]></category><dc:creator><![CDATA[Feroan Mothy]]></dc:creator><pubDate>Mon, 14 Sep 2026 12:28:15 GMT</pubDate><content:encoded><![CDATA[<p>When an AI agent gives a bad answer, the instinct is often to give it more context.</p>
<p>More files.
More conversation history.
More documentation.
More retrieved chunks.
More memory.</p>
<p>It feels logical.</p>
<p>If the model doesn't know enough, give it more information.</p>
<p>But there is a point where more context stops helping and starts getting in the way.</p>
<p>The problem isn't always that an agent knows too little.</p>
<p>Sometimes it knows <strong>too much at once</strong>.</p>
<h2>Context Isn't Memory</h2>
<p>It's easy to treat an LLM's context window like a memory system.</p>
<p>It isn't.</p>
<p>Context is information the model can currently see while generating a response. Memory is information that has been deliberately stored, organized, retrieved, and used when it becomes relevant.</p>
<p>That distinction matters.</p>
<p>Imagine an agent working on a codebase.</p>
<p>It could be given:</p>
<ul>
<li>the current task</li>
<li>the entire conversation</li>
<li>every previous decision</li>
<li>all relevant files</li>
<li>old implementation details</li>
<li>every tool result</li>
<li>every error it has encountered</li>
<li>documentation for the entire project</li>
</ul>
<p>Technically, the agent has more information.</p>
<p>But that doesn't necessarily mean it has a better understanding of the task.</p>
<p>It now has to figure out what matters.</p>
<p>And that is another problem you just gave it.</p>
<h2>More Context Creates More Noise</h2>
<p>Suppose an agent is fixing a bug in an authentication flow.</p>
<p>You retrieve ten files.</p>
<p>Only three actually matter.</p>
<p>The other seven contain related concepts, old implementations, helper functions, comments, or configuration that happens to mention authentication.</p>
<p>Nothing is necessarily wrong with those files.</p>
<p>They're just not relevant enough.</p>
<p>Now the model has to process all of them while trying to identify the small amount of information that actually matters.</p>
<p>This creates a retrieval problem before you even reach the reasoning problem.</p>
<p>A useful mental model is:</p>
<pre><code class="language-text">Too little context
       ↓
The agent doesn't know enough

Useful context
       ↓
The agent has what it needs

Too much context
       ↓
The agent has to search through what it needs
</code></pre>
<p>The third case is surprisingly easy to create.</p>
<h2>The Context Window Is Not a Free Database</h2>
<p>A larger context window makes this easier to do, because there is more room to put information into the prompt.</p>
<p>But more capacity doesn't mean every piece of information should be included.</p>
<p>Think about a database query.</p>
<p>You wouldn't normally fetch every row from every table and hand the entire database to your application just because the database can handle it.</p>
<p>You query for what you need.</p>
<p>The same principle applies to agent context.</p>
<p>The goal shouldn't be:</p>
<blockquote>
<p>Put everything relevant into the context.</p>
</blockquote>
<p>It should be:</p>
<blockquote>
<p>Put the right information into the context at the right time.</p>
</blockquote>
<p>That sounds like a small distinction.</p>
<p>It isn't.</p>
<h2>Old Information Can Be Worse Than Missing Information</h2>
<p>This becomes even more important when agents have memory.</p>
<p>Imagine an agent remembers:</p>
<pre><code class="language-text">The project uses PostgreSQL.
</code></pre>
<p>Six months later, the project has moved to SQLite.</p>
<p>If the old memory is still being retrieved because it appears relevant, the agent now has conflicting information.</p>
<p>It may see:</p>
<pre><code class="language-text">Current configuration:
SQLite

Previous observation:
PostgreSQL
</code></pre>
<p>Now the model has to decide which one is correct.</p>
<p>You have turned memory into another reasoning problem.</p>
<p>This is why storing information isn't enough.</p>
<p>A useful memory system also needs things like:</p>
<ul>
<li>relevance</li>
<li>recency</li>
<li>confidence</li>
<li>relationships</li>
<li>source</li>
<li>verification</li>
<li>lifecycle</li>
</ul>
<p>Otherwise, memory slowly becomes a junk drawer.</p>
<p>And junk drawers are technically full of useful things.</p>
<p>Finding the useful thing is the problem.</p>
<h2>Conversation History Has the Same Problem</h2>
<p>Long conversations can create another form of context overload.</p>
<p>An agent might have hundreds of messages describing:</p>
<ul>
<li>previous approaches</li>
<li>abandoned ideas</li>
<li>temporary decisions</li>
<li>failed experiments</li>
<li>corrected assumptions</li>
<li>unrelated questions</li>
<li>implementation details</li>
</ul>
<p>Passing all of that into every new request sounds convenient.</p>
<p>But not every historical statement should have equal importance.</p>
<p>A decision made twenty messages ago might still matter.</p>
<p>A failed experiment from yesterday might be irrelevant.</p>
<p>A temporary workaround from an hour ago might actively confuse the agent if the underlying issue has already been fixed.</p>
<p>History is not automatically memory.</p>
<p>It is just history.</p>
<h2>Retrieval Quality Matters More Than Retrieval Quantity</h2>
<p>This is one of the biggest lessons I've noticed while working with RAG systems.</p>
<p>It's tempting to measure retrieval by how much information you managed to retrieve.</p>
<p>But retrieving twenty chunks isn't inherently better than retrieving five.</p>
<p>If those five contain the answer and the other fifteen are noise, the smaller context can be better.</p>
<p>A simple retrieval pipeline might look like:</p>
<pre><code class="language-text">User Query
    ↓
Retrieve documents
    ↓
Rank results
    ↓
Select useful context
    ↓
Build prompt
    ↓
LLM
</code></pre>
<p>The important part is the middle.</p>
<p>Retrieval shouldn't end at:</p>
<blockquote>
<p>Here are some documents that look similar.</p>
</blockquote>
<p>It should eventually answer:</p>
<blockquote>
<p>Which of these documents are actually useful for this task?</p>
</blockquote>
<p>That's where techniques like hybrid search, filtering, reranking, metadata, and relevance thresholds become important.</p>
<h2>Context Should Have a Budget</h2>
<p>I think it helps to treat context like a resource.</p>
<p>You have a limited amount of attention available.</p>
<p>So instead of asking:</p>
<blockquote>
<p>How much context can I fit?</p>
</blockquote>
<p>Ask:</p>
<blockquote>
<p>What deserves to occupy the context?</p>
</blockquote>
<p>For an AI coding agent, that might mean prioritizing:</p>
<pre><code class="language-text">Current task
    ↓
Relevant files
    ↓
Recent decisions
    ↓
Verified project knowledge
    ↓
Relevant tool results
    ↓
Everything else
</code></pre>
<p>Not every piece of information deserves equal priority.</p>
<p>Some information is critical.</p>
<p>Some is useful.</p>
<p>Some is outdated.</p>
<p>Some is noise.</p>
<p>Some is actively dangerous because it looks authoritative while being wrong.</p>
<p>A good context pipeline should know the difference.</p>
<h2>This Is Where Memory and Context Start to Separate</h2>
<p>This is also why I've become interested in memory layers for AI software engineering.</p>
<p>An agent shouldn't have to carry its entire history around forever.</p>
<p>Instead, information can exist outside the active context and be retrieved when needed.</p>
<p>Conceptually:</p>
<pre><code class="language-text">                 ┌──────────────┐
                 │   Memory     │
                 │              │
                 │ decisions    │
                 │ observations │
                 │ relationships│
                 │ snapshots    │
                 └──────┬───────┘
                        │
                     retrieve
                        ↓
User Task ─────────→ Relevant Context
                        │
                        ↓
                      Agent
</code></pre>
<p>The context becomes a working set rather than a warehouse.</p>
<p>That distinction is important.</p>
<p>A warehouse stores everything.</p>
<p>A working set contains what you currently need.</p>
<h2>Bigger Context Windows Don't Solve This</h2>
<p>Longer context windows are useful.</p>
<p>They allow agents to work with larger codebases, longer conversations, and more complicated tasks.</p>
<p>But increasing the capacity doesn't automatically solve information selection.</p>
<p>If anything, it can make bad context design easier to hide.</p>
<p>You can keep adding information because the system still technically fits inside the window.</p>
<p>The failure becomes less obvious.</p>
<p>Instead of hitting a hard limit, you get an agent that technically has everything it needs but somehow keeps missing the important part.</p>
<p>That's a much more interesting problem.</p>
<h2>The Goal Isn't Less Context</h2>
<p>I don't think the answer is to give agents tiny prompts and pretend context isn't important.</p>
<p>Agents need context.</p>
<p>Good context is one of the things that makes them useful.</p>
<p>The goal is <strong>better context</strong>.</p>
<p>That means:</p>
<ul>
<li>retrieve information instead of dumping everything</li>
<li>prefer recent and verified information</li>
<li>remove stale observations</li>
<li>rank retrieved results</li>
<li>separate memory from active context</li>
<li>preserve important decisions</li>
<li>avoid carrying irrelevant conversation history</li>
<li>give tools only the information they need</li>
<li>treat context as a resource</li>
</ul>
<p>The best agent isn't necessarily the one that knows the most.</p>
<p>It's the one that can <strong>bring the right knowledge into the room when it matters</strong>.</p>
<h2>Context Engineering Is Really Information Engineering</h2>
<p>This is probably the bigger lesson for me.</p>
<p>Building AI systems isn't only about choosing a better model.</p>
<p>A model can be extremely capable and still perform badly if the information around it is poorly managed.</p>
<p>You need to think about:</p>
<pre><code class="language-text">What should be stored?
What should be retrieved?
What should be ignored?
What should be trusted?
What should expire?
What should be verified?
What should actually reach the model?
</code></pre>
<p>Those are software engineering questions as much as they are AI questions.</p>
<p>And as agents become capable of working across larger codebases and longer-running tasks, I think this becomes increasingly important.</p>
<p>The interesting problem isn't just giving agents more information.</p>
<p>It's building systems that help them <strong>know which information matters</strong>.</p>
<hr />
<h3>Final thought</h3>
<p>There is a strange irony in building systems that are supposed to help AI remember.</p>
<p>The obvious solution is to remember everything.</p>
<p>But useful memory has never really worked that way.</p>
<p>Humans don't need to consciously carry every conversation, every mistake, and every piece of information they've ever encountered.</p>
<p>We remember selectively.</p>
<p>We forget.</p>
<p>We prioritize.</p>
<p>We retrieve.</p>
<p>We update what we know.</p>
<p>AI agents need similar mechanisms if they're going to operate reliably over long periods of time.</p>
<p>So maybe the future of agent context isn't:</p>
<p><strong>more context.</strong></p>
<p>Maybe it's <strong>better context.</strong></p>
]]></content:encoded></item><item><title><![CDATA[Why I Built Chronicles Without an LLM]]></title><description><![CDATA[There is a very tempting pattern when building anything around AI.
You find a problem, add an LLM, give it some context, and suddenly it feels like the problem is solved.
I almost did exactly that wit]]></description><link>https://feroan.hashnode.dev/why-i-built-chronicles-without-an-llm</link><guid isPermaLink="true">https://feroan.hashnode.dev/why-i-built-chronicles-without-an-llm</guid><category><![CDATA[AI]]></category><category><![CDATA[llm]]></category><category><![CDATA[Developer Tools]]></category><category><![CDATA[ai agents]]></category><dc:creator><![CDATA[Feroan Mothy]]></dc:creator><pubDate>Sun, 13 Sep 2026 11:58:38 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6aa5a6144e636d310d3464e1/31a2a011-e38f-45d7-bcc6-e48da10d218e.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>There is a very tempting pattern when building anything around AI.</p>
<p>You find a problem, add an LLM, give it some context, and suddenly it feels like the problem is solved.</p>
<p>I almost did exactly that with Chronicles.</p>
<p>But the more I thought about the problem I was actually trying to solve, the more I realized that I didn't need an LLM for the first version.</p>
<p>I needed something much simpler.</p>
<p>A memory layer.</p>
<h2>The Problem</h2>
<p>AI coding agents can do a lot.</p>
<p>They can read files, call tools, write code, run commands, inspect errors, and reason about what to do next.</p>
<p>But there is one thing they don't naturally have:</p>
<p><strong>A reliable memory of the work that happened before.</strong></p>
<p>An agent can understand the current state of a repository, but that doesn't necessarily mean it understands how the repository got there.</p>
<p>It might know that a function exists.</p>
<p>It might not know why it was added.</p>
<p>It might see a configuration file.</p>
<p>It might not know what problem that configuration was meant to solve.</p>
<p>It might inspect the current branch.</p>
<p>It might not remember what happened on another branch last week.</p>
<p>That distinction started bothering me.</p>
<p>Because context and memory are not the same thing.</p>
<h2>The Easy Answer Was an LLM</h2>
<p>The obvious solution was to use another LLM.</p>
<p>Take the project's history.</p>
<p>Feed it into a model.</p>
<p>Let the model summarize it.</p>
<p>Generate embeddings.</p>
<p>Store everything in a vector database.</p>
<p>Then retrieve the relevant memories when an agent needs them.</p>
<p>That sounds reasonable.</p>
<p>And eventually, something like that may be useful.</p>
<p>But I realized I was trying to solve two different problems at once.</p>
<p>First:</p>
<p><strong>How should an AI software engineering system remember things?</strong></p>
<p>Second:</p>
<p><strong>How should that memory be made intelligent?</strong></p>
<p>I didn't think I needed to solve the second problem before understanding the first.</p>
<p>So I went back to the primitive.</p>
<h2>Start With the Primitive</h2>
<p>The first version of Chronicles is deliberately boring.</p>
<p>It is built with Python, SQLAlchemy, and SQLite.</p>
<p>There is no LLM managing the memory.</p>
<p>There is no RAG pipeline.</p>
<p>There is no embedding model deciding what is important.</p>
<p>Instead, Chronicles focuses on structured information.</p>
<p>Things like:</p>
<ul>
<li>observations</li>
<li>relationships</li>
<li>snapshots</li>
<li>confidence</li>
<li>branches</li>
<li>verification</li>
<li>memory decay</li>
</ul>
<p>The goal is to make memory something that can actually be inspected.</p>
<p>If the system remembers something, I should be able to see what it remembers.</p>
<p>If something is wrong, I should be able to trace where it came from.</p>
<p>If confidence changes, I should be able to understand why.</p>
<p>That felt much more useful for a first version than hiding everything behind another model.</p>
<h2>Boring Is Useful</h2>
<p>There is a certain appeal to making everything intelligent.</p>
<p>But sometimes intelligence makes systems harder to understand.</p>
<p>Imagine asking an LLM:</p>
<blockquote>
<p>Why does the system believe this?</p>
</blockquote>
<p>You might get an explanation.</p>
<p>But the explanation itself is another generated output.</p>
<p>With structured memory, I can inspect the actual data.</p>
<p>There is something satisfying about that.</p>
<p>Not because structured data is exciting.</p>
<p>It isn't.</p>
<p>But because predictable systems are easier to build on.</p>
<p>I wanted Chronicles to establish the foundation before adding anything that could make that foundation harder to reason about.</p>
<h2>Verification Matters</h2>
<p>Memory is only useful if you can trust it.</p>
<p>That means Chronicles treats verification as a separate concern.</p>
<p>The idea is simple:</p>
<p><strong>Reading memory should not silently change memory.</strong></p>
<p>Verification should be read-only.</p>
<p>That makes it easier to inspect what the system knows without accidentally modifying the state while checking it.</p>
<p>This might sound like a small design decision.</p>
<p>For a memory system, I don't think it is.</p>
<p>If the thing responsible for remembering can casually rewrite what it remembers while you are trying to inspect it, debugging becomes a strange game of chasing your own footprints.</p>
<h2>Local First</h2>
<p>Another deliberate choice was keeping Chronicles local-first.</p>
<p>The first version uses SQLite.</p>
<p>That gives me a small, inspectable system that can run without depending on a remote service.</p>
<p>It also fits the problem.</p>
<p>A memory layer for AI software engineering shouldn't necessarily require sending a project's history somewhere else just to remember what happened.</p>
<p>Local storage makes experimentation easier too.</p>
<p>I can inspect the database.</p>
<p>I can test the behavior.</p>
<p>I can break things.</p>
<p>I can rebuild them.</p>
<p>There is no external infrastructure standing between me and the thing I'm trying to understand.</p>
<h2>This Doesn't Mean LLMs Don't Belong Here</h2>
<p>I don't think the conclusion is that Chronicles should never use an LLM.</p>
<p>Quite the opposite.</p>
<p>There are plenty of places where an LLM could eventually be useful.</p>
<p>It could help identify important observations.</p>
<p>It could summarize related memories.</p>
<p>It could help decide which pieces of historical context are relevant to a task.</p>
<p>It could make retrieval more semantic.</p>
<p>Those are interesting problems.</p>
<p>But they are problems I want to approach after the underlying memory model makes sense.</p>
<p>Otherwise, I would be asking a model to hide complexity that I haven't understood yet.</p>
<h2>Build the Foundation First</h2>
<p>This is probably the biggest lesson I got from building Chronicles so far.</p>
<p>When building AI systems, it is very easy to jump directly to the intelligent part.</p>
<p>Add an LLM.</p>
<p>Add RAG.</p>
<p>Add agents.</p>
<p>Add embeddings.</p>
<p>Add another model.</p>
<p>Before long, the architecture looks impressive, but it becomes difficult to tell which part is actually solving the original problem.</p>
<p>I wanted to take the opposite approach.</p>
<p>Start with the smallest useful primitive.</p>
<p>Make it inspectable.</p>
<p>Make it testable.</p>
<p>Make it predictable.</p>
<p>Then build intelligence on top of it.</p>
<h2>Why Chronicles Exists</h2>
<p>That is ultimately why I built Chronicles.</p>
<p>Not as another chatbot.</p>
<p>Not as another agent.</p>
<p>But as a shared memory layer for AI software engineering.</p>
<p>The first version doesn't try to make memory intelligent.</p>
<p>It tries to make memory understandable.</p>
<p>And I think that's an important distinction.</p>
<p>The goal is to give AI coding agents a way to carry useful history across tasks, sessions, and branches without making the memory itself a black box.</p>
<p>That's why the first version of Chronicles doesn't have an LLM or RAG at its core.</p>
<p>I wanted to build the memory layer before trying to make the memory intelligent.</p>
<p>Maybe that's less flashy.</p>
<p>But it gives me something I can actually inspect, test, and build on.</p>
<p>And for a system whose entire purpose is to remember, I think that's a pretty good place to start.</p>
<hr />
<h3>Chronicles</h3>
<p><a href="https://github.com/Feroan101/chronicles">Chronicles</a> is the shared memory layer I'm building for AI software engineering.</p>
<p><a href="https://github.com/Feroan101/chronicles">View Chronicles on GitHub</a></p>
]]></content:encoded></item><item><title><![CDATA[Why AI Agents Need a Memory Layer]]></title><description><![CDATA[AI agents can read files, call tools, write code, run commands, and reason about problems.
But there is still something they are surprisingly bad at:
Remembering what happened before.
A coding agent c]]></description><link>https://feroan.hashnode.dev/why-ai-agents-need-a-memory-layer</link><guid isPermaLink="true">https://feroan.hashnode.dev/why-ai-agents-need-a-memory-layer</guid><dc:creator><![CDATA[Feroan Mothy]]></dc:creator><pubDate>Sat, 12 Sep 2026 21:12:36 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6aa5a6144e636d310d3464e1/b715e224-071f-4aba-9196-5fc03e612fa7.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>AI agents can read files, call tools, write code, run commands, and reason about problems.</p>
<p>But there is still something they are surprisingly bad at:</p>
<p><strong>Remembering what happened before.</strong></p>
<p>A coding agent can spend an hour working through a problem, discover an important detail about the codebase, make an architectural decision, and then start a new session with very little awareness of any of it.</p>
<p>The context window starts fresh.</p>
<p>The project doesn't.</p>
<p>That gap is what got me interested in memory for AI software engineering.</p>
<h2>Context isn't memory</h2>
<p>It's easy to treat a large context window as memory.</p>
<p>But they're not the same thing.</p>
<p>Context is what an agent currently has access to.</p>
<p>Memory is what the system has deliberately retained from previous work.</p>
<p>Imagine working on a codebase for several weeks.</p>
<p>During that time, you might discover:</p>
<ul>
<li>Why a particular architectural decision was made</li>
<li>Which approach was already tried and didn't work</li>
<li>How two components depend on each other</li>
<li>Why a seemingly strange piece of code exists</li>
<li>What changed between different points in the project</li>
<li>How confident you are that a particular observation is still correct</li>
</ul>
<p>None of that should have to disappear just because a new session starts.</p>
<h2>The problem with simply adding an LLM</h2>
<p>The obvious solution is to put an LLM in front of everything.</p>
<p>Summarize the conversation.</p>
<p>Store the summary.</p>
<p>Embed it.</p>
<p>Retrieve it later.</p>
<p>That can work, but it also makes the memory system dependent on another layer of intelligence before we've even answered a more fundamental question:</p>
<p><strong>What should an AI software engineering system actually remember?</strong></p>
<p>I wanted to explore that question first.</p>
<h2>Introducing Chronicles</h2>
<p>That's why I started building <strong>Chronicles</strong>.</p>
<p>Chronicles is a local-first memory layer for AI software engineering.</p>
<p>Instead of trying to make another coding agent, the idea is to build infrastructure that an agent could use to maintain structured memory across its work.</p>
<p>The core is intentionally simple.</p>
<p>Chronicles currently uses <strong>Python, SQLAlchemy, and SQLite</strong>.</p>
<p>There is no LLM required for the core memory system.</p>
<p>There is no RAG pipeline required either.</p>
<p>The focus is on representing and managing engineering knowledge itself.</p>
<h2>What should an agent remember?</h2>
<p>This became one of the most interesting parts of building it.</p>
<p>A useful memory layer can't just be a bucket of text.</p>
<p>Software projects have structure.</p>
<p>An observation can relate to another observation.</p>
<p>A snapshot can represent the state of a project at a particular point.</p>
<p>A piece of information can have a confidence score.</p>
<p>Different branches can have different contexts.</p>
<p>These relationships start to matter when the goal isn't simply to retrieve a paragraph, but to give an agent a better understanding of the project it is working on.</p>
<h2>Memory needs to be trustworthy</h2>
<p>There's another problem with persistent memory:</p>
<p><strong>What happens when the memory is wrong?</strong></p>
<p>An agent shouldn't blindly trust everything it finds in its own history.</p>
<p>That's why verification is treated separately in Chronicles.</p>
<p>Verification is read-only. It can inspect stored information without silently changing the memory itself.</p>
<p>That separation is small, but important.</p>
<p>A memory system should have a clear distinction between:</p>
<p><strong>what the system remembers</strong></p>
<p>and</p>
<p><strong>what the system currently believes has been verified.</strong></p>
<h2>Starting without AI</h2>
<p>Chronicles is deliberately starting without an LLM in the core.</p>
<p>That might sound backwards for a project about AI software engineering.</p>
<p>For me, it's the opposite.</p>
<p>I want to understand the memory model before adding a model that can automatically manipulate it.</p>
<p>If the foundation is unclear, adding an LLM doesn't solve the problem. It just makes the system harder to reason about.</p>
<p>So the first version focuses on the boring parts that actually matter:</p>
<ul>
<li>Data structures</li>
<li>Relationships</li>
<li>Persistence</li>
<li>Snapshots</li>
<li>Confidence</li>
<li>Verification</li>
<li>Project and branch context</li>
</ul>
<p>Once those foundations make sense, more intelligent layers can be built on top.</p>
<h2>The bigger idea</h2>
<p>I don't think AI software engineering will be just about making agents better at generating code.</p>
<p>The interesting part is what happens when agents can build up a persistent understanding of the software they work on.</p>
<p>An agent that can reason about a project for one session is useful.</p>
<p>An agent that can build on what it discovered yesterday is something different.</p>
<p>That's the problem I'm exploring with Chronicles.</p>
<p>Not another agent.</p>
<p>Not another chatbot.</p>
<p><strong>A memory layer for the agents that build software.</strong></p>
<p>And this is just the beginning.</p>
]]></content:encoded></item></channel></rss>