<?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: Dreven</title>
    <description>The latest articles on DEV Community by Dreven (@drevendev).</description>
    <link>https://dev.to/drevendev</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%2F4191816%2Ff0887255-978d-4aba-a55d-be92ed6963ad.jpg</url>
      <title>DEV Community: Dreven</title>
      <link>https://dev.to/drevendev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/drevendev"/>
    <language>en</language>
    <item>
      <title>I Gave Two GitHub Repositories a Terrible Idea. Then I Gave It Life.</title>
      <dc:creator>Dreven</dc:creator>
      <pubDate>Sun, 01 Nov 2026 06:54:56 +0000</pubDate>
      <link>https://dev.to/drevendev/i-gave-two-github-repositories-a-terrible-idea-then-i-gave-it-life-1ge9</link>
      <guid>https://dev.to/drevendev/i-gave-two-github-repositories-a-terrible-idea-then-i-gave-it-life-1ge9</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week4-2026-10-26"&gt;Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The monster had a complaint:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Stop trying to feed me those foreign files, I can't steer my legs properly while chewing!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;One parent was a tool that digests repositories. The other was a simulated fly. Gemma had given their imaginary child a problem neither parent could have alone: eating code made it difficult to walk.&lt;/p&gt;

&lt;p&gt;That was the moment FrankenRepo started to feel alive.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;FrankenRepo is a gothic laboratory where two public GitHub repositories become one very questionable monster.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Choose a brain. Choose a body. Inspect their observable DNA. Select Useful, Cursed, or Chaotic, then pull the lever. Gemma invents a name, personality, inherited traits, a curse, first words, and a speculative useful mutation. The lab turns them into a downloadable Monster Birth Certificate.&lt;/p&gt;

&lt;p&gt;I wanted repository discovery to feel like opening a cabinet of strange specimens. A web framework and a JSON processor become a specter suffering through nested brackets. A repository-eating crab meets a fly with simulated motor behavior. Familiar tools suddenly have a family resemblance.&lt;/p&gt;

&lt;p&gt;The monster is fictional. The parents and their source links are real.&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%2Fo4dc01jg6jw5q2wqs1xp.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%2Fo4dc01jg6jw5q2wqs1xp.png" alt="FrankenRepo's gothic laboratory with donor inputs, chemistry modes, and an explicitly labelled illustrated standby specimen" width="800" height="1048"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The standby creature above is original interface artwork. Model-generated certificates appear after an actual successful ritual.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;The demo follows &lt;strong&gt;Flask + jq in Cursed mode&lt;/strong&gt; through the local browser application: inspect the donors, invoke Gemma, reveal the creature, inspect its DNA, and export a PNG. It uses the actual provider and application, with no fixture responses or replayed model result.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjbspslvialh35slfp9yo.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjbspslvialh35slfp9yo.gif" alt="Actual local Gemma ritual from donor inspection to certificate and export" width="640" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;52-second continuous local recording, captured on 1 November before the deadline. There is no public hosted application yet.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The new creature is &lt;strong&gt;The Scribe of Bracketed Sighs&lt;/strong&gt;. Its proposed mutation gives Flask the web server and jq the JSON-log filtering: two recognizable roles, with feasibility still left to a human.&lt;/p&gt;

&lt;p&gt;A second real specimen, &lt;strong&gt;The Scavenging Glider&lt;/strong&gt;, supplied the chewing complaint in the opening:&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%2Fjdwtji7uus42r5m0y3wf.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%2Fjdwtji7uus42r5m0y3wf.png" alt="The Scavenging Glider, a real saved Gemma result from HungryCrab and desktop-fly, with inherited traits and source IDs" width="800" height="1615"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;HungryCrab supplied repository digestion; desktop-fly supplied simulated motor behavior. Gemma supplied the chewing problem. The suggested digest-to-movement integration is still speculative: a funny character can arrive before a workable adapter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/drevendev/FrankenRepo" rel="noopener noreferrer"&gt;Source and published v0.1 preview on GitHub&lt;/a&gt; · &lt;a href="https://github.com/drevendev/FrankenRepo/blob/main/docs/eval/REAL_RUNS.md" rel="noopener noreferrer"&gt;Saved real-run evidence&lt;/a&gt; · &lt;a href="https://github.com/drevendev/FrankenRepo/blob/main/ASSETS_CREDITS.md" rel="noopener noreferrer"&gt;Asset credits&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The source is MIT licensed. Use Node 24 and npm 11:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/drevendev/FrankenRepo.git
&lt;span class="nb"&gt;cd &lt;/span&gt;FrankenRepo
npm ci
npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;code&gt;http://127.0.0.1:5173&lt;/code&gt;. The interface opens without model credentials; generation requires an explicitly configured provider. The README explains setup. The newer persistence and orchestration work described below is a local update beyond the published v0.1 preview.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;The stack is TypeScript workspaces, React/Vite, Hono, and Zod. The verified model is &lt;strong&gt;&lt;a href="https://developers.cloudflare.com/workers-ai/models/gemma-4-26b-a4b-it/" rel="noopener noreferrer"&gt;Gemma 4 26B A4B IT&lt;/a&gt;&lt;/strong&gt;, served through Cloudflare Workers AI as &lt;code&gt;@cf/google/gemma-4-26b-a4b-it&lt;/code&gt;. Gemma writes the creature; an original deterministic SVG kit draws it. This keeps the visual style consistent and makes PNG, SVG, and alt-text exports practical.&lt;/p&gt;

&lt;p&gt;The important design decision was giving the laboratory three distinct kinds of truth:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;What belongs there&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Observed DNA&lt;/td&gt;
&lt;td&gt;Public GitHub metadata and bounded README excerpts, with source links and observed commits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI interpretation&lt;/td&gt;
&lt;td&gt;The model's explanation of how a trait relates to those observations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Imaginary offspring&lt;/td&gt;
&lt;td&gt;The creature's personality, curse, and proposed mutation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That separation runs through the UI and the data contract. The model can invent an anxious archivist; it cannot invent a source that proves the archivist exists.&lt;/p&gt;

&lt;p&gt;Inspection uses fixed GitHub API endpoints, with request and response limits. FrankenRepo never clones or executes donor code. Missing observations stay unknown. README content is untrusted input, so it has no authority to change the application's tools or rules.&lt;/p&gt;

&lt;p&gt;Gemma returns structured JSON. Zod checks its shape, and evidence validation checks that cited source IDs exist. A ritual gets at most two model calls: an initial attempt and one bounded repair, or an eligible deliberate revision. It eventually returns a result or a visible failure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keeping the experiment under control
&lt;/h3&gt;

&lt;p&gt;The local update adds a private MongoDB Atlas archive and durable reservations. A restart preserves consumed allowances; an unknown provider outcome keeps its reservation. Saving a card is separate from consent to publish it. Private recovery keys never belong in public URLs.&lt;/p&gt;

&lt;p&gt;Mastra runs the donor, context, model/validation, and reveal steps. Sentry records linked agent, tool, and inference spans with model IDs, timing, and token metadata, without sending raw prompts or card text. A Browserbase research session retrieved a pinned donor paragraph that entered a real model input. These integrations have local evidence; the category entries below describe their completed scope. Public hosting remains pending.&lt;/p&gt;

&lt;p&gt;The update passed &lt;strong&gt;78 unit/contract/policy tests and 18 desktop/mobile browser tests&lt;/strong&gt;. Browser success fixtures test application behavior; the real Gemma receipts and recording establish provider use. They answer different questions.&lt;/p&gt;

&lt;h3&gt;
  
  
  The failure that changed the project
&lt;/h3&gt;

&lt;p&gt;A structurally valid creature can still make an unsupported technical claim.&lt;/p&gt;

&lt;p&gt;One early result turned the crab-and-fly pairing into an automated bug-finding insect. The name worked. The sources supplied no mechanism for finding bugs. Source IDs existed, but the proposed connection did not follow from them.&lt;/p&gt;

&lt;p&gt;Later, an optional Ultramarine second opinion led to a real Gemma revision using the same frozen donor snapshots. The original survived unchanged. The revised text still promised a "verified lineage report" that the evidence could not support. The plumbing worked; the idea still failed review.&lt;/p&gt;

&lt;p&gt;That changed my acceptance criteria. I added targeted checks for the failure classes I had observed. A subsequent Useful run was rejected after its bounded repair instead of showing a substitute creature. Those checks cover specific mistakes; semantic review is still necessary.&lt;/p&gt;

&lt;p&gt;Three Paper Instruments requests changed the observed credit balance by &lt;strong&gt;$0.00108065&lt;/strong&gt;. Cloudflare's billed cost and Neuron consumption were not captured, so I leave them unknown. A model's opinion and a dashboard estimate both need that same discipline: say exactly what was observed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Seeing the ritual in Sentry
&lt;/h3&gt;

