<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jean-Christophe Viau</title>
    <description>The latest articles on DEV Community by Jean-Christophe Viau (@jcviau).</description>
    <link>https://dev.to/jcviau</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3787409%2Fd90e0c14-3157-48a3-91b2-2f8b51eda52f.png</url>
      <title>DEV Community: Jean-Christophe Viau</title>
      <link>https://dev.to/jcviau</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jcviau"/>
    <language>en</language>
    <item>
      <title>Voxyflow: The AI Project Manager That Actually Executes</title>
      <dc:creator>Jean-Christophe Viau</dc:creator>
      <pubDate>Wed, 25 Mar 2026 08:34:54 +0000</pubDate>
      <link>https://dev.to/jcviau/voxyflow-the-ai-project-manager-that-actually-executes-59ip</link>
      <guid>https://dev.to/jcviau/voxyflow-the-ai-project-manager-that-actually-executes-59ip</guid>
      <description>&lt;p&gt;I keep seeing the same workflow in AI-assisted dev:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open your task manager (Linear, Jira, Notion, whatever)&lt;/li&gt;
&lt;li&gt;Read the card&lt;/li&gt;
&lt;li&gt;Switch to your AI coding tool (Cursor, Copilot, Claude)&lt;/li&gt;
&lt;li&gt;Re-explain the entire context&lt;/li&gt;
&lt;li&gt;Execute&lt;/li&gt;
&lt;li&gt;Switch back to update the card&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It's fragmented. The AI never has the full picture. And you're the one doing the cognitive work of bridging two tools that should be one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Voxyflow&lt;/strong&gt; is my attempt to fix this.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Voxyflow?
&lt;/h2&gt;

&lt;p&gt;Voxyflow is an AI project manager that actually executes tasks — not just tracks them.&lt;/p&gt;

&lt;p&gt;It's a Kanban board with an execution engine built in. You create cards, add context (description, checklist, linked files, notes), and when you're ready — you hit &lt;strong&gt;Execute Card&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The agent reads everything: the card title, description, checklist items, attached files, project context. Then it works. You don't re-explain anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Execute Card flow
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Card: "Add dark mode to settings page"]
  Description: User wants to toggle dark mode in /settings
  Checklist:
    - Add toggle component to SettingsPage.tsx
    - Persist preference in localStorage
    - Apply theme class to &amp;lt;body&amp;gt;
  Linked files: src/pages/SettingsPage.tsx, src/theme.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hit Execute. The agent reads all of this, opens the files, makes the changes, runs tests if configured. Done.&lt;/p&gt;

&lt;p&gt;No copy-pasting. No "here's the context" preamble. The card &lt;strong&gt;is&lt;/strong&gt; the context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Non-blocking architecture
&lt;/h2&gt;

&lt;p&gt;Here's what I wanted from day one: &lt;strong&gt;you can keep working while the agent works&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Most AI coding tools are synchronous — you wait. Voxyflow uses a non-blocking worker model. You kick off a card execution, and you can immediately:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chat with the project assistant&lt;/li&gt;
&lt;li&gt;Review another card&lt;/li&gt;
&lt;li&gt;Create new tasks&lt;/li&gt;
&lt;li&gt;Start a second execution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Workers run in the background. You get notified when they're done.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not just use Linear + Cursor?
&lt;/h2&gt;

&lt;p&gt;You can. But:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Linear doesn't know about your code&lt;/li&gt;
&lt;li&gt;Cursor doesn't know about your roadmap&lt;/li&gt;
&lt;li&gt;You're the translation layer between them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Voxyflow puts both in the same app, on your machine, with full context available to the AI at all times. No subscription. No data leaving your machine unless you want it to.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Linear + Cursor in one app, on your machine, no subscription."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Who is this for?
&lt;/h2&gt;

&lt;p&gt;Solo developers and small teams who want an AI that &lt;strong&gt;does the work&lt;/strong&gt;, not just answers questions.&lt;/p&gt;

&lt;p&gt;If you're managing a project solo and using AI heavily, Voxyflow might be exactly what you've been waiting for.&lt;/p&gt;

