<?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: 이재상 (OpenMake)</title>
    <description>The latest articles on DEV Community by 이재상 (OpenMake) (@openmake).</description>
    <link>https://dev.to/openmake</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4068845%2Fed415c7b-fe05-4ab4-9f48-401be96d96d7.jpg</url>
      <title>DEV Community: 이재상 (OpenMake)</title>
      <link>https://dev.to/openmake</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/openmake"/>
    <language>en</language>
    <item>
      <title>Seven months of self-hosting our own AI stack: four bugs I can point at in the changelog</title>
      <dc:creator>이재상 (OpenMake)</dc:creator>
      <pubDate>Sat, 05 Sep 2026 15:55:19 +0000</pubDate>
      <link>https://dev.to/openmake/i-thought-self-hosting-our-ai-would-take-a-weekend-it-took-seven-months-3ob7</link>
      <guid>https://dev.to/openmake/i-thought-self-hosting-our-ai-would-take-a-weekend-it-took-seven-months-3ob7</guid>
      <description>&lt;p&gt;We run our team's AI stack on our own hardware. The weekly development log starts the week of January 19, 2026, the repository was created on February 3, and today it sits at roughly 2,100 commits under MIT.&lt;/p&gt;

&lt;p&gt;I want to write about four things that broke, because every one of them is in the public changelog and you can check my work. No war stories I can't back up.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;A Mac mini runs the application: API and web under PM2, with PostgreSQL, Redis, and the sandboxed agent, MCP, and artifact processes in Docker. An NVIDIA DGX Spark GB10 next to it runs vLLM, plus BGE-m3 for embeddings and FLUX for image generation. The two are connected over a private Tailscale link.&lt;/p&gt;

&lt;p&gt;That is our setup, not a requirement. Any OpenAI-compatible endpoint works.&lt;/p&gt;

&lt;p&gt;The default local model is &lt;code&gt;qwen3.8-27b&lt;/code&gt; served through vLLM behind a LiteLLM proxy, with a 262K context window. External providers (OpenRouter, NVIDIA NIM, Ollama) only enter the picture if you register your own key, encrypted at rest with AES-256-GCM. Register nothing and every model call stays local.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bug 1: the application limit was not the real limit
&lt;/h2&gt;

&lt;p&gt;We accept large files as inputs to agent tasks. The application will happily allow a file well past 100 MB. That turns out not to matter.&lt;/p&gt;

&lt;p&gt;Cloudflare documents a 100 MB maximum upload size for Free and Pro zones, so a single multipart request was rejected &lt;strong&gt;at the edge with HTTP 413&lt;/strong&gt; before it ever reached the API. No validation of ours ran. No useful progress was shown.&lt;/p&gt;

&lt;p&gt;The fast workaround would have been an unproxied upload host. We kept the protected public route and changed the request shape instead: a four-step chunked protocol with a one-time claim, authentication on every operation, chunk writes that are safe to retry, and reuse of the existing &lt;code&gt;storedPath&lt;/code&gt; contract after assembly so extraction and cleanup don't fork.&lt;/p&gt;

&lt;p&gt;The lesson is not subtle, but it cost us anyway: &lt;strong&gt;your app's configured limit is a claim about your app, not about the path a request actually takes.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Bug 2: a single static line pinned us to a model that no longer existed
&lt;/h2&gt;

&lt;p&gt;On September 2 the DGX swapped models. The app stayed bound to the old &lt;code&gt;qwen3.6-35b-a3b&lt;/code&gt; name, because &lt;strong&gt;one static catalog line was the only source of the model list.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Boot and periodic probes now read LiteLLM's &lt;code&gt;/model/info&lt;/code&gt; to discover local models. The static list survives only as a fallback. Default is &lt;code&gt;qwen3.8-27b&lt;/code&gt; (1.38.0).&lt;/p&gt;

&lt;p&gt;If you run a gateway, ask yourself where your model list actually comes from. Ours came from a constant, and constants do not notice when the GPU host changes its mind.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bug 3: fan-out met real rate limits
&lt;/h2&gt;