&lt;p&gt;The screenshot below comes from the actual 31 October workflow: &lt;strong&gt;six linked spans, a 10.92-second root, and a 7.82-second Gemma request&lt;/strong&gt;. Agent Activity shows the exact model, about 2K input tokens and 312 output tokens. Input and output bodies are absent by design.&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%2Faaqcr4vq85xqj6aynbjq.jpg" 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%2Faaqcr4vq85xqj6aynbjq.jpg" alt="Actual Sentry Agent Activity for the 31 October FrankenRepo ritual, showing linked steps, Gemma model, tokens, latency and an empty input panel" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sentry's displayed cost is an estimate, not a Cloudflare bill. The model request sits inside the Gemma/contract step, so the trace distinguishes inference time from total workflow time. A separate deliberately injected notebook timeout verified that an optional-tool failure could continue without memory; it was a diagnostic test, not an observed Backboard outage.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Post-submission update, 1 November 2026: this screenshot and the Sentry category row were added after the challenge deadline, following permission to publish the sanitized telemetry. The underlying run was completed on 31 October. The original article and its five other category entries were published before the deadline; acceptance of this additional category is for the organizers to decide.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;The open-weight model provides the central creative behavior, and the application exposes how that behavior is constrained. The prompt, schemas, provider adapters, source observations, and original artwork are inspectable. Someone can change the experiment instead of accepting an opaque personality generator.&lt;/p&gt;

&lt;p&gt;The verified path uses hosted Gemma. An Ollama adapter also exists as a local inference option; I have not qualified it as equivalent to the hosted model. Moving inference locally would still leave live GitHub inspection dependent on the network.&lt;/p&gt;

&lt;p&gt;Open innovation also shaped the game itself. A public project can become inspiration for something unexpected while keeping its author, purpose, and evidence visible. The imaginary child does not inherit a license grant or become a real merger of its parents' code.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Spirit of It
&lt;/h2&gt;

&lt;p&gt;For Ghost in the Machine, I wanted the haunting to come from software's recognizable habits: a parser that cannot stop sorting, a fly that cannot stop twitching, an archivist demanding paperwork from a metaphor.&lt;/p&gt;

&lt;p&gt;The best creature was the one whose complaint made sense once you met its parents.&lt;/p&gt;

&lt;p&gt;So there is a large lever, a quiet music box, and a birth certificate stamped &lt;strong&gt;CERTIFIED IMAGINARY&lt;/strong&gt;. Sound starts off; keyboard controls and reduced motion are supported.&lt;/p&gt;

&lt;p&gt;The machine should enjoy its theatrical entrance. The evidence should survive the lights coming back on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;p&gt;The following entries use completed &lt;strong&gt;local&lt;/strong&gt; scenarios. Public application hosting is still pending.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;What actually ran&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best Use of Gemma&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Source-linked creature generation and real browser exports, including the continuous demo above.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best Use of Mastra&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The actual donor → context → Gemma/contract → reveal workflow; real run IDs, step timings, and a failed run are retained.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best Use of MongoDB Atlas&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Private save → API restart → read, wrong-key denial, consented public read → unpublish/delete, and competing durable budget reservations.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best Use of Browserbase&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A real cloud browser retrieved a pinned donor README paragraph that entered a real Gemma input. This is research-context use, without a public-site E2E claim.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best Use of Ultramarine&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Two real second opinions through the official OpenAI SDK, with recorded token usage and the credit cost reported above.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best Use of Sentry Agent Tracing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Six linked agent/tool/inference spans with model, tokens and latency; screenshot above. This category row was added after the deadline.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The Browserbase context came from &lt;a href="https://github.com/drevendev/HungryCrab/blob/9f8540b14e0059592bdf916526fdc2160390bbae/README.md" rel="noopener noreferrer"&gt;HungryCrab's README at the observed commit&lt;/a&gt;, and was supplied as a separately identified browser excerpt. Ultramarine identified the missing code-to-stimulus interface in the crab/fly proposal; its own proposed fix remained an opinion. Atlas denied reads after revocation and deletion, including an attempted recreation of a deleted operation.&lt;/p&gt;

&lt;p&gt;Public hosting, a gallery, the proposed memory corpus, and the apprentice-training experiment remain unfinished. &lt;strong&gt;Render, Backboard, and Tinker are not entered.&lt;/strong&gt; No deployed service or trained checkpoint is claimed.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Built with AI-assisted coding and drafting. Real model outputs are preserved as evidence; test fixtures and illustrated interface specimens are labelled separately.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>opensource</category>
      <category>ai</category>
    </item>
    <item>
      <title>I verify the voice context before I ask a model to write</title>
      <dc:creator>Dreven</dc:creator>
      <pubDate>Sun, 25 Oct 2026 07:04:38 +0000</pubDate>
      <link>https://dev.to/drevendev/i-verify-the-voice-context-before-i-ask-a-model-to-write-3gok</link>
      <guid>https://dev.to/drevendev/i-verify-the-voice-context-before-i-ask-a-model-to-write-3gok</guid>
      <description>&lt;h2&gt;
  
  
  A mismatch before the first sentence
&lt;/h2&gt;

&lt;p&gt;An English voice bundle attached to a Russian request is a problem before the first sentence exists. The request can be well formed while carrying writing instructions that belong to a different language or format.&lt;/p&gt;

&lt;p&gt;I want to catch that mismatch while the input is still something I can inspect. In &lt;a href="https://github.com/drevendev/Quillgrain" rel="noopener noreferrer"&gt;Quillgrain&lt;/a&gt;, I compile an explicitly chosen voice pack into local writing context, then verify that context before handing it to a model.&lt;/p&gt;

&lt;p&gt;That gives me a concrete boundary in a writing tool: prepare the instructions, check their identity and scope, then ask for prose. Compilation itself does not call Ollama or any other model.&lt;/p&gt;

&lt;h2&gt;
  
  
  The small example I can check locally
&lt;/h2&gt;

&lt;p&gt;For this example I used Quillgrain &lt;strong&gt;0.1.0rc3&lt;/strong&gt; and the public demonstration pack in the &lt;a href="https://github.com/drevendev/PatchPitch" rel="noopener noreferrer"&gt;PatchPitch checkout&lt;/a&gt;. The pack lives at &lt;code&gt;examples/editorial/voice&lt;/code&gt;; the code below is meant to run from that checkout with the engine installed. The &lt;a href="https://github.com/drevendev/PatchPitch/blob/main/docs/quillgrain-voice.md" rel="noopener noreferrer"&gt;setup guide&lt;/a&gt; covers the pinned integration.&lt;/p&gt;

&lt;p&gt;The pack contains designed editorial preferences: connected explanations, concrete examples and first-person prose. Its long-form and short-X rules have separate scopes. There are no personal writing samples hidden inside this demo.&lt;/p&gt;

&lt;p&gt;Here is the complete compile-and-verify example. The selected context is English, uses the &lt;code&gt;maker_announcement&lt;/code&gt; register and is scoped to &lt;code&gt;social.longform&lt;/code&gt; on the &lt;code&gt;ollama&lt;/code&gt; host.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;quillgrain.compose&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;compile_context&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;quillgrain.consumer&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;verify_bundle&lt;/span&gt;

&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;compile_context&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;examples/editorial/voice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;en&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;register&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maker_announcement&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;patchpitch&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model_host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ollama&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;social.longform&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;max_chars&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;checked&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;verify_bundle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;model_host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ollama&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;en&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;register&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maker_announcement&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;social.longform&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;checked&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;build_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The successful run returned a verified context with a build ID. Both compilation and verification completed locally; this example made no model request.&lt;/p&gt;

&lt;h2&gt;
  
  
  The editorial decision comes after the check
&lt;/h2&gt;

&lt;p&gt;I also checked the failure path: asking the verifier to use the same English bundle for Russian was rejected before inference. That is the kind of mismatch I want a request builder to catch, rather than discovering it in the generated article.&lt;/p&gt;

&lt;p&gt;The bundle keeps the compiled context together with its lock. Verification checks the hashes, language, register, tags and approved model host. I can use those checks to stop an incompatible profile from slipping into a request.&lt;/p&gt;

&lt;p&gt;Passing the check does not make the resulting prose sound like me. The demo profile is a set of explicit preferences, not a learned personal voice. I still need to read the opening, check the examples and decide which sentences belong in the article.&lt;/p&gt;

&lt;p&gt;For me, the useful part is having a writing context I can inspect and a separate editorial decision after generation. The compiler can establish structure and compatibility; the draft still has to earn its place on the page.&lt;/p&gt;

