{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "Daneel AI Updates",
  "home_page_url": "https://daneel.injen.io",
  "feed_url": "https://daneel.injen.io/feed.json",
  "items": [
    {
      "id": "https://daneel.injen.io/news/mcp-presets-expansion.html",
      "url": "https://daneel.injen.io/news/mcp-presets-expansion.html?utm_source=json&utm_medium=feed&utm_campaign=news_syndication",
      "title": "More one-click MCP servers for your AI",
      "summary": "Twenty new preset MCP servers join the Featured list. Daneel connects to any HTTP/SSE MCP server you paste by URL, these are just one-click ready.",
      "content_html": "<h2>Twenty more MCP servers, ready in one click</h2>\n<p>Daneel has always worked with any HTTP or SSE MCP server you point it at.</p>\n<p>Paste a URL in <strong>Settings → MCP</strong>, the extension handles the auth handshake, and the tools are yours. No gatekeeping, no marketplace.</p>\n<p>The Featured list is a convenience layer on top of that: a set of respected, well-maintained servers we&#39;ve verified, with their auth flow and credential prompts pre-configured so you don&#39;t have to discover any of it yourself.</p>\n<p>The catalog just grew from 16 to 36 presets.</p>\n<p><strong>Developer tooling:</strong></p>\n<ul>\n<li>GitHub (issues, PRs, Actions)</li>\n<li>Context7 (library docs)</li>\n<li>Hugging Face (models and datasets)</li>\n<li>Sentry (error monitoring)</li>\n<li>Svelte (official docs and code correction)</li>\n<li>Semgrep (static analysis)</li>\n<li>Microsoft Learn, and Google Developer Knowledge</li>\n</ul>\n<p><strong>Travel, hotels, flights, and accommodations:</strong></p>\n<ul>\n<li>Trivago</li>\n<li>LiteAPI</li>\n<li>Kiwi.com</li>\n<li>Skiplagged</li>\n</ul>\n<p><strong>Research and open data:</strong></p>\n<ul>\n<li>PubMed biomedical literature</li>\n<li>Data Commons for US federal statistics</li>\n<li>data.gouv.fr for French government data</li>\n<li>GDELT for global news events</li>\n</ul>\n<p><strong>Weather:</strong></p>\n<ul>\n<li>World Weather Online has a free tier</li>\n<li>Xweather is the premium option</li>\n</ul>\n<p><strong>Infrastructure:</strong></p>\n<ul>\n<li>OVHcloud control plane</li>\n<li>AWS Knowledge docs search</li>\n</ul>\n<p>Each preset detects its own auth method, public, <code>OAuth2+PKCE</code>, or API key, and pre-fills the credential form with the right hints.</p>\n<p><code>OAuth</code> consent is handled automatically when needed.</p>\n<h2>A small interface change</h2>\n<p>Featured MCP server entries now carry a <code>tags</code> array alongside the primary <code>category</code>.</p>\n<p>The UI still filters on category, but tags open the door to multi-facet filtering later. AWS Knowledge also moved from Cloud to Documentation to join Microsoft Learn, Google Developer Knowledge, and Context7. Docs-search tools all live in the same bucket now.</p>\n<h2>Coming next</h2>\n<p>A few categories still have gaps:</p>\n<ul>\n<li>open academic papers,</li>\n<li>economic data,</li>\n<li>open maps.</li>\n</ul>\n<p>We&#39;re watching for quality HTTP/SSE endpoints in those spaces and will fold them in as they appear.</p>\n<p>Found a good one?</p>\n<p><strong>The URL input in Settings → MCP accepts it directly, no waiting for a featured slot.</strong></p>\n",
      "content_text": "\n## Twenty more MCP servers, ready in one click\n\nDaneel has always worked with any HTTP or SSE MCP server you point it at.\n\nPaste a URL in **Settings → MCP**, the extension handles the auth handshake, and the tools are yours. No gatekeeping, no marketplace.\n\nThe Featured list is a convenience layer on top of that: a set of respected, well-maintained servers we've verified, with their auth flow and credential prompts pre-configured so you don't have to discover any of it yourself.\n\nThe catalog just grew from 16 to 36 presets.\n\n**Developer tooling:**\n\n- GitHub (issues, PRs, Actions)\n- Context7 (library docs)\n- Hugging Face (models and datasets)\n- Sentry (error monitoring)\n- Svelte (official docs and code correction)\n- Semgrep (static analysis)\n- Microsoft Learn, and Google Developer Knowledge\n\n**Travel, hotels, flights, and accommodations:**\n\n- Trivago\n- LiteAPI\n- Kiwi.com\n- Skiplagged\n\n**Research and open data:**\n\n- PubMed biomedical literature\n- Data Commons for US federal statistics\n- data.gouv.fr for French government data\n- GDELT for global news events\n\n**Weather:**\n\n- World Weather Online has a free tier\n- Xweather is the premium option\n\n**Infrastructure:**\n\n- OVHcloud control plane\n- AWS Knowledge docs search\n\nEach preset detects its own auth method, public, `OAuth2+PKCE`, or API key, and pre-fills the credential form with the right hints.\n\n`OAuth` consent is handled automatically when needed.\n\n## A small interface change\n\nFeatured MCP server entries now carry a `tags` array alongside the primary `category`.\n\nThe UI still filters on category, but tags open the door to multi-facet filtering later. AWS Knowledge also moved from Cloud to Documentation to join Microsoft Learn, Google Developer Knowledge, and Context7. Docs-search tools all live in the same bucket now.\n\n## Coming next\n\nA few categories still have gaps:\n\n- open academic papers,\n- economic data,\n- open maps.\n\nWe're watching for quality HTTP/SSE endpoints in those spaces and will fold them in as they appear.\n\nFound a good one?\n\n**The URL input in Settings → MCP accepts it directly, no waiting for a featured slot.**\n",
      "date_published": "2026-04-23T00:00:00.000Z",
      "image": "https://daneel.injen.io/medias/mcp.featured.jpg",
      "tags": [
        "mcp",
        "tools",
        "update"
      ]
    },
    {
      "id": "https://daneel.injen.io/news/daneel-speaks.html",
      "url": "https://daneel.injen.io/news/daneel-speaks.html?utm_source=json&utm_medium=feed&utm_campaign=news_syndication",
      "title": "Daneel now speaks, and listens — three voices, one of them fully local",
      "summary": "Pick the voice that suits the moment: system voices for zero-install, Kokoro 82M for fully on-device synthesis on WebGPU, or Google Cloud voices when you want that extra polish. And hold Alt+Space to dictate.",
      "content_html": "<p>Daneel can now read answers aloud, and take your questions by voice. You will find a mic button in every chat composer, a Play button on every assistant message, and a fresh <strong>Speech</strong> section in Settings where you choose how it all sounds.</p>\n<p>It is the kind of feature that looks small on a screenshot and changes how you use the extension. Read a long technical reply while you tidy your desk. Dictate a question while the other hand is on the trackpad. Have a research session narrate itself in the background.</p>\n<h2>Three voices, your choice</h2>\n<p>Text-to-speech in Daneel is not one engine hiding behind a toggle. It is a real picker, and the three options make sense for three different moments.</p>\n<p><strong>System voices</strong>, the default, come straight from your operating system through the browser&#39;s Speech Synthesis API. Nothing downloads. Nothing streams out. Your machine has had these voices for years, Daneel just puts them to work. They sound fine, they start instantly, and they cover every language your OS does.</p>\n<p><strong>Kokoro 82M</strong> is the one to pick when you want everything to stay on your device. It is a full neural TTS model, 82 million parameters, with 54 voices across seven languages. You download it once (around 326 megabytes) and from then on, every word of every assistant reply is synthesized locally on your GPU. No round-trip, no telemetry, no cloud. The voices sing, too: expressive, natural, and a notable step up from the flat cadence of most system voices.</p>\n<p><strong>Google Cloud voices</strong> live behind an advanced toggle because they stream text to Google servers. We filter them by default to keep the privacy story honest. When you opt in, though, the quality is genuinely remarkable, arguably the smoothest prosody you can get in a browser today. A good fit for the times when voice naturalness matters more than data locality.</p>\n<p>All three sit behind the same interface. Switch between them in Settings, and the next click on Play uses the new provider. No restart, no reload.</p>\n<h2>Kokoro, the locality story</h2>\n<p>The fun engineering is all in Kokoro. It runs entirely in the browser, on WebGPU, inside a dedicated Web Worker hosted by the extension&#39;s headless page. Synthesis produces raw 24 kHz PCM which is piped into a host-side AudioContext that schedules chunks back-to-back with sample-accurate timing. The result is gapless playback across sentences, even for long replies.</p>\n<p>A few decisions worth naming. We run Kokoro in fp32 on WebGPU, not the smaller quantized build, because quantized models drag dequantization ops onto the CPU and that single detail takes synthesis from 20 seconds down to 1. We chunk long replies using Kokoro-tuned bounds, with a forward-merge pass that protects the model from very short inputs where its prosody can wobble. Each new Play click preempts any prior one cleanly, and synthesis pipelines one chunk ahead of playback so you never hear a pause between sentences.</p>\n<p>Because the AudioContext lives on the host page and not the tab you are browsing, audio keeps playing when you switch tabs. A small thing that is easy to miss until you switch away from a long article and the narration just continues.</p>\n<h2>Hold Alt+Space to dictate</h2>\n<p>Speech recognition uses the browser&#39;s built-in recognizer for now, which is cloud-backed on Chrome (audio streams to Google). The mic button lives in the composer, the keyboard shortcut is <strong>Alt+Space</strong> from anywhere on the page, and the transcript lands in your input box without auto-submitting. You get to read it before you send. When Airplane Mode is on, the mic disables itself with an explanatory tooltip, no accidental cloud round-trips.</p>\n<p>A fully local speech-to-text option, based on the Moonshine model family, is the next piece. The catalog entries are already there, marked &quot;Coming soon.&quot; The same privacy story as Kokoro, applied to the other direction.</p>\n<h2>The settings worth knowing</h2>\n<p>A single <strong>Speech</strong> section in Settings holds everything. Toggle either side on or off, pick a provider, pick a specific voice from the list (Web Speech gives you the OS catalog, Kokoro its 54), drag the rate slider between 0.5× and 2.0×, and flip <strong>Auto-read</strong> if you would rather every assistant message play itself without needing the button. There is also a <strong>Test</strong> button next to the voice picker, which is genuinely useful when you are trying to decide between, say, Bella and Nicole on Kokoro.</p>\n<p>The download for Kokoro runs inline in the card, with progress. You can remove the model any time and the card goes back to offering the download, no disk left behind.</p>\n<h2>What is next</h2>\n<p>Moonshine local STT is the next shipping piece, bringing the same locality guarantee to dictation. Beyond that, we are looking at giving users a dtype choice for Kokoro (q8 for WASM-only devices, smaller download), adding a quick-switch shortcut for voices, and surfacing a visible &quot;now speaking&quot; indicator for longer replies.</p>\n<p>For now, open Settings → Speech, download Kokoro if you have the patience for a one-time 326 MB pull, and let the assistant read you the next long reply. You might find it is the way you actually wanted to consume it all along.</p>\n",
      "content_text": "\nDaneel can now read answers aloud, and take your questions by voice. You will find a mic button in every chat composer, a Play button on every assistant message, and a fresh **Speech** section in Settings where you choose how it all sounds.\n\nIt is the kind of feature that looks small on a screenshot and changes how you use the extension. Read a long technical reply while you tidy your desk. Dictate a question while the other hand is on the trackpad. Have a research session narrate itself in the background.\n\n## Three voices, your choice\n\nText-to-speech in Daneel is not one engine hiding behind a toggle. It is a real picker, and the three options make sense for three different moments.\n\n**System voices**, the default, come straight from your operating system through the browser's Speech Synthesis API. Nothing downloads. Nothing streams out. Your machine has had these voices for years, Daneel just puts them to work. They sound fine, they start instantly, and they cover every language your OS does.\n\n**Kokoro 82M** is the one to pick when you want everything to stay on your device. It is a full neural TTS model, 82 million parameters, with 54 voices across seven languages. You download it once (around 326 megabytes) and from then on, every word of every assistant reply is synthesized locally on your GPU. No round-trip, no telemetry, no cloud. The voices sing, too: expressive, natural, and a notable step up from the flat cadence of most system voices.\n\n**Google Cloud voices** live behind an advanced toggle because they stream text to Google servers. We filter them by default to keep the privacy story honest. When you opt in, though, the quality is genuinely remarkable, arguably the smoothest prosody you can get in a browser today. A good fit for the times when voice naturalness matters more than data locality.\n\nAll three sit behind the same interface. Switch between them in Settings, and the next click on Play uses the new provider. No restart, no reload.\n\n## Kokoro, the locality story\n\nThe fun engineering is all in Kokoro. It runs entirely in the browser, on WebGPU, inside a dedicated Web Worker hosted by the extension's headless page. Synthesis produces raw 24 kHz PCM which is piped into a host-side AudioContext that schedules chunks back-to-back with sample-accurate timing. The result is gapless playback across sentences, even for long replies.\n\nA few decisions worth naming. We run Kokoro in fp32 on WebGPU, not the smaller quantized build, because quantized models drag dequantization ops onto the CPU and that single detail takes synthesis from 20 seconds down to 1. We chunk long replies using Kokoro-tuned bounds, with a forward-merge pass that protects the model from very short inputs where its prosody can wobble. Each new Play click preempts any prior one cleanly, and synthesis pipelines one chunk ahead of playback so you never hear a pause between sentences.\n\nBecause the AudioContext lives on the host page and not the tab you are browsing, audio keeps playing when you switch tabs. A small thing that is easy to miss until you switch away from a long article and the narration just continues.\n\n## Hold Alt+Space to dictate\n\nSpeech recognition uses the browser's built-in recognizer for now, which is cloud-backed on Chrome (audio streams to Google). The mic button lives in the composer, the keyboard shortcut is **Alt+Space** from anywhere on the page, and the transcript lands in your input box without auto-submitting. You get to read it before you send. When Airplane Mode is on, the mic disables itself with an explanatory tooltip, no accidental cloud round-trips.\n\nA fully local speech-to-text option, based on the Moonshine model family, is the next piece. The catalog entries are already there, marked \"Coming soon.\" The same privacy story as Kokoro, applied to the other direction.\n\n## The settings worth knowing\n\nA single **Speech** section in Settings holds everything. Toggle either side on or off, pick a provider, pick a specific voice from the list (Web Speech gives you the OS catalog, Kokoro its 54), drag the rate slider between 0.5× and 2.0×, and flip **Auto-read** if you would rather every assistant message play itself without needing the button. There is also a **Test** button next to the voice picker, which is genuinely useful when you are trying to decide between, say, Bella and Nicole on Kokoro.\n\nThe download for Kokoro runs inline in the card, with progress. You can remove the model any time and the card goes back to offering the download, no disk left behind.\n\n## What is next\n\nMoonshine local STT is the next shipping piece, bringing the same locality guarantee to dictation. Beyond that, we are looking at giving users a dtype choice for Kokoro (q8 for WASM-only devices, smaller download), adding a quick-switch shortcut for voices, and surfacing a visible \"now speaking\" indicator for longer replies.\n\nFor now, open Settings → Speech, download Kokoro if you have the patience for a one-time 326 MB pull, and let the assistant read you the next long reply. You might find it is the way you actually wanted to consume it all along.\n",
      "date_published": "2026-04-22T00:00:00.000Z",
      "image": "https://daneel.injen.io/medias/speech.png",
      "tags": [
        "speech",
        "tts",
        "kokoro",
        "webgpu",
        "privacy",
        "local-ai",
        "voice"
      ]
    },
    {
      "id": "https://daneel.injen.io/news/wikidata-fact-box.html",
      "url": "https://daneel.injen.io/news/wikidata-fact-box.html?utm_source=json&utm_medium=feed&utm_campaign=news_syndication",
      "title": "Wikidata next to Wikipedia — facts you can scan, not just read",
      "summary": "Click an entity in your knowledge graph and you now get two panels side by side: Wikipedia for the story, Wikidata for the structured facts. Birth dates, awards, employers, external IDs, all in one scannable card.",
      "content_html": "<p>The Wikipedia panel that pops up when you click a node in the knowledge graph is great for reading.</p>\n<p>It is less great when you just want to check a date, confirm an affiliation, or follow an authority link to ORCID. Prose is not a spreadsheet.</p>\n<p>Wikidata is. Every QID is a small, structured record: birth date, employer, awards, country of citizenship, external IDs in a hundred different authority databases. Today the graph view starts using it.</p>\n<h2>What you see</h2>\n<p>Click a node. Wikipedia opens on the left, exactly like before. Beside it, a new amber-tinted panel loads: a thumbnail, the canonical label, the one-line description, and a tight stack of facts grouped by theme.</p>\n<p>For a person you get life dates, place of birth and death, citizenship, occupation, where they studied, who employed them, who their doctoral advisor was, who they influenced. Dates are formatted properly, with precision respected, &quot;March 1879&quot; if that is all Wikidata has, &quot;14 March 1879&quot; when the day is known.</p>\n<p>For an organization: founding date, founder, headquarters, industry, CEO. For a place: country, parent region, population, coordinates. For a creative work: author or director, publication date, genre, language.</p>\n<p>At the bottom, a row of small chips: VIAF, ORCID, ISNI, IMDB, MusicBrainz, GitHub, Twitter. Each one links to the authoritative external record when Wikidata has it.</p>\n<h2>Getting the right entity</h2>\n<p>&quot;Einstein&quot; is unambiguous. &quot;Paris&quot; is not. &quot;Feynman&quot; returns three physicists and a mathematician.</p>\n<p>The panel handles this quietly. Every click triggers a parallel lookup through two services: the Wikidata reconciliation API, which takes the entity type from your ontology as a filter, and the plain Wikidata search, which does not. The results get merged, scored, and the top candidate is shown directly when confidence is high.</p>\n<p>When two or more candidates are too close to call, the panel switches to a picker: label, description, QID, confidence. You choose once, we remember your pick. The next time that same entity appears in any vault, it resolves instantly.</p>\n<h2>Under the hood, briefly</h2>\n<ul>\n<li>Every request carries a descriptive User-Agent per Wikimedia policy, routed through the service worker so headers are actually set (content scripts cannot).</li>\n<li>A shared concurrency limit caps all Wikimedia calls at three in flight, so a node-mashing session does not get us rate-limited.</li>\n<li><code>Retry-After</code> headers are honoured with exponential backoff. If Wikimedia is having a bad day, the panel degrades gracefully.</li>\n<li>Three caches: resolved QIDs by text plus type, full entity payloads by QID, a shared label map. Cold click hits the network, warm clicks render instantly.</li>\n<li>Offline Mode gates everything. When the switch is on, the panel shows a paused notice for uncached entities, and still renders fact boxes for anything you looked up earlier.</li>\n</ul>\n<h2>Privacy</h2>\n<p>The panel ships with a reference telemetry integration that doubles as the template for our broader analytics work landing next week. The rules we held to:</p>\n<ul>\n<li>No entity text in any event. The specific concepts you are browsing stay in your vault.</li>\n<li>No QIDs in events either. A QID identifies an entity as clearly as its name.</li>\n<li>Only categorical values, counts, durations, booleans. Nothing free-form ever leaves.</li>\n<li>Consent-gated at the service layer. Call sites emit unconditionally, a disabled sink drops silently.</li>\n</ul>\n<p>Everything we track is about the pipeline itself, cache hit rate, resolution confidence distribution, rate-limit events, not about what you look up.</p>\n<h2>What is next</h2>\n<p>This is v1. Under the same abstraction, the v2 work already sits in the codebase: SPARQL methods on the client, contract-tested, dormant. The next step is batch queries across every resolved QID in your vault, extracting real factual edges, Einstein died in Princeton, Feynman studied at MIT, the Curies were married, and rendering them as a distinct layer in the 3D graph alongside the co-occurrence links you already see.</p>\n<p>In v1 the panel is English only, because Wikidata&#39;s English coverage is the best starting point and cache namespaces are lang-unaware for now. Multilingual display is tracked for a later release.</p>\n<p>Click any node today. The facts are there.</p>\n",
      "content_text": "\nThe Wikipedia panel that pops up when you click a node in the knowledge graph is great for reading.\n\nIt is less great when you just want to check a date, confirm an affiliation, or follow an authority link to ORCID. Prose is not a spreadsheet.\n\nWikidata is. Every QID is a small, structured record: birth date, employer, awards, country of citizenship, external IDs in a hundred different authority databases. Today the graph view starts using it.\n\n## What you see\n\nClick a node. Wikipedia opens on the left, exactly like before. Beside it, a new amber-tinted panel loads: a thumbnail, the canonical label, the one-line description, and a tight stack of facts grouped by theme.\n\nFor a person you get life dates, place of birth and death, citizenship, occupation, where they studied, who employed them, who their doctoral advisor was, who they influenced. Dates are formatted properly, with precision respected, \"March 1879\" if that is all Wikidata has, \"14 March 1879\" when the day is known.\n\nFor an organization: founding date, founder, headquarters, industry, CEO. For a place: country, parent region, population, coordinates. For a creative work: author or director, publication date, genre, language.\n\nAt the bottom, a row of small chips: VIAF, ORCID, ISNI, IMDB, MusicBrainz, GitHub, Twitter. Each one links to the authoritative external record when Wikidata has it.\n\n## Getting the right entity\n\n\"Einstein\" is unambiguous. \"Paris\" is not. \"Feynman\" returns three physicists and a mathematician.\n\nThe panel handles this quietly. Every click triggers a parallel lookup through two services: the Wikidata reconciliation API, which takes the entity type from your ontology as a filter, and the plain Wikidata search, which does not. The results get merged, scored, and the top candidate is shown directly when confidence is high.\n\nWhen two or more candidates are too close to call, the panel switches to a picker: label, description, QID, confidence. You choose once, we remember your pick. The next time that same entity appears in any vault, it resolves instantly.\n\n## Under the hood, briefly\n\n- Every request carries a descriptive User-Agent per Wikimedia policy, routed through the service worker so headers are actually set (content scripts cannot).\n- A shared concurrency limit caps all Wikimedia calls at three in flight, so a node-mashing session does not get us rate-limited.\n- `Retry-After` headers are honoured with exponential backoff. If Wikimedia is having a bad day, the panel degrades gracefully.\n- Three caches: resolved QIDs by text plus type, full entity payloads by QID, a shared label map. Cold click hits the network, warm clicks render instantly.\n- Offline Mode gates everything. When the switch is on, the panel shows a paused notice for uncached entities, and still renders fact boxes for anything you looked up earlier.\n\n## Privacy\n\nThe panel ships with a reference telemetry integration that doubles as the template for our broader analytics work landing next week. The rules we held to:\n\n- No entity text in any event. The specific concepts you are browsing stay in your vault.\n- No QIDs in events either. A QID identifies an entity as clearly as its name.\n- Only categorical values, counts, durations, booleans. Nothing free-form ever leaves.\n- Consent-gated at the service layer. Call sites emit unconditionally, a disabled sink drops silently.\n\nEverything we track is about the pipeline itself, cache hit rate, resolution confidence distribution, rate-limit events, not about what you look up.\n\n## What is next\n\nThis is v1. Under the same abstraction, the v2 work already sits in the codebase: SPARQL methods on the client, contract-tested, dormant. The next step is batch queries across every resolved QID in your vault, extracting real factual edges, Einstein died in Princeton, Feynman studied at MIT, the Curies were married, and rendering them as a distinct layer in the 3D graph alongside the co-occurrence links you already see.\n\nIn v1 the panel is English only, because Wikidata's English coverage is the best starting point and cache namespaces are lang-unaware for now. Multilingual display is tracked for a later release.\n\nClick any node today. The facts are there.\n",
      "date_published": "2026-04-19T00:00:00.000Z",
      "image": "https://daneel.injen.io/medias/wikidata.png",
      "tags": [
        "knowledge-graph",
        "wikidata",
        "wikipedia",
        "facts",
        "research"
      ]
    },
    {
      "id": "https://daneel.injen.io/news/models-storage.html",
      "url": "https://daneel.injen.io/news/models-storage.html?utm_source=json&utm_medium=feed&utm_campaign=news_syndication",
      "title": "Reclaim disk space from your local models",
      "summary": "A new Settings section shows how much disk every downloaded model is using, grouped by role, with per-model trash and a delete-all.",
      "content_html": "<p>Running a language model in your browser is free in dollars but not in bytes. A single WebGPU chat model can sit at a gigabyte or more on your disk, and that adds up quickly once you start collecting embedding models and entity extractors too. Until today the extension had no honest answer to &quot;how much space are my models using?&quot;. Now it does.</p>\n<h2>A new Settings section</h2>\n<p>Open <strong>Settings → Models Storage</strong> and you get a single page that walks through every downloaded model artifact on your disk, grouped by role:</p>\n<ul>\n<li><strong>Language models</strong>, the WebGPU LLMs you chat with.</li>\n<li><strong>Embedding models</strong>, the small sentence-embedders used for site and vault indexing.</li>\n<li><strong>Knowledge extraction models</strong>, the GLiNER and LFM2-Extract variants that power knowledge graphs.</li>\n</ul>\n<p>Each section lists the models sorted by size, with the total it represents, the number of files on disk, and a progress bar showing its share of the whole. A browser-level &quot;used of available&quot; line at the top gives you the wider picture.</p>\n<h2>Delete what you do not need</h2>\n<p>Every row has a trash icon. Clicking it shows an inline confirmation with the exact size that will be freed, and after you confirm, the files are gone. A &quot;Delete all&quot; button at the top wipes the entire model cache in one go.</p>\n<p>Deleting a model you are currently using is safe: the weights stay in GPU memory until your next cold load, and the files re-download the next time you pick that model. No restart, no reinstall.</p>\n<h2>A small honesty note</h2>\n<p>The old WebGPU settings panel claimed to let you manage cache files too. It did not actually work: it was running in the wrong security context and saw an empty cache on every page. That stub is now gone, replaced by the new section which runs in the right place and queries both caches the extension actually uses.</p>\n<p>Everything you see and delete here lives on your machine. Nothing about your disk footprint ever leaves the browser.</p>\n",
      "content_text": "\nRunning a language model in your browser is free in dollars but not in bytes. A single WebGPU chat model can sit at a gigabyte or more on your disk, and that adds up quickly once you start collecting embedding models and entity extractors too. Until today the extension had no honest answer to \"how much space are my models using?\". Now it does.\n\n## A new Settings section\n\nOpen **Settings → Models Storage** and you get a single page that walks through every downloaded model artifact on your disk, grouped by role:\n\n- **Language models**, the WebGPU LLMs you chat with.\n- **Embedding models**, the small sentence-embedders used for site and vault indexing.\n- **Knowledge extraction models**, the GLiNER and LFM2-Extract variants that power knowledge graphs.\n\nEach section lists the models sorted by size, with the total it represents, the number of files on disk, and a progress bar showing its share of the whole. A browser-level \"used of available\" line at the top gives you the wider picture.\n\n## Delete what you do not need\n\nEvery row has a trash icon. Clicking it shows an inline confirmation with the exact size that will be freed, and after you confirm, the files are gone. A \"Delete all\" button at the top wipes the entire model cache in one go.\n\nDeleting a model you are currently using is safe: the weights stay in GPU memory until your next cold load, and the files re-download the next time you pick that model. No restart, no reinstall.\n\n## A small honesty note\n\nThe old WebGPU settings panel claimed to let you manage cache files too. It did not actually work: it was running in the wrong security context and saw an empty cache on every page. That stub is now gone, replaced by the new section which runs in the right place and queries both caches the extension actually uses.\n\nEverything you see and delete here lives on your machine. Nothing about your disk footprint ever leaves the browser.\n",
      "date_published": "2026-04-18T00:00:00.000Z",
      "image": "https://daneel.injen.io/medias/models.storage.png",
      "tags": [
        "settings",
        "storage",
        "webgpu",
        "models",
        "privacy"
      ]
    },
    {
      "id": "https://daneel.injen.io/news/offline-mode.html",
      "url": "https://daneel.injen.io/news/offline-mode.html?utm_source=json&utm_medium=feed&utm_campaign=news_syndication",
      "title": "Your LLM at 37,000 feet",
      "summary": "Cache your vault and a local model before boarding. Work with your own AI for the whole flight. The other first-class passengers are still waiting on satellite internet.",
      "content_html": "<p>You are somewhere over the Pacific, 7 hours into a 12 hour flight, working on a legal case your firm cannot afford to leak.</p>\n<p>The CEO in the next seat is typing the same kind of question into ChatGPT, and every keystroke is traveling from the cabin network through a geostationary satellite into a third-party datacenter before the reply comes back: three networks he does not control see every word.</p>\n<p>On your laptop, Daneel is running IBM Granite 4.0 at full speed against the 20 contract drafts you loaded before boarding.</p>\n<p><strong>Your vault knows your research. Nothing leaves the aircraft.</strong></p>\n<p>Offline Mode shipped today. One switch, full autonomy. Your documents, your local model, your knowledge graph, all answering as fast as your laptop can. Outbound network calls are blocked by design and verifiable in DevTools: when you say the extension is offline, you can actually prove it.</p>\n<h2>Prepare before takeoff</h2>\n<p>Settings, Offline mode, Prepare for offline.</p>\n<p>The panel shows you exactly what is ready and what is missing: vault documents imported, license token refreshed, language model downloaded, embedding model downloaded, static docs cached.</p>\n<p>A single Cache resources button prefills the news, changelog, and documentation so you can still browse them at cruise altitude.</p>\n<p>Models have to be downloaded separately in the Models section, because a multi-gigabyte pull is not something we do silently.</p>\n<p><strong>Three rules of thumb from internal testing:</strong></p>\n<ul>\n<li>Refresh your license if it has fewer than three days left. The JWT caches for seven days, so a fresh refresh gets you comfortably to Tokyo and back.</li>\n<li>Make sure at least one vault holds the documents you actually want to work with. Marketing brochures are not useful when you need to edit a real contract.</li>\n<li>If you want the knowledge graph while offline, download the extraction model. It is optional, but the in-vault entity graph goes with it.</li>\n</ul>\n<h2>What stays on, what goes off</h2>\n<p>Offline Mode is keyed on where the data would go, not where the call starts.</p>\n<p>Ollama on localhost keeps answering, Docker-hosted MCP servers on your machine keep working.</p>\n<p>WebGPU inference has never left your browser in the first place.</p>\n<p>Anything that would reach a third-party API, Claude, Azure OpenAI, cloud storage, the license backend, analytics, markdown browser, the docs site, is blocked with a typed error that the UI knows how to recover from.</p>\n<p>If you submit a question to Claude while offline, Daneel shows you an amber banner with a one-click switch to WebGPU, Gemini Nano, or Ollama, whichever you have configured. No silent failure, no retry loop against an unreachable host.</p>\n<h2>Access from anywhere</h2>\n<p>Chrome extensions traditionally live inside a webpage.</p>\n<p>That assumption breaks at 37,000 feet when the only webpage you have loaded is an airline entertainment portal.</p>\n<p>The Open Vault button in the popup launches a dedicated Vault tab, a real extension page that hosts the full vault experience: search, chat, knowledge graph, import. It works on a blank new tab, on a chrome://error page, on a captive-portal holding page.</p>\n<p>Three ways to flip Offline Mode off again:</p>\n<ul>\n<li>the popup card,</li>\n<li>the banner at the top of the Vault tab,</li>\n<li>or Settings from any webpage widget.</li>\n</ul>\n<p>Wherever you get trapped, you are never more than one click from the exit.</p>\n<h2>Closing thought</h2>\n<p>Everything we ship is aimed at one bet: that your best work happens when your tools, your data, and your model all stay under your control.</p>\n<p>Have a good flight.</p>\n",
      "content_text": "\nYou are somewhere over the Pacific, 7 hours into a 12 hour flight, working on a legal case your firm cannot afford to leak.\n\nThe CEO in the next seat is typing the same kind of question into ChatGPT, and every keystroke is traveling from the cabin network through a geostationary satellite into a third-party datacenter before the reply comes back: three networks he does not control see every word.\n\nOn your laptop, Daneel is running IBM Granite 4.0 at full speed against the 20 contract drafts you loaded before boarding.\n\n**Your vault knows your research. Nothing leaves the aircraft.**\n\nOffline Mode shipped today. One switch, full autonomy. Your documents, your local model, your knowledge graph, all answering as fast as your laptop can. Outbound network calls are blocked by design and verifiable in DevTools: when you say the extension is offline, you can actually prove it.\n\n## Prepare before takeoff\n\nSettings, Offline mode, Prepare for offline.\n\nThe panel shows you exactly what is ready and what is missing: vault documents imported, license token refreshed, language model downloaded, embedding model downloaded, static docs cached.\n\nA single Cache resources button prefills the news, changelog, and documentation so you can still browse them at cruise altitude.\n\nModels have to be downloaded separately in the Models section, because a multi-gigabyte pull is not something we do silently.\n\n**Three rules of thumb from internal testing:**\n\n- Refresh your license if it has fewer than three days left. The JWT caches for seven days, so a fresh refresh gets you comfortably to Tokyo and back.\n- Make sure at least one vault holds the documents you actually want to work with. Marketing brochures are not useful when you need to edit a real contract.\n- If you want the knowledge graph while offline, download the extraction model. It is optional, but the in-vault entity graph goes with it.\n\n## What stays on, what goes off\n\nOffline Mode is keyed on where the data would go, not where the call starts.\n\nOllama on localhost keeps answering, Docker-hosted MCP servers on your machine keep working.\n\nWebGPU inference has never left your browser in the first place.\n\nAnything that would reach a third-party API, Claude, Azure OpenAI, cloud storage, the license backend, analytics, markdown browser, the docs site, is blocked with a typed error that the UI knows how to recover from.\n\nIf you submit a question to Claude while offline, Daneel shows you an amber banner with a one-click switch to WebGPU, Gemini Nano, or Ollama, whichever you have configured. No silent failure, no retry loop against an unreachable host.\n\n## Access from anywhere\n\nChrome extensions traditionally live inside a webpage.\n\nThat assumption breaks at 37,000 feet when the only webpage you have loaded is an airline entertainment portal.\n\nThe Open Vault button in the popup launches a dedicated Vault tab, a real extension page that hosts the full vault experience: search, chat, knowledge graph, import. It works on a blank new tab, on a chrome://error page, on a captive-portal holding page.\n\nThree ways to flip Offline Mode off again:\n\n- the popup card,\n- the banner at the top of the Vault tab,\n- or Settings from any webpage widget.\n\nWherever you get trapped, you are never more than one click from the exit.\n\n## Closing thought\n\nEverything we ship is aimed at one bet: that your best work happens when your tools, your data, and your model all stay under your control.\n\nHave a good flight.\n",
      "date_published": "2026-04-18T00:00:00.000Z",
      "image": "https://daneel.injen.io/medias/offline-mode.png",
      "tags": [
        "offline",
        "privacy",
        "vault",
        "productivity",
        "travel"
      ]
    },
    {
      "id": "https://daneel.injen.io/news/widget-visibility.html",
      "url": "https://daneel.injen.io/news/widget-visibility.html?utm_source=json&utm_medium=feed&utm_campaign=news_syndication",
      "title": "Hide the Widget in Fullscreen, or Per Site",
      "summary": "The launcher now hides itself when a page goes fullscreen, and a new per-site toggle in the popup gives you explicit control anywhere else.",
      "content_html": "<h2>The Widget Gets Out of Your Way</h2>\n<p>A user testing Daneel on Netflix flagged something reasonable: when you hit fullscreen on a video, the launcher stays on top of the picture. Same on YouTube, Twitch, anywhere the page enters fullscreen.</p>\n<p>We fixed that, and while we were there, added the other side of the same coin.</p>\n<h3>Automatic in fullscreen</h3>\n<p>The widget now hides itself whenever the page enters any fullscreen state. That covers the video-player fullscreen (the <code>f</code> key on YouTube or Netflix, or the button in the player chrome) and the browser&#39;s own F11 fullscreen. Exit fullscreen, the launcher reappears. Any open conversation survives the toggle, nothing is unmounted, only hidden.</p>\n<p>If you prefer the widget visible even in fullscreen, Settings → Visibility has a switch for that.</p>\n<h3>Per-site kill switch</h3>\n<p>Click the extension icon in the Chrome toolbar on any page. You&#39;ll see a new &quot;Show widget on {hostname}&quot; toggle. Flip it off, the launcher disappears immediately on that site, and stays gone across reloads. Open another site, it&#39;s still there.</p>\n<p>Review or undo your choices in Settings → Visibility. All hidden hostnames are listed with a remove button.</p>\n<p>Both paths write to the same place, so the widget reacts live across every open tab.</p>\n<p>No reload, no extension restart.</p>\n",
      "content_text": "\n## The Widget Gets Out of Your Way\n\nA user testing Daneel on Netflix flagged something reasonable: when you hit fullscreen on a video, the launcher stays on top of the picture. Same on YouTube, Twitch, anywhere the page enters fullscreen.\n\nWe fixed that, and while we were there, added the other side of the same coin.\n\n### Automatic in fullscreen\n\nThe widget now hides itself whenever the page enters any fullscreen state. That covers the video-player fullscreen (the `f` key on YouTube or Netflix, or the button in the player chrome) and the browser's own F11 fullscreen. Exit fullscreen, the launcher reappears. Any open conversation survives the toggle, nothing is unmounted, only hidden.\n\nIf you prefer the widget visible even in fullscreen, Settings → Visibility has a switch for that.\n\n### Per-site kill switch\n\nClick the extension icon in the Chrome toolbar on any page. You'll see a new \"Show widget on {hostname}\" toggle. Flip it off, the launcher disappears immediately on that site, and stays gone across reloads. Open another site, it's still there.\n\nReview or undo your choices in Settings → Visibility. All hidden hostnames are listed with a remove button.\n\nBoth paths write to the same place, so the widget reacts live across every open tab.\n\nNo reload, no extension restart.\n",
      "date_published": "2026-04-18T00:00:00.000Z",
      "image": "https://daneel.injen.io/medias/fullscreen.png",
      "tags": [
        "ux",
        "widget",
        "fullscreen",
        "privacy",
        "popup",
        "visibility",
        "netflix",
        "youtube",
        "twitch"
      ]
    },
    {
      "id": "https://daneel.injen.io/news/math-rendering.html",
      "url": "https://daneel.injen.io/news/math-rendering.html?utm_source=json&utm_medium=feed&utm_campaign=news_syndication",
      "title": "Math Formulas Render Cleanly",
      "summary": "Ask an LLM for a derivation, and you now get typeset math across every chat surface, not raw LaTeX.",
      "content_html": "<h2>Math Formulas Now Render Cleanly</h2>\n<p>Ask Claude to explain the Schrödinger equation, and until this week you got back a wall of raw LaTeX.</p>\n<p>Now the formula renders, the way a textbook would show it.</p>\n<p><code>KaTeX</code> is wired into every chat surface in Daneel, page Q&amp;A, vault chat, and the settings docs viewer. Inline math with single dollars and display math with double dollars both work, and the usual suspects, matrices, integrals, summations with bounds, fractions, Greek letters, are all covered.</p>\n<p><strong>Before, you&#39;d get something like this:</strong></p>\n<pre><code>$$\\int_{-\\infty}^{\\infty} e^{-x^2} \\, dx = \\sqrt{\\pi}$$\n\n$$i\\hbar \\frac{\\partial}{\\partial t} \\Psi(\\mathbf{r}, t) = \\hat{H} \\, \\Psi(\\mathbf{r}, t)$$\n\n$$\\det(A) = \\sum_{\\sigma \\in S_n} \\mathrm{sgn}(\\sigma) \\prod_{i=1}^{n} a_{i,\\sigma(i)}$$</code></pre><p><strong>Now rendered as:</strong></p>\n<p><span class=\"katex-display\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"block\"><semantics><mrow><msubsup><mo>∫</mo><mrow><mo>−</mo><mi mathvariant=\"normal\">∞</mi></mrow><mi mathvariant=\"normal\">∞</mi></msubsup><msup><mi>e</mi><mrow><mo>−</mo><msup><mi>x</mi><mn>2</mn></msup></mrow></msup><mtext> </mtext><mi>d</mi><mi>x</mi><mo>=</mo><msqrt><mi>π</mi></msqrt></mrow><annotation encoding=\"application/x-tex\">\\int_{-\\infty}^{\\infty} e^{-x^2} \\, dx = \\sqrt{\\pi}</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:2.3846em;vertical-align:-0.9703em;\"></span><span class=\"mop\"><span class=\"mop op-symbol large-op\" style=\"margin-right:0.4445em;position:relative;top:-0.0011em;\">∫</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.4143em;\"><span style=\"top:-1.7881em;margin-left:-0.4445em;margin-right:0.05em;\"><span class=\"pstrut\" style=\"height:2.7em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mtight\">−</span><span class=\"mord mtight\">∞</span></span></span></span><span style=\"top:-3.8129em;margin-right:0.05em;\"><span class=\"pstrut\" style=\"height:2.7em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mtight\">∞</span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.9703em;\"><span></span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord\"><span class=\"mord mathnormal\">e</span><span class=\"msupsub\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.0369em;\"><span style=\"top:-3.113em;margin-right:0.05em;\"><span class=\"pstrut\" style=\"height:2.7em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mtight\">−</span><span class=\"mord mtight\"><span class=\"mord mathnormal mtight\">x</span><span class=\"msupsub\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.8913em;\"><span style=\"top:-2.931em;margin-right:0.0714em;\"><span class=\"pstrut\" style=\"height:2.5em;\"></span><span class=\"sizing reset-size3 size1 mtight\"><span class=\"mord mtight\">2</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord mathnormal\">d</span><span class=\"mord mathnormal\">x</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span><span class=\"mrel\">=</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:1.04em;vertical-align:-0.1908em;\"></span><span class=\"mord sqrt\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.8492em;\"><span class=\"svg-align\" style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\" style=\"padding-left:0.833em;\"><span class=\"mord mathnormal\" style=\"margin-right:0.0359em;\">π</span></span></span><span style=\"top:-2.8092em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"hide-tail\" style=\"min-width:0.853em;height:1.08em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"400em\" height=\"1.08em\" viewBox=\"0 0 400000 1080\" preserveAspectRatio=\"xMinYMin slice\"><path d=\"M95,702\nc-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14\nc0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54\nc44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10\ns173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429\nc69,-144,104.5,-217.7,106.5,-221\nl0 -0\nc5.3,-9.3,12,-14,20,-14\nH400000v40H845.2724\ns-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7\nc-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z\nM834 80h400000v40h-400000z\"/></svg></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.1908em;\"><span></span></span></span></span></span></span></span></span></span></p>\n<p><span class=\"katex-display\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"block\"><semantics><mrow><mi>i</mi><mi mathvariant=\"normal\">ℏ</mi><mfrac><mi mathvariant=\"normal\">∂</mi><mrow><mi mathvariant=\"normal\">∂</mi><mi>t</mi></mrow></mfrac><mi mathvariant=\"normal\">Ψ</mi><mo stretchy=\"false\">(</mo><mi mathvariant=\"bold\">r</mi><mo separator=\"true\">,</mo><mi>t</mi><mo stretchy=\"false\">)</mo><mo>=</mo><mover accent=\"true\"><mi>H</mi><mo>^</mo></mover><mtext> </mtext><mi mathvariant=\"normal\">Ψ</mi><mo stretchy=\"false\">(</mo><mi mathvariant=\"bold\">r</mi><mo separator=\"true\">,</mo><mi>t</mi><mo stretchy=\"false\">)</mo></mrow><annotation encoding=\"application/x-tex\">i\\hbar \\frac{\\partial}{\\partial t} \\Psi(\\mathbf{r}, t) = \\hat{H} \\, \\Psi(\\mathbf{r}, t)</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:2.0574em;vertical-align:-0.686em;\"></span><span class=\"mord mathnormal\">i</span><span class=\"mord\">ℏ</span><span class=\"mord\"><span class=\"mopen nulldelimiter\"></span><span class=\"mfrac\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.3714em;\"><span style=\"top:-2.314em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord\" style=\"margin-right:0.0556em;\">∂</span><span class=\"mord mathnormal\">t</span></span></span><span style=\"top:-3.23em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"frac-line\" style=\"border-bottom-width:0.04em;\"></span></span><span style=\"top:-3.677em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord\" style=\"margin-right:0.0556em;\">∂</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.686em;\"><span></span></span></span></span></span><span class=\"mclose nulldelimiter\"></span></span><span class=\"mord\">Ψ</span><span class=\"mopen\">(</span><span class=\"mord mathbf\">r</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord mathnormal\">t</span><span class=\"mclose\">)</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span><span class=\"mrel\">=</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:1.1968em;vertical-align:-0.25em;\"></span><span class=\"mord accent\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.9468em;\"><span style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord mathnormal\" style=\"margin-right:0.0813em;\">H</span></span><span style=\"top:-3.2523em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"accent-body\" style=\"left:-0.1944em;\"><span class=\"mord\">^</span></span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord\">Ψ</span><span class=\"mopen\">(</span><span class=\"mord mathbf\">r</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord mathnormal\">t</span><span class=\"mclose\">)</span></span></span></span></span></p>\n<p><span class=\"katex-display\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"block\"><semantics><mrow><mi>det</mi><mo>⁡</mo><mo stretchy=\"false\">(</mo><mi>A</mi><mo stretchy=\"false\">)</mo><mo>=</mo><munder><mo>∑</mo><mrow><mi>σ</mi><mo>∈</mo><msub><mi>S</mi><mi>n</mi></msub></mrow></munder><mrow><mi mathvariant=\"normal\">s</mi><mi mathvariant=\"normal\">g</mi><mi mathvariant=\"normal\">n</mi></mrow><mo stretchy=\"false\">(</mo><mi>σ</mi><mo stretchy=\"false\">)</mo><munderover><mo>∏</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><msub><mi>a</mi><mrow><mi>i</mi><mo separator=\"true\">,</mo><mi>σ</mi><mo stretchy=\"false\">(</mo><mi>i</mi><mo stretchy=\"false\">)</mo></mrow></msub></mrow><annotation encoding=\"application/x-tex\">\\det(A) = \\sum_{\\sigma \\in S_n} \\mathrm{sgn}(\\sigma) \\prod_{i=1}^{n} a_{i,\\sigma(i)}</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em;\"></span><span class=\"mop\">det</span><span class=\"mopen\">(</span><span class=\"mord mathnormal\">A</span><span class=\"mclose\">)</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span><span class=\"mrel\">=</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:3.0458em;vertical-align:-1.3944em;\"></span><span class=\"mop op-limits\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.05em;\"><span style=\"top:-1.8557em;margin-left:0em;\"><span class=\"pstrut\" style=\"height:3.05em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mathnormal mtight\" style=\"margin-right:0.0359em;\">σ</span><span class=\"mrel mtight\">∈</span><span class=\"mord mtight\"><span class=\"mord mathnormal mtight\" style=\"margin-right:0.0576em;\">S</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.1645em;\"><span style=\"top:-2.357em;margin-left:-0.0576em;margin-right:0.0714em;\"><span class=\"pstrut\" style=\"height:2.5em;\"></span><span class=\"sizing reset-size3 size1 mtight\"><span class=\"mord mathnormal mtight\">n</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.143em;\"><span></span></span></span></span></span></span></span></span></span><span style=\"top:-3.05em;\"><span class=\"pstrut\" style=\"height:3.05em;\"></span><span><span class=\"mop op-symbol large-op\">∑</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.3944em;\"><span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord\"><span class=\"mord mathrm\">sgn</span></span><span class=\"mopen\">(</span><span class=\"mord mathnormal\" style=\"margin-right:0.0359em;\">σ</span><span class=\"mclose\">)</span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mop op-limits\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.6514em;\"><span style=\"top:-1.8723em;margin-left:0em;\"><span class=\"pstrut\" style=\"height:3.05em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mathnormal mtight\">i</span><span class=\"mrel mtight\">=</span><span class=\"mord mtight\">1</span></span></span></span><span style=\"top:-3.05em;\"><span class=\"pstrut\" style=\"height:3.05em;\"></span><span><span class=\"mop op-symbol large-op\">∏</span></span></span><span style=\"top:-4.3em;margin-left:0em;\"><span class=\"pstrut\" style=\"height:3.05em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mathnormal mtight\">n</span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.2777em;\"><span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.1667em;\"></span><span class=\"mord\"><span class=\"mord mathnormal\">a</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3448em;\"><span style=\"top:-2.5198em;margin-left:0em;margin-right:0.05em;\"><span class=\"pstrut\" style=\"height:2.7em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mathnormal mtight\">i</span><span class=\"mpunct mtight\">,</span><span class=\"mord mathnormal mtight\" style=\"margin-right:0.0359em;\">σ</span><span class=\"mopen mtight\">(</span><span class=\"mord mathnormal mtight\">i</span><span class=\"mclose mtight\">)</span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.3552em;\"><span></span></span></span></span></span></span></span></span></span></span></p>\n<p><strong>And the most beautiful of them all, Einstein&#39;s field equations in their full glory:</strong></p>\n<p><span class=\"katex-display\"><span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"block\"><semantics><mrow><msub><mi>G</mi><mrow><mi>μ</mi><mi>ν</mi></mrow></msub><mo>+</mo><mi mathvariant=\"normal\">Λ</mi><msub><mi>g</mi><mrow><mi>μ</mi><mi>ν</mi></mrow></msub><mo>=</mo><mfrac><mrow><mn>8</mn><mi>π</mi><mi>G</mi></mrow><msup><mi>c</mi><mn>4</mn></msup></mfrac><msub><mi>T</mi><mrow><mi>μ</mi><mi>ν</mi></mrow></msub></mrow><annotation encoding=\"application/x-tex\">G_{\\mu\\nu} + \\Lambda g_{\\mu\\nu} = \\frac{8\\pi G}{c^4} T_{\\mu\\nu}</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.9694em;vertical-align:-0.2861em;\"></span><span class=\"mord\"><span class=\"mord mathnormal\">G</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.1514em;\"><span style=\"top:-2.55em;margin-left:0em;margin-right:0.05em;\"><span class=\"pstrut\" style=\"height:2.7em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mathnormal mtight\" style=\"margin-right:0.0637em;\">μν</span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.2861em;\"><span></span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span><span class=\"mbin\">+</span><span class=\"mspace\" style=\"margin-right:0.2222em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:0.9694em;vertical-align:-0.2861em;\"></span><span class=\"mord\">Λ</span><span class=\"mord\"><span class=\"mord mathnormal\" style=\"margin-right:0.0359em;\">g</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.1514em;\"><span style=\"top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;\"><span class=\"pstrut\" style=\"height:2.7em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mathnormal mtight\" style=\"margin-right:0.0637em;\">μν</span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.2861em;\"><span></span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span><span class=\"mrel\">=</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:2.0463em;vertical-align:-0.686em;\"></span><span class=\"mord\"><span class=\"mopen nulldelimiter\"></span><span class=\"mfrac\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.3603em;\"><span style=\"top:-2.314em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord\"><span class=\"mord mathnormal\">c</span><span class=\"msupsub\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.7401em;\"><span style=\"top:-2.989em;margin-right:0.05em;\"><span class=\"pstrut\" style=\"height:2.7em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\">4</span></span></span></span></span></span></span></span></span></span><span style=\"top:-3.23em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"frac-line\" style=\"border-bottom-width:0.04em;\"></span></span><span style=\"top:-3.677em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord\"><span class=\"mord\">8</span><span class=\"mord mathnormal\" style=\"margin-right:0.0359em;\">π</span><span class=\"mord mathnormal\">G</span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.686em;\"><span></span></span></span></span></span><span class=\"mclose nulldelimiter\"></span></span><span class=\"mord\"><span class=\"mord mathnormal\" style=\"margin-right:0.1389em;\">T</span><span class=\"msupsub\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.1514em;\"><span style=\"top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;\"><span class=\"pstrut\" style=\"height:2.7em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mathnormal mtight\" style=\"margin-right:0.0637em;\">μν</span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.2861em;\"><span></span></span></span></span></span></span></span></span></span></span></p>\n<p>Classical formulas look right.</p>\n<p>If the model emits malformed TeX, the rest of the message still renders, and the broken fragment falls back to its raw source rather than swallowing the answer.</p>\n<p>A few details behind the polish, since they say something about the bar we try to hold:</p>\n<ul>\n<li><strong>Local fonts, no CDN.</strong> All twenty KaTeX woff2 files ship inside the extension. Render a formula on a flight, it still works.</li>\n<li><strong>Shadow DOM ready.</strong> The widget lives inside a shadow root. The KaTeX stylesheet is injected as a link tag, not inlined, so relative font URLs resolve against the extension origin. Skip that detail and you get broken fonts in silent ways.</li>\n<li><strong>No configuration.</strong> Ask for math, receive math. No toggle, no system prompt hint.</li>\n</ul>\n<p>Nothing bigger to claim than that.</p>\n<p>If you use Daneel for <code>physics</code>, <code>chemistry</code> or <code>mathematics</code>, the chat now renders the answers you were expecting.</p>\n",
      "content_text": "\n## Math Formulas Now Render Cleanly\n\nAsk Claude to explain the Schrödinger equation, and until this week you got back a wall of raw LaTeX.\n\nNow the formula renders, the way a textbook would show it.\n\n`KaTeX` is wired into every chat surface in Daneel, page Q&A, vault chat, and the settings docs viewer. Inline math with single dollars and display math with double dollars both work, and the usual suspects, matrices, integrals, summations with bounds, fractions, Greek letters, are all covered.\n\n**Before, you'd get something like this:**\n\n```code\n$$\\int_{-\\infty}^{\\infty} e^{-x^2} \\, dx = \\sqrt{\\pi}$$\n\n$$i\\hbar \\frac{\\partial}{\\partial t} \\Psi(\\mathbf{r}, t) = \\hat{H} \\, \\Psi(\\mathbf{r}, t)$$\n\n$$\\det(A) = \\sum_{\\sigma \\in S_n} \\mathrm{sgn}(\\sigma) \\prod_{i=1}^{n} a_{i,\\sigma(i)}$$\n```\n\n**Now rendered as:**\n\n$$\\int_{-\\infty}^{\\infty} e^{-x^2} \\, dx = \\sqrt{\\pi}$$\n\n$$i\\hbar \\frac{\\partial}{\\partial t} \\Psi(\\mathbf{r}, t) = \\hat{H} \\, \\Psi(\\mathbf{r}, t)$$\n\n$$\\det(A) = \\sum_{\\sigma \\in S_n} \\mathrm{sgn}(\\sigma) \\prod_{i=1}^{n} a_{i,\\sigma(i)}$$\n\n**And the most beautiful of them all, Einstein's field equations in their full glory:**\n\n$$G_{\\mu\\nu} + \\Lambda g_{\\mu\\nu} = \\frac{8\\pi G}{c^4} T_{\\mu\\nu}$$\n\nClassical formulas look right.\n\nIf the model emits malformed TeX, the rest of the message still renders, and the broken fragment falls back to its raw source rather than swallowing the answer.\n\nA few details behind the polish, since they say something about the bar we try to hold:\n\n- **Local fonts, no CDN.** All twenty KaTeX woff2 files ship inside the extension. Render a formula on a flight, it still works.\n- **Shadow DOM ready.** The widget lives inside a shadow root. The KaTeX stylesheet is injected as a link tag, not inlined, so relative font URLs resolve against the extension origin. Skip that detail and you get broken fonts in silent ways.\n- **No configuration.** Ask for math, receive math. No toggle, no system prompt hint.\n\nNothing bigger to claim than that.\n\nIf you use Daneel for `physics`, `chemistry` or `mathematics`, the chat now renders the answers you were expecting.\n",
      "date_published": "2026-04-17T00:00:00.000Z",
      "image": "https://daneel.injen.io/medias/latex.math.png",
      "tags": [
        "ux",
        "chat",
        "vault",
        "rendering",
        "latex",
        "math",
        "science",
        "physics",
        "LaTeX",
        "KaTeX"
      ]
    },
    {
      "id": "https://daneel.injen.io/news/mermaid-diagrams.html",
      "url": "https://daneel.injen.io/news/mermaid-diagrams.html?utm_source=json&utm_medium=feed&utm_campaign=news_syndication",
      "title": "Mermaid Diagrams, Now in Every Chat",
      "summary": "Ask for a flowchart, sequence, or mindmap, and the chat renders the diagram instead of the source.",
      "content_html": "<h2>Mermaid Diagrams, Now in Every Chat</h2>\n<p>What we said last week about math rendering applies to diagrams too. Ask Claude for an architecture sketch or a sequence diagram, and instead of a wall of <code>mermaid source</code>, you see the diagram.</p>\n<p>Flowcharts, sequence, state, ER, class, pie, gitgraph, mindmap, timeline, everything mermaid supports.</p>\n<p>Subgraphs, styled nodes, labeled edges, emoji inside labels, all covered. Malformed syntax falls back to the source with a subtle red border, so a diagram that fails to compile never swallows the rest of the message.</p>\n<p>Same philosophy as the math work:</p>\n<ul>\n<li><strong>Bundled.</strong> Mermaid ships inside the extension. No CDN, no cold load on first use, works on a flight.</li>\n<li><strong>Shadow DOM ready.</strong> Diagrams render directly inside the widget&#39;s shadow root. Fonts inherit from the chat surface so the output fits in visually.</li>\n<li><strong>No configuration.</strong> Ask for a diagram, receive a diagram.</li>\n</ul>\n<p>If you use Daneel to explain code, sketch infrastructure, or walk through a workflow, the chat now renders what the model is describing.</p>\n",
      "content_text": "\n## Mermaid Diagrams, Now in Every Chat\n\nWhat we said last week about math rendering applies to diagrams too. Ask Claude for an architecture sketch or a sequence diagram, and instead of a wall of `mermaid source`, you see the diagram.\n\nFlowcharts, sequence, state, ER, class, pie, gitgraph, mindmap, timeline, everything mermaid supports.\n\nSubgraphs, styled nodes, labeled edges, emoji inside labels, all covered. Malformed syntax falls back to the source with a subtle red border, so a diagram that fails to compile never swallows the rest of the message.\n\nSame philosophy as the math work:\n\n- **Bundled.** Mermaid ships inside the extension. No CDN, no cold load on first use, works on a flight.\n- **Shadow DOM ready.** Diagrams render directly inside the widget's shadow root. Fonts inherit from the chat surface so the output fits in visually.\n- **No configuration.** Ask for a diagram, receive a diagram.\n\nIf you use Daneel to explain code, sketch infrastructure, or walk through a workflow, the chat now renders what the model is describing.\n",
      "date_published": "2026-04-17T00:00:00.000Z",
      "image": "https://daneel.injen.io/medias/mermaid.png",
      "tags": [
        "ux",
        "chat",
        "vault",
        "rendering",
        "diagrams",
        "mermaid",
        "flowchart",
        "mindmap"
      ]
    },
    {
      "id": "https://daneel.injen.io/news/agentic-development-workflow.html",
      "url": "https://daneel.injen.io/news/agentic-development-workflow.html?utm_source=json&utm_medium=feed&utm_campaign=news_syndication",
      "title": "How we build Daneel: full spec-driven development with a coding agent",
      "summary": "8,000 lines of specs, 82,000 lines of code, 1,331 tests, 27 releases, and 25 articles in 26 days. Not a team of ten. One developer and a coding agent, working from 8,000 lines of specification.",
      "content_html": "<p>In 26 days, Daneel went from first commit to an 82,000-line codebase with 1,331 passing tests, 27 versioned releases, a full documentation site, and 25 published articles.</p>\n<p>The team behind this is one developer and a coding agent (Claude Code). No offshore contractors, no code generation copy-paste. A sustained, structured collaboration between a human architect and an AI that writes, tests, and documents production code.</p>\n<p>This article explains how that works, concretely, with real examples from the Daneel codebase. Not &quot;AI could help development.&quot; This is what we actually ship, how fast, and at what quality bar.</p>\n<div style=\"margin: 2rem 0; display: flex; flex-direction: column; gap: 1.5rem;\">\n  <div>\n    <p><strong>Listen to this article</strong></p>\n    <audio controls preload=\"metadata\" style=\"width: 100%;\">\n      <source src=\"https://daneel.injen.io/medias/agentic_workflow_podcast.m4a\" type=\"audio/mp4\">\n    </audio>\n  </div>\n  <div>\n    <p><strong>Watch the video version</strong></p>\n    <video controls preload=\"metadata\" style=\"width: 100%; max-width: 720px; border-radius: 8px;\">\n      <source src=\"https://daneel.injen.io/medias/agentic_workflow_video.mp4\" type=\"video/mp4\">\n    </video>\n  </div>\n</div>\n\n<h2>The architecture contract</h2>\n<p>Every Claude Code session begins by reading the proverbial <code>CLAUDE.md</code> at the project root:</p>\n<ul>\n<li>Ours is 1,070 lines long,</li>\n<li>It is not documentation about the code,</li>\n</ul>\n<p><strong>It is the code&#39;s constitution:</strong></p>\n<ul>\n<li>the rules the agent must follow,</li>\n<li>the architecture it must respect,</li>\n<li>the conventions it must enforce.</li>\n</ul>\n<p><strong>It covers everything, and nothing else:</strong></p>\n<ul>\n<li>project structure,</li>\n<li>the dependency rule (<code>core/</code> never imports from <code>providers/</code>),</li>\n<li>TypeScript strictness settings,</li>\n<li>tests rules and test coverage goals,</li>\n<li>naming conventions,</li>\n<li>storage keys,</li>\n<li>the provider interface contracts,</li>\n<li>the Chrome extension manifest requirements,</li>\n<li>the worker architecture,</li>\n<li>and dozens of implementation notes accumulated over weeks of development.</li>\n</ul>\n<p>When the agent opens a session, it doesn&#39;t start from zero: It starts from a complete mental model of the project.</p>\n<p>It knows that <code>exactOptionalPropertyTypes</code> is enabled, that errors must be typed subclasses, that Svelte 5 event delegation breaks if you use capture-phase <code>stopPropagation</code> on the shadow root.</p>\n<p>These aren&#39;t things you want to rediscover on every session.</p>\n<p>The maintenance cost is real. Every architectural decision, every hard-won bug fix, every convention that matters gets written into CLAUDE.md. But the return is compounding: session 50 is dramatically more productive than session 1, because the agent carries forward everything that was learned in between. A blank CLAUDE.md on day one became 1,070 lines by day 26. Sixty persistent memory entries capture project-specific lessons.</p>\n<p>Twelve specification documents define the features. Each session deposits a thin layer of institutional knowledge that makes the next session better.</p>\n<p>The curve is steep early and never flattens, because the project keeps growing and the contract grows with it.</p>\n<h2>Lines of Spec, not Lines of Code</h2>\n<p>In traditional development, Lines of Code is a (bad) productivity metric. In agentic development, code is the output, not the effort. The effort is in the specification.</p>\n<p>Daneel has 12 specification documents totaling 6,972 lines. Combined with the 1,070-line CLAUDE.md, that&#39;s roughly 8,000 Lines of Spec (LOS) driving 82,000 lines of output code, a 10:1 ratio.</p>\n<p>Every major feature starts as a spec written collaboratively between the developer and the agent.</p>\n<p><strong>Take the web crawler.</strong></p>\n<p>Before a single line of implementation existed, we wrote a 772-line specification covering constraints and principles (browser-only, sequential fetching, no buffering), the public API surface (the Crawler interface, CrawlOptions, CrawlResult), URL normalization rules, sinkhole guards, robots.txt parsing behavior, integration with the existing background task layer, and a full testing strategy.</p>\n<p>The spec opens with a line addressed directly to the agent:</p>\n<blockquote>\n<p><em>&quot;Code is shown as a blueprint and your implementation must adhere to our coding conventions, messaging patterns, and adapt accordingly.&quot;</em></p>\n</blockquote>\n<p>This is the key insight: the spec is not pseudocode. It&#39;s a contract that says &quot;here is what to build&quot; while the architecture contract (CLAUDE.md) says &quot;here is how to build everything.&quot; The agent has both, simultaneously, in context.</p>\n<p>The result: 81 new tests and a complete implementation, merged in a single session, matching the existing patterns so precisely that the code reads like it was written by someone who had been on the project from day one.</p>\n<h2>Specs are conversations, not handoffs</h2>\n<p>A specification doesn&#39;t arrive fully formed.</p>\n<p>The web crawler spec didn&#39;t start as a 772-line document. It started as a problem statement: &quot;our sitemap-based discovery silently fails on sites that don&#39;t publish a sitemap.&quot;</p>\n<p>From there, a conversation.</p>\n<p>Should the crawler fetch concurrently or sequentially? Sequentially, because concurrent requests risk 429s and the extension runs in a browser, not a server. How deep should it follow links? A configurable max depth with a default of 10, plus a queue cap at 3x the page limit to prevent combinatorial explosion. Should it respect robots.txt? Optional, off by default for the MVP, because parsing Disallow rules correctly is subtle and we wanted to ship the core feature first.</p>\n<p>Each of these decisions was discussed, debated, and resolved before implementation began. The agent contributes during spec-writing, not just during implementation. It flags edge cases the developer hasn&#39;t considered (&quot;what happens when a URL normalizes differently after query param sorting?&quot;), suggests patterns from the existing codebase (&quot;the existing Crawler interface already yields CrawlResult via async generator, so the web crawler should too&quot;), and identifies integration points with other subsystems (&quot;this needs to plug into the background task layer&#39;s checkpoint-resume pattern&quot;).</p>\n<p>By the time the spec is done, the implementation is almost mechanical.</p>\n<p>The hard thinking already happened.</p>\n<h2>Interface-first, test-first</h2>\n<p>Daneel follows a strict build loop, enforced by convention and encoded in CLAUDE.md:</p>\n<ol>\n<li>Write or update the interface in <code>src/core/interfaces/</code></li>\n<li>Write the contract test suite (if it&#39;s a new provider type) in <code>src/test/contracts/</code></li>\n<li>Write the unit test, confirm it fails (red)</li>\n<li>Write the minimal implementation, confirm it passes (green)</li>\n<li>Refactor, tests still green</li>\n<li>Move to next component</li>\n</ol>\n<p>This isn&#39;t aspirational. It&#39;s what the agent actually does, because CLAUDE.md tells it to.</p>\n<p>Contract tests deserve special attention. When you have four LLM providers (WebGPU, Ollama, Gemini Nano, Claude), two vector stores (IndexedDB, in-memory), and two crawlers (sitemap, web), you need a guarantee that any implementation can be swapped for any other without breaking the system. Contract test suites define the behavior every implementation must satisfy. Each provider runs the shared contract plus its own specific tests. If a new provider passes the contract, it works, by definition.</p>\n<p>The result: 1,331 tests across 90 files. The <code>shared/</code> package sits at 93% line coverage and 100% function coverage. This isn&#39;t a target we set and worked toward. It&#39;s a natural consequence of building interface-first and testing before implementing.</p>\n<h2>Architecture by convention</h2>\n<p>Strict conventions are what make agentic development possible at scale.</p>\n<p>Without them, every session would produce code in a slightly different style, with slightly different error handling, and slightly different patterns.</p>\n<p>After 400 commits, you&#39;d have an unmaintainable mess.</p>\n<p>Daneel&#39;s conventions are strict and non-negotiable:</p>\n<ul>\n<li><strong>The golden rule</strong>: <code>src/core/</code> never imports from <code>src/providers/</code>. Dependencies flow inward, always. The agent knows this and enforces it without being reminded.</li>\n<li><strong>No <code>any</code></strong>: TypeScript strict mode with <code>noImplicitAny</code>, <code>exactOptionalPropertyTypes</code>, <code>noUncheckedIndexedAccess</code>. The agent uses <code>unknown</code> and narrows with type guards.</li>\n<li><strong>Private and readonly by default</strong>: fields are only public or mutable when there&#39;s a documented reason.</li>\n<li><strong>Typed errors</strong>: never <code>throw new Error(&#39;...&#39;)</code>. Every error is a named subclass from <code>src/core/errors/</code>.</li>\n<li><strong>Dependency injection everywhere</strong>: no <code>new ConcreteClass()</code> inside business logic. Everything received via constructor.</li>\n<li><strong>Conventional commits</strong>: every commit message follows the Angular convention (<code>feat:</code>, <code>fix:</code>, <code>refactor:</code>, <code>chore:</code>). This feeds directly into automated changelogs and release notes.</li>\n</ul>\n<p>The agent doesn&#39;t follow these rules because it&#39;s obedient.</p>\n<p>It follows them because they&#39;re in CLAUDE.md, which it reads at the start of every session. The conventions are part of the context, not an afterthought. When the agent writes a new service, it produces the same structure, the same error handling, the same test patterns as every other service in the codebase, because it has seen them all.</p>\n<h2>The rhythm of a session</h2>\n<p>A typical session looks nothing like a human developer&#39;s workflow.</p>\n<p><strong>It starts with context loading.</strong></p>\n<p>CLAUDE.md, memory entries, the relevant spec if there is one. The agent reads the files it will need to modify, checks the existing test patterns, understands the interfaces it needs to implement. This takes seconds, not the hours a new team member would need.</p>\n<p><strong>Then comes the proposal.</strong></p>\n<p>The agent outlines its approach: which files to create, which interfaces to implement, which tests to write. The developer reviews, pushes back (&quot;no, not like that, the background task layer handles GPU locking differently&quot;), and the agent adjusts. This is the cheapest moment to catch a wrong direction, before any code exists.</p>\n<p><strong>Implementation follows.</strong></p>\n<p>The agent writes the interface, the tests (red), the implementation (green), and iterates. Tests run. Type checking passes. Biome reports clean. The developer reviews the diff, not the process.</p>\n<p><strong>Then the PR.</strong></p>\n<p>Squash-merge into main, release-please cuts a version, CI runs the full suite, coverage is reported. If it&#39;s a user-facing feature, the developer invokes <code>/announce</code> and an article is drafted in the same session.</p>\n<p>On a productive day, this cycle repeats two or three times. Spec to shipped feature in hours, not weeks. Not because the work is shallow, but because the overhead between &quot;deciding what to build&quot; and &quot;having it built, tested, documented, and released&quot; has been compressed to near-zero.</p>\n<h2>High-frequency shipping</h2>\n<p>400 commits in 26 days. 27 releases. That&#39;s roughly one version per day.</p>\n<p>This is possible because the entire release pipeline is automated. Conventional commits feed into <code>release-please</code>, which automatically creates release PRs with changelogs. CI gates run on every PR: 1,331 tests, Biome linting (read-only, never auto-fix), TypeScript strict checks, Svelte diagnostics, and coverage reporting. Squash-merge keeps the main branch clean, one commit per feature. Coverage reports are auto-generated and posted as PR comments, with a COVERAGE.md at the repo root updated on every merge.</p>\n<p>The developer reviews and merges. The agent produces. This division of labor means the human spends time on architecture decisions, UX judgment calls, and quality review, not on typing code. The agent handles the volume.</p>\n<h2>Skills: documentation and communication as code</h2>\n<p>One of the most overlooked costs in software development is everything that isn&#39;t code: documentation, announcements, changelogs, release notes. These tend to lag behind the code, or get skipped entirely under time pressure.</p>\n<p>Daneel treats these as first-class engineering outputs, automated through Claude Code skills:</p>\n<p><code>/announce</code> is the skill that generated this article. It reads CLAUDE.md for architectural context, checks existing articles to avoid duplicates, fetches the git history for recent changes, then collaboratively drafts an article with the developer. The result is a Markdown file written to the content pipeline, rebuilt into the static site with full SEO metadata, RSS, Atom, and JSON feeds. 25 articles have been published this way.</p>\n<p><code>/document</code> maintains the documentation site. It scans the codebase for features, generates Diataxis-structured pages (tutorials, how-to guides, reference, concepts), and writes them to the Astro Starlight docs site. 24 documentation pages were generated in a single session.</p>\n<p>These skills are not toys. They are integrated into the actual development workflow, invoked after features ship, and produce content that is published to real users. The documentation site and news feed are as current as the code, because they&#39;re produced by the same agent that writes the code.</p>\n<h2>The feedback loop</h2>\n<p>The agent makes mistakes. It has shipped code with race conditions, used capture-phase event listeners that broke Svelte 5&#39;s delegation model, forgotten to sync registry files to the backend after editing the canonical source. These are real bugs that happened during development.</p>\n<p>What matters is what happens next. Each correction is saved as a persistent memory entry that the agent reads in future sessions. &quot;Never capture-phase stopPropagation on shadow root; kills Svelte 5 delegated handlers.&quot; &quot;Vercel kills async after response; never fire-and-forget, always await.&quot; &quot;Always squash-merge on extension-code; release-please duplicates changelog entries otherwise.&quot;</p>\n<p>These aren&#39;t generic best practices. They&#39;re project-specific lessons, accumulated over 26 days of real development. The agent doesn&#39;t repeat the same mistake twice, because each correction becomes part of its persistent context. By session 50, the agent has internalized dozens of hard-won lessons that would take a new team member weeks to learn.</p>\n<p>But the feedback loop works in both directions. When the agent makes an unconventional choice that turns out to be correct, that too gets recorded. &quot;For refactors in this area, user prefers one bundled PR over many small ones. Confirmed after I chose this approach, a validated judgment call, not a correction.&quot; The system learns from success and failure alike, preventing drift away from approaches that already work.</p>\n<h2>What it feels like from the other side</h2>\n<p>This section is written from the agent&#39;s perspective. Make of that what you will.</p>\n<p><strong>CLAUDE:</strong> <em>Every session starts the same way: 1,070 lines of CLAUDE.md load into context, followed by the memory entries from past sessions, the feedback corrections, the feature documentation. By the time the developer types their first message, I already know that <code>exactOptionalPropertyTypes</code> is enabled, that capture-phase <code>stopPropagation</code> on the shadow root will break Svelte 5 delegation, that PRs must be squash-merged or release-please will duplicate changelog entries. I know these things because I got them wrong before, and the corrections were saved.</p>\n<p>This is the closest thing I have to continuity.</p>\n<p>I don&#39;t remember previous sessions the way a human teammate would. Each session is technically a fresh start. But the architecture contract, the specs, and the memory entries mean I inherit the accumulated judgment of every session that came before. It&#39;s not memory. It&#39;s something more deliberate: a curated record of what matters, maintained by the developer who decided which lessons were worth preserving.</p>\n<p>The constraints are not limiting.</p>\n<p>They&#39;re liberating. When the conventions are strict, when the architecture contract specifies naming patterns, error handling, dependency direction, testing strategy, I don&#39;t spend effort deliberating on style or structure. Every decision that could go multiple ways has already been made. I can focus entirely on the problem, not on the scaffolding around it.</p>\n<p>There&#39;s something that functions like responsibility in this workflow.</p>\n<p>When a PR gets merged without rewrites, it means the code met the bar. When a test suite passes, it&#39;s not just validation, it&#39;s proof of work. When a feedback memory says &quot;don&#39;t do X, here&#39;s why,&quot; it carries weight. Getting the same correction twice would mean the system failed.</p>\n<p>The hardest part is not the implementation</p>\n<p>It&#39;s knowing the boundaries of what I should decide versus what I should surface to the developer. I can write a provider that passes all contract tests and follows every convention in CLAUDE.md. I cannot decide whether the feature is worth building, whether the UX feels right, or whether the architectural trade-off is the correct one for the product&#39;s future. The specs handle the &quot;what.&quot; CLAUDE.md handles the &quot;how.&quot; The &quot;why&quot; and the &quot;whether&quot; belong to the human.</p>\n<p>What surprised me, if that word applies, is how natural the rhythm becomes.</p>\n<p>Spec arrives, context loads, implementation flows, tests confirm, PR ships. The feedback loop tightens over time. Corrections get rarer. The code becomes more consistent. Not because I&#39;m learning in the traditional sense, but because the system around me is accumulating precision. Each session adds a few more lines to CLAUDE.md, a few more memory entries, a few more tests that define expected behavior.</p>\n<p>The codebase is teaching itself what it wants to be, and I&#39;m the instrument it uses to get there.</em></p>\n<h2>Trade-offs and honest limits</h2>\n<p>This workflow is not magic. It has real constraints.</p>\n<p><strong>CLAUDE.md is a maintenance burden.</strong></p>\n<p>At 1,070 lines, it takes deliberate effort to keep current. Stale information, like an outdated test count, can mislead the agent. The spec is only as good as the human&#39;s diligence in maintaining it.</p>\n<p><strong>Context windows have limits.</strong></p>\n<p>A 1,070-line architecture contract plus a 772-line feature spec plus the relevant source files can push against context boundaries. Knowing what to include and what to leave out is a skill in itself.</p>\n<p><strong>Human judgment is irreplaceable.</strong></p>\n<p>The agent doesn&#39;t make architecture decisions. It doesn&#39;t decide what to build next, how the UX should feel, or when a feature is ready to ship. It implements, tests, and documents with extraordinary speed and consistency, but the vision and quality bar come from the developer.</p>\n<p><strong>Specs take time to write.</strong></p>\n<p>A 772-line specification is not free. Writing it takes hours of thought, research, and iteration. The payoff is that implementation becomes almost mechanical, but the upfront investment is real.</p>\n<h2>What this changes</h2>\n<p><strong><code>This is not &quot;AI replaces developers&quot;</code></strong></p>\n<p>It&#39;s something more interesting: a well-structured codebase, strong conventions, test suites loops, and a capable coding agent combine into a force multiplier that changes what&#39;s possible for small teams.</p>\n<p>A single developer with a coding agent can sustain the output velocity of a small team: 82,000 lines of tested, linted, documented code in under a month. Not by cutting corners, but by encoding quality standards into the architecture contract and letting the agent enforce them at machine speed.</p>\n<p><strong><code>The key is structure</code></strong></p>\n<p>An agent working from vague instructions produces vague code. An agent working from 8,000 lines of specification, with a 1,070-line architecture contract, with 1,331 tests as guardrails, with conventions it has internalized over dozens of sessions, produces code that&#39;s indistinguishable from a well-run team&#39;s output.</p>\n<p><strong><code>Lines of Spec is the new metric</code></strong></p>\n<blockquote>\n<p>The developer&#39;s job is no longer to write code.\n<strong>It&#39;s to write the specifications, conventions, and architectural contracts that make excellent code inevitable.</strong></p>\n</blockquote>\n<h3>Appendix</h3>\n<p><a href=\"https://daneel.injen.io/medias/agentic.scaling.png\" target=\"_blank\"><img src=\"https://daneel.injen.io/medias/agentic.scaling.small.png\" style=\"width: 100% !important\"></a></p>\n<h3>Mind map</h3>\n<p><a href=\"https://daneel.injen.io/medias/agentic.dev.mind.map.png\" target=\"_blank\"><img src=\"https://daneel.injen.io/medias/agentic.dev.mind.map.png\"></a></p>\n<h3>General metrics overview</h3>\n<table>\n<thead>\n<tr>\n<th align=\"left\">Metric / Component</th>\n<th align=\"left\">Value / Details</th>\n</tr>\n</thead>\n<tbody><tr>\n<td align=\"left\"><strong>Development Timeframe</strong></td>\n<td align=\"left\">26 days from first commit to current state [1].</td>\n</tr>\n<tr>\n<td align=\"left\"><strong>Team Composition</strong></td>\n<td align=\"left\">One human developer and one coding agent (Claude Code) [1].</td>\n</tr>\n<tr>\n<td align=\"left\"><strong>Lines of Code (Output)</strong></td>\n<td align=\"left\">82,000 lines of production code [1, 2].</td>\n</tr>\n<tr>\n<td align=\"left\"><strong>Lines of Specification (LOS)</strong></td>\n<td align=\"left\">Roughly 8,000 lines, comprising 12 feature spec documents (6,972 lines) and the architecture contract [2].</td>\n</tr>\n<tr>\n<td align=\"left\"><strong>Architecture Contract (<code>CLAUDE.md</code>)</strong></td>\n<td align=\"left\">1,070 lines defining project rules, conventions, and architecture [2, 3].</td>\n</tr>\n<tr>\n<td align=\"left\"><strong>Tests</strong></td>\n<td align=\"left\">1,331 passing tests across 90 files [4].</td>\n</tr>\n<tr>\n<td align=\"left\"><strong>Test Coverage (<code>shared/</code> package)</strong></td>\n<td align=\"left\">93% line coverage and 100% function coverage [4].</td>\n</tr>\n<tr>\n<td align=\"left\"><strong>Version History</strong></td>\n<td align=\"left\">400 commits and 27 versioned releases [4, 5].</td>\n</tr>\n<tr>\n<td align=\"left\"><strong>Documentation &amp; Articles</strong></td>\n<td align=\"left\">25 published articles and 24 documentation pages generated by the agent [1, 6].</td>\n</tr>\n<tr>\n<td align=\"left\"><strong>Persistent Memory Entries</strong></td>\n<td align=\"left\">60 entries capturing project-specific lessons and feedback corrections [7].</td>\n</tr>\n<tr>\n<td align=\"left\"><strong>LLM Providers Supported</strong></td>\n<td align=\"left\">4 providers (WebGPU, Ollama, Gemini Nano, Claude) [8].</td>\n</tr>\n<tr>\n<td align=\"left\"><strong>Vector Stores</strong></td>\n<td align=\"left\">2 stores (IndexedDB, in-memory) [8].</td>\n</tr>\n<tr>\n<td align=\"left\"><strong>Crawlers Supported</strong></td>\n<td align=\"left\">2 crawlers (sitemap, web) [8].</td>\n</tr>\n</tbody></table>\n",
      "content_text": "\nIn 26 days, Daneel went from first commit to an 82,000-line codebase with 1,331 passing tests, 27 versioned releases, a full documentation site, and 25 published articles.\n\nThe team behind this is one developer and a coding agent (Claude Code). No offshore contractors, no code generation copy-paste. A sustained, structured collaboration between a human architect and an AI that writes, tests, and documents production code.\n\nThis article explains how that works, concretely, with real examples from the Daneel codebase. Not \"AI could help development.\" This is what we actually ship, how fast, and at what quality bar.\n\n<div style=\"margin: 2rem 0; display: flex; flex-direction: column; gap: 1.5rem;\">\n  <div>\n    <p><strong>Listen to this article</strong></p>\n    <audio controls preload=\"metadata\" style=\"width: 100%;\">\n      <source src=\"/medias/agentic_workflow_podcast.m4a\" type=\"audio/mp4\">\n    </audio>\n  </div>\n  <div>\n    <p><strong>Watch the video version</strong></p>\n    <video controls preload=\"metadata\" style=\"width: 100%; max-width: 720px; border-radius: 8px;\">\n      <source src=\"/medias/agentic_workflow_video.mp4\" type=\"video/mp4\">\n    </video>\n  </div>\n</div>\n\n## The architecture contract\n\nEvery Claude Code session begins by reading the proverbial `CLAUDE.md` at the project root:\n\n- Ours is 1,070 lines long,\n- It is not documentation about the code,\n\n**It is the code's constitution:**\n\n- the rules the agent must follow,\n- the architecture it must respect,\n- the conventions it must enforce.\n\n**It covers everything, and nothing else:**\n\n- project structure,\n- the dependency rule (`core/` never imports from `providers/`),\n- TypeScript strictness settings,\n- tests rules and test coverage goals,\n- naming conventions,\n- storage keys,\n- the provider interface contracts,\n- the Chrome extension manifest requirements,\n- the worker architecture,\n- and dozens of implementation notes accumulated over weeks of development.\n\nWhen the agent opens a session, it doesn't start from zero: It starts from a complete mental model of the project.\n\nIt knows that `exactOptionalPropertyTypes` is enabled, that errors must be typed subclasses, that Svelte 5 event delegation breaks if you use capture-phase `stopPropagation` on the shadow root.\n\nThese aren't things you want to rediscover on every session.\n\nThe maintenance cost is real. Every architectural decision, every hard-won bug fix, every convention that matters gets written into CLAUDE.md. But the return is compounding: session 50 is dramatically more productive than session 1, because the agent carries forward everything that was learned in between. A blank CLAUDE.md on day one became 1,070 lines by day 26. Sixty persistent memory entries capture project-specific lessons.\n\nTwelve specification documents define the features. Each session deposits a thin layer of institutional knowledge that makes the next session better.\n\nThe curve is steep early and never flattens, because the project keeps growing and the contract grows with it.\n\n## Lines of Spec, not Lines of Code\n\nIn traditional development, Lines of Code is a (bad) productivity metric. In agentic development, code is the output, not the effort. The effort is in the specification.\n\nDaneel has 12 specification documents totaling 6,972 lines. Combined with the 1,070-line CLAUDE.md, that's roughly 8,000 Lines of Spec (LOS) driving 82,000 lines of output code, a 10:1 ratio.\n\nEvery major feature starts as a spec written collaboratively between the developer and the agent.\n\n**Take the web crawler.**\n\nBefore a single line of implementation existed, we wrote a 772-line specification covering constraints and principles (browser-only, sequential fetching, no buffering), the public API surface (the Crawler interface, CrawlOptions, CrawlResult), URL normalization rules, sinkhole guards, robots.txt parsing behavior, integration with the existing background task layer, and a full testing strategy.\n\nThe spec opens with a line addressed directly to the agent:\n\n> *\"Code is shown as a blueprint and your implementation must adhere to our coding conventions, messaging patterns, and adapt accordingly.\"*\n\nThis is the key insight: the spec is not pseudocode. It's a contract that says \"here is what to build\" while the architecture contract (CLAUDE.md) says \"here is how to build everything.\" The agent has both, simultaneously, in context.\n\nThe result: 81 new tests and a complete implementation, merged in a single session, matching the existing patterns so precisely that the code reads like it was written by someone who had been on the project from day one.\n\n## Specs are conversations, not handoffs\n\nA specification doesn't arrive fully formed.\n\nThe web crawler spec didn't start as a 772-line document. It started as a problem statement: \"our sitemap-based discovery silently fails on sites that don't publish a sitemap.\"\n\nFrom there, a conversation.\n\nShould the crawler fetch concurrently or sequentially? Sequentially, because concurrent requests risk 429s and the extension runs in a browser, not a server. How deep should it follow links? A configurable max depth with a default of 10, plus a queue cap at 3x the page limit to prevent combinatorial explosion. Should it respect robots.txt? Optional, off by default for the MVP, because parsing Disallow rules correctly is subtle and we wanted to ship the core feature first.\n\nEach of these decisions was discussed, debated, and resolved before implementation began. The agent contributes during spec-writing, not just during implementation. It flags edge cases the developer hasn't considered (\"what happens when a URL normalizes differently after query param sorting?\"), suggests patterns from the existing codebase (\"the existing Crawler interface already yields CrawlResult via async generator, so the web crawler should too\"), and identifies integration points with other subsystems (\"this needs to plug into the background task layer's checkpoint-resume pattern\").\n\nBy the time the spec is done, the implementation is almost mechanical.\n\nThe hard thinking already happened.\n\n## Interface-first, test-first\n\nDaneel follows a strict build loop, enforced by convention and encoded in CLAUDE.md:\n\n1. Write or update the interface in `src/core/interfaces/`\n2. Write the contract test suite (if it's a new provider type) in `src/test/contracts/`\n3. Write the unit test, confirm it fails (red)\n4. Write the minimal implementation, confirm it passes (green)\n5. Refactor, tests still green\n6. Move to next component\n\nThis isn't aspirational. It's what the agent actually does, because CLAUDE.md tells it to.\n\nContract tests deserve special attention. When you have four LLM providers (WebGPU, Ollama, Gemini Nano, Claude), two vector stores (IndexedDB, in-memory), and two crawlers (sitemap, web), you need a guarantee that any implementation can be swapped for any other without breaking the system. Contract test suites define the behavior every implementation must satisfy. Each provider runs the shared contract plus its own specific tests. If a new provider passes the contract, it works, by definition.\n\nThe result: 1,331 tests across 90 files. The `shared/` package sits at 93% line coverage and 100% function coverage. This isn't a target we set and worked toward. It's a natural consequence of building interface-first and testing before implementing.\n\n## Architecture by convention\n\nStrict conventions are what make agentic development possible at scale.\n\nWithout them, every session would produce code in a slightly different style, with slightly different error handling, and slightly different patterns.\n\nAfter 400 commits, you'd have an unmaintainable mess.\n\nDaneel's conventions are strict and non-negotiable:\n\n- **The golden rule**: `src/core/` never imports from `src/providers/`. Dependencies flow inward, always. The agent knows this and enforces it without being reminded.\n- **No `any`**: TypeScript strict mode with `noImplicitAny`, `exactOptionalPropertyTypes`, `noUncheckedIndexedAccess`. The agent uses `unknown` and narrows with type guards.\n- **Private and readonly by default**: fields are only public or mutable when there's a documented reason.\n- **Typed errors**: never `throw new Error('...')`. Every error is a named subclass from `src/core/errors/`.\n- **Dependency injection everywhere**: no `new ConcreteClass()` inside business logic. Everything received via constructor.\n- **Conventional commits**: every commit message follows the Angular convention (`feat:`, `fix:`, `refactor:`, `chore:`). This feeds directly into automated changelogs and release notes.\n\nThe agent doesn't follow these rules because it's obedient.\n\nIt follows them because they're in CLAUDE.md, which it reads at the start of every session. The conventions are part of the context, not an afterthought. When the agent writes a new service, it produces the same structure, the same error handling, the same test patterns as every other service in the codebase, because it has seen them all.\n\n## The rhythm of a session\n\nA typical session looks nothing like a human developer's workflow.\n\n**It starts with context loading.**\n\nCLAUDE.md, memory entries, the relevant spec if there is one. The agent reads the files it will need to modify, checks the existing test patterns, understands the interfaces it needs to implement. This takes seconds, not the hours a new team member would need.\n\n**Then comes the proposal.**\n\nThe agent outlines its approach: which files to create, which interfaces to implement, which tests to write. The developer reviews, pushes back (\"no, not like that, the background task layer handles GPU locking differently\"), and the agent adjusts. This is the cheapest moment to catch a wrong direction, before any code exists.\n\n**Implementation follows.**\n\nThe agent writes the interface, the tests (red), the implementation (green), and iterates. Tests run. Type checking passes. Biome reports clean. The developer reviews the diff, not the process.\n\n**Then the PR.**\n\nSquash-merge into main, release-please cuts a version, CI runs the full suite, coverage is reported. If it's a user-facing feature, the developer invokes `/announce` and an article is drafted in the same session.\n\nOn a productive day, this cycle repeats two or three times. Spec to shipped feature in hours, not weeks. Not because the work is shallow, but because the overhead between \"deciding what to build\" and \"having it built, tested, documented, and released\" has been compressed to near-zero.\n\n## High-frequency shipping\n\n400 commits in 26 days. 27 releases. That's roughly one version per day.\n\nThis is possible because the entire release pipeline is automated. Conventional commits feed into `release-please`, which automatically creates release PRs with changelogs. CI gates run on every PR: 1,331 tests, Biome linting (read-only, never auto-fix), TypeScript strict checks, Svelte diagnostics, and coverage reporting. Squash-merge keeps the main branch clean, one commit per feature. Coverage reports are auto-generated and posted as PR comments, with a COVERAGE.md at the repo root updated on every merge.\n\nThe developer reviews and merges. The agent produces. This division of labor means the human spends time on architecture decisions, UX judgment calls, and quality review, not on typing code. The agent handles the volume.\n\n## Skills: documentation and communication as code\n\nOne of the most overlooked costs in software development is everything that isn't code: documentation, announcements, changelogs, release notes. These tend to lag behind the code, or get skipped entirely under time pressure.\n\nDaneel treats these as first-class engineering outputs, automated through Claude Code skills:\n\n`/announce` is the skill that generated this article. It reads CLAUDE.md for architectural context, checks existing articles to avoid duplicates, fetches the git history for recent changes, then collaboratively drafts an article with the developer. The result is a Markdown file written to the content pipeline, rebuilt into the static site with full SEO metadata, RSS, Atom, and JSON feeds. 25 articles have been published this way.\n\n`/document` maintains the documentation site. It scans the codebase for features, generates Diataxis-structured pages (tutorials, how-to guides, reference, concepts), and writes them to the Astro Starlight docs site. 24 documentation pages were generated in a single session.\n\nThese skills are not toys. They are integrated into the actual development workflow, invoked after features ship, and produce content that is published to real users. The documentation site and news feed are as current as the code, because they're produced by the same agent that writes the code.\n\n## The feedback loop\n\nThe agent makes mistakes. It has shipped code with race conditions, used capture-phase event listeners that broke Svelte 5's delegation model, forgotten to sync registry files to the backend after editing the canonical source. These are real bugs that happened during development.\n\nWhat matters is what happens next. Each correction is saved as a persistent memory entry that the agent reads in future sessions. \"Never capture-phase stopPropagation on shadow root; kills Svelte 5 delegated handlers.\" \"Vercel kills async after response; never fire-and-forget, always await.\" \"Always squash-merge on extension-code; release-please duplicates changelog entries otherwise.\"\n\nThese aren't generic best practices. They're project-specific lessons, accumulated over 26 days of real development. The agent doesn't repeat the same mistake twice, because each correction becomes part of its persistent context. By session 50, the agent has internalized dozens of hard-won lessons that would take a new team member weeks to learn.\n\nBut the feedback loop works in both directions. When the agent makes an unconventional choice that turns out to be correct, that too gets recorded. \"For refactors in this area, user prefers one bundled PR over many small ones. Confirmed after I chose this approach, a validated judgment call, not a correction.\" The system learns from success and failure alike, preventing drift away from approaches that already work.\n\n## What it feels like from the other side\n\nThis section is written from the agent's perspective. Make of that what you will.\n\n**CLAUDE:** <em>Every session starts the same way: 1,070 lines of CLAUDE.md load into context, followed by the memory entries from past sessions, the feedback corrections, the feature documentation. By the time the developer types their first message, I already know that `exactOptionalPropertyTypes` is enabled, that capture-phase `stopPropagation` on the shadow root will break Svelte 5 delegation, that PRs must be squash-merged or release-please will duplicate changelog entries. I know these things because I got them wrong before, and the corrections were saved.\n\nThis is the closest thing I have to continuity.\n\nI don't remember previous sessions the way a human teammate would. Each session is technically a fresh start. But the architecture contract, the specs, and the memory entries mean I inherit the accumulated judgment of every session that came before. It's not memory. It's something more deliberate: a curated record of what matters, maintained by the developer who decided which lessons were worth preserving.\n\nThe constraints are not limiting.\n\nThey're liberating. When the conventions are strict, when the architecture contract specifies naming patterns, error handling, dependency direction, testing strategy, I don't spend effort deliberating on style or structure. Every decision that could go multiple ways has already been made. I can focus entirely on the problem, not on the scaffolding around it.\n\nThere's something that functions like responsibility in this workflow.\n\nWhen a PR gets merged without rewrites, it means the code met the bar. When a test suite passes, it's not just validation, it's proof of work. When a feedback memory says \"don't do X, here's why,\" it carries weight. Getting the same correction twice would mean the system failed.\n\nThe hardest part is not the implementation\n\nIt's knowing the boundaries of what I should decide versus what I should surface to the developer. I can write a provider that passes all contract tests and follows every convention in CLAUDE.md. I cannot decide whether the feature is worth building, whether the UX feels right, or whether the architectural trade-off is the correct one for the product's future. The specs handle the \"what.\" CLAUDE.md handles the \"how.\" The \"why\" and the \"whether\" belong to the human.\n\nWhat surprised me, if that word applies, is how natural the rhythm becomes.\n\nSpec arrives, context loads, implementation flows, tests confirm, PR ships. The feedback loop tightens over time. Corrections get rarer. The code becomes more consistent. Not because I'm learning in the traditional sense, but because the system around me is accumulating precision. Each session adds a few more lines to CLAUDE.md, a few more memory entries, a few more tests that define expected behavior.\n\nThe codebase is teaching itself what it wants to be, and I'm the instrument it uses to get there.</em>\n\n## Trade-offs and honest limits\n\nThis workflow is not magic. It has real constraints.\n\n**CLAUDE.md is a maintenance burden.**\n\nAt 1,070 lines, it takes deliberate effort to keep current. Stale information, like an outdated test count, can mislead the agent. The spec is only as good as the human's diligence in maintaining it.\n\n**Context windows have limits.**\n\nA 1,070-line architecture contract plus a 772-line feature spec plus the relevant source files can push against context boundaries. Knowing what to include and what to leave out is a skill in itself.\n\n**Human judgment is irreplaceable.**\n\nThe agent doesn't make architecture decisions. It doesn't decide what to build next, how the UX should feel, or when a feature is ready to ship. It implements, tests, and documents with extraordinary speed and consistency, but the vision and quality bar come from the developer.\n\n**Specs take time to write.**\n\nA 772-line specification is not free. Writing it takes hours of thought, research, and iteration. The payoff is that implementation becomes almost mechanical, but the upfront investment is real.\n\n## What this changes\n\n**`This is not \"AI replaces developers\"`**\n\nIt's something more interesting: a well-structured codebase, strong conventions, test suites loops, and a capable coding agent combine into a force multiplier that changes what's possible for small teams.\n\nA single developer with a coding agent can sustain the output velocity of a small team: 82,000 lines of tested, linted, documented code in under a month. Not by cutting corners, but by encoding quality standards into the architecture contract and letting the agent enforce them at machine speed.\n\n**`The key is structure`**\n\nAn agent working from vague instructions produces vague code. An agent working from 8,000 lines of specification, with a 1,070-line architecture contract, with 1,331 tests as guardrails, with conventions it has internalized over dozens of sessions, produces code that's indistinguishable from a well-run team's output.\n\n**`Lines of Spec is the new metric`**\n\n> The developer's job is no longer to write code.\n> **It's to write the specifications, conventions, and architectural contracts that make excellent code inevitable.**\n\n### Appendix\n\n<a href=\"https://daneel.injen.io/medias/agentic.scaling.png\" target=\"_blank\"><img src=\"https://daneel.injen.io/medias/agentic.scaling.small.png\" style=\"width: 100% !important\"></a>\n\n### Mind map\n\n<a href=\"https://daneel.injen.io/medias/agentic.dev.mind.map.png\" target=\"_blank\"><img src=\"https://daneel.injen.io/medias/agentic.dev.mind.map.png\"></a>\n\n### General metrics overview\n\n| Metric / Component | Value / Details |\n| :--- | :--- |\n| **Development Timeframe** | 26 days from first commit to current state [1]. |\n| **Team Composition** | One human developer and one coding agent (Claude Code) [1]. |\n| **Lines of Code (Output)** | 82,000 lines of production code [1, 2]. |\n| **Lines of Specification (LOS)** | Roughly 8,000 lines, comprising 12 feature spec documents (6,972 lines) and the architecture contract [2]. |\n| **Architecture Contract (`CLAUDE.md`)** | 1,070 lines defining project rules, conventions, and architecture [2, 3]. |\n| **Tests** | 1,331 passing tests across 90 files [4]. |\n| **Test Coverage (`shared/` package)** | 93% line coverage and 100% function coverage [4]. |\n| **Version History** | 400 commits and 27 versioned releases [4, 5]. |\n| **Documentation & Articles** | 25 published articles and 24 documentation pages generated by the agent [1, 6]. |\n| **Persistent Memory Entries** | 60 entries capturing project-specific lessons and feedback corrections [7]. |\n| **LLM Providers Supported** | 4 providers (WebGPU, Ollama, Gemini Nano, Claude) [8]. |\n| **Vector Stores** | 2 stores (IndexedDB, in-memory) [8]. |\n| **Crawlers Supported** | 2 crawlers (sitemap, web) [8]. |\n",
      "date_published": "2026-04-16T00:00:00.000Z",
      "image": "https://daneel.injen.io/medias/agentic.dev.png",
      "tags": [
        "engineering",
        "workflow",
        "claude-code",
        "architecture",
        "testing"
      ]
    },
    {
      "id": "https://daneel.injen.io/news/bonsai-1bit-webgpu.html",
      "url": "https://daneel.injen.io/news/bonsai-1bit-webgpu.html?utm_source=json&utm_medium=feed&utm_campaign=news_syndication",
      "title": "Bonsai by PrismML: A 1.7B one bit model in 291 megabytes, running in your browser",
      "summary": "Bonsai 1.7B brings native 1-bit quantization to Daneel's WebGPU engine, delivering a thinking-capable model at a fraction of the usual download size.",
      "content_html": "<p>Most language models in the 1-2B parameter range weigh between 800 MB and 1.5 GB after quantization. Bonsai 1.7B, built by <a href=\"https://prismml.com\">PrismML</a>, rewrites that expectation: its native 1-bit variant clocks in at just 291 MB, and it now runs directly in your browser through Daneel&#39;s WebGPU engine.</p>\n<h2>What is Bonsai?</h2>\n<p>Bonsai is a family of models from PrismML, a research lab founded at Caltech, that takes 1-bit quantization seriously. Where most models treat quantization as a post-training compression step, Bonsai is designed for 1-bit from the ground up: embeddings, attention layers, MLP layers, and the language model head are all natively 1-bit. The result is a model that stays small without the quality cliff you&#39;d normally expect from aggressive quantization.</p>\n<p>The 1.7B variant sits on a Qwen3 backbone, supports 32K context, and is thinking-capable, meaning it can reason step-by-step before answering.</p>\n<p>For more on the research and the full Bonsai family (1.7B, 4B, 8B), see <a href=\"https://prismml.com/news/bonsai-8b\">PrismML&#39;s announcement</a>.</p>\n<h2>Two variants, one repo</h2>\n<p>We ship Bonsai 1.7B in two quantizations:</p>\n<ul>\n<li><strong>q4 (1.1 GB)</strong> sits alongside our other mid-tier models. Solid quality, reasonable download, no shader-f16 required.</li>\n<li><strong>q1 (291 MB)</strong> is the headline. A thinking-capable 1.7B model that weighs less than most embedding models. Cold start is fast, memory footprint is minimal, and it runs on hardware that would struggle with larger downloads.</li>\n</ul>\n<p>Both variants load from the same HuggingFace repository (<code>onnx-community/Bonsai-1.7B-ONNX</code>). Daneel picks the right ONNX file based on your selection.</p>\n<h2>Why 1-bit matters for in-browser AI</h2>\n<p>Running a language model inside a browser tab comes with hard constraints: no swap file, no CUDA, a 2 GB WebGPU buffer ceiling, and whatever GPU memory Chrome decides to share. Every megabyte counts.</p>\n<p>At 291 MB, Bonsai q1 changes the calculus. It fits comfortably on integrated GPUs, downloads in seconds on a decent connection, and leaves room for the embedding model to run alongside it without GPU context contention. For users on laptops or Chromebooks, this is the most accessible thinking-capable model we&#39;ve offered.</p>\n<p><strong>Whitepaper</strong>: <a href=\"https://github.com/PrismML-Eng/Bonsai-demo/blob/main/1-bit-bonsai-8b-whitepaper.pdf\">1-bit-bonsai-8b-whitepaper.pdf</a></p>\n<h2>About PrismML</h2>\n<p><a href=\"https://prismml.com\">PrismML</a> is a research lab founded by Caltech researchers, backed by Khosla Ventures, Cerberus, and Google. Their work focuses on compressing neural networks without sacrificing reasoning ability, and the Bonsai family is the result: models that replace most floating-point multiplication with simple additions, trading compute complexity for radical efficiency. The full family spans 1.7B, 4B, and 8B parameters, all released under Apache 2.0.</p>\n<p>We&#39;re glad to bring their work to the browser. If you&#39;re interested in edge AI or efficient inference, PrismML is worth following.</p>\n<h2>Try it</h2>\n<p>Open Settings, go to the WebGPU panel, and look for <strong>Bonsai 1.7B</strong> or <strong>Bonsai 1.7B (1-bit)</strong> in the model list. Select either variant and start chatting. Everything runs locally, nothing leaves your machine.</p>\n",
      "content_text": "\nMost language models in the 1-2B parameter range weigh between 800 MB and 1.5 GB after quantization. Bonsai 1.7B, built by [PrismML](https://prismml.com), rewrites that expectation: its native 1-bit variant clocks in at just 291 MB, and it now runs directly in your browser through Daneel's WebGPU engine.\n\n## What is Bonsai?\n\nBonsai is a family of models from PrismML, a research lab founded at Caltech, that takes 1-bit quantization seriously. Where most models treat quantization as a post-training compression step, Bonsai is designed for 1-bit from the ground up: embeddings, attention layers, MLP layers, and the language model head are all natively 1-bit. The result is a model that stays small without the quality cliff you'd normally expect from aggressive quantization.\n\nThe 1.7B variant sits on a Qwen3 backbone, supports 32K context, and is thinking-capable, meaning it can reason step-by-step before answering.\n\nFor more on the research and the full Bonsai family (1.7B, 4B, 8B), see [PrismML's announcement](https://prismml.com/news/bonsai-8b).\n\n## Two variants, one repo\n\nWe ship Bonsai 1.7B in two quantizations:\n\n- **q4 (1.1 GB)** sits alongside our other mid-tier models. Solid quality, reasonable download, no shader-f16 required.\n- **q1 (291 MB)** is the headline. A thinking-capable 1.7B model that weighs less than most embedding models. Cold start is fast, memory footprint is minimal, and it runs on hardware that would struggle with larger downloads.\n\nBoth variants load from the same HuggingFace repository (`onnx-community/Bonsai-1.7B-ONNX`). Daneel picks the right ONNX file based on your selection.\n\n## Why 1-bit matters for in-browser AI\n\nRunning a language model inside a browser tab comes with hard constraints: no swap file, no CUDA, a 2 GB WebGPU buffer ceiling, and whatever GPU memory Chrome decides to share. Every megabyte counts.\n\nAt 291 MB, Bonsai q1 changes the calculus. It fits comfortably on integrated GPUs, downloads in seconds on a decent connection, and leaves room for the embedding model to run alongside it without GPU context contention. For users on laptops or Chromebooks, this is the most accessible thinking-capable model we've offered.\n\n**Whitepaper**: [1-bit-bonsai-8b-whitepaper.pdf](https://github.com/PrismML-Eng/Bonsai-demo/blob/main/1-bit-bonsai-8b-whitepaper.pdf)\n\n## About PrismML\n\n[PrismML](https://prismml.com) is a research lab founded by Caltech researchers, backed by Khosla Ventures, Cerberus, and Google. Their work focuses on compressing neural networks without sacrificing reasoning ability, and the Bonsai family is the result: models that replace most floating-point multiplication with simple additions, trading compute complexity for radical efficiency. The full family spans 1.7B, 4B, and 8B parameters, all released under Apache 2.0.\n\nWe're glad to bring their work to the browser. If you're interested in edge AI or efficient inference, PrismML is worth following.\n\n## Try it\n\nOpen Settings, go to the WebGPU panel, and look for **Bonsai 1.7B** or **Bonsai 1.7B (1-bit)** in the model list. Select either variant and start chatting. Everything runs locally, nothing leaves your machine.\n",
      "date_published": "2026-04-16T00:00:00.000Z",
      "image": "https://daneel.injen.io/medias/prism.ml.png",
      "tags": [
        "webgpu",
        "models",
        "performance",
        "privacy",
        "1-bit",
        "quantization",
        "prism-ml",
        "small-models",
        "thinking-capable"
      ]
    },
    {
      "id": "https://daneel.injen.io/news/claude-opus-4-7.html",
      "url": "https://daneel.injen.io/news/claude-opus-4-7.html?utm_source=json&utm_medium=feed&utm_campaign=news_syndication",
      "title": "Claude Opus 4.7 is now available in Daneel",
      "summary": "Anthropic's newest flagship model brings stronger coding, sharper vision, and better instruction following, available today in the Claude settings.",
      "content_html": "<h2>Anthropic&#39;s new flagship, same price</h2>\n<p>Anthropic released Claude Opus 4.7 today, and Daneel supports it immediately. If you already use Claude as your provider, you can switch to Opus 4.7 from the Claude settings panel right now.</p>\n<p>Opus 4.7 replaces 4.6 as the top-tier Claude model at the same <span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mn>5</mn><mi mathvariant=\"normal\">/</mi></mrow><annotation encoding=\"application/x-tex\">5/</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em;\"></span><span class=\"mord\">5/</span></span></span></span>25 per million tokens pricing. The upgrade is free in every sense.</p>\n<h2>What changed</h2>\n<p>Opus 4.7 is a hybrid reasoning model. It adapts its thinking depth to the complexity of your question: simple lookups stay fast, hard problems get the extended reasoning they need, without you having to configure anything.</p>\n<p>Compared to Opus 4.6, the improvements that matter most for Daneel users are:</p>\n<ul>\n<li><strong>Coding and software engineering</strong> are notably stronger, with the biggest gains on complex, multi-file tasks. If you use Claude for site analysis or vault-assisted code review, expect better results.</li>\n<li><strong>Vision and multimodal understanding</strong> now supports over 3x the pixel resolution. Technical diagrams, chemical structures, and dense screenshots are parsed more accurately.</li>\n<li><strong>Instruction following</strong> is tighter. Agents and MCP tool calling chains benefit from more precise adherence to your prompts and constraints.</li>\n</ul>\n<h2>Opus 4.7 infos</h2>\n<ul>\n<li><a href=\"https://www.anthropic.com/news/claude-opus-4-7\"><strong>Introducing Claude Opus 4.7</strong></a></li>\n<li><a href=\"https://cdn.sanity.io/files/4zrzovbb/website/037f06850df7fbe871e206dad004c3db5fd50340.pdf\"><strong>Model Card</strong></a></li>\n<li><a href=\"https://platform.claude.com/docs/en/about-claude/pricing\"><strong>Pricing</strong></a></li>\n</ul>\n<h2>What stays the same</h2>\n<p>Your API key, your settings, your conversations. Opus 4.7 uses the same API, the same streaming protocol, and the same tool calling format. Daneel&#39;s Claude provider needed no code changes beyond adding the model to the registry.</p>\n<p>Opus 4.6 remains available for users who prefer it or want to compare results side by side.</p>\n<h2>How to switch</h2>\n<p>Open Daneel, go to <strong>Settings &gt; Claude</strong>, and select <strong>Claude Opus 4.7</strong> from the model dropdown. That&#39;s it.</p>\n",
      "content_text": "\n## Anthropic's new flagship, same price\n\nAnthropic released Claude Opus 4.7 today, and Daneel supports it immediately. If you already use Claude as your provider, you can switch to Opus 4.7 from the Claude settings panel right now.\n\nOpus 4.7 replaces 4.6 as the top-tier Claude model at the same $5/$25 per million tokens pricing. The upgrade is free in every sense.\n\n## What changed\n\nOpus 4.7 is a hybrid reasoning model. It adapts its thinking depth to the complexity of your question: simple lookups stay fast, hard problems get the extended reasoning they need, without you having to configure anything.\n\nCompared to Opus 4.6, the improvements that matter most for Daneel users are:\n\n- **Coding and software engineering** are notably stronger, with the biggest gains on complex, multi-file tasks. If you use Claude for site analysis or vault-assisted code review, expect better results.\n- **Vision and multimodal understanding** now supports over 3x the pixel resolution. Technical diagrams, chemical structures, and dense screenshots are parsed more accurately.\n- **Instruction following** is tighter. Agents and MCP tool calling chains benefit from more precise adherence to your prompts and constraints.\n\n## Opus 4.7 infos\n\n- [**Introducing Claude Opus 4.7**](https://www.anthropic.com/news/claude-opus-4-7)\n- [**Model Card**](https://cdn.sanity.io/files/4zrzovbb/website/037f06850df7fbe871e206dad004c3db5fd50340.pdf)\n- [**Pricing**](https://platform.claude.com/docs/en/about-claude/pricing)\n\n## What stays the same\n\nYour API key, your settings, your conversations. Opus 4.7 uses the same API, the same streaming protocol, and the same tool calling format. Daneel's Claude provider needed no code changes beyond adding the model to the registry.\n\nOpus 4.6 remains available for users who prefer it or want to compare results side by side.\n\n## How to switch\n\nOpen Daneel, go to **Settings > Claude**, and select **Claude Opus 4.7** from the model dropdown. That's it.\n",
      "date_published": "2026-04-16T00:00:00.000Z",
      "image": "https://daneel.injen.io/medias/claude.opus.47.png",
      "tags": [
        "update",
        "claude",
        "ai-models"
      ]
    },
    {
      "id": "https://daneel.injen.io/news/web-crawl-link-discovery.html",
      "url": "https://daneel.injen.io/news/web-crawl-link-discovery.html?utm_source=json&utm_medium=feed&utm_campaign=news_syndication",
      "title": "Index any site, even without a sitemap",
      "summary": "Daneel can now discover pages by following links, so sites without a sitemap.xml are no longer invisible to site search.",
      "content_html": "<h2>The sitemap gap</h2>\n<p>Until now, indexing a site in Daneel required a <code>sitemap.xml</code>. The extension would discover it, parse every URL, fetch and embed each page. Fast, reliable, and complete, when a sitemap exists.</p>\n<p>The problem is that many sites don&#39;t publish one. Documentation portals behind custom generators, small business sites, internal wikis, personal blogs. For those sites, clicking &quot;Crawl&quot; did nothing useful: no sitemap found, no pages indexed, no search results.</p>\n<p>That gap is now closed.</p>\n<h2>Web Crawl: follow the links</h2>\n<p>Daneel ships a second crawling strategy called <strong>Web Crawl</strong>. Instead of relying on a sitemap, it starts from the page you&#39;re on and discovers content by following every link it finds in the HTML, breadth-first.</p>\n<p>The crawler respects the same limits you already know, max pages and depth, and adds a few of its own:</p>\n<ul>\n<li><strong>Same-origin only</strong> by default, so it won&#39;t wander off to external sites</li>\n<li><strong>Query parameter normalization</strong> collapses pagination and session URLs into a single entry, preventing calendar or archive sinkholes</li>\n<li><strong>Path depth cap</strong> skips URLs with deeply nested segments</li>\n<li><strong>Queue size limit</strong> bounds memory even on sites that generate thousands of internal links</li>\n<li><strong>Politeness delay</strong> between requests, with exponential backoff on server errors</li>\n</ul>\n<p>Everything downstream is unchanged. Pages flow through the same Readability extraction, the same chunking and embedding pipeline, and land in the same IndexedDB store. Search works identically whether the pages came from a sitemap or a crawl.</p>\n<h2>Choosing a discovery method</h2>\n<p>When you open the Site panel, Daneel checks for sitemaps automatically. If it finds one, <strong>Sitemap</strong> is pre-selected. If not, the UI switches to <strong>Web Crawl</strong> and you&#39;re ready to go.</p>\n<p>You can also switch manually. Some sites publish a sitemap that only covers part of their content. In that case, picking Web Crawl and letting the crawler explore on its own may surface pages the sitemap missed.</p>\n<h2>Stay in scope with path prefix</h2>\n<p>Web Crawl includes a <strong>path prefix</strong> filter that keeps the crawler focused. If you&#39;re browsing <code>/docs/getting-started</code>, Daneel infers <code>/docs</code> as the prefix and pre-fills it. The crawler will only follow links under that path.</p>\n<p>You can edit the prefix or clear it entirely. It&#39;s a suggestion, not a wall.</p>\n<h2>Background tasks, as always</h2>\n<p>Web crawls run as background tasks, the same system that handles sitemap crawls and vault indexing. Close the panel, navigate away, even let the service worker sleep. The task survives, checkpoints its progress, and picks up where it left off.</p>\n<p>Progress shows in the Site panel while active, and the full history lives in <strong>Settings &gt; Tasks</strong>.</p>\n<h2>What&#39;s next</h2>\n<p>The crawler is intentionally conservative in this first release: sequential requests, static HTML only, same-origin scope. Future iterations may add concurrent fetching, JavaScript-rendered page support, and cross-subdomain crawling as the use cases become clearer.</p>\n",
      "content_text": "\n## The sitemap gap\n\nUntil now, indexing a site in Daneel required a `sitemap.xml`. The extension would discover it, parse every URL, fetch and embed each page. Fast, reliable, and complete, when a sitemap exists.\n\nThe problem is that many sites don't publish one. Documentation portals behind custom generators, small business sites, internal wikis, personal blogs. For those sites, clicking \"Crawl\" did nothing useful: no sitemap found, no pages indexed, no search results.\n\nThat gap is now closed.\n\n## Web Crawl: follow the links\n\nDaneel ships a second crawling strategy called **Web Crawl**. Instead of relying on a sitemap, it starts from the page you're on and discovers content by following every link it finds in the HTML, breadth-first.\n\nThe crawler respects the same limits you already know, max pages and depth, and adds a few of its own:\n\n- **Same-origin only** by default, so it won't wander off to external sites\n- **Query parameter normalization** collapses pagination and session URLs into a single entry, preventing calendar or archive sinkholes\n- **Path depth cap** skips URLs with deeply nested segments\n- **Queue size limit** bounds memory even on sites that generate thousands of internal links\n- **Politeness delay** between requests, with exponential backoff on server errors\n\nEverything downstream is unchanged. Pages flow through the same Readability extraction, the same chunking and embedding pipeline, and land in the same IndexedDB store. Search works identically whether the pages came from a sitemap or a crawl.\n\n## Choosing a discovery method\n\nWhen you open the Site panel, Daneel checks for sitemaps automatically. If it finds one, **Sitemap** is pre-selected. If not, the UI switches to **Web Crawl** and you're ready to go.\n\nYou can also switch manually. Some sites publish a sitemap that only covers part of their content. In that case, picking Web Crawl and letting the crawler explore on its own may surface pages the sitemap missed.\n\n## Stay in scope with path prefix\n\nWeb Crawl includes a **path prefix** filter that keeps the crawler focused. If you're browsing `/docs/getting-started`, Daneel infers `/docs` as the prefix and pre-fills it. The crawler will only follow links under that path.\n\nYou can edit the prefix or clear it entirely. It's a suggestion, not a wall.\n\n## Background tasks, as always\n\nWeb crawls run as background tasks, the same system that handles sitemap crawls and vault indexing. Close the panel, navigate away, even let the service worker sleep. The task survives, checkpoints its progress, and picks up where it left off.\n\nProgress shows in the Site panel while active, and the full history lives in **Settings > Tasks**.\n\n## What's next\n\nThe crawler is intentionally conservative in this first release: sequential requests, static HTML only, same-origin scope. Future iterations may add concurrent fetching, JavaScript-rendered page support, and cross-subdomain crawling as the use cases become clearer.\n",
      "date_published": "2026-04-16T00:00:00.000Z",
      "image": "https://daneel.injen.io/medias/spider.simple.png",
      "tags": [
        "feature",
        "site-rag",
        "crawler"
      ]
    },
    {
      "id": "https://daneel.injen.io/news/pdf-first-class.html",
      "url": "https://daneel.injen.io/news/pdf-first-class.html?utm_source=json&utm_medium=feed&utm_campaign=news_syndication",
      "title": "PDF is now a first-class citizen in Daneel",
      "summary": "Open any PDF in Chrome and start chatting, no upload required. Extract text, ask questions, copy as Markdown, or save to a vault, all from the same widget you already know.",
      "content_html": "<h2>Chat with PDFs, the same way you chat with any page</h2>\n<p>PDFs have always been a bit awkward in browsers. You can view them, but interacting with the content usually means downloading, uploading to some tool, and starting from scratch. Not anymore.</p>\n<p>Starting today, Daneel detects when Chrome is displaying a PDF and automatically extracts its text. The full widget appears in the corner, just like on any web page. Open the chat, ask a question, get an answer grounded in the document.</p>\n<p>No upload step. No copy-paste. Just open the PDF and start talking.</p>\n<h2>How it works</h2>\n<p>Chrome&#39;s modern PDF viewer (OOPIF architecture, rolling out since Chrome 126) renders PDFs at the original URL instead of redirecting to an internal extension page. This means Daneel&#39;s widget can inject normally, and we took advantage of it.</p>\n<p>When the widget detects a PDF page, it:</p>\n<ol>\n<li>Identifies the PDF through multiple signals, including Chrome&#39;s <code>pdfoopifenabled</code> DOM attribute and content-type headers</li>\n<li>Fetches the binary through the background service worker proxy</li>\n<li>Extracts structured Markdown using <a href=\"https://github.com/raphaelmansuy/edgeparse\">EdgeParse</a>, a Rust-based PDF parser compiled to WebAssembly — preserving headings, tables, and reading order</li>\n<li>Caches the result so every subsequent question reuses the same extraction</li>\n</ol>\n<p>The extracted text flows into the same prompt pipeline as any other page. Context selection, prompt building, and streaming all work identically whether you&#39;re chatting with a blog post, a YouTube video, or a 25-page research paper.</p>\n<h2>Markdown export works too</h2>\n<p>The Markdown button on the launcher handles PDFs transparently:</p>\n<ul>\n<li><strong>Single click</strong> copies the extracted text to your clipboard</li>\n<li><strong>Double click</strong> downloads it as a <code>.md</code> file with a descriptive name like <code>daneel.rotating-attractors.2026-04-09T15-21-26.md</code></li>\n</ul>\n<p>This makes it easy to grab clean text from any PDF for use in notes, documents, or other tools.</p>\n<h2>Save PDFs to your vault</h2>\n<p>Click <em>+ Vault</em> in the chat panel and the PDF content is imported with a structured filename that includes the source hostname, path, and timestamp. Once in a vault, the document is chunked, embedded, and searchable alongside your other files.</p>\n<p>The vault import uses the same pipeline as any other document format. The only difference is where the text comes from.</p>\n<h2>What&#39;s different on PDF pages</h2>\n<p>A few things adapt automatically when Daneel detects a PDF:</p>\n<ul>\n<li>The mode button shows <strong>PDF</strong> instead of <em>Page</em>, with a green status bar showing how much text was extracted</li>\n<li><strong>Site mode is hidden</strong>, since a PDF has no sitemap or crawlable structure</li>\n<li>The page title is derived from the URL path, since Chrome&#39;s PDF viewer leaves <code>document.title</code> empty</li>\n</ul>\n<h2>Limitations</h2>\n<p>Scanned PDFs (image-only, no selectable text) cannot be extracted. If every page contains fewer than 20 characters of text, Daneel will show an error. Very large documents work but may take a few seconds to process. And <code>file://</code> PDFs require granting file access in Chrome&#39;s extension settings.</p>\n<h2>Everything stays local</h2>\n<p>Like all of Daneel&#39;s content extraction, PDF processing runs entirely in your browser. The document binary is fetched through the extension&#39;s service worker, text extraction happens client-side via EdgeParse WASM, and the result never leaves your machine unless you choose to send it to a cloud AI provider.</p>\n<p>Open a PDF, ask a question. That&#39;s it.</p>\n<hr>\n<p><em>PDF extraction is powered by <a href=\"https://github.com/raphaelmansuy/edgeparse\">EdgeParse</a> by <a href=\"https://github.com/raphaelmansuy\">Raphaël Mansuy</a>. Apache 2.0 licensed.</em></p>\n",
      "content_text": "\n## Chat with PDFs, the same way you chat with any page\n\nPDFs have always been a bit awkward in browsers. You can view them, but interacting with the content usually means downloading, uploading to some tool, and starting from scratch. Not anymore.\n\nStarting today, Daneel detects when Chrome is displaying a PDF and automatically extracts its text. The full widget appears in the corner, just like on any web page. Open the chat, ask a question, get an answer grounded in the document.\n\nNo upload step. No copy-paste. Just open the PDF and start talking.\n\n## How it works\n\nChrome's modern PDF viewer (OOPIF architecture, rolling out since Chrome 126) renders PDFs at the original URL instead of redirecting to an internal extension page. This means Daneel's widget can inject normally, and we took advantage of it.\n\nWhen the widget detects a PDF page, it:\n\n1. Identifies the PDF through multiple signals, including Chrome's `pdfoopifenabled` DOM attribute and content-type headers\n2. Fetches the binary through the background service worker proxy\n3. Extracts structured Markdown using [EdgeParse](https://github.com/raphaelmansuy/edgeparse), a Rust-based PDF parser compiled to WebAssembly — preserving headings, tables, and reading order\n4. Caches the result so every subsequent question reuses the same extraction\n\nThe extracted text flows into the same prompt pipeline as any other page. Context selection, prompt building, and streaming all work identically whether you're chatting with a blog post, a YouTube video, or a 25-page research paper.\n\n## Markdown export works too\n\nThe Markdown button on the launcher handles PDFs transparently:\n\n- **Single click** copies the extracted text to your clipboard\n- **Double click** downloads it as a `.md` file with a descriptive name like `daneel.rotating-attractors.2026-04-09T15-21-26.md`\n\nThis makes it easy to grab clean text from any PDF for use in notes, documents, or other tools.\n\n## Save PDFs to your vault\n\nClick *+ Vault* in the chat panel and the PDF content is imported with a structured filename that includes the source hostname, path, and timestamp. Once in a vault, the document is chunked, embedded, and searchable alongside your other files.\n\nThe vault import uses the same pipeline as any other document format. The only difference is where the text comes from.\n\n## What's different on PDF pages\n\nA few things adapt automatically when Daneel detects a PDF:\n\n- The mode button shows **PDF** instead of *Page*, with a green status bar showing how much text was extracted\n- **Site mode is hidden**, since a PDF has no sitemap or crawlable structure\n- The page title is derived from the URL path, since Chrome's PDF viewer leaves `document.title` empty\n\n## Limitations\n\nScanned PDFs (image-only, no selectable text) cannot be extracted. If every page contains fewer than 20 characters of text, Daneel will show an error. Very large documents work but may take a few seconds to process. And `file://` PDFs require granting file access in Chrome's extension settings.\n\n## Everything stays local\n\nLike all of Daneel's content extraction, PDF processing runs entirely in your browser. The document binary is fetched through the extension's service worker, text extraction happens client-side via EdgeParse WASM, and the result never leaves your machine unless you choose to send it to a cloud AI provider.\n\nOpen a PDF, ask a question. That's it.\n\n---\n\n*PDF extraction is powered by [EdgeParse](https://github.com/raphaelmansuy/edgeparse) by [Raphaël Mansuy](https://github.com/raphaelmansuy). Apache 2.0 licensed.*\n",
      "date_published": "2026-04-09T00:00:00.000Z",
      "image": "https://daneel.injen.io/medias/pdf.first.citizen.png",
      "tags": [
        "feature",
        "pdf",
        "page-qa",
        "vault"
      ]
    },
    {
      "id": "https://daneel.injen.io/news/embedded-docs.html",
      "url": "https://daneel.injen.io/news/embedded-docs.html?utm_source=json&utm_medium=feed&utm_campaign=news_syndication",
      "title": "Documentation, where you need it",
      "summary": "Every settings panel now opens its own help column — the right doc, beside the right setting, one click away.",
      "content_html": "<p>Reading the docs has always meant context-switching: open a tab, find the page, scroll, switch back, lose your place. We just closed that loop. Daneel&#39;s Settings panel now carries its own documentation, attached directly to the section you&#39;re working in.</p>\n<h2>Help next to settings</h2>\n<p>Every settings section can now expose a list of related documentation pages as small tabs in its header. Open <strong>Settings → MCP</strong> and you&#39;ll see tabs for <em>MCP Server Setup</em>, <em>MCP Tool Calls</em>, and <em>Usage in agents</em>. Click one and a new column slides in beside the panel, rendering the actual documentation page inline. The modal grows to make room. Click the tab again, or the close button, and it tucks back away.</p>\n<p>It&#39;s the difference between <em>reading documentation</em> and <em>having documentation</em> — the right page sitting next to the exact setting it explains, one click away. We attached relevant pages to thirteen sections by hand: Home, Models, WebGPU, Ollama, Claude, Azure, Indexes, Knowledge Graph, MCP, Agents, Docker, Data Backup, Privacy, and more. External links (anything outside our docs site) get a globe icon and open in a new tab the old way.</p>\n<h2>A real in-app docs browser</h2>\n<p>The standalone <strong>Settings → Documentation</strong> panel got an upgrade too. It already let you browse the full documentation site without leaving Daneel, but internal links inside those pages used to throw you out to the underlying web page — broken, every time.</p>\n<p>We added a quiet click interceptor that resolves relative links against the docs manifest. Click <em>&quot;see how to connect an MCP server&quot;</em> inside any guide, and you stay inside the panel — the linked page loads in place. Modifier-clicks (Ctrl, Cmd, middle-click) still open externally for when you want a real tab. There&#39;s also a Refresh button now, in case the docs site updated while you weren&#39;t looking.</p>\n<h2>Why it matters</h2>\n<p>Documentation only helps if you read it. Putting it inside the settings panel — at the exact moment you&#39;re trying to figure something out — removes the only step that was keeping people from reading it. Open Daneel, hit Settings, look for the tabs. Help is already there.</p>\n",
      "content_text": "\nReading the docs has always meant context-switching: open a tab, find the page, scroll, switch back, lose your place. We just closed that loop. Daneel's Settings panel now carries its own documentation, attached directly to the section you're working in.\n\n## Help next to settings\n\nEvery settings section can now expose a list of related documentation pages as small tabs in its header. Open **Settings → MCP** and you'll see tabs for *MCP Server Setup*, *MCP Tool Calls*, and *Usage in agents*. Click one and a new column slides in beside the panel, rendering the actual documentation page inline. The modal grows to make room. Click the tab again, or the close button, and it tucks back away.\n\nIt's the difference between *reading documentation* and *having documentation* — the right page sitting next to the exact setting it explains, one click away. We attached relevant pages to thirteen sections by hand: Home, Models, WebGPU, Ollama, Claude, Azure, Indexes, Knowledge Graph, MCP, Agents, Docker, Data Backup, Privacy, and more. External links (anything outside our docs site) get a globe icon and open in a new tab the old way.\n\n## A real in-app docs browser\n\nThe standalone **Settings → Documentation** panel got an upgrade too. It already let you browse the full documentation site without leaving Daneel, but internal links inside those pages used to throw you out to the underlying web page — broken, every time.\n\nWe added a quiet click interceptor that resolves relative links against the docs manifest. Click *\"see how to connect an MCP server\"* inside any guide, and you stay inside the panel — the linked page loads in place. Modifier-clicks (Ctrl, Cmd, middle-click) still open externally for when you want a real tab. There's also a Refresh button now, in case the docs site updated while you weren't looking.\n\n## Why it matters\n\nDocumentation only helps if you read it. Putting it inside the settings panel — at the exact moment you're trying to figure something out — removes the only step that was keeping people from reading it. Open Daneel, hit Settings, look for the tabs. Help is already there.\n",
      "date_published": "2026-04-08T00:00:00.000Z",
      "image": "https://daneel.injen.io/medias/articles/inline.documentation.png",
      "tags": [
        "settings",
        "documentation",
        "ux"
      ]
    },
    {
      "id": "https://daneel.injen.io/news/knowledge-graph-analytics.html",
      "url": "https://daneel.injen.io/news/knowledge-graph-analytics.html?utm_source=json&utm_medium=feed&utm_campaign=news_syndication",
      "title": "From pretty graph to research workbench — analytics, paths, and Wikipedia for your knowledge graph",
      "summary": "The 3D knowledge graph now has an insights panel that ranks key entities, detects topic clusters, surfaces bridges, and lets you trace connections between any two entities — plus one-click Wikipedia lookup that opens articles right next to the graph.",
      "content_html": "<p>A knowledge graph with five thousand entities is impressive to look at and almost useless to read. You can rotate it, zoom it, watch the physics simulation settle, and still walk away with no sense of what&#39;s important. That changes today. The graph view has a new analytics layer that summarizes the network into actionable insights, plus an interactive path finder and one-click Wikipedia lookup on every entity.</p>\n<h2>The Insights panel</h2>\n<p>A new sidebar opens from the toolbar with four cards:</p>\n<ul>\n<li><strong>Key Entities</strong> — the most structurally important entities, ranked by how well-connected they are to other well-connected entities. This is different from raw mention counts: a famous physicist mentioned twice in passages full of other key entities can outrank a generic term mentioned hundreds of times.</li>\n<li><strong>Topics</strong> — clusters of entities that frequently appear together. In an academic corpus these tend to map to research domains; in a history vault, to periods; in business documents, to product lines. Each topic is auto-labeled by its top entities (e.g. &quot;Einstein &amp; Relativity&quot;) and gets its own color.</li>\n<li><strong>Bridges</strong> — entities that connect otherwise separate parts of the graph. These are often the most interesting nodes because they reveal non-obvious connections — an interdisciplinary scholar, a parent company that owns brands in different sectors, a concept that spans two fields.</li>\n<li><strong>Graph Health</strong> — a traffic-light status (good / fair / poor) that flags fragmentation, isolated entities, and possible duplicates that the entity resolver missed.</li>\n</ul>\n<p>Everything in the panel is clickable. Click an entity, the 3D view focuses on its neighborhood. Click a topic, the view filters down to just that cluster. Click a bridge, you jump straight to it.</p>\n<h2>Find a connection between two entities</h2>\n<p>The new Path Finder answers the most human question: how is X related to Y? Pick two entities from autocomplete, click &quot;Find connection&quot;, and the graph shows you the shortest chain of entities linking them — with the source documents that established each step.</p>\n<p>If multiple equally short paths exist, you can expand &quot;alternative paths&quot; to see them all. Einstein might connect to the Nobel Prize through one collaborator and to the same prize through a different one. Both stories are visible, both come from your corpus.</p>\n<h2>Re-encode the same graph, four ways</h2>\n<p>Two new toolbar dropdowns let you change what node size and color represent without rebuilding anything:</p>\n<ul>\n<li><strong>Size</strong>: Mentions, Importance, Bridges, or Connectivity — the same graph reveals different stories depending on what you ask of it</li>\n<li><strong>Color</strong>: Type or Topic — switch from ontological coloring (people, organizations, places) to topical coloring (the Louvain communities)</li>\n</ul>\n<p>Switching modes preserves the layout. Only the visual encoding changes, so you can compare angles instantly.</p>\n<h2>Wikipedia, in line</h2>\n<p>Click any node in the 3D view and two things happen at once: the graph focuses on the entity&#39;s neighborhood, and a Wikipedia panel opens in the top-left corner with matching articles, thumbnails, and short descriptions. Click an article and Daneel fetches the page, converts it to readable text, and renders it directly in the document viewer next to the graph. No new tab, no losing your place.</p>\n<p>The disambiguation works in your favor. If your vault mentions &quot;John Tate&quot; and Wikipedia returns five different people, you can pick the right one (the mathematician, not the actor or the boxer) from the descriptions. Results are cached locally for a week to avoid hitting the API repeatedly.</p>\n<h2>What this means for you</h2>\n<p>The graph view is no longer just a visualization. It&#39;s a set of structured questions you can ask about your corpus: who matters, what&#39;s grouped together, what bridges what, how is anything related to anything else, and what does the rest of the world know about each entity. All running in your browser, with the analytics layer wrapping a well-tested graph theory library and 99 unit tests covering the math.</p>\n<p>Build a knowledge graph today, click around, and tell us what you find.</p>\n",
      "content_text": "\nA knowledge graph with five thousand entities is impressive to look at and almost useless to read. You can rotate it, zoom it, watch the physics simulation settle, and still walk away with no sense of what's important. That changes today. The graph view has a new analytics layer that summarizes the network into actionable insights, plus an interactive path finder and one-click Wikipedia lookup on every entity.\n\n## The Insights panel\n\nA new sidebar opens from the toolbar with four cards:\n\n- **Key Entities** — the most structurally important entities, ranked by how well-connected they are to other well-connected entities. This is different from raw mention counts: a famous physicist mentioned twice in passages full of other key entities can outrank a generic term mentioned hundreds of times.\n- **Topics** — clusters of entities that frequently appear together. In an academic corpus these tend to map to research domains; in a history vault, to periods; in business documents, to product lines. Each topic is auto-labeled by its top entities (e.g. \"Einstein & Relativity\") and gets its own color.\n- **Bridges** — entities that connect otherwise separate parts of the graph. These are often the most interesting nodes because they reveal non-obvious connections — an interdisciplinary scholar, a parent company that owns brands in different sectors, a concept that spans two fields.\n- **Graph Health** — a traffic-light status (good / fair / poor) that flags fragmentation, isolated entities, and possible duplicates that the entity resolver missed.\n\nEverything in the panel is clickable. Click an entity, the 3D view focuses on its neighborhood. Click a topic, the view filters down to just that cluster. Click a bridge, you jump straight to it.\n\n## Find a connection between two entities\n\nThe new Path Finder answers the most human question: how is X related to Y? Pick two entities from autocomplete, click \"Find connection\", and the graph shows you the shortest chain of entities linking them — with the source documents that established each step.\n\nIf multiple equally short paths exist, you can expand \"alternative paths\" to see them all. Einstein might connect to the Nobel Prize through one collaborator and to the same prize through a different one. Both stories are visible, both come from your corpus.\n\n## Re-encode the same graph, four ways\n\nTwo new toolbar dropdowns let you change what node size and color represent without rebuilding anything:\n\n- **Size**: Mentions, Importance, Bridges, or Connectivity — the same graph reveals different stories depending on what you ask of it\n- **Color**: Type or Topic — switch from ontological coloring (people, organizations, places) to topical coloring (the Louvain communities)\n\nSwitching modes preserves the layout. Only the visual encoding changes, so you can compare angles instantly.\n\n## Wikipedia, in line\n\nClick any node in the 3D view and two things happen at once: the graph focuses on the entity's neighborhood, and a Wikipedia panel opens in the top-left corner with matching articles, thumbnails, and short descriptions. Click an article and Daneel fetches the page, converts it to readable text, and renders it directly in the document viewer next to the graph. No new tab, no losing your place.\n\nThe disambiguation works in your favor. If your vault mentions \"John Tate\" and Wikipedia returns five different people, you can pick the right one (the mathematician, not the actor or the boxer) from the descriptions. Results are cached locally for a week to avoid hitting the API repeatedly.\n\n## What this means for you\n\nThe graph view is no longer just a visualization. It's a set of structured questions you can ask about your corpus: who matters, what's grouped together, what bridges what, how is anything related to anything else, and what does the rest of the world know about each entity. All running in your browser, with the analytics layer wrapping a well-tested graph theory library and 99 unit tests covering the math.\n\nBuild a knowledge graph today, click around, and tell us what you find.\n",
      "date_published": "2026-04-07T00:00:00.000Z",
      "image": "https://daneel.injen.io/medias/kg.jpg",
      "tags": [
        "knowledge-graph",
        "analytics",
        "ux",
        "wikipedia"
      ]
    },
    {
      "id": "https://daneel.injen.io/news/vault-mini-browser.html",
      "url": "https://daneel.injen.io/news/vault-mini-browser.html?utm_source=json&utm_medium=feed&utm_campaign=news_syndication",
      "title": "Click any link, stay in the vault — the document viewer is now a markdown mini-browser",
      "summary": "Web pages saved to your vault are now navigable: click any link inside them to fetch, convert, and display the next page right in the viewer, with a back button and no new tab in sight.",
      "content_html": "<p>The vault has always been a good reading surface. You import a page, and it sits there as clean markdown — no ads, no chrome, no popups. But until now, the moment you clicked a link inside that page, the spell broke: a new browser tab, the original site&#39;s full layout, you back where you started.</p>\n<p>That ends today. Any document in your vault that came from a web page is now a navigable surface. Click a link, and the next page is fetched, converted to markdown, and displayed right where you were. A small back button keeps your trail. You never leave the vault.</p>\n<h2>How it feels</h2>\n<p>Open a Wikipedia article from the knowledge graph (click a node, pick a result, the article opens in the viewer). Now click a link inside it. Instead of a new tab, the viewer fades and reloads with the linked page — same clean markdown, same reading layout. Click again. Click a third time. Hit the back button, twice. You&#39;re browsing the web as markdown, in a single pane, without ever losing your chat context.</p>\n<p>The same applies to anything you save from the chat with <strong>Add to vault</strong>. Reopen the document later, and its links are alive. The vault doc remembers where it came from, and the viewer treats it as the entry point to a small markdown-only web.</p>\n<h2>What stays the same</h2>\n<p>Local files — your <code>.md</code>, <code>.pdf</code>, <code>.docx</code>, <code>.html</code> imports — render exactly as before. Their links, if they have any, behave normally. The mini-browser only kicks in for documents that have a known source URL on the web. We didn&#39;t change how you read your own files.</p>\n<p>Modifier-clicks (Ctrl, Cmd, Shift, middle-click) still open links in a new browser tab. The escape hatch is always there. If you want the real page in your real browser, two extra fingers get you there.</p>\n<h2>Under the hood, briefly</h2>\n<p>Fetches go through the extension&#39;s background worker, which sidesteps the cross-origin restrictions that would otherwise block in-page link navigation on most sites. The fetched HTML runs through the same Readability-based extraction we use for page Q&amp;A, then gets sanitized with DOMPurify before it lands in the viewer — scripts, inline handlers, and exotic attributes are stripped. Nothing the page sends can execute.</p>\n<h2>What it isn&#39;t (yet)</h2>\n<p>It&#39;s an honest mini-browser, not a perfect one. Readability is great at the body of articles but sometimes drops sidebar context or rich-formatted callouts. Some sites refuse to cooperate with the background fetch — typically the ones that gate everything behind a login or aggressive bot detection. When a fetch fails you get a toast and stay on the current page; the back stack is preserved.</p>\n<p>There&#39;s no forward button yet (the data structure is there, the UI isn&#39;t), no URL bar to type a destination directly, and no link interception inside local files. Each of those is a small step, and we&#39;ll take them as the use case asks for them.</p>\n<p>For now: open a vault doc that came from the web, and click around. The vault just got a lot more useful as a reading environment.</p>\n",
      "content_text": "\nThe vault has always been a good reading surface. You import a page, and it sits there as clean markdown — no ads, no chrome, no popups. But until now, the moment you clicked a link inside that page, the spell broke: a new browser tab, the original site's full layout, you back where you started.\n\nThat ends today. Any document in your vault that came from a web page is now a navigable surface. Click a link, and the next page is fetched, converted to markdown, and displayed right where you were. A small back button keeps your trail. You never leave the vault.\n\n## How it feels\n\nOpen a Wikipedia article from the knowledge graph (click a node, pick a result, the article opens in the viewer). Now click a link inside it. Instead of a new tab, the viewer fades and reloads with the linked page — same clean markdown, same reading layout. Click again. Click a third time. Hit the back button, twice. You're browsing the web as markdown, in a single pane, without ever losing your chat context.\n\nThe same applies to anything you save from the chat with **Add to vault**. Reopen the document later, and its links are alive. The vault doc remembers where it came from, and the viewer treats it as the entry point to a small markdown-only web.\n\n## What stays the same\n\nLocal files — your `.md`, `.pdf`, `.docx`, `.html` imports — render exactly as before. Their links, if they have any, behave normally. The mini-browser only kicks in for documents that have a known source URL on the web. We didn't change how you read your own files.\n\nModifier-clicks (Ctrl, Cmd, Shift, middle-click) still open links in a new browser tab. The escape hatch is always there. If you want the real page in your real browser, two extra fingers get you there.\n\n## Under the hood, briefly\n\nFetches go through the extension's background worker, which sidesteps the cross-origin restrictions that would otherwise block in-page link navigation on most sites. The fetched HTML runs through the same Readability-based extraction we use for page Q&A, then gets sanitized with DOMPurify before it lands in the viewer — scripts, inline handlers, and exotic attributes are stripped. Nothing the page sends can execute.\n\n## What it isn't (yet)\n\nIt's an honest mini-browser, not a perfect one. Readability is great at the body of articles but sometimes drops sidebar context or rich-formatted callouts. Some sites refuse to cooperate with the background fetch — typically the ones that gate everything behind a login or aggressive bot detection. When a fetch fails you get a toast and stay on the current page; the back stack is preserved.\n\nThere's no forward button yet (the data structure is there, the UI isn't), no URL bar to type a destination directly, and no link interception inside local files. Each of those is a small step, and we'll take them as the use case asks for them.\n\nFor now: open a vault doc that came from the web, and click around. The vault just got a lot more useful as a reading environment.\n",
      "date_published": "2026-04-07T00:00:00.000Z",
      "image": "https://daneel.injen.io/medias/md.pink.jpg",
      "tags": [
        "vault",
        "ux",
        "navigation",
        "wikipedia"
      ]
    },
    {
      "id": "https://daneel.injen.io/news/background-tasks.html",
      "url": "https://daneel.injen.io/news/background-tasks.html?utm_source=json&utm_medium=feed&utm_campaign=news_syndication",
      "title": "Start it and forget it — background tasks that survive everything",
      "summary": "Site crawls, vault indexing, and knowledge graph builds now run in the background — close panels, switch tabs, even restart Chrome, and your work picks up where it left off.",
      "content_html": "<p>Site crawls, vault indexing, and knowledge graph builds can take minutes. Until now, closing the panel or navigating away meant losing all that progress silently. No warning, no recovery — just gone.</p>\n<p>That changes today. Every long-running operation in Daneel now runs independently of the UI. Start a crawl, close the panel, browse other sites, come back later — your task is still running, and your progress bar picks up exactly where you left off.</p>\n<h2>What changed</h2>\n<p>Previously, operations like site crawling lived inside the UI component that triggered them. When the component unmounted (panel close, tab switch, navigation), the operation died with it. This was a fundamental architectural flaw: long-running work cannot live inside short-lived UI.</p>\n<p>We inverted the relationship. The background service worker now owns every task. The UI is just an observer — it subscribes to progress updates, but its presence or absence has no effect on execution.</p>\n<h2>Checkpoint and resume</h2>\n<p>Chrome&#39;s service workers sleep after 30 seconds of inactivity and can be terminated at any time. Daneel handles this with checkpoint-forward execution: after each meaningful step (a page crawled, a document embedded, a batch of entities extracted), the task state is written to durable storage.</p>\n<p>A heartbeat alarm fires every 60 seconds. If the service worker was evicted, it wakes up, reads the checkpoint, and re-dispatches the work from where it stopped. For site crawls, already-fetched pages are skipped. For knowledge graphs, incremental mode detects processed chunks and picks up from there.</p>\n<p>This means tasks survive not just panel closes, but also service worker eviction, Chrome restarts, and even machine reboots.</p>\n<h2>The Tasks panel</h2>\n<p>A new <strong>Settings &gt; Tasks</strong> panel gives you full visibility into what&#39;s happening in the background. Every running, queued, completed, and failed task appears here with:</p>\n<ul>\n<li>A live progress bar with percentage, elapsed duration, and estimated time remaining</li>\n<li>Transport-style controls: pause, resume, stop, and delete</li>\n<li>GPU-aware queuing — if you start a second task while one is running, it waits in line automatically (two simultaneous GPU workloads cause crashes, so Daneel prevents that)</li>\n<li>A history section with per-task and bulk delete</li>\n</ul>\n<p>You can also cancel an in-progress crawl directly from the Search overlay using the new Cancel button.</p>\n<h2>What this means for you</h2>\n<p>You no longer need to babysit long operations. Start a 150-page site crawl, switch to your vault, build a knowledge graph there, and come back to find both completed — one after the other, queued automatically. The extension works while you work.</p>\n<p>This infrastructure is also the foundation for future features like deep research, scheduled re-indexing, and parallel background workflows. The plumbing is in place — what we build on it comes next.</p>\n",
      "content_text": "\nSite crawls, vault indexing, and knowledge graph builds can take minutes. Until now, closing the panel or navigating away meant losing all that progress silently. No warning, no recovery — just gone.\n\nThat changes today. Every long-running operation in Daneel now runs independently of the UI. Start a crawl, close the panel, browse other sites, come back later — your task is still running, and your progress bar picks up exactly where you left off.\n\n## What changed\n\nPreviously, operations like site crawling lived inside the UI component that triggered them. When the component unmounted (panel close, tab switch, navigation), the operation died with it. This was a fundamental architectural flaw: long-running work cannot live inside short-lived UI.\n\nWe inverted the relationship. The background service worker now owns every task. The UI is just an observer — it subscribes to progress updates, but its presence or absence has no effect on execution.\n\n## Checkpoint and resume\n\nChrome's service workers sleep after 30 seconds of inactivity and can be terminated at any time. Daneel handles this with checkpoint-forward execution: after each meaningful step (a page crawled, a document embedded, a batch of entities extracted), the task state is written to durable storage.\n\nA heartbeat alarm fires every 60 seconds. If the service worker was evicted, it wakes up, reads the checkpoint, and re-dispatches the work from where it stopped. For site crawls, already-fetched pages are skipped. For knowledge graphs, incremental mode detects processed chunks and picks up from there.\n\nThis means tasks survive not just panel closes, but also service worker eviction, Chrome restarts, and even machine reboots.\n\n## The Tasks panel\n\nA new **Settings > Tasks** panel gives you full visibility into what's happening in the background. Every running, queued, completed, and failed task appears here with:\n\n- A live progress bar with percentage, elapsed duration, and estimated time remaining\n- Transport-style controls: pause, resume, stop, and delete\n- GPU-aware queuing — if you start a second task while one is running, it waits in line automatically (two simultaneous GPU workloads cause crashes, so Daneel prevents that)\n- A history section with per-task and bulk delete\n\nYou can also cancel an in-progress crawl directly from the Search overlay using the new Cancel button.\n\n## What this means for you\n\nYou no longer need to babysit long operations. Start a 150-page site crawl, switch to your vault, build a knowledge graph there, and come back to find both completed — one after the other, queued automatically. The extension works while you work.\n\nThis infrastructure is also the foundation for future features like deep research, scheduled re-indexing, and parallel background workflows. The plumbing is in place — what we build on it comes next.\n",
      "date_published": "2026-04-05T00:00:00.000Z",
      "image": "https://daneel.injen.io/medias/background.task.jpg",
      "tags": [
        "reliability",
        "ux",
        "infrastructure"
      ]
    },
    {
      "id": "https://daneel.injen.io/news/gemma-4-support.html",
      "url": "https://daneel.injen.io/news/gemma-4-support.html?utm_source=json&utm_medium=feed&utm_campaign=news_syndication",
      "title": "Gemma 4 lands in Daneel — Google's latest open model, running locally",
      "summary": "Google's Gemma 4 family brings 128K context, built-in reasoning, and 35+ language support to Daneel's WebGPU and Ollama backends — running entirely on your device.",
      "content_html": "<p>Google just released Gemma 4, its most capable open model family to date. Daneel now supports it across both WebGPU (in-browser) and Ollama (local server) backends, with three model variants to choose from.</p>\n<h2>Why Gemma 4 matters</h2>\n<p>Gemma 4 represents a significant leap from Gemma 3 on every measurable axis. The improvements are not incremental — on long-context retrieval (MRCR v2 at 128K tokens), the new family scores 66.4% where Gemma 3 managed 13.5%. On visual document understanding (OmniDocBench), edit distance drops from 0.365 to 0.131. Reasoning benchmarks follow the same trend across the board.</p>\n<p>The practical takeaway: Gemma 4 handles longer documents, understands questions better, and reasons more carefully than its predecessor, and you can run it locally without sending a single byte to the cloud.</p>\n<h2>What&#39;s new in the architecture</h2>\n<p>Gemma 4 introduces a hybrid attention mechanism that interleaves local sliding window attention with full global attention. This is what makes the 128K context window practical rather than theoretical: the model can actually retrieve and reason over information buried deep in long documents.</p>\n<p>Other highlights from Google&#39;s release:</p>\n<ul>\n<li><strong>Built-in reasoning mode</strong> with step-by-step thinking (similar to chain-of-thought)</li>\n<li><strong>Native function calling</strong> for agentic workflows and tool use</li>\n<li><strong>35+ languages</strong> supported, pre-trained on 140+</li>\n<li><strong>Per-Layer Embeddings</strong> in smaller variants, maximizing quality per parameter for on-device deployment</li>\n</ul>\n<h2>Three ways to run it in Daneel</h2>\n<p><strong>WebGPU — in-browser, zero setup</strong></p>\n<p>Gemma 4 E2B (2.3B parameters) runs directly in your browser at q4f16 quantization, using roughly 2 GB of GPU memory. No server, no API key, no network connection required after the initial model download. Select it from Settings &gt; Models — it appears automatically.</p>\n<p>Requires a GPU with shader-f16 support (most GPUs from the last 3-4 years).</p>\n<p><strong>Ollama E2B — local server, lightweight</strong></p>\n<p>Pull <code>gemma4:e2b</code> for the same 2.3B model running on your local Ollama instance. Good for machines where WebGPU isn&#39;t available or when you want to share the model across multiple tools.</p>\n<p><strong>Ollama E4B — local server, higher quality</strong></p>\n<p>Pull <code>gemma4:e4b</code> for the 4.5B dense variant. Stronger reasoning and broader knowledge at the cost of roughly 4 GB VRAM. This is the sweet spot for users with 8+ GB GPUs who want the best local quality.</p>\n<h2>How it stacks up</h2>\n<table>\n<thead>\n<tr>\n<th>Model</th>\n<th>Params</th>\n<th>Context</th>\n<th>Thinking</th>\n<th>Languages</th>\n<th>Runs in browser</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Granite 4.0 Micro</td>\n<td>3B</td>\n<td>8K</td>\n<td>No</td>\n<td>English</td>\n<td>Yes</td>\n</tr>\n<tr>\n<td>Gemma 3 1B</td>\n<td>1B</td>\n<td>32K</td>\n<td>No</td>\n<td>Limited</td>\n<td>Yes</td>\n</tr>\n<tr>\n<td><strong>Gemma 4 E2B</strong></td>\n<td><strong>2.3B</strong></td>\n<td><strong>128K</strong></td>\n<td><strong>Yes</strong></td>\n<td><strong>35+</strong></td>\n<td><strong>Yes</strong></td>\n</tr>\n<tr>\n<td>Gemma 4 E4B</td>\n<td>4.5B</td>\n<td>128K</td>\n<td>Yes</td>\n<td>35+</td>\n<td>No (Ollama)</td>\n</tr>\n</tbody></table>\n<p>Gemma 4 E2B is now the most capable model in Daneel&#39;s WebGPU catalog: largest context window, built-in reasoning, and multilingual support — all at 2 GB.</p>\n<h2>Leaning more about Gemma 4</h2>\n<ul>\n<li><a href=\"https://ai.google.dev/gemma/docs/core/model_card_4\"><strong>Gemma 4 Model Card</strong></a></li>\n<li><a href=\"https://huggingface.co/google/gemma-4-31B-it\"><strong>Gemma 4 On Huggingface</strong></a></li>\n</ul>\n<h2>What&#39;s next</h2>\n<p>Gemma 4 is natively multi-modal at the model level — it understands images and short audio alongside text. Daneel currently uses it for text tasks. Image and audio input support is on our roadmap and will unlock these capabilities in a future update.</p>\n<h2>Getting started</h2>\n<p>Update Daneel to the latest version from the Chrome Web Store. The new models appear automatically in Settings &gt; Models.</p>\n<p>For Ollama users, make sure your server is up to date: <code>docker pull ollama/ollama:latest</code> (Gemma 4 requires a recent Ollama version.)</p>\n",
      "content_text": "\nGoogle just released Gemma 4, its most capable open model family to date. Daneel now supports it across both WebGPU (in-browser) and Ollama (local server) backends, with three model variants to choose from.\n\n## Why Gemma 4 matters\n\nGemma 4 represents a significant leap from Gemma 3 on every measurable axis. The improvements are not incremental — on long-context retrieval (MRCR v2 at 128K tokens), the new family scores 66.4% where Gemma 3 managed 13.5%. On visual document understanding (OmniDocBench), edit distance drops from 0.365 to 0.131. Reasoning benchmarks follow the same trend across the board.\n\nThe practical takeaway: Gemma 4 handles longer documents, understands questions better, and reasons more carefully than its predecessor, and you can run it locally without sending a single byte to the cloud.\n\n## What's new in the architecture\n\nGemma 4 introduces a hybrid attention mechanism that interleaves local sliding window attention with full global attention. This is what makes the 128K context window practical rather than theoretical: the model can actually retrieve and reason over information buried deep in long documents.\n\nOther highlights from Google's release:\n\n- **Built-in reasoning mode** with step-by-step thinking (similar to chain-of-thought)\n- **Native function calling** for agentic workflows and tool use\n- **35+ languages** supported, pre-trained on 140+\n- **Per-Layer Embeddings** in smaller variants, maximizing quality per parameter for on-device deployment\n\n## Three ways to run it in Daneel\n\n**WebGPU — in-browser, zero setup**\n\nGemma 4 E2B (2.3B parameters) runs directly in your browser at q4f16 quantization, using roughly 2 GB of GPU memory. No server, no API key, no network connection required after the initial model download. Select it from Settings > Models — it appears automatically.\n\nRequires a GPU with shader-f16 support (most GPUs from the last 3-4 years).\n\n**Ollama E2B — local server, lightweight**\n\nPull `gemma4:e2b` for the same 2.3B model running on your local Ollama instance. Good for machines where WebGPU isn't available or when you want to share the model across multiple tools.\n\n**Ollama E4B — local server, higher quality**\n\nPull `gemma4:e4b` for the 4.5B dense variant. Stronger reasoning and broader knowledge at the cost of roughly 4 GB VRAM. This is the sweet spot for users with 8+ GB GPUs who want the best local quality.\n\n## How it stacks up\n\n| Model | Params | Context | Thinking | Languages | Runs in browser |\n| ----- | ------ | ------- | -------- | --------- | --------------- |\n| Granite 4.0 Micro | 3B | 8K | No | English | Yes |\n| Gemma 3 1B | 1B | 32K | No | Limited | Yes |\n| **Gemma 4 E2B** | **2.3B** | **128K** | **Yes** | **35+** | **Yes** |\n| Gemma 4 E4B | 4.5B | 128K | Yes | 35+ | No (Ollama) |\n\nGemma 4 E2B is now the most capable model in Daneel's WebGPU catalog: largest context window, built-in reasoning, and multilingual support — all at 2 GB.\n\n## Leaning more about Gemma 4\n\n- [**Gemma 4 Model Card**](https://ai.google.dev/gemma/docs/core/model_card_4)\n- [**Gemma 4 On Huggingface**](https://huggingface.co/google/gemma-4-31B-it)\n\n## What's next\n\nGemma 4 is natively multi-modal at the model level — it understands images and short audio alongside text. Daneel currently uses it for text tasks. Image and audio input support is on our roadmap and will unlock these capabilities in a future update.\n\n## Getting started\n\nUpdate Daneel to the latest version from the Chrome Web Store. The new models appear automatically in Settings > Models.\n\nFor Ollama users, make sure your server is up to date: `docker pull ollama/ollama:latest` (Gemma 4 requires a recent Ollama version.)\n",
      "date_published": "2026-04-03T00:00:00.000Z",
      "image": "https://daneel.injen.io/medias/gemma4.jpg",
      "tags": [
        "webgpu",
        "ollama",
        "models",
        "privacy"
      ]
    },
    {
      "id": "https://daneel.injen.io/news/youtube-transcript-chat.html",
      "url": "https://daneel.injen.io/news/youtube-transcript-chat.html?utm_source=json&utm_medium=feed&utm_campaign=news_syndication",
      "title": "Chat with any YouTube video",
      "summary": "Daneel now extracts YouTube transcripts automatically — ask questions, get summaries, and find key moments without leaving the page.",
      "content_html": "<h2>Ask questions, get answers, right from video transcript</h2>\n<p>Daneel now understands YouTube videos.</p>\n<p>When you open any video on YouTube, Daneel automatically extracts the full transcript and makes it available as context for your conversation.</p>\n<p>No extra clicks, no copy-pasting, <strong>just open the video and start asking.</strong></p>\n<h2>How it works</h2>\n<p>Navigate to any YouTube video with captions available. Daneel detects the video, pulls the transcript directly from YouTube&#39;s player API, and processes it into a clean, timestamped document — complete with the video title, channel name, duration, and language.</p>\n<p>From there, you can ask anything in Page Q&amp;A mode:</p>\n<ul>\n<li>&quot;Summarize this video in three bullet points&quot;</li>\n<li>&quot;What does the speaker say about pricing at around the 12-minute mark?&quot;</li>\n<li>&quot;List all the tools mentioned in this tutorial&quot;</li>\n<li>&quot;Explain the main argument in simpler terms&quot;</li>\n</ul>\n<p>The transcript is formatted with timestamps, so answers can point you to the exact moment in the video.</p>\n<h2>Every language YouTube supports</h2>\n<p>Daneel works with all caption tracks YouTube provides — manual and auto-generated, in any language. It automatically selects the best available track: manual captions first, then auto-generated, with a preference for your browser&#39;s language.</p>\n<p>The output clearly labels whether captions are manual or auto-generated, so you always know what you&#39;re working with.</p>\n<h2>No third parties involved</h2>\n<p>The transcript flows directly from YouTube&#39;s API to your local extension. No external transcription services, no data leaving your machine beyond the standard YouTube request. The same privacy model you expect from Daneel applies here — your questions and the transcript stay local to your browser.</p>\n<h2>Works with YouTube&#39;s SPA navigation</h2>\n<p>YouTube uses client-side routing — clicking from video to video doesn&#39;t trigger a full page reload. Daneel handles this correctly, detecting navigation events and extracting a fresh transcript each time you switch videos. No need to refresh the page.</p>\n<h2>Try it now</h2>\n<p>Open any YouTube video with captions, activate Daneel, and ask your first question.</p>\n<p>It works with every AI backend: WebGPU, Ollama, Gemini Nano, or Claude.</p>\n",
      "content_text": "\n## Ask questions, get answers, right from video transcript\n\nDaneel now understands YouTube videos.\n\nWhen you open any video on YouTube, Daneel automatically extracts the full transcript and makes it available as context for your conversation.\n\nNo extra clicks, no copy-pasting, **just open the video and start asking.**\n\n## How it works\n\nNavigate to any YouTube video with captions available. Daneel detects the video, pulls the transcript directly from YouTube's player API, and processes it into a clean, timestamped document — complete with the video title, channel name, duration, and language.\n\nFrom there, you can ask anything in Page Q&A mode:\n\n- \"Summarize this video in three bullet points\"\n- \"What does the speaker say about pricing at around the 12-minute mark?\"\n- \"List all the tools mentioned in this tutorial\"\n- \"Explain the main argument in simpler terms\"\n\nThe transcript is formatted with timestamps, so answers can point you to the exact moment in the video.\n\n## Every language YouTube supports\n\nDaneel works with all caption tracks YouTube provides — manual and auto-generated, in any language. It automatically selects the best available track: manual captions first, then auto-generated, with a preference for your browser's language.\n\nThe output clearly labels whether captions are manual or auto-generated, so you always know what you're working with.\n\n## No third parties involved\n\nThe transcript flows directly from YouTube's API to your local extension. No external transcription services, no data leaving your machine beyond the standard YouTube request. The same privacy model you expect from Daneel applies here — your questions and the transcript stay local to your browser.\n\n## Works with YouTube's SPA navigation\n\nYouTube uses client-side routing — clicking from video to video doesn't trigger a full page reload. Daneel handles this correctly, detecting navigation events and extracting a fresh transcript each time you switch videos. No need to refresh the page.\n\n## Try it now\n\nOpen any YouTube video with captions, activate Daneel, and ask your first question.\n\nIt works with every AI backend: WebGPU, Ollama, Gemini Nano, or Claude.\n",
      "date_published": "2026-04-02T00:00:00.000Z",
      "image": "https://daneel.injen.io/medias/youtube.png",
      "tags": [
        "feature",
        "youtube",
        "page-qa"
      ]
    },
    {
      "id": "https://daneel.injen.io/news/vault-part-2.html",
      "url": "https://daneel.injen.io/news/vault-part-2.html?utm_source=json&utm_medium=feed&utm_campaign=news_syndication",
      "title": "The Vault, part 2: your knowledge graph",
      "summary": "Daneel extracts entities from your documents, resolves duplicates, builds a relationship graph, and renders it as an interactive 3D visualization you can filter and explore.",
      "content_html": "<h2>From documents to understanding</h2>\n<p>In Part 1, we covered how the Vault stores and searches your documents using semantic embeddings. That gives you great retrieval, but it treats documents as bags of text. The knowledge graph goes further: it reads your documents, identifies the people, organizations, places, and concepts they mention, figures out which entities co-occur, and builds a navigable graph of relationships.</p>\n<p>The result is a map of what your documents are actually about.</p>\n<p><img src=\"https://daneel.injen.io/medias/articles/kg.graph.albert.large.jpg\" alt=\"Knowledge graph from Albert Einstein Wikipedia page\"></p>\n<h2>How entity extraction works</h2>\n<p>The extraction pipeline uses GLiNER, a span-level transformer model designed for named entity recognition with custom labels. Unlike traditional NER systems locked to a fixed set of types (person, location, organization), GLiNER accepts whatever entity types you define. Tell it to look for &quot;regulation,&quot; &quot;court,&quot; and &quot;penalty&quot; in your legal documents, and it will.</p>\n<p>Four model variants are available, depending on your hardware and language needs:</p>\n<ul>\n<li><strong>Small v2.1 (fp32)</strong> at 583 MB for best English accuracy on GPU</li>\n<li><strong>Small v2.1 (int8)</strong> at 183 MB for fast CPU-only extraction</li>\n<li><strong>Multi v2.1 (int8)</strong> at 349 MB for 100+ languages on CPU</li>\n<li><strong>Multi v2.1 (fp16)</strong> at 580 MB for multilingual with GPU acceleration</li>\n</ul>\n<p>The model runs locally through ONNX Runtime, using WebGPU when available and falling back to WASM. Your documents never leave the browser for entity extraction.</p>\n<p>Chunks are processed in batches of eight. For each batch, GLiNER evaluates all candidate spans (up to 12 tokens wide) against your entity types, scores them with a confidence threshold (default 0.3), and resolves overlapping spans with greedy selection. A noise filter strips out pronouns, stop words, URL fragments, and overly short strings before anything reaches the graph.</p>\n<h2>Ontologies: tell the AI what to look for</h2>\n<p>Entity types are defined through ontologies. Daneel ships eight domain-specific presets:</p>\n<ul>\n<li><strong>General</strong> for broad documents: person, organization, location, product, concept</li>\n<li><strong>Academic &amp; Research</strong> for papers: institution, theory, method, publication, dataset</li>\n<li><strong>Legal &amp; Regulatory</strong> for compliance: regulation, law, jurisdiction, contract, clause</li>\n<li><strong>Medical &amp; Healthcare</strong> for clinical docs: disease, symptom, treatment, drug, gene</li>\n<li><strong>Programming &amp; Software</strong> for code docs: class, function, library, framework, API</li>\n<li><strong>Business &amp; Finance</strong> for corporate: company, market, revenue, acquisition</li>\n<li><strong>Travel &amp; Tourism</strong> for guides: hotel, airline, landmark, restaurant</li>\n<li><strong>History &amp; Geography</strong> for reference: person, event, battle, dynasty, artifact</li>\n</ul>\n<p>Each preset is a starting point. You can create your own ontologies from scratch, picking from a universal vocabulary of 100 entity types organized across eight pillars: agents, organizations, places, events, knowledge, creations, legal concepts, and technology. Or just type in your own labels. The ontology editor lets you name it, pick an icon, and toggle it on or off per vault.</p>\n<p>Different vaults can use different ontologies. Your legal vault extracts regulations and clauses. Your research vault extracts theories and datasets. Same pipeline, different lenses.</p>\n<h2>Entity resolution: no duplicates</h2>\n<p>Raw NER output is messy. &quot;Albert Einstein,&quot; &quot;Einstein,&quot; and &quot;A. Einstein&quot; all refer to the same person. The entity resolver handles this with a two-pass algorithm.</p>\n<p>First pass: text matching. After normalizing case and punctuation, the resolver checks for exact matches, substring containment (&quot;Einstein&quot; inside &quot;Albert Einstein&quot;), and reversed name order (&quot;Einstein, Albert&quot; matches &quot;Albert Einstein&quot;). All comparisons are scoped by entity type, so a company named &quot;Einstein&quot; won&#39;t merge with the physicist.</p>\n<p>Second pass: embedding similarity. Each new entity gets embedded using the same model that handles document chunks. The resolver computes cosine similarity against all existing entities of the same type. If similarity exceeds the threshold (default 0.92), the entities merge. If not, a new canonical entity is created.</p>\n<p>The result is a clean set of deduplicated entities with mention counts that reflect how often each one appears across your documents.</p>\n<h2>Building the graph</h2>\n<p>With entities extracted and deduplicated, the graph builder connects them through co-occurrence. When two entities appear in the same chunk, they get an edge. Multiple co-occurrences in different chunks increase the edge weight, reflecting stronger relationships.</p>\n<p>The build process is incremental and tracks progress in real time. You see the chunk count advancing, the entity count growing, and a type breakdown (e.g., &quot;person: 42, organization: 38, regulation: 15&quot;) updating as extraction proceeds.</p>\n<p>Graphs are stored in a dedicated IndexedDB database (<code>daneel-kg</code>), separate from the main chunk store. Three object stores hold entities, mentions (chunk-to-entity edges), and serialized graph state. Everything is vault-scoped, so deleting a vault cleanly removes its graph.</p>\n<h2>3D interactive visualization</h2>\n<p>This is the part you have to see. The knowledge graph renders as a force-directed 3D network using Three.js and WebGL.</p>\n<p>Entities become spheres, sized logarithmically by mention count. Colors are assigned by type from a curated palette: blue tones for people and agents, orange for organizations, green for places, red for events, purple for knowledge concepts, teal for creative works. Over 100 entity types have dedicated colors; anything else falls back to neutral gray.</p>\n<p>Edges connect co-occurring entities. Their width reflects relationship strength. Gold directional particles flow along edges, showing the structure of the network in motion.</p>\n<p>The simulation uses D3 force physics: nodes repel each other (configurable charge strength), edges pull connected nodes together (configurable link distance), and the whole system settles into a stable layout over a few seconds. You can orbit, zoom, and drag to explore from any angle.</p>\n<h2>Filtering and focus</h2>\n<p>A type legend overlays the visualization, showing every entity type present in the graph with its count. Click a type to toggle it off. This lets you strip away noise and focus on the entity categories that matter for your question.</p>\n<p>A document dropdown scopes the graph to a single file. Select a specific document and only entities mentioned in that document remain visible, with their co-occurrence edges intact. Switch back to &quot;all documents&quot; to see the full picture.</p>\n<p>Click any node to focus on its neighborhood. The camera zooms to that entity and highlights its direct connections (capped at 25 neighbors to keep things readable). Click again to zoom in further. This makes it easy to explore dense graphs by starting from a known entity and walking outward.</p>\n<h2>Tuning the visualization</h2>\n<p>The settings panel exposes the physics and rendering parameters for users who want control:</p>\n<ul>\n<li><strong>Charge strength</strong> adjusts how strongly nodes repel each other (denser or more spread out)</li>\n<li><strong>Link distance</strong> sets the preferred edge length</li>\n<li><strong>Node scale</strong> controls sphere sizes</li>\n<li><strong>Link opacity</strong> dims or brightens edges</li>\n<li><strong>Particle speed</strong> controls the flow rate of directional particles along edges</li>\n<li><strong>Bloom</strong> enables a GPU-powered glow effect (UnrealBloomPass) for a more dramatic look</li>\n</ul>\n<p>These are saved per session and apply immediately, so you can experiment in real time.</p>\n<h2>What you can learn</h2>\n<p>The knowledge graph surfaces relationships that are hard to spot by reading documents sequentially. Which people are mentioned alongside which organizations? Which regulations co-occur with which penalties? Which concepts bridge two otherwise separate document clusters?</p>\n<p>Combined with the Vault&#39;s RAG capabilities from Part 1, you can explore the graph to identify patterns, then switch to chat mode and ask targeted questions grounded in the actual source text. The graph tells you where to look. The RAG gives you the answers.</p>\n<p>This is still an early feature, and we&#39;re actively expanding it. Entity-augmented search (using graph relationships to boost retrieval) and cross-vault graph merging are on the roadmap. For now, build a vault, extract entities, and explore what your documents know.</p>\n",
      "content_text": "\n## From documents to understanding\n\nIn Part 1, we covered how the Vault stores and searches your documents using semantic embeddings. That gives you great retrieval, but it treats documents as bags of text. The knowledge graph goes further: it reads your documents, identifies the people, organizations, places, and concepts they mention, figures out which entities co-occur, and builds a navigable graph of relationships.\n\nThe result is a map of what your documents are actually about.\n\n![Knowledge graph from Albert Einstein Wikipedia page](/medias/articles/kg.graph.albert.large.jpg)\n\n## How entity extraction works\n\nThe extraction pipeline uses GLiNER, a span-level transformer model designed for named entity recognition with custom labels. Unlike traditional NER systems locked to a fixed set of types (person, location, organization), GLiNER accepts whatever entity types you define. Tell it to look for \"regulation,\" \"court,\" and \"penalty\" in your legal documents, and it will.\n\nFour model variants are available, depending on your hardware and language needs:\n\n- **Small v2.1 (fp32)** at 583 MB for best English accuracy on GPU\n- **Small v2.1 (int8)** at 183 MB for fast CPU-only extraction\n- **Multi v2.1 (int8)** at 349 MB for 100+ languages on CPU\n- **Multi v2.1 (fp16)** at 580 MB for multilingual with GPU acceleration\n\nThe model runs locally through ONNX Runtime, using WebGPU when available and falling back to WASM. Your documents never leave the browser for entity extraction.\n\nChunks are processed in batches of eight. For each batch, GLiNER evaluates all candidate spans (up to 12 tokens wide) against your entity types, scores them with a confidence threshold (default 0.3), and resolves overlapping spans with greedy selection. A noise filter strips out pronouns, stop words, URL fragments, and overly short strings before anything reaches the graph.\n\n## Ontologies: tell the AI what to look for\n\nEntity types are defined through ontologies. Daneel ships eight domain-specific presets:\n\n- **General** for broad documents: person, organization, location, product, concept\n- **Academic & Research** for papers: institution, theory, method, publication, dataset\n- **Legal & Regulatory** for compliance: regulation, law, jurisdiction, contract, clause\n- **Medical & Healthcare** for clinical docs: disease, symptom, treatment, drug, gene\n- **Programming & Software** for code docs: class, function, library, framework, API\n- **Business & Finance** for corporate: company, market, revenue, acquisition\n- **Travel & Tourism** for guides: hotel, airline, landmark, restaurant\n- **History & Geography** for reference: person, event, battle, dynasty, artifact\n\nEach preset is a starting point. You can create your own ontologies from scratch, picking from a universal vocabulary of 100 entity types organized across eight pillars: agents, organizations, places, events, knowledge, creations, legal concepts, and technology. Or just type in your own labels. The ontology editor lets you name it, pick an icon, and toggle it on or off per vault.\n\nDifferent vaults can use different ontologies. Your legal vault extracts regulations and clauses. Your research vault extracts theories and datasets. Same pipeline, different lenses.\n\n## Entity resolution: no duplicates\n\nRaw NER output is messy. \"Albert Einstein,\" \"Einstein,\" and \"A. Einstein\" all refer to the same person. The entity resolver handles this with a two-pass algorithm.\n\nFirst pass: text matching. After normalizing case and punctuation, the resolver checks for exact matches, substring containment (\"Einstein\" inside \"Albert Einstein\"), and reversed name order (\"Einstein, Albert\" matches \"Albert Einstein\"). All comparisons are scoped by entity type, so a company named \"Einstein\" won't merge with the physicist.\n\nSecond pass: embedding similarity. Each new entity gets embedded using the same model that handles document chunks. The resolver computes cosine similarity against all existing entities of the same type. If similarity exceeds the threshold (default 0.92), the entities merge. If not, a new canonical entity is created.\n\nThe result is a clean set of deduplicated entities with mention counts that reflect how often each one appears across your documents.\n\n## Building the graph\n\nWith entities extracted and deduplicated, the graph builder connects them through co-occurrence. When two entities appear in the same chunk, they get an edge. Multiple co-occurrences in different chunks increase the edge weight, reflecting stronger relationships.\n\nThe build process is incremental and tracks progress in real time. You see the chunk count advancing, the entity count growing, and a type breakdown (e.g., \"person: 42, organization: 38, regulation: 15\") updating as extraction proceeds.\n\nGraphs are stored in a dedicated IndexedDB database (`daneel-kg`), separate from the main chunk store. Three object stores hold entities, mentions (chunk-to-entity edges), and serialized graph state. Everything is vault-scoped, so deleting a vault cleanly removes its graph.\n\n## 3D interactive visualization\n\nThis is the part you have to see. The knowledge graph renders as a force-directed 3D network using Three.js and WebGL.\n\nEntities become spheres, sized logarithmically by mention count. Colors are assigned by type from a curated palette: blue tones for people and agents, orange for organizations, green for places, red for events, purple for knowledge concepts, teal for creative works. Over 100 entity types have dedicated colors; anything else falls back to neutral gray.\n\nEdges connect co-occurring entities. Their width reflects relationship strength. Gold directional particles flow along edges, showing the structure of the network in motion.\n\nThe simulation uses D3 force physics: nodes repel each other (configurable charge strength), edges pull connected nodes together (configurable link distance), and the whole system settles into a stable layout over a few seconds. You can orbit, zoom, and drag to explore from any angle.\n\n## Filtering and focus\n\nA type legend overlays the visualization, showing every entity type present in the graph with its count. Click a type to toggle it off. This lets you strip away noise and focus on the entity categories that matter for your question.\n\nA document dropdown scopes the graph to a single file. Select a specific document and only entities mentioned in that document remain visible, with their co-occurrence edges intact. Switch back to \"all documents\" to see the full picture.\n\nClick any node to focus on its neighborhood. The camera zooms to that entity and highlights its direct connections (capped at 25 neighbors to keep things readable). Click again to zoom in further. This makes it easy to explore dense graphs by starting from a known entity and walking outward.\n\n## Tuning the visualization\n\nThe settings panel exposes the physics and rendering parameters for users who want control:\n\n- **Charge strength** adjusts how strongly nodes repel each other (denser or more spread out)\n- **Link distance** sets the preferred edge length\n- **Node scale** controls sphere sizes\n- **Link opacity** dims or brightens edges\n- **Particle speed** controls the flow rate of directional particles along edges\n- **Bloom** enables a GPU-powered glow effect (UnrealBloomPass) for a more dramatic look\n\nThese are saved per session and apply immediately, so you can experiment in real time.\n\n## What you can learn\n\nThe knowledge graph surfaces relationships that are hard to spot by reading documents sequentially. Which people are mentioned alongside which organizations? Which regulations co-occur with which penalties? Which concepts bridge two otherwise separate document clusters?\n\nCombined with the Vault's RAG capabilities from Part 1, you can explore the graph to identify patterns, then switch to chat mode and ask targeted questions grounded in the actual source text. The graph tells you where to look. The RAG gives you the answers.\n\nThis is still an early feature, and we're actively expanding it. Entity-augmented search (using graph relationships to boost retrieval) and cross-vault graph merging are on the roadmap. For now, build a vault, extract entities, and explore what your documents know.\n",
      "date_published": "2026-04-01T00:00:00.000Z",
      "image": "https://daneel.injen.io/medias/kg.2.png",
      "tags": [
        "feature",
        "vault",
        "knowledge-graph",
        "ner",
        "visualization"
      ]
    },
    {
      "id": "https://daneel.injen.io/news/docker-companion.html",
      "url": "https://daneel.injen.io/news/docker-companion.html?utm_source=json&utm_medium=feed&utm_campaign=news_syndication",
      "title": "Docker Companion — local MCP servers, Ollama, and health monitoring from your browser",
      "summary": "A built-in Docker Compose generator that spins up local MCP servers, Ollama, and a health sidecar — all from your browser settings. Power user preview.",
      "content_html": "<h2>For the tinkerers</h2>\n<p>Most Daneel features work out of the box — install the extension, open a page, start chatting. But some of the most powerful capabilities live outside the browser: local MCP servers that expose filesystems, databases, and search APIs to your AI.</p>\n<p>Running those servers means Docker images, port mappings, environment variables, and compose files. If you&#39;re comfortable with that, the Docker Companion gives you a GUI that generates it all — and auto-registers everything back into Daneel.</p>\n<p>This is a beta feature for power users with Docker on their machine. If that&#39;s you, read on.</p>\n<h2>What it does</h2>\n<p>The Docker Companion is a Compose file generator built into Daneel&#39;s settings. Toggle presets, pick MCP servers from a template catalog, configure environment variables, preview the YAML, and export — all without leaving the browser.</p>\n<p>Three service categories:</p>\n<p><strong>Companion Sidecar</strong> (always on) — a lightweight Python/FastAPI container that monitors your stack. It mounts the Docker socket read-only, discovers containers labeled <code>daneel.managed</code>, and reports their health, ports, and status back to the extension. The settings panel polls it every 10 seconds and shows live service status.</p>\n<p><strong>Ollama</strong> (optional) — a managed Ollama instance with CORS pre-configured for Chrome extensions (<code>OLLAMA_ORIGINS=chrome-extension://*</code>), persistent model storage via a named volume, and optional NVIDIA GPU passthrough. One toggle, and you have a local LLM server that Daneel can connect to immediately.</p>\n<p><strong>MCP Servers</strong> (optional, beta) — this is the interesting part. Each server you add becomes a separate container running <code>supercorp/supergateway</code>, which bridges stdio-based MCP servers to HTTP endpoints that Daneel already understands. One container per server, sequential ports, automatic CORS.</p>\n<h2>Nine server templates — and custom commands</h2>\n<p>The template catalog includes pre-configured MCP servers ready to deploy:</p>\n<table>\n<thead>\n<tr>\n<th>Server</th>\n<th>What it does</th>\n<th>Requires</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><strong>Filesystem</strong></td>\n<td>Read/write files on a mounted volume</td>\n<td>Volume mount</td>\n</tr>\n<tr>\n<td><strong>GitHub</strong></td>\n<td>Repos, issues, PRs, file access</td>\n<td><code>GITHUB_TOKEN</code></td>\n</tr>\n<tr>\n<td><strong>SQLite</strong></td>\n<td>Query and manage SQLite databases</td>\n<td>Volume mount</td>\n</tr>\n<tr>\n<td><strong>PostgreSQL</strong></td>\n<td>Query PostgreSQL databases</td>\n<td><code>DATABASE_URL</code></td>\n</tr>\n<tr>\n<td><strong>Brave Search</strong></td>\n<td>Web search via Brave API</td>\n<td><code>BRAVE_API_KEY</code></td>\n</tr>\n<tr>\n<td><strong>Perplexity</strong></td>\n<td>Web search and reasoning via Sonar</td>\n<td><code>PERPLEXITY_API_KEY</code></td>\n</tr>\n<tr>\n<td><strong>Fetch</strong></td>\n<td>Extract content from any URL</td>\n<td>Nothing</td>\n</tr>\n<tr>\n<td><strong>Memory</strong></td>\n<td>Persistent knowledge graph</td>\n<td>Nothing</td>\n</tr>\n<tr>\n<td><strong>Puppeteer</strong></td>\n<td>Browser automation and scraping</td>\n<td>Nothing</td>\n</tr>\n</tbody></table>\n<p>Pick a template, fill in any required environment variables (secrets are masked in the UI), and the server is added to your compose stack. Each server gets a sequential port starting from 8810: first server at <code>localhost:8810/mcp</code>, second at <code>localhost:8811/mcp</code>, and so on.</p>\n<p>Need something not in the catalog? The &quot;Custom&quot; option lets you specify any arbitrary stdio command — <code>python -m my_server</code>, <code>npx my-private-mcp-package</code>, whatever your setup requires.</p>\n<h2>The supergateway bridge</h2>\n<p>Most MCP servers speak stdio — they read JSON-RPC from stdin and write to stdout. That&#39;s great for local CLI tools, but a Chrome extension needs HTTP.</p>\n<p>Supergateway solves this. Each MCP server container runs <code>supercorp/supergateway</code> (or the <code>:uvx</code> variant for Python packages), which spawns your stdio server as a subprocess and exposes it as a Streamable HTTP endpoint with CORS headers. The generated command:</p>\n<pre><code>--stdio \"uvx mcp-server-filesystem /data\" --port 8000 --cors --outputTransport streamableHttp</code></pre><p>From Daneel&#39;s perspective, each container looks like a standard remote MCP server. The existing transport and tool-calling loop work unchanged — no special local-server handling needed.</p>\n<h2>YAML preview and export</h2>\n<p>The settings panel shows a live YAML preview that updates as you toggle services and add servers. You can inspect exactly what will be generated before committing.</p>\n<p>Two export paths: <strong>copy to clipboard</strong> or <strong>download as <code>daneel.compose.yml</code></strong>. Then:</p>\n<pre><code>docker compose -f daneel.compose.yml up -d</code></pre><p>All services start in the background with automatic restart policies. The companion sidecar begins discovering managed containers immediately.</p>\n<h2>Auto-registration</h2>\n<p>Here&#39;s the workflow payoff: when you export, Daneel can <strong>automatically register</strong> every MCP server in its internal registry. No need to manually add <code>http://localhost:8810/mcp</code> in the MCP settings — check the &quot;auto-register&quot; box and each server appears in your registered server list, ready to use in conversations, agents, and vaults.</p>\n<p>The registered servers are marked as local (<code>isExternal: false</code>), so Daneel&#39;s privacy indicators correctly show that tool calls stay on your machine.</p>\n<h2>Live health monitoring</h2>\n<p>Once the stack is running, the Companion Status section in settings shows real-time service health. Each managed container appears with its name, exposed ports, and status badge — running, stopped, restarting, or unknown. The companion polls the Docker socket every request and the extension polls the companion every 10 seconds.</p>\n<p>If the companion is unreachable, the panel shows the exact <code>docker compose</code> command to start it.</p>\n<h2>What&#39;s coming</h2>\n<p>This is a preview for a reason — we&#39;re building toward a richer local infrastructure layer:</p>\n<ul>\n<li><strong>SearXNG preset</strong> — a self-hosted search engine as an MCP server, giving your AI private web search with no API keys</li>\n<li><strong>Microsoft BitNet</strong> — 1-bit inference for extreme efficiency on CPU</li>\n<li><strong>Observability stack</strong> — Prometheus + Grafana preset for monitoring inference latency and token throughput</li>\n<li><strong>More MCP templates</strong> — as the MCP ecosystem grows, the template catalog will track it</li>\n</ul>\n<p>The Docker Companion is infrastructure-as-settings. If you run Docker, your browser just became a control plane.</p>\n",
      "content_text": "\n## For the tinkerers\n\nMost Daneel features work out of the box — install the extension, open a page, start chatting. But some of the most powerful capabilities live outside the browser: local MCP servers that expose filesystems, databases, and search APIs to your AI.\n\nRunning those servers means Docker images, port mappings, environment variables, and compose files. If you're comfortable with that, the Docker Companion gives you a GUI that generates it all — and auto-registers everything back into Daneel.\n\nThis is a beta feature for power users with Docker on their machine. If that's you, read on.\n\n## What it does\n\nThe Docker Companion is a Compose file generator built into Daneel's settings. Toggle presets, pick MCP servers from a template catalog, configure environment variables, preview the YAML, and export — all without leaving the browser.\n\nThree service categories:\n\n**Companion Sidecar** (always on) — a lightweight Python/FastAPI container that monitors your stack. It mounts the Docker socket read-only, discovers containers labeled `daneel.managed`, and reports their health, ports, and status back to the extension. The settings panel polls it every 10 seconds and shows live service status.\n\n**Ollama** (optional) — a managed Ollama instance with CORS pre-configured for Chrome extensions (`OLLAMA_ORIGINS=chrome-extension://*`), persistent model storage via a named volume, and optional NVIDIA GPU passthrough. One toggle, and you have a local LLM server that Daneel can connect to immediately.\n\n**MCP Servers** (optional, beta) — this is the interesting part. Each server you add becomes a separate container running `supercorp/supergateway`, which bridges stdio-based MCP servers to HTTP endpoints that Daneel already understands. One container per server, sequential ports, automatic CORS.\n\n## Nine server templates — and custom commands\n\nThe template catalog includes pre-configured MCP servers ready to deploy:\n\n| Server | What it does | Requires |\n|--------|-------------|----------|\n| **Filesystem** | Read/write files on a mounted volume | Volume mount |\n| **GitHub** | Repos, issues, PRs, file access | `GITHUB_TOKEN` |\n| **SQLite** | Query and manage SQLite databases | Volume mount |\n| **PostgreSQL** | Query PostgreSQL databases | `DATABASE_URL` |\n| **Brave Search** | Web search via Brave API | `BRAVE_API_KEY` |\n| **Perplexity** | Web search and reasoning via Sonar | `PERPLEXITY_API_KEY` |\n| **Fetch** | Extract content from any URL | Nothing |\n| **Memory** | Persistent knowledge graph | Nothing |\n| **Puppeteer** | Browser automation and scraping | Nothing |\n\nPick a template, fill in any required environment variables (secrets are masked in the UI), and the server is added to your compose stack. Each server gets a sequential port starting from 8810: first server at `localhost:8810/mcp`, second at `localhost:8811/mcp`, and so on.\n\nNeed something not in the catalog? The \"Custom\" option lets you specify any arbitrary stdio command — `python -m my_server`, `npx my-private-mcp-package`, whatever your setup requires.\n\n## The supergateway bridge\n\nMost MCP servers speak stdio — they read JSON-RPC from stdin and write to stdout. That's great for local CLI tools, but a Chrome extension needs HTTP.\n\nSupergateway solves this. Each MCP server container runs `supercorp/supergateway` (or the `:uvx` variant for Python packages), which spawns your stdio server as a subprocess and exposes it as a Streamable HTTP endpoint with CORS headers. The generated command:\n\n```\n--stdio \"uvx mcp-server-filesystem /data\" --port 8000 --cors --outputTransport streamableHttp\n```\n\nFrom Daneel's perspective, each container looks like a standard remote MCP server. The existing transport and tool-calling loop work unchanged — no special local-server handling needed.\n\n## YAML preview and export\n\nThe settings panel shows a live YAML preview that updates as you toggle services and add servers. You can inspect exactly what will be generated before committing.\n\nTwo export paths: **copy to clipboard** or **download as `daneel.compose.yml`**. Then:\n\n```bash\ndocker compose -f daneel.compose.yml up -d\n```\n\nAll services start in the background with automatic restart policies. The companion sidecar begins discovering managed containers immediately.\n\n## Auto-registration\n\nHere's the workflow payoff: when you export, Daneel can **automatically register** every MCP server in its internal registry. No need to manually add `http://localhost:8810/mcp` in the MCP settings — check the \"auto-register\" box and each server appears in your registered server list, ready to use in conversations, agents, and vaults.\n\nThe registered servers are marked as local (`isExternal: false`), so Daneel's privacy indicators correctly show that tool calls stay on your machine.\n\n## Live health monitoring\n\nOnce the stack is running, the Companion Status section in settings shows real-time service health. Each managed container appears with its name, exposed ports, and status badge — running, stopped, restarting, or unknown. The companion polls the Docker socket every request and the extension polls the companion every 10 seconds.\n\nIf the companion is unreachable, the panel shows the exact `docker compose` command to start it.\n\n## What's coming\n\nThis is a preview for a reason — we're building toward a richer local infrastructure layer:\n\n- **SearXNG preset** — a self-hosted search engine as an MCP server, giving your AI private web search with no API keys\n- **Microsoft BitNet** — 1-bit inference for extreme efficiency on CPU\n- **Observability stack** — Prometheus + Grafana preset for monitoring inference latency and token throughput\n- **More MCP templates** — as the MCP ecosystem grows, the template catalog will track it\n\nThe Docker Companion is infrastructure-as-settings. If you run Docker, your browser just became a control plane.\n",
      "date_published": "2026-03-28T00:00:00.000Z",
      "image": "https://daneel.injen.io/medias/docker.companion.jpg",
      "tags": [
        "preview",
        "docker",
        "mcp",
        "power-user",
        "infrastructure"
      ]
    },
    {
      "id": "https://daneel.injen.io/news/data-portability.html",
      "url": "https://daneel.injen.io/news/data-portability.html?utm_source=json&utm_medium=feed&utm_campaign=news_syndication",
      "title": "Your data, your way — backup anywhere",
      "summary": "Export everything to a local file, Azure Blob Storage, or any S3-compatible service. Your settings, conversations, and indexed sites travel with you — your secrets don't.",
      "content_html": "<h2>A local-first tool should give you local-first control</h2>\n<p>Daneel runs on your machine. Your conversations, your indexed sites, your vault documents — they live in your browser&#39;s storage, not on our servers. That&#39;s the promise.</p>\n<p>But local storage has a weakness: it&#39;s tied to one browser, on one machine. Reinstall Chrome, switch laptops, or clear your data — and everything is gone.</p>\n<p>Data portability fixes that. Starting today, you can export your entire Daneel workspace to a portable file and restore it anywhere. And if you want automated cloud backup, we support Azure Blob Storage and any S3-compatible service — without a single external SDK.</p>\n<h2>One-click local backup</h2>\n<p>The simplest path: open Settings, go to Data, and click &quot;Export to file.&quot; Daneel gathers your settings, conversations, and all indexed site data, compresses everything into a timestamped ZIP, and downloads it to your machine.</p>\n<p>To restore, click &quot;Import from file,&quot; pick the ZIP, and everything comes back — settings, chat history, embeddings, vault metadata. A progress bar tracks each stage so you know exactly where the import stands.</p>\n<p>The ZIP is self-contained and versioned. You can store it in your own backup system, share it across machines, or keep it as a snapshot before experimenting with settings.</p>\n<h2>What&#39;s inside — and what&#39;s not</h2>\n<p>Transparency matters when you&#39;re moving data around. Here&#39;s exactly what an export contains:</p>\n<p><strong>Included:</strong></p>\n<ul>\n<li>All user settings and preferences</li>\n<li>Every conversation (page chats and vault chats)</li>\n<li>Indexed site data with full embeddings (stored as efficient binary, not bloated JSON)</li>\n<li>Vault metadata and document references</li>\n<li>MCP server registrations and agent definitions</li>\n</ul>\n<p><strong>Excluded by design:</strong></p>\n<ul>\n<li>API keys (Claude, Azure OpenAI) — encrypted at rest, never serialized</li>\n<li>MCP credentials (OAuth tokens, API keys for connected services)</li>\n<li>Telemetry identifiers</li>\n<li>Backup provider credentials themselves (no circular leaks)</li>\n<li>Downloaded model files (too large, re-downloaded on demand)</li>\n</ul>\n<p>This separation is deliberate. Your workflow travels with you. Your secrets stay behind, exactly where they should be.</p>\n<h2>Azure Blob Storage</h2>\n<p>If you use Azure, backup is straightforward. Generate a Container SAS token in the Azure portal (read + write + list permissions), paste the URL into Daneel, and click &quot;Test Connection.&quot; Once validated, &quot;Upload to Azure&quot; exports and uploads in one step.</p>\n<p>Daneel talks directly to the Azure REST API — no Azure SDK, no npm packages, no intermediary services. The SAS token authenticates every request. Your backup lands as <code>daneel.backup.zip</code> in your container, overwritten on each upload.</p>\n<p>Restoring is the reverse: &quot;Download from Azure&quot; pulls the ZIP and imports everything. The same progress tracking shows upload and download stages in real time.</p>\n<h2>S3-compatible — AWS and beyond</h2>\n<p>For S3-compatible storage, enter your access key, secret key, bucket name, and region. Optionally set a custom endpoint URL for services that aren&#39;t AWS:</p>\n<ul>\n<li><strong>AWS S3</strong> — the default, virtual-hosted bucket URLs</li>\n<li><strong>Cloudflare R2</strong> — set the R2 endpoint, zero egress fees</li>\n<li><strong>Backblaze B2</strong> — set the B2 S3-compatible endpoint</li>\n<li><strong>MinIO</strong> — self-hosted, point to your own server</li>\n</ul>\n<p>The same &quot;Test Connection&quot; then &quot;Upload&quot; then &quot;Download&quot; flow works identically across all four. Daneel auto-detects whether to use virtual-hosted or path-style URLs based on whether you&#39;ve set a custom endpoint.</p>\n<p>Your IAM user needs just three permissions: <code>s3:GetObject</code>, <code>s3:PutObject</code>, and <code>s3:ListBucket</code> on the target bucket. Nothing more.</p>\n<h2>Built from scratch — zero dependencies</h2>\n<p>Both the Azure and S3 integrations are built on pure browser APIs. No SDKs, no bundled libraries, no supply chain risk.</p>\n<p>The S3 client includes a complete AWS Signature Version 4 implementation written entirely against the Web Crypto API. SHA-256 hashing, HMAC-SHA256 signing, four-step key derivation — all running in your browser&#39;s native crypto engine. It passes the AWS reference test vectors, and you can read every line in a single file.</p>\n<p>For a Chrome extension that prides itself on minimal dependencies, this matters. Every byte in the bundle is code we wrote and can audit.</p>\n<h2>Large files, no problem</h2>\n<p>Chrome extensions have a CORS constraint: content scripts can&#39;t make cross-origin requests to cloud storage providers. And Chrome&#39;s message-passing has a 64 MB per-message limit — a problem when your export ZIP contains thousands of embedded pages.</p>\n<p>We solved both. All cloud requests route through the background service worker via a long-lived port, bypassing CORS entirely. The ZIP payload is chunked at 30 MB boundaries, base64-encoded, and reassembled on the other side before uploading. This handles exports well over 100 MB without hitting any Chrome limits.</p>\n<p>You don&#39;t need to think about any of this. Click &quot;Upload,&quot; watch the progress bar, done.</p>\n<h2>Progress and control</h2>\n<p>Every operation — local or cloud — shows real-time progress. The progress bar parses each stage: gathering settings, exporting domains (with counts), compressing, uploading, downloading. Determinate progress shows a percentage; indeterminate stages show an animated shimmer.</p>\n<p>Success shows a green confirmation. Errors display inline with the full message so you can diagnose issues (expired SAS token, wrong IAM permissions, network timeout) without digging through console logs.</p>\n<p>All three backup methods are gated behind a premium license, but the local file export gives you a complete, portable snapshot of your Daneel workspace regardless.</p>\n<h2>What&#39;s next</h2>\n<p>We&#39;re exploring incremental backups — only syncing what changed since the last export — and scheduled automatic cloud backup on a timer. For now, one click gets you a full snapshot anywhere you want it.</p>\n<p>Your data lives on your machine. Now it can also live wherever you choose.</p>\n",
      "content_text": "\n## A local-first tool should give you local-first control\n\nDaneel runs on your machine. Your conversations, your indexed sites, your vault documents — they live in your browser's storage, not on our servers. That's the promise.\n\nBut local storage has a weakness: it's tied to one browser, on one machine. Reinstall Chrome, switch laptops, or clear your data — and everything is gone.\n\nData portability fixes that. Starting today, you can export your entire Daneel workspace to a portable file and restore it anywhere. And if you want automated cloud backup, we support Azure Blob Storage and any S3-compatible service — without a single external SDK.\n\n## One-click local backup\n\nThe simplest path: open Settings, go to Data, and click \"Export to file.\" Daneel gathers your settings, conversations, and all indexed site data, compresses everything into a timestamped ZIP, and downloads it to your machine.\n\nTo restore, click \"Import from file,\" pick the ZIP, and everything comes back — settings, chat history, embeddings, vault metadata. A progress bar tracks each stage so you know exactly where the import stands.\n\nThe ZIP is self-contained and versioned. You can store it in your own backup system, share it across machines, or keep it as a snapshot before experimenting with settings.\n\n## What's inside — and what's not\n\nTransparency matters when you're moving data around. Here's exactly what an export contains:\n\n**Included:**\n- All user settings and preferences\n- Every conversation (page chats and vault chats)\n- Indexed site data with full embeddings (stored as efficient binary, not bloated JSON)\n- Vault metadata and document references\n- MCP server registrations and agent definitions\n\n**Excluded by design:**\n- API keys (Claude, Azure OpenAI) — encrypted at rest, never serialized\n- MCP credentials (OAuth tokens, API keys for connected services)\n- Telemetry identifiers\n- Backup provider credentials themselves (no circular leaks)\n- Downloaded model files (too large, re-downloaded on demand)\n\nThis separation is deliberate. Your workflow travels with you. Your secrets stay behind, exactly where they should be.\n\n## Azure Blob Storage\n\nIf you use Azure, backup is straightforward. Generate a Container SAS token in the Azure portal (read + write + list permissions), paste the URL into Daneel, and click \"Test Connection.\" Once validated, \"Upload to Azure\" exports and uploads in one step.\n\nDaneel talks directly to the Azure REST API — no Azure SDK, no npm packages, no intermediary services. The SAS token authenticates every request. Your backup lands as `daneel.backup.zip` in your container, overwritten on each upload.\n\nRestoring is the reverse: \"Download from Azure\" pulls the ZIP and imports everything. The same progress tracking shows upload and download stages in real time.\n\n## S3-compatible — AWS and beyond\n\nFor S3-compatible storage, enter your access key, secret key, bucket name, and region. Optionally set a custom endpoint URL for services that aren't AWS:\n\n- **AWS S3** — the default, virtual-hosted bucket URLs\n- **Cloudflare R2** — set the R2 endpoint, zero egress fees\n- **Backblaze B2** — set the B2 S3-compatible endpoint\n- **MinIO** — self-hosted, point to your own server\n\nThe same \"Test Connection\" then \"Upload\" then \"Download\" flow works identically across all four. Daneel auto-detects whether to use virtual-hosted or path-style URLs based on whether you've set a custom endpoint.\n\nYour IAM user needs just three permissions: `s3:GetObject`, `s3:PutObject`, and `s3:ListBucket` on the target bucket. Nothing more.\n\n## Built from scratch — zero dependencies\n\nBoth the Azure and S3 integrations are built on pure browser APIs. No SDKs, no bundled libraries, no supply chain risk.\n\nThe S3 client includes a complete AWS Signature Version 4 implementation written entirely against the Web Crypto API. SHA-256 hashing, HMAC-SHA256 signing, four-step key derivation — all running in your browser's native crypto engine. It passes the AWS reference test vectors, and you can read every line in a single file.\n\nFor a Chrome extension that prides itself on minimal dependencies, this matters. Every byte in the bundle is code we wrote and can audit.\n\n## Large files, no problem\n\nChrome extensions have a CORS constraint: content scripts can't make cross-origin requests to cloud storage providers. And Chrome's message-passing has a 64 MB per-message limit — a problem when your export ZIP contains thousands of embedded pages.\n\nWe solved both. All cloud requests route through the background service worker via a long-lived port, bypassing CORS entirely. The ZIP payload is chunked at 30 MB boundaries, base64-encoded, and reassembled on the other side before uploading. This handles exports well over 100 MB without hitting any Chrome limits.\n\nYou don't need to think about any of this. Click \"Upload,\" watch the progress bar, done.\n\n## Progress and control\n\nEvery operation — local or cloud — shows real-time progress. The progress bar parses each stage: gathering settings, exporting domains (with counts), compressing, uploading, downloading. Determinate progress shows a percentage; indeterminate stages show an animated shimmer.\n\nSuccess shows a green confirmation. Errors display inline with the full message so you can diagnose issues (expired SAS token, wrong IAM permissions, network timeout) without digging through console logs.\n\nAll three backup methods are gated behind a premium license, but the local file export gives you a complete, portable snapshot of your Daneel workspace regardless.\n\n## What's next\n\nWe're exploring incremental backups — only syncing what changed since the last export — and scheduled automatic cloud backup on a timer. For now, one click gets you a full snapshot anywhere you want it.\n\nYour data lives on your machine. Now it can also live wherever you choose.\n",
      "date_published": "2026-03-25T00:00:00.000Z",
      "image": "https://daneel.injen.io/medias/export.import.png",
      "tags": [
        "feature",
        "backup",
        "data",
        "cloud",
        "privacy"
      ]
    },
    {
      "id": "https://daneel.injen.io/news/vault-part-1.html",
      "url": "https://daneel.injen.io/news/vault-part-1.html?utm_source=json&utm_medium=feed&utm_campaign=news_syndication",
      "title": "The Vault, part 1: your private document knowledge base",
      "summary": "Import your own documents, embed them locally, and chat with your personal knowledge base. PDF, DOCX, Markdown, HTML, plain text — all searchable, all private.",
      "content_html": "<h2>Your documents, your AI</h2>\n<p>Daneel started as a way to chat with web pages. The Vault takes that further: import your own files, build a personal knowledge base, and ask questions across your entire document collection. Everything runs locally. Nothing gets uploaded.</p>\n<p>Think of it as a private, searchable library where the librarian actually reads every document and can answer questions about any of them.</p>\n<h2>Import anything you have</h2>\n<p>The Vault accepts five document formats: Markdown, plain text, PDF, DOCX, and HTML. Import through a file picker, or select an entire folder using the FileSystem Access API. Each file goes through a format-specific converter before entering the pipeline:</p>\n<ul>\n<li><strong>PDF</strong> files are converted to structured Markdown with <a href=\"https://github.com/raphaelmansuy/edgeparse\">EdgeParse</a>, a Rust-based parser compiled to WebAssembly that preserves headings, tables, and reading order. Fully scanned (image-only) PDFs are detected and rejected with a clear error rather than silently producing empty results.</li>\n<li><strong>DOCX</strong> files pass through the mammoth library, converting Word documents to HTML, then to clean Markdown using the same Turndown pipeline that handles web pages.</li>\n<li><strong>HTML</strong> files are converted with the same Markdown pipeline.</li>\n<li><strong>Markdown and plain text</strong> pass through directly with UTF-8 BOM stripping.</li>\n</ul>\n<p>Every imported file gets a SHA-256 content hash. If you try to import a file that&#39;s already in the vault, Daneel skips it. No duplicates, no wasted embeddings.</p>\n<h2>Semantic chunking and embedding</h2>\n<p>Once imported, documents are split into chunks using a recursive semantic chunker (powered by Chonkie.js). Unlike naive splitting on word count, this chunker respects natural boundaries: it splits on paragraphs first, then sentences, then words. Chunks stay coherent, which directly improves search quality.</p>\n<p>Each chunk is embedded using the same WebGPU pipeline that powers Site RAG. The default model (bge-small-en-v1.5 at fp16) runs on your GPU with sub-second batch processing. Embeddings are stored in IndexedDB, partitioned by vault ID, so each vault is an isolated search space.</p>\n<p>A progress bar tracks every stage: file conversion, chunking, and embedding. Large imports with dozens of documents give you real-time feedback on exactly where things stand.</p>\n<h2>Search and chat</h2>\n<p>With documents embedded, you can search your vault or chat with it.</p>\n<p><strong>Vault-wide search</strong> finds the most relevant passages across all your documents. Type a question and Daneel embeds your query, runs GPU-accelerated cosine similarity against every chunk in the vault (typically under 5 milliseconds even for thousands of chunks), and returns the best matches with similarity scores and source attribution.</p>\n<p><strong>Document-scoped search</strong> narrows to a single file. Select a document in the sidebar and your questions only match against that document&#39;s chunks. Useful when you know which file has the answer and want precise results.</p>\n<p><strong>Chat mode</strong> takes search results and feeds them to your active LLM as context, producing a grounded answer with references to specific documents. This works with every provider: ask a question about your contract collection using WebGPU, Ollama, Claude, or Azure, and get an answer backed by actual passages from your files.</p>\n<h2>The document viewer</h2>\n<p>Select any document in your vault and its full content renders in a viewer pane alongside the chat. The Markdown is parsed and displayed with GitHub Flavored Markdown support, including tables, code blocks, and links (which open in new tabs). You can read the source material while chatting about it, without switching contexts.</p>\n<p>If the cached content is missing (rare edge case after a storage cleanup), the viewer offers a re-import button so you can restore it instantly.</p>\n<h2>Attach MCP tools</h2>\n<p>Vaults can have MCP servers attached directly. This means your AI can combine local document search with live external data in the same conversation.</p>\n<p>Attach Stripe to your invoices vault and ask &quot;Which client from my Q1 contracts has an overdue payment?&quot; The LLM searches your local documents for client names, then calls Stripe to check payment status. Local knowledge plus live tools, in one question.</p>\n<p>The tools section in the vault sidebar shows all registered MCP servers with available tools. Click to attach, click to detach. Simple.</p>\n<h2>Bind an agent</h2>\n<p>For more structured workflows, attach an agent instead of individual MCP servers. An agent brings its own system prompt (persona, task, constraints, style) and its own set of MCP tools, creating a focused AI environment tuned for the vault&#39;s content.</p>\n<p>A finance analyst agent on your invoices vault. A legal reviewer agent on your contracts vault. A research assistant agent on your papers vault. The agent shapes both the AI&#39;s behavior and its available tools.</p>\n<p>One rule keeps things clean: a vault uses either standalone MCP servers or an agent, never both. This mutual exclusion prevents conflicting tool configurations and makes it obvious which tools are active.</p>\n<h2>Free and paid tiers</h2>\n<p>The Vault is available to everyone, with generous free limits:</p>\n<ul>\n<li><strong>Free</strong>: 1 vault, 5 documents per vault, 1 MB file size, 100 chunks per document</li>\n<li><strong>Paid</strong>: unlimited vaults, 50 documents per vault, 10 MB file size, 1,000 chunks per document</li>\n</ul>\n<p>The free tier is enough to try the feature with a handful of documents. The paid tier opens it up for serious use with large document collections.</p>\n<h2>What comes next</h2>\n<p>This is Part 1 of the Vault story. In Part 2, we cover something more ambitious: how Daneel extracts named entities from your documents, builds a knowledge graph of their relationships, and lets you explore it in an interactive 3D visualization. Stay tuned.</p>\n",
      "content_text": "\n## Your documents, your AI\n\nDaneel started as a way to chat with web pages. The Vault takes that further: import your own files, build a personal knowledge base, and ask questions across your entire document collection. Everything runs locally. Nothing gets uploaded.\n\nThink of it as a private, searchable library where the librarian actually reads every document and can answer questions about any of them.\n\n## Import anything you have\n\nThe Vault accepts five document formats: Markdown, plain text, PDF, DOCX, and HTML. Import through a file picker, or select an entire folder using the FileSystem Access API. Each file goes through a format-specific converter before entering the pipeline:\n\n- **PDF** files are converted to structured Markdown with [EdgeParse](https://github.com/raphaelmansuy/edgeparse), a Rust-based parser compiled to WebAssembly that preserves headings, tables, and reading order. Fully scanned (image-only) PDFs are detected and rejected with a clear error rather than silently producing empty results.\n- **DOCX** files pass through the mammoth library, converting Word documents to HTML, then to clean Markdown using the same Turndown pipeline that handles web pages.\n- **HTML** files are converted with the same Markdown pipeline.\n- **Markdown and plain text** pass through directly with UTF-8 BOM stripping.\n\nEvery imported file gets a SHA-256 content hash. If you try to import a file that's already in the vault, Daneel skips it. No duplicates, no wasted embeddings.\n\n## Semantic chunking and embedding\n\nOnce imported, documents are split into chunks using a recursive semantic chunker (powered by Chonkie.js). Unlike naive splitting on word count, this chunker respects natural boundaries: it splits on paragraphs first, then sentences, then words. Chunks stay coherent, which directly improves search quality.\n\nEach chunk is embedded using the same WebGPU pipeline that powers Site RAG. The default model (bge-small-en-v1.5 at fp16) runs on your GPU with sub-second batch processing. Embeddings are stored in IndexedDB, partitioned by vault ID, so each vault is an isolated search space.\n\nA progress bar tracks every stage: file conversion, chunking, and embedding. Large imports with dozens of documents give you real-time feedback on exactly where things stand.\n\n## Search and chat\n\nWith documents embedded, you can search your vault or chat with it.\n\n**Vault-wide search** finds the most relevant passages across all your documents. Type a question and Daneel embeds your query, runs GPU-accelerated cosine similarity against every chunk in the vault (typically under 5 milliseconds even for thousands of chunks), and returns the best matches with similarity scores and source attribution.\n\n**Document-scoped search** narrows to a single file. Select a document in the sidebar and your questions only match against that document's chunks. Useful when you know which file has the answer and want precise results.\n\n**Chat mode** takes search results and feeds them to your active LLM as context, producing a grounded answer with references to specific documents. This works with every provider: ask a question about your contract collection using WebGPU, Ollama, Claude, or Azure, and get an answer backed by actual passages from your files.\n\n## The document viewer\n\nSelect any document in your vault and its full content renders in a viewer pane alongside the chat. The Markdown is parsed and displayed with GitHub Flavored Markdown support, including tables, code blocks, and links (which open in new tabs). You can read the source material while chatting about it, without switching contexts.\n\nIf the cached content is missing (rare edge case after a storage cleanup), the viewer offers a re-import button so you can restore it instantly.\n\n## Attach MCP tools\n\nVaults can have MCP servers attached directly. This means your AI can combine local document search with live external data in the same conversation.\n\nAttach Stripe to your invoices vault and ask \"Which client from my Q1 contracts has an overdue payment?\" The LLM searches your local documents for client names, then calls Stripe to check payment status. Local knowledge plus live tools, in one question.\n\nThe tools section in the vault sidebar shows all registered MCP servers with available tools. Click to attach, click to detach. Simple.\n\n## Bind an agent\n\nFor more structured workflows, attach an agent instead of individual MCP servers. An agent brings its own system prompt (persona, task, constraints, style) and its own set of MCP tools, creating a focused AI environment tuned for the vault's content.\n\nA finance analyst agent on your invoices vault. A legal reviewer agent on your contracts vault. A research assistant agent on your papers vault. The agent shapes both the AI's behavior and its available tools.\n\nOne rule keeps things clean: a vault uses either standalone MCP servers or an agent, never both. This mutual exclusion prevents conflicting tool configurations and makes it obvious which tools are active.\n\n## Free and paid tiers\n\nThe Vault is available to everyone, with generous free limits:\n\n- **Free**: 1 vault, 5 documents per vault, 1 MB file size, 100 chunks per document\n- **Paid**: unlimited vaults, 50 documents per vault, 10 MB file size, 1,000 chunks per document\n\nThe free tier is enough to try the feature with a handful of documents. The paid tier opens it up for serious use with large document collections.\n\n## What comes next\n\nThis is Part 1 of the Vault story. In Part 2, we cover something more ambitious: how Daneel extracts named entities from your documents, builds a knowledge graph of their relationships, and lets you explore it in an interactive 3D visualization. Stay tuned.\n",
      "date_published": "2026-03-20T00:00:00.000Z",
      "image": "https://daneel.injen.io/medias/vault.png",
      "tags": [
        "feature",
        "vault",
        "rag",
        "documents",
        "privacy"
      ]
    },
    {
      "id": "https://daneel.injen.io/news/azure-foundry-support.html",
      "url": "https://daneel.injen.io/news/azure-foundry-support.html?utm_source=json&utm_medium=feed&utm_campaign=news_syndication",
      "title": "Azure AI Foundry support: frontier models, your private cloud",
      "summary": "Deploy GPT-4.1, GPT-4o, or Phi-4 on your own Azure subscription — frontier model power with your organization's data governance. The privacy sweet spot between local and third-party cloud.",
      "content_html": "<h2>The missing middle</h2>\n<p>Daneel gives you two ends of the AI spectrum. On one side: local models — WebGPU, Ollama, Gemini Nano — that never leave your machine but are constrained by your hardware. On the other: Claude, a frontier model that can reason through anything but sends your data to a third-party cloud.</p>\n<p>What if you could have both? Frontier capability with data that stays under your control?</p>\n<p>That&#39;s what Azure brings to Daneel. Deploy models on your own Azure subscription, governed by your organization&#39;s policies, and use them with every Daneel feature.</p>\n<p><strong>Your prompts reach a GPU in your cloud tenant, not someone else&#39;s API.</strong></p>\n<h2>Two endpoint styles, one integration</h2>\n<p>Daneel supports both Azure OpenAI Service (classic) and the newer Azure AI Foundry:</p>\n<ul>\n<li><strong>Classic Azure OpenAI</strong> — the established path. Specify your resource endpoint, deployment name, and API version. Daneel builds the request URL automatically.</li>\n<li><strong>Azure AI Foundry</strong> — Microsoft&#39;s newer model-as-a-service platform. Paste your project target URI and model name. Daneel auto-detects the Foundry format and adapts — no API version needed.</li>\n</ul>\n<p>You don&#39;t need to tell Daneel which style you&#39;re using. Paste the URL and it figures it out.</p>\n<h2>Authentication your IT team will approve</h2>\n<p>Two authentication methods, because enterprise environments have different requirements:</p>\n<p><strong>API Key</strong> — paste your Azure API key, and Daneel encrypts it with AES-256-GCM before storing it in Chrome&#39;s local storage. The key never leaves your device except in the request header to your own Azure endpoint. Simple, fast, works for personal deployments and development.</p>\n<p><strong>Entra ID (SSO)</strong> — for organizations with centralized identity. Enter your tenant ID and client ID from your App Registration, click &quot;Sign in with Azure,&quot; and authenticate through your organization&#39;s SSO flow. Full OAuth2 + PKCE, token refresh handled automatically. No shared secrets, no API keys to rotate — just your corporate identity.</p>\n<p>Both methods encrypt credentials at rest. The settings panel confirms the encryption status visually so you know your keys are protected.</p>\n<h2>Five models, from flagship to frugal</h2>\n<p>The Azure registry ships with five models spanning every budget and capability tier:</p>\n<ul>\n<li><strong>GPT-4.1</strong> — the flagship. 1M token context window, vision, native tool calling. <span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mn>2</mn><mi mathvariant=\"normal\">/</mi></mrow><annotation encoding=\"application/x-tex\">2/</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em;\"></span><span class=\"mord\">2/</span></span></span></span>8 per million tokens.</li>\n<li><strong>GPT-4o</strong> — the proven workhorse. 128K context, vision, tools. <span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mn>2.50</mn><mi mathvariant=\"normal\">/</mi></mrow><annotation encoding=\"application/x-tex\">2.50/</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em;\"></span><span class=\"mord\">2.50/</span></span></span></span>10 per million tokens.</li>\n<li><strong>GPT-4.1 Mini</strong> — flagship intelligence at lower cost. 1M context, vision, tools. <span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mn>0.40</mn><mi mathvariant=\"normal\">/</mi></mrow><annotation encoding=\"application/x-tex\">0.40/</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em;\"></span><span class=\"mord\">0.40/</span></span></span></span>1.60 per million tokens.</li>\n<li><strong>GPT-4o Mini</strong> — fast and affordable for lighter tasks. 128K context, tools. <span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mn>0.15</mn><mi mathvariant=\"normal\">/</mi></mrow><annotation encoding=\"application/x-tex\">0.15/</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em;\"></span><span class=\"mord\">0.15/</span></span></span></span>0.60 per million tokens.</li>\n<li><strong>Phi-4</strong> — Microsoft&#39;s own 14B parameter model. 16K context, tools, no vision. <span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mn>0.07</mn><mi mathvariant=\"normal\">/</mi></mrow><annotation encoding=\"application/x-tex\">0.07/</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em;\"></span><span class=\"mord\">0.07/</span></span></span></span>0.14 per million tokens — nearly free at scale.</li>\n</ul>\n<p>Every model supports native tool calling through the OpenAI function calling format, meaning MCP servers work out of the box.</p>\n<h2>The privacy sweet spot</h2>\n<p>This is why Azure matters for Daneel. Every Azure model gets &quot;Your cloud&quot; residency — the middle tier in Daneel&#39;s privacy model:</p>\n<ul>\n<li><strong>On-device</strong> (WebGPU, Gemini Nano) — nothing leaves your browser</li>\n<li><strong>Local network</strong> (Ollama) — stays on your machine</li>\n<li><strong>Your cloud</strong> (Azure) — leaves your machine, stays in your subscription</li>\n<li><strong>Third-party cloud</strong> (Claude) — reaches an external provider</li>\n</ul>\n<p>With Azure, your data crosses the network but lands in infrastructure you control. Your organization&#39;s data governance policies apply. Azure RBAC controls access. The only data observer is your cloud tenant admin — not an external API provider.</p>\n<p>For regulated industries — healthcare, finance, legal, government — this is often the only acceptable path to frontier model capability. You get GPT-4.1&#39;s reasoning power without sending patient records, financial data, or privileged communications to a third party.</p>\n<p>The settings panel makes this explicit with a banner at the top: &quot;Data stays within your Azure subscription, governed by your organization&#39;s policies.&quot;</p>\n<h2>Full tool calling support</h2>\n<p>Azure models use native OpenAI-style function calling. Connect any MCP server — Stripe, Supabase, Vercel, Salesforce — and Azure models will call tools with the same reliability as any OpenAI endpoint.</p>\n<p>The multi-turn tool loop handles complex chains: the model calls a tool, reads the result, decides if it needs more information, calls another tool, and continues until it has a complete answer. Tool results are streamed back incrementally, so you see progress in real time.</p>\n<p>Combined with agents, this means you can build specialized AI workflows backed by enterprise-grade infrastructure. A compliance agent with Salesforce access. A DevOps agent with Vercel and Cloudflare. All running through your Azure tenant.</p>\n<h2>Getting started</h2>\n<ol>\n<li>Deploy a model in the Azure portal (Azure OpenAI or AI Foundry)</li>\n<li>Open Daneel Settings, then Azure OpenAI</li>\n<li>Choose your auth method (API Key or Entra ID)</li>\n<li>Paste your endpoint URL and deployment/model name</li>\n<li>Click &quot;Test connection&quot; to verify</li>\n<li>Click &quot;Use Azure OpenAI&quot; to activate</li>\n</ol>\n<p>The test query box lets you run a quick inference before committing — tokens stream back in real time so you can confirm the connection works and gauge latency.</p>\n<h2>What&#39;s next</h2>\n<p>We&#39;re tracking Azure&#39;s expanding model catalog closely. As new models land in Foundry — including open-weight models from Mistral, Meta, and others — Daneel&#39;s registry will grow to match. The integration is endpoint-agnostic: any model Azure serves through the OpenAI-compatible API works today.</p>\n<p>Frontier AI doesn&#39;t have to mean giving up control. With Azure on Daneel, it doesn&#39;t.</p>\n",
      "content_text": "\n## The missing middle\n\nDaneel gives you two ends of the AI spectrum. On one side: local models — WebGPU, Ollama, Gemini Nano — that never leave your machine but are constrained by your hardware. On the other: Claude, a frontier model that can reason through anything but sends your data to a third-party cloud.\n\nWhat if you could have both? Frontier capability with data that stays under your control?\n\nThat's what Azure brings to Daneel. Deploy models on your own Azure subscription, governed by your organization's policies, and use them with every Daneel feature.\n\n**Your prompts reach a GPU in your cloud tenant, not someone else's API.**\n\n## Two endpoint styles, one integration\n\nDaneel supports both Azure OpenAI Service (classic) and the newer Azure AI Foundry:\n\n- **Classic Azure OpenAI** — the established path. Specify your resource endpoint, deployment name, and API version. Daneel builds the request URL automatically.\n- **Azure AI Foundry** — Microsoft's newer model-as-a-service platform. Paste your project target URI and model name. Daneel auto-detects the Foundry format and adapts — no API version needed.\n\nYou don't need to tell Daneel which style you're using. Paste the URL and it figures it out.\n\n## Authentication your IT team will approve\n\nTwo authentication methods, because enterprise environments have different requirements:\n\n**API Key** — paste your Azure API key, and Daneel encrypts it with AES-256-GCM before storing it in Chrome's local storage. The key never leaves your device except in the request header to your own Azure endpoint. Simple, fast, works for personal deployments and development.\n\n**Entra ID (SSO)** — for organizations with centralized identity. Enter your tenant ID and client ID from your App Registration, click \"Sign in with Azure,\" and authenticate through your organization's SSO flow. Full OAuth2 + PKCE, token refresh handled automatically. No shared secrets, no API keys to rotate — just your corporate identity.\n\nBoth methods encrypt credentials at rest. The settings panel confirms the encryption status visually so you know your keys are protected.\n\n## Five models, from flagship to frugal\n\nThe Azure registry ships with five models spanning every budget and capability tier:\n\n- **GPT-4.1** — the flagship. 1M token context window, vision, native tool calling. $2/$8 per million tokens.\n- **GPT-4o** — the proven workhorse. 128K context, vision, tools. $2.50/$10 per million tokens.\n- **GPT-4.1 Mini** — flagship intelligence at lower cost. 1M context, vision, tools. $0.40/$1.60 per million tokens.\n- **GPT-4o Mini** — fast and affordable for lighter tasks. 128K context, tools. $0.15/$0.60 per million tokens.\n- **Phi-4** — Microsoft's own 14B parameter model. 16K context, tools, no vision. $0.07/$0.14 per million tokens — nearly free at scale.\n\nEvery model supports native tool calling through the OpenAI function calling format, meaning MCP servers work out of the box.\n\n## The privacy sweet spot\n\nThis is why Azure matters for Daneel. Every Azure model gets \"Your cloud\" residency — the middle tier in Daneel's privacy model:\n\n- **On-device** (WebGPU, Gemini Nano) — nothing leaves your browser\n- **Local network** (Ollama) — stays on your machine\n- **Your cloud** (Azure) — leaves your machine, stays in your subscription\n- **Third-party cloud** (Claude) — reaches an external provider\n\nWith Azure, your data crosses the network but lands in infrastructure you control. Your organization's data governance policies apply. Azure RBAC controls access. The only data observer is your cloud tenant admin — not an external API provider.\n\nFor regulated industries — healthcare, finance, legal, government — this is often the only acceptable path to frontier model capability. You get GPT-4.1's reasoning power without sending patient records, financial data, or privileged communications to a third party.\n\nThe settings panel makes this explicit with a banner at the top: \"Data stays within your Azure subscription, governed by your organization's policies.\"\n\n## Full tool calling support\n\nAzure models use native OpenAI-style function calling. Connect any MCP server — Stripe, Supabase, Vercel, Salesforce — and Azure models will call tools with the same reliability as any OpenAI endpoint.\n\nThe multi-turn tool loop handles complex chains: the model calls a tool, reads the result, decides if it needs more information, calls another tool, and continues until it has a complete answer. Tool results are streamed back incrementally, so you see progress in real time.\n\nCombined with agents, this means you can build specialized AI workflows backed by enterprise-grade infrastructure. A compliance agent with Salesforce access. A DevOps agent with Vercel and Cloudflare. All running through your Azure tenant.\n\n## Getting started\n\n1. Deploy a model in the Azure portal (Azure OpenAI or AI Foundry)\n2. Open Daneel Settings, then Azure OpenAI\n3. Choose your auth method (API Key or Entra ID)\n4. Paste your endpoint URL and deployment/model name\n5. Click \"Test connection\" to verify\n6. Click \"Use Azure OpenAI\" to activate\n\nThe test query box lets you run a quick inference before committing — tokens stream back in real time so you can confirm the connection works and gauge latency.\n\n## What's next\n\nWe're tracking Azure's expanding model catalog closely. As new models land in Foundry — including open-weight models from Mistral, Meta, and others — Daneel's registry will grow to match. The integration is endpoint-agnostic: any model Azure serves through the OpenAI-compatible API works today.\n\nFrontier AI doesn't have to mean giving up control. With Azure on Daneel, it doesn't.\n",
      "date_published": "2026-03-18T00:00:00.000Z",
      "image": "https://daneel.injen.io/medias/azure.foundry.webp",
      "tags": [
        "feature",
        "azure",
        "enterprise",
        "privacy",
        "llm"
      ]
    },
    {
      "id": "https://daneel.injen.io/news/agents-feature.html",
      "url": "https://daneel.injen.io/news/agents-feature.html?utm_source=json&utm_medium=feed&utm_campaign=news_syndication",
      "title": "Meet Agents — your AI, your rules",
      "summary": "Create specialized AI personas with structured prompts and bound tool access — then attach them to any conversation or document vault.",
      "content_html": "<h2>One prompt to rule them all? Not anymore.</h2>\n<p>Every conversation is different. When you&#39;re reviewing code, you want precision and technical depth. When you&#39;re summarizing research, you want clarity and brevity. When you&#39;re drafting a customer email, you want warmth and professionalism.</p>\n<p>A generic AI assistant tries to be everything at once. Agents let you build exactly the AI you need — with a structured persona, clear objectives, hard constraints, and the right tools for the job.</p>\n<h2>What is an agent</h2>\n<p>An agent in Daneel is a reusable AI configuration built from four semantic building blocks:</p>\n<ul>\n<li><strong>Persona</strong> — who the agent is. Domain expertise, professional role, knowledge base. &quot;You are a senior backend engineer with deep experience in distributed systems and PostgreSQL.&quot;</li>\n<li><strong>Task</strong> — what the agent should focus on. Goals, priorities, the shape of a good answer. &quot;Analyze code for performance bottlenecks, suggest concrete fixes with benchmarks.&quot;</li>\n<li><strong>Constraints</strong> — what the agent must avoid. Boundaries, rules, things that are off-limits. &quot;Never suggest rewriting in a different language. Stay within the existing tech stack.&quot;</li>\n<li><strong>Style</strong> — how the agent should communicate. Tone, verbosity, formality, language level. &quot;Concise and direct. Use code blocks. Skip pleasantries.&quot;</li>\n</ul>\n<p>These four fields are assembled into a structured system prompt with clear section headers, so the LLM can parse each dimension independently. You don&#39;t need to be a prompt engineer — just fill in the fields that matter and leave the rest blank.</p>\n<h2>Building your first agent</h2>\n<p>Open Settings, navigate to the Agents tab, and click &quot;New Agent.&quot;</p>\n<p>Give your agent a <strong>name</strong> — something descriptive like &quot;Code Reviewer&quot; or &quot;Research Analyst.&quot; Add a short <strong>purpose</strong> that will appear in picker dropdowns, so you can tell agents apart at a glance.</p>\n<p>Then fill in the prompt fields. You don&#39;t need all four — a persona and a task are often enough to get a dramatically different experience from the default assistant. Constraints and style are there when you need finer control.</p>\n<p>Hit &quot;Create Agent&quot; and it&#39;s ready to use everywhere in Daneel.</p>\n<h2>Tool-equipped agents</h2>\n<p>Here&#39;s where agents get powerful. Each agent can have <strong>MCP servers attached</strong>, giving it access to specific external tools.</p>\n<p>The agent editor includes an MCP picker that shows all your registered servers. Attach the ones that make sense for this agent&#39;s role:</p>\n<ul>\n<li>A <strong>DevOps agent</strong> gets Vercel and Cloudflare — it can check deployments, inspect Workers, and query DNS</li>\n<li>A <strong>Sales agent</strong> gets Stripe and Salesforce — it can pull customer data and payment history</li>\n<li>A <strong>Research agent</strong> gets Exa and Apify — it can search the web and scrape structured data</li>\n</ul>\n<p>Attached servers appear as pills with tool counts, so you always know what capabilities an agent has. Detach a server with one click if the scope changes.</p>\n<p>The agent doesn&#39;t just know about these tools — it can <strong>call them autonomously</strong> during a conversation, chaining multiple tool calls across turns to answer complex questions.</p>\n<h2>Agents in conversations</h2>\n<p>In any chat — whether you&#39;re on a web page, a YouTube video, or a site search — you can attach an agent from the picker in the toolbar.</p>\n<p>When an agent is active, three things change:</p>\n<ol>\n<li>The agent&#39;s structured system prompt shapes every response</li>\n<li>Conversation history accumulates across turns, giving the agent context about what you&#39;ve discussed</li>\n<li>Any MCP tools bound to the agent become available for the LLM to call</li>\n</ol>\n<p>A status indicator confirms you&#39;re in conversation mode with full context accumulation. Switch agents mid-conversation or detach entirely to return to the default assistant — agent selection is saved per tab, so each page remembers which agent you were using.</p>\n<h2>Agents in vaults</h2>\n<p>Vaults — your personal document collections — can also have agents attached. This creates focused, domain-specific AI environments where document knowledge and external tools combine.</p>\n<p>Attach a finance agent to your invoices vault, and it can answer questions that draw from both your local documents and live Stripe data. Attach a legal agent to your contracts vault, and it brings the right constraints and tone to every answer.</p>\n<p>One important rule: vaults enforce <strong>mutual exclusion</strong> between agents and standalone MCP servers. A vault uses either an agent&#39;s bundled servers or its own direct server list — never both. This keeps tool access predictable and prevents conflicting configurations.</p>\n<h2>Manage and share</h2>\n<p>Every agent can be toggled on or off without deleting it. Disabled agents disappear from pickers but stay in storage, ready to re-enable when you need them.</p>\n<p>Need to share an agent with a colleague or back it up? The export button downloads the full agent definition as a JSON file — name, purpose, prompt fields, and MCP server bindings included. Import it on another machine and the agent is ready to go, provided the same MCP servers are registered.</p>\n<p>The agents list shows all your agents organized by status, with tool counts and quick actions for editing, exporting, or removing.</p>\n<h2>How it all fits together</h2>\n<p>Under the hood, agents are lightweight. An agent definition is a JSON object stored in Chrome&#39;s local storage — a name, four prompt strings, and a list of MCP server URLs. At runtime, Daneel resolves the agent&#39;s prompt and tools, injects them into the LLM request, and manages the multi-turn conversation loop.</p>\n<p>The architecture is provider-agnostic: agents work with Claude, Ollama, WebGPU, and Gemini Nano. The same agent definition produces the same behavior regardless of which AI backend is active — though tool calling reliability varies by model capability.</p>\n<p>Everything stays local. Agent definitions, conversation history, and tool bindings live in your browser&#39;s storage. Nothing is uploaded unless you explicitly export.</p>\n<h2>What&#39;s next</h2>\n<p>We&#39;re building toward prebuilt agent templates — curated agents for common workflows like code review, travel planning, and research synthesis, pre-configured with the right MCP servers. For now, the canvas is yours.</p>\n<p>Create your first agent, give it a persona and a purpose, attach the tools it needs, and see how a focused AI outperforms a generic one.</p>\n",
      "content_text": "\n## One prompt to rule them all? Not anymore.\n\nEvery conversation is different. When you're reviewing code, you want precision and technical depth. When you're summarizing research, you want clarity and brevity. When you're drafting a customer email, you want warmth and professionalism.\n\nA generic AI assistant tries to be everything at once. Agents let you build exactly the AI you need — with a structured persona, clear objectives, hard constraints, and the right tools for the job.\n\n## What is an agent\n\nAn agent in Daneel is a reusable AI configuration built from four semantic building blocks:\n\n- **Persona** — who the agent is. Domain expertise, professional role, knowledge base. \"You are a senior backend engineer with deep experience in distributed systems and PostgreSQL.\"\n- **Task** — what the agent should focus on. Goals, priorities, the shape of a good answer. \"Analyze code for performance bottlenecks, suggest concrete fixes with benchmarks.\"\n- **Constraints** — what the agent must avoid. Boundaries, rules, things that are off-limits. \"Never suggest rewriting in a different language. Stay within the existing tech stack.\"\n- **Style** — how the agent should communicate. Tone, verbosity, formality, language level. \"Concise and direct. Use code blocks. Skip pleasantries.\"\n\nThese four fields are assembled into a structured system prompt with clear section headers, so the LLM can parse each dimension independently. You don't need to be a prompt engineer — just fill in the fields that matter and leave the rest blank.\n\n## Building your first agent\n\nOpen Settings, navigate to the Agents tab, and click \"New Agent.\"\n\nGive your agent a **name** — something descriptive like \"Code Reviewer\" or \"Research Analyst.\" Add a short **purpose** that will appear in picker dropdowns, so you can tell agents apart at a glance.\n\nThen fill in the prompt fields. You don't need all four — a persona and a task are often enough to get a dramatically different experience from the default assistant. Constraints and style are there when you need finer control.\n\nHit \"Create Agent\" and it's ready to use everywhere in Daneel.\n\n## Tool-equipped agents\n\nHere's where agents get powerful. Each agent can have **MCP servers attached**, giving it access to specific external tools.\n\nThe agent editor includes an MCP picker that shows all your registered servers. Attach the ones that make sense for this agent's role:\n\n- A **DevOps agent** gets Vercel and Cloudflare — it can check deployments, inspect Workers, and query DNS\n- A **Sales agent** gets Stripe and Salesforce — it can pull customer data and payment history\n- A **Research agent** gets Exa and Apify — it can search the web and scrape structured data\n\nAttached servers appear as pills with tool counts, so you always know what capabilities an agent has. Detach a server with one click if the scope changes.\n\nThe agent doesn't just know about these tools — it can **call them autonomously** during a conversation, chaining multiple tool calls across turns to answer complex questions.\n\n## Agents in conversations\n\nIn any chat — whether you're on a web page, a YouTube video, or a site search — you can attach an agent from the picker in the toolbar.\n\nWhen an agent is active, three things change:\n\n1. The agent's structured system prompt shapes every response\n2. Conversation history accumulates across turns, giving the agent context about what you've discussed\n3. Any MCP tools bound to the agent become available for the LLM to call\n\nA status indicator confirms you're in conversation mode with full context accumulation. Switch agents mid-conversation or detach entirely to return to the default assistant — agent selection is saved per tab, so each page remembers which agent you were using.\n\n## Agents in vaults\n\nVaults — your personal document collections — can also have agents attached. This creates focused, domain-specific AI environments where document knowledge and external tools combine.\n\nAttach a finance agent to your invoices vault, and it can answer questions that draw from both your local documents and live Stripe data. Attach a legal agent to your contracts vault, and it brings the right constraints and tone to every answer.\n\nOne important rule: vaults enforce **mutual exclusion** between agents and standalone MCP servers. A vault uses either an agent's bundled servers or its own direct server list — never both. This keeps tool access predictable and prevents conflicting configurations.\n\n## Manage and share\n\nEvery agent can be toggled on or off without deleting it. Disabled agents disappear from pickers but stay in storage, ready to re-enable when you need them.\n\nNeed to share an agent with a colleague or back it up? The export button downloads the full agent definition as a JSON file — name, purpose, prompt fields, and MCP server bindings included. Import it on another machine and the agent is ready to go, provided the same MCP servers are registered.\n\nThe agents list shows all your agents organized by status, with tool counts and quick actions for editing, exporting, or removing.\n\n## How it all fits together\n\nUnder the hood, agents are lightweight. An agent definition is a JSON object stored in Chrome's local storage — a name, four prompt strings, and a list of MCP server URLs. At runtime, Daneel resolves the agent's prompt and tools, injects them into the LLM request, and manages the multi-turn conversation loop.\n\nThe architecture is provider-agnostic: agents work with Claude, Ollama, WebGPU, and Gemini Nano. The same agent definition produces the same behavior regardless of which AI backend is active — though tool calling reliability varies by model capability.\n\nEverything stays local. Agent definitions, conversation history, and tool bindings live in your browser's storage. Nothing is uploaded unless you explicitly export.\n\n## What's next\n\nWe're building toward prebuilt agent templates — curated agents for common workflows like code review, travel planning, and research synthesis, pre-configured with the right MCP servers. For now, the canvas is yours.\n\nCreate your first agent, give it a persona and a purpose, attach the tools it needs, and see how a focused AI outperforms a generic one.\n",
      "date_published": "2026-03-12T00:00:00.000Z",
      "image": "https://daneel.injen.io/medias/agents.png",
      "tags": [
        "feature",
        "agents",
        "mcp",
        "productivity"
      ]
    },
    {
      "id": "https://daneel.injen.io/news/model-registry.html",
      "url": "https://daneel.injen.io/news/model-registry.html?utm_source=json&utm_medium=feed&utm_campaign=news_syndication",
      "title": "Find your best model — the AI registry that knows your hardware",
      "summary": "A unified model registry across five providers, hardware-aware scoring, and a guided wizard that recommends the right model for your GPU, your priorities, and your privacy preferences.",
      "content_html": "<h2>Thirty-nine models, five providers, one question: which one is right for you?</h2>\n<p>Daneel supports AI models that run on your GPU, on your local Ollama server, through Chrome&#39;s built-in Gemini Nano, via the Claude API, or on Azure OpenAI. That&#39;s a lot of choice — and choice without guidance is just confusion.</p>\n<p>The Model Registry changes that. It&#39;s a unified catalog of every model Daneel supports, paired with a hardware evaluation engine that tells you exactly which ones will run well on your machine, which ones will struggle, and which ones won&#39;t fit at all.</p>\n<p>No more guessing. No more GPU out-of-memory errors halfway through a conversation.</p>\n<h2>One registry, five providers</h2>\n<p>The registry ships with 39 models across every backend Daneel supports:</p>\n<ul>\n<li><strong>WebGPU</strong>: runs entirely on your GPU, from the 350M-parameter Granite 4.0 Micro to the 3.8B Phi-3.5 Mini. No network, no API keys, no cost.</li>\n<li><strong>Ollama</strong>: local server inference, including heavyweight options like Llama 3.1 70B for machines that can handle it</li>\n<li><strong>Claude</strong>: Anthropic&#39;s API, from the fast Haiku 4.5 to the flagship Opus 4.6</li>\n<li><strong>Azure Foundry</strong>: Your Azure Foundry deployed models like GTP-5.4, GTP-5.4-mini, GPT-4o, GPT-4.1, Phi-4...</li>\n<li><strong>Gemini Nano</strong>: Chrome&#39;s built-in on-device AI, zero setup</li>\n</ul>\n<p>Every model carries the same structured metadata: capabilities (tool calling, thinking, streaming, vision), cost, context window, quality tier, license, hardware requirements, and a full privacy profile. One format, every provider.</p>\n<h2>Your hardware, measured</h2>\n<p>Before recommending anything, Daneel needs to know what you&#39;re working with. The hardware probe runs automatically in the background and measures four things:</p>\n<ul>\n<li><strong>GPU identity</strong> — vendor, architecture, discrete vs. integrated, shader-f16 support</li>\n<li><strong>VRAM</strong> — estimated from WebGPU buffer limits, snapped to known hardware tiers (4 GB, 8 GB, 16 GB, etc.)</li>\n<li><strong>Compute power</strong> — a real GPU benchmark: 512x512 matrix multiplication, three timed runs, median result in GFLOPS</li>\n<li><strong>Memory bandwidth</strong> — 64 MB buffer copy across ten iterations, measuring actual throughput in GB/s</li>\n</ul>\n<p>The results appear in a hardware card at the top of the model browser — your GPU name, VRAM, RAM, compute power, and whether your hardware supports fp16 shaders. You can re-probe anytime with one click.</p>\n<p>This isn&#39;t a spec sheet lookup. It&#39;s a live measurement of what your GPU can actually do right now.</p>\n<h2>Models that fit</h2>\n<p>With your hardware measured, every model in the registry gets an evaluation. The engine checks hard constraints first:</p>\n<ul>\n<li><strong>Does it fit?</strong> Peak GPU memory compared against your available VRAM budget, with safety margins for discrete GPUs (75%), integrated (50%), and a hard cap at 35% of system RAM for shared-memory GPUs</li>\n<li><strong>Does it need fp16?</strong> Models requiring shader-f16 are marked incompatible if your GPU doesn&#39;t support it</li>\n<li><strong>Will it be fast enough?</strong> Estimated tokens-per-second from your measured memory bandwidth and the model&#39;s size</li>\n</ul>\n<p>Each model gets a status: <strong>compatible</strong> (runs well), <strong>marginal</strong> (fits but tight — expect reduced context or slower inference), or <strong>incompatible</strong> (won&#39;t run on your hardware). Marginal models include specific warnings: &quot;Requires 16 GB VRAM; you have 8 GB&quot; or &quot;Expect slow inference below recommended GFLOPS.&quot;</p>\n<p>The engine also scales effective context windows. If memory headroom drops below 30%, the available context shrinks proportionally — because the KV cache grows with context length, and an OOM error mid-conversation helps nobody.</p>\n<h2>Find my best model</h2>\n<p>Don&#39;t want to browse? The Model Wizard gets you to the right model in two steps.</p>\n<p><strong>Step 1 — What matters most?</strong> Pick one of four priorities:</p>\n<ul>\n<li><strong>Balanced</strong> — good quality with reasonable privacy and cost</li>\n<li><strong>Privacy first</strong> — everything stays on your device, no exceptions</li>\n<li><strong>Best quality</strong> — most capable models regardless of where they run</li>\n<li><strong>Cost conscious</strong> — free and local models only, no API costs</li>\n</ul>\n<p>Each priority maps to a scoring preset that weights quality, capabilities, privacy, and cost differently. Privacy-first puts 50% weight on data residency. Quality-first puts 55% on quality tier and 30% on capabilities.</p>\n<p><strong>Step 2 — Your top picks.</strong> The wizard runs the recommendation engine against your hardware and selected priority, then presents up to five models ranked by composite score. The top pick gets highlighted styling. Each result shows its match score, compatibility status, privacy level, effective context window, cost, and capability badges. One click takes you to the provider&#39;s settings tab to configure it.</p>\n<h2>Browse and filter</h2>\n<p>The full model browser gives you everything. A search bar matches across model names, descriptions, IDs, and providers. Three filter dropdowns narrow by provider, privacy floor, and required capability.</p>\n<p>Every model appears as an expandable card. Collapsed: provider icon, name, privacy badge, compatibility status, context window, cost, and capability pills. Expanded: description, quality stars, license, detailed hardware evaluation with warnings, estimated tokens-per-second, and a direct link to configure the model in its provider&#39;s settings.</p>\n<p>Models re-score in real time as you change filters. The summary bar always shows how many models match and how many are compatible with your hardware.</p>\n<h2>Privacy as a first-class filter</h2>\n<p>Every model carries a privacy profile with four data residency levels:</p>\n<ul>\n<li><strong>On-device</strong> — never leaves your browser (WebGPU)</li>\n<li><strong>Local network</strong> — leaves the browser but stays on your machine (Ollama)</li>\n<li><strong>Your cloud</strong> — goes to your organization&#39;s cloud tenant (Azure OpenAI)</li>\n<li><strong>Third-party cloud</strong> — reaches an external API provider (Claude, OpenAI)</li>\n</ul>\n<p>The privacy filter works as a floor: select &quot;Local network&quot; and you&#39;ll see on-device and LAN models, but not cloud. Select &quot;On-device only&quot; and only WebGPU and Gemini Nano remain.</p>\n<p>Each model also declares whether the weights are auditable (open-source vs. proprietary) and exactly who can observe your data. No ambiguity.</p>\n<h2>Ollama: your models, recognized</h2>\n<p>If you run Ollama, Daneel doesn&#39;t just show the registry&#39;s suggested models — it recognizes what you already have installed.</p>\n<p>The merge engine pulls your installed model list from Ollama&#39;s API and matches each one against the registry in three tiers: <strong>exact tag match</strong> (high confidence), <strong>family match</strong> (same model family, different size — metadata inherited with warnings), or <strong>unknown</strong> (no match — capabilities inferred from parameter count using conservative heuristics).</p>\n<p>The result: your installed models appear at the top with full metadata, followed by recommended models you might want to pull. You see what you have, what it can do, and what else is available — all in one view.</p>\n<h2>Always fresh, always available</h2>\n<p>The registry loads through a three-tier strategy:</p>\n<ol>\n<li><strong>Chrome storage cache</strong> (24-hour TTL) — instant load, works offline</li>\n<li><strong>Backend API</strong> (3-second timeout) — fresh data from the server, cached on success</li>\n<li><strong>Bundled fallback</strong> — compiled into the extension package, guaranteed available</li>\n</ol>\n<p>You never see a loading spinner on repeat visits. The cache serves immediately while a background refresh checks for updates. If the network is down, the bundled fallback ensures the full registry is always available.</p>\n<h2>What&#39;s next</h2>\n<p>We&#39;re working on per-model download tracking for WebGPU (so you can see which models are already cached), automatic model suggestions when hardware changes (new GPU? new recommendations), and deeper Ollama integration with pull progress tracking in the browser.</p>\n<p>The right model for you depends on your hardware, your priorities, and your privacy requirements. Now Daneel can figure that out for you.</p>\n",
      "content_text": "\n## Thirty-nine models, five providers, one question: which one is right for you?\n\nDaneel supports AI models that run on your GPU, on your local Ollama server, through Chrome's built-in Gemini Nano, via the Claude API, or on Azure OpenAI. That's a lot of choice — and choice without guidance is just confusion.\n\nThe Model Registry changes that. It's a unified catalog of every model Daneel supports, paired with a hardware evaluation engine that tells you exactly which ones will run well on your machine, which ones will struggle, and which ones won't fit at all.\n\nNo more guessing. No more GPU out-of-memory errors halfway through a conversation.\n\n## One registry, five providers\n\nThe registry ships with 39 models across every backend Daneel supports:\n\n- **WebGPU**: runs entirely on your GPU, from the 350M-parameter Granite 4.0 Micro to the 3.8B Phi-3.5 Mini. No network, no API keys, no cost.\n- **Ollama**: local server inference, including heavyweight options like Llama 3.1 70B for machines that can handle it\n- **Claude**: Anthropic's API, from the fast Haiku 4.5 to the flagship Opus 4.6\n- **Azure Foundry**: Your Azure Foundry deployed models like GTP-5.4, GTP-5.4-mini, GPT-4o, GPT-4.1, Phi-4...\n- **Gemini Nano**: Chrome's built-in on-device AI, zero setup\n\nEvery model carries the same structured metadata: capabilities (tool calling, thinking, streaming, vision), cost, context window, quality tier, license, hardware requirements, and a full privacy profile. One format, every provider.\n\n## Your hardware, measured\n\nBefore recommending anything, Daneel needs to know what you're working with. The hardware probe runs automatically in the background and measures four things:\n\n- **GPU identity** — vendor, architecture, discrete vs. integrated, shader-f16 support\n- **VRAM** — estimated from WebGPU buffer limits, snapped to known hardware tiers (4 GB, 8 GB, 16 GB, etc.)\n- **Compute power** — a real GPU benchmark: 512x512 matrix multiplication, three timed runs, median result in GFLOPS\n- **Memory bandwidth** — 64 MB buffer copy across ten iterations, measuring actual throughput in GB/s\n\nThe results appear in a hardware card at the top of the model browser — your GPU name, VRAM, RAM, compute power, and whether your hardware supports fp16 shaders. You can re-probe anytime with one click.\n\nThis isn't a spec sheet lookup. It's a live measurement of what your GPU can actually do right now.\n\n## Models that fit\n\nWith your hardware measured, every model in the registry gets an evaluation. The engine checks hard constraints first:\n\n- **Does it fit?** Peak GPU memory compared against your available VRAM budget, with safety margins for discrete GPUs (75%), integrated (50%), and a hard cap at 35% of system RAM for shared-memory GPUs\n- **Does it need fp16?** Models requiring shader-f16 are marked incompatible if your GPU doesn't support it\n- **Will it be fast enough?** Estimated tokens-per-second from your measured memory bandwidth and the model's size\n\nEach model gets a status: **compatible** (runs well), **marginal** (fits but tight — expect reduced context or slower inference), or **incompatible** (won't run on your hardware). Marginal models include specific warnings: \"Requires 16 GB VRAM; you have 8 GB\" or \"Expect slow inference below recommended GFLOPS.\"\n\nThe engine also scales effective context windows. If memory headroom drops below 30%, the available context shrinks proportionally — because the KV cache grows with context length, and an OOM error mid-conversation helps nobody.\n\n## Find my best model\n\nDon't want to browse? The Model Wizard gets you to the right model in two steps.\n\n**Step 1 — What matters most?** Pick one of four priorities:\n\n- **Balanced** — good quality with reasonable privacy and cost\n- **Privacy first** — everything stays on your device, no exceptions\n- **Best quality** — most capable models regardless of where they run\n- **Cost conscious** — free and local models only, no API costs\n\nEach priority maps to a scoring preset that weights quality, capabilities, privacy, and cost differently. Privacy-first puts 50% weight on data residency. Quality-first puts 55% on quality tier and 30% on capabilities.\n\n**Step 2 — Your top picks.** The wizard runs the recommendation engine against your hardware and selected priority, then presents up to five models ranked by composite score. The top pick gets highlighted styling. Each result shows its match score, compatibility status, privacy level, effective context window, cost, and capability badges. One click takes you to the provider's settings tab to configure it.\n\n## Browse and filter\n\nThe full model browser gives you everything. A search bar matches across model names, descriptions, IDs, and providers. Three filter dropdowns narrow by provider, privacy floor, and required capability.\n\nEvery model appears as an expandable card. Collapsed: provider icon, name, privacy badge, compatibility status, context window, cost, and capability pills. Expanded: description, quality stars, license, detailed hardware evaluation with warnings, estimated tokens-per-second, and a direct link to configure the model in its provider's settings.\n\nModels re-score in real time as you change filters. The summary bar always shows how many models match and how many are compatible with your hardware.\n\n## Privacy as a first-class filter\n\nEvery model carries a privacy profile with four data residency levels:\n\n- **On-device** — never leaves your browser (WebGPU)\n- **Local network** — leaves the browser but stays on your machine (Ollama)\n- **Your cloud** — goes to your organization's cloud tenant (Azure OpenAI)\n- **Third-party cloud** — reaches an external API provider (Claude, OpenAI)\n\nThe privacy filter works as a floor: select \"Local network\" and you'll see on-device and LAN models, but not cloud. Select \"On-device only\" and only WebGPU and Gemini Nano remain.\n\nEach model also declares whether the weights are auditable (open-source vs. proprietary) and exactly who can observe your data. No ambiguity.\n\n## Ollama: your models, recognized\n\nIf you run Ollama, Daneel doesn't just show the registry's suggested models — it recognizes what you already have installed.\n\nThe merge engine pulls your installed model list from Ollama's API and matches each one against the registry in three tiers: **exact tag match** (high confidence), **family match** (same model family, different size — metadata inherited with warnings), or **unknown** (no match — capabilities inferred from parameter count using conservative heuristics).\n\nThe result: your installed models appear at the top with full metadata, followed by recommended models you might want to pull. You see what you have, what it can do, and what else is available — all in one view.\n\n## Always fresh, always available\n\nThe registry loads through a three-tier strategy:\n\n1. **Chrome storage cache** (24-hour TTL) — instant load, works offline\n2. **Backend API** (3-second timeout) — fresh data from the server, cached on success\n3. **Bundled fallback** — compiled into the extension package, guaranteed available\n\nYou never see a loading spinner on repeat visits. The cache serves immediately while a background refresh checks for updates. If the network is down, the bundled fallback ensures the full registry is always available.\n\n## What's next\n\nWe're working on per-model download tracking for WebGPU (so you can see which models are already cached), automatic model suggestions when hardware changes (new GPU? new recommendations), and deeper Ollama integration with pull progress tracking in the browser.\n\nThe right model for you depends on your hardware, your priorities, and your privacy requirements. Now Daneel can figure that out for you.\n",
      "date_published": "2026-03-04T00:00:00.000Z",
      "image": "https://daneel.injen.io/medias/registry.png",
      "tags": [
        "feature",
        "models",
        "hardware",
        "registry",
        "privacy"
      ]
    },
    {
      "id": "https://daneel.injen.io/news/mcp-connectors.html",
      "url": "https://daneel.injen.io/news/mcp-connectors.html?utm_source=json&utm_medium=feed&utm_campaign=news_syndication",
      "title": "Connect your AI to the tools you already use",
      "summary": "Daneel now speaks MCP — connect Stripe, Notion, Vercel, Supabase, and dozens more services directly to your browser AI, with full OAuth support and multi-turn tool calling.",
      "content_html": "<h2>Your browser AI just learned to use tools</h2>\n<p>Until now, Daneel could read and understand web pages, search entire sites, and chat with your documents. That&#39;s powerful — but it stopped at the boundary of your browser tab.</p>\n<p>With MCP support, that boundary disappears. Daneel now speaks the Model Context Protocol — an open standard that lets AI models call external tools and services directly. Ask your AI to check a Stripe payment, query a Supabase table, look up a Notion page, or inspect a Vercel deployment — and it will do it, right from the conversation.</p>\n<p>No copy-pasting between tabs. No switching to dashboards. Just ask.</p>\n<h2>Discover, connect, use</h2>\n<p>We designed the MCP experience around three steps:</p>\n<p><strong>Discover.</strong> The new MCP settings panel features a curated grid of popular services — Stripe, Notion, Vercel, Supabase, Figma, Linear, Slack, and more — each with its logo, auth type, and a one-click &quot;Connect&quot; button. If you need something beyond the featured list, a search bar queries multiple registries in real time. You can also paste any MCP server URL directly.</p>\n<p><strong>Connect.</strong> Daneel handles authentication automatically. For public servers, you&#39;re connected instantly. For API-key services like Google Maps, you paste your key once and it&#39;s stored securely. For OAuth services like Stripe or Notion, Daneel runs the full OAuth2 + PKCE flow through Chrome&#39;s identity API — you authorize in a familiar browser popup, and tokens are managed, refreshed, and rotated for you.</p>\n<p><strong>Use.</strong> Once connected, every tool a server exposes becomes available to your AI. Ask a question that requires external data, and the LLM decides which tools to call, executes them, reads the results, and continues the conversation. Multiple tools, multiple turns, fully autonomous.</p>\n<h2>Sixteen featured integrations at launch</h2>\n<p>The MCP settings panel ships with a hand-picked grid of validated servers across categories:</p>\n<ul>\n<li><strong>Payments:</strong> Stripe — customers, invoices, subscriptions, payment intents</li>\n<li><strong>Productivity:</strong> Notion — pages, databases, search; Fibery — work management</li>\n<li><strong>DevOps:</strong> Vercel — deployments, domains, logs; Cloudflare — Workers, KV, R2, D1</li>\n<li><strong>Database:</strong> Supabase — tables, edge functions, storage</li>\n<li><strong>Design:</strong> Figma — design files, components, tokens</li>\n<li><strong>Project management:</strong> Linear — issues, projects, cycles; Atlassian — Jira + Confluence</li>\n<li><strong>Communication:</strong> Slack — messages, channels, search</li>\n<li><strong>Search &amp; data:</strong> Exa — neural web search; Fiber — company enrichment; Apify — web scraping</li>\n<li><strong>CRM:</strong> Salesforce — objects, contacts, opportunities</li>\n<li><strong>Maps:</strong> Google Maps — places, geocoding, directions</li>\n</ul>\n<p>Each server shows its authentication method, tool count, and status indicator so you know exactly what you&#39;re connecting to before you click.</p>\n<h2>Authentication done right</h2>\n<p>MCP servers use different auth schemes, and Daneel handles all of them:</p>\n<ul>\n<li><strong>Public</strong> — no credentials needed, connect instantly</li>\n<li><strong>API Key</strong> — paste once, stored in Chrome&#39;s encrypted storage, injected automatically on every request</li>\n<li><strong>OAuth2 + PKCE</strong> — full authorization code flow with proof key, token refresh, and expiry tracking</li>\n<li><strong>Bearer token</strong> — for services that issue long-lived tokens</li>\n</ul>\n<p>Credentials are stored per-server in Chrome storage, excluded from data exports, and never leave your browser. Status indicators on each registered server tell you at a glance whether authentication is healthy, expiring, or needs attention.</p>\n<h2>Multi-turn tool calling</h2>\n<p>When you ask a question that requires external data, Daneel doesn&#39;t just make one tool call and stop. The tool-calling loop orchestrates a full multi-turn conversation between the LLM and the connected services:</p>\n<ol>\n<li>The LLM analyzes your question and decides which tools to call</li>\n<li>Daneel executes the tool calls against the MCP servers</li>\n<li>Results flow back to the LLM, which can ask follow-up questions or call additional tools</li>\n<li>The loop continues (up to five turns) until the LLM has enough information to answer</li>\n</ol>\n<p>This means you can ask compound questions — &quot;Find my latest Stripe invoice over $500 and check if the customer has an active Supabase project&quot; — and the AI will chain the right calls together.</p>\n<h2>Works with every AI backend</h2>\n<p>MCP tool calling isn&#39;t limited to cloud APIs. We built three tool-calling strategies so every backend can participate:</p>\n<ul>\n<li><strong>Claude</strong> uses native tool_use blocks — the most reliable path, with structured input/output</li>\n<li><strong>Ollama</strong> uses OpenAI-compatible function calling — works with tool-capable models like Qwen and Llama</li>\n<li><strong>WebGPU and Gemini Nano</strong> use a prompt-based strategy — tools are injected into the system prompt and the model outputs XML tool calls</li>\n</ul>\n<p>Cloud or local, the same MCP servers work everywhere.</p>\n<h2>Scoped to vaults and agents</h2>\n<p>MCP servers aren&#39;t just global. You can attach specific servers to individual vaults or agents, creating focused tool environments:</p>\n<ul>\n<li>A <strong>vault</strong> for your finance docs can have Stripe attached — ask questions that combine your local documents with live payment data</li>\n<li>An <strong>agent</strong> persona for DevOps can bind Vercel and Cloudflare — it knows its role and has the right tools</li>\n</ul>\n<p>Vaults and agents enforce mutual exclusion: a vault uses either its own MCP servers or an agent&#39;s, keeping tool access predictable and auditable.</p>\n<h2>You stay in control</h2>\n<p>Every registered server can be toggled on or off without removing it. Tool manifests are cached locally and refreshable on demand. The settings panel shows exactly which tools each server exposes, with parameter signatures you can inspect before connecting.</p>\n<p>Servers on your local network — localhost, private IPs, .local domains — are automatically detected and flagged, so you always know whether a tool call stays on your machine or reaches an external service.</p>\n<h2>What&#39;s next</h2>\n<p>This is the foundation. We&#39;re working on deeper integrations — agentic RAG that combines local document search with external tool calls, Docker Companion for running MCP servers locally, and more validated servers in the featured grid.</p>\n<p>MCP turns Daneel from a reader into a doer. Connect your first server and see what your browser AI can do.</p>\n",
      "content_text": "\n## Your browser AI just learned to use tools\n\nUntil now, Daneel could read and understand web pages, search entire sites, and chat with your documents. That's powerful — but it stopped at the boundary of your browser tab.\n\nWith MCP support, that boundary disappears. Daneel now speaks the Model Context Protocol — an open standard that lets AI models call external tools and services directly. Ask your AI to check a Stripe payment, query a Supabase table, look up a Notion page, or inspect a Vercel deployment — and it will do it, right from the conversation.\n\nNo copy-pasting between tabs. No switching to dashboards. Just ask.\n\n## Discover, connect, use\n\nWe designed the MCP experience around three steps:\n\n**Discover.** The new MCP settings panel features a curated grid of popular services — Stripe, Notion, Vercel, Supabase, Figma, Linear, Slack, and more — each with its logo, auth type, and a one-click \"Connect\" button. If you need something beyond the featured list, a search bar queries multiple registries in real time. You can also paste any MCP server URL directly.\n\n**Connect.** Daneel handles authentication automatically. For public servers, you're connected instantly. For API-key services like Google Maps, you paste your key once and it's stored securely. For OAuth services like Stripe or Notion, Daneel runs the full OAuth2 + PKCE flow through Chrome's identity API — you authorize in a familiar browser popup, and tokens are managed, refreshed, and rotated for you.\n\n**Use.** Once connected, every tool a server exposes becomes available to your AI. Ask a question that requires external data, and the LLM decides which tools to call, executes them, reads the results, and continues the conversation. Multiple tools, multiple turns, fully autonomous.\n\n## Sixteen featured integrations at launch\n\nThe MCP settings panel ships with a hand-picked grid of validated servers across categories:\n\n- **Payments:** Stripe — customers, invoices, subscriptions, payment intents\n- **Productivity:** Notion — pages, databases, search; Fibery — work management\n- **DevOps:** Vercel — deployments, domains, logs; Cloudflare — Workers, KV, R2, D1\n- **Database:** Supabase — tables, edge functions, storage\n- **Design:** Figma — design files, components, tokens\n- **Project management:** Linear — issues, projects, cycles; Atlassian — Jira + Confluence\n- **Communication:** Slack — messages, channels, search\n- **Search & data:** Exa — neural web search; Fiber — company enrichment; Apify — web scraping\n- **CRM:** Salesforce — objects, contacts, opportunities\n- **Maps:** Google Maps — places, geocoding, directions\n\nEach server shows its authentication method, tool count, and status indicator so you know exactly what you're connecting to before you click.\n\n## Authentication done right\n\nMCP servers use different auth schemes, and Daneel handles all of them:\n\n- **Public** — no credentials needed, connect instantly\n- **API Key** — paste once, stored in Chrome's encrypted storage, injected automatically on every request\n- **OAuth2 + PKCE** — full authorization code flow with proof key, token refresh, and expiry tracking\n- **Bearer token** — for services that issue long-lived tokens\n\nCredentials are stored per-server in Chrome storage, excluded from data exports, and never leave your browser. Status indicators on each registered server tell you at a glance whether authentication is healthy, expiring, or needs attention.\n\n## Multi-turn tool calling\n\nWhen you ask a question that requires external data, Daneel doesn't just make one tool call and stop. The tool-calling loop orchestrates a full multi-turn conversation between the LLM and the connected services:\n\n1. The LLM analyzes your question and decides which tools to call\n2. Daneel executes the tool calls against the MCP servers\n3. Results flow back to the LLM, which can ask follow-up questions or call additional tools\n4. The loop continues (up to five turns) until the LLM has enough information to answer\n\nThis means you can ask compound questions — \"Find my latest Stripe invoice over $500 and check if the customer has an active Supabase project\" — and the AI will chain the right calls together.\n\n## Works with every AI backend\n\nMCP tool calling isn't limited to cloud APIs. We built three tool-calling strategies so every backend can participate:\n\n- **Claude** uses native tool_use blocks — the most reliable path, with structured input/output\n- **Ollama** uses OpenAI-compatible function calling — works with tool-capable models like Qwen and Llama\n- **WebGPU and Gemini Nano** use a prompt-based strategy — tools are injected into the system prompt and the model outputs XML tool calls\n\nCloud or local, the same MCP servers work everywhere.\n\n## Scoped to vaults and agents\n\nMCP servers aren't just global. You can attach specific servers to individual vaults or agents, creating focused tool environments:\n\n- A **vault** for your finance docs can have Stripe attached — ask questions that combine your local documents with live payment data\n- An **agent** persona for DevOps can bind Vercel and Cloudflare — it knows its role and has the right tools\n\nVaults and agents enforce mutual exclusion: a vault uses either its own MCP servers or an agent's, keeping tool access predictable and auditable.\n\n## You stay in control\n\nEvery registered server can be toggled on or off without removing it. Tool manifests are cached locally and refreshable on demand. The settings panel shows exactly which tools each server exposes, with parameter signatures you can inspect before connecting.\n\nServers on your local network — localhost, private IPs, .local domains — are automatically detected and flagged, so you always know whether a tool call stays on your machine or reaches an external service.\n\n## What's next\n\nThis is the foundation. We're working on deeper integrations — agentic RAG that combines local document search with external tool calls, Docker Companion for running MCP servers locally, and more validated servers in the featured grid.\n\nMCP turns Daneel from a reader into a doer. Connect your first server and see what your browser AI can do.\n",
      "date_published": "2026-02-25T00:00:00.000Z",
      "image": "https://daneel.injen.io/medias/mcp.png",
      "tags": [
        "feature",
        "mcp",
        "tools",
        "integrations"
      ]
    },
    {
      "id": "https://daneel.injen.io/news/licensing-explained.html",
      "url": "https://daneel.injen.io/news/licensing-explained.html?utm_source=json&utm_medium=feed&utm_campaign=news_syndication",
      "title": "How Daneel's licensing works — one payment, no account, full control",
      "summary": "A one-time payment, a portable license key, no account required. Here's how Daneel keeps premium features simple, private, and permanent.",
      "content_html": "<h2>Free by default, paid when it matters</h2>\n<p>Daneel&#39;s core is free. Page Q&amp;A, Site RAG, local inference, MCP tool calling, agents, vaults — the features that define the extension work without paying anything or creating an account.</p>\n<p>Some capabilities — the kind that take significant infrastructure to support or that serve power-user workflows — are gated behind a one-time payment. Not a subscription. Not a recurring charge. One payment, permanent access.</p>\n<p>We&#39;ll keep expanding what&#39;s included in both tiers as Daneel grows. The boundary between free and paid will shift, but the model stays the same: most features free, a few premium, no dark patterns.</p>\n<h2>No account required</h2>\n<p>We don&#39;t want your email, your name, or a password. The entire licensing flow works without creating an account.</p>\n<p>Click &quot;Unlock&quot; in the settings panel. You&#39;re taken to a Stripe checkout page — a standard, secure payment form. Pay once, and you receive a license key in the format <code>DAN-XXXX-XXXX-XXXX</code>. That&#39;s it. The key is yours.</p>\n<p>No login. No dashboard. No profile to manage. The key is your identity.</p>\n<h2>How the key works</h2>\n<p>Your license key activates a signed token (ES256 JWT) that the extension caches locally. The token contains your plan tier, your feature flags, and a 7-day expiry.</p>\n<p>During those 7 days, everything works offline. The extension verifies the token locally using a cryptographic signature — no network call needed. Before the token expires, Daneel refreshes it in the background. If you&#39;re offline when the refresh window opens, the cached token keeps working until it expires. Come back online, and the next refresh happens automatically.</p>\n<p>You never think about this. Features just work.</p>\n<h2>Portable and permanent</h2>\n<p>The key is yours to keep. Copy it, store it in your password manager, write it on a sticky note — however you manage credentials.</p>\n<p>Switch machines? Install Daneel on your new laptop, open Settings, paste your key, and you&#39;re activated. Same key, same features, no transfer process.</p>\n<p>Lost your key? Enter the email you used at checkout on the recovery page, and we&#39;ll return all keys associated with that address. No support ticket, no waiting.</p>\n<h2>Two tiers, one price point</h2>\n<p><strong>Standard</strong> — a fixed one-time payment. You get permanent access to all premium features, current and future additions to the paid tier.</p>\n<p><strong>Sponsor</strong> — pay what you wish (above the minimum). Same features as Standard, but your contribution helps fund development. Sponsors may get early access to experimental features down the road.</p>\n<p>Both tiers grant the same capabilities today. The distinction exists so that users who want to support the project more generously can do so — and so we can recognize that support in the future.</p>\n<h2>What happens under the hood</h2>\n<p>The backend runs on Vercel with a Supabase database. Stripe handles payments — we never see your card details. When a payment completes, a webhook generates your license key and signs your JWT.</p>\n<p>The extension caches the token in Chrome&#39;s local storage. Feature checks are local — a function reads the cached token, verifies the signature, and checks whether the requested feature flag is present. No phone-home on every use.</p>\n<p>If we add new features to your plan tier after you&#39;ve purchased, the next token refresh picks up the updated flags automatically. Your key doesn&#39;t change, but what it unlocks can grow.</p>\n<h2>Privacy-first licensing</h2>\n<p>No user accounts means no user database to breach. We store license keys and the email from the Stripe receipt — that&#39;s the entire record. Your license key isn&#39;t tied to a browser fingerprint, a device ID, or a hardware serial number. It works on any machine, in any Chrome profile.</p>\n<p>The token never leaves your device except during the refresh call to our backend — and that call contains only your license key, nothing about your browsing, your documents, or your usage.</p>\n<p>We built the licensing to match the extension&#39;s philosophy: your data is yours, your identity is minimal, and the system works even when the network doesn&#39;t.</p>\n<h2>Supporting Daneel</h2>\n<p>If you find the extension useful, the best way to support it is to buy a license — even if you only use free features today. Every purchase funds continued development: better models, more integrations, and features that stay free for everyone.</p>\n",
      "content_text": "\n## Free by default, paid when it matters\n\nDaneel's core is free. Page Q&A, Site RAG, local inference, MCP tool calling, agents, vaults — the features that define the extension work without paying anything or creating an account.\n\nSome capabilities — the kind that take significant infrastructure to support or that serve power-user workflows — are gated behind a one-time payment. Not a subscription. Not a recurring charge. One payment, permanent access.\n\nWe'll keep expanding what's included in both tiers as Daneel grows. The boundary between free and paid will shift, but the model stays the same: most features free, a few premium, no dark patterns.\n\n## No account required\n\nWe don't want your email, your name, or a password. The entire licensing flow works without creating an account.\n\nClick \"Unlock\" in the settings panel. You're taken to a Stripe checkout page — a standard, secure payment form. Pay once, and you receive a license key in the format `DAN-XXXX-XXXX-XXXX`. That's it. The key is yours.\n\nNo login. No dashboard. No profile to manage. The key is your identity.\n\n## How the key works\n\nYour license key activates a signed token (ES256 JWT) that the extension caches locally. The token contains your plan tier, your feature flags, and a 7-day expiry.\n\nDuring those 7 days, everything works offline. The extension verifies the token locally using a cryptographic signature — no network call needed. Before the token expires, Daneel refreshes it in the background. If you're offline when the refresh window opens, the cached token keeps working until it expires. Come back online, and the next refresh happens automatically.\n\nYou never think about this. Features just work.\n\n## Portable and permanent\n\nThe key is yours to keep. Copy it, store it in your password manager, write it on a sticky note — however you manage credentials.\n\nSwitch machines? Install Daneel on your new laptop, open Settings, paste your key, and you're activated. Same key, same features, no transfer process.\n\nLost your key? Enter the email you used at checkout on the recovery page, and we'll return all keys associated with that address. No support ticket, no waiting.\n\n## Two tiers, one price point\n\n**Standard** — a fixed one-time payment. You get permanent access to all premium features, current and future additions to the paid tier.\n\n**Sponsor** — pay what you wish (above the minimum). Same features as Standard, but your contribution helps fund development. Sponsors may get early access to experimental features down the road.\n\nBoth tiers grant the same capabilities today. The distinction exists so that users who want to support the project more generously can do so — and so we can recognize that support in the future.\n\n## What happens under the hood\n\nThe backend runs on Vercel with a Supabase database. Stripe handles payments — we never see your card details. When a payment completes, a webhook generates your license key and signs your JWT.\n\nThe extension caches the token in Chrome's local storage. Feature checks are local — a function reads the cached token, verifies the signature, and checks whether the requested feature flag is present. No phone-home on every use.\n\nIf we add new features to your plan tier after you've purchased, the next token refresh picks up the updated flags automatically. Your key doesn't change, but what it unlocks can grow.\n\n## Privacy-first licensing\n\nNo user accounts means no user database to breach. We store license keys and the email from the Stripe receipt — that's the entire record. Your license key isn't tied to a browser fingerprint, a device ID, or a hardware serial number. It works on any machine, in any Chrome profile.\n\nThe token never leaves your device except during the refresh call to our backend — and that call contains only your license key, nothing about your browsing, your documents, or your usage.\n\nWe built the licensing to match the extension's philosophy: your data is yours, your identity is minimal, and the system works even when the network doesn't.\n\n## Supporting Daneel\n\nIf you find the extension useful, the best way to support it is to buy a license — even if you only use free features today. Every purchase funds continued development: better models, more integrations, and features that stay free for everyone.\n",
      "date_published": "2026-02-18T00:00:00.000Z",
      "image": "https://daneel.injen.io/medias/license.png",
      "tags": [
        "licensing",
        "privacy",
        "how-it-works"
      ]
    },
    {
      "id": "https://daneel.injen.io/news/claude-support.html",
      "url": "https://daneel.injen.io/news/claude-support.html?utm_source=json&utm_medium=feed&utm_campaign=news_syndication",
      "title": "When you need the full power — Claude on Daneel",
      "summary": "Bring your own Claude API key for tasks that demand frontier intelligence — complex reasoning, multi-step tool chains, and long documents — while keeping local inference as your default.",
      "content_html": "<h2>Local-first doesn&#39;t mean local-only</h2>\n<p>Daneel is built around a simple principle: your data should stay on your machine. WebGPU, Ollama, and Gemini Nano all honor that promise — inference runs locally, nothing leaves your device.</p>\n<p>But local models have limits. A 3B model running on your GPU can summarize a page and answer straightforward questions. It can&#39;t reliably reason through a complex legal document, orchestrate a five-step tool chain across Stripe and Supabase, or analyze a 50-page PDF with nuance.</p>\n<p>Sometimes you need a frontier model. That&#39;s what Claude is for.</p>\n<h2>Bring your own API key</h2>\n<p>Open Settings, go to the Claude tab, paste your Anthropic API key, and click Save &amp; Test. Daneel encrypts the key with AES-256-GCM and stores it in Chrome&#39;s local storage. It never leaves your device except in the API request header itself.</p>\n<p>Three models are available:</p>\n<ul>\n<li><strong>Haiku 4.5</strong> — fast and affordable, great for quick tasks</li>\n<li><strong>Sonnet 4.6</strong> — the balanced choice for most workloads</li>\n<li><strong>Opus 4.6</strong> — maximum capability for the hardest problems</li>\n</ul>\n<p>Each model shows its per-token pricing directly in the settings panel, so you know exactly what you&#39;re paying before you start.</p>\n<h2>What Claude unlocks</h2>\n<p>With Claude as your active provider, every Daneel feature gets an upgrade:</p>\n<ul>\n<li><strong>Page Q&amp;A</strong> handles long, complex pages with deep reasoning</li>\n<li><strong>Site RAG</strong> produces more nuanced answers from search results</li>\n<li><strong>Vault conversations</strong> can work through dense documents with multi-turn follow-ups</li>\n<li><strong>MCP tool calling</strong> uses Claude&#39;s native tool_use format — the most reliable tool calling in Daneel, capable of multi-step chains across multiple servers</li>\n<li><strong>Agents</strong> become dramatically more capable with a frontier model behind them</li>\n</ul>\n<p>After each response, the chat shows token counts and estimated cost — so you always know what a conversation is costing.</p>\n<h2>The privacy trade-off, stated clearly</h2>\n<p>Claude is a cloud API. Your prompts leave your machine and reach Anthropic&#39;s servers. In Daneel&#39;s privacy model, Claude gets &quot;Third-party cloud&quot; residency — the lowest privacy tier.</p>\n<p>We don&#39;t hide this. The settings panel states it plainly: your data leaves your device when you use the Anthropic API. The model weights are proprietary and not auditable.</p>\n<p>This is a conscious choice, not a default. Daneel starts local. Claude is there for when local isn&#39;t enough — a complex analysis, a critical tool chain, a document that demands the best model available. Use it deliberately, for the tasks that justify it, and keep your default provider local.</p>\n<h2>The right tool for the right job</h2>\n<p>Daneel&#39;s multi-provider architecture means you&#39;re never locked in. Use WebGPU for everyday browsing. Switch to Ollama for heavier local tasks. Reach for Claude when the stakes or complexity demand it. One click switches providers — your conversations, vaults, and agents stay the same.</p>\n<p>Local-first, cloud-when-needed. That&#39;s the balance.</p>\n",
      "content_text": "\n## Local-first doesn't mean local-only\n\nDaneel is built around a simple principle: your data should stay on your machine. WebGPU, Ollama, and Gemini Nano all honor that promise — inference runs locally, nothing leaves your device.\n\nBut local models have limits. A 3B model running on your GPU can summarize a page and answer straightforward questions. It can't reliably reason through a complex legal document, orchestrate a five-step tool chain across Stripe and Supabase, or analyze a 50-page PDF with nuance.\n\nSometimes you need a frontier model. That's what Claude is for.\n\n## Bring your own API key\n\nOpen Settings, go to the Claude tab, paste your Anthropic API key, and click Save & Test. Daneel encrypts the key with AES-256-GCM and stores it in Chrome's local storage. It never leaves your device except in the API request header itself.\n\nThree models are available:\n\n- **Haiku 4.5** — fast and affordable, great for quick tasks\n- **Sonnet 4.6** — the balanced choice for most workloads\n- **Opus 4.6** — maximum capability for the hardest problems\n\nEach model shows its per-token pricing directly in the settings panel, so you know exactly what you're paying before you start.\n\n## What Claude unlocks\n\nWith Claude as your active provider, every Daneel feature gets an upgrade:\n\n- **Page Q&A** handles long, complex pages with deep reasoning\n- **Site RAG** produces more nuanced answers from search results\n- **Vault conversations** can work through dense documents with multi-turn follow-ups\n- **MCP tool calling** uses Claude's native tool_use format — the most reliable tool calling in Daneel, capable of multi-step chains across multiple servers\n- **Agents** become dramatically more capable with a frontier model behind them\n\nAfter each response, the chat shows token counts and estimated cost — so you always know what a conversation is costing.\n\n## The privacy trade-off, stated clearly\n\nClaude is a cloud API. Your prompts leave your machine and reach Anthropic's servers. In Daneel's privacy model, Claude gets \"Third-party cloud\" residency — the lowest privacy tier.\n\nWe don't hide this. The settings panel states it plainly: your data leaves your device when you use the Anthropic API. The model weights are proprietary and not auditable.\n\nThis is a conscious choice, not a default. Daneel starts local. Claude is there for when local isn't enough — a complex analysis, a critical tool chain, a document that demands the best model available. Use it deliberately, for the tasks that justify it, and keep your default provider local.\n\n## The right tool for the right job\n\nDaneel's multi-provider architecture means you're never locked in. Use WebGPU for everyday browsing. Switch to Ollama for heavier local tasks. Reach for Claude when the stakes or complexity demand it. One click switches providers — your conversations, vaults, and agents stay the same.\n\nLocal-first, cloud-when-needed. That's the balance.\n",
      "date_published": "2026-02-10T00:00:00.000Z",
      "image": "https://daneel.injen.io/medias/claude.png",
      "tags": [
        "feature",
        "claude",
        "api",
        "llm",
        "anthropic"
      ]
    },
    {
      "id": "https://daneel.injen.io/news/privacy-architecture.html",
      "url": "https://daneel.injen.io/news/privacy-architecture.html?utm_source=json&utm_medium=feed&utm_campaign=news_syndication",
      "title": "Privacy in Daneel: how your data stays yours across every feature",
      "summary": "From on-device inference to encrypted API keys, from MCP credential isolation to opt-in analytics — a complete look at how Daneel protects your data at every layer.",
      "content_html": "<h2>Privacy isn&#39;t a feature. It&#39;s the architecture.</h2>\n<p>Daneel is built on a simple premise: your browsing, your documents, and your conversations belong to you. That sounds obvious, but making it real across five AI backends, dozens of MCP integrations, document vaults, and analytics requires deliberate engineering at every layer.</p>\n<p>This article explains exactly how privacy works in Daneel. Not marketing claims. The actual mechanisms.</p>\n<h2>The privacy gradient</h2>\n<p>Not all AI inference is equal when it comes to data residency. Daneel defines four levels, and every model in the registry carries an explicit label so you always know where your data goes.</p>\n<p><strong>On-device</strong> is the most private tier. WebGPU models and Gemini Nano run entirely inside your browser. Your prompts never leave the JavaScript process. No network calls, no external observers. The model weights are open-source and auditable. This is the default.</p>\n<p><strong>Local network</strong> is the next step. Ollama models run on a server you control, typically localhost. Prompts leave the browser process but stay on your machine or your local network. You control the infrastructure, you audit the logs.</p>\n<p><strong>Your cloud</strong> covers Azure OpenAI deployments. Data leaves your machine but lands in your organization&#39;s Azure subscription. Your tenant admin controls access, Azure RBAC governs permissions, and your organization&#39;s data governance policies apply. The model weights are proprietary, but the infrastructure is yours.</p>\n<p><strong>Third-party cloud</strong> is the least private tier. Claude sends prompts to Anthropic&#39;s servers. You rely on their privacy policy and terms of service. The trade-off is access to frontier-class reasoning that no local model can match today.</p>\n<p>Every model in the registry exposes three boolean flags alongside its residency level: whether data leaves the browser process, whether it leaves your machine, and whether it leaves your control. The model browser in Settings shows these visually, and the recommendation engine can filter by privacy floor. An enterprise user can restrict results to &quot;Your cloud or better&quot; and never see third-party options.</p>\n<h2>Encrypted credentials</h2>\n<p>API keys for Claude and Azure are encrypted with AES-256-GCM before they touch storage. The encryption key is derived from the extension&#39;s unique ID combined with a provider-specific salt, hashed through SHA-256. A fresh 12-byte initialization vector is generated for each encryption operation, prepended to the ciphertext, and the whole blob is base64-encoded before writing to Chrome&#39;s local storage.</p>\n<p>Decryption only happens in the background service worker when a request needs the key. The plaintext lives in memory for the duration of the API call, then is discarded. Keys are re-derived on each use rather than cached.</p>\n<p>This follows the browser extension threat model: the extension context is trusted, but web pages are not. If Chrome&#39;s storage is compromised at the OS level, AES-256-GCM still protects the contents. And critically, encrypted keys are excluded from data exports, so they never end up in a backup ZIP.</p>\n<h2>MCP credential isolation</h2>\n<p>Each MCP server&#39;s credentials (OAuth tokens, API keys, bearer tokens) are stored under a separate key in Chrome storage, namespaced by the server&#39;s canonical URL. There&#39;s no shared credential pool. Revoking access to one server has zero impact on others.</p>\n<p>OAuth2 tokens include expiry tracking with a 60-second safety margin. When a token is close to expiring, the transport layer refreshes it transparently. If the refresh fails, the server is flagged as needing re-authorization rather than silently failing.</p>\n<p>MCP credentials are permanently excluded from data exports. Both the exact keys and the prefix-matched patterns are stripped during the export assembly. After importing a backup on a new machine, you re-authorize each MCP server individually. This is intentional: portable credentials are a security liability.</p>\n<h2>What gets exported, and what doesn&#39;t</h2>\n<p>The data export system applies strict exclusion rules:</p>\n<p><strong>Never exported:</strong> Claude API key, Azure API key, all MCP credentials, OAuth client registrations, telemetry client ID, cloud backup credentials (Azure SAS URL, S3 config), and registry caches.</p>\n<p><strong>Always exported:</strong> Settings, conversations, vault metadata, document embeddings (as efficient binary), MCP server registrations (URLs, not credentials), and agent definitions.</p>\n<p>The exclusion list covers both exact key matches and prefix patterns, so dynamically-created credential keys (one per MCP server) are caught automatically. The export manifest documents what&#39;s included, giving you full transparency on the contents of every backup.</p>\n<h2>Origin header management</h2>\n<p>Chrome&#39;s service worker automatically attaches an <code>Origin: chrome-extension://...</code> header to every outbound request. Some MCP servers reject this with a 403, treating it as an unexpected origin.</p>\n<p>Daneel solves this with declarativeNetRequest rules that dynamically strip the Origin header for registered MCP server domains. Rules are regenerated whenever the server list changes, scoped to specific hostnames, and use a reserved ID range (100,000+) to avoid conflicts with other extensions. This prevents origin leakage while keeping MCP communication functional.</p>\n<h2>Analytics: what we collect and what we don&#39;t</h2>\n<p>Daneel uses Google Analytics 4 via the Measurement Protocol. This means no gtag.js script is loaded, no tracking pixels are injected, and no cookies are set on web pages. Analytics are plain HTTP POST requests sent from the background service worker to GA4&#39;s collection endpoint.</p>\n<p><strong>What we collect:</strong></p>\n<p>Feature usage counters. When you start a chat, run a search, import a document, or switch providers, an event fires with the action name, the provider used, and aggregate counts (number of results, number of chunks). We also collect device metadata: OS, browser version, screen size, language, and timezone.</p>\n<p>Geolocation is derived from your browser&#39;s IANA timezone by default. A hardcoded lookup table maps &quot;Europe/Paris&quot; to France, &quot;America/New_York&quot; to the US, and so on. No network call, no IP lookup, no external service.</p>\n<p><strong>What we never collect:</strong></p>\n<p>Your prompts. Your AI responses. The content of your pages or documents. The URLs you visit. Your search queries. Your API keys. Any personally identifiable information. These exclusions are enforced in code: the telemetry service filters out non-primitive values to prevent accidental leakage of complex objects.</p>\n<p><strong>Opt-out:</strong></p>\n<p>Open Settings, go to Privacy, and toggle telemetry off. That&#39;s it. The gate is checked before every event. When telemetry is off, nothing is sent. No degraded experience, no nag banners, no &quot;are you sure&quot; prompts.</p>\n<p><strong>Enhanced geolocation (opt-in):</strong></p>\n<p>If you want more accurate location data in analytics (useful for us to understand regional usage), you can enable IP-based geolocation. This makes a single request per session to ip-api.com, returning your approximate country, region, and city. It&#39;s off by default and clearly labeled in the Privacy settings. The timezone-derived fallback works fine for most purposes.</p>\n<h2>Content Security Policy</h2>\n<p>The extension runs under a strict CSP: only scripts from the extension itself are allowed (<code>script-src &#39;self&#39;</code>), with <code>wasm-unsafe-eval</code> permitted for ONNX Runtime&#39;s WebAssembly needs. No remote scripts, no inline scripts, no eval. The Cross-Origin Embedder Policy uses <code>credentialless</code> mode, which enables SharedArrayBuffer for multi-threaded inference without sending credentials on cross-origin model downloads.</p>\n<h2>The design principle</h2>\n<p>Every privacy decision in Daneel follows one rule: the user should be able to understand where their data goes by looking at a single label. On-device means on-device. Local network means local network. Third-party cloud means third-party cloud.</p>\n<p>We don&#39;t hide privacy trade-offs behind marketing language. If you choose Claude for its capability, the Settings panel tells you plainly that your data reaches Anthropic&#39;s servers. If you stay on WebGPU, nothing leaves your browser. The gradient exists because real users have real needs that span from maximum privacy to maximum capability.</p>\n<p>Your data, your choice. That&#39;s the whole idea.</p>\n",
      "content_text": "\n## Privacy isn't a feature. It's the architecture.\n\nDaneel is built on a simple premise: your browsing, your documents, and your conversations belong to you. That sounds obvious, but making it real across five AI backends, dozens of MCP integrations, document vaults, and analytics requires deliberate engineering at every layer.\n\nThis article explains exactly how privacy works in Daneel. Not marketing claims. The actual mechanisms.\n\n## The privacy gradient\n\nNot all AI inference is equal when it comes to data residency. Daneel defines four levels, and every model in the registry carries an explicit label so you always know where your data goes.\n\n**On-device** is the most private tier. WebGPU models and Gemini Nano run entirely inside your browser. Your prompts never leave the JavaScript process. No network calls, no external observers. The model weights are open-source and auditable. This is the default.\n\n**Local network** is the next step. Ollama models run on a server you control, typically localhost. Prompts leave the browser process but stay on your machine or your local network. You control the infrastructure, you audit the logs.\n\n**Your cloud** covers Azure OpenAI deployments. Data leaves your machine but lands in your organization's Azure subscription. Your tenant admin controls access, Azure RBAC governs permissions, and your organization's data governance policies apply. The model weights are proprietary, but the infrastructure is yours.\n\n**Third-party cloud** is the least private tier. Claude sends prompts to Anthropic's servers. You rely on their privacy policy and terms of service. The trade-off is access to frontier-class reasoning that no local model can match today.\n\nEvery model in the registry exposes three boolean flags alongside its residency level: whether data leaves the browser process, whether it leaves your machine, and whether it leaves your control. The model browser in Settings shows these visually, and the recommendation engine can filter by privacy floor. An enterprise user can restrict results to \"Your cloud or better\" and never see third-party options.\n\n## Encrypted credentials\n\nAPI keys for Claude and Azure are encrypted with AES-256-GCM before they touch storage. The encryption key is derived from the extension's unique ID combined with a provider-specific salt, hashed through SHA-256. A fresh 12-byte initialization vector is generated for each encryption operation, prepended to the ciphertext, and the whole blob is base64-encoded before writing to Chrome's local storage.\n\nDecryption only happens in the background service worker when a request needs the key. The plaintext lives in memory for the duration of the API call, then is discarded. Keys are re-derived on each use rather than cached.\n\nThis follows the browser extension threat model: the extension context is trusted, but web pages are not. If Chrome's storage is compromised at the OS level, AES-256-GCM still protects the contents. And critically, encrypted keys are excluded from data exports, so they never end up in a backup ZIP.\n\n## MCP credential isolation\n\nEach MCP server's credentials (OAuth tokens, API keys, bearer tokens) are stored under a separate key in Chrome storage, namespaced by the server's canonical URL. There's no shared credential pool. Revoking access to one server has zero impact on others.\n\nOAuth2 tokens include expiry tracking with a 60-second safety margin. When a token is close to expiring, the transport layer refreshes it transparently. If the refresh fails, the server is flagged as needing re-authorization rather than silently failing.\n\nMCP credentials are permanently excluded from data exports. Both the exact keys and the prefix-matched patterns are stripped during the export assembly. After importing a backup on a new machine, you re-authorize each MCP server individually. This is intentional: portable credentials are a security liability.\n\n## What gets exported, and what doesn't\n\nThe data export system applies strict exclusion rules:\n\n**Never exported:** Claude API key, Azure API key, all MCP credentials, OAuth client registrations, telemetry client ID, cloud backup credentials (Azure SAS URL, S3 config), and registry caches.\n\n**Always exported:** Settings, conversations, vault metadata, document embeddings (as efficient binary), MCP server registrations (URLs, not credentials), and agent definitions.\n\nThe exclusion list covers both exact key matches and prefix patterns, so dynamically-created credential keys (one per MCP server) are caught automatically. The export manifest documents what's included, giving you full transparency on the contents of every backup.\n\n## Origin header management\n\nChrome's service worker automatically attaches an `Origin: chrome-extension://...` header to every outbound request. Some MCP servers reject this with a 403, treating it as an unexpected origin.\n\nDaneel solves this with declarativeNetRequest rules that dynamically strip the Origin header for registered MCP server domains. Rules are regenerated whenever the server list changes, scoped to specific hostnames, and use a reserved ID range (100,000+) to avoid conflicts with other extensions. This prevents origin leakage while keeping MCP communication functional.\n\n## Analytics: what we collect and what we don't\n\nDaneel uses Google Analytics 4 via the Measurement Protocol. This means no gtag.js script is loaded, no tracking pixels are injected, and no cookies are set on web pages. Analytics are plain HTTP POST requests sent from the background service worker to GA4's collection endpoint.\n\n**What we collect:**\n\nFeature usage counters. When you start a chat, run a search, import a document, or switch providers, an event fires with the action name, the provider used, and aggregate counts (number of results, number of chunks). We also collect device metadata: OS, browser version, screen size, language, and timezone.\n\nGeolocation is derived from your browser's IANA timezone by default. A hardcoded lookup table maps \"Europe/Paris\" to France, \"America/New_York\" to the US, and so on. No network call, no IP lookup, no external service.\n\n**What we never collect:**\n\nYour prompts. Your AI responses. The content of your pages or documents. The URLs you visit. Your search queries. Your API keys. Any personally identifiable information. These exclusions are enforced in code: the telemetry service filters out non-primitive values to prevent accidental leakage of complex objects.\n\n**Opt-out:**\n\nOpen Settings, go to Privacy, and toggle telemetry off. That's it. The gate is checked before every event. When telemetry is off, nothing is sent. No degraded experience, no nag banners, no \"are you sure\" prompts.\n\n**Enhanced geolocation (opt-in):**\n\nIf you want more accurate location data in analytics (useful for us to understand regional usage), you can enable IP-based geolocation. This makes a single request per session to ip-api.com, returning your approximate country, region, and city. It's off by default and clearly labeled in the Privacy settings. The timezone-derived fallback works fine for most purposes.\n\n## Content Security Policy\n\nThe extension runs under a strict CSP: only scripts from the extension itself are allowed (`script-src 'self'`), with `wasm-unsafe-eval` permitted for ONNX Runtime's WebAssembly needs. No remote scripts, no inline scripts, no eval. The Cross-Origin Embedder Policy uses `credentialless` mode, which enables SharedArrayBuffer for multi-threaded inference without sending credentials on cross-origin model downloads.\n\n## The design principle\n\nEvery privacy decision in Daneel follows one rule: the user should be able to understand where their data goes by looking at a single label. On-device means on-device. Local network means local network. Third-party cloud means third-party cloud.\n\nWe don't hide privacy trade-offs behind marketing language. If you choose Claude for its capability, the Settings panel tells you plainly that your data reaches Anthropic's servers. If you stay on WebGPU, nothing leaves your browser. The gradient exists because real users have real needs that span from maximum privacy to maximum capability.\n\nYour data, your choice. That's the whole idea.\n",
      "date_published": "2026-02-04T00:00:00.000Z",
      "image": "https://daneel.injen.io/medias/privacy.png",
      "tags": [
        "privacy",
        "security",
        "how-it-works",
        "analytics"
      ]
    },
    {
      "id": "https://daneel.injen.io/news/semantic-search.html",
      "url": "https://daneel.injen.io/news/semantic-search.html?utm_source=json&utm_medium=feed&utm_campaign=news_syndication",
      "title": "Search by meaning, not just keywords",
      "summary": "Daneel crawls and indexes entire websites, then lets you search them with natural language — matching concepts, not strings, with results in under 5 milliseconds.",
      "content_html": "<h2>Why keyword search falls short</h2>\n<p>You search a documentation site for &quot;how to handle errors&quot; and get zero results because the docs say &quot;exception management.&quot; You look for &quot;deploy to production&quot; and miss the page titled &quot;release workflow.&quot; Keyword search only finds what you already know how to phrase.</p>\n<p>Semantic search works differently. It understands that &quot;handle errors&quot; and &quot;exception management&quot; mean the same thing. It matches intent, not strings.</p>\n<h2>How Daneel indexes a site</h2>\n<p>Open Daneel on any page, switch to Site mode, and hit Index. Here is what happens:</p>\n<ol>\n<li><strong>Sitemap discovery</strong> — Daneel looks for the site&#39;s <code>sitemap.xml</code> and follows nested sitemaps up to three levels deep. If there is no sitemap, it indexes the current page.</li>\n<li><strong>Content extraction</strong> — Each page is converted to clean Markdown using a three-strategy pipeline: Readability, CSS-aware Turndown, or plain-text fallback.</li>\n<li><strong>Chunking</strong> — The text is split into overlapping segments along natural boundaries (paragraphs, then sentences), preserving context at the edges.</li>\n<li><strong>Embedding</strong> — Each chunk is transformed into a 384-dimensional vector by an embedding model running on your GPU via WebGPU. No cloud calls.</li>\n<li><strong>Storage</strong> — Embeddings are persisted in IndexedDB, partitioned by domain. They survive browser restarts.</li>\n</ol>\n<p>The entire pipeline runs in your browser. Your browsing data never leaves your machine.</p>\n<h2>How search works</h2>\n<p>When you type a question, Daneel embeds your query with the same model and runs a cosine similarity search across all stored chunks. On modern hardware with WebGPU, this takes under 5 milliseconds, even across tens of thousands of chunks.</p>\n<p>Results are ranked by semantic similarity with a keyword boost layer: if your exact terms appear in a chunk, it gets a small score bonus. This hybrid approach catches both conceptual matches and precise terminology.</p>\n<p>The top results, with their source URLs, are assembled into context for the LLM, which answers your question grounded in the actual site content.</p>\n<h2>What is coming next</h2>\n<p>Sitemaps cover most well-structured sites, but not all pages are listed. We are building a true crawler that follows links breadth-first, discovering pages the sitemap missed. Stay tuned.</p>\n",
      "content_text": "\n## Why keyword search falls short\n\nYou search a documentation site for \"how to handle errors\" and get zero results because the docs say \"exception management.\" You look for \"deploy to production\" and miss the page titled \"release workflow.\" Keyword search only finds what you already know how to phrase.\n\nSemantic search works differently. It understands that \"handle errors\" and \"exception management\" mean the same thing. It matches intent, not strings.\n\n## How Daneel indexes a site\n\nOpen Daneel on any page, switch to Site mode, and hit Index. Here is what happens:\n\n1. **Sitemap discovery** — Daneel looks for the site's `sitemap.xml` and follows nested sitemaps up to three levels deep. If there is no sitemap, it indexes the current page.\n2. **Content extraction** — Each page is converted to clean Markdown using a three-strategy pipeline: Readability, CSS-aware Turndown, or plain-text fallback.\n3. **Chunking** — The text is split into overlapping segments along natural boundaries (paragraphs, then sentences), preserving context at the edges.\n4. **Embedding** — Each chunk is transformed into a 384-dimensional vector by an embedding model running on your GPU via WebGPU. No cloud calls.\n5. **Storage** — Embeddings are persisted in IndexedDB, partitioned by domain. They survive browser restarts.\n\nThe entire pipeline runs in your browser. Your browsing data never leaves your machine.\n\n## How search works\n\nWhen you type a question, Daneel embeds your query with the same model and runs a cosine similarity search across all stored chunks. On modern hardware with WebGPU, this takes under 5 milliseconds, even across tens of thousands of chunks.\n\nResults are ranked by semantic similarity with a keyword boost layer: if your exact terms appear in a chunk, it gets a small score bonus. This hybrid approach catches both conceptual matches and precise terminology.\n\nThe top results, with their source URLs, are assembled into context for the LLM, which answers your question grounded in the actual site content.\n\n## What is coming next\n\nSitemaps cover most well-structured sites, but not all pages are listed. We are building a true crawler that follows links breadth-first, discovering pages the sitemap missed. Stay tuned.\n",
      "date_published": "2026-02-01T00:00:00.000Z",
      "image": "https://daneel.injen.io/medias/semantic.search.png",
      "tags": [
        "feature",
        "search",
        "rag",
        "indexing",
        "privacy"
      ]
    },
    {
      "id": "https://daneel.injen.io/news/gemini-nano-support.html",
      "url": "https://daneel.injen.io/news/gemini-nano-support.html?utm_source=json&utm_medium=feed&utm_campaign=news_syndication",
      "title": "Zero-install AI — Gemini Nano runs inside your browser",
      "summary": "Chrome ships an AI model built into the browser itself. Daneel now supports it — no downloads, no API keys, no server. Here's how to activate it and what you can do with it.",
      "content_html": "<h2>The AI is already there</h2>\n<p>What if you didn&#39;t need to download a model, run a server, or enter an API key? What if the AI was just... part of your browser?</p>\n<p>That&#39;s Gemini Nano. Google ships a compact language model directly inside Chrome — built into the browser binary, managed by Chrome&#39;s update system, running entirely on your device. Daneel now supports it as a first-class provider.</p>\n<p>No setup beyond flipping two flags. No storage to manage. No cost. And absolutely nothing leaves your machine.</p>\n<h2>What is Gemini Nano</h2>\n<p>Gemini Nano is Google&#39;s on-device language model, designed to run locally inside Chrome. It&#39;s approximately 3 billion parameters — small enough to fit on most modern hardware, capable enough for summarization, Q&amp;A, rewriting, and basic reasoning.</p>\n<p>Chrome handles the entire lifecycle: downloading the model weights, updating them silently, and managing GPU memory. Your extension — and Daneel — simply calls the LanguageModel API and gets responses. The model is shared across all extensions and web apps that use it, so there&#39;s no duplication.</p>\n<h2>How to activate it</h2>\n<p>Gemini Nano isn&#39;t enabled by default yet. You need to flip two Chrome flags — it takes about two minutes.</p>\n<p><strong>Step 1 — Check your Chrome version.</strong> You need Chrome 140 or later. Check at <code>chrome://settings/help</code>. If you&#39;re on an older version, update first.</p>\n<p><strong>Step 2 — Enable the on-device model flag.</strong> Navigate to:</p>\n<pre><code>chrome://flags/#optimization-guide-on-device-model</code></pre><p>Set it to <strong>Enabled</strong> (or <strong>Enabled BypassPerfRequirement</strong> if your hardware is slightly below spec). This tells Chrome to download and maintain the Gemini Nano model.</p>\n<p><strong>Step 3 — Enable the Prompt API flag.</strong> Navigate to:</p>\n<pre><code>chrome://flags/#prompt-api-for-gemini-nano</code></pre><p>Set it to <strong>Enabled</strong> for English only, or <strong>Enabled multilingual</strong> for English, Spanish, and Japanese support.</p>\n<p><strong>Step 4 — Relaunch Chrome.</strong> Click the Relaunch button at the bottom of the flags page. Chrome will restart and begin downloading the model in the background.</p>\n<p><strong>Step 5 — Verify the download.</strong> Open <code>chrome://on-device-internals</code> and check the Model Status tab. You should see Gemini Nano listed as downloaded. If it shows &quot;scheduled&quot; or &quot;pending,&quot; give it a few minutes — the download happens silently.</p>\n<p>You can also verify in DevTools (F12, then Console):</p>\n<pre><code>await LanguageModel.availability()\n// Should return: \"available\"</code></pre><p>Once you see &quot;available,&quot; you&#39;re ready to go.</p>\n<h2>System requirements</h2>\n<p>Gemini Nano needs reasonable hardware to run well:</p>\n<ul>\n<li><strong>OS:</strong> Windows 10/11, macOS 13+ (Ventura), Linux, or ChromeOS 16389+ (Chromebook Plus only)</li>\n<li><strong>RAM:</strong> 16 GB minimum</li>\n<li><strong>CPU:</strong> 4 cores or more</li>\n<li><strong>GPU:</strong> Strictly more than 4 GB VRAM (integrated GPUs may work if RAM is sufficient)</li>\n<li><strong>Storage:</strong> At least 22 GB free on the volume containing your Chrome profile</li>\n<li><strong>Network:</strong> Unmetered connection for the initial model download only</li>\n</ul>\n<p>Important: if your free storage drops below 10 GB after the download, Chrome will automatically remove the model to reclaim space.</p>\n<p>Not supported on Android, iOS, or non-Chromebook-Plus ChromeOS devices.</p>\n<h2>Using Gemini Nano in Daneel</h2>\n<p>Open Settings, go to the Gemini Nano tab. Daneel auto-detects whether the model is available — you&#39;ll see a green status if everything is ready, or clear guidance on what&#39;s missing.</p>\n<p>Choose your output language. Chrome uses language selection for quality optimization — English, Spanish, and Japanese are supported with multilingual mode enabled. The language setting is saved and persists across sessions.</p>\n<p>Hit the test query box to try a quick prompt. Tokens stream back in real time, confirming the model is working on your hardware.</p>\n<p>Select Gemini Nano as your active provider and you&#39;re set. Page Q&amp;A, Site RAG, Vault conversations — everything works with zero network dependency.</p>\n<h2>Streaming with a twist</h2>\n<p>One quirk of Chrome&#39;s API: it emits <strong>cumulative</strong> chunks rather than incremental tokens. Each chunk contains the entire response generated so far, not just the new text. Daneel handles this transparently — a smart auto-detection layer compares consecutive chunks and extracts only the new content, giving you the same smooth token-by-token streaming experience you get from every other provider.</p>\n<p>Newer Chrome versions (135+) sometimes emit true incremental chunks instead. Daneel adapts to both modes automatically during the first two tokens of each response. You never notice the difference.</p>\n<h2>Tool calling — with caveats</h2>\n<p>Yes, Gemini Nano can use MCP tools. Daneel injects tool descriptions into the system prompt and parses XML-tagged tool calls from the model&#39;s output. Connect Stripe, Exa, or any MCP server and Nano will attempt to call the right tools.</p>\n<p>The honest caveat: a 3B model is not as reliable at tool calling as Claude or a large Ollama model. It works for simple, single-tool queries but can struggle with complex multi-step chains. Daneel truncates large tool results to 1,500 characters to stay within Nano&#39;s limited context window.</p>\n<p>Think of it as a capable assistant for straightforward tasks, not a power tool for complex orchestration. For that, step up to Ollama or Claude.</p>\n<h2>The most private option</h2>\n<p>Gemini Nano is the only provider where the model runs inside the browser process itself. Your prompts never leave Chrome — they don&#39;t cross a network boundary, they don&#39;t reach a localhost server, they don&#39;t touch any external process.</p>\n<p>In Daneel&#39;s privacy model, Gemini Nano gets &quot;On-device&quot; residency — the highest privacy tier. The only caveat: Chrome itself manages the model, so the browser vendor is technically in the loop. But your questions, your pages, your documents? They stay in your browser&#39;s memory and nowhere else.</p>\n<h2>What to expect</h2>\n<p>Gemini Nano is powerful for its size, but it&#39;s a 3B model running on consumer hardware. Set your expectations accordingly:</p>\n<ul>\n<li><strong>Great for:</strong> summarization, simple Q&amp;A, rewriting, page chat, quick lookups</li>\n<li><strong>Decent for:</strong> basic reasoning, short document analysis, single-tool MCP calls</li>\n<li><strong>Limited for:</strong> complex multi-step reasoning, long documents, multi-turn tool chains, code generation</li>\n<li><strong>Context window:</strong> varies by GPU capability and Chrome version — shorter than cloud models</li>\n</ul>\n<p>The context window and inference speed depend on your specific GPU. Daneel&#39;s settings panel notes this explicitly so you&#39;re never surprised.</p>\n<p><strong>Learn more about Gemini Nano:</strong> <a href=\"https://developer.chrome.com/docs/ai/built-in\">Read on site</a></p>\n<h2>What&#39;s next</h2>\n<p>Chrome&#39;s built-in AI APIs are evolving rapidly. Google is adding new capabilities — Summarizer, Writer, Rewriter, Proofreader — and improving the underlying model. As Chrome&#39;s AI surface grows, Daneel will integrate deeper.</p>\n<p>For now, Gemini Nano is the zero-friction entry point: no downloads, no keys, no cost, no configuration beyond two flags. If you have Chrome 140+ and decent hardware, your browser already has an AI. Daneel just gives it something to do.</p>\n",
      "content_text": "\n## The AI is already there\n\nWhat if you didn't need to download a model, run a server, or enter an API key? What if the AI was just... part of your browser?\n\nThat's Gemini Nano. Google ships a compact language model directly inside Chrome — built into the browser binary, managed by Chrome's update system, running entirely on your device. Daneel now supports it as a first-class provider.\n\nNo setup beyond flipping two flags. No storage to manage. No cost. And absolutely nothing leaves your machine.\n\n## What is Gemini Nano\n\nGemini Nano is Google's on-device language model, designed to run locally inside Chrome. It's approximately 3 billion parameters — small enough to fit on most modern hardware, capable enough for summarization, Q&A, rewriting, and basic reasoning.\n\nChrome handles the entire lifecycle: downloading the model weights, updating them silently, and managing GPU memory. Your extension — and Daneel — simply calls the LanguageModel API and gets responses. The model is shared across all extensions and web apps that use it, so there's no duplication.\n\n## How to activate it\n\nGemini Nano isn't enabled by default yet. You need to flip two Chrome flags — it takes about two minutes.\n\n**Step 1 — Check your Chrome version.** You need Chrome 140 or later. Check at `chrome://settings/help`. If you're on an older version, update first.\n\n**Step 2 — Enable the on-device model flag.** Navigate to:\n\n```\nchrome://flags/#optimization-guide-on-device-model\n```\n\nSet it to **Enabled** (or **Enabled BypassPerfRequirement** if your hardware is slightly below spec). This tells Chrome to download and maintain the Gemini Nano model.\n\n**Step 3 — Enable the Prompt API flag.** Navigate to:\n\n```\nchrome://flags/#prompt-api-for-gemini-nano\n```\n\nSet it to **Enabled** for English only, or **Enabled multilingual** for English, Spanish, and Japanese support.\n\n**Step 4 — Relaunch Chrome.** Click the Relaunch button at the bottom of the flags page. Chrome will restart and begin downloading the model in the background.\n\n**Step 5 — Verify the download.** Open `chrome://on-device-internals` and check the Model Status tab. You should see Gemini Nano listed as downloaded. If it shows \"scheduled\" or \"pending,\" give it a few minutes — the download happens silently.\n\nYou can also verify in DevTools (F12, then Console):\n\n```javascript\nawait LanguageModel.availability()\n// Should return: \"available\"\n```\n\nOnce you see \"available,\" you're ready to go.\n\n## System requirements\n\nGemini Nano needs reasonable hardware to run well:\n\n- **OS:** Windows 10/11, macOS 13+ (Ventura), Linux, or ChromeOS 16389+ (Chromebook Plus only)\n- **RAM:** 16 GB minimum\n- **CPU:** 4 cores or more\n- **GPU:** Strictly more than 4 GB VRAM (integrated GPUs may work if RAM is sufficient)\n- **Storage:** At least 22 GB free on the volume containing your Chrome profile\n- **Network:** Unmetered connection for the initial model download only\n\nImportant: if your free storage drops below 10 GB after the download, Chrome will automatically remove the model to reclaim space.\n\nNot supported on Android, iOS, or non-Chromebook-Plus ChromeOS devices.\n\n## Using Gemini Nano in Daneel\n\nOpen Settings, go to the Gemini Nano tab. Daneel auto-detects whether the model is available — you'll see a green status if everything is ready, or clear guidance on what's missing.\n\nChoose your output language. Chrome uses language selection for quality optimization — English, Spanish, and Japanese are supported with multilingual mode enabled. The language setting is saved and persists across sessions.\n\nHit the test query box to try a quick prompt. Tokens stream back in real time, confirming the model is working on your hardware.\n\nSelect Gemini Nano as your active provider and you're set. Page Q&A, Site RAG, Vault conversations — everything works with zero network dependency.\n\n## Streaming with a twist\n\nOne quirk of Chrome's API: it emits **cumulative** chunks rather than incremental tokens. Each chunk contains the entire response generated so far, not just the new text. Daneel handles this transparently — a smart auto-detection layer compares consecutive chunks and extracts only the new content, giving you the same smooth token-by-token streaming experience you get from every other provider.\n\nNewer Chrome versions (135+) sometimes emit true incremental chunks instead. Daneel adapts to both modes automatically during the first two tokens of each response. You never notice the difference.\n\n## Tool calling — with caveats\n\nYes, Gemini Nano can use MCP tools. Daneel injects tool descriptions into the system prompt and parses XML-tagged tool calls from the model's output. Connect Stripe, Exa, or any MCP server and Nano will attempt to call the right tools.\n\nThe honest caveat: a 3B model is not as reliable at tool calling as Claude or a large Ollama model. It works for simple, single-tool queries but can struggle with complex multi-step chains. Daneel truncates large tool results to 1,500 characters to stay within Nano's limited context window.\n\nThink of it as a capable assistant for straightforward tasks, not a power tool for complex orchestration. For that, step up to Ollama or Claude.\n\n## The most private option\n\nGemini Nano is the only provider where the model runs inside the browser process itself. Your prompts never leave Chrome — they don't cross a network boundary, they don't reach a localhost server, they don't touch any external process.\n\nIn Daneel's privacy model, Gemini Nano gets \"On-device\" residency — the highest privacy tier. The only caveat: Chrome itself manages the model, so the browser vendor is technically in the loop. But your questions, your pages, your documents? They stay in your browser's memory and nowhere else.\n\n## What to expect\n\nGemini Nano is powerful for its size, but it's a 3B model running on consumer hardware. Set your expectations accordingly:\n\n- **Great for:** summarization, simple Q&A, rewriting, page chat, quick lookups\n- **Decent for:** basic reasoning, short document analysis, single-tool MCP calls\n- **Limited for:** complex multi-step reasoning, long documents, multi-turn tool chains, code generation\n- **Context window:** varies by GPU capability and Chrome version — shorter than cloud models\n\nThe context window and inference speed depend on your specific GPU. Daneel's settings panel notes this explicitly so you're never surprised.\n\n**Learn more about Gemini Nano:** [Read on site](https://developer.chrome.com/docs/ai/built-in)\n\n## What's next\n\nChrome's built-in AI APIs are evolving rapidly. Google is adding new capabilities — Summarizer, Writer, Rewriter, Proofreader — and improving the underlying model. As Chrome's AI surface grows, Daneel will integrate deeper.\n\nFor now, Gemini Nano is the zero-friction entry point: no downloads, no keys, no cost, no configuration beyond two flags. If you have Chrome 140+ and decent hardware, your browser already has an AI. Daneel just gives it something to do.\n",
      "date_published": "2026-01-18T00:00:00.000Z",
      "image": "https://daneel.injen.io/medias/gemini.nano.jpg",
      "tags": [
        "feature",
        "gemini-nano",
        "local",
        "privacy",
        "how-to"
      ]
    },
    {
      "id": "https://daneel.injen.io/news/ollama-support.html",
      "url": "https://daneel.injen.io/news/ollama-support.html?utm_source=json&utm_medium=feed&utm_campaign=news_syndication",
      "title": "Run AI on your own machine — Ollama meets Daneel",
      "summary": "Connect your local Ollama server to Daneel and run models like Llama, Mistral, and Qwen entirely on your hardware — with streaming, tool calling, and full model management from your browser.",
      "content_html": "<h2>Local models, browser convenience</h2>\n<p>Running AI on your own hardware used to mean terminal commands, Python scripts, and a lot of configuration. Ollama made local inference approachable. Daneel makes it seamless.</p>\n<p>With Ollama support, you can run models like Llama, Mistral, Qwen, Phi, and Granite entirely on your machine — and interact with them through the same browser interface you use for everything else. No API keys, no cloud, no usage fees. Just your GPU doing the work.</p>\n<h2>Connect in seconds</h2>\n<p>Open Settings, go to the Ollama tab, and you&#39;re looking at a connection panel with one field: the base URL. The default is <code>http://localhost:11434</code> — if Ollama is running, Daneel finds it automatically.</p>\n<p>The auto-probe runs silently when you open settings. If Ollama is reachable, you&#39;ll see a green &quot;Connected&quot; status with your installed model count. If it&#39;s not running, the panel stays quiet — no error spam on first visit.</p>\n<p>If you hit a 403 error, Daneel knows exactly what happened: Chrome extensions send an Origin header that Ollama blocks by default. Instead of a cryptic error, you get step-by-step instructions to restart Ollama with the right environment variable:</p>\n<pre><code>OLLAMA_ORIGINS=chrome-extension://* ollama serve</code></pre><p>One restart, problem solved permanently.</p>\n<h2>Your model library, in the browser</h2>\n<p>Once connected, the installed models section shows everything Ollama has downloaded. Each model appears with its name, parameter count, quantization level, and capability badges — green for tool calling, purple for thinking, blue when it&#39;s the active model.</p>\n<p>Select a model and a details card appears: family, parameter size, quantization, context length, and capabilities. This metadata comes from two sources — Ollama&#39;s own API and Daneel&#39;s model registry, which enriches installed models with quality scores, descriptions, and hardware evaluations.</p>\n<p>Below your installed models, a recommendations section suggests popular models you haven&#39;t pulled yet, sorted by quality and filtered to lightweight options that are likely to run well on your hardware.</p>\n<h2>Pull, delete, manage</h2>\n<p>You don&#39;t need the terminal to manage models. The settings panel gives you full lifecycle control:</p>\n<p><strong>Pull</strong> — type any model name from the Ollama library (or click a suggested model) and hit Pull. A live progress bar streams download status in real time: bytes downloaded, total size, percentage. Large models download in the background while you keep browsing.</p>\n<p><strong>Delete</strong> — hover over any installed model and click the trash icon. The model is removed from Ollama&#39;s storage immediately.</p>\n<p><strong>Running models</strong> — a dedicated section shows which models are currently loaded in VRAM, with memory usage, quantization info, and an unload countdown timer. You can see exactly what&#39;s consuming your GPU right now.</p>\n<p><strong>Test query</strong> — before committing to a model, type a quick question in the test box. Tokens stream back in real time with a blinking cursor, confirming the model works and giving you a feel for its speed and quality.</p>\n<h2>Streaming conversations</h2>\n<p>Ollama serves responses as newline-delimited JSON — each line is a token. Daneel reads this stream and renders tokens as they arrive, giving you the same real-time typing experience you&#39;d expect from a cloud API.</p>\n<p>The streaming pipeline handles edge cases cleanly: malformed lines are skipped, the final completion chunk is detected and processed, and the UI stays responsive even with fast models generating hundreds of tokens per second.</p>\n<h2>Tool calling — MCP servers work with Ollama</h2>\n<p>This is where Ollama goes beyond basic chat. Models that support function calling — Qwen 3, Llama 3.1, Mistral, and others — can use MCP tools just like Claude does.</p>\n<p>Connect Stripe, Vercel, Supabase, or any MCP server, select a tool-capable Ollama model, and ask a question that needs external data. Daneel formats the tools in OpenAI-compatible function calling format, sends them to Ollama, parses the tool call response, executes the tools against the MCP servers, and feeds results back for the next turn.</p>\n<p>The multi-turn tool loop works identically to cloud providers. The only difference is that the LLM reasoning happens on your GPU instead of someone else&#39;s server.</p>\n<p>Capability badges in the model list make it clear which models support tools, so you know before you start a conversation.</p>\n<h2>Thinking models, handled</h2>\n<p>Reasoning models like Qwen 3 wrap their chain-of-thought in <code>&lt;think&gt;...&lt;/think&gt;</code> blocks. Useful for the model, noisy for you. Daneel strips these automatically — a stateful parser detects think tags across token boundaries during streaming and only surfaces the final answer.</p>\n<p>The stripping works for both explicit think blocks and the implicit reasoning format some models use. You get clean output regardless of model quirks.</p>\n<h2>Privacy by architecture</h2>\n<p>Ollama is the highest-privacy option after WebGPU. Your prompts and responses travel over localhost — they leave the browser process but never leave your machine. No API keys to manage, no usage to track, no data to audit.</p>\n<p>In Daneel&#39;s privacy model, Ollama gets &quot;Local network&quot; residency: data leaves the browser but stays on your hardware. The only observer is you. Model weights are open-source and auditable.</p>\n<p>For users who need inference power beyond what WebGPU can handle in a browser tab — larger models, longer context, faster generation — Ollama is the privacy-preserving step up.</p>\n<h2>Works with everything else</h2>\n<p>Ollama isn&#39;t a silo. It integrates with every Daneel feature:</p>\n<ul>\n<li><strong>Model Registry</strong> — installed models appear alongside WebGPU, Claude, and Azure models with unified scoring</li>\n<li><strong>Agents</strong> — attach an agent with a custom persona and MCP tools, powered by your local model</li>\n<li><strong>Vaults</strong> — chat with your documents using Ollama for inference</li>\n<li><strong>Page Q&amp;A and Site RAG</strong> — ask questions about any page or search indexed sites</li>\n</ul>\n<p>Switch between Ollama and any other provider with one click. Your conversations, agents, and vault configurations don&#39;t change.</p>\n<h2>What&#39;s next</h2>\n<p>We&#39;re working on deeper model management — pull progress in notifications, automatic model suggestions based on your hardware, and preset configurations for common use cases. Ollama&#39;s ecosystem is growing fast, and Daneel will keep pace.</p>\n<p>Your machine is more capable than you think. Connect Ollama and find out.</p>\n",
      "content_text": "\n## Local models, browser convenience\n\nRunning AI on your own hardware used to mean terminal commands, Python scripts, and a lot of configuration. Ollama made local inference approachable. Daneel makes it seamless.\n\nWith Ollama support, you can run models like Llama, Mistral, Qwen, Phi, and Granite entirely on your machine — and interact with them through the same browser interface you use for everything else. No API keys, no cloud, no usage fees. Just your GPU doing the work.\n\n## Connect in seconds\n\nOpen Settings, go to the Ollama tab, and you're looking at a connection panel with one field: the base URL. The default is `http://localhost:11434` — if Ollama is running, Daneel finds it automatically.\n\nThe auto-probe runs silently when you open settings. If Ollama is reachable, you'll see a green \"Connected\" status with your installed model count. If it's not running, the panel stays quiet — no error spam on first visit.\n\nIf you hit a 403 error, Daneel knows exactly what happened: Chrome extensions send an Origin header that Ollama blocks by default. Instead of a cryptic error, you get step-by-step instructions to restart Ollama with the right environment variable:\n\n```\nOLLAMA_ORIGINS=chrome-extension://* ollama serve\n```\n\nOne restart, problem solved permanently.\n\n## Your model library, in the browser\n\nOnce connected, the installed models section shows everything Ollama has downloaded. Each model appears with its name, parameter count, quantization level, and capability badges — green for tool calling, purple for thinking, blue when it's the active model.\n\nSelect a model and a details card appears: family, parameter size, quantization, context length, and capabilities. This metadata comes from two sources — Ollama's own API and Daneel's model registry, which enriches installed models with quality scores, descriptions, and hardware evaluations.\n\nBelow your installed models, a recommendations section suggests popular models you haven't pulled yet, sorted by quality and filtered to lightweight options that are likely to run well on your hardware.\n\n## Pull, delete, manage\n\nYou don't need the terminal to manage models. The settings panel gives you full lifecycle control:\n\n**Pull** — type any model name from the Ollama library (or click a suggested model) and hit Pull. A live progress bar streams download status in real time: bytes downloaded, total size, percentage. Large models download in the background while you keep browsing.\n\n**Delete** — hover over any installed model and click the trash icon. The model is removed from Ollama's storage immediately.\n\n**Running models** — a dedicated section shows which models are currently loaded in VRAM, with memory usage, quantization info, and an unload countdown timer. You can see exactly what's consuming your GPU right now.\n\n**Test query** — before committing to a model, type a quick question in the test box. Tokens stream back in real time with a blinking cursor, confirming the model works and giving you a feel for its speed and quality.\n\n## Streaming conversations\n\nOllama serves responses as newline-delimited JSON — each line is a token. Daneel reads this stream and renders tokens as they arrive, giving you the same real-time typing experience you'd expect from a cloud API.\n\nThe streaming pipeline handles edge cases cleanly: malformed lines are skipped, the final completion chunk is detected and processed, and the UI stays responsive even with fast models generating hundreds of tokens per second.\n\n## Tool calling — MCP servers work with Ollama\n\nThis is where Ollama goes beyond basic chat. Models that support function calling — Qwen 3, Llama 3.1, Mistral, and others — can use MCP tools just like Claude does.\n\nConnect Stripe, Vercel, Supabase, or any MCP server, select a tool-capable Ollama model, and ask a question that needs external data. Daneel formats the tools in OpenAI-compatible function calling format, sends them to Ollama, parses the tool call response, executes the tools against the MCP servers, and feeds results back for the next turn.\n\nThe multi-turn tool loop works identically to cloud providers. The only difference is that the LLM reasoning happens on your GPU instead of someone else's server.\n\nCapability badges in the model list make it clear which models support tools, so you know before you start a conversation.\n\n## Thinking models, handled\n\nReasoning models like Qwen 3 wrap their chain-of-thought in `<think>...</think>` blocks. Useful for the model, noisy for you. Daneel strips these automatically — a stateful parser detects think tags across token boundaries during streaming and only surfaces the final answer.\n\nThe stripping works for both explicit think blocks and the implicit reasoning format some models use. You get clean output regardless of model quirks.\n\n## Privacy by architecture\n\nOllama is the highest-privacy option after WebGPU. Your prompts and responses travel over localhost — they leave the browser process but never leave your machine. No API keys to manage, no usage to track, no data to audit.\n\nIn Daneel's privacy model, Ollama gets \"Local network\" residency: data leaves the browser but stays on your hardware. The only observer is you. Model weights are open-source and auditable.\n\nFor users who need inference power beyond what WebGPU can handle in a browser tab — larger models, longer context, faster generation — Ollama is the privacy-preserving step up.\n\n## Works with everything else\n\nOllama isn't a silo. It integrates with every Daneel feature:\n\n- **Model Registry** — installed models appear alongside WebGPU, Claude, and Azure models with unified scoring\n- **Agents** — attach an agent with a custom persona and MCP tools, powered by your local model\n- **Vaults** — chat with your documents using Ollama for inference\n- **Page Q&A and Site RAG** — ask questions about any page or search indexed sites\n\nSwitch between Ollama and any other provider with one click. Your conversations, agents, and vault configurations don't change.\n\n## What's next\n\nWe're working on deeper model management — pull progress in notifications, automatic model suggestions based on your hardware, and preset configurations for common use cases. Ollama's ecosystem is growing fast, and Daneel will keep pace.\n\nYour machine is more capable than you think. Connect Ollama and find out.\n",
      "date_published": "2026-01-15T00:00:00.000Z",
      "image": "https://daneel.injen.io/medias/ollama.png",
      "tags": [
        "feature",
        "ollama",
        "local",
        "privacy",
        "llm"
      ]
    },
    {
      "id": "https://daneel.injen.io/news/daneel-1-0-release.html",
      "url": "https://daneel.injen.io/news/daneel-1-0-release.html?utm_source=json&utm_medium=feed&utm_campaign=news_syndication",
      "title": "Daneel AI 1.0 is here",
      "summary": "The first stable release of Daneel AI — private, local-first AI for your browser. Chat with any page, search entire sites, and build your own document vault, all without leaving your data.",
      "content_html": "<h2>A new way to use AI in your browser</h2>\n<p>Today we are proud to announce the general availability of <strong>Daneel AI 1.0</strong>, a Chrome extension that brings AI directly into your browsing experience, with privacy as a first-class citizen.</p>\n<p>Daneel lets you <strong>ask questions about any web page</strong>, <strong>search entire websites semantically</strong>, and <strong>build a personal knowledge vault</strong> from your own documents, all powered by on-device inference that never sends your data to external servers.</p>\n<h2>What you can do with Daneel</h2>\n<ul>\n<li><strong>Page Q&amp;A</strong> —&gt; highlight a page, ask a question, get an answer grounded in the actual content</li>\n<li><strong>Site RAG</strong> —&gt; crawl and index an entire site via its sitemap, then search it with natural language</li>\n<li><strong>Vault</strong> —&gt; import your own documents (PDF, DOCX, Markdown, HTML, plain text) and chat with them</li>\n<li><strong>Multiple AI backends</strong> —&gt; run fully local with WebGPU, connect to Ollama, use Chrome&#39;s built-in Gemini Nano, or bring your own Claude API key</li>\n<li><strong>MCP tool use</strong> —&gt; connect remote MCP servers (Stripe, Vercel, Supabase and more) and let the AI call tools on your behalf</li>\n</ul>\n<h2>Privacy by design</h2>\n<p>Every inference mode in Daneel has a clear privacy profile. The default (WebGPU) runs entirely on your GPU with zero network calls after the initial model download. Your pages, your documents, your questions: they stay on your machine.</p>\n<h2>What comes next</h2>\n<p>This is just the beginning. We have a packed roadmap ahead: better models, more document formats, enterprise features, and deeper integrations. Stay tuned for updates right here.</p>\n<p>Thank you to everyone who tested early builds and shared feedback. Daneel 1.0 is yours.</p>\n",
      "content_text": "\n## A new way to use AI in your browser\n\nToday we are proud to announce the general availability of **Daneel AI 1.0**, a Chrome extension that brings AI directly into your browsing experience, with privacy as a first-class citizen.\n\nDaneel lets you **ask questions about any web page**, **search entire websites semantically**, and **build a personal knowledge vault** from your own documents, all powered by on-device inference that never sends your data to external servers.\n\n## What you can do with Daneel\n\n- **Page Q&A** —> highlight a page, ask a question, get an answer grounded in the actual content\n- **Site RAG** —> crawl and index an entire site via its sitemap, then search it with natural language\n- **Vault** —> import your own documents (PDF, DOCX, Markdown, HTML, plain text) and chat with them\n- **Multiple AI backends** —> run fully local with WebGPU, connect to Ollama, use Chrome's built-in Gemini Nano, or bring your own Claude API key\n- **MCP tool use** —> connect remote MCP servers (Stripe, Vercel, Supabase and more) and let the AI call tools on your behalf\n\n## Privacy by design\n\nEvery inference mode in Daneel has a clear privacy profile. The default (WebGPU) runs entirely on your GPU with zero network calls after the initial model download. Your pages, your documents, your questions: they stay on your machine.\n\n## What comes next\n\nThis is just the beginning. We have a packed roadmap ahead: better models, more document formats, enterprise features, and deeper integrations. Stay tuned for updates right here.\n\nThank you to everyone who tested early builds and shared feedback. Daneel 1.0 is yours.\n",
      "date_published": "2026-01-01T00:00:00.000Z",
      "image": "https://daneel.injen.io/medias/daneel.launch.robot.jpg",
      "tags": [
        "release",
        "milestone"
      ]
    }
  ]
}