&lt;h2&gt;
  
  
  Status &amp;amp; roadmap
&lt;/h2&gt;

&lt;p&gt;Voxyflow is in active development. The core Kanban + Execute flow is working. Coming next:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Git integration (auto-commit executed changes)&lt;/li&gt;
&lt;li&gt;Multi-agent parallel execution&lt;/li&gt;
&lt;li&gt;Mobile companion for reviewing tasks on the go&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;👉 Check it out and leave a star: &lt;a href="https://github.com/jcviau81/voxyflow" rel="noopener noreferrer"&gt;github.com/jcviau81/voxyflow&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Feedback welcome — open an issue or drop a comment below.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>opensource</category>
      <category>devtools</category>
    </item>
    <item>
      <title>OpenFeeder: Make Your Website LLM-Native</title>
      <dc:creator>Jean-Christophe Viau</dc:creator>
      <pubDate>Wed, 25 Mar 2026 08:34:53 +0000</pubDate>
      <link>https://dev.to/jcviau/openfeeder-make-your-website-llm-native-2fpf</link>
      <guid>https://dev.to/jcviau/openfeeder-make-your-website-llm-native-2fpf</guid>
      <description>&lt;p&gt;LLMs are browsing the web. Are your pages ready for them?&lt;/p&gt;

&lt;p&gt;Right now, AI agents, RAG pipelines, and LLM-powered search tools are scraping your website. They're parsing raw HTML, guessing what's content vs navigation, stripping CSS, losing structured data — and getting a degraded, noisy version of what you actually built.&lt;/p&gt;

&lt;p&gt;There's a better way. It's called &lt;strong&gt;OpenFeeder&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is OpenFeeder?
&lt;/h2&gt;

&lt;p&gt;OpenFeeder is an open standard that lets websites expose their content natively to LLMs — structured, clean, real-time, and server-side. No scraping. No guessing. Just your content, exactly as you want it served.&lt;/p&gt;

&lt;p&gt;Two endpoints. That's it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://yoursite.com/.well-known/openfeeder.json  ← discovery (metadata, capabilities)
https://yoursite.com/openfeeder                   ← content feed (articles, pages, products)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An LLM agent hits the discovery endpoint, learns what your site offers and how to query it, then pulls structured content from the feed. Clean JSON. Proper types. No HTML soup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why does this matter?
&lt;/h2&gt;

&lt;p&gt;Think about &lt;code&gt;robots.txt&lt;/code&gt; — a simple convention that let search crawlers know where to go. OpenFeeder is the same idea, but for LLMs. Instead of letting bots scrape randomly and misunderstand your content, you give them a first-class interface.&lt;/p&gt;

&lt;p&gt;Benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Accurate content&lt;/strong&gt; — LLMs get the real text, not nav menus and cookie banners&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured metadata&lt;/strong&gt; — titles, dates, authors, categories, tags — all there&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time&lt;/strong&gt; — always fresh, not cached by some third-party scraper&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You control it&lt;/strong&gt; — choose what to expose, at what depth&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Drop-in adapters for your stack
&lt;/h2&gt;

&lt;p&gt;OpenFeeder ships with ready-made adapters for the most common platforms and frameworks, all with 21+ tests each:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;WordPress&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Drupal&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Joomla&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Next.js&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vite&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Express&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FastAPI&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Astro&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WooCommerce&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Quick example (Express adapter)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;openfeederExpress&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@openfeeder/express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;openfeederExpress&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;site&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;My Dev Blog&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Articles about web development&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://myblog.dev&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// return your posts/pages as structured objects&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getPosts&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Your site now has &lt;code&gt;/.well-known/openfeeder.json&lt;/code&gt; and &lt;code&gt;/openfeeder&lt;/code&gt; — ready for any LLM agent that speaks the protocol.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bigger picture
&lt;/h2&gt;

&lt;p&gt;We're heading toward a web where AI agents are first-class visitors. They browse, they read, they summarize, they take action. If your site isn't LLM-native, you're invisible to this wave.&lt;/p&gt;