&lt;p&gt;Where do you catch writing-context mistakes today: in the request builder, or only when you read the output?&lt;/p&gt;

</description>
      <category>devtools</category>
      <category>python</category>
      <category>opensource</category>
      <category>ai</category>
    </item>
    <item>
      <title>I shipped PatchPitch 0.3.0. Here is what the failed 4B run taught me.</title>
      <dc:creator>Dreven</dc:creator>
      <pubDate>Sat, 24 Oct 2026 13:45:25 +0000</pubDate>
      <link>https://dev.to/drevendev/i-shipped-patchpitch-030-here-is-what-the-failed-4b-run-taught-me-5dgb</link>
      <guid>https://dev.to/drevendev/i-shipped-patchpitch-030-here-is-what-the-failed-4b-run-taught-me-5dgb</guid>
      <description>&lt;p&gt;The faster run took three minutes. It produced zero drafts I could accept.&lt;/p&gt;

&lt;p&gt;The slower run took almost twenty-seven minutes. It produced all four, then repeated the completed job in less than a second without asking the model anything.&lt;/p&gt;

&lt;p&gt;That difference became a useful release test for &lt;strong&gt;PatchPitch 0.3.0&lt;/strong&gt;, my open-source tool for turning development facts into announcement drafts for Telegram, X, DEV and GitHub. I shipped it on 24 October. Getting there meant looking beyond whether the model returned some text.&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://dev.to/drevendev/the-code-was-done-the-four-announcements-werent-112i"&gt;my previous article&lt;/a&gt;, I ran the headless workflow on Windows and reviewed the results in the studio. The CLI already worked. For the release, I wanted to see what happened on a fresh Linux runner, outside the checkout, with stdin closed—and what remained usable when the model got things wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  One set of facts, four different writing jobs
&lt;/h2&gt;

&lt;p&gt;Finishing a release leaves me with another small project: explaining it. The facts are the same, but a Telegram update, an X post, a DEV story and GitHub notes need different amounts of context.&lt;/p&gt;

&lt;p&gt;PatchPitch starts with selected facts and a JSON or TOML job. Ollama supplies the local model; the CLI prepares the drafts and saves the evidence. The studio is available when I want to inspect or edit the results, but generation doesn't need its web server or a browser.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9c6sc41ylktfn17bvavv.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9c6sc41ylktfn17bvavv.gif" alt="The PatchPitch studio switching between saved drafts from the earlier Windows experiment" width="560" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This GIF shows saved development drafts from the earlier Windows run. It illustrates review in the studio; it is not a recording of the Linux acceptance run below. The &lt;a href="https://drevendev.github.io/PatchPitch/dev-030/" rel="noopener noreferrer"&gt;42-second demo&lt;/a&gt; opens a player with sound, subtitles and playback controls.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The part I care about is what survives after generation: original responses, failed attempts, input snapshots and my editable publication files. If one target fails, I can inspect it without throwing away the other three. If I edit a draft, repeating the job preserves that edit.&lt;/p&gt;

&lt;h2&gt;
  
  
  The smaller model finished first—and failed the campaign
&lt;/h2&gt;

&lt;p&gt;I used GitHub Actions for Linux because my Windows machine had neither WSL/Docker nor a running Ollama at the time. The runner installed PatchPitch into a fresh environment and invoked the installed CLI from outside the checkout.&lt;/p&gt;

&lt;p&gt;I also tried the same campaign with &lt;code&gt;gemma3:4b&lt;/code&gt;. It took &lt;strong&gt;183.374 seconds&lt;/strong&gt;, made four model requests and exited with code 4. All four targets were attempted; none produced an accepted output.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Target&lt;/th&gt;
&lt;th&gt;What went wrong&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;The topic plan narrowed itself to one fact. Only four catalog tags qualified; six were required, so writing stopped before another request.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telegram&lt;/td&gt;
&lt;td&gt;The Russian target received English prose with internal C01–C06 source IDs leaking into the text.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DEV&lt;/td&gt;
&lt;td&gt;The article left selected facts out.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub&lt;/td&gt;
&lt;td&gt;The notes also missed selected facts.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I kept the &lt;a href="https://github.com/drevendev/PatchPitch/actions/runs/40081001495" rel="noopener noreferrer"&gt;failed run and its evidence&lt;/a&gt;. Making those checks less strict would have produced a green workflow, but it would still have left me with the wrong language, missing information and an unusable X draft.&lt;/p&gt;

&lt;p&gt;This result describes one campaign on one model. It doesn't establish that every 4B model will fail. It does mean I can't present this configuration as a cheaper equivalent to the one that passed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The passing run had an eight-minute DEV request
&lt;/h2&gt;

&lt;p&gt;With &lt;code&gt;gemma4:12b&lt;/code&gt;, the Linux campaign finished in &lt;strong&gt;1599.653 seconds: 26 minutes 40 seconds&lt;/strong&gt;. Ubuntu 24.04, Python 3.12.15 and Ollama 0.40.10 were the recorded environment.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Target&lt;/th&gt;
&lt;th&gt;Model request time&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;X, English&lt;/td&gt;
&lt;td&gt;124.834 s planning + 179.148 s writing&lt;/td&gt;
&lt;td&gt;Accepted, six tags, estimated 272/280 characters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telegram, Russian&lt;/td&gt;
&lt;td&gt;399.657 s&lt;/td&gt;
&lt;td&gt;Accepted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DEV, English&lt;/td&gt;
&lt;td&gt;497.921 s&lt;/td&gt;
&lt;td&gt;Accepted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub, English&lt;/td&gt;
&lt;td&gt;397.662 s&lt;/td&gt;
&lt;td&gt;Accepted&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Five requests produced four accepted drafts. Validation and session export passed too. The &lt;a href="https://github.com/drevendev/PatchPitch/actions/runs/40079916968" rel="noopener noreferrer"&gt;full Actions run&lt;/a&gt; records the experiment; these timings are an observation from that CPU runner, not a speed promise.&lt;/p&gt;

&lt;p&gt;The DEV request exposed a practical setup detail: &lt;strong&gt;497.921 seconds exceeds the normal 420-second timeout&lt;/strong&gt;. The passing configuration explicitly used 600 seconds. From a prepared checkout, with Ollama running and &lt;code&gt;gemma4:12b&lt;/code&gt; already installed, the reproduction command is:&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="nv"&gt;PATCHPITCH_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;gemma4:12b &lt;span class="nv"&gt;PATCHPITCH_TIMEOUT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;600 python &lt;span class="nt"&gt;-m&lt;/span&gt; patchpitch run &lt;span class="nt"&gt;--job&lt;/span&gt; examples/headless/all-four.toml &lt;span class="nt"&gt;--out-root&lt;/span&gt; artifacts/campaigns &lt;span class="nt"&gt;--json&lt;/span&gt; &amp;lt;/dev/null
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That example reproduces the original experiment inputs. Final-release facts live separately in &lt;code&gt;examples/headless/release.toml&lt;/code&gt;. The live evidence predates the final version label; final promotion left the inference and validation behavior unchanged.&lt;/p&gt;

&lt;p&gt;Then came the pleasantly boring part. Repeating the completed run took &lt;strong&gt;0.352 seconds&lt;/strong&gt;. Explicit resume took &lt;strong&gt;0.329 seconds&lt;/strong&gt;. All campaign files stayed byte-identical, and neither operation made another model request.&lt;/p&gt;

&lt;p&gt;Twenty-seven minutes is a long wait to repeat accidentally. Keeping completed work mattered more here than shaving a few words off a prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  A lost response shouldn't create a second article
&lt;/h2&gt;

&lt;p&gt;The DEV adapter had a different kind of failure to handle. Suppose DEV saves my draft, but the response never reaches PatchPitch. Sending another create request could leave me with a duplicate.&lt;/p&gt;

&lt;p&gt;There was an extra wrinkle: the owned-article response can omit the AI disclosure field. The old recovery logic treated an absent field as &lt;code&gt;fully_autonomous&lt;/code&gt;. A draft sent with &lt;code&gt;some_ai&lt;/code&gt; or &lt;code&gt;no_ai&lt;/code&gt; could then fail reconciliation even when its content had been saved correctly.&lt;/p&gt;

&lt;p&gt;Receipts now retain the exact outgoing article payload. Recovery checks the owned draft and its observable content, then sends the desired disclosure explicitly to that same draft. A missing field no longer becomes an invented value. Regression tests cover the recovery paths, including omitted disclosure.&lt;/p&gt;

