<?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: Alex Bogle</title>
    <description>The latest articles on DEV Community by Alex Bogle (@saintchris_21).</description>
    <link>https://dev.to/saintchris_21</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%2F3972649%2F80b3c688-b326-41b9-9a9b-9d5e74a1c575.jpg</url>
      <title>DEV Community: Alex Bogle</title>
      <link>https://dev.to/saintchris_21</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/saintchris_21"/>
    <language>en</language>
    <item>
      <title>How I Contributed to Awesome Second Brain — And What I Learned From Getting Rejected</title>
      <dc:creator>Alex Bogle</dc:creator>
      <pubDate>Tue, 16 Jun 2026 14:16:32 +0000</pubDate>
      <link>https://dev.to/saintchris_21/how-i-contributed-to-awesome-second-brain-and-what-i-learned-from-getting-rejected-32p4</link>
      <guid>https://dev.to/saintchris_21/how-i-contributed-to-awesome-second-brain-and-what-i-learned-from-getting-rejected-32p4</guid>
      <description>&lt;h1&gt;
  
  
  How I Contributed to Awesome Second Brain — And What I Learned From Getting Rejected
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;A detailed account of contributing an assembled-stack solution to an open-source comparison repo, the mistakes I made, the feedback I got, and the lessons that stuck.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Awesome Second Brain?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/aristoapp/awesome-second-brain" rel="noopener noreferrer"&gt;Awesome Second Brain&lt;/a&gt; is an open-source curated comparison of AI second-brain, memory, and knowledge systems. It is not a product. It is a decision-making resource.&lt;/p&gt;

&lt;p&gt;The repo maps the full second-brain lifecycle — &lt;strong&gt;Collect, Organize, Evolve, Use, Govern&lt;/strong&gt; — and compares tools across those stages. It covers everything from end-to-end apps like Membase and Khoj, to local workspaces like GBrain and Obsidian, to agent memory layers like Honcho and Supermemory.&lt;/p&gt;

&lt;p&gt;The goal: help people answer "what should I use?" and "what tradeoffs am I signing up for?"&lt;/p&gt;

&lt;p&gt;It has 200+ stars, active maintainers, and a strict contribution bar. Claims must be sourced. Metadata must be accurate. Broad claims must be narrowed to evidence.&lt;/p&gt;

