<?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: xyx200</title>
    <description>The latest articles on DEV Community by xyx200 (@xyx200).</description>
    <link>https://dev.to/xyx200</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%2F4219872%2Ff2fb5944-3b5d-4b94-8cb2-dcd952196b60.png</url>
      <title>DEV Community: xyx200</title>
      <link>https://dev.to/xyx200</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/xyx200"/>
    <language>en</language>
    <item>
      <title>Ghost in the README: a séance for the promises our projects forget</title>
      <dc:creator>xyx200</dc:creator>
      <pubDate>Sun, 01 Nov 2026 02:19:21 +0000</pubDate>
      <link>https://dev.to/xyx200/ghost-in-the-readme-a-seance-for-the-promises-our-projects-forget-52pp</link>
      <guid>https://dev.to/xyx200/ghost-in-the-readme-a-seance-for-the-promises-our-projects-forget-52pp</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;The most unsettling line in a README is sometimes the one that is no longer there.&lt;/p&gt;

&lt;p&gt;“Everything works offline.”&lt;/p&gt;

&lt;p&gt;“Every control is accessible with a keyboard.”&lt;/p&gt;

&lt;p&gt;“Your recordings never leave your computer.”&lt;/p&gt;

&lt;p&gt;A release arrives. The documentation gets shorter. Nothing in the diff tells us whether those promises were fulfilled, deliberately retired, or simply forgotten.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ghost in the README&lt;/strong&gt; is a small, local tool for that uncomfortable space. Give it two versions of a project document. An open-weight sentence model searches for the present-day echo of each old passage. It shows the words on both sides, their source lines, and how close the model thinks they are. Then it asks a person to decide: keep this promise, retire it deliberately, or investigate.&lt;/p&gt;

&lt;p&gt;That is my interpretation of this week's theme: a project's abandoned intentions haunting its present. The ghost is not a simulated person. It is an unresolved piece of responsibility.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://xyx200.github.io/ghost-in-the-readme/" rel="noopener noreferrer"&gt;Watch the recorded CLI demo&lt;/a&gt;. This public page replays an actual recorded run; live inference runs locally using the setup instructions below.&lt;/p&gt;

&lt;p&gt;The walkthrough uses genuine screenshots from successful browser inference, edited into a short sequence. The repository also includes &lt;code&gt;demo/recording.html&lt;/code&gt;, a self-contained replay of the CLI's actual, unedited output. Both are explicitly labeled as recordings.&lt;/p&gt;

&lt;p&gt;The main example is &lt;strong&gt;Lantern&lt;/strong&gt;, a fictional oral-history archive created for this demo. In its old README, recordings stay on the user's device, transcripts can be exported, and every control works with a keyboard. In the new README, there are cloud processing and shareable links. Some promises survive in different words. Others have no close echo.&lt;/p&gt;

&lt;p&gt;The export promise is a useful example. The model links “export every transcript as a plain text file” with “download your transcripts in TXT format.” In the recorded browser run, cosine similarity is about &lt;strong&gt;0.711&lt;/strong&gt;, while the word-overlap baseline is only &lt;strong&gt;0.056&lt;/strong&gt;. Literal overlap alone would miss much of that relationship.&lt;/p&gt;

&lt;p&gt;Keyboard access is different. Its best match scores about &lt;strong&gt;0.101&lt;/strong&gt;. That does not prove the feature was removed. It tells the reviewer where the document has stopped accounting for it.&lt;/p&gt;

&lt;p&gt;I marked that passage &lt;strong&gt;Investigate&lt;/strong&gt;, left a note about restoring keyboard navigation or documenting its retirement, and exported the ledger. The downloaded JSON preserves the decision with the original text, source lines, scores, and input fingerprints.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/xyx200/ghost-in-the-readme" rel="noopener noreferrer"&gt;Public MIT-licensed source repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The project was started on October 29, 2026 UTC, within this challenge's window. The README includes setup, the CLI, model provenance, tests, screenshots, and limitations. No paid services or partner credits are required.&lt;/p&gt;

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

&lt;p&gt;The runtime AI is &lt;a href="https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2" rel="noopener noreferrer"&gt;Sentence Transformers all-MiniLM-L6-v2&lt;/a&gt;, using &lt;a href="https://huggingface.co/Xenova/all-MiniLM-L6-v2" rel="noopener noreferrer"&gt;Xenova's ONNX conversion&lt;/a&gt;. Both model repositories identify the license as Apache 2.0. Transformers.js 3.8.1 and ONNX Runtime execute the quantized model locally.&lt;/p&gt;

