<?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: Rameez Shaikh</title>
    <description>The latest articles on DEV Community by Rameez Shaikh (@yellowvoid).</description>
    <link>https://dev.to/yellowvoid</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%2F4171491%2Fbc8a4d73-8e78-43ec-a4ab-173101a14671.jpeg</url>
      <title>DEV Community: Rameez Shaikh</title>
      <link>https://dev.to/yellowvoid</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yellowvoid"/>
    <language>en</language>
    <item>
      <title>Every Repository Has Ghosts: Bringing Deleted Code Back to Life with RepoRequiem</title>
      <dc:creator>Rameez Shaikh</dc:creator>
      <pubDate>Sat, 31 Oct 2026 15:20:02 +0000</pubDate>
      <link>https://dev.to/yellowvoid/every-repository-has-ghosts-bringing-deleted-code-back-to-life-with-reporequiem-4mka</link>
      <guid>https://dev.to/yellowvoid/every-repository-has-ghosts-bringing-deleted-code-back-to-life-with-reporequiem-4mka</guid>
      <description>&lt;p&gt;&lt;em&gt;This post is my submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week4-2026-10-26"&gt;DEV Hacktoberfest 2026 Week 4 Challenge&lt;/a&gt; — Ghost in the Machine.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Every Repository Has Ghosts 👻
&lt;/h1&gt;

&lt;p&gt;There is a commit in almost every repository that nobody wants to read.&lt;/p&gt;

&lt;p&gt;It's the commit that deletes a file.&lt;/p&gt;

&lt;p&gt;Not a refactor. Not a rename. Just a removal, buried somewhere in Git history, accompanied by a commit message like &lt;code&gt;cleanup&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;But that file had a life before it disappeared.&lt;/p&gt;

&lt;p&gt;It was created on a Tuesday, modified eleven times, survived multiple changes, and eventually vanished one afternoon.&lt;/p&gt;

&lt;p&gt;Git remembers all of it.&lt;/p&gt;

&lt;p&gt;Nobody asks.&lt;/p&gt;

&lt;p&gt;For Hacktoberfest Week 4, the theme was &lt;strong&gt;Ghost in the Machine&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;My first thought was to build something around a haunted AI chatbot. But then I started thinking about something more interesting.&lt;/p&gt;

&lt;p&gt;What if the ghost wasn't something we created with AI?&lt;/p&gt;

&lt;p&gt;What if it was something the machine had already been carrying all along?&lt;/p&gt;

&lt;p&gt;The forgotten history of a Git repository.&lt;/p&gt;

&lt;p&gt;That's how &lt;strong&gt;RepoRequiem&lt;/strong&gt; was born.&lt;/p&gt;

&lt;p&gt;A Git archaeology tool that uncovers deleted files, forgotten commits, extinct programming languages, and abandoned development timelines — then gives those digital ghosts a voice using locally running open-weight AI models.&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%2Fhejq8xhn9oz7f3rd323v.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%2Fhejq8xhn9oz7f3rd323v.png" alt="RepoRequiem Landing Page" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🪦 What I Built: RepoRequiem
&lt;/h2&gt;

&lt;p&gt;RepoRequiem explores a Git repository and reconstructs the history of things that are no longer part of its present.&lt;/p&gt;

&lt;p&gt;Instead of simply displaying commit logs, it builds a historical record of what existed, what disappeared, and what survived.&lt;/p&gt;

&lt;p&gt;Here's what it uncovers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Buried:&lt;/strong&gt; Files that once existed in Git history but are no longer present in the current tree. Each gets a birth date, death date, lifespan, churn, removal commit, and surviving content.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Revenants:&lt;/strong&gt; Files that were deleted and later restored. Some things really do come back.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Forgotten:&lt;/strong&gt; Files that still exist but haven't been touched in years.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cursed Commits:&lt;/strong&gt; Unusual commits, including late-night changes, Friday the 13th releases, revert spirals, mass deletions, and suspicious messages like &lt;code&gt;asdf&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extinct Languages:&lt;/strong&gt; Programming languages that survive only among deleted files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unmerged Branches:&lt;/strong&gt; Alternative development timelines that never became ancestors of &lt;code&gt;HEAD&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Souls:&lt;/strong&gt; Historical contributor records, including commit counts, activity periods, and lines added or removed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On the bundled demo repository, RepoRequiem discovers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Discovery&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Commits&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authors&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Buried files&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Revenants&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cursed commits&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unmerged branches&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extinct language eras&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The interesting part?&lt;/p&gt;

