<?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: German Peña</title>
    <description>The latest articles on DEV Community by German Peña (@german_pea_245e7972251c4).</description>
    <link>https://dev.to/german_pea_245e7972251c4</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%2F4106393%2F4713c408-8d97-4d24-beb3-d8ed4749bb35.png</url>
      <title>DEV Community: German Peña</title>
      <link>https://dev.to/german_pea_245e7972251c4</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/german_pea_245e7972251c4"/>
    <language>en</language>
    <item>
      <title>loopwork: The AI proposes, you decide — a local coding workshop inside the chat</title>
      <dc:creator>German Peña</dc:creator>
      <pubDate>Wed, 21 Oct 2026 21:21:15 +0000</pubDate>
      <link>https://dev.to/german_pea_245e7972251c4/loopwork-the-ai-proposes-you-decide-a-local-coding-workshop-inside-the-chat-8bj</link>
      <guid>https://dev.to/german_pea_245e7972251c4/loopwork-the-ai-proposes-you-decide-a-local-coding-workshop-inside-the-chat-8bj</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission 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;&lt;strong&gt;loopwork&lt;/strong&gt; is a local workshop for files and code that lives &lt;strong&gt;inside the chat&lt;/strong&gt; of DeepSeek, ChatGPT, Gemini and Claude. The AI never touches your disk: it only receives what you explicitly share, and its answers arrive as a &lt;strong&gt;diff you review, approve or reject&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Virtual disk (OPFS) or a real folder on your PC, with full ZIP export.&lt;/li&gt;
