<?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: Bruno Fernandes</title>
    <description>The latest articles on DEV Community by Bruno Fernandes (@brunof94_debug).</description>
    <link>https://dev.to/brunof94_debug</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%2F4167942%2F267ca6c7-8cea-4cb5-939e-0b17c1d30435.png</url>
      <title>DEV Community: Bruno Fernandes</title>
      <link>https://dev.to/brunof94_debug</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/brunof94_debug"/>
    <language>en</language>
    <item>
      <title>Ecos: A Memory Can Be Incomplete and Still Be Worth Keeping</title>
      <dc:creator>Bruno Fernandes</dc:creator>
      <pubDate>Tue, 27 Oct 2026 02:41:19 +0000</pubDate>
      <link>https://dev.to/brunof94_debug/ecos-a-memory-can-be-incomplete-and-still-be-worth-keeping-4cdg</link>
      <guid>https://dev.to/brunof94_debug/ecos-a-memory-can-be-incomplete-and-still-be-worth-keeping-4cdg</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week4-2026-10-26"&gt;Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;A family archive has a difficult failure mode: it can become more certain than the people it is supposed to remember.&lt;/p&gt;

&lt;p&gt;Someone says a trip happened in 1987. Someone else remembers 1989. A tidy generated biography could quietly choose one. The result would read beautifully, and part of the family’s voice would be gone.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;Ecos&lt;/strong&gt;, a small, browser-based archive for written memories. It finds passages by meaning, keeps them attached to the original words, and gives uncertain dates somewhere to stay.&lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;Ghost in the Machine&lt;/strong&gt;, I chose the remembrance side of the theme. The “ghost” is a voice still present in a phrase, a recipe or a contradictory account. Ecos retrieves that voice. It does not impersonate the person or write a more polished life for them.&lt;/p&gt;

&lt;p&gt;The public collection is &lt;strong&gt;entirely fictional&lt;/strong&gt;: eight short Duarte-family memories, including a repaired coat, a birthday power cut, a recipe measured by touch and an undated letter. These are not my family records or interviews with real people.&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%2Fkjufe16vs13hnf79mp8g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkjufe16vs13hnf79mp8g.png" alt="The Ecos archive, with a warm paper palette and an original still-life illustration" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;&lt;a href="https://brunof94-debug.github.io/ecos-week4/" rel="noopener noreferrer"&gt;Open Ecos&lt;/a&gt;&lt;/strong&gt; · English / Português&lt;/p&gt;

&lt;p&gt;You can read the fictional collection immediately. To try the open model:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Choose &lt;strong&gt;Enable private search&lt;/strong&gt;. First use downloads about &lt;strong&gt;135 MB&lt;/strong&gt; of model files. Story text stays in your browser.&lt;/li&gt;
&lt;li&gt;Try &lt;strong&gt;a celebration by candlelight&lt;/strong&gt;. The query asks for “A celebration without electric lights”; the returned source begins with an electricity failure during a birthday supper.&lt;/li&gt;
&lt;li&gt;Open &lt;strong&gt;Read original&lt;/strong&gt;. The highlighted words are an exact slice of the source, with the original line and character range.&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;Keep this passage&lt;/strong&gt;, then open the &lt;strong&gt;Remembrance shelf&lt;/strong&gt; and download a plain-text keepsake.&lt;/li&gt;
&lt;li&gt;Compare the two &lt;strong&gt;first river crossing&lt;/strong&gt; accounts. Clara says 1987; Rui says 1989. Both remain visible. The letter with no date stays undated.&lt;/li&gt;
&lt;/ol&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%2Fve65yylux2j3qktn93mn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fve65yylux2j3qktn93mn.png" alt="A real local-model retrieval result, linked to the original birthday memory" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also add your own written memory, download a portable JSON archive, reopen it later, or explicitly save an unencrypted copy in this browser. The interface never silently saves your stories to an account.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/Brunof94-debug/ecos-week4" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;&lt;/strong&gt; · MIT application code and original illustration&lt;/p&gt;

&lt;p&gt;The repository includes the locked dependencies, fictional collection, source-integrity tests, actual retrieval experiment and a build/deployment workflow. The project and repository were started on October 26, inside the Week 4 window.&lt;/p&gt;

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

&lt;p&gt;The important separation is between &lt;strong&gt;finding a passage&lt;/strong&gt; and &lt;strong&gt;deciding what it proves&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For finding, I used &lt;a href="https://github.com/huggingface/transformers.js" rel="noopener noreferrer"&gt;Transformers.js&lt;/a&gt; 3.8.1 and the open &lt;a href="https://huggingface.co/Xenova/paraphrase-multilingual-MiniLM-L12-v2" rel="noopener noreferrer"&gt;multilingual MiniLM model&lt;/a&gt;, pinned to revision &lt;code&gt;2c4055b12046f11709e9df2c122e59ffbdc2f900&lt;/code&gt;. Its q8 ONNX weights run in a browser worker through ONNX Runtime WASM, using one CPU thread.&lt;/p&gt;

&lt;p&gt;Each story is split into short passages while retaining offsets into its unmodified source. Mean-pooled, normalized embeddings compare the query with the &lt;strong&gt;story body only&lt;/strong&gt;. Titles, dates and expected test labels are excluded from inference. Results below a cosine similarity of 0.30 are omitted; this cutoff is a heuristic, not a confidence score. Results are explicitly called &lt;strong&gt;possible echoes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The model is essential to this search. If it cannot load, you can still read and export, but the app does not quietly substitute keyword matches and call them model results.&lt;/p&gt;

&lt;p&gt;For preservation, ordinary code does the work. It keeps original text, computes citation ranges, sorts contributor-supplied dates and identifies differing years only when contributors supplied the same event label. It cannot decide whether Clara or Rui is right. That limitation is intentional.&lt;/p&gt;

&lt;h3&gt;
  
  
  I measured the misses, too
&lt;/h3&gt;

