<?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: Harsh Bhadu</title>
    <description>The latest articles on DEV Community by Harsh Bhadu (@harshbhaducse).</description>
    <link>https://dev.to/harshbhaducse</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%2F4155259%2Fefcecd62-f14f-4199-8112-0c3691d4f125.png</url>
      <title>DEV Community: Harsh Bhadu</title>
      <link>https://dev.to/harshbhaducse</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/harshbhaducse"/>
    <language>en</language>
    <item>
      <title>Haunted Git Blame: When Your Codebase Talks Back</title>
      <dc:creator>Harsh Bhadu</dc:creator>
      <pubDate>Thu, 29 Oct 2026 13:04:37 +0000</pubDate>
      <link>https://dev.to/harshbhaducse/haunted-git-blame-when-your-codebase-talks-back-38em</link>
      <guid>https://dev.to/harshbhaducse/haunted-git-blame-when-your-codebase-talks-back-38em</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;I built &lt;strong&gt;Haunted Git Blame&lt;/strong&gt;, a local-first Git history seance that turns the recent history of a software repository into a spooky, traceable case file.&lt;/p&gt;

&lt;p&gt;The idea began with a simple question: if a codebase could remember everything that happened inside it, what kind of ghost story would it tell?&lt;/p&gt;

&lt;p&gt;A repository already contains the ingredients of a haunting. There are abandoned branches, unfinished features, repeated fixes, sudden bursts of activity, long silences, and commit messages written by people who may have moved on to other projects. Haunted Git Blame reads those traces and gives them an atmosphere without pretending that the software can literally know a developer's intentions.&lt;/p&gt;

&lt;p&gt;The user pastes the path to a local Git repository. The app reads up to 18 recent commits and collects bounded metadata:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Commit hashes&lt;/li&gt;
&lt;li&gt;Short commit hashes&lt;/li&gt;
&lt;li&gt;Author names&lt;/li&gt;
&lt;li&gt;Commit dates&lt;/li&gt;
&lt;li&gt;Commit subjects&lt;/li&gt;
&lt;li&gt;Files changed&lt;/li&gt;
&lt;li&gt;Insertions and deletions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That evidence becomes a visual report. The interface shows a recovered transmission, a mood, cited commit hashes, and a chronological commit timeline. The generated narrative is always tied back to real commits so the experience stays playful without becoming completely ungrounded.&lt;/p&gt;

&lt;p&gt;The project interprets &lt;strong&gt;Ghost in the Machine&lt;/strong&gt; in two ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The repository is treated like a haunted archive. Its commits are the footprints left behind by people and decisions that are no longer visible in the present code.&lt;/li&gt;
&lt;li&gt;The AI itself is deliberately kept local and replaceable. The “ghost” does not need to live on a remote server. It can run on the builder's own machine, even when the internet is unavailable.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The visual design follows that idea. Haunted Git Blame looks like a damaged local archive rather than a conventional dashboard: dark paper, ember-red signals, scanlines, faint noise, warning stamps, old terminal typography, and a timeline that makes every commit feel like a recovered mark.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Local demo:&lt;/strong&gt; Run the project locally and open:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project is intentionally designed as a local application because privacy is part of the demo. To run it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;npm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;npm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;build&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;npm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then paste the path to a local Git repository with at least one commit.&lt;/p&gt;