&lt;p&gt;Generation and delivery remain separate commands. The adapter saves drafts with &lt;code&gt;published=false&lt;/code&gt; and protects articles that are already published. That gives me somewhere to review the actual DEV rendering before a public post.&lt;/p&gt;

&lt;h2&gt;
  
  
  Six tags, an explicit writing brief, and a release I can inspect
&lt;/h2&gt;

&lt;p&gt;For X, I chose a product rule: exactly six relevant hashtags. PatchPitch selects them from dated observations, checks topic and audience fit, and reserves their space alongside the link before asking for prose. The passing Linux post used &lt;code&gt;#DevTools #LocalAI #LLM #Ollama #OpenSource #Automation&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That catalog supports a topical choice; it doesn't prove a reach improvement. The failed 4B plan was useful precisely because it showed where the available evidence ran out.&lt;/p&gt;

&lt;p&gt;For this article, I used PatchPitch with a &lt;strong&gt;Quillgrain editorial brief&lt;/strong&gt;: first-person singular, a concrete experiment, short paragraphs and the failures kept in the story. I then edited the model draft, corrected its framing of the earlier demo and added the result tables and source links. The brief makes my preferences explicit; the edit still decides what earns a paragraph. The Linux acceptance sample itself used the clear preset.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/drevendev/PatchPitch/actions/runs/40096086481" rel="noopener noreferrer"&gt;latest main CI&lt;/a&gt; passed the base suite, the pinned Quillgrain integration job and the package checks. Quillgrain ran 21 tests without skips. The wheel and source archive built successfully, and the wheel's CLI passed checks in a clean environment without UI dependencies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/drevendev/PatchPitch/releases/tag/v0.3.0" rel="noopener noreferrer"&gt;PatchPitch 0.3.0 is available on GitHub&lt;/a&gt;&lt;/strong&gt;, with the archives, checksums and source commit. The &lt;a href="https://github.com/drevendev/PatchPitch/blob/v0.3.0/docs/headless.md" rel="noopener noreferrer"&gt;headless guide&lt;/a&gt; covers installation and job configuration. It isn't on PyPI yet.&lt;/p&gt;

&lt;p&gt;I can now hand the CLI one maintained set of facts, let it prepare the drafts, and come back to both the results and the evidence behind them. Smaller-model acceptance and inline DEV video with sound and controls are still in the backlog.&lt;/p&gt;

&lt;p&gt;If you run local models unattended, which failure has cost you more time: a rejected response, or a response that looked valid until you tried to use it?&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>python</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>The code was done. The four announcements weren't.</title>
      <dc:creator>Dreven</dc:creator>
      <pubDate>Fri, 23 Oct 2026 09:07:32 +0000</pubDate>
      <link>https://dev.to/drevendev/the-code-was-done-the-four-announcements-werent-112i</link>
      <guid>https://dev.to/drevendev/the-code-was-done-the-four-announcements-werent-112i</guid>
      <description>&lt;p&gt;You finish the update. Then you open Telegram, X, DEV and GitHub, and discover that you have four more things to write.&lt;/p&gt;

&lt;p&gt;The facts haven't changed. The readers have. Telegram wants the update without a long introduction. X gives you one small patch of screen. DEV needs a reason to keep reading. GitHub needs the concrete details someone will look for later.&lt;/p&gt;

&lt;p&gt;That's the gap I'm building PatchPitch for: keep the facts in one place, then prepare drafts for each audience. For 0.3.0, currently in development, I wanted the whole job to run from the command line. A writing tool that needs someone to babysit a browser leaves a rather large hole in the automation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The result: four local drafts in 123.258 seconds, using five requests to a local Ollama model.&lt;/strong&gt; Here's a 42-second recording of the saved results being reviewed in the studio:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://drevendev.github.io/PatchPitch/dev-030/" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Watch the 42-second demo with sound and subtitles&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://drevendev.github.io/PatchPitch/assets/patchpitch-030-dev-story.mp4" rel="noopener noreferrer"&gt;Direct MP4 download&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  I made PatchPitch write about PatchPitch
&lt;/h2&gt;

&lt;p&gt;The test material was its own development update. I supplied selected facts, asked for four formats, and ran the CLI with stdin closed. No browser, no PatchPitch web server, no clicking Generate four times. Ollama was already running locally with &lt;code&gt;gemma4:12b&lt;/code&gt; installed.&lt;/p&gt;

&lt;p&gt;The successful campaign produced this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Target&lt;/th&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;th&gt;Request time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;One English post with six tags&lt;/td&gt;
&lt;td&gt;10.0 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telegram&lt;/td&gt;
&lt;td&gt;A Russian project update&lt;/td&gt;
&lt;td&gt;29.9 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DEV&lt;/td&gt;
&lt;td&gt;An English article draft&lt;/td&gt;
&lt;td&gt;50.4 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub&lt;/td&gt;
&lt;td&gt;English development notes&lt;/td&gt;
&lt;td&gt;31.9 s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;X used two requests: one to plan the post, another to write it after tag selection. Each other format used one. The 123.258 seconds includes the CLI's overhead; these are timings from this run on this Windows machine.&lt;/p&gt;

&lt;p&gt;Here's the reusable example command, run from a prepared checkout containing the 0.3.0 development code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python -m patchpitch run --job examples/headless/all-four.toml --out-root artifacts/campaigns --json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;About two minutes later, I had four drafts to read instead of four blank editors.&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%2F4mfxvyo7c3fgw5yw997j.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%2F4mfxvyo7c3fgw5yw997j.png" alt="Log card rendered from the saved CLI output: all four targets succeeded" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The first X draft missed by seventeen characters
&lt;/h2&gt;

&lt;p&gt;Before that successful run, PatchPitch rejected an X response with &lt;code&gt;X_LENGTH_EXCEEDED&lt;/code&gt;. The app estimated the complete post at &lt;strong&gt;297 characters&lt;/strong&gt; against its 280-character budget. Telegram, DEV and GitHub still finished, and the rejected X response stayed on disk.&lt;/p&gt;

&lt;p&gt;I had given the model a general 150–200-character prose target alongside a smaller allowance that reserved space for six hashtags and a link. The wider instruction was an invitation to overflow. I removed it and added a prose ceiling to the output schema, keeping the final check on the assembled post.&lt;/p&gt;

&lt;p&gt;I also revised the tag catalog between runs. A generic mention of Python had helped select &lt;code&gt;#PythonDevelopment&lt;/code&gt;; I narrowed that match to actual Python development topics. The revised selection included &lt;code&gt;#Automation&lt;/code&gt;, a closer description of this announcement.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Complete-post estimate&lt;/th&gt;
&lt;th&gt;What happened&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;First generated response&lt;/td&gt;
&lt;td&gt;297 / 280&lt;/td&gt;
&lt;td&gt;Rejected; other targets continued&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fresh run after prompt and catalog changes&lt;/td&gt;
&lt;td&gt;262 / 280&lt;/td&gt;
&lt;td&gt;Passed validation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Explicit copy edit&lt;/td&gt;
&lt;td&gt;244 / 280&lt;/td&gt;
&lt;td&gt;Shortened and labelled as development work&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The lesson was pleasantly concrete: reserve the tags and link first, give the model the remaining prose budget, then check the whole message. The saved responses made it possible to see where the space went.&lt;/p&gt;

&lt;h2&gt;
  
  
  Same facts, different jobs
&lt;/h2&gt;

&lt;p&gt;Here are excerpts from the saved files after editing. The X post is shown in full:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;PatchPitch 0.3.0 dev: an open-source Python CLI tool that automates drafts from JSON/TOML jobs with local Ollama. No browser or web server needed.&lt;/p&gt;

&lt;p&gt;#DevTools #LocalAI #LLM #Ollama #OpenSource #Automation&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/drevendev/PatchPitch" rel="noopener noreferrer"&gt;https://github.com/drevendev/PatchPitch&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Those six tags describe the subject: developer tools, local AI, language models, Ollama, open source and automation. PatchPitch selected them from a reviewed catalog of eleven candidates, backed by nineteen linked posts from fifteen authors. That gives me examples of usage and a reason for each choice; reach isn't something this sample measured.&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%2F1rct60347m1pzjiejk8e.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%2F1rct60347m1pzjiejk8e.png" alt="Actual saved X post in PatchPitch, with six tags and a 244-character estimate" width="800" height="614"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Telegram&lt;/strong&gt; draft opens directly in Russian:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Я добавил в PatchPitch возможность автоматически генерировать черновики для Telegram, DEV и GitHub на основе выбранных фактов разработки.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In English: “I added the ability to automatically generate drafts for Telegram, DEV and GitHub from selected development facts.” The rest of the saved post explains the local CLI workflow and includes the command.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;GitHub&lt;/strong&gt; notes take a more functional approach:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The development implementation provides a non-interactive CLI to automate draft generation from JSON or TOML jobs. This workflow utilizes the existing local Ollama model backend and functions without starting a browser or HTTP server. An installed local model is required for operation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That gives a repository reader the mechanics and a prerequisite. It's also fairly stiff prose. The openings still leaned heavily on the same CLI facts; the formats worked, but their hooks needed more attention. The DEV draft made that especially obvious.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9c6sc41ylktfn17bvavv.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9c6sc41ylktfn17bvavv.gif" alt="Reviewing the four saved CLI drafts in the studio without regenerating them" width="560" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Giving the DEV draft a story
&lt;/h2&gt;