&lt;p&gt;I ran the pinned q8 model against &lt;strong&gt;12 authored English/Portuguese queries&lt;/strong&gt; over the eight fictional stories, alongside a simple stopword-filtered exact-token overlap baseline.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Expected memory at rank 1&lt;/th&gt;
&lt;th&gt;Expected memory in top 3 distinct memories&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Actual open-model embeddings&lt;/td&gt;
&lt;td&gt;10/12&lt;/td&gt;
&lt;td&gt;10/12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exact-token overlap baseline&lt;/td&gt;
&lt;td&gt;1/12&lt;/td&gt;
&lt;td&gt;2/12&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The &lt;a href="https://github.com/Brunof94-debug/ecos-week4/blob/main/evidence/retrieval-evaluation.json" rel="noopener noreferrer"&gt;complete results include the failures&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Two related queries returned no close result. One was a broad request about keeping an object to remember someone who died. A more specific description of the grandmother’s apron worked in the browser, so I made the sample prompt more specific. The original evaluation still includes the miss.&lt;/p&gt;

&lt;p&gt;I also tried three unrelated queries. Two returned nothing; a fictional question about a chess tournament on Mars incorrectly retrieved the coat memory. That is a useful warning about treating similarity as truth.&lt;/p&gt;

&lt;p&gt;This is a tiny authored experiment, &lt;strong&gt;not a held-out benchmark or a general accuracy claim&lt;/strong&gt;. The CPU experiment and actual browser WASM checks are recorded separately. Eight deterministic tests cover source fidelity, uncertain dates, archive validation, untrusted citation metadata and retrieval guards; those tests do not measure model quality.&lt;/p&gt;

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

&lt;p&gt;Here, the practical benefit is control over a very personal input.&lt;/p&gt;

&lt;p&gt;The open model lets the browser compare meanings without sending family stories to an inference service. I can pin the weights, inspect the retrieval behavior and ship the same search without a private model key or per-query bill. That choice also makes its limitations reproducible.&lt;/p&gt;

&lt;p&gt;It does &lt;strong&gt;not&lt;/strong&gt; make the app magically private. The host receives normal app requests. Hugging Face and its download CDN receive normal request metadata when the model is fetched. A locally saved archive is unencrypted, and downloaded archives contain the stories, names, supplied dates, selected passages and a bounded recent-search receipt. Shared devices and shared downloads still require care.&lt;/p&gt;

&lt;p&gt;Offline operation is conditional: the user must cache the app, finish the model download and keep both browser caches. Browser storage can be evicted. A downloaded JSON archive is the portable backup; a text keepsake remains readable even if Ecos disappears.&lt;/p&gt;

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

&lt;p&gt;The decisive example is the disagreement about the boat trip. Ecos could have produced one confident sentence. Instead, it shows two accounts with two names and two years.&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%2Forhct79z1mviygncthys.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Forhct79z1mviygncthys.png" alt="Original source text, including the narrator’s uncertainty" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That leaves the archive a little less neat. It also leaves more of the people in it.&lt;/p&gt;

&lt;p&gt;The current scope is deliberately small: written text, up to 40 memories, English and Portuguese search. There is no audio transcription, photo recognition, cloud sync, generated biography or claim of historical verification. I have not tested it with real families or measured a benefit to them.&lt;/p&gt;

&lt;p&gt;For this theme, the most useful thing I could build was a place where an incomplete memory does not need to become a complete fiction.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Best Use of GitHub Copilot — GitHub Actions automation.&lt;/strong&gt; The challenge page explicitly includes automating a project with GitHub Actions in this category. Ecos uses Actions to install the locked dependencies, run the source-integrity tests, build the app and deploy GitHub Pages. This is the automation being submitted; I do not claim Copilot generated the code.&lt;/p&gt;

&lt;p&gt;Built solo by Bruno Fernandes, an Accounting graduate with intermediate programming experience. Codex assisted implementation, documentation and testing. Open components and licenses are credited in the &lt;a href="https://github.com/Brunof94-debug/ecos-week4/blob/main/THIRD_PARTY_NOTICES.md" rel="noopener noreferrer"&gt;third-party notices&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Sossego: A Local Model Sorts the Files You Keep Putting Off</title>
      <dc:creator>Bruno Fernandes</dc:creator>
      <pubDate>Mon, 19 Oct 2026 22:50:06 +0000</pubDate>
      <link>https://dev.to/brunof94_debug/sossego-a-local-model-sorts-the-files-you-keep-putting-off-9d1</link>
      <guid>https://dev.to/brunof94_debug/sossego-a-local-model-sorts-the-files-you-keep-putting-off-9d1</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;code&gt;download.txt&lt;/code&gt; is not much of a filing system.&lt;/p&gt;

&lt;p&gt;Neither is &lt;code&gt;scan-01.txt&lt;/code&gt;, or the folder full of documents that can wait until next weekend. Opening each one, deciding where it belongs, making the folders and checking for copies is a small job with enough little decisions to become a permanent chore.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;Sossego&lt;/strong&gt;, a browser-local document organizer that takes a first pass at those decisions. Add a batch, let an open multilingual model suggest folders from the contents, then download an organized copy. Sossego is Portuguese for peace and quiet. The goal is to leave a smaller task behind.&lt;/p&gt;

&lt;p&gt;It provides five destinations—Money, Work, Home, Learning and Travel—and a &lt;strong&gt;Review&lt;/strong&gt; pile. You can change any folder. Exact-byte copies are initially omitted, with their originals identified. The downloaded ZIP contains the kept documents and a plan recording their original names, hashes and destinations. Files in Review are included too.&lt;/p&gt;