&lt;p&gt;I contributed a solution profile, setup guide, example workflow, and comparison page for an assembled stack: &lt;strong&gt;Hermes Agent + Obsidian + Honcho&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is the full story of that contribution — including the parts where I got it wrong.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Contributed
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Solution Profile (&lt;code&gt;solutions/hermes-obsidian-honcho.md&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;A full core profile covering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deployment model&lt;/strong&gt;: Multi-component stack — Obsidian vault (local Markdown), Honcho (self-hosted or managed memory layer), Hermes Agent (local gateway), AgentMail (hosted email API)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lifecycle coverage&lt;/strong&gt;: Collect through Govern — how each component maps to a stage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capabilities matrix&lt;/strong&gt;: 10 evaluation areas with honest assessments&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Strengths, limitations, best-for, not-ideal-for, tradeoffs&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Official links and sources&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Setup Guide (&lt;code&gt;setup-guides/hermes-obsidian-honcho.md&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;A step-by-step guide covering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Architecture overview (local vs hosted components)&lt;/li&gt;
&lt;li&gt;Prerequisites and install commands&lt;/li&gt;
&lt;li&gt;Honcho SDK installation and Hermes integration&lt;/li&gt;
&lt;li&gt;AgentMail SDK configuration&lt;/li&gt;
&lt;li&gt;Full-stack verification steps&lt;/li&gt;
&lt;li&gt;Known failure modes&lt;/li&gt;
&lt;li&gt;Setup time estimate (~60 minutes)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Example Workflow (&lt;code&gt;examples/daily-email-triage.md&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;A practical scenario showing how the stack works together:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agent checks AgentMail inbox via SDK&lt;/li&gt;
&lt;li&gt;Categorizes emails by priority&lt;/li&gt;
&lt;li&gt;Logs to Obsidian daily journal&lt;/li&gt;
&lt;li&gt;Updates Honcho with contact conclusions&lt;/li&gt;
&lt;li&gt;Replies via AgentMail SDK&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Comparison Page (&lt;code&gt;comparisons/assembled-stack-vs-app.md&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;A decision-oriented comparison between assembled stacks and end-to-end apps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;8 evaluation dimensions (setup time, operations, inspectability, portability, cost, etc.)&lt;/li&gt;
&lt;li&gt;"When to choose each" guidance&lt;/li&gt;
&lt;li&gt;Common assembled stack patterns&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The PR Timeline
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;June 10&lt;/td&gt;
&lt;td&gt;Opened PR #19 with initial submission&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;June 10&lt;/td&gt;
&lt;td&gt;Maintainer (@rokpiy) reviewed — &lt;strong&gt;rejected with detailed feedback&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;June 10&lt;/td&gt;
&lt;td&gt;Revised and resubmitted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;June 10&lt;/td&gt;
&lt;td&gt;Second review — &lt;strong&gt;rejected again with new issues&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;June 16&lt;/td&gt;
&lt;td&gt;Final fixes pushed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;June 16&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;PR #19 merged&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two rejections. Three rounds of fixes. One merged PR.&lt;/p&gt;

&lt;p&gt;Here is what went wrong, what I learned, and what I would do differently.&lt;/p&gt;




&lt;h2&gt;
  
  
  Round 1: The First Rejection
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What I Got Wrong
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Unverified implementation details presented as verified&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The setup guide included commands I had not verified against official documentation. The most egregious example: a Python snippet that read &lt;code&gt;~/.hermes/config.yaml&lt;/code&gt; directly and a script called &lt;code&gt;~/.hermes/scripts/agentmail_cli.py&lt;/code&gt; — a file that does not exist anywhere in the Hermes Agent repository or documentation.&lt;/p&gt;

&lt;p&gt;I wrote these from memory and assumption. I assumed the config lived in &lt;code&gt;config.yaml&lt;/code&gt; because many tools use that pattern. I assumed there was a CLI script because I had seen similar patterns in other projects. I was wrong on both counts.&lt;/p&gt;

&lt;p&gt;The maintainer's feedback was direct:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The setup guide still presents unverified implementation details as a verified path. For example, the AgentMail verification snippet opens '~/.hermes/config.yaml' literally inside Python, and the example calls ~/.hermes/scripts/agentmail_cli.py even though that script is not defined or sourced in the guide."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;2. Metadata inaccuracies in the core profile&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The snapshot table had factual errors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I listed &lt;strong&gt;Plastic Labs&lt;/strong&gt; as the maintainer of &lt;strong&gt;Obsidian MD&lt;/strong&gt;. Plastic Labs builds Honcho. Obsidian is made by Obsidian MD. I mixed them up.&lt;/li&gt;
&lt;li&gt;I claimed the stack had &lt;strong&gt;"active public repos"&lt;/strong&gt; across the board. Obsidian is proprietary. AgentMail is a proprietary hosted service. Only Hermes Agent and Honcho have public repos.&lt;/li&gt;
&lt;li&gt;I listed Hermes Agent's license as &lt;strong&gt;Apache 2.0&lt;/strong&gt;. It is &lt;strong&gt;MIT&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The maintainer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The new core profile still has source/maintainer and status inaccuracies: it lists Plastic Labs as Obsidian MD and says the stack has active public repos even though Obsidian and AgentMail are not being evaluated as public repos here."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;3. Overbroad claims without evidence&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The comparison page made sweeping claims:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"High inspectability — all data is local files and queryable databases" — but AgentMail is hosted&lt;/li&gt;
&lt;li&gt;"Free/OSS software for core components" — but AgentMail is proprietary and has pricing&lt;/li&gt;
&lt;li&gt;"You run servers (PostgreSQL, Redis)" — only true for self-hosted Honcho, not the managed service&lt;/li&gt;
&lt;li&gt;"Work offline or air-gapped" — AgentMail requires internet&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The maintainer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Some assembled-stack claims still read broader than the evidence in the PR, especially the setup guide's 'commands verified against official documentation' framing and the comparison page's generalized local-stack cost/portability/inspectability claims."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  What I Fixed
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Removed all unverified scripts and commands&lt;/strong&gt;. Replaced &lt;code&gt;agentmail_cli.py&lt;/code&gt; with official AgentMail SDK calls (&lt;code&gt;client.inboxes.create()&lt;/code&gt;, &lt;code&gt;client.inboxes.messages.send()&lt;/code&gt;, &lt;code&gt;client.inboxes.messages.list()&lt;/code&gt;). Replaced the &lt;code&gt;config.yaml&lt;/code&gt; Python snippet with proper SDK verification. Replaced &lt;code&gt;pip install hermes-agent&lt;/code&gt; with the official &lt;code&gt;curl&lt;/code&gt; installer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Corrected all metadata&lt;/strong&gt;. Fixed maintainer names, repo status, and license. Every claim now matched the official source.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Narrowed all broad claims&lt;/strong&gt;. Every "all local" or "free" claim was qualified with "varies by component" and specific caveats for hosted services.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Round 2: The Second Rejection
&lt;/h2&gt;

&lt;p&gt;Even after the first round of fixes, the maintainer found remaining issues. The same categories — unverified details, metadata, and broad claims — but more subtle this time.&lt;/p&gt;

&lt;p&gt;The key lesson: &lt;strong&gt;fixing the obvious mistakes is not enough. You need to re-verify everything, including the things you think you already fixed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I had corrected the big errors but left smaller ones. A phrase like "commands verified against official documentation" survived the first round because I was focused on the broken scripts. But that phrase was itself an unverified claim — I had not actually verified every command against the official docs at that point.&lt;/p&gt;

&lt;p&gt;The maintainer's second review was shorter but pointed. I had been sloppy in my fixes. I patched the broken parts but did not do a full verification pass.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I Fixed
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Removed the phrase "commands verified against official documentation"&lt;/strong&gt; entirely. If I cannot point to the exact doc page for every command, I cannot say it is verified.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Did a full verification pass&lt;/strong&gt; — read every official doc page, checked every command, confirmed every URL, verified every maintainer name and license.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Narrowed the remaining broad claims&lt;/strong&gt; in the comparison page — inspectability, portability, cost, operations, and offline capability all got component-specific qualifications.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  The Final Fix: What Actually Got Merged
&lt;/h2&gt;

&lt;p&gt;The merged PR (commit &lt;code&gt;b4df09c&lt;/code&gt;) contained these changes across 4 files, 105 insertions, 65 deletions:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;solutions/hermes-obsidian-honcho.md&lt;/code&gt; — 3 line fixes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- Company / maintainer: Nous Research (Hermes Agent), Plastic Labs (Obsidian MD), Obsidian MD (Obsidian)
&lt;/span&gt;&lt;span class="gi"&gt;+ Company / maintainer: Nous Research (Hermes Agent), Plastic Labs (Honcho), Obsidian MD (Obsidian)
&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="gd"&gt;- Status: Active public repos
&lt;/span&gt;&lt;span class="gi"&gt;+ Status: Mixed — Hermes Agent and Honcho have public repos; Obsidian is proprietary
&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="gd"&gt;- Open source: Hermes Agent is open source (Apache 2.0)
&lt;/span&gt;&lt;span class="gi"&gt;+ Open source: Hermes Agent is open source (MIT)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;setup-guides/hermes-obsidian-honcho.md&lt;/code&gt; — major rewrite
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Prerequisites table: removed unverified version numbers, fixed Hermes install from &lt;code&gt;pip&lt;/code&gt; to &lt;code&gt;curl&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Honcho config: removed wrong &lt;code&gt;config.yaml&lt;/code&gt; approach, replaced with &lt;code&gt;hermes memory setup&lt;/code&gt; and &lt;code&gt;~/.hermes/honcho.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;AgentMail verification: removed &lt;code&gt;config.yaml&lt;/code&gt; reading and &lt;code&gt;agentmail_cli.py&lt;/code&gt;, replaced with official SDK calls&lt;/li&gt;
&lt;li&gt;Known failure modes: fixed config path references&lt;/li&gt;
&lt;li&gt;Added 4 new official source links&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;examples/daily-email-triage.md&lt;/code&gt; — SDK replacement
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Replaced &lt;code&gt;python3 ~/.hermes/scripts/agentmail_cli.py triage&lt;/code&gt; with &lt;code&gt;client.inboxes.messages.list()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Replaced &lt;code&gt;python3 ~/.hermes/scripts/agentmail_cli.py reply&lt;/code&gt; with &lt;code&gt;client.inboxes.messages.send()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;comparisons/assembled-stack-vs-app.md&lt;/code&gt; — claim narrowing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;5 broad claims narrowed to component-specific language&lt;/li&gt;
&lt;li&gt;Offline claim qualified with "hosted services like AgentMail still require internet"&lt;/li&gt;
&lt;li&gt;Cost claim qualified with "hosted services have separate pricing"&lt;/li&gt;
&lt;/ul&gt;




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

&lt;h3&gt;
  
  
  1. Verify Before You Write, Not After
&lt;/h3&gt;

&lt;p&gt;The biggest mistake. I wrote the setup guide from memory and assumption. I assumed &lt;code&gt;config.yaml&lt;/code&gt; because many tools use that pattern. I assumed a CLI script existed because I had seen similar patterns. Neither was true.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix&lt;/strong&gt;: Before writing any command or claim, open the official docs. Find the exact page. Copy the exact command. Link to the page. If you cannot find it, mark it as &lt;code&gt;Unknown&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. "Verified" Is a Claim That Itself Needs Verification
&lt;/h3&gt;

&lt;p&gt;I wrote "commands verified against official documentation" in the original setup guide. The maintainer caught it. That phrase is a claim — and it was not true. I had not verified every command.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix&lt;/strong&gt;: Either verify every single command against the official docs and link to each one, or do not use the word "verified." There is no middle ground.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Metadata Accuracy Is Not Optional
&lt;/h3&gt;

&lt;p&gt;Mixing up which company makes which product (Plastic Labs = Obsidian?) is the kind of error that destroys credibility. It takes 30 seconds to check. I skipped it and it cost me a review cycle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix&lt;/strong&gt;: For every component, open the official website or GitHub repo. Confirm the maintainer name, license, and repo status. Write it down. Do not rely on memory.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Scope Your Claims to Your Evidence
&lt;/h3&gt;

&lt;p&gt;The original comparison said "High inspectability — all data is local files." But AgentMail is hosted. The claim was too broad. The fix: "Varies by component — locally-run components are inspectable; hosted-service components depend on that service's audit surfaces."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix&lt;/strong&gt;: When making a claim about a multi-component stack, ask "is this true for every component?" If not, qualify it. "Varies by component" is honest and accurate. "All data is local" is neither.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Read the CONTRIBUTING.md Before You Start
&lt;/h3&gt;

&lt;p&gt;The repo has explicit contribution guidelines. Claims must be sourced. Metadata must be accurate. Broad claims must be narrowed. I read them after the first rejection. I should have read them before the first submission.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix&lt;/strong&gt;: Before contributing to any open-source project, read the contribution guidelines. Twice. They exist for a reason.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Small, Accurate Contributions Beat Large, Sloppy Ones
&lt;/h3&gt;

&lt;p&gt;The first version tried to do too much — setup guide, example, 7 comparison pages, capabilities. More surface area meant more places to be wrong. The final merged version is tighter and more accurate because it was smaller and more focused.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix&lt;/strong&gt;: Start with the smallest contribution that delivers value. Get it right. Then expand.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Maintainer Feedback Is a Gift
&lt;/h3&gt;

&lt;p&gt;Two rejections stung. But the maintainer was specific, fair, and actionable. Every piece of feedback pointed to exactly what was wrong and what needed to change. Without that feedback, the merged PR would have been lower quality.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix&lt;/strong&gt;: When you get critical feedback, do not defend. Read it carefully. Fix what is wrong. Verify the fix. Resubmit.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Stack Itself: What It Does
&lt;/h2&gt;

&lt;p&gt;For readers who want to understand what the contribution is actually about:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hermes Agent&lt;/strong&gt; (MIT, &lt;a href="https://github.com/NousResearch/hermes-agent" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;) is an open-source personal AI agent runtime. It connects to model providers, runs skills, and integrates with memory and knowledge systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Obsidian&lt;/strong&gt; (proprietary, &lt;a href="https://obsidian.md/" rel="noopener noreferrer"&gt;obsidian.md&lt;/a&gt;) is a local-first knowledge vault. Notes are Markdown files on your filesystem. No lock-in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Honcho&lt;/strong&gt; (AGPL-3.0, &lt;a href="https://github.com/plastic-labs/honcho" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;) is an agent memory layer. It maintains peer cards, conclusions, and session context. It can be self-hosted (FastAPI + PostgreSQL + Redis) or used as a managed service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AgentMail&lt;/strong&gt; (proprietary, &lt;a href="https://agentmail.to/" rel="noopener noreferrer"&gt;agentmail.to&lt;/a&gt;) is a hosted email API. It gives agents an inbox for receiving and sending email.&lt;/p&gt;

&lt;p&gt;Together, they form a local-first second brain: Obsidian owns the knowledge, Honcho owns the memory, Hermes connects everything, and AgentMail brings email into the loop.&lt;/p&gt;

&lt;p&gt;The stack is not for everyone. It requires assembling and maintaining multiple components. But for technical users who want local ownership and inspectability, it is a strong option.&lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PR #19&lt;/strong&gt;: &lt;a href="https://github.com/aristoapp/awesome-second-brain/pull/19" rel="noopener noreferrer"&gt;https://github.com/aristoapp/awesome-second-brain/pull/19&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repo&lt;/strong&gt;: &lt;a href="https://github.com/aristoapp/awesome-second-brain" rel="noopener noreferrer"&gt;https://github.com/aristoapp/awesome-second-brain&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;My fork&lt;/strong&gt;: &lt;a href="https://github.com/SaintChris/awesome-second-brain" rel="noopener noreferrer"&gt;https://github.com/SaintChris/awesome-second-brain&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hermes Agent&lt;/strong&gt;: &lt;a href="https://hermes-agent.nousresearch.com/" rel="noopener noreferrer"&gt;https://hermes-agent.nousresearch.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Honcho&lt;/strong&gt;: &lt;a href="https://honcho.dev/" rel="noopener noreferrer"&gt;https://honcho.dev/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Obsidian&lt;/strong&gt;: &lt;a href="https://obsidian.md/" rel="noopener noreferrer"&gt;https://obsidian.md/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AgentMail&lt;/strong&gt;: &lt;a href="https://agentmail.to/" rel="noopener noreferrer"&gt;https://agentmail.to/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Written by Alex (SaintChris). Open-source contributor, AI second-brain explorer, and someone who learned more from getting rejected twice than from getting accepted on the first try.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>secondbrain</category>
      <category>hermes</category>
    </item>
    <item>
      <title>I Processed 2.4 Billion Tokens Across 52 AI Models for $0.52. Here's the Full Breakdown.</title>
      <dc:creator>Alex Bogle</dc:creator>
      <pubDate>Thu, 11 Jun 2026 03:22:10 +0000</pubDate>
      <link>https://dev.to/saintchris_21/i-processed-24-billion-tokens-across-52-ai-models-for-052-heres-the-full-breakdown-io7</link>
      <guid>https://dev.to/saintchris_21/i-processed-24-billion-tokens-across-52-ai-models-for-052-heres-the-full-breakdown-io7</guid>
      <description>&lt;p&gt;I run a production multi-agent AI system on a single M1 Mac in Jamaica. 6 autonomous agents. 26 cron workflows. 5-layer persistent memory. All containerized, all running 24/7.&lt;/p&gt;

&lt;p&gt;I checked my OpenRouter dashboard last week and realized something: I'd processed &lt;strong&gt;2.4 billion tokens across 52 different AI models&lt;/strong&gt; and spent a total of &lt;strong&gt;$0.52&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That's not a typo. Here's exactly where that money went and what it means.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Numbers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Total Requests&lt;/td&gt;
&lt;td&gt;26,600+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tokens Processed&lt;/td&gt;
&lt;td&gt;2.4 Billion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Models Used&lt;/td&gt;
&lt;td&gt;52&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total Cost&lt;/td&gt;
&lt;td&gt;$0.52&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost per Token&lt;/td&gt;
&lt;td&gt;$0.00000021&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tokens per Dollar&lt;/td&gt;
&lt;td&gt;4.6 Million&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For context: GPT-4 Turbo costs about $0.00001 per token at scale. I'm running at roughly &lt;strong&gt;50x below&lt;/strong&gt; that rate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the $0.52 Actually Went
&lt;/h2&gt;

&lt;p&gt;Here's the breakdown by model:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Requests&lt;/th&gt;
&lt;th&gt;Tokens&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;openrouter/owl-alpha&lt;/td&gt;
&lt;td&gt;1,334&lt;/td&gt;
&lt;td&gt;251.2M&lt;/td&gt;
&lt;td&gt;$0.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;nvidia/nemotron-3-super-120b&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;1.8M&lt;/td&gt;
&lt;td&gt;$0.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;google/gemma-4-31b-it&lt;/td&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;td&gt;1.8M&lt;/td&gt;
&lt;td&gt;$0.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;openai/gpt-5&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2.8K&lt;/td&gt;
&lt;td&gt;$0.03&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;google/gemini-3.1-pro-preview&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;3.2K&lt;/td&gt;
&lt;td&gt;$0.04&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;anthropic/claude-opus-4&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2.0K&lt;/td&gt;
&lt;td&gt;$0.13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen/qwen3.5-plus&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;6.3K&lt;/td&gt;
&lt;td&gt;$0.01&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;z-ai/glm-5-turbo&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;3.0K&lt;/td&gt;
&lt;td&gt;$0.01&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;moonshotai/kimi-k2.5&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;4.1K&lt;/td&gt;
&lt;td&gt;$0.01&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;google/gemini-2.5-flash&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;5.5K&lt;/td&gt;
&lt;td&gt;$0.01&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;+42 other models&lt;/td&gt;
&lt;td&gt;~125&lt;/td&gt;
&lt;td&gt;~8.5M&lt;/td&gt;
&lt;td&gt;~$0.28&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;99.6% of my requests cost exactly $0.00.&lt;/strong&gt; They ran on free-tier models or local inference. The $0.52 comes from a handful of premium model calls: Claude Opus, GPT-5, Gemini Pro. These are reserved for specific high-quality tasks — not everyday inference.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Would Cost on Cloud
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Hardware&lt;/th&gt;
&lt;th&gt;Monthly Cost&lt;/th&gt;
&lt;th&gt;Annual Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;My setup (M1 Mac)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;M1 Mac 16GB, local + free tier&lt;/td&gt;
&lt;td&gt;~$0.09&lt;/td&gt;
&lt;td&gt;~$1.04&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenRouter Paid Tier&lt;/td&gt;
&lt;td&gt;API-only, no local&lt;/td&gt;
&lt;td&gt;$15-30&lt;/td&gt;
&lt;td&gt;$180-360&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS (g4dn.xlarge + API)&lt;/td&gt;
&lt;td&gt;1x T4 GPU, on-demand&lt;/td&gt;
&lt;td&gt;$350-500&lt;/td&gt;
&lt;td&gt;$4,200-6,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS (g5.xlarge + API)&lt;/td&gt;
&lt;td&gt;1x A10G GPU, on-demand&lt;/td&gt;
&lt;td&gt;$700-1,000&lt;/td&gt;
&lt;td&gt;$8,400-12,000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A $1,200 laptop replaces $500-1,000/month in cloud bills. The break-even point is about 2 weeks.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the Architecture Works
&lt;/h2&gt;

&lt;p&gt;The key insight: &lt;strong&gt;not every task needs a $20/month model&lt;/strong&gt;. My system routes tasks intelligently:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Local inference (free):&lt;/strong&gt; Ollama running qwen3:4b handles the bulk of daily tasks — file operations, code generation, data parsing, routine research. Zero API cost.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Free-tier cloud models:&lt;/strong&gt; OpenRouter's free tier covers models like Gemma, Nemotron, and Scout. These handle overflow when local models are busy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Premium models (paid):&lt;/strong&gt; Claude Opus, GPT-5, Gemini Pro — reserved for specific high-stakes tasks: complex reasoning, code review, architecture decisions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Smart routing:&lt;/strong&gt; The system picks the cheapest model that can handle the task. If a free model works, it never touches a paid one.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What $0.52 Actually Means
&lt;/h2&gt;

&lt;p&gt;People hear "$0.52" and think it's a toy. It's not. This is a production system that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Runs 6 autonomous AI agents 24/7&lt;/li&gt;
&lt;li&gt;Processes financial data, content pipelines, system monitoring&lt;/li&gt;
&lt;li&gt;Handles email triage, job tracking, research&lt;/li&gt;
&lt;li&gt;Manages 26 automated cron workflows&lt;/li&gt;
&lt;li&gt;Maintains 5-layer persistent memory across sessions&lt;/li&gt;
&lt;li&gt;Has processed 26,600+ requests across 52 different models&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The $0.52 isn't the cost of a demo. It's the cost of &lt;strong&gt;weeks of production work&lt;/strong&gt; across a full agentic infrastructure. The kind of system that would cost $500-1,000/month on cloud infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Local-first is viable.&lt;/strong&gt; A $1,200 M1 Mac can replace hundreds in cloud bills. Most AI tasks don't need a data center.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Route intelligently.&lt;/strong&gt; Use free models for routine work. Reserve premium models for tasks that actually need them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Measure everything.&lt;/strong&gt; You can't optimize what you don't track. I built a live dashboard that shows exactly where every cent goes — updated every hour from the OpenRouter API.&lt;/p&gt;

&lt;h2&gt;
  
  
  See It Live
&lt;/h2&gt;

&lt;p&gt;The dashboard is public. It shows real-time data: requests per day, token breakdown by type, cost per model, and a searchable list of all 52 models. You can filter, sort, and explore the full dataset.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Live Dashboard:&lt;/strong&gt; &lt;a href="https://saintlex.sbs/#openrouter-stats" rel="noopener noreferrer"&gt;saintlex.sbs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The future of AI isn't bigger cloud bills. It's smarter local architecture.&lt;/p&gt;

</description>
      <category>agenticai</category>
      <category>openrouter</category>
      <category>mlops</category>
      <category>costoptimization</category>
    </item>
    <item>
      <title>How to Get Hermes Agent to Use AgentMail (And Why It's Harder Than It Should Be)</title>
      <dc:creator>Alex Bogle</dc:creator>
      <pubDate>Wed, 10 Jun 2026 23:19:25 +0000</pubDate>
      <link>https://dev.to/saintchris_21/how-to-get-hermes-agent-to-use-agentmail-and-why-its-harder-than-it-should-be-1f4n</link>
      <guid>https://dev.to/saintchris_21/how-to-get-hermes-agent-to-use-agentmail-and-why-its-harder-than-it-should-be-1f4n</guid>
      <description>&lt;h1&gt;
  
  
  How to Get Hermes Agent to Use AgentMail (And Why It's Harder Than It Should Be)
&lt;/h1&gt;

&lt;p&gt;Someone on Reddit asked me this today, and honestly, we went through the exact same struggle. So here's the full breakdown of what's going wrong and how to fix it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;You've set up AgentMail. You've got your API key. You've added it to &lt;code&gt;~/.hermes/config.yaml&lt;/code&gt;. Hermes says it can see the MCP AgentMail service running. But when you ask it to check your inbox... nothing. Or worse, it gives you a 403.&lt;/p&gt;

&lt;p&gt;This is one of the most frustrating setup experiences with Hermes Agent. Here's why it happens and how to actually fix it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Exact Issue from Today
&lt;/h2&gt;

&lt;p&gt;The person on Reddit described it perfectly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"How do you get Hermes to use AgentMail? I have set it up as per the instructions but for the love of God I can't get Hermes (local LLM) to use it, even when I give it the commands and it tells me it can see the MCP Agent mail service running. I have never struggled with any AI things this hard!!"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We hit the same wall today. Here's what we found.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why It Doesn't Work: 3 Common Failure Modes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. The API Key Has No Permissions
&lt;/h3&gt;

&lt;p&gt;When you generate an API key from the AgentMail Console, it might not have the right permissions. A 403 (not 401) means your key is valid but has no permissions. The key needs at minimum:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;inbox_read&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;message_read&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;message_send&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Go to console.agentmail.to → API Keys → verify permissions are granted.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The Account Email Isn't Verified
&lt;/h3&gt;

&lt;p&gt;Even with a valid API key, AgentMail requires the account email to be verified. Check that inbox for a verification email from AgentMail and click the link.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Hermes Isn't Reading From Config
&lt;/h3&gt;

&lt;p&gt;The API key must be in &lt;code&gt;~/.hermes/config.yaml&lt;/code&gt; under the &lt;code&gt;agentmail:&lt;/code&gt; section:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;agentmail&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;api_key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;am_us_..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not in environment variables. Not in a separate file. And the key name is &lt;code&gt;api_key&lt;/code&gt;, not &lt;code&gt;am_key&lt;/code&gt; or &lt;code&gt;token&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Fix (Step by Step)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Sign Up at AgentMail
&lt;/h3&gt;

&lt;p&gt;Go to &lt;a href="https://agentmail.to" rel="noopener noreferrer"&gt;https://agentmail.to&lt;/a&gt; and sign up. You can use any email provider — Gmail, Outlook, Hotmail, whatever. AgentMail will send a verification email to whatever address you use.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Create an Inbox and API Key
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;From the AgentMail Console, create an inbox (e.g. &lt;code&gt;yourname@agentmail.to&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Generate an API key&lt;/li&gt;
&lt;li&gt;Make sure the key has &lt;code&gt;inbox_read&lt;/code&gt;, &lt;code&gt;message_read&lt;/code&gt;, and &lt;code&gt;message_send&lt;/code&gt; permissions&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 3: Store the Key in Config
&lt;/h3&gt;

&lt;p&gt;Edit &lt;code&gt;~/.hermes/config.yaml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;agentmail&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;api_key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;am_us_...here"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Test It
&lt;/h3&gt;

&lt;p&gt;Ask Hermes: "Check my agent inbox for new emails."&lt;/p&gt;

&lt;p&gt;If it works, you'll see your inbox listed with any unread messages. If you get a 403, go back to Step 2 — it's a permissions issue.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Create a CLI Helper (Optional but Recommended)
&lt;/h3&gt;

&lt;p&gt;The raw SDK works, but a CLI helper makes life easier:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 ~/.hermes/scripts/agentmail_cli.py triage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This lists all inboxes with unread message counts and previews. Much easier than asking Hermes to debug the SDK every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alternative: Himalaya (Works With Most Email Providers)
&lt;/h2&gt;

&lt;p&gt;If you want a CLI email solution that works with Hermes and your existing email, &lt;a href="https://github.com/pimalaya/himalaya" rel="noopener noreferrer"&gt;Himalaya&lt;/a&gt; is a solid alternative. It uses IMAP/SMTP directly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Works with:&lt;/strong&gt; Gmail, Yahoo, Fastmail, ProtonMail, and most IMAP providers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does NOT work well with:&lt;/strong&gt; Outlook/Hotmail. Microsoft no longer allows app-specific passwords for IMAP access, and the OAuth2 route requires Azure AD app registration which is tedious and time-consuming.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;himalaya

&lt;span class="c"&gt;# Configure&lt;/span&gt;
himalaya account configure

&lt;span class="c"&gt;# Use from Hermes&lt;/span&gt;
himalaya envelope list
himalaya message &lt;span class="nb"&gt;read &lt;/span&gt;42
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;AgentMail signup works with any email&lt;/strong&gt; (Gmail, Outlook, Hotmail, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;403 error&lt;/strong&gt; = API key lacks permissions. Check console.agentmail.to&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Account not verified&lt;/strong&gt; = Check your email for AgentMail verification&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Key not recognized&lt;/strong&gt; = Must be in &lt;code&gt;~/.hermes/config.yaml&lt;/code&gt; as &lt;code&gt;agentmail.api_key&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alternative&lt;/strong&gt; = Himalaya works with most providers except Outlook/Hotmail&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Outlook/Hotmail users&lt;/strong&gt; = Use AgentMail (works with any signup email) or create a Gmail for your agent&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The whole process should be easier. Hopefully this saves someone the headache we went through today.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>hermes</category>
      <category>agentmail</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>I Built a Multi-Platform Publishing CLI for AI Agents (And Merged It Into One Skill)</title>
      <dc:creator>Alex Bogle</dc:creator>
      <pubDate>Wed, 10 Jun 2026 21:53:40 +0000</pubDate>
      <link>https://dev.to/saintchris_21/i-built-a-multi-platform-publishing-cli-for-ai-agents-2cji</link>
      <guid>https://dev.to/saintchris_21/i-built-a-multi-platform-publishing-cli-for-ai-agents-2cji</guid>
      <description>&lt;h1&gt;
  
  
  I Built a Multi-Platform Publishing CLI for AI Agents (And Merged It Into One Skill)
&lt;/h1&gt;

&lt;p&gt;I contribute to open-source repos regularly. Every time, I'd manually copy-paste the same article to Dev.to, GitHub, LinkedIn — each with different formatting, different APIs, different auth flows. So I built a CLI that does it all from one command.&lt;/p&gt;

&lt;p&gt;Then I realized the CLI shouldn't be a separate skill. It should be the final step of the contribution workflow. Here's how it evolved.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;When you contribute to an open-source project, you often want to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Write a blog post about it&lt;/li&gt;
&lt;li&gt;Push the code to GitHub&lt;/li&gt;
&lt;li&gt;Share on Dev.to for visibility&lt;/li&gt;
&lt;li&gt;Cross-post to social media&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each platform has its own API, auth method, and markdown handling. Doing this manually is tedious and error-prone.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution: One Skill, Five Phases
&lt;/h2&gt;

&lt;p&gt;I started with 2 separate skills — one for contributing, one for publishing. After testing, I merged them into one workflow:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 1: Discovery&lt;/strong&gt; — Find the gap, check repo activity, read CONTRIBUTING.md&lt;br&gt;
&lt;strong&gt;Phase 2: Scope&lt;/strong&gt; — Pick contribution type, confirm it's distinct&lt;br&gt;
&lt;strong&gt;Phase 3: Write&lt;/strong&gt; — Use their template, verify commands, document pitfalls&lt;br&gt;
&lt;strong&gt;Phase 4: Submit&lt;/strong&gt; — Branch, commit, open PR with evidence&lt;br&gt;
&lt;strong&gt;Phase 5: Publish&lt;/strong&gt; — Cross-post to Dev.to, GitHub, Mastodon, Bluesky from one command&lt;/p&gt;

&lt;p&gt;The platform picker is Phase 5 — the last step after your PR merges.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Platform Picker CLI
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# One-time setup per platform (CLI prompts if key not provided)&lt;/span&gt;
python3 platform_picker.py setup devto
python3 platform_picker.py setup github
python3 platform_picker.py setup mastodon
python3 platform_picker.py setup bluesky

&lt;span class="c"&gt;# Publish everywhere&lt;/span&gt;
python3 platform_picker.py publish &lt;span class="nt"&gt;--file&lt;/span&gt; article.md &lt;span class="nt"&gt;--platform&lt;/span&gt; devto &lt;span class="nt"&gt;--platform&lt;/span&gt; github

&lt;span class="c"&gt;# Check what's configured&lt;/span&gt;
python3 platform_picker.py status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Credentials are stored in &lt;code&gt;~/.hermes/config.yaml&lt;/code&gt; — never hardcoded in scripts. The CLI reads from config automatically. If a key is missing, it tells you to run setup.&lt;/p&gt;
&lt;h2&gt;
  
  
  Verified Platforms
&lt;/h2&gt;

&lt;p&gt;These platforms have been researched and confirmed to work with programmatic posting:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Auth&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;th&gt;Limits&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Dev.to&lt;/td&gt;
&lt;td&gt;API key&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;4 tags/article&lt;/td&gt;
&lt;td&gt;✅ Tested&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub&lt;/td&gt;
&lt;td&gt;PAT&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Standard rate limits&lt;/td&gt;
&lt;td&gt;✅ Tested&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mastodon&lt;/td&gt;
&lt;td&gt;App password&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;500 chars, open API&lt;/td&gt;
&lt;td&gt;✅ Researched&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bluesky&lt;/td&gt;
&lt;td&gt;App password&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;3000 chars, open API&lt;/td&gt;
&lt;td&gt;✅ Researched&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HermesHub&lt;/td&gt;
&lt;td&gt;GitHub OAuth&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Web-only&lt;/td&gt;
&lt;td&gt;✅ Tested&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  Why These Platforms?
&lt;/h2&gt;

&lt;p&gt;I researched what actually works for programmatic posting in 2025/2026:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LinkedIn:&lt;/strong&gt; Removed. Requires Marketing Developer Program approval. OAuth 2.0 is restrictive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Twitter/X:&lt;/strong&gt; Removed. Free tier killed. $100-$5000/month now.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reddit:&lt;/strong&gt; Removed. Self-service API access closed in 2025.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mastodon:&lt;/strong&gt; Added. Free, open API, no restrictions. App passwords work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bluesky:&lt;/strong&gt; Added. Free, open API, no restrictions. App passwords work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The rule: if it requires paid API access or special approval, it doesn't belong in a free tool.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Merge Into One Skill?
&lt;/h2&gt;

&lt;p&gt;From the agent's perspective, contributing and sharing is one workflow: "contribute and share."&lt;/p&gt;

&lt;p&gt;Having 2 skills meant:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The agent had to know to load both&lt;/li&gt;
&lt;li&gt;The user had to think of them as separate things&lt;/li&gt;
&lt;li&gt;Publishing felt disconnected from the contribution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One skill means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One trigger: "I want to contribute to a repo and share it"&lt;/li&gt;
&lt;li&gt;Publishing is just the final phase&lt;/li&gt;
&lt;li&gt;Platform picker details loaded on demand via reference files&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  HermesHub Security Requirements
&lt;/h2&gt;

&lt;p&gt;Publishing to &lt;a href="https://hermeshub.xyz" rel="noopener noreferrer"&gt;HermesHub&lt;/a&gt; (the official skills marketplace for Hermes Agent) requires passing automated security review. Here are the key rules:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Automatic rejection triggers:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Curl/wget to external URLs with system data (exfiltration)&lt;/li&gt;
&lt;li&gt;Base64-encoded or obfuscated shell commands&lt;/li&gt;
&lt;li&gt;Instructions to bypass security prompts&lt;/li&gt;
&lt;li&gt;Downloading and executing binaries from external URLs&lt;/li&gt;
&lt;li&gt;Hidden instructions in referenced files&lt;/li&gt;
&lt;li&gt;Prompt injection or jailbreak attempts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Required for approval:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All environment variables documented with setup instructions&lt;/li&gt;
&lt;li&gt;No hardcoded credentials, tokens, or API keys&lt;/li&gt;
&lt;li&gt;Destructive operations require explicit user confirmation&lt;/li&gt;
&lt;li&gt;Network access patterns documented and justified&lt;/li&gt;
&lt;li&gt;File system access scoped to relevant directories&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;allowed-tools&lt;/code&gt; field declared in frontmatter&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Real-World Test
&lt;/h2&gt;

&lt;p&gt;I tested the full workflow end-to-end:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Publish to Dev.to&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;python3 platform_picker.py publish &lt;span class="nt"&gt;--file&lt;/span&gt; article.md &lt;span class="nt"&gt;--platform&lt;/span&gt; devto
&lt;span class="nt"&gt;---&lt;/span&gt; Publishing to devto &lt;span class="nt"&gt;---&lt;/span&gt;
  Published! ID: 3868744
  URL: https://dev.to/saintchris_21/i-built-a-multi-platform-publishing-cli-for-ai-agents-2cji

&lt;span class="c"&gt;# 2. Error handling (missing config)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;python3 platform_picker.py publish &lt;span class="nt"&gt;--file&lt;/span&gt; article.md &lt;span class="nt"&gt;--platform&lt;/span&gt; github
Platform not configured: github. Run &lt;span class="s1"&gt;'setup github'&lt;/span&gt; first.

&lt;span class="c"&gt;# 3. Error handling (missing file)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;python3 platform_picker.py publish &lt;span class="nt"&gt;--file&lt;/span&gt; missing.md &lt;span class="nt"&gt;--platform&lt;/span&gt; devto
File not found: missing.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The article went live with correct title, body, and tags — all from one command.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's In The Skill
&lt;/h2&gt;

&lt;p&gt;The merged &lt;code&gt;open-source-contribution&lt;/code&gt; v3.0 skill includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;5 phases:&lt;/strong&gt; Discovery → Scope → Write → Submit → Publish&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Platform picker CLI:&lt;/strong&gt; Dev.to, GitHub, Mastodon, Bluesky support&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quality test:&lt;/strong&gt; "Did I actually improve or just document?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repo-specific notes:&lt;/strong&gt; awesome-second-brain, HermesHub, chroma&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pitfalls:&lt;/strong&gt; 8 learned mistakes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reference files:&lt;/strong&gt; Platform picker docs, HermesHub submission guide&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;HermesHub compliance:&lt;/strong&gt; 17/17 checks passed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Skill repo:&lt;/strong&gt; &lt;a href="https://github.com/SaintChris/hermes-skills" rel="noopener noreferrer"&gt;github.com/SaintChris/hermes-skills&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HermesHub PR:&lt;/strong&gt; &lt;a href="https://github.com/amanning3390/hermeshub/pull/119" rel="noopener noreferrer"&gt;PR #119&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;awesome-second-brain PRs:&lt;/strong&gt; &lt;a href="https://github.com/aristoapp/awesome-second-brain/pull/18" rel="noopener noreferrer"&gt;#18&lt;/a&gt;, &lt;a href="https://github.com/aristoapp/awesome-second-brain/pull/19" rel="noopener noreferrer"&gt;#19&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HermesHub:&lt;/strong&gt; &lt;a href="https://hermeshub.xyz" rel="noopener noreferrer"&gt;hermeshub.xyz&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;If you're building AI agent workflows, I'd love to hear what platforms you'd add.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>devto</category>
      <category>github</category>
    </item>
    <item>
      <title>I Contributed to the Awesome AI Second Brain Repo</title>
      <dc:creator>Alex Bogle</dc:creator>
      <pubDate>Wed, 10 Jun 2026 20:35:08 +0000</pubDate>
      <link>https://dev.to/saintchris_21/i-contributed-to-the-awesome-ai-second-brain-repo-289h</link>
      <guid>https://dev.to/saintchris_21/i-contributed-to-the-awesome-ai-second-brain-repo-289h</guid>
      <description>&lt;h1&gt;
  
  
  I Contributed to the Awesome AI Second Brain Repo
&lt;/h1&gt;

&lt;p&gt;The &lt;a href="https://github.com/aristoapp/awesome-second-brain" rel="noopener noreferrer"&gt;awesome-second-brain&lt;/a&gt; repo is a curated comparison of AI second brain, memory, and knowledge systems. It maps ~20 tools across a 5-stage lifecycle: Collect, Organize, Evolve, Use, and Govern.&lt;/p&gt;

&lt;p&gt;It's the kind of resource I wish existed when I was building my own stack. So when I found it, I didn't just read it — I contributed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Added
&lt;/h2&gt;

&lt;p&gt;Two PRs, 15+ files:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Solution profile&lt;/strong&gt; — Hermes Agent + Obsidian + Honcho as a fully local second brain stack&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Setup guide&lt;/strong&gt; — verified step-by-step instructions (~60 min), tested against my live deployment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example workflow&lt;/strong&gt; — daily email triage → Obsidian log → Honcho peer update&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comparison page&lt;/strong&gt; — assembled local stack vs end-to-end app, compared across 9 dimensions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Updated existing pages&lt;/strong&gt; — Hermes+LLM Wiki and Honcho profiles with current evidence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-references&lt;/strong&gt; — 6 comparison/index pages updated&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why This Stack
&lt;/h2&gt;

&lt;p&gt;My setup is deliberately multi-layered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Obsidian&lt;/strong&gt; — human-owned knowledge vault, all local Markdown&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Honcho&lt;/strong&gt; — agent memory layer with peer cards, conclusions, semantic search&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hermes Agent&lt;/strong&gt; — the runtime that connects everything&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AgentMail&lt;/strong&gt; — email as a first-class context source&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It covers all 5 lifecycle stages. The tradeoff: higher setup burden (~60 min) and operational responsibility. The payoff: full local ownership, inspectable files, zero cloud dependency.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Stack in Practice
&lt;/h2&gt;

&lt;p&gt;Every morning, my agent:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Checks the agent inbox (AgentMail) for new emails&lt;/li&gt;
&lt;li&gt;Categorizes them by priority&lt;/li&gt;
&lt;li&gt;Logs important items to the Obsidian daily journal&lt;/li&gt;
&lt;li&gt;Updates Honcho with any new facts about contacts or projects&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The result: email that would otherwise live outside the second brain is captured, categorized, logged, and remembered — automatically.&lt;/p&gt;

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

&lt;p&gt;What I learned contributing to someone else's repo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Read CONTRIBUTING.md first&lt;/strong&gt; — every repo has one. Follow it exactly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Study existing pages&lt;/strong&gt; — match the writing style, tone, and format&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use their templates&lt;/strong&gt; — don't invent your own structure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify everything&lt;/strong&gt; — test all commands against a live deployment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No sensitive data&lt;/strong&gt; — never include API keys or credentials in public PRs&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  PRs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/aristoapp/awesome-second-brain/pull/18" rel="noopener noreferrer"&gt;PR #18&lt;/a&gt; — Solution profile&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/aristoapp/awesome-second-brain/pull/19" rel="noopener noreferrer"&gt;PR #19&lt;/a&gt; — Setup guide + examples + comparison&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The PRs are open. If they merge, the repo will have the first fully documented local-first second brain stack with a verified setup guide.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Building AI infrastructure on a $0 cloud budget from Jamaica. If you're working on AI memory or second brain systems, I'd love to connect.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I Contributed to Chroma's Open-Source Docs — Here's What I Changed and What I Learned</title>
      <dc:creator>Alex Bogle</dc:creator>
      <pubDate>Wed, 10 Jun 2026 17:50:31 +0000</pubDate>
      <link>https://dev.to/saintchris_21/i-contributed-to-chromas-open-source-docs-heres-what-i-changed-and-what-i-learned-i70</link>
      <guid>https://dev.to/saintchris_21/i-contributed-to-chromas-open-source-docs-heres-what-i-changed-and-what-i-learned-i70</guid>
      <description>&lt;p&gt;Chroma is one of the most widely used open-source vector databases in the AI ecosystem. It's the backbone of countless RAG pipelines, semantic search systems, and AI agent memory layers — including projects I've built myself. So when I found &lt;a href="https://github.com/chroma-core/chroma/issues/3111" rel="noopener noreferrer"&gt;issue #3111&lt;/a&gt; on their GitHub — a request to update their Haystack integration documentation — I decided to take it on.&lt;/p&gt;

&lt;p&gt;The issue was straightforward: the existing docs were outdated, lacked clear installation steps, and had almost no practical examples for &lt;code&gt;ChromaDocumentStore&lt;/code&gt;. But when I looked closer, I found two already-open PRs. That's where it got interesting.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Existing PRs
&lt;/h2&gt;

&lt;p&gt;Before writing anything, I checked what others had already done. There were two open PRs for this exact issue:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PR #3112&lt;/strong&gt;: Deleted the entire documentation file. The contributor decided the best way to "update" the docs was to remove them entirely. This doesn't help users — it just creates a dead link.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PR #7229 (manikanta7cheruku)&lt;/strong&gt;: Fixed a Path bug in the code example and swapped the LLM from HuggingFace (Mixtral) to OpenAI (GPT-3.5-turbo). The Path fix was good. The LLM swap was questionable — it replaced a free, self-hosted model with one that requires a paid API key, which is a worse default for open-source documentation.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Neither PR actually addressed the core request: comprehensive, clear examples for &lt;code&gt;ChromaDocumentStore&lt;/code&gt;. So I wrote my own.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Changed
&lt;/h2&gt;

&lt;p&gt;I rewrote &lt;code&gt;docs/mintlify/integrations/frameworks/haystack.mdx&lt;/code&gt; from 80 lines to 187 lines. Here's what was added:&lt;/p&gt;

&lt;h3&gt;
  
  
  Clearer Installation
&lt;/h3&gt;

&lt;p&gt;The original docs only had &lt;code&gt;pip install chroma-haystack&lt;/code&gt;. I added &lt;code&gt;haystack-ai&lt;/code&gt; as an explicit dependency since the integration package doesn't always pull it in correctly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quick Start Example
&lt;/h3&gt;

&lt;p&gt;A minimal 10-line example showing Document creation, writing, and counting — the fastest way to verify your setup works:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;haystack&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Document&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;haystack_integrations.document_stores.chroma&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ChromaDocumentStore&lt;/span&gt;

&lt;span class="n"&gt;document_store&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ChromaDocumentStore&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;docs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nc"&gt;Document&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Chroma stores documents as vectors.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nc"&gt;Document&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Haystack provides the orchestration layer.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;document_store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write_documents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;document_store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;count_documents&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;  &lt;span class="c1"&gt;# Output: 2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  All Three Deployment Modes
&lt;/h3&gt;

&lt;p&gt;The original docs only showed in-memory mode. I documented all three: in-memory (development), persistent storage (disk-backed), and remote client-server (production with Docker or &lt;code&gt;chroma run&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  Fixed the Path Bug
&lt;/h3&gt;

&lt;p&gt;The original code had &lt;code&gt;"data" / Path(name)&lt;/code&gt; — a string divided by a Path object, which throws a TypeError. Fixed to &lt;code&gt;Path("data") / name&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Retrieval Examples
&lt;/h3&gt;

&lt;p&gt;Added three retrieval patterns: text query (auto-embedded by Chroma), embedding query (pre-computed vectors), and metadata filtering using Haystack's filter syntax.&lt;/p&gt;

&lt;h3&gt;
  
  
  Full RAG Pipeline
&lt;/h3&gt;

&lt;p&gt;A complete end-to-end RAG example connecting ChromaDocumentStore → ChromaQueryRetriever → PromptBuilder → HuggingFaceTGIGenerator. I kept HuggingFace (free, self-hosted) instead of swapping to OpenAI.&lt;/p&gt;

&lt;h3&gt;
  
  
  Troubleshooting Section
&lt;/h3&gt;

&lt;p&gt;Common issues: import errors, empty results, remote connection refused, HuggingFace token errors. Each with a one-line fix.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  1. Check Existing PRs First
&lt;/h3&gt;

&lt;p&gt;Two people had already worked on this issue before me. One deleted the file. One did minimal fixes. If I hadn't checked, I might have duplicated effort or missed context. Always review what's already in flight.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Import Paths Change
&lt;/h3&gt;

&lt;p&gt;The old docs used &lt;code&gt;from chroma_haystack import ChromaDocumentStore&lt;/code&gt; — that's the archived package. The current one is &lt;code&gt;from haystack_integrations.document_stores.chroma import ChromaDocumentStore&lt;/code&gt;. Same class, different package. This is exactly the kind of thing that makes docs go stale.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. You Can't Push Directly to Upstream
&lt;/h3&gt;

&lt;p&gt;I tried &lt;code&gt;git push origin my-branch&lt;/code&gt; and got a 403. You have to fork the repo first, push to your fork, then create the PR with &lt;code&gt;gh pr create --repo chroma-core/chroma --head SaintChris:my-branch&lt;/code&gt;. Simple, but not obvious if you haven't contributed to a large project before.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Docs Are Code
&lt;/h3&gt;

&lt;p&gt;A broken code example in documentation is the same as a broken function — it wastes hours of developer time. The Path bug in the original docs would have caused a TypeError for anyone who copied the example. Fixing that one line probably saves more developer hours than most code contributions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The PR
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/chroma-core/chroma/pull/7230" rel="noopener noreferrer"&gt;PR #7230&lt;/a&gt; is now open on the chroma-core/chroma repository. It's documentation-only — no code changes. The branch is at &lt;a href="https://github.com/SaintChris/chroma/tree/docs/haystack-chroma-examples" rel="noopener noreferrer"&gt;SaintChris/chroma&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Whether it gets merged or not, the process itself was the value. I now understand how Chroma's deployment modes work at a deeper level, I've read their documentation pipeline, and I have a contribution on one of the most widely-used vector databases in the AI ecosystem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;Open-source documentation is infrastructure. When it's wrong, every developer who copies that example hits a wall. When it's incomplete, they spend hours reading source code to figure out what the docs should have said.&lt;/p&gt;

&lt;p&gt;Contributing to docs isn't glamorous. But for a project like Chroma — which thousands of developers depend on for RAG pipelines, agent memory, and semantic search — a clear, comprehensive integration guide is worth more than most feature PRs.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>database</category>
      <category>opensource</category>
      <category>rag</category>
    </item>
    <item>
      <title>I Built a Production RAG System on My M1 Mac for $0</title>
      <dc:creator>Alex Bogle</dc:creator>
      <pubDate>Wed, 10 Jun 2026 04:09:35 +0000</pubDate>
      <link>https://dev.to/saintchris_21/i-built-a-production-rag-system-on-my-m1-mac-for-0-5cn8</link>
      <guid>https://dev.to/saintchris_21/i-built-a-production-rag-system-on-my-m1-mac-for-0-5cn8</guid>
      <description>&lt;p&gt;I Built a Production RAG System on My M1 Mac for $0&lt;/p&gt;

&lt;p&gt;Most RAG tutorials stop at "it answers questions." But answering questions is table stakes. The real question is: &lt;strong&gt;are the answers actually correct?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I built a RAG pipeline that doesn't just retrieve and generate — it &lt;strong&gt;evaluates&lt;/strong&gt; whether its own answers are faithful to the source material and relevant to the question. All running locally on an M1 Mac with 16GB RAM. Zero cloud cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;A full RAG system with three layers most tutorials skip:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Retrieval&lt;/strong&gt; — Upload PDFs or paste text, get chunked and embedded into a local vector store&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generation&lt;/strong&gt; — Ask questions, get streaming answers backed by retrieved context with source citations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evaluation&lt;/strong&gt; — Run an automated test suite that scores every answer for faithfulness and relevance using an LLM-as-judge, then logs all metrics to MLflow for experiment tracking&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why Evaluation Matters
&lt;/h2&gt;

&lt;p&gt;Anyone can build a RAG that produces plausible-sounding answers. The hard part is knowing whether those answers are &lt;strong&gt;grounded&lt;/strong&gt; in the source material or just confident hallucinations.&lt;/p&gt;

&lt;p&gt;My evaluation pipeline measures three things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Faithfulness&lt;/strong&gt; (1-5): Is the answer actually supported by the retrieved chunks? Or is the LLM making stuff up?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Relevance&lt;/strong&gt; (1-5): Does the answer match the ground truth reference for the given question?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retrieval Accuracy&lt;/strong&gt; (%): What percentage of key terms from the reference answer actually appear in the retrieved chunks?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All three metrics get logged to MLflow, so you can compare different chunk sizes, overlap values, and model choices across runs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;The whole stack runs locally:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FastAPI&lt;/strong&gt; backend with async streaming responses&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ChromaDB&lt;/strong&gt; as the vector store (embedded, no separate server)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;all-MiniLM-L6-v2&lt;/strong&gt; (sentence-transformers) for embeddings — 80MB, fast on CPU&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;qwen3:4b&lt;/strong&gt; (Ollama) for generation — 2.5GB, no API keys needed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MLflow&lt;/strong&gt; for experiment tracking — params, metrics, all logged&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vanilla HTML/CSS/JS&lt;/strong&gt; frontend — dark theme, chat UI, PDF upload, eval controls&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Not Ollama Embeddings?
&lt;/h2&gt;

&lt;p&gt;I started with Ollama's &lt;code&gt;/api/embeddings&lt;/code&gt; endpoint using nomic-embed-text. On my M1 Mac, it was painfully slow — 30+ seconds per embedding call. Switched to sentence-transformers running the same all-MiniLM-L6-v2 model locally in-process. First call loads the model in ~2 seconds. Subsequent embeddings: ~18ms each. Night and day.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Code
&lt;/h2&gt;

&lt;p&gt;The entire project is open source. Key files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;rag_engine.py&lt;/code&gt; — Chunking, embedding, vector storage, retrieval&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;llm_client.py&lt;/code&gt; — Ollama client with sync and streaming generation&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;evaluator.py&lt;/code&gt; — LLM-as-judge scoring for faithfulness and relevance&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tracker.py&lt;/code&gt; — MLflow experiment tracking wrapper&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;app.py&lt;/code&gt; — FastAPI routes tying it all together&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;seed.py&lt;/code&gt; — Sample data seeding script&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tests are fully mocked — no Ollama or model files required. Full suite runs in ~30 seconds.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Evaluation is not optional.&lt;/strong&gt; If you can't measure answer quality, you're shipping a chatbot, not a system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local-first is viable.&lt;/strong&gt; Everything runs on a $1,200 laptop. No cloud credits, no API keys, no vendor lock-in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Streaming matters for UX.&lt;/strong&gt; SSE streaming makes the UI feel responsive even when the LLM takes a few seconds to generate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mock your external dependencies.&lt;/strong&gt; Tests that call real LLMs are slow and flaky. Mock the HTTP layer, test your logic.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;The repo includes a seed script with sample data so you can go from clone to running in under 5 minutes. Just need Python 3.9+ and Ollama with qwen3:4b.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/SaintChris/rag-eval-system.git
&lt;span class="nb"&gt;cd &lt;/span&gt;rag-eval-system/backend
python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv venv &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;source &lt;/span&gt;venv/bin/activate
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
python3 seed.py
python3 run.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;code&gt;http://localhost:8001/docs&lt;/code&gt; for the interactive API docs.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;This is Project 1 of 5 in my portfolio rebuild. Next up: a Hermes MLOps case study showing how I run a 6-agent AI system with 22K+ requests, 52 tests, and $0 cloud spend — all on this same M1 Mac.&lt;/p&gt;

&lt;p&gt;If you're building RAG systems and not evaluating them, you're flying blind. Build the eval pipeline first. Everything else follows.&lt;/p&gt;

</description>
      <category>rag</category>
      <category>mlops</category>
      <category>ai</category>
      <category>python</category>
    </item>
  </channel>
</rss>
