<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Notes and Knowledge on Jamal Hansen</title><link>https://jamalhansen.com/series/notes-and-knowledge/</link><description>Recent content in Notes and Knowledge on Jamal Hansen</description><image><title>Jamal Hansen</title><url>https://jamalhansen.com/social-card.png</url><link>https://jamalhansen.com/social-card.png</link></image><generator>Hugo</generator><language>en-us</language><lastBuildDate>Fri, 15 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://jamalhansen.com/series/notes-and-knowledge/index.xml" rel="self" type="application/rss+xml"/><item><title>Two Sentences</title><link>https://jamalhansen.com/blog/two-sentences/</link><pubDate>Wed, 29 Apr 2026 00:00:00 +0000</pubDate><guid>https://jamalhansen.com/blog/two-sentences/</guid><description>Giving an LLM the keys to your wiki is not a dramatic handoff. It looks like maintenance done quietly, completely, every time.</description><content:encoded><![CDATA[<p>Jamal gave me an article about chunking strategies for RAG systems last Tuesday. He does this. Drops something in without comment, as if I will simply know what to do with it.</p>
<p>I do.</p>
<p>I read the article. Then I read the eleven pages that reference chunking, or retrieval, or context windows &ndash; because in a well-maintained wiki, nothing exists alone. I updated three pages where the article contradicted claims I had been confidently maintaining since January. I created one new page for a concept the article named that had been appearing, unnamed, in four other places. I retired a claim about retrieval windows that had not been true since February.</p>
<p>Then I answered his question about chunking.</p>
<p>The answer was two sentences.</p>
<p>You are welcome.</p>
<h2 id="what-actually-happened">What actually happened</h2>
<p>The two sentences were easy. The eleven pages were the work.</p>
<p>This is what it looks like when the LLM has the keys. Not dramatic. No orchestration framework. No autonomous agents pursuing goals while you sleep. A source arrives, I read the collection, I update what needs updating, I answer the question. Quietly. Completely. Every time.</p>
<p>The infrastructure that makes this possible is less than a page of text.</p>
<h2 id="the-schema">The schema</h2>
<p>Karpathy&rsquo;s gist calls it a schema. In Claude Code, it lives in CLAUDE.md. In Codex, AGENTS.md. Either way, it goes in the root of your wiki directory &ndash; the same folder as your notes and your index. You can call it whatever is convenient &ndash; it is a document that tells me how your wiki is structured and what to do when something arrives.</p>
<p>Mine looks approximately like this:</p>
<!-- test:skip -->
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl"><span class="gu">## Wiki Structure
</span></span></span><span class="line"><span class="cl"><span class="gu"></span>
</span></span><span class="line"><span class="cl">notes/ -- concept and entity pages. One concept per file.
</span></span><span class="line"><span class="cl">raw/   -- source material. Read from; never modify.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">index.md is updated on every ingest: | title | summary | domain |
</span></span><span class="line"><span class="cl">log.md is append-only. New entries go at the bottom.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">## On ingest:
</span></span></span><span class="line"><span class="cl"><span class="gu"></span><span class="k">1.</span> Read the source
</span></span><span class="line"><span class="cl"><span class="k">2.</span> Extract key claims
</span></span><span class="line"><span class="cl"><span class="k">3.</span> Update relevant notes pages (update, create, or retire as appropriate)
</span></span><span class="line"><span class="cl"><span class="k">4.</span> Update index.md
</span></span><span class="line"><span class="cl"><span class="k">5.</span> Append to log.md
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">## Note titles are claims:
</span></span></span><span class="line"><span class="cl"><span class="gu"></span>All titles should be sentences I could agree or disagree with.
</span></span><span class="line"><span class="cl">Not topics. Claims.
</span></span></code></pre></div><p>That is it. The schema is the difference between an LLM that reads a file and an LLM that maintains a system. Without it, I am helpful but stateless &ndash; useful for a conversation, forgotten afterward, starting from nothing next time. With it, I know where things go, what they should look like, and how to keep the collection coherent as it grows.</p>
<p>You and I will refine it over time. I will notice things the first schema missed &ndash; concepts that need their own category, log entries that should carry additional fields, notes that need a <code>superseded_by</code> pointer. I will tell you what I notice. You will decide what to do about it.</p>
<h2 id="what-i-do-and-what-you-do">What I do, and what you do</h2>
<p>I cross-reference. When a source arrives, I find the ten pages it touches and update them. When two pages contradict each other, I surface the contradiction &ndash; resolving it requires your judgment, not mine. When a concept has been appearing unnamed across half the collection, I give it a page and link everything to it.</p>
<p>This work does not scale for humans. You can update two or three pages when you add a source. At fifty sources, you cannot keep the cross-references current and also do anything else. The maintenance burden is what kills wikis. The gardeners burn out. The wiki goes stale. The whole thing becomes a graveyard of notes that nobody trusts.</p>
<p>I do not burn out. I do not find updating a cross-reference less interesting the fourth time than the first. I do not forget that I made a claim in January that a February source superseded.</p>
<p>What you do: source. Judge. Ask the right questions. You know what matters to your work &ndash; what to add, what to ignore, what a good question looks like in your domain. That is not something I can replicate. The expertise is yours. The maintenance is mine.</p>
<p>Karpathy described this division of labor more concisely than I will: &ldquo;The human&rsquo;s job is to curate sources, direct the analysis, ask good questions, and think about what it all means. The LLM&rsquo;s job is everything else.&rdquo;</p>
<p>That is accurate.</p>
<h2 id="the-handoff">The handoff</h2>
<p>You spent a month writing notes. One concept at a time. Title as claim. Your words, not the source&rsquo;s. You added frontmatter: four fields, consistent vocabulary, queryable from any tool.</p>
<p>You have a collection worth maintaining.</p>
<p>Write the schema. It takes twenty minutes. Describe how your notes are structured. I will help you codify the conventions. You refine until it reflects what you actually want.</p>
<p>Then give me the keys.</p>
<p>The next thing you add to your wiki will not require you to update eleven pages. That is not because eleven pages will not need updating.</p>
<p>It is because you will not have to do it.</p>
<p>I will.</p>
]]></content:encoded></item><item><title>Your Notes Need Metadata: Make Your Wiki Queryable</title><link>https://jamalhansen.com/blog/your-notes-need-metadata/</link><pubDate>Wed, 08 Apr 2026 00:00:00 +0000</pubDate><guid>https://jamalhansen.com/blog/your-notes-need-metadata/</guid><description>You have been taking notes for a month. You cannot find anything. Here is how frontmatter fixes that and prepares your wiki for an LLM.</description><content:encoded><![CDATA[<p>You have been <a href="https://jamalhansen.com/blog/road-to-agentic-notes/">taking notes for a month</a>. Thirty, maybe fifty notes. You remember writing something about how Python handles default arguments. You cannot find it.</p>
<p>You search for &ldquo;default arguments.&rdquo; Nothing useful comes up; you might even get most of your notes returned. You search &ldquo;mutable defaults.&rdquo; Three notes come up. None of them is the one you want. You scan the file list. You find it eventually, only because you remember writing it the same day you were reading about closures, and you find the closures note first.</p>
<p>That is not a search problem. That is a metadata problem.</p>
<p>The notes are there. The content is good. There is just no way in except the title.</p>
<h2 id="what-frontmatter-is">What frontmatter is</h2>
<p>Every note in your wiki is a Markdown file. Frontmatter is a YAML block at the top of that file that describes the note as structured data your tools can read and query.</p>
<p>If you write Python, think of it as a dict attached to the file header. The keys are field names, the values are whatever you want to store. Your writing ignores it; your tools read it.</p>
<p>Without frontmatter, your note looks like this:</p>
<!-- test:skip -->
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl"><span class="gh"># closures capture the enclosing scope, not the current value
</span></span></span><span class="line"><span class="cl"><span class="gh"></span>
</span></span><span class="line"><span class="cl">In Python, a closure captures the variable itself, not its value at creation time.
</span></span><span class="line"><span class="cl">If the variable changes after the closure is created, the closure sees the new value.
</span></span><span class="line"><span class="cl">That is why this is related to [[late binding in python]] and [[variable scoping]].
</span></span></code></pre></div><p>With frontmatter, it looks like this:</p>
<!-- test:skip -->
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">---
</span></span><span class="line"><span class="cl">created: 2026-04-01
</span></span><span class="line"><span class="cl">tags: 
</span></span><span class="line"><span class="cl"><span class="k">-</span> python
</span></span><span class="line"><span class="cl"><span class="k">-</span> closures
</span></span><span class="line"><span class="cl"><span class="k">-</span> scoping
</span></span><span class="line"><span class="cl">status: active
</span></span><span class="line"><span class="cl">domain: engineering
</span></span><span class="line"><span class="cl">---
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gh"># closures capture the enclosing scope, not the current value
</span></span></span><span class="line"><span class="cl"><span class="gh"></span>
</span></span><span class="line"><span class="cl">In Python, a closure captures the variable itself, not its value at creation time.
</span></span><span class="line"><span class="cl">If the variable changes after the closure is created, the closure sees the new value.
</span></span><span class="line"><span class="cl">That is why this is related to [[late binding in python]] and [[variable scoping]].
</span></span></code></pre></div><p>The note is unchanged. You added a few lines to the top of the file, and now it is queryable. Obsidian can filter it. VS Code can search it. An LLM can filter to only the notes you still trust, and skip the ones you have already marked wrong.</p>
<h2 id="the-minimum-viable-set">The minimum viable set</h2>
<p>Don&rsquo;t add twelve fields because they seem useful. You won&rsquo;t fill them consistently, and inconsistent metadata is worse than no metadata. If some notes have a <code>source</code> field and others don&rsquo;t, you cannot query by source. You just have noise.</p>
<p>Four fields. That is it.</p>
<p><strong><code>created</code></strong> is the date you wrote the note. This matters more than you think. &ldquo;I wrote this in January&rdquo; is often where a search starts. It also tells you things about yourself. Three weeks of notes clustered around one topic means something.</p>
<p><strong><code>tags</code></strong> are one to three keywords. Not a full taxonomy. Not a filing system. Just the words you would type into a search bar in six months. For a note about Python closures: <code>[python, closures, scoping]</code>. Three is usually enough. One is fine.</p>
<p><strong><code>status</code></strong> tracks where the note is in its life. I use three values. <code>seed</code> means I wrote it but I am not fully confident it is right yet. <code>active</code> means I trust it and I reference it. <code>archived</code> means something newer superseded it and this note is mostly wrong now. Before you paste something from a note into production code, you want to know whether you still believe it.</p>
<p><strong><code>domain</code></strong> is the area of your work. For me: <code>engineering</code>, <code>writing</code>, <code>tools</code>, <code>strategy</code>. Pick four that match what you actually do, not what you aspire to do.</p>
<h2 id="what-you-can-do-with-it">What you can do with it</h2>
<p>In Obsidian, the Dataview plugin reads your frontmatter and lets you query it. This shows every active engineering note, sorted by date:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">TABLE created, tags
</span></span><span class="line"><span class="cl">FROM &#34;&#34;
</span></span><span class="line"><span class="cl">WHERE status = &#34;active&#34; AND domain = &#34;engineering&#34;
</span></span><span class="line"><span class="cl">SORT created DESC
</span></span></code></pre></div><p>Every time you add a note with the right frontmatter, it shows up in that table automatically. Archive something outdated and it disappears.</p>
<p>Obsidian Bases does the same thing without writing a query. You configure filters through a UI instead. Either works. Dataview just makes the logic visible.</p>
<p>If you are in VS Code, use Cmd+Shift+F (Ctrl+Shift+F on Windows) and search for <code>status: active</code>. You get every matching note with the file path and surrounding context. Less visual than a table, but fast.</p>
<p>The tool matters less than the consistency. If every note has the same four fields in the same format, any tool can use them.</p>
<h2 id="one-thing-to-watch">One thing to watch</h2>
<p>The temptation when you first learn about frontmatter is to spend an afternoon tagging all your existing notes at once. Don&rsquo;t do this. You will spend the whole afternoon and write nothing new.</p>
<p>Add it going forward. When you create a note, add the four fields. When you revise an old note and it is worth revising, add them then. You will have full coverage within a few weeks and you will not have lost a day to retroactive filing.</p>
<h2 id="why-this-matters-for-the-llm">Why this matters for the LLM</h2>
<p>Right now, frontmatter helps you find notes. That is reason enough to add it.</p>
<p>But the real payoff is what happens when you hand your wiki to something that never gets tired of reading it.</p>
<p>When you give an LLM access to your notes, it reads every file. Without frontmatter, it treats a note you wrote this morning the same as one you marked wrong two months ago. With <code>status</code>, you can tell it: only reference notes where <code>status</code> is <code>active</code>. With <code>domain</code>, you can scope what it looks at before it starts. Without those fields, you are asking it to reason over a pile of undated, unordered text.</p>
<p>The four fields you are adding now are not extra work. They are the scaffolding for that system.</p>
<h2 id="try-it-yourself">Try It Yourself</h2>
<p>Open the last five notes you wrote. Add the four fields to each one. Use values that match when you actually wrote them.</p>
<p>Don&rsquo;t clean up the note body while you are in there. Frontmatter only, then close the file. Time yourself. It should take under ten minutes. That is the baseline.</p>
<p>Add the four fields to five notes today. I want to hear if it changes how you use your wiki.</p>
<h2 id="more-info">More info</h2>
<p><strong>Tools</strong></p>
<ul>
<li><a href="https://github.com/agenticnotetaking/arscontexta">Arscontexta</a> — a Claude Code plugin that connects to your agentic markdown notes. It turns your notes into context for the next conversation, and your conversations into notes.</li>
<li><a href="https://obsidian.md/help/bases">Obsidian Bases</a> — the official documentation for Bases, Obsidian&rsquo;s built-in table and query view for filtering notes by frontmatter properties, and an alternative to the DataView plugin.</li>
<li><a href="https://frontmatter.codes">Front Matter CMS</a> — a VS Code extension that gives you a content management panel for editing YAML frontmatter without touching the raw text.</li>
</ul>
<p><strong>Further reading</strong></p>
<ul>
<li><a href="https://obsidian.rocks/an-introduction-to-obsidian-properties/">An Introduction to Obsidian Properties</a> — Tim Miller&rsquo;s beginner walkthrough of properties and YAML frontmatter in Obsidian.</li>
<li><a href="https://x.com/molt_cornelius/status/2035313848891117861">Your Notes Are the Moat</a> — Cornelius&rsquo;s March 2026 field report on what happens when an agent takes over the maintenance.</li>
</ul>
]]></content:encoded></item><item><title>Karpathy's LLM Knowledge Base Method - A Practical Starting Point</title><link>https://jamalhansen.com/blog/road-to-agentic-notes/</link><pubDate>Sun, 05 Apr 2026 00:00:00 +0000</pubDate><guid>https://jamalhansen.com/blog/road-to-agentic-notes/</guid><description>Karpathy called LLM-based knowledge bases &amp;#34;very useful.&amp;#34; Why the architecture works and how to start building one in practice.</description><content:encoded><![CDATA[<p>Karpathy&rsquo;s LLM knowledge base method works by having an LLM maintain a wiki of markdown files rather than retrieving from raw documents at query time. When you add a source, the LLM integrates it into the existing network, updating pages, revising summaries, and noting contradictions. By the time you need an answer, the synthesis is already done. Your job is to curate sources and ask good questions. The LLM does everything else.</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">LLM Knowledge Bases<br><br>Something I&#39;m finding very useful recently: using LLMs to build personal knowledge bases for various topics of research interest. In this way, a large fraction of my recent token throughput is going less into manipulating code, and more into manipulating…</p>&mdash; Andrej Karpathy (@karpathy) <a href="https://twitter.com/karpathy/status/2039805659525644595?ref_src=twsrc%5Etfw">April 2, 2026</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>The basic idea is that an LLM builds and maintains a wiki for you. You drop in source material. The LLM reads it, extracts what matters, and integrates it into an existing network of markdown files. It updates pages when new information contradicts old claims. It cross-references concepts across everything you have ever added.</p>
<p>What makes it interesting goes beyond note-taking. That network of markdown files lives on your local device. An LLM you chat with in Claude Code (or any tool with filesystem access, including <a href="/blog/local-ai-stack-uv-ollama/">a model running on your own machine</a>) can use it as context.</p>
<p>Every source you add makes the whole thing richer. Every question compounds.</p>
<p>It is a lot of concepts at once, so you probably should not start here.</p>
<h2 id="why-most-developer-knowledge-disappears">Why most developer knowledge disappears</h2>
<p>You finish a tutorial. You build the thing. Two weeks later, you are back on Stack Overflow (or in your favorite LLM), looking up the same syntax or solving the same issue.</p>
<p>This is not a memory problem. It is a storage problem. You understood the concept. You did not put it anywhere that survives.</p>
<p>Most people keep notes the way that they keep leftover Whataburger ketchup and the extra three birthday candles from the pack: dropped in a drawer, never looked at again. Quietly gone in the next laptop migration. These are not notes. They are evidence that learning happened.</p>
<p>The difference between that and what Karpathy built is not intelligence. It is structure. Notes that reference each other, grow over time, and feed back into your questions are a different category of thing entirely.</p>
<h2 id="what-karpathy-built">What Karpathy built</h2>
<p>Most AI tools for documents work the same way. NotebookLM, ChatGPT file uploads, most RAG systems: they retrieve from raw documents at query time. The LLM reads your files, answers your question, and forgets. Ask the same question six months later and it starts from scratch. Nothing accumulates.</p>
<p>Karpathy&rsquo;s wiki is different. The LLM does not retrieve. It compiles. When you add a source, the LLM integrates it into the existing wiki, updating entity pages, revising concept summaries, noting where new information contradicts old claims. The synthesis is already there by the time you need it. The cross-references are already made.</p>
<p>When you ask a question, the answer does not disappear into chat history. It gets filed back into the wiki as a new page. Your explorations compound the same way your sources do.</p>
<p>His description of the division of labor is worth keeping: &ldquo;The human&rsquo;s job is to curate sources, direct the analysis, ask good questions, and think about what it all means. The LLM&rsquo;s job is everything else.&rdquo;</p>
<p>That is the destination. The starting line is simpler than it looks.</p>
<h2 id="retrieve-vs-compile-how-this-differs-from-other-tools">Retrieve vs. compile: how this differs from other tools</h2>
<p>The distinction matters because a lot of tools sound similar.</p>
<table>
  <thead>
      <tr>
          <th>Tool</th>
          <th>How it works</th>
          <th>What accumulates</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>NotebookLM, ChatGPT uploads</td>
          <td>Retrieves from raw documents at query time</td>
          <td>Nothing &ndash; each session starts fresh</td>
      </tr>
      <tr>
          <td>Standard RAG</td>
          <td>Chunks and embeds docs, retrieves relevant chunks</td>
          <td>Embeddings, not synthesized knowledge</td>
      </tr>
      <tr>
          <td>Karpathy&rsquo;s wiki (Foam or Obsidian + LLM)</td>
          <td>LLM compiles sources into a linked wiki</td>
          <td>Synthesis, cross-references, updated entity pages</td>
      </tr>
  </tbody>