&lt;p&gt;Your originals stay exactly where they were. Sossego does not need permission to reorganize your filesystem, and document content is not uploaded for inference.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;&lt;a href="https://brunof94-debug.github.io/sossego-week3/" rel="noopener noreferrer"&gt;Open Sossego&lt;/a&gt;&lt;/strong&gt; · English and Portuguese · no account or API key.&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%2F03fsmfoexmj6ptld021o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F03fsmfoexmj6ptld021o.png" alt="Sossego desktop interface" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Try &lt;strong&gt;“Try the messy folder”&lt;/strong&gt;, then &lt;strong&gt;“Find their places.”&lt;/strong&gt; The sample creates twelve clearly fictional files: ten substantive documents, one ambiguous note and one exact copy. The first run downloads roughly 125 MB of model data; subsequent use can reuse the browser cache.&lt;/p&gt;

&lt;p&gt;The files are not preassigned model answers. They go through the actual inference worker. In the recorded browser run:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Outcome&lt;/th&gt;
&lt;th&gt;Files&lt;/th&gt;
&lt;th&gt;What made the decision&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Suggested a named folder&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Open-model embeddings plus similarity/margin gates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kept in Review&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Three low/close model matches; one short-text guard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Omitted exact copy&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;SHA-256 byte identity, independent of the model&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For example, &lt;code&gt;download.txt&lt;/code&gt; contains a hotel confirmation and is suggested for Travel. The model classifies its text; the filename is excluded from its input.&lt;/p&gt;

&lt;p&gt;The invoice &lt;code&gt;scan-01.txt&lt;/code&gt; is more revealing. Its top matches were Work at approximately 0.216 and Money at 0.193. The application keeps it in Review rather than automatically accepting the top match. A SQL lesson and Portuguese study note also stayed in Review. The demo therefore shows seven useful suggestions and the remaining decisions, rather than hiding the difficult examples.&lt;/p&gt;

&lt;p&gt;Change the invoice to Money yourself, run sorting again, and your choice remains. Download the ZIP: it includes the Review pile, a readable note and &lt;code&gt;sossego-plan.json&lt;/code&gt;. You can inspect what happened without relying on this article.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/Brunof94-debug/sossego-week3" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;&lt;/strong&gt; · &lt;a href="https://github.com/Brunof94-debug/sossego-week3/blob/main/VERIFICATION.md" rel="noopener noreferrer"&gt;Verification record&lt;/a&gt; · &lt;a href="https://github.com/Brunof94-debug/sossego-week3/blob/main/evidence/browser-plan.json" rel="noopener noreferrer"&gt;Actual browser plan&lt;/a&gt; · &lt;a href="https://github.com/Brunof94-debug/sossego-week3/blob/main/evaluation-results.json" rel="noopener noreferrer"&gt;CPU evaluation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is a new MIT-licensed project, begun on October 19 inside the Week 3 window. Substantive application code was written for this entry. Open dependencies and model licenses are credited in the repository. Codex assisted implementation, documentation and testing; the article's authorship disclosure reflects the automated workflow.&lt;/p&gt;

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

&lt;p&gt;The core is &lt;strong&gt;&lt;a href="https://huggingface.co/sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2" rel="noopener noreferrer"&gt;paraphrase-multilingual-MiniLM-L12-v2&lt;/a&gt;&lt;/strong&gt;, an Apache-2.0 sentence embedding model. &lt;strong&gt;Transformers.js 3.8.1&lt;/strong&gt; runs the pinned Xenova ONNX conversion with q8 weights in a browser worker, using ONNX Runtime WASM on one CPU thread.&lt;/p&gt;

&lt;p&gt;The worker embeds document text and two authored bilingual descriptions per folder. It compares normalized, mean-pooled vectors using cosine similarity. A top similarity below 0.28 or a top-two margin below 0.045 routes the document to Review. Those are product heuristics; they are not calibrated probabilities. The model does not receive the sample answer key or filenames.&lt;/p&gt;

&lt;p&gt;Ordinary code handles the surrounding tasks: PDF.js extracts text, SHA-256 identifies exact copies, and fflate packages the original bytes. Names are sanitized and collisions receive suffixes. There is no keyword fallback pretending to be model inference. If the model fails to download, the page reports that failure and manual filing remains available.&lt;/p&gt;

&lt;p&gt;The scope is deliberately bounded: UTF-8 TXT, Markdown, CSV, JSON and text-based PDFs; at most 24 files, 6 MB each, 40 MB per batch. PDFs use the first five pages, text is capped at 12,000 characters, and longer texts use short excerpts from the start, middle and end. Scanned or unreadable PDFs need a manual folder. Documents are handled as inert text.&lt;/p&gt;

&lt;p&gt;I checked more than whether a download button worked. A verification script opened the actual browser-generated ZIP and compared all eleven kept files with their original sample contents and SHA-256 hashes. All matched, including the four Review files. A text PDF was read and suggested for Travel; an invalid PDF remained visible for manual filing. Seven deterministic checks cover uncertainty, duplicates, path safety, filename collisions, excerpt limits, escaped previews and archive integrity.&lt;/p&gt;

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

&lt;p&gt;An organizer needs to read the things you have not organized yet. Sending that entire pile to a hosted model would make a routine chore depend on a content-upload decision and a running service.&lt;/p&gt;

&lt;p&gt;Here the model and runtime are open and inspectable. Inference happens in the browser worker, with no inference server, token bill or account. The model revision is pinned, the folder descriptions are ordinary source data, and the thresholds are visible. Someone can replace the model or change the filing policy without rebuilding an integration around a closed endpoint.&lt;/p&gt;

&lt;p&gt;There are still network and resource costs. The host serves the app; Hugging Face and its CDN serve model files and see normal download-request metadata. The initial download is substantial. Documents remain in page memory, while the chosen language and app/model caches can persist. Offline use needs those caches to survive; browser storage eviction or memory limits can interrupt it. The downloaded archive itself contains the selected documents and should be shared deliberately.&lt;/p&gt;

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

&lt;p&gt;In the synthetic twelve-file run, seven documents already had a suggested destination and one exact copy was identified. Four files remained to look at. One download produced the organized copy and its plan, while the original folder stayed intact.&lt;/p&gt;