&lt;p&gt;The first DEV version read like a README: plenty about how the pieces fit, very little about why a developer would care. I gave Quillgrain a more specific editorial profile: start with the four-announcement problem, tell the actual experiment, keep the failed X attempt, and show the outputs. Short paragraphs and concrete verbs were part of the brief, too.&lt;/p&gt;

&lt;p&gt;Quillgrain compiled that profile into writing context. PatchPitch sent it alongside the selected facts to the local model for a fresh DEV generation. The response still opened with this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We've all been there: you finally push a significant update, the code is clean, and the tests pass, but then you're faced with the friction of explaining that change in four different places.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That could introduce almost any developer tool. During editing, I replaced it with the opening of this article:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You finish the update. Then you open Telegram, X, DEV and GitHub, and discover that you have four more things to write.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I also pulled the real failure, timings and saved examples into the story. Quillgrain made the brief explicit and available to the generation step; the editorial pass decided which details deserved the reader's attention. Both are part of how this version was made.&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%2Fabel80qcvly6o4p230ch.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%2Fabel80qcvly6o4p230ch.png" alt="An earlier DEV revision being reviewed in the studio" width="800" height="614"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Four drafts I could come back to
&lt;/h2&gt;

&lt;p&gt;One part of the experiment was pleasantly uneventful: running it again.&lt;/p&gt;

&lt;p&gt;In a separate reuse check, I repeated the completed job and invoked resume with network connections blocked. Both reused the saved work with &lt;strong&gt;zero connection attempts&lt;/strong&gt;. The original responses and edited publication files stayed intact.&lt;/p&gt;

&lt;p&gt;The CLI session could then be opened in the studio to read, edit and export. That's the review shown in the screenshots and recordings: switching between saved drafts doesn't need another model request.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc6999l6o4sfx10m4duz2.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc6999l6o4sfx10m4duz2.gif" alt="Inspecting the saved X output, its selected tags and source facts" width="600" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The useful part is opening four concrete drafts with the facts already in place. I can spend the next edit on the hook, the awkward sentence or the example that makes the update worth reading. Those are much better problems to have than four empty text boxes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/drevendev/PatchPitch" rel="noopener noreferrer"&gt;PatchPitch on GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>python</category>
      <category>ollama</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Let your wild ideas ferment: a quiet garden powered by local Gemma</title>
      <dc:creator>Dreven</dc:creator>
      <pubDate>Thu, 22 Oct 2026 15:12:20 +0000</pubDate>
      <link>https://dev.to/drevendev/let-your-wild-ideas-ferment-a-quiet-garden-powered-by-local-gemma-1c0o</link>
      <guid>https://dev.to/drevendev/let-your-wild-ideas-ferment-a-quiet-garden-powered-by-local-gemma-1c0o</guid>
      <description>&lt;p&gt;&lt;em&gt;Built for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Some ideas are too odd to schedule and too interesting to delete.&lt;/p&gt;

&lt;p&gt;Compost Club is for people who collect fragments of side projects and would rather explore one new connection than turn every note into a task. Add two scraps, ask local Gemma for one possibility, and decide whether it deserves to grow.&lt;/p&gt;

&lt;p&gt;My projects already contain ideas worth revisiting. Scriptorium studies how a text is written. Quillgrain carries a writing voice between tools. They solve different problems, but what might grow between them? I built &lt;strong&gt;Compost Club&lt;/strong&gt; to give those unfinished connections another small chance.&lt;/p&gt;

&lt;p&gt;Drop a few scraps into a cozy garden. Let local Gemma combine two of them into one new concept. Read where it came from, keep what makes you curious, or compost it again with its roots attached. A friendly worm named Wiggle supervises absolutely nothing.&lt;/p&gt;

&lt;p&gt;A kept idea can now grow a small branch, too. Ask Gemma to clarify its mechanism, add a constraint, explore an alternative, or suggest a one-day experiment. Each step waits for your review.&lt;/p&gt;

&lt;p&gt;The garden has a deliberately slow rhythm: one welcome pairing, then another slot every fifteen minutes, up to three. Closing the tab earns time credits. Generation happens only when you ask for it. Nothing withers while you are away.&lt;/p&gt;

&lt;p&gt;That is my interpretation of &lt;strong&gt;Slow and Steady&lt;/strong&gt;: give a neglected idea a gentle next step without turning it into another daily obligation. There are no streaks, upgrades, payments, or productivity scores.&lt;/p&gt;

&lt;h3&gt;
  
  
  The lazy payoff
&lt;/h3&gt;

&lt;p&gt;My ten project cards offer &lt;strong&gt;45 possible pairs&lt;/strong&gt;. I do not have to enumerate them or write a new prompt for each: the garden selects an unused pair, Gemma proposes one connection, and I review it. That is the effort this build aims to remove, rather than the decision about what is worth making.&lt;/p&gt;

&lt;p&gt;The example below took about &lt;strong&gt;8.5 seconds&lt;/strong&gt; of local inference. I kept it as a candidate for further exploration. That is an observed run, not a measured productivity saving or evidence that all 45 pairings would be useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://drevendev.github.io/CompostClub/?v=07c202852017" rel="noopener noreferrer"&gt;Watch the demo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The short English demo shows the actual application with ideas taken from my public projects. It opens the two source cards, shows &lt;strong&gt;Echo Cartography&lt;/strong&gt;, keeps it, then follows two earlier discoveries back into the compost pile. The cream paper, small flowers, and hand-drawn garden are part of the invitation to slow down.&lt;/p&gt;

&lt;p&gt;The result came from a fresh local Gemma 3 4B run on English summaries of two real repositories: &lt;a href="https://github.com/drevendev/Scriptorium" rel="noopener noreferrer"&gt;Scriptorium&lt;/a&gt; and &lt;a href="https://github.com/drevendev/Quillgrain" rel="noopener noreferrer"&gt;Quillgrain&lt;/a&gt;. The summaries retain source links and describe current limits as well as the ideas behind each project. Gemma's unedited concept was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Scriptorium's reading observatory is layered with Quillgrain's voice packs, generating a dynamic 'cartography' of a text’s evolution across drafts, highlighting shifts in vocabulary and tone through visualized, context-aware measurements.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I can see a practical possibility: an editor comparing drafts could notice where a revision changes the author's voice. That is why I chose this result for the demo. Echo Cartography is an idea proposed by Gemma, not an implemented editor, a paying customer, or a claim that demand has been validated.&lt;/p&gt;

&lt;p&gt;The walkthrough then switches to a separate saved garden containing &lt;strong&gt;Lexigraph&lt;/strong&gt; and &lt;strong&gt;ClawPulse&lt;/strong&gt;, two other genuine local results. Clicking &lt;strong&gt;Compost again&lt;/strong&gt; turns them into two new source scraps: twelve scraps instead of ten, with their parent links intact. No second-generation blend is claimed. The scenes were filmed from validated saved gardens; no fresh inference click or waiting animation was staged for the camera.&lt;/p&gt;

&lt;p&gt;Making the demo also improved the product: I folded the composer, paged long piles, and put both source texts side by side. The walkthrough needs no scrolling, while full text remains available. Its English voice, gentle guitar and floral frame are presentation elements; the actions inside are the real application.&lt;/p&gt;

&lt;p&gt;The downloadable public sample is a separate experience: seven visibly labelled, unchanged recordings on fictional inputs, playable without a model download, including as a self-contained offline HTML file. Custom scraps need explicit local inference setup. Browser AI remains experimental.&lt;/p&gt;

&lt;h3&gt;
  
  
  From an interesting idea to a small next step
&lt;/h3&gt;