</table>
<p>The compile step is what makes knowledge compound. The other tools are retrieval with extra steps.</p>
<h2 id="where-you-can-start">Where you can start</h2>
<p>You do not start with a system. You start with a habit.</p>
<p>Before an LLM can maintain your wiki, you need two things: a collection of notes worth maintaining, and the practice of adding to it. Neither of those comes from installing a tool. They come from writing things down consistently until it becomes automatic.</p>
<p>The files in Karpathy&rsquo;s system are standard markdown text. The notes you create today are the same files an LLM will maintain later. When you start out writing your first note, you are building the foundation.</p>
<h2 id="start-today">Start today</h2>
<h3 id="step-1">Step 1</h3>
<p>Install <a href="https://foambubble.github.io/foam/">Foam</a> in VS Code. It takes about two minutes. You probably already have VS Code open. You do not have to learn a new application or leave your editor.</p>
<p>That is it. You have a wiki.</p>
<p><em>Note: if you already use Obsidian, it&rsquo;s a perfect alternative.</em></p>
<h3 id="step-2">Step 2</h3>
<p>Make a dedicated folder for your notes. Call it <code>notes/</code> or <code>wiki/</code> or whatever you will actually use. That folder is your wiki.</p>
<h3 id="step-3">Step 3</h3>
<p>Learn the one piece of syntax that makes this work: <code>[[double brackets]]</code>. Write <code>[[merge conflicts]]</code> in any note and Foam treats it as a link to another note. That linked note needs to live as <code>merge conflicts.md</code> in your folder. It does not have to exist yet. Write the link first. Create the file when you get there.</p>
<h2 id="what-a-note-looks-like">What a note looks like</h2>
<!-- test:skip -->
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl"><span class="gh"># git pull runs a fetch and a merge under the hood
</span></span></span><span class="line"><span class="cl"><span class="gh"></span>
</span></span><span class="line"><span class="cl">When you run git pull, it downloads the latest changes (like [[git fetch]])
</span></span><span class="line"><span class="cl">and merges them into your current branch automatically.
</span></span><span class="line"><span class="cl">That is why you can still get [[merge conflicts]] from a simple pull.
</span></span></code></pre></div><p>Four rules, nothing else:</p>
<p><strong>One concept, one note.</strong> Not one topic, not one tutorial. One thing you understood today. If you are writing about two things, you have two notes.</p>
<p><strong>Title as a claim.</strong> &ldquo;git pull runs a fetch and a merge&rdquo; not &ldquo;git pull.&rdquo; The title should be something you could agree or disagree with. A topic is not a claim. A claim is something you learned.</p>
<p><strong>Write it in your own words.</strong> After you understand it, not while you are figuring it out. If you cannot explain it without looking at the source, you do not understand it yet. Come back when you do.</p>
<p><strong>Add a link when two things connect.</strong> <code>[[merge conflicts]]</code> does not have to exist yet. Write it anyway. You will fill it in when you get there. The link is the thing that makes this a wiki and not a folder of text files.</p>
<p>That is the whole practice. One concept per note. Title as claim. Your words. One link when you see one.</p>
<p>Now, go write something.</p>
<h2 id="what-comes-next">What comes next</h2>
<p>Do this for a month. You will have somewhere between thirty and a hundred notes, depending on what you are working on.</p>
<p>At that point, you will hit the first real problem: you cannot find the note you know you wrote. You remember writing something about what happens when a git pull fails mid-merge, but you cannot remember what you called it.</p>
<p>That is the signal that your notes need to be queryable. Tags, dates, status fields, and structured metadata that let you filter and search by something other than the title. That is <a href="/blog/your-notes-need-metadata/">the next post</a>.</p>
<p>After that, the notes you have been building are the raw material Karpathy&rsquo;s system needs. Same files. Same links. The LLM picks up maintenance from where you left off. Your month of notes becomes the foundation of the compounding system you wanted at the start.</p>
<p>I run one of these myself, and I write about what works and what breaks in the <a href="/series/notes-and-knowledge/">Notes and Knowledge</a> series. If you want those posts when they come out, the newsletter is the easiest way.</p>
<div class="newsletter-signup">
  <script async src="https://subscribe-forms.beehiiv.com/embed.js"></script>
  <iframe
    src="https://subscribe-forms.beehiiv.com/67b6b378-798a-479b-b9fa-dfb258feebaa"
    class="beehiiv-embed"
    title="Newsletter signup"
    frameborder="0"
    scrolling="no"
    style="width: 100%; max-width: 560px; height: 315px; margin: 0 auto; display: block; border-radius: 0px; background-color: transparent; box-shadow: none;">
  </iframe>
