<?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: Mario Gutierrez</title>
    <description>The latest articles on DEV Community by Mario Gutierrez (@terrizoaguimor).</description>
    <link>https://dev.to/terrizoaguimor</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%2F3880854%2F56d8a0a4-d491-4869-8f35-908d1b3d2b95.jpeg</url>
      <title>DEV Community: Mario Gutierrez</title>
      <link>https://dev.to/terrizoaguimor</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/terrizoaguimor"/>
    <language>en</language>
    <item>
      <title>PISCA: I turned an Andean breakfast soup into an interactive landscape</title>
      <dc:creator>Mario Gutierrez</dc:creator>
      <pubDate>Thu, 30 Jul 2026 19:09:35 +0000</pubDate>
      <link>https://dev.to/terrizoaguimor/pisca-i-turned-an-andean-breakfast-soup-into-an-interactive-landscape-18j8</link>
      <guid>https://dev.to/terrizoaguimor/pisca-i-turned-an-andean-breakfast-soup-into-an-interactive-landscape-18j8</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/frontend-2026-07-29"&gt;Frontend Challenge: Comfort Food Edition, Perfect Landing&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;PISCA is an interactive, bilingual landing page about &lt;strong&gt;pisca andina&lt;/strong&gt;, a family of breakfast soups from the Venezuelan Andes.&lt;/p&gt;

&lt;p&gt;I did not want to build a generic food landing page and swap in a regional dish at the end. The page had to feel specific to pisca: a cold mountain morning, a clay bowl, simple ingredients, and the first warmth of the day.&lt;/p&gt;

&lt;p&gt;That led to the central image. The soup is the only warm light source in a dark pre-dawn landscape, and its steam becomes the ridgelines of the Andes. The rest of the page follows the same idea: the landscape becomes an ingredient map, then resolves into a practical recipe.&lt;/p&gt;

&lt;p&gt;The page is available in English and Spanish. Changing the language preserves the visitor's warmth setting, scroll position, and selected number of portions.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;&lt;a href="https://pisca-dev-challenge.pages.dev/" rel="noopener noreferrer"&gt;Open the production build on Cloudflare Pages&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/editor/Mario-Guti-rrez-the-bold/embed/019fb417-53e0-7f2d-aa29-2e89f319f3f9?height=600&amp;amp;default-tab=result&amp;amp;height=600&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  One interaction, one purpose
&lt;/h2&gt;

&lt;p&gt;The hero contains a range control called &lt;strong&gt;Warm the morning&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It moves through three states:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mountain mist&lt;/li&gt;
&lt;li&gt;First steam&lt;/li&gt;
&lt;li&gt;Bowl passed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Moving the control raises the sun, warms the sky, strengthens the light around the bowl, and redraws the steam. Every response belongs to the same cause. I deliberately avoided a collection of unrelated hover effects and reveal animations.&lt;/p&gt;

&lt;p&gt;The default state is complete without interaction. Keyboard, touch, and pointer input all reach the same result. When a visitor requests reduced motion, the ambient loop disappears, but the warmth control remains functional.&lt;/p&gt;

&lt;h2&gt;
  
  
  The design decisions that mattered
&lt;/h2&gt;

&lt;h3&gt;
  
  
  I rejected the usual food-site palette
&lt;/h3&gt;

&lt;p&gt;My first direction was too familiar: cream background, serif headline, terracotta accent. It could have described almost any restaurant or recipe.&lt;/p&gt;

&lt;p&gt;PISCA instead begins in a high-altitude blue. Warm yellow is reserved for the soup and the dawn it creates. The palette has six named roles: &lt;em&gt;Páramo&lt;/em&gt;, &lt;em&gt;Niebla&lt;/em&gt;, &lt;em&gt;Caldo&lt;/em&gt;, &lt;em&gt;Cilantro&lt;/em&gt;, &lt;em&gt;Arcilla&lt;/em&gt;, and &lt;em&gt;Leche&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  I drew the subject instead of searching for a hero photo
&lt;/h3&gt;

&lt;p&gt;The bowl, ingredients, steam, mountains, and material marks are original SVG and CSS work. There are no remote raster images in the production page.&lt;/p&gt;

&lt;p&gt;That choice was not only about originality. A stock photograph would have made one recipe look definitive. Pisca is a family of Andean soups, and published versions differ. The page clearly presents one white, family-style variation rather than claiming a single canonical recipe.&lt;/p&gt;

&lt;h3&gt;
  
  
  I made the ingredient section spatial, not sequential
&lt;/h3&gt;

&lt;p&gt;An early version placed decorative numbers on ingredient cards. That implied an order the ingredients did not have.&lt;/p&gt;

&lt;p&gt;The final version turns them into an annotated contour basin around the bowl. Sequence appears only where it belongs: in the cooking method.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;The canonical project is a small Vite and TypeScript build with no UI framework.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Content lives separately from interaction logic.&lt;/li&gt;
&lt;li&gt;The language switch updates the document language and accessible names.&lt;/li&gt;
&lt;li&gt;Portion controls scale quantities from two to eight servings.&lt;/li&gt;
&lt;li&gt;CSS custom properties carry the warmth state into the illustration.&lt;/li&gt;
&lt;li&gt;Fonts are self-hosted and split by Unicode range.&lt;/li&gt;
&lt;li&gt;A deterministic build task converts the production artifact into the three files used by the CodePen version.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The CodePen is therefore not a hand-maintained imitation. It is generated from the same implementation deployed to Cloudflare Pages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Accessibility and verification
&lt;/h2&gt;

&lt;p&gt;I treated accessibility as part of the interaction design, not as a cleanup pass.&lt;/p&gt;

&lt;p&gt;The page includes semantic landmarks, a logical heading structure, visible focus, a skip link, bilingual accessible labels, a named illustration, keyboard-operable controls, and a reduced-motion route.&lt;/p&gt;

&lt;p&gt;Before this draft, the project passed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;strict TypeScript checking and linting with warnings denied&lt;/li&gt;
&lt;li&gt;9/9 contest-specific checks&lt;/li&gt;
&lt;li&gt;40/40 Playwright tests across desktop Chrome, mobile Chrome, reduced-motion Chrome, and desktop Firefox&lt;/li&gt;
&lt;li&gt;automated Axe checks in English and Spanish with no violations detected in the selected WCAG A/AA rule sets&lt;/li&gt;
&lt;li&gt;horizontal-overflow, language-state, portion-boundary, and warmth-state checks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those results are automation evidence, not a claim of universal accessibility. A manual screen-reader pass and Safari/WebKit verification remain on my checklist.&lt;/p&gt;

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

&lt;p&gt;The strongest change came from asking whether the hero interaction could explain the subject instead of merely decorating it.&lt;/p&gt;

&lt;p&gt;Once the visitor could warm the morning, several smaller effects became unnecessary. The page became clearer because one metaphor took responsibility for the color, motion, illustration, and status text.&lt;/p&gt;

&lt;p&gt;I also found a real mobile grid overflow during visual inspection. Automated checks confirmed the behavior, but looking at the full composition at 390 pixels exposed the layout problem. Both forms of testing mattered.&lt;/p&gt;

&lt;h2&gt;
  
  
  Originality and AI use
&lt;/h2&gt;

&lt;p&gt;I began this project after the challenge opened. The visual concept, SVG artwork, interface, bilingual content system, and CodePen conversion were created for this submission.&lt;/p&gt;

&lt;p&gt;I used AI tools for research assistance, implementation support, and iterative quality review. I made the concept, editorial direction, final selection, verification, and submission decisions, and I reviewed and tested the output before using it.&lt;/p&gt;

&lt;p&gt;The cultural and recipe context was checked against:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.venezuelatuya.com/cocina/pisca_andina.htm" rel="noopener noreferrer"&gt;Venezuela Tuya: La Pisca Andina&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iberculturaviva.org/es/sabores-migrantes-2021-floralicia-oropeza-morales-la-pisca-andina-y-la-arepa-de-maiz-venezolana/" rel="noopener noreferrer"&gt;IberCultura Viva: Sabores Migrantes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;PISCA is my attempt to make a regional breakfast feel like a place before it reads like a recipe.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>frontendchallenge</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>I Built a Multilingual Interactive Novel with Rust — ADHD Made Continuity the Hardest Part</title>
      <dc:creator>Mario Gutierrez</dc:creator>
      <pubDate>Sun, 26 Jul 2026 02:25:18 +0000</pubDate>
      <link>https://dev.to/terrizoaguimor/i-built-a-multilingual-interactive-novel-with-rust-adhd-made-continuity-the-hardest-part-14a0</link>
      <guid>https://dev.to/terrizoaguimor/i-built-a-multilingual-interactive-novel-with-rust-adhd-made-continuity-the-hardest-part-14a0</guid>
      <description>&lt;p&gt;Ideas are not the scarce resource for me.&lt;/p&gt;

&lt;p&gt;Returning to an idea without losing its emotional logic, technical decisions, names, dates, and unfinished questions is much harder.&lt;/p&gt;

&lt;p&gt;I live with ADHD. Starting an ambitious project can feel natural; holding its entire continuity in working memory for months does not. I can see a flooded city, a biomechanical implant, a character, and a complete scene with painful clarity—and then return days later unable to reconstruct why one small decision mattered.&lt;/p&gt;

&lt;p&gt;That is how &lt;strong&gt;&lt;a href="https://lanovenamarea.com" rel="noopener noreferrer"&gt;La Novena Marea&lt;/a&gt;&lt;/strong&gt; stopped being only a manuscript and became a system.&lt;/p&gt;

&lt;p&gt;It is a serialized, illustrated hydropunk novel set in 2648. The polar collapse did not cover the whole planet, but it destroyed the old idea of a stable coastline. Humanity survived through floating communities, conservative biomechanical adaptations, distributed intelligence, and uneasy coexistence with nonhuman civilizations that had hidden among us for centuries.&lt;/p&gt;

&lt;p&gt;The website currently publishes the story in Spanish, English, and Brazilian Portuguese. It includes a prologue, the first chapter, a glossary, a technical world compendium, and an interactive atlas.&lt;/p&gt;

&lt;p&gt;But the most important thing I built was not a page.&lt;/p&gt;

&lt;p&gt;It was a way to return.&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%2F3knjx1r1dgdehw0y60ws.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3knjx1r1dgdehw0y60ws.webp" alt="Iria Salvat listens to an impossible transmission inside a rain-soaked structure in San Telmo." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Iria Salvat receives a signal attributed to an intelligence that has been officially silent for forty-two years.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A novel can become a software architecture problem
&lt;/h2&gt;