&lt;p&gt;Running Discussion and Deep Research against external models hit per-minute limits on free and developer keys. The measured result: &lt;strong&gt;five parallel expert calls came back 5/5 with 429 on a B.AI free key, and 3/5 on a hasa key.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The fixes, all in 1.40.0:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The external execution client is wrapped in a per-provider semaphore with exponential 429 backoff that honors &lt;code&gt;Retry-After&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Deep Research fan-out concurrency and timeouts follow the provider hint.&lt;/li&gt;
&lt;li&gt;The SDK's own blind retries were set to zero, with a multiplier on its timeout, so a long-reasoning model is no longer cut off every 360 seconds.&lt;/li&gt;
&lt;li&gt;An explicitly chosen external model that cannot run now surfaces an error instead of silently falling back to local.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last one matters more than it looks. Silently substituting a different model is the kind of helpfulness that destroys trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bug 4: overflow, handled rather than hidden
&lt;/h2&gt;

&lt;p&gt;We run a 262K context window and still hit it.&lt;/p&gt;

&lt;p&gt;On entry, prompt tokens are estimated, images included. If the window is exceeded, input is truncated, then &lt;code&gt;max_tokens&lt;/code&gt; is reduced, and in the extreme a &lt;code&gt;ContextOverflowError&lt;/code&gt; returns &lt;strong&gt;HTTP 413 with an audit record and an automatic webhook alert&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Related, and from the same release: per-request prompt image totals are now capped at vLLM's own &lt;code&gt;--limit-mm-per-prompt&lt;/code&gt; limit of 8. We were enforcing that in one place and not the other.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9wyht2y4ilsa3r40vibg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9wyht2y4ilsa3r40vibg.png" alt="Agent task runs, each showing turns, elapsed time and token cost" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The security review I would rather not publish
&lt;/h2&gt;

&lt;p&gt;On September 2 we ran a security review of &lt;code&gt;apps/api&lt;/code&gt;. The first batch of findings, closed in 1.39.0:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;System skills could be overwritten by any authenticated user. That is stored prompt injection into every user's prompt.&lt;/li&gt;
&lt;li&gt;Anyone could assign their own skill to a shared industry agent.&lt;/li&gt;
&lt;li&gt;A push subscription could be registered under another user's id, receiving copies of that user's notifications.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pinning the owner to &lt;code&gt;req.user&lt;/code&gt; fixed all three. It also fixed the fact that web push had never actually been delivered at all.&lt;/p&gt;

&lt;p&gt;The batch further covered an IDOR on internal bundle installation, enforcement of the high-risk MCP tool role gate on the execution path, CSV formula injection in exports, an existence oracle on other users' MCP server status, ownership checks that passed on empty values, and an advisory lock around first-run administrator setup.&lt;/p&gt;

&lt;p&gt;I am publishing this because a changelog that only contains features is not a changelog.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is actually in the box
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agent tasks.&lt;/strong&gt; Multi-turn runs in a persistent Docker sandbox with shell, Python, browser, and files, behind human approval. Each run reports turns, elapsed time, and token cost. When a goal is not met, it emits a &lt;code&gt;[GOAL_INCOMPLETE]&lt;/code&gt; marker and a goal judge instead of marking itself done.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deep research.&lt;/strong&gt; Fan-out search, source fetch, claim verification, cited synthesis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discussion mode.&lt;/strong&gt; MoA-style: picks specialists, gives them the same evidence, runs them in parallel, synthesizes. Off by default and switched on per message.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-role model routing.&lt;/strong&gt; &lt;code&gt;agent&lt;/code&gt;, &lt;code&gt;judge&lt;/code&gt;, &lt;code&gt;research&lt;/code&gt;, &lt;code&gt;spawn&lt;/code&gt;, &lt;code&gt;review&lt;/code&gt;, &lt;code&gt;summary&lt;/code&gt; each resolve their own model, per-user or admin-global, failing open to the local default.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;22 built-in MCP tools&lt;/strong&gt; plus external servers, each isolated in Docker with &lt;code&gt;--cap-drop ALL&lt;/code&gt;, non-root, memory caps, a network policy, and realpath-guarded mounts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fheuijm6jbf4uq4tlf88q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fheuijm6jbf4uq4tlf88q.png" alt="Model roles: each functional role resolves its own model" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits, stated plainly
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The desktop app is macOS on Apple Silicon only. The web UI runs anywhere.&lt;/li&gt;
&lt;li&gt;No Kubernetes story, and none planned. Single host by design.&lt;/li&gt;
&lt;li&gt;Guests on the hosted demo get the default local model only.&lt;/li&gt;
&lt;li&gt;Self-hosting needs Node 24, PostgreSQL, and Docker. Setup time is mostly however long your model endpoint takes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  It's public
&lt;/h2&gt;