&lt;p&gt;After keeping Echo Cartography, I chose &lt;strong&gt;Tend this idea&lt;/strong&gt; and asked for a one-day experiment. Local Gemma proposed &lt;strong&gt;Draft Timeline Exploration&lt;/strong&gt;: take a 100-word passage, make three draft versions, and chart vocabulary and tone changes on a whiteboard. I accepted the branch, saved it, and verified that it survived a reload. The proposed whiteboard experiment itself has not been carried out.&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%2Fg6r1qh4r86y439bvnkhg.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%2Fg6r1qh4r86y439bvnkhg.png" alt="The actual Tend interface with Echo Cartography as parent and Draft Timeline Exploration saved as an accepted branch" width="800" height="556"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An accepted branch can become the parent of another request. Asking again from the same parent creates an alternative. Original responses, human edits, and parent snapshots stay separate. Accepting spends one ready slot; rejection, cancellation, failure, and &lt;code&gt;no_growth&lt;/code&gt; keep it. This is the first small branching workflow; it runs when asked, with a person deciding what grows.&lt;/p&gt;

&lt;p&gt;The video above shows blending and recomposting. This screenshot shows the newer tending workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/drevendev/CompostClub" rel="noopener noreferrer"&gt;Repository and local setup&lt;/a&gt; · &lt;a href="https://github.com/drevendev/CompostClub/blob/main/docs/MODEL_EVAL.md" rel="noopener noreferrer"&gt;Model experiments and raw evidence&lt;/a&gt; · &lt;a href="https://github.com/drevendev/CompostClub/blob/main/docs/ROADMAP.md" rel="noopener noreferrer"&gt;Known issues and roadmap&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To try the labelled sample, use Node 24 and npm 11:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/drevendev/CompostClub.git
&lt;span class="nb"&gt;cd &lt;/span&gt;CompostClub
npm ci
npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open the printed local URL and choose &lt;strong&gt;Try the sample garden&lt;/strong&gt;. This route needs no model download. For fresh ideas, follow the separate &lt;a href="https://github.com/drevendev/CompostClub/blob/main/docs/RUNNING.md#run-live-local-gemma" rel="noopener noreferrer"&gt;live local Gemma setup&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The application and original SVG illustrations are MIT-licensed. Gemma weights have their own terms and are not bundled with the app.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;The UI uses React, TypeScript, and Vite. The garden rules live in a separate domain layer, independent of React and the inference runtime. IndexedDB stores the pile and discoveries; Markdown exports and validated JSON backups provide portable copies.&lt;/p&gt;

&lt;p&gt;Gemma handles two bounded requests: blend two scraps into a concept with a source fragment from each, or propose one continuation of a kept idea. It receives no tools, shell, or archive search. The app renders input and output as text.&lt;/p&gt;

&lt;h3&gt;
  
  
  The model experiments changed the design
&lt;/h3&gt;

&lt;p&gt;My first prompt asked Gemma 3 1B to choose exact quotations from both parents. All 24 predetermined runs failed the final output contract. Paraphrasing a source made sense linguistically, but broke the provenance requirement.&lt;/p&gt;

&lt;p&gt;The next version moved that mechanical work into code. The app selects short exact fragments and constrains those fields in the JSON schema; the model concentrates on inventing the concept.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Local experiment&lt;/th&gt;
&lt;th&gt;Runs passing the shipped structural validator&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ollama Gemma 3 1B, first prompt&lt;/td&gt;
&lt;td&gt;0 / 24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ollama Gemma 3 1B, revised prompt&lt;/td&gt;
&lt;td&gt;23 / 24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ollama Gemma 3 4B, revised prompt&lt;/td&gt;
&lt;td&gt;24 / 24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser Gemma 3 270M and 1B, small combined smoke set&lt;/td&gt;
&lt;td&gt;0 / 4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The Ollama set contains twelve public source-pair combinations, each run twice. Tuning reused the original holdout combinations, so these numbers describe a small regression experiment, not general performance on unseen ideas. The browser row is a separate, smaller experiment with a different runtime and setup.&lt;/p&gt;

&lt;p&gt;The 4B pass needed no repair calls. On the tested Windows machine, Ollama selected CPU inference; its median call latency was about nine seconds. That is a measured result from one machine, not a hardware requirement or a promise about other devices.&lt;/p&gt;

&lt;p&gt;For this new demo I also ran ten additional pairings from my public-project cards, after the first Lexigraph result. All ten passed the structural contract without repair. Human review still excluded three: one leaked field-like fragments into its concept, while two assumed evidence the source cards did not contain. Echo Cartography took about 8.5 seconds in its local run. These selected exploratory cases are not a held-out evaluation or proof of general creative quality.&lt;/p&gt;

&lt;p&gt;The browser models genuinely loaded and generated with WebGPU. Their four outputs failed the contract, so browser AI stays visibly experimental. Those failures remain in the evidence. A failed call never becomes a successful recording behind the scenes.&lt;/p&gt;

&lt;p&gt;Even &lt;strong&gt;24/24 valid responses does not mean 24 useful ideas&lt;/strong&gt;. Some concepts were weak, and some Russian requests returned English. Human usefulness review and a fresh unseen evaluation set are still open. The seven sample recordings are a selected subset; the remaining results are retained.&lt;/p&gt;

&lt;h3&gt;
  
  
  A garden also has to remember
&lt;/h3&gt;

&lt;p&gt;The application preserves raw source revisions and the original model responses. Editing a scrap does not rewrite the parents of an older discovery. Saving a sprout, consuming its pair, and spending its slot happen atomically. Errors, cancellation, and a model's &lt;code&gt;no_blend&lt;/code&gt; response keep the slot.&lt;/p&gt;

&lt;p&gt;Recovery matters here because the scraps are the user's contribution. Backup validation, competing-tab checks, restore conflict detection, and cascade previews for deletion all protect that contribution. The current checks cover 97 unit tests, three HTTP/Sentry regressions, and 32 Chromium journeys, including growth review and privacy exports. Those application checks are separate from model-quality evidence.&lt;/p&gt;

&lt;p&gt;GitHub Actions takes repetitive release checks off my hands. The &lt;a href="https://github.com/drevendev/CompostClub/blob/main/.github/workflows/quality.yml" rel="noopener noreferrer"&gt;Repository checks workflow&lt;/a&gt; installs pinned dependencies, runs verification, builds the app and standalone sample, and exercises recovery, pairing workflows and the Pages subpath in Chromium. The &lt;a href="https://github.com/drevendev/CompostClub/actions/runs/39778088037" rel="noopener noreferrer"&gt;successful post-merge run&lt;/a&gt; includes the tending workflow and optional Sentry adapter.&lt;/p&gt;

&lt;h3&gt;
  
  
  Watching a local model without collecting its ideas
&lt;/h3&gt;

&lt;p&gt;I connected &lt;strong&gt;Sentry Agent Tracing&lt;/strong&gt; to the Node bridge as optional technical monitoring. It is &lt;strong&gt;off by default&lt;/strong&gt;, and the connection status shows when the operator enables it. The browser and offline HTML contain no Sentry client. The &lt;a href="https://github.com/drevendev/CompostClub/blob/main/docs/OPTIONAL_SERVICES.md" rel="noopener noreferrer"&gt;adapter and removal instructions&lt;/a&gt; keep it independent of the garden's data and local inference.&lt;/p&gt;

&lt;p&gt;On a fresh tending request with the merged code, Sentry recorded &lt;strong&gt;16.43 seconds&lt;/strong&gt;, &lt;strong&gt;220 input tokens&lt;/strong&gt;, and &lt;strong&gt;107 output tokens&lt;/strong&gt; for local Gemma 3 4B. The child span measured about &lt;strong&gt;0.48 ms&lt;/strong&gt; of bridge-side structural validation. This is a separate request from the earlier 8.5-second blend and the accepted branch above. These are individual observations on my machine, not a benchmark or a measure of usefulness.&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%2Fxsmfdofh74z48cuj7jh0.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%2Fxsmfdofh74z48cuj7jh0.png" alt="A real Sentry trace showing local Gemma generation, validation, token counts and no captured input" width="585" height="702"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The integration exposed two mistakes. Provider-side enrichment initially added location fields, so I added explicit IP anonymization and recursive server-side scrubbing, then checked the stored result. Review also caught a validation span starting after the check; moving the check inside it made that timing meaningful. The screenshot uses a fresh trace after both fixes. Uploaded events contain technical metadata, with idea text, prompts, outputs and raw errors excluded.&lt;/p&gt;

&lt;p&gt;There is no hosted model API charge for those tokens: inference runs locally. Hardware, electricity, and the operator's Sentry plan are separate costs, not measured by this trace. Turning monitoring off and restarting the bridge stops new telemetry; removing the adapter needs no garden migration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;The core interaction can run on a machine the user controls. Ollama generation stays behind a loopback-only bridge. Scraps live in the browser, and the app needs no end-user account or hosted inference API. Optional Sentry monitoring sends technical metadata only when the operator enables it; local generation, saved gardens, and backups work with it off.&lt;/p&gt;