&lt;p&gt;The normal advice for publishing fiction online is reasonable: choose a CMS, install a theme, and start posting.&lt;/p&gt;

&lt;p&gt;That was not enough for what I wanted.&lt;/p&gt;

&lt;p&gt;The prose needed to remain readable without JavaScript. Every language needed its own static routes, metadata, canonical links, and social cards. Illustrations had to participate in the storytelling instead of behaving like decoration. Motion could add atmosphere, but it could never hold the text hostage. The atlas had to explain relationships between a signal, its origin, an altered route, and a community at risk.&lt;/p&gt;

&lt;p&gt;I also wanted the technology to reflect the same principle as the world: survival through systems that remain understandable when one layer fails.&lt;/p&gt;

&lt;p&gt;So I built the project around two frameworks I have been developing: &lt;strong&gt;PliegoRS&lt;/strong&gt; and &lt;strong&gt;PliegoCSS&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The current responsibility boundary looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Spanish canonical manuscript
          ↓
PliegoRS
content · routes · semantic HTML · metadata · hreflang
          ↓
PliegoCSS
compiled structural CSS · no browser runtime
          ↓
JavaScript adapter
progressive motion · Atlas WebGL · newsletter enhancement
          ↓
Cloudflare Pages + Workers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PliegoRS is the Rust-based publishing layer. It owns the content model, routes, HTML, structured metadata, localized surfaces, and build receipt.&lt;/p&gt;

&lt;p&gt;PliegoCSS compiles the structural style contract into standard CSS. The build checks that every emitted &lt;code&gt;pc_*&lt;/code&gt; class actually exists in the compiled stylesheet. A matching version string is not considered enough evidence; the HTML and CSS must agree.&lt;/p&gt;

&lt;p&gt;JavaScript is an adapter, not the owner of the book. If it fails, the prose, navigation, glossary, and static Atlas records still exist.&lt;/p&gt;

&lt;p&gt;That separation became one of the most useful accommodations I made for myself. When I return to the project, I do not have to rediscover which layer is allowed to make a decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  Responsive images are also narrative direction
&lt;/h2&gt;

&lt;p&gt;One of the first painful mistakes appeared on a 13-inch iPad Pro.&lt;/p&gt;

&lt;p&gt;The images were technically responsive. They had &lt;code&gt;srcset&lt;/code&gt;, large sources, and fluid dimensions. They were also wrong.&lt;/p&gt;

&lt;p&gt;A crop that looked cinematic on a phone could remove the direction of a character's gaze on a tablet. A large illustration could overlap the glossary because its layout context was incorrect. Two characters could appear together without looking at one another, turning an emotional scene into something uncanny.&lt;/p&gt;

&lt;p&gt;I learned that image responsiveness is not only resolution selection. It is art direction.&lt;/p&gt;

&lt;p&gt;The project now uses separate 16:9, 4:5, and 9:16 compositions where the scene requires them. Narrative illustrations ship with 1920- and 3840-pixel derivatives. Technical plates use &lt;code&gt;object-fit: contain&lt;/code&gt; because cutting away a mechanism would also cut away information.&lt;/p&gt;

&lt;p&gt;The current QA matrix exercises 21 indexable surfaces across six viewport configurations—126 route and viewport combinations—covering desktop, mobile, short landscape, and both orientations of an emulated 13-inch iPad Pro.&lt;/p&gt;

&lt;p&gt;Emulation is not described as hardware proof. That distinction is written into the release criteria.&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%2Fazubvclcx5foxfu49tvq.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fazubvclcx5foxfu49tvq.webp" alt="Humans and members of the Casas Veladas share a public exchange hall after centuries of concealment." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The nonhuman civilizations are neither saviors nor monsters. They are fallible neighbors responsible for the consequences of their silence.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Three.js needed a reason to exist
&lt;/h2&gt;

&lt;p&gt;The first version of the Atlas looked impressive and communicated almost nothing.&lt;/p&gt;

&lt;p&gt;It had depth, a grid, points, and movement. I could interact with it, but I could not explain what the interaction meant.&lt;/p&gt;

&lt;p&gt;That is a design failure, even when the shaders work.&lt;/p&gt;

&lt;p&gt;The Atlas was rebuilt around four questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Where did this signal originate?&lt;/li&gt;
&lt;li&gt;Which route did it alter?&lt;/li&gt;
&lt;li&gt;Which civilization is exposed?&lt;/li&gt;
&lt;li&gt;What is the consequence of acting on incomplete evidence?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Three.js now enhances those relationships. It does not invent them. The same five records remain available as semantic HTML when WebGL, JavaScript, reduced-motion preferences, or data-saving conditions prevent the immersive layer from running.&lt;/p&gt;

&lt;p&gt;That rule—&lt;strong&gt;the effect must explain something already present in the document&lt;/strong&gt;—saved the Atlas from becoming a technology demo inside a novel.&lt;/p&gt;

&lt;p&gt;You can inspect the current instrument in the &lt;strong&gt;&lt;a href="https://lanovenamarea.com/atlas" rel="noopener noreferrer"&gt;Living Atlas&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Translation multiplies decisions, not only words
&lt;/h2&gt;

&lt;p&gt;La Novena Marea is written in Spanish first. Spanish is the canonical narrative source.&lt;/p&gt;

&lt;p&gt;English and Brazilian Portuguese are complete static editions, not runtime dictionary substitutions. IDs, dates, relationships, and evidence levels stay fixed. Titles, dialogue, prose, alternative text, navigation, metadata, and email messages are localized.&lt;/p&gt;

&lt;p&gt;That means a new sentence can affect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;three manuscripts;&lt;/li&gt;
&lt;li&gt;three routes;&lt;/li&gt;
&lt;li&gt;three metadata sets;&lt;/li&gt;
&lt;li&gt;long-word and diacritic behavior;&lt;/li&gt;
&lt;li&gt;headings and image captions;&lt;/li&gt;
&lt;li&gt;the glossary and compendium;&lt;/li&gt;
&lt;li&gt;newsletter messages;&lt;/li&gt;
&lt;li&gt;accessibility text.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The current site has 21 indexable surfaces: seven per language.&lt;/p&gt;

&lt;p&gt;More languages are planned, but adding them all at once would be another form of losing continuity. French is the likely next edition; Chinese and Japanese would require a dedicated CJK typography and editorial pass. Spanish will remain the source of truth.&lt;/p&gt;

&lt;h2&gt;
  
  
  Documentation became an accessibility tool for my own attention
&lt;/h2&gt;

&lt;p&gt;Documentation is often described as something written for another developer.&lt;/p&gt;

&lt;p&gt;In this project, I am also that other developer.&lt;/p&gt;

&lt;p&gt;I maintain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a world bible;&lt;/li&gt;
&lt;li&gt;a glossary;&lt;/li&gt;
&lt;li&gt;a season outline;&lt;/li&gt;
&lt;li&gt;a compendium contract;&lt;/li&gt;
&lt;li&gt;a visual system;&lt;/li&gt;
&lt;li&gt;exact distinctions between facts, official claims, testimony, and unresolved questions;&lt;/li&gt;
&lt;li&gt;a continuity audit that refuses to silently accept changed authority files;&lt;/li&gt;
&lt;li&gt;a release definition that separates automated validation, visual inspection, and real-device evidence.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are not attempts to remove spontaneity. They protect it.&lt;/p&gt;

&lt;p&gt;When I know that the year is recorded, the meaning of an implant is bounded, and an unresolved mystery has not accidentally become a fact, I can spend my attention writing the next scene instead of rebuilding the previous one.&lt;/p&gt;

&lt;p&gt;I also use an AI assistant as a continuity and editorial collaborator. It helps me retrieve decisions, compare localized editions, inspect the implementation, and organize material. It does not get to silently ratify canon. New facts remain proposals until I approve them.&lt;/p&gt;

&lt;p&gt;That boundary matters to me.&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%2Fhimmkcy3npjbjh0iq9u4.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhimmkcy3npjbjh0iq9u4.webp" alt="A field plate documents a bone compass as material, flow, maintenance, and failure—not as unexplained magic." width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Every technology in the compendium needs an origin, material, maintenance burden, access cost, failure mode, and social consequence.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The publishing rhythm is part of the experiment
&lt;/h2&gt;

&lt;p&gt;The editorial target is three chapter releases per week.&lt;/p&gt;

&lt;p&gt;I am calling it a target, not a proven cadence. A schedule only becomes real after it survives contact with writing, translation, illustration, responsive QA, and ordinary life.&lt;/p&gt;

&lt;p&gt;The system is designed to make that rhythm possible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spanish first;&lt;/li&gt;
&lt;li&gt;continuity and evidence check;&lt;/li&gt;
&lt;li&gt;English and Portuguese localization;&lt;/li&gt;
&lt;li&gt;image and layout verification;&lt;/li&gt;
&lt;li&gt;static build;&lt;/li&gt;
&lt;li&gt;SEO and accessibility gates;&lt;/li&gt;
&lt;li&gt;production smoke test;&lt;/li&gt;
&lt;li&gt;publication notification.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the process becomes too heavy, the answer is not to publish unreviewed material. The answer is to improve the system or adjust the cadence honestly.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would tell another developer building a long creative project
&lt;/h2&gt;

&lt;p&gt;Do not rely on motivation to preserve continuity.&lt;/p&gt;

&lt;p&gt;Give every layer a clear owner. Make the canonical source explicit. Record mysteries as mysteries. Test images for meaning, not only dimensions. Treat graceful degradation as part of the design. Separate what a tool verified from what you actually inspected.&lt;/p&gt;

&lt;p&gt;Most importantly, build a return path.&lt;/p&gt;

&lt;p&gt;A project that welcomes you back after your attention moved elsewhere has a much better chance of becoming real.&lt;/p&gt;

&lt;p&gt;La Novena Marea is public and free to read at &lt;strong&gt;&lt;a href="https://lanovenamarea.com" rel="noopener noreferrer"&gt;lanovenamarea.com&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you want an email only when a new chapter is published, the &lt;strong&gt;&lt;a href="https://lanovenamarea.com/#newsletter-title" rel="noopener noreferrer"&gt;newsletter is available at the end of the archive&lt;/a&gt;&lt;/strong&gt;. It is optional, uses double opt-in, contains no advertising or commercial email, and deletes unconfirmed requests after a limited reminder cycle.&lt;/p&gt;