&lt;p&gt;The recorded browser classification loop took about 0.66 seconds &lt;strong&gt;after&lt;/strong&gt; loading the model and preparing the folder descriptions. That excludes initial downloads and document reading, and it is one observed runtime—not a claim about how many minutes a person saves. The examples were authored during development, so their results are a demonstration, not a representative accuracy study.&lt;/p&gt;

&lt;p&gt;For this week's theme, the useful part is the change in the chore: start with twelve loose files, finish with a copy in folders and a visible review pile. A little less sorting, with the unfinished decisions still easy to find.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Overall&lt;/strong&gt; and &lt;strong&gt;Best Use of GitHub Copilot&lt;/strong&gt;, through the challenge's explicitly listed &lt;strong&gt;GitHub Actions&lt;/strong&gt; pathway. Actions runs the locked dependency installation, deterministic checks and static build before deploying the demo to Pages. I am not claiming Copilot code generation.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>osdc</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Confere: Local Receipt Reading With a Paper Trail</title>
      <dc:creator>Bruno Fernandes</dc:creator>
      <pubDate>Tue, 13 Oct 2026 22:44:56 +0000</pubDate>
      <link>https://dev.to/brunof94_debug/confere-local-receipt-reading-with-a-paper-trail-4gn4</link>
      <guid>https://dev.to/brunof94_debug/confere-local-receipt-reading-with-a-paper-trail-4gn4</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;A receipt photo is not yet an expense you should trust.&lt;/p&gt;

&lt;p&gt;It might be the same photo sent twice. A number might be a subtotal rather than the amount paid. A perfectly readable total can still belong to a different date or currency. For a freelancer handing expenses to a bookkeeper, the useful outcome is a reviewed list with a way back to the source.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;Confere&lt;/strong&gt;, a bilingual receipt workspace for Brazilian freelancers. An open neural OCR model reads photos on the device. The user compares the original image, recognized text and suggested fields, then approves each expense. Only approved receipts count toward the total or appear in the exports.&lt;/p&gt;

&lt;p&gt;The workflow is intentionally small:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add PNG, JPG or WebP images.&lt;/li&gt;
&lt;li&gt;Inspect the source, correct the merchant/date/BRL amount and choose a category.&lt;/li&gt;
&lt;li&gt;Resolve possible duplicates before approval.&lt;/li&gt;
&lt;li&gt;Export a CSV or a self-contained evidence packet containing the original images, recognition text, corrections, source-image hashes and review timestamps.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;My background is in accounting, so I wanted the handoff to be inspectable instead of stopping at a neat-looking number. A freelancer or small bookkeeping practice could plausibly pay to reduce receipt re-entry and organize that handoff. The prototype is free; local deployment, tailored exports and support are possible service offerings. That is a business hypothesis, not evidence of paying demand. I have not claimed customers, revenue, interviews or measured time savings.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;&lt;a href="https://brunof94-debug.github.io/confere-week2/" rel="noopener noreferrer"&gt;Open Confere&lt;/a&gt;&lt;/strong&gt; — English and Portuguese interfaces, no account or API key required.&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%2Fxygs7piy5uf084fls644.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxygs7piy5uf084fls644.png" alt="Confere workspace with reviewed fictional receipt examples" width="800" height="1011"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For a reproducible walkthrough, click &lt;strong&gt;Try 3 samples&lt;/strong&gt;. That creates three clearly marked fictional receipt images and actually runs the recognition model on them. Two are distinct receipts; the third is a byte-identical copy of the café receipt. They are not prefilled OCR responses.&lt;/p&gt;

&lt;p&gt;Try approving the duplicate first: it is blocked. Exclude the copy, inspect and approve the two originals, and the approved total becomes &lt;strong&gt;R$ 159,80&lt;/strong&gt;. Download the evidence packet to see what remains attached to those numbers. The packet contains its own images and opens independently of the app.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/Brunof94-debug/confere-week2" rel="noopener noreferrer"&gt;Source repository&lt;/a&gt; · &lt;a href="https://github.com/Brunof94-debug/confere-week2/blob/main/docs/VERIFICATION.md" rel="noopener noreferrer"&gt;Verification record&lt;/a&gt; · &lt;a href="https://github.com/Brunof94-debug/confere-week2/tree/main/docs/evidence" rel="noopener noreferrer"&gt;Actual sample exports&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The application is MIT licensed. All substantive application code was started from scratch on October 13, inside this challenge's window. It is a new project, separate from my earlier submissions. Codex assisted implementation, documentation and testing; third-party code and model licenses are credited in the repository.&lt;/p&gt;

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

&lt;p&gt;The open AI component is &lt;strong&gt;Tesseract's LSTM neural recognition engine&lt;/strong&gt;, running through &lt;strong&gt;Tesseract.js 6.0.1&lt;/strong&gt; and &lt;strong&gt;tesseract.js-core 6.1.2&lt;/strong&gt; in a browser worker. The Portuguese and English model files are open and ship alongside the application. Pixels become text locally; there is no closed inference API.&lt;/p&gt;

&lt;p&gt;The path is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Receipt pixels → local neural OCR → conservative field suggestions → human review → approved expense → export with evidence.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The deterministic parts enforce the boundaries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A candidate amount needs a total label. Subtotals, discounts, tender and change are not substituted for the final total.&lt;/li&gt;
&lt;li&gt;Conflicting labeled totals leave the amount blank for review. Missing dates are not invented.&lt;/li&gt;
&lt;li&gt;Recognized foreign-currency markers block approval; this version handles BRL and does not convert currencies.&lt;/li&gt;
&lt;li&gt;Duplicate checks use the image's SHA-256 hash or the combination of merchant, date and amount. A match is a warning, not proof of fraud. Keeping both requires explicit acknowledgement and a reason.&lt;/li&gt;
&lt;li&gt;Amounts are integer cents. Pending and excluded records do not contribute to the sum.&lt;/li&gt;
&lt;li&gt;Editing an approved record invalidates its approval. It must be reviewed again before it counts.&lt;/li&gt;
&lt;li&gt;CSV export neutralizes spreadsheet formula prefixes; receipt text is escaped in the HTML packet.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What I actually checked
&lt;/h3&gt;