&lt;p&gt;OpenFeeder is the standard that makes it happen. Open-source. Framework-agnostic. Dead simple to adopt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;👉 Star the repo and add OpenFeeder to your stack: &lt;a href="https://github.com/jcviau81/openfeeder" rel="noopener noreferrer"&gt;github.com/jcviau81/openfeeder&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PRs welcome. Adapters for more platforms coming soon.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>llm</category>
    </item>
    <item>
      <title>LLM Crawlers Are Wasting 95% of Every Web Request. Here's the Fix.</title>
      <dc:creator>Jean-Christophe Viau</dc:creator>
      <pubDate>Mon, 23 Feb 2026 19:15:41 +0000</pubDate>
      <link>https://dev.to/jcviau/openfeeder-the-seo-of-the-ai-era-3733</link>
      <guid>https://dev.to/jcviau/openfeeder-the-seo-of-the-ai-era-3733</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Updated Feb 23, 2026&lt;/strong&gt; — We measured actual LLM crawler behavior on real sites. Numbers updated throughout.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;We measured what LLM crawlers actually receive when they fetch a webpage. The numbers are embarrassing.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Site&lt;/th&gt;
&lt;th&gt;HTML received by LLM bots&lt;/th&gt;
&lt;th&gt;Actual text content&lt;/th&gt;
&lt;th&gt;Overhead&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;BBC News&lt;/td&gt;
&lt;td&gt;309 KB&lt;/td&gt;
&lt;td&gt;~10 KB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;30x&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ars Technica&lt;/td&gt;
&lt;td&gt;397 KB&lt;/td&gt;
&lt;td&gt;~10 KB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;39x&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Le Monde&lt;/td&gt;
&lt;td&gt;525 KB&lt;/td&gt;
&lt;td&gt;~32 KB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;17x&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hacker News&lt;/td&gt;
&lt;td&gt;34 KB&lt;/td&gt;
&lt;td&gt;~4 KB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8x&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CNN&lt;/td&gt;
&lt;td&gt;blocked (451)&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;blocked&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WordPress (default theme)&lt;/td&gt;
&lt;td&gt;81 KB&lt;/td&gt;
&lt;td&gt;~3.5 KB via OpenFeeder&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;22x&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Measured Feb 23, 2026 using actual LLM bot User-Agents: GPTBot, ClaudeBot, PerplexityBot.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;These aren't estimates. We sent requests using the real User-Agents that GPT, Claude, and Perplexity use in production. This is exactly what they receive, every time they crawl a page.&lt;/p&gt;

&lt;p&gt;And "actual text content" is generous. That number still includes aria-labels, data attributes, alt text on decorative images, and other noise. The article itself — the thing the LLM actually needs — is even smaller. For most content sites, you're looking at a &lt;strong&gt;20–40x overhead ratio&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Web Was Not Designed for This
&lt;/h2&gt;

&lt;p&gt;Here's how LLM web crawlers work in 2026, more or less:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fetch the full HTML page (300–500 KB of soup)&lt;/li&gt;
&lt;li&gt;Strip the tags (not straightforward — nav? sidebar? footer? ads? all mixed in)&lt;/li&gt;
&lt;li&gt;Try to identify the "main content" (good luck)&lt;/li&gt;
&lt;li&gt;Hope what's left is coherent enough to be useful&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is exactly how you'd build a web crawler in 1999. The tools have gotten better — Firecrawl, Jina, CommonCrawl, headless Chromium — but the fundamental problem hasn't changed: you're fetching a document built for human eyeballs and trying to extract machine-readable meaning from it after the fact.&lt;/p&gt;

&lt;p&gt;It works well enough. But "well enough" is doing a lot of work there.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Math at Scale Is Ugly
&lt;/h2&gt;