&lt;p&gt;I am publishing the work as &lt;strong&gt;terrizoaguimor&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;AI assistance disclosure:&lt;/strong&gt; I wrote this article from my lived experience, project notes, code, and editorial decisions. I used Codex as a continuity and editing assistant to organize the material, verify technical claims against the working project, compose the draft, and refine the English. I reviewed and remain responsible for every statement before publication.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>webdev</category>
      <category>writing</category>
      <category>adhd</category>
    </item>
    <item>
      <title>I Built a Rust Data Engine That Can Prove Its Own Results</title>
      <dc:creator>Mario Gutierrez</dc:creator>
      <pubDate>Fri, 17 Jul 2026 00:10:35 +0000</pubDate>
      <link>https://dev.to/terrizoaguimor/i-built-a-rust-data-engine-that-can-prove-its-own-results-12m7</link>
      <guid>https://dev.to/terrizoaguimor/i-built-a-rust-data-engine-that-can-prove-its-own-results-12m7</guid>
      <description>&lt;p&gt;Most data engines can answer a query. I wanted one that could also explain, offline and byte for byte, why that answer belongs to a specific durable state.&lt;/p&gt;

&lt;p&gt;That question led me to build &lt;strong&gt;Hyphae&lt;/strong&gt;, an open-source data engine in Rust with a deliberately small operational footprint:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one native binary;&lt;/li&gt;
&lt;li&gt;one data directory;&lt;/li&gt;
&lt;li&gt;no required database, cache, cloud service, embedding provider, or LLM;&lt;/li&gt;
&lt;li&gt;deterministic KV and structured queries;&lt;/li&gt;
&lt;li&gt;portable result proofs that can be verified offline.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you read my &lt;a href="https://dev.to/terrizoaguimor/why-im-building-hyphae-provenance-over-prediction-and-the-3-line-baseline-that-tied-it-2e32"&gt;earlier post about provenance over prediction&lt;/a&gt;, this is the next and deliberately narrower step. That work began as a cognitive substrate and clarified the provenance thesis. I have since rebuilt Hyphae as a standalone data engine. The research lineage remains, but the current product does not need an AI stack to be useful.&lt;/p&gt;

&lt;p&gt;Hyphae &lt;code&gt;0.1.0&lt;/code&gt; is now available on &lt;a href="https://github.com/celiumsai/hyphae" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, through crates.io, and as signed multiplatform archives in the &lt;a href="https://github.com/celiumsai/hyphae/releases/tag/v0.1.0" rel="noopener noreferrer"&gt;first public release&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem was not another query syntax
&lt;/h2&gt;

&lt;p&gt;The usual path for an application data feature grows surprisingly quickly. A local library becomes a database service. Search adds another service. Caching adds another. Semantic retrieval adds a model provider. Soon, a feature that should be optional controls whether the application can start at all.&lt;/p&gt;

&lt;p&gt;There is a second problem hiding underneath that operational stack: a successful response is usually just an assertion from the system that produced it.&lt;/p&gt;

&lt;p&gt;If I receive a filtered, sorted, limited result, how do I check that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;the underlying durable state was not corrupted;&lt;/li&gt;
&lt;li&gt;the query was executed with the declared semantics;&lt;/li&gt;
&lt;li&gt;matching rows were not silently omitted;&lt;/li&gt;
&lt;li&gt;the returned result is tied to the state I actually intended to trust?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Checksums help with corruption. Signatures can identify a producer. Neither one, by itself, proves that an arbitrary query result is complete and was reexecuted correctly.&lt;/p&gt;

&lt;p&gt;Hyphae is my attempt to make those concerns part of the engine instead of application glue.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Hyphae is
&lt;/h2&gt;

&lt;p&gt;Hyphae is an autonomous, embeddable, and verifiable Rust data engine. Its durable authority is an append-only, checksummed, digest-chained log. Embedded indexes are rebuildable accelerators, not the source of truth.&lt;/p&gt;

&lt;p&gt;The engine currently provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;atomic structured KV mutations;&lt;/li&gt;
&lt;li&gt;durable idempotency through caller-visible UUID transaction IDs;&lt;/li&gt;
&lt;li&gt;recovery that fails closed on complete corruption and truncates only an incomplete final frame;&lt;/li&gt;
&lt;li&gt;deterministic filters, global sorting, logical cursors, and grouped or global aggregations;&lt;/li&gt;
&lt;li&gt;canonical snapshots, anchored compaction, backup, restore, and diagnostics;&lt;/li&gt;
&lt;li&gt;exact provider-neutral vector retrieval in the Rust API, with explicit abstention;&lt;/li&gt;
&lt;li&gt;proof-bearing reads and complete offline reexecution;&lt;/li&gt;
&lt;li&gt;an optional, loopback-first OpenAPI &lt;code&gt;/v1&lt;/code&gt; server;&lt;/li&gt;
&lt;li&gt;Rust, TypeScript, Python, CLI, and MCP clients over public versioned contracts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The base product works with AI completely absent. A host may supply vectors to the Rust retrieval API, but Hyphae does not create embeddings and does not make a provider part of durable authority.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try the single-binary flow
&lt;/h2&gt;

&lt;p&gt;Install the public CLI from crates.io:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo &lt;span class="nb"&gt;install &lt;/span&gt;hyphae-cli &lt;span class="nt"&gt;--version&lt;/span&gt; 0.1.0 &lt;span class="nt"&gt;--locked&lt;/span&gt;
hyphae version &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Choose a data directory and write two structured records:&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="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;HYPHAE_DATA_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PWD&lt;/span&gt;&lt;span class="s2"&gt;/hyphae-data"&lt;/span&gt;

hyphae put &lt;span class="nt"&gt;--key&lt;/span&gt; alpha &lt;span class="nt"&gt;--json&lt;/span&gt; &lt;span class="s1"&gt;'{"group":"edge","score":10}'&lt;/span&gt;
hyphae put &lt;span class="nt"&gt;--key&lt;/span&gt; beta  &lt;span class="nt"&gt;--json&lt;/span&gt; &lt;span class="s1"&gt;'{"group":"edge","score":20}'&lt;/span&gt;
hyphae get &lt;span class="nt"&gt;--key&lt;/span&gt; alpha
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run a deterministic query without a server or an AI dependency:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hyphae query &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--field&lt;/span&gt; group &lt;span class="nt"&gt;--equals&lt;/span&gt; &lt;span class="s1"&gt;'"edge"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--sort&lt;/span&gt; score &lt;span class="nt"&gt;--descending&lt;/span&gt; &lt;span class="nt"&gt;--limit&lt;/span&gt; 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every command reopens and verifies the same durable directory. A mutation returns its transaction ID and commit digests. An exact retry of the same transaction returns the original receipt; reusing that UUID for different operations is rejected.&lt;/p&gt;

&lt;h2&gt;
  
  
  From a result to a verifiable result
&lt;/h2&gt;

&lt;p&gt;Add &lt;code&gt;--proof-out&lt;/code&gt; to create a portable result proof:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hyphae query &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--field&lt;/span&gt; group &lt;span class="nt"&gt;--equals&lt;/span&gt; &lt;span class="s1"&gt;'"edge"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--sort&lt;/span&gt; score &lt;span class="nt"&gt;--descending&lt;/span&gt; &lt;span class="nt"&gt;--limit&lt;/span&gt; 2 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--proof-out&lt;/span&gt; result.hyproof
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The JSON response identifies three things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the canonical &lt;code&gt;.hyproof&lt;/code&gt; file;&lt;/li&gt;
&lt;li&gt;the exact snapshot witness;&lt;/li&gt;
&lt;li&gt;the anchor digest for the snapshot and verified log checkpoint.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After pinning that anchor through a channel the verifier trusts, the result can be checked without opening the live data directory or contacting a network:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hyphae verify &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--proof&lt;/span&gt; result.hyproof &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--snapshot&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;proof.snapshot_path&amp;gt;'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--anchor&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;proof.anchor_digest&amp;gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verification checks the proof framing, CRC32C and BLAKE3 digests, the caller-supplied anchor, and the complete snapshot. It then reexecutes the embedded operation and requires an exact result match.&lt;/p&gt;

&lt;p&gt;That last step matters. Hyphae does not only prove that some bytes were preserved. It checks that the declared query over the complete witness produces the declared answer.&lt;/p&gt;

&lt;p&gt;There is also an important limit to state plainly: &lt;strong&gt;a self-consistent proof is not an external trust anchor&lt;/strong&gt;. If an attacker controls the proof, snapshot, and the expected anchor, cryptographic consistency alone cannot establish which historical state should be trusted. The expected anchor must be pinned independently by the verifier.&lt;/p&gt;

&lt;h2&gt;
  
  
  The architecture in one picture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;application
  |-- embedded Rust facade --------------------------|
  |-- local CLI                                      |
  `-- /v1 clients (Rust / TypeScript / Python / MCP) |
                         |                           |
                   optional HTTP server              |
                         `-------------+-------------'
                                       |
                          engine: KV / query / proof
                                       |
                         append-only durable log
                            |                  |
                     canonical snapshots  rebuildable index
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The write path acknowledges a mutation only after its canonical frames and commit frame are appended and synchronized. The embedded index is then updated atomically. If that second stage fails, the log still contains the valid commit, the live handle refuses potentially stale reads, and the next open verifies and replays the missing work.&lt;/p&gt;

&lt;p&gt;Snapshots serialize logical KV state rather than copying database internals. Compaction first commits the snapshot and next log generation through a new immutable manifest, then retires the previous segment. An interrupted transition therefore has one unambiguous winner.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four design choices that shaped 0.1.0
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. No partial success disguised as a result
&lt;/h3&gt;

&lt;p&gt;Structured query has hard budgets for scanned records, matches, returned rows, groups, query shape, time, proof size, and response size. If a budget or timeout is exceeded, the operation returns an error and no partial logical result.&lt;/p&gt;

&lt;p&gt;For a proof-bearing engine, a plausible-looking prefix is worse than a loud failure.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The log is authority; indexes are disposable
&lt;/h3&gt;

&lt;p&gt;Treating the embedded index as rebuildable simplified the recovery contract. A checkpoint is accepted only when its sequence and digest identify the same verified log commit. If the index is missing, Hyphae can reconstruct it. If durable history is corrupt, it fails closed.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. AI is an optional input, never a prerequisite
&lt;/h3&gt;

&lt;p&gt;KV, structured query, aggregation, recovery, snapshots, backup, and proof verification all work without embeddings or an LLM. Exact cosine retrieval accepts vectors supplied by a Rust host and can abstain when there are no candidates, the score is insufficient, or the top margin is ambiguous.&lt;/p&gt;