&lt;p&gt;The scanner doesn't know this story beforehand. It discovers these details directly from Git.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎬 See It in Action
&lt;/h2&gt;

&lt;p&gt;RepoRequiem is designed to run locally. There is currently no hosted demo because repository history can contain private information, and uploading that history shouldn't be a requirement.&lt;/p&gt;

&lt;p&gt;You can explore the bundled demo repository by running the application and opening:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;http://127.0.0.1:8000/?demo=1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Here are the main parts of the experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The Graveyard
&lt;/h3&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%2Fxhlzaoe9d94tuhl8gjvz.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%2Fxhlzaoe9d94tuhl8gjvz.png" alt="The Graveyard" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every buried file gets its own headstone.&lt;/p&gt;

&lt;p&gt;Open one, and you get a certificate of removal containing its creation date, deletion date, lifespan, changes, removal commit, and the last surviving lines of its content.&lt;/p&gt;

&lt;p&gt;A file that lived for 82 days and was removed in a commit titled &lt;code&gt;Retire CoffeeScript, port parser to JavaScript&lt;/code&gt; tells a very different story from a file that survived two years before being removed in &lt;code&gt;Final cleanup. Thanks for everything.&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The Séance
&lt;/h3&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%2Fh05nxrtrejau4lln2q7s.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%2Fh05nxrtrejau4lln2q7s.png" alt="The Séance" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What happened to a particular file?&lt;/p&gt;

&lt;p&gt;Who removed it?&lt;/p&gt;

&lt;p&gt;What programming language disappeared?&lt;/p&gt;

&lt;p&gt;The séance lets you ask questions about the repository's history.&lt;/p&gt;

&lt;p&gt;It retrieves relevant evidence from the repository record and gives the model only that evidence to work with.&lt;/p&gt;

&lt;p&gt;If the model is unavailable, the system answers using the same facts directly.&lt;/p&gt;

&lt;p&gt;And if the record doesn't contain an answer, it says so.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The Archive
&lt;/h3&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%2F0ajghvdeljjtpv3pf64a.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%2F0ajghvdeljjtpv3pf64a.png" alt="The Archive" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The archive brings together the repository's historical record — forgotten files, unusual commits, contributors, and alternative development timelines.&lt;/p&gt;

&lt;p&gt;It turns what would normally be scattered Git history into something developers can actually explore.&lt;/p&gt;

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

&lt;p&gt;The technology stack is deliberately small:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; Python, FastAPI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; React, Vite, Tailwind CSS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI runtime:&lt;/strong&gt; Ollama&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model integration:&lt;/strong&gt; OpenAI-compatible API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Version history:&lt;/strong&gt; Git CLI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But the most important engineering decision wasn't about choosing a framework.&lt;/p&gt;

&lt;p&gt;It was about separating facts from AI-generated storytelling.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Git is the source of truth
&lt;/h3&gt;

&lt;p&gt;RepoRequiem starts by analyzing the repository using Git commands such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git log &lt;span class="nt"&gt;--numstat&lt;/span&gt; &lt;span class="nt"&gt;--no-renames&lt;/span&gt;
git ls-tree
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The analysis builds a per-file historical ledger and extracts the information needed to construct the repository's record.&lt;/p&gt;

&lt;p&gt;The model doesn't decide what happened to a file.&lt;/p&gt;

&lt;p&gt;Git provides the evidence.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. AI becomes the storyteller
&lt;/h3&gt;

&lt;p&gt;Once the historical record is ready, RepoRequiem converts it into a plain-text collection of facts.&lt;/p&gt;

&lt;p&gt;The model receives those facts with strict instructions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Never invent file names.&lt;/li&gt;
&lt;li&gt;Never invent contributors.&lt;/li&gt;
&lt;li&gt;Never invent dates or numbers.&lt;/li&gt;
&lt;li&gt;Never invent commits or events.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Its response must follow a JSON schema.&lt;/p&gt;

&lt;p&gt;A validation layer checks the response, applies length limits, removes invalid sections, and rejects laments referencing files that were never actually deleted.&lt;/p&gt;

&lt;p&gt;The idea is simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI can interpret the evidence, but it cannot rewrite history.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The Archivist: When AI isn't available
&lt;/h3&gt;

&lt;p&gt;This is one of the architectural decisions I'm most proud of.&lt;/p&gt;