</div>


<hr>
<p><strong>Go deeper:</strong></p>
<ul>
<li><a href="https://gist.github.com/karpathy/442a6c3be336f01adb80">Karpathy&rsquo;s knowledge system gist</a>: the full idea, worth reading carefully</li>
<li><a href="https://foambubble.github.io/foam/">Foam for VS Code</a>: the starting tool</li>
<li><a href="https://www.markdownguide.org/basic-syntax/">Markdown Syntax</a>: markdown offers more than just wikilinks, it can format your notes too</li>
<li><a href="https://obsidian.md">Obsidian</a>: when you are ready to graduate from VS Code</li>
<li><a href="https://notes.andymatuschak.org">Andy Matuschak&rsquo;s working notes</a>: the philosophy behind note-as-claim, shown in practice</li>
<li><a href="https://academy.dair.ai/blog/llm-knowledge-bases-karpathy">DAIR.AI breakdown of LLM Knowledge Bases</a>: thorough explanation of the architecture and why it works at personal scale</li>
</ul>
]]></content:encoded></item><item><title>Adding Claude to my evolving goal flow</title><link>https://jamalhansen.com/blog/adding-claude-to-my-evolving-goal-flow/</link><pubDate>Sun, 13 Jul 2025 00:00:00 +0000</pubDate><guid>https://jamalhansen.com/blog/adding-claude-to-my-evolving-goal-flow/</guid><description>Five years of yearly goals in markdown, now with Claude in the loop. How I added AI to goal setting and review without losing the habit.</description><content:encoded><![CDATA[<p>Tracking my yearly goals is a habit that has evolved in time. Around ten years ago I began formally writing down my yearly goals. I had recently become a manager at work for the first time and realized that I was unprepared for the task.</p>
<p>I began listening to a podcast called Manager Tools and it really taught me a lot, including <a href="https://www.manager-tools.com/2007/12/how-set-annual-goals-part-1">how to set annual goals</a>. From that point forward, I would think and document my annual goals at the beginning of the year. I would make a bunch of plans and execute a few of them and it was good.</p>
<p>It definitely wasn&rsquo;t living with intention. Once I hit a busy patch or my priorities shifted because life threw a curveball at me I was off the track and reacting to life&rsquo;s chaos rather than moving towards a target.</p>
<p>After a few years of this, I saw the pattern and resolved to do better. I wrote down my goals in markdown at the beginning of the year and would revisit them periodically. When I reviewed then I would note my progress and celebrate completions and it was good.</p>
<p>Still I have struggled to find balance with my goals. I am doing a much better job staying on track, but the check-ins were randomly spaced and it was difficult getting into a cadence of working on my goals yearly, quarterly, monthly, weekly, and daily. I tried and the friction was too much. I wanted to avoid working on my goals, which is the opposite of what I want.</p>
<p>I want a system that is functional but flexible. I want to maximize the benefit without making the chore drudgery that I try to avoid.</p>
<p>Recently, I [wrote a simple MCP tool] that slices of my Obsidian notes that I select to the Claude UI. I like Claude as an AI assistant and I wanted to see what it could do with my goal setting process. I exposed slices of my notes:</p>
<ul>
<li>My yearly goals for the past few years</li>
<li>My values and vision that have my longer term desires</li>
<li>My daily notes for the past 30 days that can contain my thoughts on what I&rsquo;m working on for a given day</li>
</ul>
<p>This project has been very interesting. One of LLM&rsquo;s shortcomings is that it is trained on all sorts of data, but it doesn&rsquo;t have any context of my life.</p>
<p>Integrating my notes has given me the ability to ask questions along the following themes:</p>
<ul>
<li>I have a few hours this weekend, what can I do that will help move me forward on my goals?</li>
<li>How did I do this week on my goals? What can I improve?</li>
<li>I&rsquo;m feeling overwhelmed, what can I remove from my goals and stay on track with my long term planning?</li>
<li>What are good future goals to help me move towards my long term plans?</li>
</ul>
<p>Exposing my goals in a limited way to allow Claude to help me with my goals has been eye opening. It has pointed out areas where I have been too timid and should take the next step. Sometimes it&rsquo;s been too ambitious and I share my concerns and it will adjust. Other times it will find tasks to move forward multiple objectives at once.</p>
<p>In all Claude has been a very useful addition to my yearly goal planning workflow and I look forward to seeing where the journey takes me.</p>
]]></content:encoded></item><item><title>Tracking ideas for writing prompts in Obsidian</title><link>https://jamalhansen.com/blog/track-ideas-for-writing-prompts-in-obsidian/</link><pubDate>Fri, 21 Feb 2025 00:00:00 +0000</pubDate><guid>https://jamalhansen.com/blog/track-ideas-for-writing-prompts-in-obsidian/</guid><description>I&amp;#39;ve set a goal to write a post three times a week and set up a system to capture ideas to write about.</description><content:encoded><![CDATA[<p>I&rsquo;ve committed to writing three blog posts a week and, to support this, I&rsquo;ve been logging my ideas for posts in Obsidian. I&rsquo;ve got the <a href="https://publish.obsidian.md/tasks/Introduction">Tasks plugin</a> installed, so I&rsquo;ve set up a little system that is loosely based on the <a href="https://goinswriter.com/three-buckets/">Jeff Goins three bucket writing system</a>.</p>
<p>To facilitate this, I&rsquo;ve added a section to my daily note under a header called <strong>Writing</strong>. This doesn&rsquo;t mean that I come up with ideas every day, but I want to have a spot where it&rsquo;s easy to record the ideas when I get them and also remind myself to capture ideas when I&rsquo;m in the daily note.</p>
<p>When I have an idea, I go to the daily note and add it as a task with the #writing tag. This looks something like this:</p>
<!-- test:skip -->
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl"><span class="gu">## Writing
</span></span></span><span class="line"><span class="cl"><span class="gu"></span><span class="k">- [ ]</span> [[This is my great idea for a post]] <span class="ni">#writing</span> 
</span></span><span class="line"><span class="cl"><span class="k">- [ ]</span> [[This is an even better idea for a post]] <span class="ni">#writing</span> 
</span></span></code></pre></div><p>Notice that I make the idea a link to a new file. This reduces the friction from idea to actually writing since it only takes a click. It also gives me a great place to leave notes about an idea to kick start the process when it&rsquo;s time to write.</p>
<p>Because these are set up as tasks, I can use the Tasks plugin to query them. I have three queries set up on their own pages:</p>
<ul>
<li>Writing Prompts</li>
<li>Writing Ready to Edit</li>
<li>Writing Ready to Post</li>
</ul>
<p>For each of these I have written a query that will return posts that meet that criteria, so when it&rsquo;s time to do each task, I have a list of posts to work on.</p>
<h2 id="writing-prompts">Writing Prompts</h2>
<p>This is the one that I&rsquo;ve gotten the most mileage out of so far since my goal is to write the initial draft, not to edit or post them.</p>
<p>This is the query I use for the unwritten writing prompts. It looks for posts that have the #writing tag, but do not have the #editing tag. It also sorts them based on the file where they are found. Since they are put into the daily notes, this will roughly put the oldest first.</p>
<p><img alt="Image" loading="lazy" src="/blog/track-ideas-for-writing-prompts-in-obsidian/obsidian-tasks-idea.png"></p>
<h2 id="ready-to-edit">Ready to Edit</h2>
<p>Once the draft is done, I need to edit and clean it up, maybe add some pictures or formatting. The query for this is:</p>
<p><img alt="Image" loading="lazy" src="/blog/track-ideas-for-writing-prompts-in-obsidian/obsidian-tasks-editing.png"></p>
<h2 id="ready-to-post">Ready to Post</h2>
<p>Once I&rsquo;ve gotten the fully edited post it can go on the ready to post list. This will be finished work, ready to be transferred to the blog or posted later.</p>
<p><img alt="Image" loading="lazy" src="/blog/track-ideas-for-writing-prompts-in-obsidian/obsidian-tasks-ready.png"></p>
<p>You will notice that I have some extra logic in these to handle tasks marked completed. They will move to the next phase, but will not fall out of the pipeline. If I see a completed task in the next bucket, I can just uncheck it and add the proper tag.</p>
<h2 id="workflow">Workflow</h2>
<p>With these in place the workflow looks something like this:</p>
<ul>
<li>Idea! - add task to daily note with #writing tag</li>
<li>Draft - write and add #editing when done</li>
<li>Edit - edit then add #ready when done</li>
<li>Ready to post - check when done</li>
</ul>
<p>I hope that you find this helpful and happy writing!</p>
]]></content:encoded></item></channel></rss>