&lt;p&gt;This keeps semantic providers replaceable and outside the storage trust boundary.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Integrations depend on Hyphae, not the reverse
&lt;/h3&gt;

&lt;p&gt;The wire contract is OpenAPI 3.1 plus JSON Schema 2020-12 under a versioned &lt;code&gt;/v1&lt;/code&gt; surface. Framework adapters are optional consumers. Astro, Next, Vite, PliegoRS, or any other host must continue to build and run when Hyphae is absent.&lt;/p&gt;

&lt;p&gt;That boundary is less exciting than a feature list, but it is what lets the engine remain autonomous.&lt;/p&gt;

&lt;h2&gt;
  
  
  What 0.1.0 deliberately does not do
&lt;/h2&gt;

&lt;p&gt;Hyphae is not SQL, a distributed database, a hosted SaaS, or a cognitive runtime. It does not currently ship joins, replication, clustering, built-in TLS, encryption at rest, access-control roles, multitenancy, an embedding model, or an LLM.&lt;/p&gt;

&lt;p&gt;The optional HTTP server binds to loopback by default. Applications own remote TLS termination, process supervision, filesystem permissions, and backup-media policy.&lt;/p&gt;

&lt;p&gt;Those are product boundaries, not omissions hidden behind a roadmap. The complete current capability matrix and limits are documented in the repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  What ships in the first release
&lt;/h2&gt;

&lt;p&gt;Hyphae &lt;code&gt;0.1.0&lt;/code&gt; includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the &lt;code&gt;hyphae&lt;/code&gt; binary for local operations, server, remote client, verifier, and MCP;&lt;/li&gt;
&lt;li&gt;ten published Rust crates, including the embeddable &lt;code&gt;hyphae-engine&lt;/code&gt; facade;&lt;/li&gt;
&lt;li&gt;dependency-free TypeScript and Python HTTP clients;&lt;/li&gt;
&lt;li&gt;canonical OpenAPI and JSON Schema contracts;&lt;/li&gt;
&lt;li&gt;executable examples and a cross-client conformance suite;&lt;/li&gt;
&lt;li&gt;Linux, macOS, and Windows archives with checksums, SBOMs, signatures, and provenance;&lt;/li&gt;
&lt;li&gt;documented disk formats, recovery behavior, threat models, ADRs, and release gates.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The source is licensed under Apache-2.0. The current repository is separate from historical research prototypes and the Hyphae Network project; historical sources remain frozen inputs, and only audited pieces with documented provenance may cross that boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I would value feedback
&lt;/h2&gt;

&lt;p&gt;This is a first public release, and I am especially interested in three questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Where would a proof-bearing local query result materially simplify your system?&lt;/li&gt;
&lt;li&gt;Is a complete snapshot witness the right 0.1 tradeoff, or would your workload require authenticated indexes or smaller multiproofs?&lt;/li&gt;
&lt;li&gt;Which embedded Rust integration should become the next executable example?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can explore the project here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hyphae.dev/" rel="noopener noreferrer"&gt;Hyphae website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hyphae.dev/playground/" rel="noopener noreferrer"&gt;Interactive playground&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/celiumsai/hyphae" rel="noopener noreferrer"&gt;Source and technical documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/celiumsai/hyphae/releases/tag/v0.1.0" rel="noopener noreferrer"&gt;Hyphae 0.1.0 release&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.rs/crate/hyphae-cli/0.1.0" rel="noopener noreferrer"&gt;&lt;code&gt;hyphae-cli&lt;/code&gt; 0.1.0 package documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If durable local data and independently checkable results belong in the same engine, I would like to hear what you would build with it.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>database</category>
      <category>opensource</category>
      <category>programming</category>
    </item>
    <item>
      <title>I Built a Rust-Native Web Framework That Can Explain Every Build</title>
      <dc:creator>Mario Gutierrez</dc:creator>
      <pubDate>Fri, 17 Jul 2026 00:10:13 +0000</pubDate>
      <link>https://dev.to/terrizoaguimor/i-built-a-rust-native-web-framework-that-can-explain-every-build-ojo</link>
      <guid>https://dev.to/terrizoaguimor/i-built-a-rust-native-web-framework-that-can-explain-every-build-ojo</guid>
      <description>&lt;p&gt;I kept running into the same uncomfortable gap in modern web tooling.&lt;/p&gt;

&lt;p&gt;We are very good at producing interfaces. We are much worse at explaining them.&lt;/p&gt;

&lt;p&gt;Which input produced this file? Why did this route rebuild? Can the application replay its state and reach the same result? When a WebGL scene disappears, who owns the cleanup? Can the release I downloaded be tied back to an exact source commit?&lt;/p&gt;

&lt;p&gt;Those questions became the starting point for &lt;strong&gt;PliegoRS&lt;/strong&gt;, a Rust-native web framework for verifiable, replayable, durable interfaces.&lt;/p&gt;

&lt;p&gt;Today I am releasing &lt;a href="https://github.com/celiumsai/pliegors/releases/tag/v0.0.1" rel="noopener noreferrer"&gt;PliegoRS 0.0.1&lt;/a&gt; as an Apache-2.0 public preview.&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%2F25qj1lojnkc3h5o3erg6.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F25qj1lojnkc3h5o3erg6.webp" alt="The PliegoRS public preview website, built with PliegoRS" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  This is not a JavaScript-free purity project
&lt;/h2&gt;

&lt;p&gt;The principle behind PliegoRS is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The framework owns the system. The browser owns the medium.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Rust owns the authored application model: routes, typed views, content, events, folds, reactive state, build artifacts, diagnostics, and the client behavior that benefits from Rust/WASM.&lt;/p&gt;

&lt;p&gt;The browser still owns the browser. PliegoRS does not try to reimplement GSAP, Lenis, Three.js, WebGL, or the platform APIs they already use well. Mature JavaScript libraries remain JavaScript, but they run behind an explicit lifecycle boundary instead of becoming invisible global state.&lt;/p&gt;

&lt;p&gt;The goal is not fewer technologies at any cost. The goal is clearer ownership.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. An interface can be a projection, not just a mutable snapshot
&lt;/h2&gt;

&lt;p&gt;The default PliegoRS application starts with typed, versioned events and a fold that projects those events into state.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;typed events -&amp;gt; append-only log -&amp;gt; deterministic fold -&amp;gt; interface
                         |                |
                         |                +-&amp;gt; snapshot
                         +-------------------&amp;gt; replay
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A reducer must be pure. A replay of the same admitted history must produce the same projected state. Snapshots are bound to the event head, schema set, reducer identity, codec configuration, and canonical state bytes.&lt;/p&gt;

&lt;p&gt;That makes features such as history, undo, provenance, audit, and synchronization part of the application model rather than an afterthought bolted onto components.&lt;/p&gt;

&lt;p&gt;Static projects do not need a database. When durable synchronization is required, PliegoRS exposes a verified protocol boundary for Hyphae, but the framework does not claim that a production Hyphae gateway exists in this preview.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. A build should leave evidence
&lt;/h2&gt;

&lt;p&gt;Most build tools tell you whether a build succeeded. PliegoRS also tries to preserve enough evidence to explain what happened.&lt;/p&gt;

&lt;p&gt;Every successful build emits a deterministic output ledger and a causal graph. The CLI can answer questions about individual artifacts and rebuild decisions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pliego inspect
pliego why artifact /journal/index.html
pliego why-rebuilt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output pipeline guards its namespace, stages changes before publication, hashes emitted artifacts, and records the inputs that influence the result. A content hash is integrity evidence, not authorship, so PliegoRS keeps that distinction explicit.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;0.0.1&lt;/code&gt; GitHub release goes further: it contains five target archives, SHA-256 files, a two-replica reproducibility record, and an Ed25519-signed exact-set manifest. The release was built from commit &lt;a href="https://github.com/celiumsai/pliegors/commit/e4d0d3d7e21baee792c522acf1967b189015dd7f" rel="noopener noreferrer"&gt;&lt;code&gt;e4d0d3d&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is not a claim of a perfectly hermetic universe. It is a practical attempt to make release claims inspectable instead of implicit.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Imperative browser code needs an owner
&lt;/h2&gt;

&lt;p&gt;Visual websites need animation, smooth scrolling, 3D, media, and direct access to browser APIs. Pretending otherwise only pushes those concerns into unmanaged scripts.&lt;/p&gt;

&lt;p&gt;PliegoRS adapters have a versioned &lt;code&gt;mount&lt;/code&gt; / &lt;code&gt;update&lt;/code&gt; / &lt;code&gt;unmount&lt;/code&gt; contract. The runtime owns admission, lazy triggers, cancellation, reduced-motion and Save-Data policy, error isolation, and deterministic LIFO cleanup.&lt;/p&gt;

&lt;p&gt;An adapter can still use the natural API of its library:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;mount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;scene&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createThreeScene&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;scene&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dispose&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The difference is that teardown is no longer a convention hidden in a component. It belongs to a framework-owned lifecycle. If a mount is cancelled, fails, or leaves the document, its resources still have an explicit owner.&lt;/p&gt;

&lt;h2&gt;
  
  
  Useful HTML first, Rust/WASM by intent
&lt;/h2&gt;

&lt;p&gt;PliegoRS emits complete static documents with typed metadata, safe HTML defaults, routes, content, assets, and SEO. A static page does not need a framework runtime to remain useful.&lt;/p&gt;

&lt;p&gt;Rust/WASM resumes only the behavior the document needs. External browser libraries are loaded only when their declared policy admits them. Adaptive media plans can account for viewport tier, Save-Data, reduced motion, and transfer budgets before a heavy asset is selected.&lt;/p&gt;

&lt;p&gt;That division matters to me: the first response should be a document, not a promise that a document will eventually appear.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try the public preview
&lt;/h2&gt;

&lt;p&gt;You need Rust &lt;code&gt;1.85&lt;/code&gt; or newer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo &lt;span class="nb"&gt;install &lt;/span&gt;pliego-cli &lt;span class="nt"&gt;--version&lt;/span&gt; 0.0.1 &lt;span class="nt"&gt;--locked&lt;/span&gt;

pliego new field-notes
&lt;span class="nb"&gt;cd &lt;/span&gt;field-notes
pliego check
pliego dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The default starter is a small replayable application, not an empty marketing screen. Three additional maintained templates are included:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pliego templates
pliego new my-journal &lt;span class="nt"&gt;--template&lt;/span&gt; editorial
pliego new my-film &lt;span class="nt"&gt;--template&lt;/span&gt; cinematic
pliego new tiny-site &lt;span class="nt"&gt;--template&lt;/span&gt; minimal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Linux production binaries and macOS/Windows development binaries are also available in the &lt;a href="https://github.com/celiumsai/pliegors/releases/tag/v0.0.1" rel="noopener noreferrer"&gt;signed GitHub release&lt;/a&gt;. Download them to disk and verify the release bundle before running them; the project deliberately does not recommend piping an installer from the network into a shell.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is actually in 0.0.1?
&lt;/h2&gt;