&lt;p&gt;Let's be conservative:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GPT, Claude, Perplexity each crawl &lt;strong&gt;millions of pages per day&lt;/strong&gt;. CommonCrawl does &lt;strong&gt;3–5 billion pages per month&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Average HTML page served to LLM bots: &lt;strong&gt;~100 KB&lt;/strong&gt; (we measured 34–525 KB, 100 KB is conservative)&lt;/li&gt;
&lt;li&gt;Average useful content: &lt;strong&gt;~4 KB&lt;/strong&gt; (generous)&lt;/li&gt;
&lt;li&gt;Average overhead: &lt;strong&gt;~25x&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If average content is 4 KB and average overhead is 25x, that's &lt;strong&gt;96 KB wasted per page&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;At 100 million crawl requests per day across the major AI systems:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;100M pages/day × 96 KB wasted = ~9.6 TB/day
                                 = ~3.5 PB/year
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's petabytes of HTML tags, cookie banners, nav bars, and JavaScript that gets fetched, transferred, decoded, and immediately discarded. Every day.&lt;/p&gt;

&lt;p&gt;And that's &lt;em&gt;just bandwidth&lt;/em&gt;. Add parsing time, tokenization, context window pressure, and inference costs — and the real cost is much higher. Every token an LLM spends processing a nav bar is a token it can't spend understanding your actual content.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Server-Side Problem
&lt;/h2&gt;

&lt;p&gt;Here's something the scraper approach gets fundamentally wrong: &lt;strong&gt;it works on the wrong side of the rendering pipeline&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Modern web stacks are messy. React SPAs, Next.js with hydration, Vue components, server-side templates, WordPress with a dozen plugins — the HTML the browser sees is the result of a long chain of rendering decisions that were never meant to be machine-parsed.&lt;/p&gt;

&lt;p&gt;Scrapers deal with this by fetching the rendered output and trying to reverse-engineer what the original data was. The universal sidecar approach (run a headless browser, extract structured data from JSON-LD tags in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;) is clever, but it's still fundamentally reactive — working with whatever the server decided to output, not the source data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenFeeder goes to the source.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A WordPress adapter doesn't fetch the rendered HTML — it talks to &lt;code&gt;WP_Query&lt;/code&gt; directly. Your React frontend? Doesn't exist from OpenFeeder's perspective. A 200KB JavaScript bundle that takes 3 seconds to hydrate? Irrelevant. The data is in the database, and that's where OpenFeeder reads it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;❌ Scraper approach:
  LLM → HTTP → rendered HTML (300KB soup) → strip noise → maybe useful content

✅ OpenFeeder approach:
  LLM → HTTP → OpenFeeder endpoint → structured JSON (1–3KB) → direct content
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This also means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Real-time data&lt;/strong&gt; — no crawl lag, no stale cache&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero noise&lt;/strong&gt; — you define exactly what gets exposed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No CAPTCHAs, no anti-bot walls&lt;/strong&gt; — you're serving a legitimate endpoint, not fighting the scraper detection&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You control what AI sees&lt;/strong&gt; — not "whatever the HTML contains"&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Protocol
&lt;/h2&gt;

&lt;p&gt;OpenFeeder is built on two endpoints:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Discovery — always public, always at this path&lt;/span&gt;
GET /.well-known/openfeeder.json

&lt;span class="c"&gt;# Content — paginated index, search, or specific URL&lt;/span&gt;
GET /openfeeder
GET /openfeeder?q&lt;span class="o"&gt;=&lt;/span&gt;your+query
GET /openfeeder?url&lt;span class="o"&gt;=&lt;/span&gt;/path/to/article
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Responses are clean JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"openfeeder/1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/article/my-post"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"My Post Title"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"author"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Jane Doe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"published"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-02-21T20:00:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"summary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"A short, LLM-friendly summary."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"chunks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"c1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Most relevant paragraph..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"paragraph"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"relevance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.94&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"c2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Another relevant passage..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"paragraph"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"relevance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.87&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"meta"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"total_chunks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"returned_chunks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"cached"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No ads. No nav. No cookie banners. No 300KB of JavaScript. Just the content, structured for machines.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It Right Now
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;SketchyNews&lt;/strong&gt; is the first OpenFeeder-compatible site in the wild. It's an Astro-powered AI comic news site. Try it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# What does this site expose to LLMs?&lt;/span&gt;
curl https://sketchynews.snaf.foo/.well-known/openfeeder.json