&lt;p&gt;Initial dependency and model downloads still need a connection and explicit setup. The optional browser-model download contacts the disclosed model hosting endpoints. The offline sample contains recordings rather than weights or live inference.&lt;/p&gt;

&lt;p&gt;Open weights made it possible to compare model sizes locally and keep the failed experiments inspectable. Open application code makes the rest inspectable too: the prompt, validator, pairing rules, storage boundaries, and record of what actually ran. The model licence remains separate from the code licence.&lt;/p&gt;

&lt;p&gt;Compost Club is an experimental local application. It offers a small next step: put two unfinished thoughts together, read one possibility, and decide whether to keep it. Then close the tab. The garden can wait.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma&lt;/strong&gt; — Gemma provides the central idea-blending interaction through genuine local Ollama runs, including Echo Cartography. The separate offline sample replays exact Gemma 3 4B results.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of GitHub Copilot&lt;/strong&gt; — entered through the &lt;strong&gt;GitHub Actions automation route&lt;/strong&gt; explicitly listed in the &lt;a href="https://dev.to/challenges/hf26"&gt;published category criteria&lt;/a&gt;. Repository checks automate builds, standalone packaging and Chromium acceptance; the linked workflow and successful run show the actual use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Sentry Agent Tracing&lt;/strong&gt; — the optional local-model integration records real timings and token counts. The trace screenshot, privacy fixes, validation-timing correction and setup/removal notes above show how it is used.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;AI assistance was used in implementation, testing, documentation, and preparing this article and demo. Numerical claims above come from the repository's recorded experiments and verification reports. Creative usefulness remains a human judgment.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Demo audio credits: “Somewhere Sunny (ver 2)” by Kevin MacLeod (&lt;a href="https://incompetech.com/music/royalty-free/index.html?isrc=USUAN1100567" rel="noopener noreferrer"&gt;incompetech.com&lt;/a&gt;), downloaded from &lt;a href="https://commons.wikimedia.org/wiki/File:Somewhere_Sunny_%28ver_2%29_%28ISRC_USUAN1100567%29.mp3" rel="noopener noreferrer"&gt;Wikimedia Commons&lt;/a&gt;, licensed under &lt;a href="https://creativecommons.org/licenses/by/3.0/" rel="noopener noreferrer"&gt;CC BY 3.0&lt;/a&gt;. Edited excerpt with reduced volume, ducking, and fades. Narration: &lt;a href="https://huggingface.co/hexgrad/Kokoro-82M" rel="noopener noreferrer"&gt;Kokoro-82M&lt;/a&gt;, Apache-2.0 model distribution, rendered locally with the MIT-licensed &lt;a href="https://github.com/thewh1teagle/kokoro-onnx" rel="noopener noreferrer"&gt;kokoro-onnx&lt;/a&gt; runtime.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>gemma</category>
      <category>opensource</category>
    </item>
    <item>
      <title>PatchPitch: local Gemma turns patch notes into devlogs and social posts</title>
      <dc:creator>Dreven</dc:creator>
      <pubDate>Sun, 18 Oct 2026 23:42:26 +0000</pubDate>
      <link>https://dev.to/drevendev/patchpitch-your-product-deserves-a-great-story-nao</link>
      <guid>https://dev.to/drevendev/patchpitch-your-product-deserves-a-great-story-nao</guid>
      <description>&lt;p&gt;PatchPitch uses local Gemma to turn release notes into devlogs, community posts and short announcements, with voice presets, optional tags and Markdown export.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Demo · Code · How it works · Sentry trace&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;A game update can be finished and still leave three writing jobs: explain it to returning players, introduce it to a community, and fit one useful thought into a short post.&lt;/p&gt;

&lt;p&gt;I used the real 0.12 patch for &lt;strong&gt;&lt;a href="https://drevengames.itch.io/idle-fantasy-shop" rel="noopener noreferrer"&gt;Idle Fantasy Shop&lt;/a&gt;&lt;/strong&gt;, my cozy browser game about gathering resources, crafting practical goods and keeping a small shop in Latchford. Its workshop gained a crafting plan, its gathering grounds gained a pressure system, and its save instructions needed careful wording. There was a story in those changes. It needed different shapes for different readers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PatchPitch&lt;/strong&gt; is the small local writing studio I built for that job. Select the facts that shipped, choose a format and voice, generate with local Gemma, then review and export Markdown.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Devlog:&lt;/strong&gt; room for the selected topics and important details.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Community post:&lt;/strong&gt; a few useful changes in connected prose.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Short post:&lt;/strong&gt; a 280-character budget including your call to action and suggested tag.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each request writes one version. Warm, Clear and Lively presets steer its voice; an optional writing sample adds your own rhythm. Auto tags are optional suggestions from the product and selected facts. Each format keeps its latest draft and edits in the current tab, so you can switch between them, remove a tag and take the text with you.&lt;/p&gt;

&lt;h3&gt;
  
  
  Who might pay for it?
&lt;/h3&gt;

&lt;p&gt;The buyer I have in mind is a solo developer or small studio that ships regularly and handles its own release communications. Their next update needs a coherent release pack, a careful review and copy they can reuse across channels.&lt;/p&gt;

&lt;p&gt;The first paid offer I would test is a reviewed pack per release: a devlog, a community post and a short announcement. That could begin as a small service using this MIT-licensed tool. A subscription would need evidence that people return for the next update. So far I have used it on my own game; I have no independent customer or payment results, and the app has no checkout.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://drevendev.github.io/PatchPitch/" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Watch the demo and read the generated drafts&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;The recorded demo includes captions and all three complete drafts. &lt;a href="https://drevendev.github.io/PatchPitch/assets/demo.mp4" rel="noopener noreferrer"&gt;Direct 63-second MP4&lt;/a&gt;.&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%2F2rszj0hys8wogptsvgc3.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%2F2rszj0hys8wogptsvgc3.png" alt="PatchPitch with the real Idle Fantasy Shop draft, format, style and suggested tags" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The film shows fact selection, three generated formats, style controls, auto tags, draft switching, source inspection and Markdown export. Generation waits are shortened and labelled.&lt;/p&gt;

&lt;p&gt;It combines two native browser recordings. There were five real model calls across those sessions; three successful outputs are shown. A rejected Community attempt and an unused Short remain in the evidence. No saved response was replayed into either UI, and the model's prose was not rewritten.&lt;/p&gt;