&lt;p&gt;The flow is deliberately inspectable:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Parse English prose into passages while keeping original line numbers. Skip headings and fenced code.&lt;/li&gt;
&lt;li&gt;Encode each passage into a normalized, 384-dimensional vector using mean pooling.&lt;/li&gt;
&lt;li&gt;Retrieve the nearest current passage for every old passage using cosine similarity.&lt;/li&gt;
&lt;li&gt;Show alternatives, the gap to the runner-up, shared matches, and a Jaccard word-overlap baseline.&lt;/li&gt;
&lt;li&gt;Keep the reviewer's decision separate from the model's score.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In the browser, inference runs in a Web Worker so the page can remain interactive. A shared core module powers the CLI and interface. The model files and WASM runtime are downloaded during setup and then served locally. Remote model loading is disabled; the page also restricts network connections to its own origin.&lt;/p&gt;

&lt;p&gt;There is no generative step. The app cannot invent a promise, silently rewrite a source, or attribute a new sentence to an old maintainer. Its eerie language is interface copy; the semantic matching is actual model inference.&lt;/p&gt;

&lt;p&gt;The model download is &lt;strong&gt;22.81 MiB&lt;/strong&gt;. One observed browser run encoded 13 passages in &lt;strong&gt;133 ms&lt;/strong&gt;, excluding model loading. That is a measurement from this host, not a promise about every laptop. The evidence bundle includes CPU output, browser output, model revision and hashes, and the exact fictional inputs.&lt;/p&gt;

&lt;p&gt;Ten core tests passed after independent review. Five small, synthetic retrieval checks also passed: each intended paraphrase outranked an unrelated sentence by at least 0.15 cosine. These are sanity checks, not a representative benchmark. The prepared CPU inference path was also run with network fetching disabled. Browser checks covered real WASM inference, both report downloads, preserved review notes, empty-input validation, and a narrow mobile layout.&lt;/p&gt;

&lt;h3&gt;
  
  
  The model's most useful mistake
&lt;/h3&gt;

&lt;p&gt;The example that matters most is the one I would not let the model decide.&lt;/p&gt;

&lt;p&gt;“All features work without an internet connection.”&lt;/p&gt;

&lt;p&gt;“An internet connection is required to use all features.”&lt;/p&gt;

&lt;p&gt;Their similarity is approximately &lt;strong&gt;0.764&lt;/strong&gt;. They occupy much of the same semantic territory and make opposite commitments.&lt;/p&gt;

&lt;p&gt;This is why the app says &lt;em&gt;possible echo&lt;/em&gt;, never &lt;em&gt;promise fulfilled&lt;/em&gt;. A small vocabulary rule flags the change in negation, but that rule has limits too. It can over-warn, and it can miss contradictions expressed without an obvious “not.” Every result stays a review prompt.&lt;/p&gt;

&lt;p&gt;The threshold slider does not turn similarity into certainty. It lets the reviewer inspect how an editorial cutoff changes the queue. The exported evidence keeps that threshold visible.&lt;/p&gt;

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

&lt;p&gt;A document like this can contain the history of a project before anyone is ready to explain it publicly. Sending every old plan to a remote model would make the tool less useful for exactly the conversations it is supposed to support.&lt;/p&gt;

&lt;p&gt;Open weights make a small local review possible. After the initial downloads, neither an API account nor a metered inference service is needed. The browser keeps the text in memory; the CLI reads the supplied local files. Nothing needs to be uploaded to obtain a match.&lt;/p&gt;

&lt;p&gt;Openness also makes the result challengeable. The model revision is pinned. The scoring code is short. The lexical baseline sits beside the embedding result. Someone can replace the encoder, change the thresholds, or test a failure without asking a service provider to expose its internals.&lt;/p&gt;

&lt;p&gt;A closed service could provide good embeddings. The practical advantage here is that this particular archive can remain usable without depending on that service continuing to exist.&lt;/p&gt;

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

&lt;p&gt;This project does not demand that every old promise live forever. Sometimes the kindest, most honest thing a maintainer can do is let one go.&lt;/p&gt;

&lt;p&gt;The difference is leaving a reason.&lt;/p&gt;

&lt;p&gt;A missing line says nothing. A small review note can say: we remember what we intended, we have looked at what changed, and this is what happens next.&lt;/p&gt;

&lt;p&gt;That is the ending I wanted for these ghosts.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Assistance and Credits
&lt;/h2&gt;

&lt;p&gt;Codex assisted with the concept, implementation, tests, verification, and writing. The application's runtime AI is the locally executed MiniLM model credited above. The samples are original fictional fixtures; no user study, real project incident, or testimonial is claimed. Original app material is MIT licensed, and pretrained weights and dependencies retain their own licenses. Full credits are in &lt;code&gt;THIRD_PARTY.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This entry targets the overall challenge. No partner prize category is claimed.&lt;/p&gt;

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