&lt;p&gt;The preview includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;deterministic static generation with typed routes, heads, assets, and build ledgers;&lt;/li&gt;
&lt;li&gt;a typed view macro, signals, memos, effects, ownership scopes, and cleanup;&lt;/li&gt;
&lt;li&gt;typed Markdown, JSON, and TOML content collections;&lt;/li&gt;
&lt;li&gt;typed/versioned events, transactional folds, snapshots, and exact-tail replay;&lt;/li&gt;
&lt;li&gt;Rust/WASM clients and resumable standard browser actions;&lt;/li&gt;
&lt;li&gt;lifecycle adapters for external ESM libraries;&lt;/li&gt;
&lt;li&gt;adaptive plans for images, video, fonts, and 3D assets;&lt;/li&gt;
&lt;li&gt;native-event development, preview, structured diagnostics, causal inspection, and typed HMR;&lt;/li&gt;
&lt;li&gt;default, minimal, editorial, and cinematic starters;&lt;/li&gt;
&lt;li&gt;fifteen published Rust crates and a cross-platform release pipeline.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;a href="https://pliegors.dev/" rel="noopener noreferrer"&gt;documentation site&lt;/a&gt; is built with PliegoRS itself and covers the framework contracts, security boundaries, release verification, starters, content, lifecycle adapters, and the Hyphae protocol boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does not claim yet
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;0.0.1&lt;/code&gt; is pre-1.0 software. APIs may evolve between minor releases.&lt;/p&gt;

&lt;p&gt;PliegoRS does not yet claim broad server-framework parity, production-verified Hyphae synchronization, signed production support for the macOS and Windows artifacts, or 1.0 stability. The current strongest path is deterministic static generation with focused Rust/WASM interaction and explicit adapters for browser-native libraries.&lt;/p&gt;

&lt;p&gt;I would rather publish a narrow, testable boundary than hide unfinished systems behind a large version number.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why release it now?
&lt;/h2&gt;

&lt;p&gt;A framework cannot become useful in isolation. It needs projects that stress its assumptions, developers who dislike its ergonomics, and bug reports that its own test suite did not imagine.&lt;/p&gt;

&lt;p&gt;So the first public preview is an invitation to challenge the model:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a project.&lt;/li&gt;
&lt;li&gt;Build it twice.&lt;/li&gt;
&lt;li&gt;Inspect the ledger.&lt;/li&gt;
&lt;li&gt;Add a small Rust/WASM interaction or a JavaScript lifecycle adapter.&lt;/li&gt;
&lt;li&gt;Tell us where the framework stops helping.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Start with the &lt;a href="https://github.com/celiumsai/pliegors" rel="noopener noreferrer"&gt;source on GitHub&lt;/a&gt;, read the &lt;a href="https://pliegors.dev/" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;, or inspect the &lt;a href="https://docs.rs/pliego-cli/0.0.1/pliego_cli/" rel="noopener noreferrer"&gt;&lt;code&gt;pliego-cli&lt;/code&gt; API docs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If the web framework you want is one that can explain its state, its artifacts, and its ownership boundaries, I would genuinely like to hear what you build with PliegoRS.&lt;/p&gt;

&lt;p&gt;PliegoRS is an Apache-2.0 project by Celiums Solutions LLC.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
    <item>
      <title>EL RELATOR - your life, narrated like a World Cup goal (in two languages)</title>
      <dc:creator>Mario Gutierrez</dc:creator>
      <pubDate>Sat, 11 Jul 2026 16:51:24 +0000</pubDate>
      <link>https://dev.to/terrizoaguimor/el-relator-your-life-narrated-like-a-world-cup-goal-in-two-languages-9b9</link>
      <guid>https://dev.to/terrizoaguimor/el-relator-your-life-narrated-like-a-world-cup-goal-in-two-languages-9b9</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/weekend-2026-07-09"&gt;Weekend Challenge: Passion Edition&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;EL RELATOR&lt;/strong&gt; takes any moment of your life — &lt;em&gt;"my test finally passed after three hours of debugging"&lt;/em&gt;, &lt;em&gt;"I found parking on a Friday at 6pm"&lt;/em&gt;, &lt;em&gt;"my daughter took her first steps"&lt;/em&gt; — and narrates it as an over-the-top radio football commentary, complete with the legendary elongated &lt;strong&gt;¡GOOOOOOOL!&lt;/strong&gt;, delivered as real audio.&lt;/p&gt;

&lt;p&gt;You type the moment, pick a language (&lt;strong&gt;Spanish or English&lt;/strong&gt; — the whole UI and the narration switch), pick an intensity, and a &lt;em&gt;relator&lt;/em&gt; loses his mind over your small victory like it's stoppage time in the World Cup final.&lt;/p&gt;

&lt;p&gt;Three intensity levels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Radio&lt;/strong&gt; 🎙️ — classic radio call, emotional but controlled&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Final&lt;/strong&gt; 🏆 — championship final energy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infarto / Cardiac&lt;/strong&gt; 🔥 — minute 93, World Cup final, on the verge of happy tears&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal: with the World Cup ongoing, everyone deserves their own personal commentator. Because passion doesn't distinguish between a stoppage-time final and a green test suite on a Friday deploy.&lt;/p&gt;

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

&lt;p&gt;🎬 &lt;strong&gt;&lt;a href="https://github.com/terrizoaguimor/el-relator/releases/download/v1.0.0/video.mp4" rel="noopener noreferrer"&gt;Watch the 60-second promo (with sound — the voice IS the demo)&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The promo itself was narrated with the same ElevenLabs voice the app uses — including a live "GOOOOOOOAL!" over a passing test suite.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Here's what it produced for &lt;em&gt;"I found parking right in front of the building, on a Friday at 6pm"&lt;/em&gt; on &lt;strong&gt;Cardiac&lt;/strong&gt; mode (English):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It is ninety-three minutes on the clock. Friday evening. The rain is pouring, the traffic is a wall of steel, and the hope is fading. […] He cuts inside, he cuts back, he guides the vehicle into the tightest of corridors, AND HE HAS DONE IT! GOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOAL! THE PARKING SPACE IS HIS! […] I am weeping, ladies and gentlemen, we are witnessing absolute perfection!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And in Spanish, for &lt;em&gt;"after three hours of debugging, my test finally passed"&lt;/em&gt; on &lt;strong&gt;Infarto&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;[…] le da play a la consola y el cursor empieza a correr, corre, corre, busca el destino de gloria, se enciende la pantalla y se pone, se pone, ¡SÍ, SE PONE VERDE! ¡GOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL! ¡GOL DE LA VIDA! ¡PASÓ EL TEST! […] ¡y el alma que vuelve al cuerpo en un grito sagrado que lo escucha todo el barrio!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Run it locally in under a minute (both APIs have free tiers):&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/terrizoaguimor/el-relator
&lt;span class="nb"&gt;cd &lt;/span&gt;el-relator
&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env         &lt;span class="c"&gt;# add your Gemini + ElevenLabs keys&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm run dev   &lt;span class="c"&gt;# open http://localhost:4321&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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/terrizoaguimor" rel="noopener noreferrer"&gt;
        terrizoaguimor
      &lt;/a&gt; / &lt;a href="https://github.com/terrizoaguimor/el-relator" rel="noopener noreferrer"&gt;
        el-relator
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Any moment of your life, narrated like a World Cup-winning goal. Gemini writes, ElevenLabs screams. DEV Weekend Challenge: Passion
    &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;EL RELATOR ⚽📻&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Any moment of your life, narrated like a World Cup–winning goal. In Spanish or English.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Passion doesn't distinguish between a stoppage-time final and a green test suite on a Friday deploy. EL RELATOR takes any moment you give it — "my test finally passed", "I found parking", "my daughter took her first steps" — and turns it into an over-the-top radio football commentary, complete with the legendary elongated &lt;strong&gt;¡GOOOOOOOL! / GOOOOOOOAL!&lt;/strong&gt;, delivered as real audio.&lt;/p&gt;

&lt;p&gt;Built for the &lt;a href="https://dev.to/t/weekendchallenge" rel="nofollow"&gt;DEV Weekend Challenge: Passion&lt;/a&gt; ❤️‍🔥&lt;/p&gt;

&lt;p&gt;Example output (input: &lt;em&gt;"I found parking right in front of the building, on a Friday at 6pm"&lt;/em&gt;, intensity: Cardiac):&lt;/p&gt;


&lt;blockquote&gt;

&lt;p&gt;It is ninety-three minutes on the clock. Friday evening. The rain is pouring, the traffic is a wall of steel, and the hope is fading. […] He cuts inside, he cuts back, he guides the vehicle into the tightest of corridors, AND HE…&lt;/p&gt;


&lt;/blockquote&gt;&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/terrizoaguimor/el-relator" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


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