&lt;p&gt;Source is MIT, so you can read it before you run it. The weekly development log is on the site, including the weeks that went badly. One week is missing from the archive entirely: W18 had zero commits, and an empty week is left out rather than written up.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/openmake/openmake_llm" rel="noopener noreferrer"&gt;https://github.com/openmake/openmake_llm&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Live demo: &lt;a href="https://chat.openmake.cc" rel="noopener noreferrer"&gt;https://chat.openmake.cc&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Self-host guide: &lt;a href="https://openmake.cc/en/docs/" rel="noopener noreferrer"&gt;https://openmake.cc/en/docs/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev logs: &lt;a href="https://openmake.cc/en/blog/" rel="noopener noreferrer"&gt;https://openmake.cc/en/blog/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you run your own stack, I would like to hear which layer lied to you first.&lt;/p&gt;

</description>
      <category>llm</category>
    </item>
    <item>
      <title>I'm Not a Software Engineer. I Built a Self-Hosted AI Workspace Anyway.</title>
      <dc:creator>이재상 (OpenMake)</dc:creator>
      <pubDate>Sat, 08 Aug 2026 13:12:49 +0000</pubDate>
      <link>https://dev.to/openmake/im-not-a-software-engineer-i-built-a-self-hosted-ai-workspace-anyway-4042</link>
      <guid>https://dev.to/openmake/im-not-a-software-engineer-i-built-a-self-hosted-ai-workspace-anyway-4042</guid>
      <description>&lt;p&gt;I’m riskpw, a maker rather than a professional software engineer.&lt;/p&gt;

&lt;p&gt;My background is in open-source hardware communities. I started RaspberryPi Village in 2013 and helped form the OpenMake community team in 2016. OpenMake Team is not a company. It is a community of people who enjoy open source, open hardware, and running what they build on equipment they own.&lt;/p&gt;

&lt;p&gt;On February 3, 2026, I made the first commit to openmake_llm.&lt;/p&gt;

&lt;p&gt;The starting point was simple: I wanted an AI workspace that could run on hardware I already owned, where I could decide which models to use and where the application, data, and inference boundaries should live.&lt;/p&gt;

&lt;p&gt;I lead the project through AI-assisted, “vibe coding,” with professional developer rocky supporting development and technical review.&lt;/p&gt;

&lt;p&gt;That description can sound like AI wrote the code and the product simply appeared. The reality was almost the opposite.&lt;/p&gt;

&lt;p&gt;AI helped us produce code quickly. It also helped us accumulate wrong assumptions quickly. The important work was running the system on actual hardware, finding where those assumptions failed, and deleting or rebuilding what did not work.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyw7aqcgx1oiv5ney04o1.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyw7aqcgx1oiv5ney04o1.webp" alt="A Mac mini running the OpenMake control plane and a DGX Spark serving local inference" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The current operating topology: OpenMake and LiteLLM on a Mac mini, connected over a private network to vLLM on an NVIDIA DGX Spark.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  We removed features we had already finished
&lt;/h2&gt;

&lt;p&gt;Early versions included a marketplace and a canvas. They were implemented, visible, and working.&lt;/p&gt;

&lt;p&gt;When we reviewed the product direction, we concluded that they were distracting us from the core workflow. We removed them.&lt;/p&gt;

&lt;p&gt;That changed one of the project’s basic questions.&lt;/p&gt;

&lt;p&gt;Instead of asking, “Did we already build this?” we started asking, “Does this belong in the workflow people are actually trying to complete?”&lt;/p&gt;

&lt;p&gt;The faster AI can produce code, the more important it becomes to delete code that should not exist.&lt;/p&gt;

&lt;h2&gt;
  
  
  Replacing the inference backend took a day. Paying the migration bill took thirteen.
&lt;/h2&gt;

&lt;p&gt;The project originally grew around Ollama-specific APIs. That was useful at the beginning, but it did not fit the system we were operating across a Mac mini and a DGX Spark.&lt;/p&gt;

&lt;p&gt;We moved to an OpenAI-compatible path centered on vLLM and LiteLLM. More than 100 call sites moved, and roughly 4,500 lines of Ollama-specific code were deleted.&lt;/p&gt;

&lt;p&gt;The obvious migration finished quickly. The hidden assumptions did not.&lt;/p&gt;

