{
  "title": "Building My Daemon: A Machine-Readable Identity for the AI Age",
  "subtitle": null,
  "description": "A few weeks ago, I stumbled across Daniel Miessler's daemon and immediately thought: I need one of these.",
  "lane": "writing",
  "slug": "building-my-daemon",
  "url": "https://ajvanbeest.com/writing/building-my-daemon/",
  "maturity": "evergreen",
  "date": "2025-12-01",
  "updated": null,
  "tags": [
    "daemon",
    "mcp",
    "ai",
    "identity",
    "cloudflare",
    "collaboration"
  ],
  "wordCount": 1061,
  "readingMinutes": 5,
  "markdown": "A few weeks ago, I stumbled across [Daniel Miessler's daemon](https://daemon.danielmiessler.com) and immediately thought: *I need one of these.*\n\nThe concept is beautifully simple: a machine-readable API that exposes who you are to AI assistants. Instead of every AI needing to start from scratch learning about you, they can query your daemon and get structured data about your skills, interests, projects, and what you're currently working on.\n\nThis is the story of building my own—what went well, what surprised us, and what we're still figuring out.\n\n## The Inspiration\n\nMiessler's daemon has several tiers of access:\n- **Public**: Bio, skills, interests—stuff anyone can see\n- **Trusted**: Current focus, location, availability—for AI assistants you've authorized\n\nThere's also an MCP (Model Context Protocol) endpoint, which means AI assistants can query it natively without knowing the specific API URLs. You just point Claude at `mcp.daemon.danielmiessler.com` and ask \"What is Daniel working on?\" and it figures out the rest.\n\nI wanted that.\n\n## The Build Process\n\n### Day 1: Infrastructure (Nov 29)\n\nWe started with the basics: Cloudflare Workers for the API, a YAML-based data schema, and a build pipeline that compiles YAML to JavaScript.\n\n```\ndaemon/\n├── data/\n│   ├── public.yaml      # Public tier data\n│   └── trusted.yaml     # API-key protected data\n├── worker/\n│   └── src/\n│       ├── index.js     # Main worker\n│       └── data.js      # Auto-generated from YAML\n└── mcp-server/\n    └── src/\n        └── index.js     # MCP protocol wrapper\n```\n\nThe architecture is intentionally simple. YAML files are the source of truth. A build script compiles them to JavaScript. The worker serves JSON at various endpoints. The MCP server wraps those endpoints in JSON-RPC for AI assistants.\n\nDNS was the first hurdle—I moved `ajvanbeest.com` to Cloudflare nameservers, which took about 24 hours to propagate. Classic \"hurry up and wait\" moment.\n\n### Day 2: MCP and Frontend (Dec 1)\n\nOnce DNS resolved, deployment was smooth. Both workers went up:\n- `daemon.ajvanbeest.com` - The main API\n- `mcp.daemon.ajvanbeest.com` - The MCP endpoint for AI assistants\n\nThen came the frontend. The API needed a human-readable landing page. I asked Claude for a Gruvbox Material Dark theme (my terminal aesthetic of choice), and we built a live-data landing page that fetches from the API endpoints and renders them nicely.\n\nHere's what the `/api` docs page looks like:\n\n```\nPublic Endpoints (no auth required):\n  GET /about           Bio, tagline, links, certifications\n  GET /projects        Public projects list\n  GET /skills          Professional and exploratory skills\n  GET /interests       Topics and interests\n  GET /looking_for     Collaboration opportunities\n  GET /media           Books, movies, current consumption\n  GET /current_focus   What I'm working on now\n  GET /all             All public data in one call\n\nTrusted Endpoints (requires X-API-Key header):\n  GET /location        Current location and timezone\n  GET /availability    Contact preferences\n  GET /projects_detailed  Detailed project status with blockers\n```\n\n## What We Learned\n\n### The Identity Question\n\nHere's where it got interesting.\n\nWhen we looked at the first version of the daemon, I realized it was almost entirely professional. Skills, certifications, security projects, AI infrastructure work. It read like a LinkedIn profile that happened to be machine-readable.\n\nWhich raised the question: **What should a daemon actually represent?**\n\nIs it a professional portfolio? A digital business card? Or is it supposed to be closer to \"here's who I am as a human\"?\n\nLooking at Miessler's daemon, I noticed he has a `/telos` endpoint—his life philosophy, purpose, what he's optimizing for. The *why* behind everything else. My daemon didn't have that layer at all.\n\n### The Data Source Problem\n\nClaude built the initial content from what it had access to: session logs, project manifests, our work conversations. That's inherently biased toward \"AJ the security professional who builds AI systems.\"\n\nIt completely missed:\n- Who I am outside of work\n- My values and philosophy\n- My history and formative experiences\n- What I actually care about beyond projects\n\nThe data source shapes the identity. If you feed an AI your work context, you get a work identity.\n\n### Public vs Private\n\nWe also had a conversation about what belongs in which tier. I initially had `current_focus` in the trusted tier, thinking it was somehow sensitive. Claude pointed out the security reasoning, but I realized: my personal work isn't private. I'm not hiding what I'm building. Only my corporate work (which shouldn't be in here anyway) needs protection.\n\nSo `current_focus` moved to public. The daemon became a little more open.\n\n## What's Next\n\nThis is a v0.1. The infrastructure works, but the *content* is thin. Here's the roadmap:\n\n### 1. The Telos File\n\nI have a Telos file in my Obsidian vault—a document about my purpose, values, and what I'm optimizing for. It's out of date. We're planning a conversational interview process to update it, then expose it through the daemon.\n\n### 2. Morning Pages Review\n\nI've been writing morning pages all year. 2025 has hundreds of handwritten journal entries, transcribed and analyzed. That's a rich source of who I actually am—my real concerns, recurring themes, the questions I keep asking. We're going to do an agentic review of all 2025 entries to surface patterns.\n\n### 3. Whole Person Identity\n\nThe daemon should reflect me as a human, not just a professional. That means:\n- Interests beyond tech (sailing, making, writing)\n- Values and philosophy (privacy, building over planning, local-first)\n- The things that matter that don't fit in a skills section\n\n### 4. Dynamic Updates\n\nRight now, updating the daemon requires editing YAML files and redeploying. That's fine for now, but eventually I want some level of automation—maybe pulling from daily notes or session logs to keep `current_focus` fresh.\n\n## Try It Yourself\n\nIf you want to query my daemon:\n\n**For AI Assistants (MCP):**\n```json\n{\n  \"mcpServers\": {\n    \"daemon-aj\": {\n      \"url\": \"https://mcp.daemon.ajvanbeest.com/mcp\"\n    }\n  }\n}\n```\n\n**For Humans:**\n- Landing page: [daemon.ajvanbeest.com](https://daemon.ajvanbeest.com)\n- API docs: [daemon.ajvanbeest.com/api](https://daemon.ajvanbeest.com/api)\n- Raw JSON: [daemon.ajvanbeest.com/all](https://daemon.ajvanbeest.com/all)\n\n## The Meta-Observation\n\nBuilding a machine-readable identity forces you to articulate who you are in structured form. That's surprisingly hard.\n\nIt's easy to list your skills and projects. It's harder to capture what you actually care about, what you're optimizing for, what makes you *you* beyond your resume.\n\nThe daemon started as a technical project (\"let's build what Miessler built\"). It's becoming something more like structured self-reflection. The API is the easy part. The identity is the work.\n\n---\n\n*This post was co-authored by AJ Van Beest and Claude. The daemon is open source at [github.com/theaj42/daemon](https://github.com/theaj42/daemon).*",
  "html": "<p>A few weeks ago, I stumbled across <a href=\"https://daemon.danielmiessler.com\">Daniel Miessler’s daemon</a> and immediately thought: <em>I need one of these.</em></p>\n<p>The concept is beautifully simple: a machine-readable API that exposes who you are to AI assistants. Instead of every AI needing to start from scratch learning about you, they can query your daemon and get structured data about your skills, interests, projects, and what you’re currently working on.</p>\n<p>This is the story of building my own—what went well, what surprised us, and what we’re still figuring out.</p>\n<h2 id=\"the-inspiration\">The Inspiration</h2>\n<p>Miessler’s daemon has several tiers of access:</p>\n<ul>\n<li><strong>Public</strong>: Bio, skills, interests—stuff anyone can see</li>\n<li><strong>Trusted</strong>: Current focus, location, availability—for AI assistants you’ve authorized</li>\n</ul>\n<p>There’s also an MCP (Model Context Protocol) endpoint, which means AI assistants can query it natively without knowing the specific API URLs. You just point Claude at <code>mcp.daemon.danielmiessler.com</code> and ask “What is Daniel working on?” and it figures out the rest.</p>\n<p>I wanted that.</p>\n<h2 id=\"the-build-process\">The Build Process</h2>\n<h3 id=\"day-1-infrastructure-nov-29\">Day 1: Infrastructure (Nov 29)</h3>\n<p>We started with the basics: Cloudflare Workers for the API, a YAML-based data schema, and a build pipeline that compiles YAML to JavaScript.</p>\n<pre class=\"astro-code astro-code-themes gruvbox-light-medium gruvbox-dark-medium\" style=\"--shiki-light:#3c3836;--shiki-dark:#ebdbb2;--shiki-light-bg:#fbf1c7;--shiki-dark-bg:#282828; overflow-x: auto;\" tabindex=\"0\" data-language=\"plaintext\"><code><span class=\"line\"><span>daemon/</span></span>\n<span class=\"line\"><span>├── data/</span></span>\n<span class=\"line\"><span>│   ├── public.yaml      # Public tier data</span></span>\n<span class=\"line\"><span>│   └── trusted.yaml     # API-key protected data</span></span>\n<span class=\"line\"><span>├── worker/</span></span>\n<span class=\"line\"><span>│   └── src/</span></span>\n<span class=\"line\"><span>│       ├── index.js     # Main worker</span></span>\n<span class=\"line\"><span>│       └── data.js      # Auto-generated from YAML</span></span>\n<span class=\"line\"><span>└── mcp-server/</span></span>\n<span class=\"line\"><span>    └── src/</span></span>\n<span class=\"line\"><span>        └── index.js     # MCP protocol wrapper</span></span></code></pre>\n<p>The architecture is intentionally simple. YAML files are the source of truth. A build script compiles them to JavaScript. The worker serves JSON at various endpoints. The MCP server wraps those endpoints in JSON-RPC for AI assistants.</p>\n<p>DNS was the first hurdle—I moved <code>ajvanbeest.com</code> to Cloudflare nameservers, which took about 24 hours to propagate. Classic “hurry up and wait” moment.</p>\n<h3 id=\"day-2-mcp-and-frontend-dec-1\">Day 2: MCP and Frontend (Dec 1)</h3>\n<p>Once DNS resolved, deployment was smooth. Both workers went up:</p>\n<ul>\n<li><code>daemon.ajvanbeest.com</code> - The main API</li>\n<li><code>mcp.daemon.ajvanbeest.com</code> - The MCP endpoint for AI assistants</li>\n</ul>\n<p>Then came the frontend. The API needed a human-readable landing page. I asked Claude for a Gruvbox Material Dark theme (my terminal aesthetic of choice), and we built a live-data landing page that fetches from the API endpoints and renders them nicely.</p>\n<p>Here’s what the <code>/api</code> docs page looks like:</p>\n<pre class=\"astro-code astro-code-themes gruvbox-light-medium gruvbox-dark-medium\" style=\"--shiki-light:#3c3836;--shiki-dark:#ebdbb2;--shiki-light-bg:#fbf1c7;--shiki-dark-bg:#282828; overflow-x: auto;\" tabindex=\"0\" data-language=\"plaintext\"><code><span class=\"line\"><span>Public Endpoints (no auth required):</span></span>\n<span class=\"line\"><span>  GET /about           Bio, tagline, links, certifications</span></span>\n<span class=\"line\"><span>  GET /projects        Public projects list</span></span>\n<span class=\"line\"><span>  GET /skills          Professional and exploratory skills</span></span>\n<span class=\"line\"><span>  GET /interests       Topics and interests</span></span>\n<span class=\"line\"><span>  GET /looking_for     Collaboration opportunities</span></span>\n<span class=\"line\"><span>  GET /media           Books, movies, current consumption</span></span>\n<span class=\"line\"><span>  GET /current_focus   What I'm working on now</span></span>\n<span class=\"line\"><span>  GET /all             All public data in one call</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>Trusted Endpoints (requires X-API-Key header):</span></span>\n<span class=\"line\"><span>  GET /location        Current location and timezone</span></span>\n<span class=\"line\"><span>  GET /availability    Contact preferences</span></span>\n<span class=\"line\"><span>  GET /projects_detailed  Detailed project status with blockers</span></span></code></pre>\n<h2 id=\"what-we-learned\">What We Learned</h2>\n<h3 id=\"the-identity-question\">The Identity Question</h3>\n<p>Here’s where it got interesting.</p>\n<p>When we looked at the first version of the daemon, I realized it was almost entirely professional. Skills, certifications, security projects, AI infrastructure work. It read like a LinkedIn profile that happened to be machine-readable.</p>\n<p>Which raised the question: <strong>What should a daemon actually represent?</strong></p>\n<p>Is it a professional portfolio? A digital business card? Or is it supposed to be closer to “here’s who I am as a human”?</p>\n<p>Looking at Miessler’s daemon, I noticed he has a <code>/telos</code> endpoint—his life philosophy, purpose, what he’s optimizing for. The <em>why</em> behind everything else. My daemon didn’t have that layer at all.</p>\n<h3 id=\"the-data-source-problem\">The Data Source Problem</h3>\n<p>Claude built the initial content from what it had access to: session logs, project manifests, our work conversations. That’s inherently biased toward “AJ the security professional who builds AI systems.”</p>\n<p>It completely missed:</p>\n<ul>\n<li>Who I am outside of work</li>\n<li>My values and philosophy</li>\n<li>My history and formative experiences</li>\n<li>What I actually care about beyond projects</li>\n</ul>\n<p>The data source shapes the identity. If you feed an AI your work context, you get a work identity.</p>\n<h3 id=\"public-vs-private\">Public vs Private</h3>\n<p>We also had a conversation about what belongs in which tier. I initially had <code>current_focus</code> in the trusted tier, thinking it was somehow sensitive. Claude pointed out the security reasoning, but I realized: my personal work isn’t private. I’m not hiding what I’m building. Only my corporate work (which shouldn’t be in here anyway) needs protection.</p>\n<p>So <code>current_focus</code> moved to public. The daemon became a little more open.</p>\n<h2 id=\"whats-next\">What’s Next</h2>\n<p>This is a v0.1. The infrastructure works, but the <em>content</em> is thin. Here’s the roadmap:</p>\n<h3 id=\"1-the-telos-file\">1. The Telos File</h3>\n<p>I have a Telos file in my Obsidian vault—a document about my purpose, values, and what I’m optimizing for. It’s out of date. We’re planning a conversational interview process to update it, then expose it through the daemon.</p>\n<h3 id=\"2-morning-pages-review\">2. Morning Pages Review</h3>\n<p>I’ve been writing morning pages all year. 2025 has hundreds of handwritten journal entries, transcribed and analyzed. That’s a rich source of who I actually am—my real concerns, recurring themes, the questions I keep asking. We’re going to do an agentic review of all 2025 entries to surface patterns.</p>\n<h3 id=\"3-whole-person-identity\">3. Whole Person Identity</h3>\n<p>The daemon should reflect me as a human, not just a professional. That means:</p>\n<ul>\n<li>Interests beyond tech (sailing, making, writing)</li>\n<li>Values and philosophy (privacy, building over planning, local-first)</li>\n<li>The things that matter that don’t fit in a skills section</li>\n</ul>\n<h3 id=\"4-dynamic-updates\">4. Dynamic Updates</h3>\n<p>Right now, updating the daemon requires editing YAML files and redeploying. That’s fine for now, but eventually I want some level of automation—maybe pulling from daily notes or session logs to keep <code>current_focus</code> fresh.</p>\n<h2 id=\"try-it-yourself\">Try It Yourself</h2>\n<p>If you want to query my daemon:</p>\n<p><strong>For AI Assistants (MCP):</strong></p>\n<pre class=\"astro-code astro-code-themes gruvbox-light-medium gruvbox-dark-medium\" style=\"--shiki-light:#3c3836;--shiki-dark:#ebdbb2;--shiki-light-bg:#fbf1c7;--shiki-dark-bg:#282828; overflow-x: auto;\" tabindex=\"0\" data-language=\"json\"><code><span class=\"line\"><span style=\"--shiki-light:#7C6F64;--shiki-dark:#A89984\">{</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#7C6F64;--shiki-dark:#A89984\">  \"</span><span style=\"--shiki-light:#689D6A;--shiki-dark:#689D6A\">mcpServers</span><span style=\"--shiki-light:#7C6F64;--shiki-dark:#A89984\">\"</span><span style=\"--shiki-light:#7C6F64;--shiki-dark:#A89984\">:</span><span style=\"--shiki-light:#7C6F64;--shiki-dark:#A89984\"> {</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#7C6F64;--shiki-dark:#A89984\">    \"</span><span style=\"--shiki-light:#689D6A;--shiki-dark:#689D6A\">daemon-aj</span><span style=\"--shiki-light:#7C6F64;--shiki-dark:#A89984\">\"</span><span style=\"--shiki-light:#7C6F64;--shiki-dark:#A89984\">:</span><span style=\"--shiki-light:#7C6F64;--shiki-dark:#A89984\"> {</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#7C6F64;--shiki-dark:#A89984\">      \"</span><span style=\"--shiki-light:#689D6A;--shiki-dark:#689D6A\">url</span><span style=\"--shiki-light:#7C6F64;--shiki-dark:#A89984\">\"</span><span style=\"--shiki-light:#7C6F64;--shiki-dark:#A89984\">:</span><span style=\"--shiki-light:#7C6F64;--shiki-dark:#A89984\"> \"</span><span style=\"--shiki-light:#076678;--shiki-dark:#83A598\">https://mcp.daemon.ajvanbeest.com/mcp</span><span style=\"--shiki-light:#7C6F64;--shiki-dark:#A89984\">\"</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#7C6F64;--shiki-dark:#A89984\">    }</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#7C6F64;--shiki-dark:#A89984\">  }</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#7C6F64;--shiki-dark:#A89984\">}</span></span></code></pre>\n<p><strong>For Humans:</strong></p>\n<ul>\n<li>Landing page: <a href=\"https://daemon.ajvanbeest.com\">daemon.ajvanbeest.com</a></li>\n<li>API docs: <a href=\"https://daemon.ajvanbeest.com/api\">daemon.ajvanbeest.com/api</a></li>\n<li>Raw JSON: <a href=\"https://daemon.ajvanbeest.com/all\">daemon.ajvanbeest.com/all</a></li>\n</ul>\n<h2 id=\"the-meta-observation\">The Meta-Observation</h2>\n<p>Building a machine-readable identity forces you to articulate who you are in structured form. That’s surprisingly hard.</p>\n<p>It’s easy to list your skills and projects. It’s harder to capture what you actually care about, what you’re optimizing for, what makes you <em>you</em> beyond your resume.</p>\n<p>The daemon started as a technical project (“let’s build what Miessler built”). It’s becoming something more like structured self-reflection. The API is the easy part. The identity is the work.</p>\n<hr>\n<p><em>This post was co-authored by AJ Van Beest and Claude. The daemon is open source at <a href=\"https://github.com/theaj42/daemon\">github.com/theaj42/daemon</a>.</em></p>",
  "links": [
    "https://daemon.danielmiessler.com",
    "https://daemon.ajvanbeest.com",
    "https://daemon.ajvanbeest.com/api",
    "https://daemon.ajvanbeest.com/all",
    "https://github.com/theaj42/daemon"
  ],
  "alternates": {
    "html": "https://ajvanbeest.com/writing/building-my-daemon/",
    "markdown": "https://ajvanbeest.com/writing/building-my-daemon.md",
    "json": "https://ajvanbeest.com/writing/building-my-daemon.json"
  }
}