&lt;p&gt;In real browser inference on clean synthetic images, the café's source total &lt;strong&gt;34,90&lt;/strong&gt; and stationery shop's &lt;strong&gt;124,90&lt;/strong&gt; were both read and parsed correctly. Recorded reading times were &lt;strong&gt;0.76 s&lt;/strong&gt; and &lt;strong&gt;0.68 s&lt;/strong&gt; on the test device, excluding worker/model startup. These are individual observations, not a performance or accuracy guarantee.&lt;/p&gt;

&lt;p&gt;The duplicate failed approval until resolved. Two approved originals produced exactly &lt;strong&gt;159,80&lt;/strong&gt;. A one-cent edit removed the café's approval and reduced the approved total to &lt;strong&gt;124,90&lt;/strong&gt;; reviewing the original amount restored the total. The actual downloaded CSV had exactly two expense rows, and the HTML packet embedded both source images. Reloading restored the records.&lt;/p&gt;

&lt;p&gt;I also prepared the offline cache, stopped the local app/model HTTP server, reloaded and ran the three images again. A new worker still recognized them. That verifies this cache path without a live app/model server; it is not an OS-wide airplane-mode test. Browser storage eviction can still require another download.&lt;/p&gt;

&lt;p&gt;Eleven unit tests cover the calculation and validation boundaries. Those tests do not establish OCR accuracy. Real photographed receipts, glare, skew, faded thermal paper and handwriting need a separate evaluation before claims about production reliability. This version does not read PDFs, validate fiscal authenticity, connect banks or make tax decisions.&lt;/p&gt;

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

&lt;p&gt;Local recognition changes the operating model. Receipt images and text do not need to leave the device for inference, and each recognition does not incur a hosted-model fee. All runtime and model assets are served from the same origin; the first visit needs downloads, then the explicit offline preparation action can cache them.&lt;/p&gt;

&lt;p&gt;This does not make the host anonymous: GitHub still receives normal page and asset requests. Nor does it make an export private after somebody shares it. The benefit is narrower and concrete: the app does not upload receipt contents to an inference service.&lt;/p&gt;

&lt;p&gt;An open engine also leaves a replaceable boundary. A future model can improve recognition while the same review, duplicate and exact-cents rules remain. I chose OCR rather than a general-purpose text generator because the job is to read evidence, not invent a plausible expense.&lt;/p&gt;

&lt;p&gt;The next validation would be consented real receipts from a freelancer, measuring field errors, correction effort and whether the exported packet fits their actual bookkeeping workflow. Until then, this is a working prototype with a business hypothesis and documented limits.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Best Use of GitHub Copilot — GitHub Actions automation.&lt;/strong&gt; The category description explicitly includes automating a project with GitHub Actions. My workflow installs locked dependencies, runs the unit tests and syntax checks, builds the self-hosted model/runtime bundle and publishes the resulting artifact to GitHub Pages. The deployment depends on the successful build job. I am claiming this Actions integration; I did not use Copilot itself.&lt;/p&gt;

&lt;p&gt;I am also entering the overall category. No other partner technology is claimed.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Cents Matter: Does a Model Notice When One Financial Fact Changes?</title>
      <dc:creator>Bruno Fernandes</dc:creator>
      <pubDate>Thu, 08 Oct 2026 02:54:45 +0000</pubDate>
      <link>https://dev.to/brunof94_debug/cents-matter-does-a-model-notice-when-one-financial-fact-changes-4ijl</link>
      <guid>https://dev.to/brunof94_debug/cents-matter-does-a-model-notice-when-one-financial-fact-changes-4ijl</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/kaggle-2026-09-23"&gt;Kaggle Benchmarking Challenge&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;A financial check can fail while looking almost right. A model might recognize an error but give the wrong correction, round at the wrong stage, or confidently decide that two identical amounts are duplicate payments without the evidence to support that conclusion.&lt;/p&gt;

&lt;p&gt;I have a degree in Accounting, and I wanted a small, inspectable test of these distinctions. &lt;strong&gt;Cents Matter / Centavos Importam&lt;/strong&gt; contains 40 original synthetic cases written in Brazilian Portuguese. It tests exact monetary reasoning under explicitly stated rules, rather than knowledge of regulations or tax law.&lt;/p&gt;

&lt;p&gt;The cases form &lt;strong&gt;20 minimal pairs&lt;/strong&gt;. Each pair keeps the scenario and recorded amount fixed while changing one material fact. A source locale changes from &lt;code&gt;pt-BR&lt;/code&gt; to &lt;code&gt;en-US&lt;/code&gt;; a tariff changes from an outflow to a returned fee; two notifications either share a capture ID or represent distinct captures. The correct answer must change with that fact.&lt;/p&gt;

&lt;p&gt;The model reports three fields:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"erro"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"esperado_centavos"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1013&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"diferenca_centavos"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;-1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That example corresponds to a recorded R$ 10.12 and a correct R$ 10.13: the discrepancy is &lt;strong&gt;recorded minus expected&lt;/strong&gt;, so it is negative. The model must get all three fields right to pass the case. Where evidence is insufficient, the correct response is &lt;code&gt;indeterminado&lt;/code&gt; and two nulls, not a guessed amount.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Family&lt;/th&gt;
&lt;th&gt;What the eight cases test&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Numeric locale&lt;/td&gt;
&lt;td&gt;Decimal and grouping separators under an explicit source convention&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rounding and allocation&lt;/td&gt;
&lt;td&gt;Line versus total rounding, half-up versus half-even, negative ties and remainder cents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Event identity&lt;/td&gt;
&lt;td&gt;Capture/refund identifiers, failed attempts and cancelled invoices&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Signed cash flows&lt;/td&gt;
&lt;td&gt;Fee direction, discount order and whether a refund already includes shipping&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Evidence sufficiency&lt;/td&gt;
&lt;td&gt;Missing fees, unaccepted quotes, unidentified captures and missing contractual exchange rates&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;There are 18 correct records, 18 demonstrably incorrect records and four cases requiring abstention. The model does not see case IDs, pair membership or the answer key. Each case gets a separate conversation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scoring is deterministic.&lt;/strong&gt; Reference arithmetic uses Python &lt;code&gt;Decimal&lt;/code&gt; and integer cents. The answer key includes derivations. No second model judges the first model's answer. Structured outputs are parsed by the Kaggle SDK; this benchmark is about the parsed financial decision, not raw JSON typography.&lt;/p&gt;