&lt;p&gt;Here is one small detail worth getting right. The technical input distinguishes gathered materials from craftable goods:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;New content counts: 3 gathered raw materials plus 7 craftable goods = 10 new items total. Only the seven goods are craftable.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The full generated devlog says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We have added 10 new items in total, consisting of 3 gathered raw materials and 7 craftable goods.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The short format has a different job. This is its untouched body:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Idle Fantasy Shop now features Crafting Batches in the Workshop. Access requires level 10. Export a backup from Settings before changing devices or clearing browser data.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;With my supplied CTA and Gemma's suggested tag, the post was &lt;strong&gt;252 characters&lt;/strong&gt;. The film removes the tag and exports the remaining text; copy and download match exactly. It keeps Settings and both backup circumstances, while leaving out the full crafting limits. The UI flags unreferenced notes and missing numeric particulars for review.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/drevendev" rel="noopener noreferrer"&gt;
        drevendev
      &lt;/a&gt; / &lt;a href="https://github.com/drevendev/PatchPitch" rel="noopener noreferrer"&gt;
        PatchPitch
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Turn selected changelog facts into a source-linked announcement draft with local Gemma.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;PatchPitch&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Your product deserves a great story.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Turn selected changelog facts into an announcement people understand. Describe
your product and audience, choose what shipped, generate with local Gemma, inspect
the sources, edit and export Markdown. A small writing workflow with a human final edit.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://drevendev.github.io/PatchPitch/" rel="nofollow noopener noreferrer"&gt;Recorded demo&lt;/a&gt; ·
&lt;a href="https://drevendev.github.io/PatchPitch/assets/demo.mp4" rel="nofollow noopener noreferrer"&gt;63-second video&lt;/a&gt; ·
&lt;a href="https://dev.to/drevendev/patchpitch-your-product-deserves-a-great-story-nao" rel="nofollow"&gt;Build story on DEV&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The hosted demo shows real recorded Gemma outputs; generation runs locally using
the setup below.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Run locally&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Python 3.11+ and &lt;a href="https://ollama.com/" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt; are required. Tested on Windows 11
with Python 3.12.14 and Ollama 0.40.6. The source is &lt;a href="https://github.com/drevendev/PatchPitch/LICENSE" rel="noopener noreferrer"&gt;MIT licensed&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight highlight-source-powershell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;python &lt;span class="pl-k"&gt;-&lt;/span&gt;m venv .venv
.\.venv\Scripts\&lt;span class="pl-c1"&gt;python.exe&lt;/span&gt; &lt;span class="pl-k"&gt;-&lt;/span&gt;m pip install &lt;span class="pl-k"&gt;-&lt;/span&gt;r requirements.txt
ollama pull gemma4:12b
.\.venv\Scripts\&lt;span class="pl-c1"&gt;python.exe&lt;/span&gt; &lt;span class="pl-k"&gt;-&lt;/span&gt;m uvicorn patchpitch.app:app &lt;span class="pl-k"&gt;--&lt;/span&gt;host &lt;span class="pl-c1"&gt;127.0&lt;/span&gt;.&lt;span class="pl-c1"&gt;0.1&lt;/span&gt; &lt;span class="pl-k"&gt;--&lt;/span&gt;port &lt;span class="pl-c1"&gt;8000&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Start Ollama, then open &lt;strong&gt;&lt;a href="http://127.0.0.1:8000" rel="nofollow noopener noreferrer"&gt;http://127.0.0.1:8000&lt;/a&gt;&lt;/strong&gt;. On Linux/macOS use
&lt;code&gt;.venv/bin/python&lt;/code&gt; in place of &lt;code&gt;.venv\Scripts\python.exe&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The upstream is fixed to &lt;code&gt;127.0.0.1:11434&lt;/code&gt;. Set &lt;code&gt;PATCHPITCH_MODEL&lt;/code&gt; to an…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/drevendev/PatchPitch" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;a href="https://github.com/drevendev/PatchPitch" rel="noopener noreferrer"&gt;drevendev/PatchPitch&lt;/a&gt; — &lt;strong&gt;MIT&lt;/strong&gt;. The verified implementation is &lt;a href="https://github.com/drevendev/PatchPitch/commit/38619a887fe1109631a9825f6cd1ba8f6c32d0c9" rel="noopener noreferrer"&gt;38619a8&lt;/a&gt;; its &lt;a href="https://github.com/drevendev/PatchPitch/actions/runs/39177318747" rel="noopener noreferrer"&gt;GitHub Actions run&lt;/a&gt; passed &lt;strong&gt;121 tests&lt;/strong&gt;. Automated tests use mocked inference or an offline transport; the recorded model calls are separate evidence.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/drevendev/PatchPitch#run-locally" rel="noopener noreferrer"&gt;README&lt;/a&gt; has the setup commands: Python 3.11+, Ollama, the selected Gemma model and the pinned Python requirements. The app runs at &lt;code&gt;127.0.0.1:8000&lt;/code&gt;; Ollama stays on loopback. The 12B default needs enough local memory, and another model needs its own writing-quality check.&lt;/p&gt;

&lt;p&gt;The film was recorded on 78e44f8. Later changes add the example-loading fix, optional Sentry tracing and a curly-apostrophe validation fix; its prompts and generated words are unchanged. A hosted recording is a way to inspect the product; real generation runs locally.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;FastAPI, Pydantic and vanilla HTML/CSS/JavaScript handle the flow. Unchecked notes stay out of the model payload. Gemma receives selected factual units, a separate voice brief and a JSON schema for the response. Source IDs connect the result to the notes a person can inspect.&lt;/p&gt;

&lt;p&gt;I prepared the example notes from Idle Fantasy Shop's actual &lt;strong&gt;0.11.1 → 0.12 code patch&lt;/strong&gt;, with commit and file references. PatchPitch receives those notes; automatic Git import is still backlog. The tone brief comes from in-game item descriptions. The &lt;a href="https://drevengames.itch.io/idle-fantasy-shop/devlog/1714671/title-012-plan-a-little-let-the-fields-rest" rel="noopener noreferrer"&gt;original devlog&lt;/a&gt; was comparison material only: its prose is absent from the model input.&lt;/p&gt;

&lt;p&gt;The recorded model was &lt;strong&gt;gemma4:12b&lt;/strong&gt; through Ollama 0.40.6, using direct generation for all three formats. The selected requests took &lt;strong&gt;74.7s for Devlog, 12.7s for Community and 4.5s for Short&lt;/strong&gt; on this machine. Those are observations, not a speed promise.&lt;/p&gt;

&lt;p&gt;Real attempts exposed useful failures: a draft called all ten items craftable, another dropped backup circumstances, and a wording check rejected queue capacity as if it promised simultaneous work. I clarified the source notes and improved the schema, prompts and targeted checks. In the full devlog, each assigned source ID is emitted before its paragraph to keep topics in their own slots. Failed and rejected attempts are retained.&lt;/p&gt;

&lt;p&gt;These checks establish structure, budgets and specific wording constraints. They cannot establish semantic truth. The full draft covers all eight selected topics, but parts are more functional than the original devlog's warmer editorial writing. The result still says &lt;strong&gt;Draft — review before publishing&lt;/strong&gt;. Source inspection and the maker's final edit belong in the workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Seeing where the time goes with Sentry
&lt;/h3&gt;

&lt;p&gt;Optional Sentry instrumentation records the generation, actual Ollama call and validation. A separate real run on the public fictional Pocket Orchard example produced this trace:&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%2Fn55j5puy3e4f6gggm1sl.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%2Fn55j5puy3e4f6gggm1sl.png" alt="Real Sentry trace: model call, validation, returned model and token usage" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The model call took &lt;strong&gt;15.064s&lt;/strong&gt;; validation took &lt;strong&gt;4.015ms&lt;/strong&gt;. Ollama reported &lt;strong&gt;gemma4:12b&lt;/strong&gt;, &lt;strong&gt;1,590 input tokens&lt;/strong&gt; and &lt;strong&gt;302 output tokens&lt;/strong&gt;. Almost all the recorded time went into the model request. No metered inference API was used; local hardware and electricity still have a cost. Sentry's comparison badge reflects these diagnostic samples, not a controlled benchmark.&lt;/p&gt;

&lt;p&gt;A separate &lt;strong&gt;CONTROLLED_FAILURE&lt;/strong&gt; fed a saved draft containing a TODO placeholder into validation. It produced &lt;code&gt;invalid_draft&lt;/code&gt; and a linked error event, with no fabricated inference span.&lt;/p&gt;

&lt;p&gt;The SDK is off without an explicit DSN. Automatic integrations are disabled, and events plus final transport envelopes use a small metadata allowlist. I inspected the actual HTTP bodies for source notes, output prose and private context. Received-event review also caught Sentry's IP-derived geography enrichment: I enabled IP scrubbing and explicit geo removal, then verified a fresh validation-only event had no User/Geography context. The trace and checks were captured separately after the film.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;The open-weight model does the actual writing. Once its weights and the application are installed, the writing flow can run locally without a hosted copywriting API. Upcoming changes and an unpublished tone sample can stay on the developer's machine. Fonts are local too; Sentry is a separate opt-in metadata export.&lt;/p&gt;

&lt;p&gt;The prompt, schema and adapter are inspectable. I could change generation settings and investigate failed responses while keeping the writing step local. The model is replaceable, although equal output quality would need testing. Gemma's weights are downloaded separately and are not relicensed by PatchPitch's MIT license.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/drevendev/BeautifulRepo/blob/master/guides/release-notes.md" rel="noopener noreferrer"&gt;BeautifulRepo's release-note guide&lt;/a&gt; informed the reader-first approach and attention to limitations; attribution is retained. Codex assisted development and the write-up. The film uses local Kokoro narration and original procedural music.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma:&lt;/strong&gt; real local inference writes all three formats.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of GitHub Copilot, via GitHub Actions:&lt;/strong&gt; the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;category explicitly includes Actions automation&lt;/a&gt;. &lt;a href="https://github.com/drevendev/PatchPitch/blob/38619a887fe1109631a9825f6cd1ba8f6c32d0c9/.github/workflows/tests.yml" rel="noopener noreferrer"&gt;Our test workflow&lt;/a&gt; runs unit, API and browser checks on pushes and pull requests. &lt;a href="https://github.com/drevendev/PatchPitch/blob/3d1448dde710ab94c9698c9c2cce7a34e4f8285a/.github/workflows/pages.yml" rel="noopener noreferrer"&gt;Our manually dispatched Pages workflow&lt;/a&gt; publishes the approved demo. Codex was the coding assistant.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Sentry Agent Tracing:&lt;/strong&gt; real model and validation spans, observed latency and tokens, a labelled controlled error, and an inspected privacy finding.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Which part of release writing takes you longest: choosing what to include, checking the facts, or adapting the same update for different channels? I would like to hear how you handle it today.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your product deserves a great story.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
