{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "Mohamed Ashraf Elsaed: blog",
  "home_page_url": "https://mohamedashrafelsaed.com/blog/",
  "feed_url": "https://mohamedashrafelsaed.com/feed.json",
  "language": "en",
  "authors": [
    {
      "name": "Mohamed Ashraf Elsaed",
      "url": "https://mohamedashrafelsaed.com/about/"
    }
  ],
  "items": [
    {
      "id": "https://mohamedashrafelsaed.com/blog/a-benchmark-gate-that-catches-small-regressions/",
      "url": "https://mohamedashrafelsaed.com/blog/a-benchmark-gate-that-catches-small-regressions/",
      "title": "A benchmark gate that catches small regressions",
      "summary": "How a seeded 50,000-row corpus, a recall baseline and a p95 latency baseline turned a search benchmark into a pass or fail check that runs on every pull request.",
      "date_published": "2026-10-31T00:00:00.000Z",
      "date_modified": "2026-10-31T00:00:00.000Z",
      "tags": [
        "benchmarks",
        "testing",
        "sqlite"
      ]
    },
    {
      "id": "https://mohamedashrafelsaed.com/blog/aletheia-mem-benefits-and-limits/",
      "url": "https://mohamedashrafelsaed.com/blog/aletheia-mem-benefits-and-limits/",
      "title": "What aletheia-mem gives you, and what it does not",
      "summary": "The benefits of Aletheia with their numbers and sources: one local store for many tools, rules written once, private by default, measured retrieval, and the limits.",
      "date_published": "2026-10-31T00:00:00.000Z",
      "date_modified": "2026-10-31T00:00:00.000Z",
      "tags": [
        "aletheia",
        "ai-agents",
        "mcp",
        "benchmarks"
      ]
    },
    {
      "id": "https://mohamedashrafelsaed.com/blog/aletheia-vs-claude-mem-numbers/",
      "url": "https://mohamedashrafelsaed.com/blog/aletheia-vs-claude-mem-numbers/",
      "title": "Aletheia vs claude-mem: reproducible numbers",
      "summary": "A retrieval benchmark of Aletheia against claude-mem 15.2.0 on LoCoMo, with the commands to repeat it, the limits of the comparison and where claude-mem is far ahead.",
      "date_published": "2026-10-31T00:00:00.000Z",
      "date_modified": "2026-10-31T00:00:00.000Z",
      "tags": [
        "benchmarks",
        "ai-agents",
        "claude-code"
      ]
    },
    {
      "id": "https://mohamedashrafelsaed.com/blog/cross-platform-ci-for-a-bun-project/",
      "url": "https://mohamedashrafelsaed.com/blog/cross-platform-ci-for-a-bun-project/",
      "title": "CI on Linux, macOS and Windows for a Bun project",
      "summary": "What broke when I added a Windows runner to a Bun and SQLite project: temp-folder cleanup, path separators, shell assumptions and test timeouts, and how each was fixed.",
      "date_published": "2026-10-31T00:00:00.000Z",
      "date_modified": "2026-10-31T00:00:00.000Z",
      "tags": [
        "ci",
        "bun",
        "testing"
      ]
    },
    {
      "id": "https://mohamedashrafelsaed.com/blog/hooks-that-never-block-your-agent/",
      "url": "https://mohamedashrafelsaed.com/blog/hooks-that-never-block-your-agent/",
      "title": "Hooks designed to fail open for AI coding agents",
      "summary": "A failing hook must not stop your AI coding tool. How Aletheia hooks print nothing and exit 0 on error, spool to disk when the database is busy, and what the tests showed.",
      "date_published": "2026-10-31T00:00:00.000Z",
      "date_modified": "2026-10-31T00:00:00.000Z",
      "tags": [
        "hooks",
        "reliability",
        "ai-agents"
      ]
    },
    {
      "id": "https://mohamedashrafelsaed.com/blog/system-design-claude-code-quality-gate/",
      "url": "https://mohamedashrafelsaed.com/blog/system-design-claude-code-quality-gate/",
      "title": "Quality gate for AI-written Laravel: system design",
      "summary": "How Claude Kit is built: one script behind the pre-commit and Stop hooks, the same tools in CI, a referenced runtime, and files you own that are not replaced unasked.",
      "date_published": "2026-10-31T00:00:00.000Z",
      "date_modified": "2026-10-31T00:00:00.000Z",
      "tags": [
        "system-design",
        "claude-code",
        "laravel",
        "quality-gate"
      ]
    },
    {
      "id": "https://mohamedashrafelsaed.com/blog/system-design-local-first-agent-memory/",
      "url": "https://mohamedashrafelsaed.com/blog/system-design-local-first-agent-memory/",
      "title": "Local-first memory for AI agents: system design",
      "summary": "How Aletheia is built: hooks designed to fail open, redaction before storage, one SQLite file, a leased job queue and a bounded session-start block. Choices and trade-offs.",
      "date_published": "2026-10-31T00:00:00.000Z",
      "date_modified": "2026-10-31T00:00:00.000Z",
      "tags": [
        "system-design",
        "ai-agents",
        "mcp",
        "sqlite"
      ]
    },
    {
      "id": "https://mohamedashrafelsaed.com/blog/system-design-loupe-re-anchoring/",
      "url": "https://mohamedashrafelsaed.com/blog/system-design-loupe-re-anchoring/",
      "title": "Loupe system design: pins that survive redeploys",
      "summary": "How Loupe is built: a comment's journey from a click to an agent, the anchor fingerprint and its scoring, and the lifecycle rule that only a person resolves.",
      "date_published": "2026-10-31T00:00:00.000Z",
      "date_modified": "2026-10-31T00:00:00.000Z",
      "tags": [
        "system-design",
        "loupe",
        "mcp",
        "frontend"
      ]
    },
    {
      "id": "https://mohamedashrafelsaed.com/blog/use-aletheia-mem-memory-and-rules/",
      "url": "https://mohamedashrafelsaed.com/blog/use-aletheia-mem-memory-and-rules/",
      "title": "How to use aletheia-mem: memory for AI agents",
      "summary": "Install aletheia-mem, save and search memories, add a rule, see what a new session receives and preview the Claude Code installer. Run in a throwaway folder.",
      "date_published": "2026-10-31T00:00:00.000Z",
      "date_modified": "2026-10-31T00:00:00.000Z",
      "tags": [
        "aletheia",
        "ai-agents",
        "mcp",
        "tutorial"
      ]
    },
    {
      "id": "https://mohamedashrafelsaed.com/blog/use-loupe-with-claude-code/",
      "url": "https://mohamedashrafelsaed.com/blog/use-loupe-with-claude-code/",
      "title": "How to use Loupe: pin feedback for Claude Code",
      "summary": "Run Loupe locally, pin a comment on a live page, triage it on a board and let Claude Code read and answer it over MCP. Steps, screenshots and what I checked.",
      "date_published": "2026-10-31T00:00:00.000Z",
      "date_modified": "2026-10-31T00:00:00.000Z",
      "tags": [
        "loupe",
        "mcp",
        "claude-code",
        "tutorial"
      ]
    },
    {
      "id": "https://mohamedashrafelsaed.com/blog/why-ai-coding-agents-forget/",
      "url": "https://mohamedashrafelsaed.com/blog/why-ai-coding-agents-forget/",
      "title": "Why AI coding agents forget between sessions",
      "summary": "AI coding agents start every session blank. Here is how Aletheia captures sessions with hooks, stores them in SQLite and feeds context back, all on your machine.",
      "date_published": "2026-10-31T00:00:00.000Z",
      "date_modified": "2026-10-31T00:00:00.000Z",
      "tags": [
        "ai-agents",
        "mcp",
        "claude-code"
      ]
    }
  ]
}