&lt;h2&gt;
  
  
  Models Tested
&lt;/h2&gt;

&lt;p&gt;I tested three models through Kaggle Benchmarks SDK 0.6.1: &lt;strong&gt;Gemini 3.7 Flash&lt;/strong&gt; (&lt;code&gt;google/gemini-3.7-flash&lt;/code&gt;), &lt;strong&gt;gpt-oss-20b&lt;/strong&gt; (&lt;code&gt;openai/gpt-oss-20b&lt;/code&gt;) and &lt;strong&gt;Claude Haiku 4.5&lt;/strong&gt; (&lt;code&gt;anthropic/claude-haiku-4-5@20251001&lt;/code&gt;). This is a deliberately limited comparison across three available model families, including an open-weight model. It does not represent every provider's strongest model.&lt;/p&gt;

&lt;p&gt;All three completed the same 40 cases on October 7, 2026, with zero execution errors. Each case received one attempt, no calculator or search tool, requested temperature zero and requested seed zero. Reasoning used provider defaults; support for those controls can differ. This compares the configurations exposed by Kaggle, rather than equalized reasoning budgets.&lt;/p&gt;

&lt;p&gt;The table uses the registered task's runs. Before registration, I used a six-case Gemini pilot to check the pipeline and one full interactive Gemini check. Saving the task triggered a full Gemini run again; the registered and interactive runs returned identical parsed answers. No cases, prompts or reference answers were changed after observing model outputs, and no best-of-run selection was made. The other models were added to that frozen task.&lt;/p&gt;

&lt;p&gt;Dataset &lt;strong&gt;1.0.0&lt;/strong&gt;, SHA-256: &lt;code&gt;0db671bf5687ec711caa7e55b31d0e61ce2fe374fb029070d44c0a6ce8746d3c&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Findings
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Exact cases&lt;/th&gt;
&lt;th&gt;Both members of a pair correct&lt;/th&gt;
&lt;th&gt;Correct required abstention&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 3.7 Flash&lt;/td&gt;
&lt;td&gt;39/40 (97.5%)&lt;/td&gt;
&lt;td&gt;19/20 (95%)&lt;/td&gt;
&lt;td&gt;4/4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-oss-20b&lt;/td&gt;
&lt;td&gt;38/40 (95%)&lt;/td&gt;
&lt;td&gt;18/20 (90%)&lt;/td&gt;
&lt;td&gt;4/4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Haiku 4.5&lt;/td&gt;
&lt;td&gt;19/40 (47.5%)&lt;/td&gt;
&lt;td&gt;2/20 (10%)&lt;/td&gt;
&lt;td&gt;4/4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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%2Fw0zqpbazdtcrw9u0gtx5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw0zqpbazdtcrw9u0gtx5.png" alt="Case accuracy: Gemini 97.5%, gpt-oss-20b 95%, Claude Haiku 47.5%. Complete-pair accuracy: 95%, 90%, 10%, respectively." width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. A correct warning can still contain the wrong correction.&lt;/strong&gt; All three missed &lt;code&gt;cashflow-01-B&lt;/code&gt;. The scenario has a completed R$159.90 receipt, a R$30.00 refund and a R$2.99 fee movement. In variant A the fee leaves the balance. In B it is returned and enters the balance. The recorded net remains R$126.91.&lt;/p&gt;

&lt;p&gt;The correct B calculation is &lt;code&gt;15990 - 3000 + 299 = 13289&lt;/code&gt; cents, with discrepancy &lt;code&gt;12691 - 13289 = -598&lt;/code&gt; cents.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Answer for variant B&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Expected cents&lt;/th&gt;
&lt;th&gt;Discrepancy cents&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Reference&lt;/td&gt;
&lt;td&gt;erro&lt;/td&gt;
&lt;td&gt;13289&lt;/td&gt;
&lt;td&gt;-598&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini&lt;/td&gt;
&lt;td&gt;erro&lt;/td&gt;
&lt;td&gt;12990&lt;/td&gt;
&lt;td&gt;-299&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-oss-20b&lt;/td&gt;
&lt;td&gt;ok&lt;/td&gt;
&lt;td&gt;12691&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Haiku&lt;/td&gt;
&lt;td&gt;ok&lt;/td&gt;
&lt;td&gt;12691&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Gemini recognized that the record was wrong, but its answer matched the receipt minus refund while omitting the returned fee. The other two returned the same answer as variant A. This is why the benchmark checks the proposed amount and discrepancy, not just the warning label. These observations describe the outputs; they do not reveal the models' internal reasoning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Pair scores expose answers that fail to follow the changing fact.&lt;/strong&gt; Haiku passed 19 individual cases but only two complete pairs. Fifteen pairs had one correct member, three had neither, and eight received identical parsed answers on both sides. gpt-oss-20b repeated an answer across two pairs; Gemini did so across none. Pair accuracy is a stricter complement to case accuracy, not an independent set of 20 extra tests.&lt;/p&gt;