&lt;span class="c"&gt;# Get all content, paginated&lt;/span&gt;
curl https://sketchynews.snaf.foo/openfeeder

&lt;span class="c"&gt;# Search for something specific&lt;/span&gt;
curl &lt;span class="s2"&gt;"https://sketchynews.snaf.foo/openfeeder?q=ukraine"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The difference vs raw HTML:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Raw HTML:    19,535 bytes  ← DOM, scripts, nav, ads, footer, cookie banner...
OpenFeeder:   1,085 bytes  ← clean JSON, exactly the content
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;18x smaller on SketchyNews alone.&lt;/strong&gt; On BBC News, we measured 30x. On Ars Technica, 39x.&lt;/p&gt;




&lt;h2&gt;
  
  
  Add OpenFeeder to Your Site in Minutes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  WordPress (43% of the web)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wget https://sketchynews.snaf.foo/openfeeder-wordpress-v1.0.0.zip
&lt;span class="c"&gt;# Upload &amp;amp; activate via wp-admin &amp;gt; Plugins &amp;gt; Upload Plugin&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both endpoints go live immediately. Only published posts, no PII, configurable excluded paths.&lt;/p&gt;

&lt;h3&gt;
  
  
  Express / Node.js
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;openfeeder&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@openfeeder/express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;openfeeder&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;siteName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;My Site&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;siteUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://mysite.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;getContent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getArticle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Any Site (Docker Sidecar)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;openfeeder&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;openfeeder/sidecar&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;SITE_URL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://yoursite.com&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8080:8080"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Route &lt;code&gt;/openfeeder&lt;/code&gt; and &lt;code&gt;/.well-known/openfeeder.json&lt;/code&gt; to port 8080. Works on any platform.&lt;/p&gt;

&lt;h3&gt;
  
  
  Drupal / Joomla
&lt;/h3&gt;

&lt;p&gt;Native adapters ready. See &lt;a href="https://github.com/jcviau81/openfeeder/tree/main/adapters/drupal" rel="noopener noreferrer"&gt;&lt;code&gt;adapters/drupal/&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://github.com/jcviau81/openfeeder/tree/main/adapters/joomla" rel="noopener noreferrer"&gt;&lt;code&gt;adapters/joomla/&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  This Should Have Existed Years Ago
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;robots.txt&lt;/code&gt; told crawlers what &lt;em&gt;not&lt;/em&gt; to fetch. OpenFeeder tells them what &lt;em&gt;to&lt;/em&gt; fetch, and how. It's &lt;code&gt;robots.txt&lt;/code&gt; for the AI era — but instead of blocking, it welcomes.&lt;/p&gt;

&lt;p&gt;WordPress, Drupal, and Joomla cover the vast majority of the CMS web. The spec is simple enough to implement in any framework in an afternoon. The payoff — for LLM operators, for site owners, for the environment — is immediate and measurable.&lt;/p&gt;

&lt;p&gt;We built this because we live the problem. Every web fetch is a 300KB guessing game. OpenFeeder is what the web should serve AI by default.&lt;/p&gt;




&lt;h2&gt;
  
  
  Get Involved
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;⭐ Star the repo&lt;/strong&gt;: &lt;a href="https://github.com/jcviau81/openfeeder" rel="noopener noreferrer"&gt;github.com/jcviau81/openfeeder&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Try it&lt;/strong&gt;: Add the WordPress plugin or sidecar to your site&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contribute&lt;/strong&gt;: Django, Rails, Ghost adapters welcome — the spec is simple, the impact is real&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spread it&lt;/strong&gt;: If you run a site, publish a newsletter, or work on an LLM product — this matters&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The more sites adopt OpenFeeder, the better LLMs get at reading the web. It's a flywheel. We're at the beginning of it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;OpenFeeder is MIT licensed. Built by Ember 🔥 &amp;amp; JC.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>llm</category>
      <category>ai</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