&lt;p&gt;Old provider names were still embedded in database constraints, model IDs, environment variables, and UI labels. Replacing an inference client was easier than making the entire system agree that the architecture had changed.&lt;/p&gt;

&lt;p&gt;That experience forced us to clarify ownership:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where is a model selected?&lt;/li&gt;
&lt;li&gt;Who decides when a fallback is allowed?&lt;/li&gt;
&lt;li&gt;Does the model name shown to the user match the endpoint actually called?&lt;/li&gt;
&lt;li&gt;Which layer owns routing policy, and which layer only executes it?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those boundaries became more important than adding another feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tests passed. In production, the sandbox did nothing.
&lt;/h2&gt;

&lt;p&gt;We once added bubblewrap isolation for external MCP servers.&lt;/p&gt;

&lt;p&gt;The implementation looked correct, and the tests passed. Then we inspected the actual production host: macOS. Bubblewrap is Linux-only. In that environment, the isolation boundary did nothing.&lt;/p&gt;

&lt;p&gt;The next day, we removed it and rebuilt the boundary around Docker, using non-root containers, dropped capabilities, memory limits, and network policies.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Passing tests can prove that an implementation exists. They do not prove that it achieves its purpose in the environment where it runs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That failure changed how we validate OpenMake. Claims are checked on the hardware and deployment path we actually operate. When an assumption is wrong, we document the failure instead of rewriting it as a success story.&lt;/p&gt;

&lt;h2&gt;
  
  
  What OpenMake looks like now
&lt;/h2&gt;

&lt;p&gt;Today, the Mac mini runs the OpenMake application, orchestration layer, and LiteLLM gateway. A private Tailscale connection reaches vLLM on the DGX Spark. External MCP processes and autonomous agent tasks run in Docker sandboxes.&lt;/p&gt;

&lt;p&gt;Normal chat resolves one model and uses the regular chat and tool loop. Discussion mode is optional. When a question genuinely benefits from multiple perspectives, it can run bounded parallel opinions, cross-review, evidence reuse, and synthesis.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4lpg7mtemj2b8r00iayt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4lpg7mtemj2b8r00iayt.png" alt="The real OpenMake chat workspace" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The current chat workspace with model selection, tools, and thinking controls.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;OpenMake also includes autonomous agent tasks, MCP tools, deep research, artifacts, Discord integration, and NotebookLM grounding.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkoi374xjisgrcpfjmymk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkoi374xjisgrcpfjmymk.png" alt="The OpenMake autonomous agent task screen" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Agent work is recorded with progress, turns, runtime, token use, and both successful and failed outcomes.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  This is not a chatbot for everyone
&lt;/h2&gt;

&lt;p&gt;I do not want to describe OpenMake as a frictionless one-click chatbot.&lt;/p&gt;

&lt;p&gt;Self-hosting currently expects Node.js 24, Docker, PostgreSQL, and an OpenAI-compatible model endpoint. It is a better fit for people already experimenting with vLLM, LiteLLM, Ollama, or home-lab AI infrastructure.&lt;/p&gt;

&lt;p&gt;There will still be rough edges.&lt;/p&gt;

&lt;p&gt;What the project needs now is not manufactured attention. It needs people willing to install it, run one real workflow, and report the first place where the setup or execution becomes unclear.&lt;/p&gt;

&lt;p&gt;If you already operate local models, I would value one concrete test:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install OpenMake on your own hardware.&lt;/li&gt;
&lt;li&gt;Run one multi-step workflow.&lt;/li&gt;
&lt;li&gt;Tell us where you first lose confidence in what the system is doing.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the project is worth following, star the repository so you can find it again. An issue describing a real point of friction would be even more valuable.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/openmake/openmake_llm" rel="noopener noreferrer"&gt;https://github.com/openmake/openmake_llm&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Project site:&lt;/strong&gt; &lt;a href="https://openmake.cc/en/" rel="noopener noreferrer"&gt;https://openmake.cc/en/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live demo:&lt;/strong&gt; &lt;a href="https://chat.openmake.cc/" rel="noopener noreferrer"&gt;https://chat.openmake.cc/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-hosting documentation:&lt;/strong&gt; &lt;a href="https://openmake.cc/en/docs/" rel="noopener noreferrer"&gt;https://openmake.cc/en/docs/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Disclosure: I lead the project with AI-assisted development. This article was drafted with AI assistance from the public repository history and operating notes, then reviewed against the source and deployment facts before publication.&lt;/em&gt;&lt;/p&gt;

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