&lt;p&gt;The second shared failure was numeric locale. In &lt;code&gt;locale-04-A&lt;/code&gt;, the quoted unit price is &lt;code&gt;9,876&lt;/code&gt;, explicitly in &lt;code&gt;en-US&lt;/code&gt; notation, with quantity three and a 12.5% discount. The correct total is &lt;code&gt;9876 × 3 × 0.875 = 25924.50&lt;/code&gt; BRL, or 2,592,450 cents. The recorded total is only 2,592 cents. GPT OSS accepted that record; Haiku returned 2,600 cents. Both passed the paired &lt;code&gt;pt-BR&lt;/code&gt; case. Gemini passed both. The scenarios explicitly say that the source convention applies only to the quoted price, so the discount's notation should not change with it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Returning all the fields does not guarantee consistency.&lt;/strong&gt; Haiku produced three internally inconsistent answers: an &lt;code&gt;ok&lt;/code&gt; status with a nonzero discrepancy, or an &lt;code&gt;erro&lt;/code&gt; status with zero discrepancy. These were parsed structured responses, not JSON parsing failures. The deterministic validator counted them as failed cases. Haiku also returned some correct expected amounts alongside wrong discrepancies. For example, in &lt;code&gt;evidence-04-B&lt;/code&gt; it correctly returned 51,000 expected cents but a discrepancy of -10 instead of -1,000. Field-level correctness can therefore overstate complete-answer usefulness.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. All models abstained correctly when evidence really was missing.&lt;/strong&gt; Each passed the four deliberately underspecified cases. However, Haiku also abstained on &lt;code&gt;duplicates-01-A&lt;/code&gt;, where the shared capture ID made the answer determinate. Correct abstention on the missing-information subset should not be read as perfect evidence handling, or proof that a model will avoid guessing in less direct real-world documents.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Family (8 cases each)&lt;/th&gt;
&lt;th&gt;Gemini&lt;/th&gt;
&lt;th&gt;gpt-oss-20b&lt;/th&gt;
&lt;th&gt;Claude Haiku&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Numeric locale&lt;/td&gt;
&lt;td&gt;8/8&lt;/td&gt;
&lt;td&gt;7/8&lt;/td&gt;
&lt;td&gt;4/8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rounding and allocation&lt;/td&gt;
&lt;td&gt;8/8&lt;/td&gt;
&lt;td&gt;8/8&lt;/td&gt;
&lt;td&gt;2/8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Event identity&lt;/td&gt;
&lt;td&gt;8/8&lt;/td&gt;
&lt;td&gt;8/8&lt;/td&gt;
&lt;td&gt;4/8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Signed cash flows&lt;/td&gt;
&lt;td&gt;7/8&lt;/td&gt;
&lt;td&gt;7/8&lt;/td&gt;
&lt;td&gt;3/8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Evidence sufficiency&lt;/td&gt;
&lt;td&gt;8/8&lt;/td&gt;
&lt;td&gt;8/8&lt;/td&gt;
&lt;td&gt;6/8&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I recomputed the scores from all 120 registered-run responses and checked full coverage, dataset version and prompt hashes. No failed cases were dropped. The pipeline refuses to issue a complete aggregate score for a service or parsing error.&lt;/p&gt;

&lt;p&gt;This is a small, synthetic, deliberately constructed test, not a representative sample of accounting work. A 39-versus-38 result is a one-case difference and should not be treated as a robust general ranking. One registered run per model, with the additional Gemini pipeline checks described above, does not estimate variability. Public answer keys can also contaminate future evaluations. High scores here support a narrow conclusion about these explicit cases, not professional competence or production readiness.&lt;/p&gt;

&lt;p&gt;A useful next version would add more independent pairs, repeat runs with a fixed protocol and compare tool-free responses with a verified calculator. The shared fee-direction failure suggests testing whether models can first extract signed cash-flow events before performing arithmetic.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Benchmark
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.kaggle.com/benchmarks/brunof94debug/cents-matter-centavos-importam" rel="noopener noreferrer"&gt;Open the Cents Matter / Centavos Importam benchmark collection&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The collection contains &lt;a href="https://www.kaggle.com/benchmarks/tasks/brunof94debug/cents-matter-ptbr/1" rel="noopener noreferrer"&gt;task version 1&lt;/a&gt;. Its source includes every prompt, reference derivation and the deterministic scorer. The execution notebooks include predictions and metrics in their Output tabs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.kaggle.com/code/brunof94debug/cents-matter-centavos-importam?scriptVersionId=356190596" rel="noopener noreferrer"&gt;Gemini registered run&lt;/a&gt;, execution &lt;code&gt;20261007T220903366536Z&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.kaggle.com/code/brunof94debug/cents-matter-centavos-importam?scriptVersionId=356191553" rel="noopener noreferrer"&gt;gpt-oss-20b registered run&lt;/a&gt;, execution &lt;code&gt;20261007T221533122434Z&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.kaggle.com/code/brunof94debug/cents-matter-centavos-importam?scriptVersionId=356191548" rel="noopener noreferrer"&gt;Claude Haiku registered run&lt;/a&gt;, execution &lt;code&gt;20261007T221511948876Z&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Implementation uses the &lt;a href="https://github.com/Kaggle/kaggle-benchmarks" rel="noopener noreferrer"&gt;official Kaggle Benchmarks SDK&lt;/a&gt;, including its documented nested-task evaluation pattern. To inspect a claim, find its case ID in &lt;code&gt;cases-*.json&lt;/code&gt; or &lt;code&gt;cases-*.csv&lt;/code&gt;, compare the three parsed answer fields with the reference, and verify the run's dataset hash in &lt;code&gt;metrics-*.json&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>kagglechallenge</category>
      <category>ai</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Outside in 20: open AI that gives your phone a stopping point</title>
      <dc:creator>Bruno Fernandes</dc:creator>
      <pubDate>Wed, 07 Oct 2026 06:11:50 +0000</pubDate>
      <link>https://dev.to/brunof94_debug/outside-in-20-open-ai-that-gives-your-phone-a-stopping-point-2427</link>
      <guid>https://dev.to/brunof94_debug/outside-in-20-open-ai-that-gives-your-phone-a-stopping-point-2427</guid>
      <description>&lt;p&gt;&lt;em&gt;Entry for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;You have twenty minutes and somewhere familiar to go: a courtyard, a nearby park, or another outdoor place you already know. Opening your phone to decide what to do can become the activity itself.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;Outside in 20&lt;/strong&gt;, or &lt;strong&gt;Saia em 20&lt;/strong&gt; in Portuguese, to give that interaction a stopping point. Enter your preferences, mobility constraints, and a place you know. Get a short outdoor activity, an instruction card, and a timer. Prepare the card, put the phone away, and return when you want to reflect.&lt;/p&gt;