&lt;p&gt;For an Ollama-backed demo, configure an installed local model before starting the server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;OLLAMA_MODEL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tinyllama:latest"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;OLLAMA_URL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://127.0.0.1:11434/api/generate"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;npm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The application has also been tested in fallback mode with Ollama unavailable or configured with a model that is not installed. In that case, the interface remains functional and produces a built-in local archive narration instead of an empty result.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Repository:&lt;/strong&gt; &lt;code&gt;[https://github.com/HarshDev-07/Git-Haunted-Blame]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The project is structured as a small Node.js and TypeScript application with a plain browser client:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/
  ai.ts       Ollama adapter, response normalization, and offline archive voices
  git.ts      Safe Git inspection and commit parsing
  server.ts   Local HTTP server and API route
  types.ts    Shared response types
public/
  index.html  Accessible application structure
  app.css     Offline-safe haunted archive visual system
  app.js      Browser interaction and report rendering
README.md     Setup, privacy, troubleshooting, and challenge documentation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The main implementation is intentionally readable. There is no large framework hiding the important behavior and no hosted service required to understand the full request path.&lt;/p&gt;

&lt;p&gt;The project uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node.js&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Native Node HTTP APIs&lt;/li&gt;
&lt;li&gt;Native &lt;code&gt;fetch&lt;/code&gt; for the Ollama request&lt;/li&gt;
&lt;li&gt;The installed Git command-line tool for repository inspection&lt;/li&gt;
&lt;li&gt;Ollama-compatible local inference&lt;/li&gt;
&lt;li&gt;Vanilla HTML, CSS, and JavaScript for the interface&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The server invokes Git with argument arrays rather than interpolating a user-provided path into a shell command. The project does not clone, fetch, push, commit, or modify the repository.&lt;/p&gt;

&lt;p&gt;The repository response is also privacy-conscious. The server uses the absolute path locally to inspect the requested repository, but the browser-facing API returns only the repository folder name. The complete local path is not returned to the client.&lt;/p&gt;

&lt;p&gt;The Ollama endpoint is restricted to local loopback addresses such as &lt;code&gt;localhost&lt;/code&gt;, &lt;code&gt;127.0.0.1&lt;/code&gt;, and &lt;code&gt;::1&lt;/code&gt;. Remote endpoints and embedded credentials are rejected before commit metadata is sent.&lt;/p&gt;

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

&lt;p&gt;Haunted Git Blame is built around &lt;strong&gt;local Ollama inference&lt;/strong&gt;. Ollama provides a local HTTP endpoint that can run open-weight models on the user's own machine. The exact model is configurable, so the app is not tied to one provider or one model family.&lt;/p&gt;

&lt;p&gt;The default configuration expects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://127.0.0.1:11434/api/generate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The user can choose an installed model through the &lt;code&gt;OLLAMA_MODEL&lt;/code&gt; environment variable. During development, I verified the application with an installed &lt;code&gt;tinyllama:latest&lt;/code&gt; model. A different local model can be used without changing the browser interface or Git adapter.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;The user selects a local repository by entering its path.&lt;/li&gt;
&lt;li&gt;The server validates the directory and checks that Git can inspect it.&lt;/li&gt;
&lt;li&gt;Git returns a maximum of 18 recent commits.&lt;/li&gt;
&lt;li&gt;The server extracts metadata and short statistics rather than reading the entire source tree.&lt;/li&gt;
&lt;li&gt;That structured commit evidence is placed into a carefully scoped prompt.&lt;/li&gt;
&lt;li&gt;Ollama is asked to return JSON containing a title, message, mood, and evidence hashes.&lt;/li&gt;
&lt;li&gt;The app validates the response and keeps only evidence that matches real commits.&lt;/li&gt;
&lt;li&gt;The browser renders the result as a recovered transmission and timeline.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The prompt instructs the model to stay within the supplied evidence. It asks for exact commit hashes and tells the model not to invent people, files, or events. The application still treats model output as interpretation rather than fact, which is why the cited hashes remain visible in the interface.&lt;/p&gt;

&lt;p&gt;The AI adapter also handles the reality of local inference. A local model may be unavailable, may not be installed, may take too long, or may return malformed JSON. These conditions should not destroy the whole application. Instead, the adapter falls back to the built-in archive cabinet.&lt;/p&gt;

&lt;p&gt;The offline cabinet contains several deterministic voices chosen from repository signals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The first and final breath&lt;/strong&gt; for a repository with one commit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The silent maintainer&lt;/strong&gt; for a repository whose latest commit is more than a year old.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The repeated footsteps&lt;/strong&gt; when one author accounts for a long sequence of commits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The unfinished room&lt;/strong&gt; when the recent history contains substantial code churn.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The repository remembers&lt;/strong&gt; for a quieter mixed history.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means the project has two useful modes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ollama mode:&lt;/strong&gt; a local open-weight model creates the atmospheric interpretation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local archive mode:&lt;/strong&gt; built-in text produces an offline, deterministic experience without AI inference.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The second mode is not just a backup for a broken demo. It is an important part of the product design. A local-first tool should remain useful when the model is missing, the laptop is offline, or the user does not have enough hardware to run a larger model.&lt;/p&gt;

&lt;p&gt;The browser interface uses no external fonts, images, stylesheets, or JavaScript services. The haunted visual language is made with local CSS: scanlines, noise, archival borders, ember colors, signal bars, subtle flicker, and a responsive timeline. This keeps the presentation available when the internet is switched off as well.&lt;/p&gt;

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

&lt;p&gt;Open innovation matters because the material Haunted Git Blame examines can be sensitive by default.&lt;/p&gt;

&lt;p&gt;A Git history may reveal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Internal project names&lt;/li&gt;
&lt;li&gt;Unreleased product ideas&lt;/li&gt;
&lt;li&gt;Security-related fixes&lt;/li&gt;
&lt;li&gt;Customer or organization terminology&lt;/li&gt;
&lt;li&gt;Names of contributors&lt;/li&gt;
&lt;li&gt;Work that was never intended to be public&lt;/li&gt;
&lt;li&gt;The timing and structure of a team's development process&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A closed hosted AI API would make it easy to send that information away simply to produce a fun narrative. That would be the wrong tradeoff for this project. The spooky effect is not worth giving up control of a private codebase.&lt;/p&gt;

&lt;p&gt;Running an open-weight model locally makes a different design possible. The repository stays on the user's machine. The model endpoint is inspectable. The prompt is visible. The model can be changed. The user can run the app with the network disconnected. There is no account requirement, API key, per-request charge, or dependency on a remote provider remaining available.&lt;/p&gt;

&lt;p&gt;Open innovation also changes the creative process. Because the model is replaceable, Haunted Git Blame can evolve in several directions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A smaller model can be selected for an older laptop.&lt;/li&gt;
&lt;li&gt;A stronger model can be selected for richer writing.&lt;/li&gt;
&lt;li&gt;A model can be fine-tuned or prompted for a particular historical tone.&lt;/li&gt;
&lt;li&gt;The prompt can be changed to emulate an archivist, detective, séance host, or systems historian.&lt;/li&gt;
&lt;li&gt;The Git evidence boundary can be audited and changed by the project owner.&lt;/li&gt;
&lt;li&gt;The app can remain useful even if no model is installed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A closed API might have made the first prototype quicker, but it would have hidden the most important question: where does the repository history go? With local inference, the privacy decision is part of the architecture instead of a footnote in a privacy policy.&lt;/p&gt;

&lt;p&gt;The open approach also improves durability. A hosted service can change pricing, remove a model, change its terms, or disappear. An open local setup gives the project a better chance of remaining understandable and runnable. The model is one component, not the owner of the application.&lt;/p&gt;

&lt;p&gt;There is a second kind of open innovation in the project: the fallback behavior. The application does not pretend that AI is the only source of value. The Git history itself is useful. The deterministic archive voices make that visible and keep the experience available without a model. This makes the project more honest and more resilient.&lt;/p&gt;

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

&lt;p&gt;The part that stayed with me was the idea that a repository can be full of evidence but empty of explanation.&lt;/p&gt;

&lt;p&gt;A commit named &lt;code&gt;file-upload&lt;/code&gt; may be the beginning of a product, the last surviving fragment of an experiment, or simply the only door left open in an abandoned project. Git records what changed, when it changed, and who made the change. It does not record what the developer hoped would happen next.&lt;/p&gt;

&lt;p&gt;That gap is where the haunting lives.&lt;/p&gt;

&lt;p&gt;Haunted Git Blame does not claim to resurrect the people behind a repository. It gives the traces a voice while keeping the original evidence visible. The report can be dramatic, but the hashes remain real. The story is allowed to be eerie because the timeline keeps it accountable.&lt;/p&gt;

&lt;p&gt;The offline cabinet is part of that spirit too. If the model cannot answer, the repository does not become silent. A one-commit project can still receive &lt;strong&gt;The first and final breath&lt;/strong&gt;. A long-quiet project can still receive &lt;strong&gt;The silent maintainer&lt;/strong&gt;. Those messages are small, but they make the absence itself part of the story.&lt;/p&gt;

&lt;p&gt;The result is a tool that treats old code with a little ceremony. Not every abandoned repository needs to be revived as a product. Sometimes it only needs someone to notice that it was there.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Primary category:&lt;/strong&gt; Github-Copilot&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Slowly: Remember Your Renewals Before Your Wallet Does</title>
      <dc:creator>Harsh Bhadu</dc:creator>
      <pubDate>Sun, 25 Oct 2026 06:16:23 +0000</pubDate>
      <link>https://dev.to/harshbhaducse/slowly-remember-your-renewals-before-your-wallet-does-59jh</link>
      <guid>https://dev.to/harshbhaducse/slowly-remember-your-renewals-before-your-wallet-does-59jh</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;Everyday subscriptions create a small but persistent mental task: remembering when a free trial ends, when a plan renews, and when to cancel autopay before an unwanted charge. Slowly is a local-first subscription tracker that keeps those details in one calm, private place.&lt;/p&gt;

&lt;p&gt;It lets people add, edit, archive, search, and filter subscriptions while showing estimated monthly spending, active subscription count, and upcoming renewals. It also supports JSON backup and import, so the data remains portable and under the user's control.&lt;/p&gt;

&lt;p&gt;Slowly includes an optional natural-language entry workflow. A user can describe a subscription, receive a structured draft from a local AI model, review and edit the result, and then save it. AI is helpful, but it is never required for the core tracker.&lt;/p&gt;

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

&lt;p&gt;hosted demo- [slowly_url]&lt;br&gt;
&lt;a href="https://harshdev-07.github.io/slowly--Hacktober/" rel="noopener noreferrer"&gt;https://harshdev-07.github.io/slowly--Hacktober/&lt;/a&gt;&lt;br&gt;
The project can be also run locally with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;py &lt;span class="nt"&gt;-m&lt;/span&gt; http.server 4173
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open &lt;a href="http://localhost:4173" rel="noopener noreferrer"&gt;http://localhost:4173&lt;/a&gt;.&lt;/p&gt;

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

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

&lt;p&gt;&lt;a href="https://github.com/HarshDev-07/slowly--Hacktober" rel="noopener noreferrer"&gt;Slowly GitHub repository&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Slowly is built with vanilla HTML, CSS, and JavaScript ES modules. There is no npm dependency or build step. Subscription records are stored locally in the browser with IndexedDB, and a service worker plus web app manifest provide an offline-capable progressive web app experience.&lt;/p&gt;

&lt;p&gt;The optional AI workflow connects to a local Ollama-compatible &lt;code&gt;/api/generate&lt;/code&gt; endpoint. The default model is &lt;code&gt;llama3.2:3b&lt;/code&gt;, but the endpoint and model can be changed in the app settings. The model turns a natural-language description into structured JSON. Slowly parses and validates that response locally, then presents it as an editable draft before anything is saved.&lt;/p&gt;

&lt;p&gt;This design keeps the normal workflow usable without an account, analytics, cloud database, paid API, or exposed API key.&lt;/p&gt;

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

&lt;p&gt;Open innovation made it possible to build around local, open-weight AI instead of making a personal finance utility dependent on a closed hosted API. Users can choose the model that runs on their own machine, inspect how the response is handled, and keep subscription data in their browser.&lt;/p&gt;

&lt;p&gt;The project is also intentionally easy to understand and contribute to. A contributor can open a small set of plain HTML, CSS, and JavaScript files without learning a framework build system first. That lowers the cost of improving a tool whose goal is to lower everyday cognitive load.&lt;/p&gt;

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

&lt;p&gt;Slowly turns a recurring mental calculation into a quick dashboard check. Instead of keeping several renewal dates in memory or searching through emails when a free trial is ending, the user can see what is renewing soon, what each plan costs, and which payment details belong to it.&lt;/p&gt;

&lt;p&gt;The payoff is small each day, but it compounds: fewer reminders to remember, fewer tabs to search, and fewer surprise renewal charges.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;GitHub Copilot&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>opensource</category>
    </item>
    <item>
      <title>BookFlip Tutor: A Local AI Coach for Smarter Book Reselling</title>
      <dc:creator>Harsh Bhadu</dc:creator>
      <pubDate>Sun, 18 Oct 2026 13:26:10 +0000</pubDate>
      <link>https://dev.to/harshbhaducse/bookflip-tutor-a-local-ai-coach-for-smarter-book-reselling-hk5</link>
      <guid>https://dev.to/harshbhaducse/bookflip-tutor-a-local-ai-coach-for-smarter-book-reselling-hk5</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;BookFlip Tutor is a local-first learning tool for students, freelancers, and first-time book resellers who want to know whether a used book is worth buying before they spend money.&lt;/p&gt;

&lt;p&gt;A user can choose a seeded example or paste a marketplace listing. BookFlip Tutor then helps turn the listing into a resale decision by showing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Buy price and inbound shipping&lt;/li&gt;
&lt;li&gt;Expected sale price and marketplace fees&lt;/li&gt;
&lt;li&gt;Estimated profit and return on investment&lt;/li&gt;
&lt;li&gt;Risk flags for missing ISBN, unclear edition, shipping cost, and thin margins&lt;/li&gt;
&lt;li&gt;A plain-language explanation of what to verify next&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The product is designed for a small, specific side hustle: helping a beginner avoid bad textbook purchases and learn the reasoning behind a good sourcing decision. A paid version could charge for saved sourcing history, guided textbook niches, batch listing review, or a private local workflow for tutors and small resellers.&lt;/p&gt;

&lt;p&gt;The financial calculation is deterministic. The AI is not trusted to invent prices or perform arithmetic.&lt;/p&gt;

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

&lt;p&gt;Open &lt;code&gt;index.html&lt;/code&gt; from the repository, or serve the project folder with any static file server.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://dev.tourl"&gt;github.com/HarshDev-07/DevProj-2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The main implementation is intentionally small and dependency-free:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;index.html&lt;/code&gt; contains the product workflow.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;styles.css&lt;/code&gt; contains the responsive interface.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;app.js&lt;/code&gt; contains seeded listings, Ollama integration, validation, deterministic calculations, risk flags, quiz behavior, and local saved history.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;README.md&lt;/code&gt; documents setup, architecture, privacy, and limitations.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;LICENSE&lt;/code&gt; provides the MIT license.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;BookFlip Tutor is a browser app with an optional local AI path through Ollama.&lt;/p&gt;

&lt;p&gt;The user can configure a lightweight local model such as &lt;code&gt;qwen2.5:3b&lt;/code&gt; or another compatible open-weight model. The app sends the pasted listing to Ollama's local &lt;code&gt;/api/generate&lt;/code&gt; endpoint with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;stream: false&lt;/code&gt; for a simple browser workflow&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;format: "json"&lt;/code&gt; for structured output&lt;/li&gt;
&lt;li&gt;Low temperature for more consistent extraction&lt;/li&gt;
&lt;li&gt;A prompt that explicitly says not to guess missing numbers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The expected response contains structured fields such as:&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="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Campbell Biology"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"edition"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"12th edition"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"condition"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Very good"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"buyPrice"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"shipping"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expectedSalePrice"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;96&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"marketplaceFee"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;14.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"missing"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
&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;The app validates numeric fields before using them, exposes the extracted values for manual correction, and keeps the existing calculator available if Ollama is not installed or running.&lt;/p&gt;

&lt;p&gt;The architecture is:&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
  A[Marketplace listing text] --&amp;gt; B[Ollama open-weight model]
  B --&amp;gt; C[Validated facts and uncertainty]
  C --&amp;gt; D[Manual review and correction]
  D --&amp;gt; E[Deterministic profit calculator]
  E --&amp;gt; F[Estimate, risk flags, and lesson]
  F --&amp;gt; G[Local browser history]&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;To run Ollama locally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;ollama&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pull&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;qwen2.5:3b&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;ollama&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;serve&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open the app, click &lt;strong&gt;Check connection&lt;/strong&gt;, paste a listing, and click &lt;strong&gt;Extract with Ollama&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;The local model is what makes this product practical as a small side hustle rather than another usage-metered API wrapper.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Privacy:&lt;/strong&gt; Book listings, sourcing notes, and saved opportunities can stay on the user's laptop instead of being sent to a third-party inference service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost:&lt;/strong&gt; A lightweight open-weight model can run without a per-request bill. That matters when a beginner is checking low-cost books where a hosted API charge could consume the entire margin.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Choice:&lt;/strong&gt; Users can replace the model with another Ollama-compatible model, choose a smaller model for an older laptop, or later tune the workflow for textbooks, exam-prep books, or a regional marketplace.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Transparency:&lt;/strong&gt; The user can see and correct extracted fields before they affect the estimate. The app keeps financial rules in ordinary application code, so the model cannot silently change the profit calculation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Offline potential:&lt;/strong&gt; Once the model is downloaded, the extraction workflow can work without an internet connection. The current app does not require a hosted backend for its core seeded examples, calculations, lessons, or saved history.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Use Disclosure
&lt;/h2&gt;

&lt;p&gt;I used AI assistance during development for implementation support, code drafting, interface iteration, and documentation. The project also uses Ollama as an optional runtime for an open-weight model. The product keeps model output reviewable and does not treat AI-generated extraction as a guaranteed fact.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Best Use of GitHub Copilot
&lt;/h3&gt;

&lt;p&gt;BookFlip Tutor was built with GitHub Copilot assistance for implementation, debugging, interface iteration, and documentation. Copilot helped turn the product concept into a working browser demo while the project remains open-source and understandable as a small codebase.&lt;/p&gt;

&lt;h3&gt;
  
  
  Categories Not Claimed
&lt;/h3&gt;

&lt;p&gt;I am not claiming the Render, TabPFN, Tinker, Arduino, DigitalOcean, Gemma, Backboard, ElevenLabs, Entire, Mastra, MongoDB Atlas, Sentry, SerpApi, &lt;code&gt;.tech&lt;/code&gt;, Temporal, or Tiger Data categories because the current implementation does not use those technologies.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Escape the Keyboard: LocalWhisper Pro Helps You Actually "Touch Grass"</title>
      <dc:creator>Harsh Bhadu</dc:creator>
      <pubDate>Thu, 08 Oct 2026 13:30:45 +0000</pubDate>
      <link>https://dev.to/harshbhaducse/escape-the-keyboard-localwhisper-pro-helps-you-actually-touch-grass-5e9b</link>
      <guid>https://dev.to/harshbhaducse/escape-the-keyboard-localwhisper-pro-helps-you-actually-touch-grass-5e9b</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission 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;&lt;strong&gt;LocalWhisper Pro&lt;/strong&gt; is an open-source, offline-first voice interface designed to minimize screen time. Instead of spending hours hunched over a keyboard typing emails, documentation, or field notes at 40 WPM, users dictate naturally at 150+ WPM. Local AI instantly cleans, restructures, and auto-types the text directly at the cursor—enabling users to wrap up screen work fast and get outdoors.&lt;/p&gt;

&lt;h3&gt;
  
  
  How it gets people off the screen and into the world:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Makes the screen the shortest interaction:&lt;/strong&gt; Speech is up to 4x faster than typing. By handling filler-word scrubbing, formatting, and summarization automatically, users spend a fraction of the time staring at word processors and code editors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;100% Offline Trail &amp;amp; Field Ready:&lt;/strong&gt; Because both transcription and refinement run entirely on-device, you can take your laptop outside—onto the porch, into a garden, or down a hiking trail without cell signal—to dictate field logs, nature observations, and ideas without internet dependencies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No Clipboard or Cloud Distractions:&lt;/strong&gt; It uses low-level hardware stroke injection (&lt;code&gt;SendInput&lt;/code&gt; / &lt;code&gt;pynput&lt;/code&gt;) rather than pasting through clipboard history, keeping workflows seamless and distraction-free.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Demo
&lt;/h2&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%2Fpk9k49jstl06u6a4griu.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%2Fpk9k49jstl06u6a4griu.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Direct Download:&lt;/strong&gt; Download the standalone Windows executable (&lt;code&gt;LocalWhisper_Pro_v3.1_Windows.zip&lt;/code&gt;) directly from our GitHub Releases page—no Python runtime required.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;&lt;strong&gt;Repository:&lt;/strong&gt; [&lt;a href="https://github.com/Harsh-Dev07/Local-WhisperFlow" rel="noopener noreferrer"&gt;https://github.com/Harsh-Dev07/Local-WhisperFlow&lt;/a&gt;] &lt;br&gt;
&lt;strong&gt;License:&lt;/strong&gt; Open Source (MIT)&lt;/p&gt;




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

&lt;p&gt;LocalWhisper Pro is architected entirely around open-source AI models and local runtime frameworks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Local Speech Recognition (&lt;code&gt;faster-whisper&lt;/code&gt; / CTranslate2):&lt;/strong&gt;&lt;br&gt;
Audio input is captured locally using &lt;code&gt;sounddevice&lt;/code&gt; and processed through &lt;code&gt;faster-whisper&lt;/code&gt;, a reimplementation of OpenAI's Whisper model running on the CTranslate2 inference engine. This delivers up to 4x faster-than-real-time transcription on consumer CPUs/GPUs without external network calls.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Local Intelligence &amp;amp; Text Refinement (Ollama + &lt;code&gt;llama3.1:8b&lt;/code&gt;):&lt;/strong&gt;&lt;br&gt;
Raw transcription often suffers from stutters, repetitions, and unstructured ramblings. LocalWhisper integrates directly with local &lt;strong&gt;Ollama&lt;/strong&gt; instances. Using open-weight models like &lt;code&gt;llama3.1:8b&lt;/code&gt;, it cleans transcripts across multiple modes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Smart Dictation:&lt;/strong&gt; Removes filler words while maintaining personal voice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Field &amp;amp; Bullet Summary:&lt;/strong&gt; Distills stream-of-consciousness rambling into structured, actionable checklists.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code &amp;amp; Tech:&lt;/strong&gt; Synthesizes voice logs into camelCase, snake_case, and terminal commands.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hinglish/Hindi Processing:&lt;/strong&gt; Accurately interprets code-switched multi-language dictation.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;System Overlay &amp;amp; Direct Keystroke Emulation:&lt;/strong&gt;&lt;br&gt;
The interface is a lightweight, non-stealing glassmorphic HUD built in Python (&lt;code&gt;Tkinter&lt;/code&gt;). Refined text bypasses the operating system's clipboard (&lt;code&gt;Win+V&lt;/code&gt;) and is typed directly into active windows via hardware-level event hooks (&lt;code&gt;pynput&lt;/code&gt;), ensuring zero data retention outside the user's encrypted local history.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




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

&lt;p&gt;Open innovation was not an afterthought for this build—it was a prerequisite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;True Offline Portability:&lt;/strong&gt; Closed-source voice-to-text platforms (like Google Speech-to-Text or OpenAI Whisper API) fail the moment you walk into a park, mountain trail, or remote campsite without Wi-Fi or cellular service. Open-weight models (&lt;code&gt;faster-whisper&lt;/code&gt; + Llama 3.1) run autonomously on consumer laptops off the grid.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complete Sensory Privacy:&lt;/strong&gt; Voice notes recorded outdoors or in private moments often include personal thoughts, journal entries, and sensitive project ideas. Open-source local models guarantee that no spoken audio or transcribed text ever hits corporate telemetry servers or third-party training pipelines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero Ongoing Cost:&lt;/strong&gt; Proprietary APIs charge per audio minute and per token, which discourages long, ambient voice captures. Open-weight inference costs nothing to run, whether you record a two-second note or an hour-long outdoor brainstorm.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model Modularity:&lt;/strong&gt; Users have the freedom to swap out the refiner engine for smaller models (e.g., &lt;code&gt;phi3&lt;/code&gt;, &lt;code&gt;gemma2:2b&lt;/code&gt;) on low-power devices, or larger parameter models on dedicated hardware.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hacktoberfest Open-Source AI Challenge: Week 1 (Touch Grass)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

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