&lt;li&gt;Editor with highlighting, search/replace, live HTML preview, and a &lt;strong&gt;mandatory diff before saving&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Local Git with buttons or commands (&lt;code&gt;init&lt;/code&gt;, &lt;code&gt;add&lt;/code&gt;, &lt;code&gt;commit&lt;/code&gt;, &lt;code&gt;diff&lt;/code&gt;, &lt;code&gt;branch&lt;/code&gt;, &lt;code&gt;checkout&lt;/code&gt;, &lt;code&gt;restore&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Per-file checkpoints before any destructive operation, plus recovery after interrupted browser closes.&lt;/li&gt;
&lt;li&gt;Bash-style project commands: &lt;code&gt;mkdir -p app/{src,docs}&lt;/code&gt;, &lt;code&gt;touch&lt;/code&gt;, &lt;code&gt;tree&lt;/code&gt;, &lt;code&gt;mktree&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Multi-step &lt;code&gt;undo&lt;/code&gt;/&lt;code&gt;redo&lt;/code&gt; that survives page reloads.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Who gets to be lazier?&lt;/strong&gt; Anyone who codes with an AI chat and is tired of copy-pasting blocks by hand. With loopwork: share a file → the AI replies with a &lt;code&gt;dv&lt;/code&gt; block → click &lt;strong&gt;Review patch&lt;/strong&gt; → click &lt;strong&gt;Apply&lt;/strong&gt;. A checkpoint is created and the SHA256 is verified before writing. If the file changed since the AI saw it, the proposal is rejected. Zero copy-paste, zero silent changes.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live page with screenshots and GIFs:&lt;/strong&gt; &lt;a href="https://germanpet-svg.github.io/loopwork/" rel="noopener noreferrer"&gt;https://germanpet-svg.github.io/loopwork/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full user manual (step by step, 16 sections, command reference):&lt;/strong&gt; &lt;a href="https://germanpet-svg.github.io/loopwork/manual.md" rel="noopener noreferrer"&gt;https://germanpet-svg.github.io/loopwork/manual.md&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The page runs inside a real chat (Gemini, in the screenshot there) and walks through the full cycle: share → propose → review → apply → run → commit.&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/germanpet-svg" rel="noopener noreferrer"&gt;
        germanpet-svg
      &lt;/a&gt; / &lt;a href="https://github.com/germanpet-svg/loopwork" rel="noopener noreferrer"&gt;
        loopwork
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Entorno de edición y versionado 100% local en el navegador. Edita archivos, ejecuta código y colabora con IA sin subir nada a ningún servidor. OPFS + Git + WebAssembly.
    &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;loopwork&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Taller local de archivos y código asistido por IA dentro de DeepSeek, ChatGPT, Gemini y Claude.&lt;/strong&gt;
Userscript basado en OPFS y Git: la IA propone, el usuario revisa y aprueba.&lt;/p&gt;
&lt;p&gt;Versión actual: &lt;strong&gt;1.15.0&lt;/strong&gt;. &lt;strong&gt;135 pruebas Node&lt;/strong&gt; más una suite nueva en &lt;code&gt;tests/&lt;/code&gt; (121 pruebas: traducciones, análisis de código y e2e en Chromium)
Es un prototipo funcional, no un IDE completo ni un sistema de respaldo externo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Documentación:&lt;/strong&gt; &lt;a href="https://github.com/germanpet-svg/loopwork/./manual.md" rel="noopener noreferrer"&gt;Manual del usuario&lt;/a&gt; (paso a paso) ·
&lt;a href="https://github.com/germanpet-svg/loopwork/./roadmap.md" rel="noopener noreferrer"&gt;Roadmap&lt;/a&gt; (estado y pendientes) · &lt;a href="https://github.com/germanpet-svg/loopwork/./index.html" rel="noopener noreferrer"&gt;Portada del proyecto&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;En 60 segundos&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Instala &lt;a href="https://www.tampermonkey.net/" rel="nofollow noopener noreferrer"&gt;Tampermonkey&lt;/a&gt; y pega
&lt;a href="https://github.com/germanpet-svg/loopwork/./loopwork.js" rel="noopener noreferrer"&gt;loopwork.js&lt;/a&gt; en un script nuevo.&lt;/li&gt;
&lt;li&gt;Abre DeepSeek (o ChatGPT / Gemini / Claude, experimentales): aparece el panel flotante.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nuevo archivo…&lt;/strong&gt; → pega tu código → &lt;strong&gt;Compartir archivo…&lt;/strong&gt; → pide un cambio.&lt;/li&gt;
&lt;li&gt;En la respuesta pulsa &lt;strong&gt;Revisar parche en DV&lt;/strong&gt;, mira el diff y &lt;strong&gt;Aplicar cambios&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ejecutar&lt;/strong&gt; para probar y &lt;strong&gt;Guardar cambios en Git&lt;/strong&gt; para versionar.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Todo…&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/germanpet-svg/loopwork" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The complete userscript is in &lt;a href="https://github.com/germanpet-svg/loopwork/blob/main/loopwork.js" rel="noopener noreferrer"&gt;&lt;code&gt;loopwork.js&lt;/code&gt;&lt;/a&gt;. The &lt;code&gt;extension/&lt;/code&gt; folder contains the Chrome extension variant.&lt;/p&gt;

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

&lt;p&gt;loopwork is a &lt;strong&gt;userscript&lt;/strong&gt; (~11k lines of plain JavaScript, no build) injected into four chat sites via Tampermonkey, plus an &lt;strong&gt;equivalent Chromium extension&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Three layers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Storage&lt;/strong&gt;: OPFS or the File System Access API. Same &lt;code&gt;FileSystemDirectoryHandle&lt;/code&gt; interface for both.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Atomic writes&lt;/strong&gt;: each write goes to &lt;code&gt;.dv_tmp/&amp;lt;uuid&amp;gt;.tmp&lt;/code&gt;, verifies SHA256, logs &lt;code&gt;PREPARED&lt;/code&gt; to &lt;code&gt;.dv/journal.jsonl&lt;/code&gt;, writes the target, verifies, logs &lt;code&gt;COMMITTED&lt;/code&gt;, then deletes the temporary file. On startup, &lt;code&gt;recoverTransactions()&lt;/code&gt; completes, reverts, or saves the approved version aside.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Isolated UI&lt;/strong&gt;: a panel in a closed &lt;code&gt;shadowRoot&lt;/code&gt;, with a capture-phase keyboard guard so ChatGPT doesn't steal focus into its composer.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Open AI at the core:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DeepSeek and GitHub Copilot collaborated as AI tools on ideas, code, docs and tests. No sponsorship or affiliation implied.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;&lt;code&gt;dv&lt;/code&gt; protocol&lt;/strong&gt; is an open JSON (&lt;code&gt;path&lt;/code&gt;, &lt;code&gt;hash&lt;/code&gt;, &lt;code&gt;operation&lt;/code&gt;, &lt;code&gt;old&lt;/code&gt;, &lt;code&gt;new&lt;/code&gt;, optional &lt;code&gt;patch&lt;/code&gt; or &lt;code&gt;changes[]&lt;/code&gt;). Any LLM can emit it; any client can consume it.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;SHA256 verified before applying&lt;/strong&gt; is what makes it possible to trust an LLM without a closed API: I don't need the model to be deterministic, only for its proposal to be tied to an exact file version.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No server: the only network requests are &lt;code&gt;isomorphic-git&lt;/code&gt; and &lt;code&gt;diff&lt;/code&gt; from jsDelivr at install (or bundled in the extension).&lt;/p&gt;

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

&lt;p&gt;loopwork &lt;strong&gt;could not exist as a closed API&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The disk is yours.&lt;/strong&gt; OPFS and File System Access need no backend. A closed service would have to custody your files in its cloud.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The protocol is open and documented.&lt;/strong&gt; Anyone can write a client that speaks &lt;code&gt;dv&lt;/code&gt;, or a model that emits it. If a provider disappears, the format keeps working.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The SHA256 hash is the guarantee.&lt;/strong&gt; I trust the model because every proposal is tied to an exact hash of the file it saw — not because the provider promises determinism.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The AI doesn't touch the disk.&lt;/strong&gt; The design &lt;strong&gt;makes silent changes impossible&lt;/strong&gt;, even if the model tries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open distribution.&lt;/strong&gt; An 11k-line userscript fits in one file, can be audited, and can be forked.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The live page shows loopwork running &lt;strong&gt;inside Gemini&lt;/strong&gt;, with nothing installed outside the browser: same userscript, same protocol, same editor and same local Git as in DeepSeek, ChatGPT or Claude. &lt;strong&gt;The same client talks to any LLM&lt;/strong&gt; because the contract (hash + diff + approval) does not depend on the provider.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Lazy Payoff
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Copy-pasting code:&lt;/strong&gt; ~15–20 times per session × ~10 s = &lt;strong&gt;~3 min/session&lt;/strong&gt;, and &lt;strong&gt;hours per month&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reviewing what the AI changed:&lt;/strong&gt; a 2–3 s read of the patch instead of re-reading the whole file. &lt;strong&gt;~10× faster.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recovering a broken file:&lt;/strong&gt; one &lt;code&gt;!restore&lt;/code&gt; instead of going back to a commit or losing work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mid-save browser closes:&lt;/strong&gt; &lt;code&gt;recoverTransactions()&lt;/code&gt; decides on startup. &lt;strong&gt;Zero broken files&lt;/strong&gt; in daily use.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Did I use it this week?&lt;/strong&gt; Yes — it's my daily tool for writing loopwork itself: the 11k lines have been edited, versioned and tested inside loopwork, with DeepSeek and Copilot emitting &lt;code&gt;dv&lt;/code&gt; proposals I review with the editor. Pure &lt;strong&gt;dogfooding&lt;/strong&gt;.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of an Open-Weight Model&lt;/strong&gt; — &lt;code&gt;dv&lt;/code&gt; is model-agnostic; tested with DeepSeek and Copilot.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Developer Tool&lt;/strong&gt; — mandatory diff + checkpoints are the heart.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Most Innovative Use of AI&lt;/strong&gt; — SHA256 as a verifiable contract between LLM and disk.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Open Source&lt;/strong&gt; — &lt;code&gt;isomorphic-git&lt;/code&gt;, &lt;code&gt;diff&lt;/code&gt;, native Compression/Decompression Streams.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Thanks for reading. If it's useful, leave a comment or open an issue on the repo.&lt;/em&gt;&lt;/p&gt;

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