&lt;p&gt;What happens if Ollama isn't running?&lt;/p&gt;

&lt;p&gt;Or if the machine doesn't have a suitable model installed?&lt;/p&gt;

&lt;p&gt;RepoRequiem doesn't simply display an error.&lt;/p&gt;

&lt;p&gt;It switches to a deterministic storyteller called &lt;strong&gt;The Archivist&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The Archivist uses the same Git-derived facts to produce a readable historical account without requiring model inference.&lt;/p&gt;

&lt;p&gt;The interface clearly identifies this mode:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;facts only · no model&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The application remains usable even without a GPU or an available model.&lt;/p&gt;

&lt;p&gt;I wanted the fallback to feel like a legitimate part of the experience, not a broken version of the application.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Local open-weight AI
&lt;/h3&gt;

&lt;p&gt;RepoRequiem uses Ollama to discover locally available models through &lt;code&gt;/api/tags&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It evaluates the available models and selects a suitable instruction-following model, while supporting an explicit &lt;code&gt;OLLAMA_MODEL&lt;/code&gt; override.&lt;/p&gt;

&lt;p&gt;An OpenAI-compatible endpoint is also available as an alternative.&lt;/p&gt;

&lt;p&gt;The inference layer is intentionally simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One request to &lt;code&gt;/api/chat&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;JSON-mode generation.&lt;/li&gt;
&lt;li&gt;A timeout.&lt;/li&gt;
&lt;li&gt;Response validation.&lt;/li&gt;
&lt;li&gt;A deterministic fallback.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No complicated agent framework, orchestration graph, or vector database was necessary.&lt;/p&gt;

&lt;p&gt;The hard part was the archaeology, not the plumbing.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔓 Why Open Innovation Matters
&lt;/h2&gt;

&lt;p&gt;This is where the project's architecture becomes especially important.&lt;/p&gt;

&lt;p&gt;A Git repository can contain much more than source code.&lt;/p&gt;

&lt;p&gt;It can contain internal architecture, abandoned features, contributor information, and years of development history.&lt;/p&gt;

&lt;p&gt;Sending that information to an external AI API introduces another place where private repository data has to travel.&lt;/p&gt;

&lt;p&gt;I wanted a different approach.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RepoRequiem keeps repository analysis and AI storytelling on the developer's own machine.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Using open-weight models and local inference gives developers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Privacy:&lt;/strong&gt; Repository history doesn't need to be uploaded to a third-party AI service.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Control:&lt;/strong&gt; Developers can choose which locally available model they want to use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexibility:&lt;/strong&gt; Models can be replaced without rebuilding the entire application.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accessibility:&lt;/strong&gt; The historical record can still be generated without AI inference.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Independence:&lt;/strong&gt; There is no mandatory external AI API or paid inference dependency.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For me, open innovation isn't just about accessing model weights.&lt;/p&gt;

&lt;p&gt;It's about having control over how technology works, where data goes, and what happens when a particular service becomes unavailable.&lt;/p&gt;

&lt;p&gt;For a tool that explores private repository history, those things matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙️ What Was Challenging?
&lt;/h2&gt;

&lt;p&gt;Not everything was straightforward.&lt;/p&gt;

&lt;h3&gt;
  
  
  Detecting deletion without lying
&lt;/h3&gt;

&lt;p&gt;Git doesn't provide a simple event saying, "This file died."&lt;/p&gt;

&lt;p&gt;A file can disappear because it was deleted, renamed, moved into a submodule, or because its history was truncated.&lt;/p&gt;

&lt;p&gt;RepoRequiem uses a heuristic based on Git's change statistics and cross-checks against the current tree.&lt;/p&gt;

&lt;p&gt;It's not perfect, and the README documents that limitation.&lt;/p&gt;

&lt;p&gt;I'd rather acknowledge uncertainty than present a guess as historical fact.&lt;/p&gt;

&lt;h3&gt;
  
  
  Preventing AI hallucinations
&lt;/h3&gt;

&lt;p&gt;Models love adding details.&lt;/p&gt;

&lt;p&gt;But a beautiful paragraph about a file that never existed is still wrong.&lt;/p&gt;

&lt;p&gt;The validation layer is therefore a critical part of the application, not just an implementation detail.&lt;/p&gt;

&lt;h3&gt;
  
  
  Making failure feel intentional
&lt;/h3&gt;