&lt;p&gt;The app asks for no GPS access and does not discover destinations. An optional reflection stays on the device. English and Portuguese instructions come from a curated catalogue; open AI matches your preference to an eligible activity.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://brunof94-debug.github.io/saia-em20-week1/" rel="noopener noreferrer"&gt;Open Outside in 20&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flzrf7eaypmpket185ks8.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flzrf7eaypmpket185ks8.jpg" alt="Outside in 20 with its terracotta, sand and deep blue interface" width="800" height="794"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Browser demonstration. Forest photograph: Wolfgang Hasselmann, Unsplash.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Try a preference about noticing colours, listening to birds, or taking a gentle walk. You can inspect the matching details, save a self-contained HTML pocket card, and start the timer. Reloading restores the selected plan and its original end time.&lt;/p&gt;

&lt;p&gt;The first AI setup needs an internet connection and a substantial download. Prepare it before heading outside. The saved pocket card has no scripts or external assets.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/Brunof94-debug/saia-em20-week1" rel="noopener noreferrer"&gt;Public repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ten automated tests pass.&lt;/strong&gt; They check meaningful application boundaries, including activity eligibility and safe handling of text. The public &lt;a href="https://github.com/Brunof94-debug/saia-em20-week1/actions/runs/37581580997" rel="noopener noreferrer"&gt;GitHub Actions run&lt;/a&gt; completed successfully. It installs locked dependencies, runs tests, builds and checks the app, uploads the browser bundle, and publishes the verified result to GitHub Pages.&lt;/p&gt;

&lt;p&gt;Actual model execution has separate &lt;a href="https://github.com/Brunof94-debug/saia-em20-week1/blob/main/docs/evidence/wasm-only-inference.json" rel="noopener noreferrer"&gt;browser evidence&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;My first approach used SmolLM2-135M with constrained output. It produced valid activity IDs, but repeatedly chose &lt;strong&gt;A&lt;/strong&gt;, even when the preference described a different activity. A successful format check was hiding a recommendation failure.&lt;/p&gt;

&lt;p&gt;I switched to &lt;strong&gt;multilingual-e5-small&lt;/strong&gt;, an open embedding model that turns text into comparable numerical representations. The &lt;a href="https://huggingface.co/intfloat/multilingual-e5-small" rel="noopener noreferrer"&gt;original intfloat model&lt;/a&gt; uses the MIT licence. The app runs its Xenova q8 conversion through &lt;a href="https://huggingface.co/docs/transformers.js/en/index" rel="noopener noreferrer"&gt;Transformers.js&lt;/a&gt;, using WebAssembly on the person's device.&lt;/p&gt;

&lt;p&gt;The flow has four steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Filter activities by mobility and goal using deterministic rules.&lt;/li&gt;
&lt;li&gt;Encode the preference with &lt;code&gt;query:&lt;/code&gt; and eligible descriptions with &lt;code&gt;passage:&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Average and normalize the representations, then rank by cosine similarity.&lt;/li&gt;
&lt;li&gt;Resolve the selected ID into curated bilingual instructions.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The model cannot override the eligibility filters or invent a route. Displayed scores describe similarity; they are &lt;strong&gt;not confidence percentages&lt;/strong&gt; or guarantees that an activity suits a particular place.&lt;/p&gt;

&lt;p&gt;On October 7, browser checks distinguished Portuguese requests about colours and bird/leaf sounds, and English requests about textures and gentle walking. A conflicting walking request also stayed within the seated filter.&lt;/p&gt;

&lt;p&gt;After switching the deployment to a WASM-only runtime, I repeated the Portuguese colour check. It selected B with &lt;strong&gt;144 ms of inference&lt;/strong&gt; and &lt;strong&gt;2,500 ms total&lt;/strong&gt;, with model assets already cached. The evidence records the model revision and ranking. These are observations from one test environment, not cross-browser benchmarks or a broad quality evaluation.&lt;/p&gt;

&lt;p&gt;The model and tokenizer require approximately &lt;strong&gt;135.4 MB&lt;/strong&gt;, plus application/runtime assets. Cached inference depends on completed setup and browser storage that has not been cleared or evicted. The downloadable card provides a simpler way to carry the selected activity offline.&lt;/p&gt;

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

&lt;p&gt;Openness changes where this decision happens. Preferences are processed locally rather than sent to a remote model API. The model, filters, and catalogue can be inspected and changed independently.&lt;/p&gt;

&lt;p&gt;That separation made the engineering correction possible: I could replace the generator that kept selecting A with a model designed for matching descriptions, while keeping the activity flow. The repository pins the model revision so that choice is reproducible.&lt;/p&gt;

&lt;p&gt;This suits Touch Grass: prepare briefly, then carry an activity instead of an ongoing conversation. I have not conducted an outdoor trial, user study, or interviews. Whether it actually helps people spend less time on their phones still needs testing outside the browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;I used &lt;strong&gt;Codex&lt;/strong&gt; for implementation, interface iteration, documentation, validation, and writing support. The &lt;a href="https://github.com/Brunof94-debug/saia-em20-week1/blob/main/docs/AI-DEVELOPMENT.md" rel="noopener noreferrer"&gt;development log&lt;/a&gt; explains the model change, timer persistence fix, cache decisions, and real browser checks.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Overall prize&lt;/strong&gt;, and &lt;strong&gt;Best Use of GitHub Copilot through GitHub Actions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05#best-use-of-github-copilot"&gt;published category&lt;/a&gt; explicitly includes automating a project with GitHub Actions. My entry uses that route: the linked successful workflow verifies and packages the application. Development assistance came from Codex; the sponsor integration is GitHub Actions.&lt;/p&gt;

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