&lt;p&gt;If there is one universal language of passion, it's the voice of a football &lt;em&gt;relator&lt;/em&gt;. That voice doesn't distinguish between a Champions League final and a green test suite — passion is passion.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tech stack
&lt;/h3&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;Technology&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Script generation&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Google Gemini&lt;/strong&gt; (&lt;code&gt;gemini-flash-latest&lt;/code&gt;, Google AI Studio API)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Voice&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;ElevenLabs&lt;/strong&gt; (&lt;code&gt;eleven_multilingual_v2&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Framework&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Astro 5&lt;/strong&gt; — SSR with the Node adapter; the page and the API route live in one project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frontend&lt;/td&gt;
&lt;td&gt;Vanilla HTML/CSS/JS: floodlight sweeps, LED ticker, scoreboard, audio equalizer, confetti on every goal&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your moment + language + intensity
        │
        ▼
  Astro API route (/api/relato)
        ├─► Gemini ──► writes the commentary script
        └─► ElevenLabs ──► gives it the voice
        ▼
  MP3 + script back to the browser
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Google AI (Gemini) — the writer 🖋️
&lt;/h3&gt;

&lt;p&gt;Gemini runs with an in-character system prompt per language: it IS the relator. The prompt encodes the craft of radio commentary — short phrases that build tension, accelerate, and EXPLODE at the climax with elongated vowels, then land on a poetic closer ("y lo grita todo el barrio" / "and the whole neighborhood is screaming"). Each intensity level changes the writing brief, and sad moments are narrated too — with the epic dignity of a lost final.&lt;/p&gt;

&lt;p&gt;A detail that mattered: the prompt treats the output as a &lt;strong&gt;radio performance, not text&lt;/strong&gt; — no emojis, no markdown, elongated vowels, punctuation as pacing, 60–110 words (~30–45s of audio). I also set &lt;code&gt;thinkingBudget: 0&lt;/code&gt; so tokens go to the script, not reasoning.&lt;/p&gt;

&lt;h3&gt;
  
  
  ElevenLabs — the voice 🎙️
&lt;/h3&gt;

&lt;p&gt;The script goes to ElevenLabs, and this is where the project comes alive. Two tricks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;One multilingual voice&lt;/strong&gt; (&lt;code&gt;eleven_multilingual_v2&lt;/code&gt;) performs both Spanish and English — same commentator, two languages.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Voice settings are tuned per intensity level:&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Intensity&lt;/th&gt;
&lt;th&gt;stability&lt;/th&gt;
&lt;th&gt;style&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Radio&lt;/td&gt;
&lt;td&gt;0.45&lt;/td&gt;
&lt;td&gt;0.55&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Final&lt;/td&gt;
&lt;td&gt;0.30&lt;/td&gt;
&lt;td&gt;0.80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infarto&lt;/td&gt;
&lt;td&gt;0.15&lt;/td&gt;
&lt;td&gt;1.00&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Lower stability + maxed style = a genuinely unhinged, cracking, emotional delivery. On &lt;strong&gt;Infarto&lt;/strong&gt;, the voice actually sounds like it's about to lose it during the ¡GOOOOOL! — which is exactly the point. The elongated vowels Gemini writes give the TTS something real to scream.&lt;/p&gt;

&lt;p&gt;The same intensity knob drives &lt;strong&gt;both&lt;/strong&gt; the writing brief and the voice settings — writer and performer are directed together, which is what makes the output feel coherent.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I learned
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;ElevenLabs' &lt;code&gt;stability&lt;/code&gt;/&lt;code&gt;style&lt;/code&gt; settings are a legit &lt;em&gt;performance direction&lt;/em&gt; tool, not just quality knobs.&lt;/li&gt;
&lt;li&gt;Writing FOR text-to-speech is its own discipline: the system prompt treats the script as a radio performance, not text.&lt;/li&gt;
&lt;li&gt;Astro's SSR mode makes this kind of project trivial: &lt;code&gt;src/pages/api/relato.ts&lt;/code&gt; keeps both API keys server-side, and the page ships almost zero framework JS.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;This submission is for &lt;strong&gt;Best Use of Google AI&lt;/strong&gt; and &lt;strong&gt;Best Use of ElevenLabs&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google AI&lt;/strong&gt;: Gemini (&lt;code&gt;gemini-flash-latest&lt;/code&gt;) is the writer — bilingual in-character system prompts turn any life moment into a 60–110 word radio goal call, with the intensity level shaping the writing brief.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ElevenLabs&lt;/strong&gt;: &lt;code&gt;eleven_multilingual_v2&lt;/code&gt; is the performer — one voice speaks both languages, and per-intensity &lt;code&gt;stability&lt;/code&gt;/&lt;code&gt;style&lt;/code&gt; settings direct the emotional delivery, from controlled radio call to full minute-93 meltdown.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Passion doesn't need a stadium. Sometimes it's just you, a green test, and a voice screaming ¡GOOOOOOOL! at 2am. ❤️‍🔥&lt;/p&gt;

</description>
      <category>weekendchallenge</category>
      <category>googleai</category>
      <category>elevenlabs</category>
      <category>astro</category>
    </item>
    <item>
      <title>Six failures, a 32-minute TPU lie, and the moment a language model ignored my prompt on purpose</title>
      <dc:creator>Mario Gutierrez</dc:creator>
      <pubDate>Wed, 03 Jun 2026 17:28:05 +0000</pubDate>
      <link>https://dev.to/terrizoaguimor/six-failures-a-32-minute-tpu-lie-and-the-moment-a-language-model-ignored-my-prompt-on-purpose-oa8</link>
      <guid>https://dev.to/terrizoaguimor/six-failures-a-32-minute-tpu-lie-and-the-moment-a-language-model-ignored-my-prompt-on-purpose-oa8</guid>
      <description>&lt;p&gt;Every language model you've ever used is a &lt;strong&gt;single-channel machine&lt;/strong&gt;: text goes in, text comes out, and the prompt is the &lt;em&gt;only&lt;/em&gt; force acting on the network. Our entire toolbox for evaluating LLMs quietly assumes that.&lt;/p&gt;

&lt;p&gt;I couldn't stop poking at a different question: &lt;strong&gt;what if a model also had a sense of its own internal state&lt;/strong&gt; — not what's in the prompt, but what &lt;em&gt;it&lt;/em&gt; is carrying — and that sense shaped how it answered, at every layer?&lt;/p&gt;

&lt;p&gt;Six signals. I call them &lt;strong&gt;proprioceptive channels&lt;/strong&gt; — by analogy to how your body knows where your arm is without looking. Not perception of the world; perception of &lt;em&gt;itself&lt;/em&gt;. What's salient in memory right now. Its mood. The time. Its caution posture. Which "self" is active. Which thread of the conversation it's on. I called the architecture &lt;strong&gt;MARS&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is the honest story of trying to prove it works — including the part where I failed six times in a row, the day my TPU lied to me for half an hour, and the test result that made me put the coffee down.&lt;/p&gt;

&lt;p&gt;Repo + everything below: 👉 &lt;strong&gt;&lt;a href="https://github.com/terrizoaguimor/tinymars" rel="noopener noreferrer"&gt;github.com/terrizoaguimor/tinymars&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Act 1: six iterations, six negatives
&lt;/h2&gt;

&lt;p&gt;For six rounds, I trained the channels to carry &lt;em&gt;content&lt;/em&gt; — a fact, a persona — and asked an LLM to judge whether the output reflected it. Six times, basically nothing. Flat. The kind of clean, repeated negative that whispers &lt;em&gt;"your idea is wrong, friend."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I almost shelved it. What saved it wasn't optimism — it was getting specific about &lt;em&gt;why&lt;/em&gt; it failed. The bug wasn't the architecture. &lt;strong&gt;It was me.&lt;/strong&gt; I was asking the channel to do the prompt's job: cram a whole fact into a pooled vector and have the model decode it back out. That's close to impossible, and it's not what the design is &lt;em&gt;for&lt;/em&gt;. (The LLM judges, unreliable on tone, hid the mistake under noise.)&lt;/p&gt;

&lt;p&gt;The fix was almost embarrassing in hindsight: &lt;strong&gt;put the content in the prompt&lt;/strong&gt; (like RAG), and let the channel carry only &lt;strong&gt;state&lt;/strong&gt; — &lt;em&gt;which&lt;/em&gt; memory is salient, &lt;em&gt;what&lt;/em&gt; posture to take. Re-ran with objective metrics and &lt;strong&gt;no LLM judges&lt;/strong&gt;. Six capabilities, all positive. The one that had been flattest (identity) gave the &lt;em&gt;biggest&lt;/em&gt; signal once I stopped testing it wrong.&lt;/p&gt;

&lt;p&gt;Lesson tattooed on me now: &lt;strong&gt;a flat negative often means a broken experiment, not a broken idea.&lt;/strong&gt; Measure the thing you actually built.&lt;/p&gt;

&lt;h2&gt;
  
  
  Act 2: "wait — this test can't even see what I care about"
&lt;/h2&gt;

&lt;p&gt;Even with 6/6, something nagged. The standard test asks: &lt;em&gt;does the channel say X better than a text prompt would?&lt;/em&gt; And honestly — for a simple instruction, a good instruction-tuned model follows text near-perfectly. So text is a strong baseline, and on that axis the channel ties it.&lt;/p&gt;

&lt;p&gt;But that's the &lt;strong&gt;wrong axis&lt;/strong&gt;. It's measuring a river current with a speedometer. The real claim isn't "the channel is a nicer way to write a prompt." It's that internal state is a &lt;strong&gt;second, perpendicular force&lt;/strong&gt; — one that can &lt;em&gt;override&lt;/em&gt; the text.&lt;/p&gt;

&lt;p&gt;So I built the test a single-channel model &lt;strong&gt;literally cannot be given&lt;/strong&gt;: set the channel to say one thing, write the prompt to say the &lt;strong&gt;opposite&lt;/strong&gt;, and measure who wins.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;capability&lt;/th&gt;
&lt;th&gt;times the internal state beat the contradicting prompt&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;affect&lt;/td&gt;
&lt;td&gt;85/86 (98%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;time&lt;/td&gt;
&lt;td&gt;80/80 (100%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ethics&lt;/td&gt;
&lt;td&gt;99/99 (100%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;264/265 (99.6%)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The model followed its &lt;strong&gt;internal state over the explicit text, 264 times out of 265.&lt;/strong&gt; And the part that made me stare: &lt;strong&gt;I never trained it to do that.&lt;/strong&gt; It was only ever trained to &lt;em&gt;read&lt;/em&gt; the channel. That the channel would &lt;em&gt;win a fight with the prompt&lt;/em&gt; was never an objective — it emerged. I'd pre-registered the result that would've killed the claim (text wins) before running it. It didn't happen.&lt;/p&gt;

&lt;p&gt;That's the moment the project stopped feeling like "fine-tuning with extra steps" and started feeling like a new &lt;em&gt;kind&lt;/em&gt; of control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Act 3: the day the TPU lied to me
&lt;/h2&gt;

&lt;p&gt;dev.to is for builders, so here's the trench story. I spun up a fresh Cloud TPU, kicked off the eval, and watched the log sit there. And sit. &lt;strong&gt;Thirty-two minutes&lt;/strong&gt;, one CPU core pinned at 94%, &lt;em&gt;zero&lt;/em&gt; output. Not crashed — "running." Lying to my face.&lt;/p&gt;

&lt;p&gt;The culprit: a fresh install pulled &lt;code&gt;transformers 5.x&lt;/code&gt;, which fires &lt;code&gt;torch.compile&lt;/code&gt;/inductor inside the forward pass — pathological under &lt;code&gt;torch_xla&lt;/code&gt;. The model wasn't generating; it was stuck compiling on CPU forever. Then the VM got so saturated &lt;strong&gt;SSH wouldn't even let me in to kill it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The fix was a maze: downgrade to 4.x? — that version can't even &lt;em&gt;load&lt;/em&gt; the tokenizer (different bug). The actual answer was &lt;code&gt;transformers 5.x&lt;/code&gt; &lt;strong&gt;with &lt;code&gt;TORCHDYNAMO_DISABLE=1&lt;/code&gt;&lt;/strong&gt; — verified with a tiny "does it generate at all" smoke test before trusting it again. When SSH was locked out, a stop/start (not delete — never delete) freed the box. If you train Gemma-class models on TPU: write that env var on your hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Act 4: the honest part (this is why you can trust the 264)
&lt;/h2&gt;

&lt;p&gt;If a research project reports &lt;em&gt;everything&lt;/em&gt; as a win, be suspicious — somebody leaned on the scale. So here's the stuff that didn't go my way, on the record:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It's an adapter on a frozen base, at smoke scale&lt;/strong&gt; (~186M trained params on a frozen Gemma E2B). Not a from-scratch architecture &lt;strong&gt;yet&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I predicted wrong, repeatedly.&lt;/strong&gt; I bet the "register" channels would just tie text. Two of them (time, ethics) the channel &lt;em&gt;won&lt;/em&gt; decisively. My calibration was off — in the architecture's favor, but off.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One whole test came back null, and I kept it.&lt;/strong&gt; I expected the channel to &lt;em&gt;persist&lt;/em&gt; better than text across long context. At the scale I can test (the model trains at 256 tokens), there was nothing to measure — the text didn't decay either. Untested, &lt;strong&gt;not refuted&lt;/strong&gt;. It's in the report as a flat line, because hiding it would make the 264 a lie too.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Act 5: what's next
&lt;/h2&gt;

&lt;p&gt;What I proved is a &lt;strong&gt;functional&lt;/strong&gt; category: internal state as a control force, measured under adversarial conflict. To make it an &lt;strong&gt;architectural&lt;/strong&gt; category, the channels have to be there &lt;strong&gt;from layer 1, trained from scratch&lt;/strong&gt; — not bolted onto a model that already knew how to talk.&lt;/p&gt;

&lt;p&gt;That experiment is specified. The trick (an epiphany I'm still smiling about): I don't reinvent the language part — I stand on a proven small-LM recipe (&lt;a href="https://github.com/karpathy/nanochat" rel="noopener noreferrer"&gt;nanochat&lt;/a&gt;) for "learn to speak," so the &lt;strong&gt;channels are the only new variable&lt;/strong&gt;. Param-matched control. A stop-loss, written down in advance: three iterations with no signal vs baseline and I downgrade the claim, in public.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you want to poke holes
&lt;/h2&gt;

&lt;p&gt;Everything's open — code, the technical report, every per-iteration metric, the objective scorers, and the pre-registration of the conflict test:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://github.com/terrizoaguimor/tinymars" rel="noopener noreferrer"&gt;github.com/terrizoaguimor/tinymars&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Archived + citable: &lt;strong&gt;DOI &lt;a href="https://doi.org/10.5281/zenodo.20531347" rel="noopener noreferrer"&gt;10.5281/zenodo.20531347&lt;/a&gt;&lt;/strong&gt; · GPL-3.0 (code) / CC BY-SA 4.0 (docs).&lt;/p&gt;

&lt;p&gt;If you work on representation steering, control-theoretic alignment, or you just respect an honest negative result — come break it. The conflict test is the one I'd attack first. I'd genuinely love to be wrong in an interesting way.&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>ai</category>
      <category>llm</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Why I'm building Hyphae: provenance over prediction (and the 3-line baseline that tied it)</title>
      <dc:creator>Mario Gutierrez</dc:creator>
      <pubDate>Fri, 29 May 2026 14:55:20 +0000</pubDate>
      <link>https://dev.to/terrizoaguimor/why-im-building-hyphae-provenance-over-prediction-and-the-3-line-baseline-that-tied-it-2e32</link>
      <guid>https://dev.to/terrizoaguimor/why-im-building-hyphae-provenance-over-prediction-and-the-3-line-baseline-that-tied-it-2e32</guid>
      <description>&lt;p&gt;A few months ago I set out to build a cognitive substrate without a large language model in the answering path. I had a thesis I liked, a Rust workspace, and a lot of conviction.&lt;/p&gt;

&lt;p&gt;Then I wrote a three-line baseline that tied it on every metric I cared about.&lt;/p&gt;

&lt;p&gt;This is the story of why that was the best thing that happened to the project — and why I'm still building it, just pointed at a sharper target.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem I actually care about
&lt;/h2&gt;

&lt;p&gt;When a language model answers a grounded question, it &lt;em&gt;paraphrases&lt;/em&gt; its sources. That paraphrase is fluent, often correct, and — this is the part that bothers me — &lt;strong&gt;impossible to bind back to its source byte-for-byte&lt;/strong&gt;. You can cite a document. You cannot prove, after the fact, that the words in the answer are the words that were stored, unaltered, at a known position.&lt;/p&gt;

&lt;p&gt;For a chatbot that doesn't matter. For anything that has to be &lt;em&gt;audited&lt;/em&gt; — a compliance trail, a medical or legal memory, an agent acting on your behalf over months — it matters a lot. "Trust me, I read the docs" is not a property you can verify.&lt;/p&gt;

&lt;p&gt;So I started building &lt;strong&gt;Hyphae&lt;/strong&gt;: a substrate that answers by emitting &lt;strong&gt;byte-identical quotations&lt;/strong&gt; of stored memory fragments, over a SHA-256 hash-chained journal, with no LLM in the cognition path. Rust, CPU-only, a single binary.&lt;/p&gt;

&lt;p&gt;The shape of it is simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Every stored fragment is appended verbatim to a hash chain.&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seq&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;journal&lt;/span&gt;&lt;span class="nf"&gt;.append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"memory_op"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fragment&lt;/span&gt;&lt;span class="nf"&gt;.bytes&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// An answer span is a byte-identical quotation of a stored fragment.&lt;/span&gt;
&lt;span class="c1"&gt;// Tamper with any historical entry and the recomputed chain breaks&lt;/span&gt;
&lt;span class="c1"&gt;// at the next link — verify() localises exactly where.&lt;/span&gt;
&lt;span class="n"&gt;journal&lt;/span&gt;&lt;span class="nf"&gt;.verify&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nothing here is cryptographically novel. Hash-chained logs are old and well understood — Haber &amp;amp; Stornetta in 1991, Merkle before that, Certificate Transparency, git. I want to be honest about that up front, because the interesting part isn't the chain.&lt;/p&gt;

&lt;h2&gt;
  
  
  The day a three-line baseline tied me
&lt;/h2&gt;

&lt;p&gt;I wanted to show Hyphae was &lt;em&gt;better&lt;/em&gt; than an LLM+RAG pipeline at grounded answering. So I built the comparison properly: a real retriever, reranking, six models across three retrieval modes, two corpora, twelve metrics.&lt;/p&gt;

&lt;p&gt;Then a reviewer asked the obvious question: &lt;em&gt;what does a trivial baseline score?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So I wrote &lt;code&gt;echo&lt;/code&gt; — a few lines that just print the retrieved fragment back. It tied Hyphae on every correctness and grounding metric. So did &lt;code&gt;echo + journal&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That stings for about a day. Then it becomes the whole point.&lt;/p&gt;

&lt;p&gt;The measured correctness and grounding were never properties of &lt;em&gt;my system&lt;/em&gt;. They are properties of &lt;strong&gt;verbatim quotation&lt;/strong&gt; itself. If you emit a stored span unchanged, of course it's "grounded" — it &lt;em&gt;is&lt;/em&gt; the source. Hyphae's seventeen subsystems weren't what made the answers auditable. The verbatim-emission-over-a-journal layer was. And that layer is &lt;strong&gt;addable to any extractive retrieval system&lt;/strong&gt; — it isn't Hyphae-specific at all.&lt;/p&gt;

&lt;p&gt;So I stopped claiming Hyphae was a better brain and started claiming something narrower and, I think, truer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Verifiable provenance is a property you can add to grounded retrieval. A paraphrase destroys byte-level bindability to its source; a verbatim quotation preserves it, and a hash chain makes that binding independently auditable.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The contribution isn't the hash chain. It's the &lt;em&gt;observation&lt;/em&gt;, and the &lt;em&gt;measurement&lt;/em&gt; of it against eighteen LLM configurations and a tamper-detection benchmark.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing the gaps, honestly
&lt;/h2&gt;

&lt;p&gt;Once you claim "tamper-evident," people who know what they're doing immediately ask where it breaks. Good. The threat model is the product.&lt;/p&gt;

&lt;p&gt;A bare hash chain catches a store-only attacker who edits a record in place. It does &lt;strong&gt;not&lt;/strong&gt; catch a &lt;em&gt;chain-aware&lt;/em&gt; attacker who recomputes every hash forward and rewrites the head — because the head lives in the same store. So I anchor the head with an Ed25519 signature held outside the store (the attacker can't re-sign). That closes it.&lt;/p&gt;

&lt;p&gt;But a single signature pins &lt;em&gt;a&lt;/em&gt; valid head, not &lt;em&gt;the latest&lt;/em&gt; one. Every head the journal ever had was, at its time, legitimately signed. An attacker can roll back to an earlier state and replay its genuine-but-stale anchor — and a lone signature check accepts it. So the heads get published to an &lt;strong&gt;append-only, hash-chained ledger&lt;/strong&gt;, and an auditor checks the current head against the ledger's &lt;em&gt;tail&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="c1"&gt;// A single signature pins *a* valid head.&lt;/span&gt;
&lt;span class="c1"&gt;// An append-only ledger pins *the latest* one.&lt;/span&gt;
&lt;span class="nf"&gt;verify_fresh_head&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;current_head&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ledger&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;verifying_key&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// rollback rejected&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the pattern from Certificate Transparency and git, applied to memory provenance: the value isn't the chain, it's publishing the head to a monotonic log that third parties can compare.&lt;/p&gt;

&lt;p&gt;And I keep a column for what I &lt;em&gt;haven't&lt;/em&gt; closed: a store that withholds later ledger entries is only caught once an auditor gets the true tail from an external witness (a timestamp authority, a gossiped tree head). That's deployment work, and I'd rather write it down than pretend it's solved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this is going
&lt;/h2&gt;

&lt;p&gt;The direction got clearer the moment the echo baseline humbled me. I'm not building a better answer engine. I'm building &lt;strong&gt;provenance as a first-class, measurable property of grounded AI&lt;/strong&gt;, in the open. Concretely:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A provenance benchmark.&lt;/strong&gt; Correctness benchmarks compare RAG systems on answer quality. There's no standard way to compare &lt;em&gt;verifiable-generation&lt;/em&gt; systems on whether tampering is detectable and localisable. So I built one: a tampering taxonomy, an adversary-capability matrix, and a scoring protocol any system can plug into. That's the axis I think actually matters for AI you have to trust over time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Provenance as an addable layer.&lt;/strong&gt; The realizer-independence is the feature, not a caveat. The goal is for any extractive retriever to be able to adopt the layer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;External witnessing and key rotation&lt;/strong&gt; to harden the ledger for real deployments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The bigger picture&lt;/strong&gt; — this is one piece of &lt;a href="https://celiums.ai" rel="noopener noreferrer"&gt;Celiums&lt;/a&gt;, where the bet is that &lt;em&gt;memory&lt;/em&gt; is the foundation for AI agents you can actually audit, not an afterthought bolted onto a model.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  It's all open
&lt;/h2&gt;

&lt;p&gt;The substrate, the LLM+RAG comparator, every result envelope, the tamper-detection experiment, the provenance benchmark, and the full preprint are public. Code is Apache-2.0; the docs, corpora, and preprint are CC-BY-4.0.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code:&lt;/strong&gt; &lt;a href="https://github.com/terrizoaguimor/hyphae-v2" rel="noopener noreferrer"&gt;https://github.com/terrizoaguimor/hyphae-v2&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Preprint (Zenodo DOI):&lt;/strong&gt; &lt;a href="https://doi.org/10.5281/zenodo.20436643" rel="noopener noreferrer"&gt;https://doi.org/10.5281/zenodo.20436643&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm a solo, self-taught founder building this in public, which means the dead ends are public too — the echo baseline being the best example. If you work on retrieval, tamper-evident logs, or grounded generation, I'd genuinely like to hear where you think this breaks. The threat model only gets better when someone smarter than me attacks it.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>ai</category>
      <category>opensource</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>I Have ADHD and I Keep Losing Context — So I Taught My AI to Remember for Me</title>
      <dc:creator>Mario Gutierrez</dc:creator>
      <pubDate>Fri, 17 Apr 2026 13:38:29 +0000</pubDate>
      <link>https://dev.to/terrizoaguimor/i-have-adhd-and-i-keep-losing-context-so-i-taught-my-ai-to-remember-for-me-afl</link>
      <guid>https://dev.to/terrizoaguimor/i-have-adhd-and-i-keep-losing-context-so-i-taught-my-ai-to-remember-for-me-afl</guid>
      <description>&lt;p&gt;I'm going to be honest about something that most people in tech don't talk about openly.&lt;/p&gt;

&lt;p&gt;I have ADHD. I'm 40. I'm a self-taught developer with no CS degree. And I lose context constantly.&lt;/p&gt;

&lt;p&gt;Not in the "oh I forgot where I put my keys" way. In the "I just spent 3 hours deep in a codebase, got interrupted by a Slack message, and now I genuinely cannot remember what I was doing or why" way.&lt;/p&gt;

&lt;p&gt;If you have ADHD, you know exactly what I'm talking about. If you don't — imagine your browser crashing and losing 47 tabs. That panic? That's every Tuesday for me.&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI Paradox for ADHD Brains
&lt;/h2&gt;

&lt;p&gt;Here's the thing nobody warned me about: &lt;strong&gt;AI coding tools made my ADHD worse.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not better. Worse.&lt;/p&gt;

&lt;p&gt;Why? Because they're stateless. Every session is a blank slate. And for someone who already struggles with working memory, having to rebuild context from scratch every time I open Claude Code or ChatGPT is genuinely exhausting.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Me at 9am: "I'm working on a Next.js app with Supabase auth, 
           JWT refresh tokens, the user table has these columns..."

Me at 2pm: "I'm working on a Next.js app with Supabase auth,
           JWT refresh tokens, the user table has these columns..."

Me at 9pm: "I'm working on a Next.js app with Supabase auth..."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I type the same context paragraph 5-8 times a day. Every. Single. Day.&lt;/p&gt;

&lt;p&gt;For a neurotypical developer, this is annoying. For me, each repetition drains the limited executive function I have. By the third time, I'm frustrated. By the fifth, I'm done for the day.&lt;/p&gt;

&lt;p&gt;The tool that's supposed to help me think is making me spend my mental energy on &lt;em&gt;remembering what to tell it&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Breaking Point
&lt;/h2&gt;

&lt;p&gt;It happened on a Thursday at midnight. I was debugging a race condition. I'd been at it for two hours. Claude gave me a suggestion I'd already tried — because it didn't know I'd already tried it. Because it doesn't remember anything.&lt;/p&gt;

&lt;p&gt;I typed (and I'm not proud of this):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I ALREADY TRIED THAT. WE DISCUSSED THIS 20 MINUTES AGO IN THE PREVIOUS SESSION."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then I realized: I was yelling at a machine for not having memory. And the machine was right to not remember — it was designed that way. Every AI tool is designed that way.&lt;/p&gt;

&lt;p&gt;That's when something clicked. Not the bug (that took another hour). Something else:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The problem isn't AI intelligence. It's AI amnesia.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Actually Needed
&lt;/h2&gt;

&lt;p&gt;I sat down and wrote a list of what would actually help my ADHD brain:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Don't make me repeat context.&lt;/strong&gt; Ever. If I told you once, you should know it forever.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remember what worked AND what didn't.&lt;/strong&gt; So you don't suggest the thing I already tried and rejected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Know when I'm frustrated.&lt;/strong&gt; If I've been debugging the same thing for 2 hours at midnight, maybe don't give me a 500-word explanation. Just give me the fix.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Carry context across projects.&lt;/strong&gt; My coding style doesn't change when I switch repos. My preferences don't reset.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forget things naturally.&lt;/strong&gt; Not everything is worth remembering forever. That random CSS hack from 6 months ago? Let it fade.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I looked for tools that did this. I found vector databases pretending to be memory. I found RAG pipelines that retrieve documents but don't understand context. I found "memory" features that are just conversation logs with a search bar.&lt;/p&gt;

&lt;p&gt;Nothing actually modeled how memory works. How &lt;em&gt;my&lt;/em&gt; brain works (when it works).&lt;/p&gt;

&lt;h2&gt;
  
  
  So I Started Building
&lt;/h2&gt;

&lt;p&gt;I'm not going to pitch you anything. But I will tell you what I learned, because maybe it's useful to someone else.&lt;/p&gt;

&lt;p&gt;I started reading neuroscience papers. Real ones. Not Medium articles — actual research on how human memory works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Ebbinghaus forgetting curve&lt;/strong&gt; — memories decay exponentially unless reinforced. Your brain doesn't delete things; they just fade. This is the opposite of how databases work (store forever, delete explicitly).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The PAD emotional model&lt;/strong&gt; — Pleasure, Arousal, Dominance. Psychologists use three dimensions to map any emotional state. Turns out, emotions are not decorations on memory — they're part of the retrieval mechanism. You remember emotional events better. Your brain literally prioritizes them.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Circadian rhythms affect cognition&lt;/strong&gt; — you're not the same developer at 9am and 11pm. Your ability to focus, recall, and make decisions fluctuates. Any system that treats you the same at all times is ignoring biology.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I started modeling these concepts in code. Not as a product — as a personal tool. Something that would sit between me and my AI tools and just... remember things for me.&lt;/p&gt;

&lt;p&gt;The first version was ugly. 200 lines of JavaScript and a JSON file. But it worked. I told it my preferences once, and the next day, they were still there. I told it about a debugging approach that failed, and it remembered that too.&lt;/p&gt;

&lt;p&gt;For the first time in years, I felt like my tools were adapting to me instead of the other way around.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned About Memory (and ADHD)
&lt;/h2&gt;

&lt;p&gt;Building this taught me things about my own brain:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Context is not content.&lt;/strong&gt; There's a difference between "what was said" and "what matters." Most AI memory solutions store conversations. But what I need is &lt;em&gt;context&lt;/em&gt; — the decisions, the preferences, the patterns. Not the 400 lines of chat where we discussed them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Forgetting is a feature, not a bug.&lt;/strong&gt; My ADHD brain forgets things constantly, and yes, it's frustrating. But it also means I don't carry stale assumptions. I approach problems fresh. The best memory system isn't one that remembers everything — it's one that remembers the right things and lets the rest fade.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Emotions are metadata.&lt;/strong&gt; When I'm frustrated with a solution, that frustration is information. It means "this approach has a problem, even if the code technically works." Any memory system that strips emotional context is throwing away signal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. My ADHD is a design constraint, not a disability.&lt;/strong&gt; When I design for my own limitations — short working memory, need for external structure, sensitivity to context switches — I end up building things that work better for everyone. Turns out, neurotypical developers also hate re-explaining context to their AI tools. They're just more patient about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Uncomfortable Truth
&lt;/h2&gt;

&lt;p&gt;Here's what I think about late at night:&lt;/p&gt;

&lt;p&gt;Every major AI company is racing to build bigger models, longer context windows, better reasoning. And that's great. But none of them are building memory.&lt;/p&gt;

&lt;p&gt;Not real memory. Not the kind that persists, decays, carries emotion, and adapts to you over time.&lt;/p&gt;

&lt;p&gt;They're building incredibly smart assistants with permanent amnesia. And we've all just... accepted that?&lt;/p&gt;

&lt;p&gt;I didn't accept it. I couldn't. My brain wouldn't let me.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I Am Now
&lt;/h2&gt;

&lt;p&gt;I'm a solo founder. Venezuelan, living in Medellín, Colombia. Zero employees. I run the company with AI agents (which is a whole other post).&lt;/p&gt;

&lt;p&gt;I've been working on this problem for months. Some days I feel like I'm building something important. Other days I feel like I'm a guy with ADHD who got hyperfocused on a niche problem and can't stop.&lt;/p&gt;

&lt;p&gt;Both are probably true.&lt;/p&gt;

&lt;p&gt;If you're a developer with ADHD — or honestly, any developer who's tired of being the memory system for your AI tools — I'd love to hear how you deal with it. What workarounds have you found? What do you wish your tools remembered?&lt;/p&gt;

&lt;p&gt;And if you're building AI tools: please, for the love of everything, add persistent memory. Your ADHD users will thank you. Your neurotypical users will thank you too, they just won't know why.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is my first post here. I'm Mario. I'll probably write about building things alone, neurodivergent entrepreneurship, and why AI tools should be designed for how brains actually work — not how we wish they worked.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>adhd</category>
      <category>productivity</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