&lt;p&gt;Initially, missing Ollama meant an error message.&lt;/p&gt;

&lt;p&gt;I changed that behavior and built The Archivist as a proper alternative experience.&lt;/p&gt;

&lt;p&gt;A machine without an AI model should still be able to tell the repository's story.&lt;/p&gt;

&lt;h3&gt;
  
  
  Getting the visual identity right
&lt;/h3&gt;

&lt;p&gt;I didn't want another dark SaaS dashboard with a purple gradient.&lt;/p&gt;

&lt;p&gt;I approached the interface as a digital reading room:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Near-black backgrounds.&lt;/li&gt;
&lt;li&gt;Bone-colored serif typography.&lt;/li&gt;
&lt;li&gt;Candle and ember accents.&lt;/li&gt;
&lt;li&gt;Roman numerals.&lt;/li&gt;
&lt;li&gt;Monospaced typography for historical facts.&lt;/li&gt;
&lt;li&gt;Italic typography for generated storytelling.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The distinction between facts and storytelling is visible in the design itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 What's Next?
&lt;/h2&gt;

&lt;p&gt;There are several improvements I'd like to explore:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Better rename detection instead of treating every rename as a death and birth.&lt;/li&gt;
&lt;li&gt;A comparison view showing what replaced a deleted file.&lt;/li&gt;
&lt;li&gt;Historical obituaries for contributors who left a project.&lt;/li&gt;
&lt;li&gt;A CLI version that can generate repository ghost records during CI runs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The core idea, however, is already there.&lt;/p&gt;

&lt;p&gt;The machine remembers what we deleted.&lt;/p&gt;

&lt;p&gt;RepoRequiem just gives those memories a voice.&lt;/p&gt;

&lt;h2&gt;
  
  
  💻 Try It Yourself
&lt;/h2&gt;

&lt;p&gt;The complete source code is available on GitHub:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/RameezHiro/reporequiem" rel="noopener noreferrer"&gt;RameezHiro/RepoRequiem&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can clone the project and run it locally.&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/RameezHiro/reporequiem.git

&lt;span class="nb"&gt;cd &lt;/span&gt;reporequiem/frontend
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run build

&lt;span class="nb"&gt;cd&lt;/span&gt; ../backend
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
uvicorn main:app &lt;span class="nt"&gt;--port&lt;/span&gt; 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;http://127.0.0.1:8000&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Or add &lt;code&gt;?demo=1&lt;/code&gt; to explore the bundled haunted repository.&lt;/p&gt;

&lt;p&gt;The project uses FastAPI, React, Vite, Tailwind CSS, Ollama, and Git.&lt;/p&gt;

&lt;p&gt;There is no database, no account system, and no mandatory external AI service. Scans live in memory and expire.&lt;/p&gt;

&lt;p&gt;If you explore the project, I'd genuinely appreciate feedback, ideas, and contributions.&lt;/p&gt;




&lt;h2&gt;
  
  
  👻 One Last Thing
&lt;/h2&gt;

&lt;p&gt;A repository is more than the code currently sitting in its working tree.&lt;/p&gt;

&lt;p&gt;It's a record of decisions, experiments, abandoned ideas, failed approaches, and people who contributed along the way.&lt;/p&gt;

&lt;p&gt;Some files were removed because they were no longer needed.&lt;/p&gt;

&lt;p&gt;Others disappeared because something better replaced them.&lt;/p&gt;

&lt;p&gt;Some simply became forgotten.&lt;/p&gt;

&lt;p&gt;RepoRequiem doesn't claim to know why every file was deleted. It doesn't invent emotional backstories or pretend to understand decisions that Git never recorded.&lt;/p&gt;

&lt;p&gt;It simply preserves what the history can prove.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A ghost that makes things up is a hallucination. A ghost that can only repeat what the record already contains is a witness.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built for the &lt;a href="https://dev.to/challenges/hacktoberfest-week4-2026-10-26"&gt;DEV Hacktoberfest 2026 Week 4 Challenge&lt;/a&gt; — Ghost in the Machine.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;AI Disclosure: I used an AI coding assistant to pair on the implementation and help draft this article. I checked the technical claims against the running application. The historical facts in the demo are extracted from Git, not invented by the AI model.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>opensource</category>
      <category>python</category>
    </item>
    <item>
      <title>ShelfScribe: Local AI Listing Writer for Etsy Sellers (Open-Weight AI Side Hustle)</title>
      <dc:creator>Rameez Shaikh</dc:creator>
      <pubDate>Sat, 17 Oct 2026 16:49:33 +0000</pubDate>
      <link>https://dev.to/yellowvoid/shelfscribe-local-ai-listing-writer-for-etsy-sellers-open-weight-ai-side-hustle-1hc5</link>
      <guid>https://dev.to/yellowvoid/shelfscribe-local-ai-listing-writer-for-etsy-sellers-open-weight-ai-side-hustle-1hc5</guid>
      <description>&lt;h1&gt;
  
  
  ShelfScribe: Local AI Listing Writer for Etsy Sellers
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Turn product photos into ready-to-post Etsy listings — all running locally on open-weight AI models.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Built for Hacktoberfest 2026 Week 2: &lt;strong&gt;Side Hustle&lt;/strong&gt; — something a real seller would actually pay for.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Etsy sellers spend hours writing titles, descriptions, tags, and researching prices — time that could be spent making more products or fulfilling orders. Existing tools either require uploading your designs to the cloud (risking IP exposure) or come with recurring fees that eat into thin margins.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution: ShelfScribe
&lt;/h2&gt;

&lt;p&gt;ShelfScribe automates listing creation with a private, on-device AI that never uploads your product photos or designs to the cloud.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Core model:&lt;/strong&gt; &lt;code&gt;qwen3-vl:4b&lt;/code&gt; (open-weight vision + language model) running via Ollama&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero cloud API keys:&lt;/strong&gt; All inference happens on your laptop&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GDPR/CCPA friendly:&lt;/strong&gt; Customer designs and product photos stay on-device&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost to run:&lt;/strong&gt; $0 after download — the model is free and open-weight&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Upload 1-5 photos of your product (clear, well-lit shots work best)&lt;/li&gt;
&lt;li&gt;Optional: Add keywords (e.g., "boho, ceramic, mug, gift for her")&lt;/li&gt;
&lt;li&gt;Optional: Specify product type (e.g., "jewelry, home decor, clothing")&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Generate Listing&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Copy the title, description, tags, and price range straight into Etsy&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why Open Innovation Matters
&lt;/h2&gt;

&lt;p&gt;This project directly addresses the challenge theme:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Build something with open-weight models or open-source AI that someone would actually pay for.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Privacy
&lt;/h3&gt;

&lt;p&gt;Product designs and customer data never leave your laptop — critical for makers selling unique, handmade goods.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cost
&lt;/h3&gt;

&lt;p&gt;Zero per-use fees; the open-weight model is free to run indefinitely.&lt;/p&gt;

&lt;h3&gt;
  
  
  Control
&lt;/h3&gt;

&lt;p&gt;Fine-tune or swap models anytime; you're not locked into a vendor's pricing or API changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Transparency
&lt;/h3&gt;

&lt;p&gt;You can inspect and modify the inference code — unlike closed APIs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&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;&lt;strong&gt;Backend&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;FastAPI + Python 3.13 + Ollama client&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Frontend&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;React 18 + Vite + Tailwind CSS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI Model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;qwen3-vl:4b&lt;/code&gt; (4B parameters, vision + text, open-weight)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Inference&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ollama (local model server)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;License&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Get Started
&lt;/h2&gt;

&lt;p&gt;See the &lt;a href="https://github.com/RameezHiro/ShelfScribe/blob/main/README.md" rel="noopener noreferrer"&gt;README&lt;/a&gt; for full setup instructions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hacktoberfest Submission
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Required tag:&lt;/strong&gt; &lt;code&gt;#hf26challenge&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Partner categories targeting:&lt;/strong&gt; Best Use of Gemma (via Ollama's open-weight model ecosystem), Best Use of Render (live demo)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Submission:&lt;/strong&gt; A new project built entirely during Oct 12–18, 2026 window&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Install &lt;a href="https://ollama.com/download" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Pull the model: &lt;code&gt;ollama pull qwen3-vl:4b&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Clone the repo: &lt;code&gt;git clone https://github.com/RameezHiro/ShelfScribe&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Follow the README to start backend and frontend&lt;/li&gt;
&lt;li&gt;Generate your first listing!&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;Built with 💙 by RameezHiro for Hacktoberfest 2026.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post includes the required challenge tag: #hf26challenge&lt;/em&gt;&lt;/p&gt;

</description>
      <category>hf26challenge</category>
      <category>gemma</category>
      <category>render</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
