<?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: Kritiraj</title>
    <description>The latest articles on DEV Community by Kritiraj (@wkkny).</description>
    <link>https://dev.to/wkkny</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%2F4154600%2F9bb0b8a5-d620-45cf-b20d-6fb6fbed2a7b.jpg</url>
      <title>DEV Community: Kritiraj</title>
      <link>https://dev.to/wkkny</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/wkkny"/>
    <language>en</language>
    <item>
      <title>Ledger Lift: turning a shop's handwritten sales ledger into a CSV, fully offline</title>
      <dc:creator>Kritiraj</dc:creator>
      <pubDate>Mon, 19 Oct 2026 05:21:19 +0000</pubDate>
      <link>https://dev.to/wkkny/ledger-lift-turning-a-shops-handwritten-sales-ledger-into-a-csv-fully-offline-k0e</link>
      <guid>https://dev.to/wkkny/ledger-lift-turning-a-shops-handwritten-sales-ledger-into-a-csv-fully-offline-k0e</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;Ledger Lift is a desktop app that reads a photo of a handwritten daily sales ledger and gives you back editable rows and a CSV.&lt;/p&gt;

&lt;p&gt;A lot of small shops still write every sale in a paper book. To get those pages into a spreadsheet, someone has to retype them. The tools that do it automatically want you to upload your shop's records to their server and pay per page.&lt;/p&gt;

&lt;p&gt;In Ledger Lift you pick a photo of a ledger page and press &lt;strong&gt;Read this page&lt;/strong&gt;. Rows (date, item, quantity, amount) show up one at a time as the model reads them. You fix whatever it got wrong, add more pages if there are any, tick each row as reviewed, and download one CSV for all of them. The photo stays on your computer the whole time.&lt;/p&gt;

&lt;p&gt;The people I think would pay for this are shop owners, and the bookkeepers or accountants they hand their ledgers to, who currently spend hours retyping. Since there's no server cost per page, a one-time licence makes sense.&lt;/p&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%2Ftd54x72hux0yz7hthpz2.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%2Ftd54x72hux0yz7hthpz2.png" alt="Ledger Lift showing a photo of a handwritten ledger page beside nine extracted rows, with uncertain fields highlighted in amber" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Windows installer: &lt;a href="https://github.com/wkkny/ledger-lift/releases/tag/v0.2.1" rel="noopener noreferrer"&gt;Ledger Lift v0.2.1&lt;/a&gt;&lt;/p&gt;

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


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/wkkny" rel="noopener noreferrer"&gt;
        wkkny
      &lt;/a&gt; / &lt;a href="https://github.com/wkkny/ledger-lift" rel="noopener noreferrer"&gt;
        ledger-lift
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Photos of paper ledgers to spreadsheets, with a local open-weight vision model
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Ledger Lift&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A desktop app that turns a photo of a handwritten daily sales ledger into editable rows and a CSV. An open-weight vision model reads the page on the shop owner's own computer. Review and correct every row before using it.&lt;/p&gt;
&lt;p&gt;The photo is sent only to the local Ollama service on the same computer. Ledger Lift does not store photos or send them to a hosted API. This is an early prototype: handwriting recognition can be wrong, so check each entry against the original page before downloading.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;For the owner&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Open Ledger Lift. If Ollama isn't installed, the app says so, and its &lt;strong&gt;Download Ollama&lt;/strong&gt; button opens the &lt;a href="https://ollama.com/download" rel="nofollow noopener noreferrer"&gt;Ollama download page&lt;/a&gt;. Run its installer (no administrator password needed); the app notices when it finishes and carries on by itself.&lt;/li&gt;
&lt;li&gt;Ledger Lift starts Ollama for you and offers a one-time download of the reading model (about 2 GB).&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/wkkny/ledger-lift" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


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

&lt;p&gt;The model is &lt;code&gt;qwen3-vl:2b-instruct&lt;/code&gt;, an open-weight vision model, running locally through Ollama. I skipped the plain &lt;code&gt;qwen3-vl:2b&lt;/code&gt; tag because it thinks for 30 to 100 seconds before it answers anything. If you'd rather use a different model, there's a &lt;strong&gt;Model&lt;/strong&gt; picker.&lt;/p&gt;

&lt;p&gt;The app is Electron with a React UI (shadcn/ui and Tailwind v4). The main process looks after Ollama: it starts and stops it, downloads the model (about 2 GB, once) with a progress bar, keeps it loaded between pages, and sends each row to the UI as soon as it's read. The page itself is sandboxed and has no Node access.&lt;/p&gt;

&lt;p&gt;Most shop owners won't have Ollama installed. If it's missing, the app tells them and opens the download page, then picks up where it left off once the install is done. No admin password needed.&lt;/p&gt;

&lt;p&gt;Getting a 2B model to do this reliably took a few tricks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Photos are shrunk to 1600 px on the long edge. Full-size phone photos overflowed the model's context window.&lt;/li&gt;
&lt;li&gt;The prompt tells the model to read the total for each sale from the last money column, and to copy the date from the row above when there's a ditto mark.&lt;/li&gt;
&lt;li&gt;Small models sometimes get stuck writing the same rows over and over. The app spots the loop, stops, and keeps the rows from before it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I didn't want anyone to trust the output blindly. If the model couldn't read a field or wasn't sure about a digit, that field is highlighted, and the CSV download stays off until every row is marked reviewed.&lt;/p&gt;

&lt;p&gt;To check how accurate it is, I wrote &lt;code&gt;pnpm score&lt;/code&gt;. It runs the real model on real pages, compares the result with answer files I typed by hand, and reports per-field accuracy, missed and invented rows, and whether the fields it got wrong were the ones it highlighted.&lt;/p&gt;

&lt;p&gt;A GitHub Actions workflow builds and smoke-tests a Windows installer that installs for the current user only. Unit tests run against a fake Ollama server, and Playwright drives the real app end to end.&lt;/p&gt;

&lt;p&gt;On an Apple M4, a 15-row page takes about 21 seconds, and the first row shows up after about 10.&lt;/p&gt;

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

&lt;p&gt;A shop's sales ledger is private business data. With an open-weight model running locally, the pages stay on the owner's computer instead of going to a server they don't control. Once the model is downloaded, it works without internet too.&lt;/p&gt;

&lt;p&gt;It's also why the business side works at all. There's no hosted inference bill per page, so the owner isn't tied to someone else's per-page pricing or subscription. And because the model and prompt are open, they can switch to another compatible model and see exactly how the extraction works.&lt;/p&gt;

&lt;p&gt;It isn't perfect. Handwriting recognition gets things wrong, so every row needs checking against the page. I've scored two handwritten pages so far (about 9 and 16 rows). Amounts and quantities were mostly right, but dates and multi-word item names were weaker.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Hacktoberfest Weekend: Build for a Friend Challenge.</title>
      <dc:creator>Kritiraj</dc:creator>
      <pubDate>Mon, 05 Oct 2026 03:52:50 +0000</pubDate>
      <link>https://dev.to/wkkny/hacktoberfest-weekend-build-for-a-friend-challenge-1jjj</link>
      <guid>https://dev.to/wkkny/hacktoberfest-weekend-build-for-a-friend-challenge-1jjj</guid>
      <description>&lt;h2&gt;
  
  
  OutLoud: learning by talking it through
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;A friend of mine learns by talking ideas through, but doesn’t use AI much. Most AI chats start with typing a prompt, which doesn’t fit how she likes to learn. I built OutLoud so she can explain a topic aloud, review the transcript, and continue the conversation with a local model.&lt;/p&gt;

&lt;p&gt;You can explain a topic out loud, then read and edit the transcript before it goes anywhere. Stopping a recording only creates a draft. You decide when to send it.&lt;/p&gt;

&lt;p&gt;Study mode lets you set up a subject, add a syllabus and reference material, and work through topics. As you explain ideas and answer follow-up questions, OutLoud saves evidence of your understanding and topics to revisit.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://drive.google.com/file/d/1JjboyLgrYaJ42dDwwVtQ_AhKP-p9zq3L/view?usp=sharing" rel="noopener noreferrer"&gt;Watch the demo video&lt;/a&gt;&lt;/p&gt;

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


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/wkkny" rel="noopener noreferrer"&gt;
        wkkny
      &lt;/a&gt; / &lt;a href="https://github.com/wkkny/OutLoud" rel="noopener noreferrer"&gt;
        OutLoud
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;OutLoud&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;OutLoud is a local, voice-first chat and study app. It has a browser UI and an
Electron development app. A Python backend records audio from the computer's
microphone, transcribes it with Whisper, and saves the transcript into the
selected conversation's editable draft. &lt;strong&gt;A transcript is never sent
automatically:&lt;/strong&gt; review it, then choose Send to get a streamed reply from the
local Gemma model through Ollama.&lt;/p&gt;
&lt;p&gt;The app runs its servers on loopback (&lt;code&gt;127.0.0.1&lt;/code&gt;). It is designed for one
computer, not as a hosted or network-accessible service. The browser and desktop
apps use separate local data stores.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Quick start&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;1. Install prerequisites&lt;/h3&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Python 3.11&lt;/strong&gt;. The repository pins it in &lt;code&gt;.python-version&lt;/code&gt; and &lt;code&gt;mise.toml&lt;/code&gt;
If you use &lt;a href="https://mise.jdx.dev/" rel="nofollow noopener noreferrer"&gt;mise&lt;/a&gt;, run &lt;code&gt;mise install&lt;/code&gt; from the repo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;uv&lt;/strong&gt; for Python environment and dependency management:
&lt;a href="https://docs.astral.sh/uv/getting-started/installation/" rel="nofollow noopener noreferrer"&gt;install uv&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bun 1.4.2&lt;/strong&gt; for JavaScript dependencies and workspace commands:
&lt;a href="https://bun.sh/docs/installation" rel="nofollow noopener noreferrer"&gt;install Bun&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Node.js 22.12+&lt;/strong&gt;…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/wkkny/OutLoud" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  How I built it
&lt;/h2&gt;

&lt;p&gt;OutLoud uses Whisper to transcribe speech and Gemma 3 (&lt;code&gt;gemma3:4b&lt;/code&gt;) for chat and study responses. Whisper runs in the Python backend. Gemma runs locally through Ollama.&lt;/p&gt;

&lt;p&gt;The web app is built with React, TypeScript, and Vite. A Python backend handles recording, transcription, and chat. Conversations, drafts, and study progress are saved in a local SQLite database. There’s also an Electron development app that runs the same interface with a managed backend.&lt;/p&gt;

&lt;p&gt;The flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Speak → Whisper transcribes → review and edit → send → Gemma responds
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I wanted a clear pause between speaking and sending. A transcript can have mistakes, and sometimes you want to change what you said before asking a model about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why open innovation matters
&lt;/h2&gt;

&lt;p&gt;The local models are a good fit for this app. A spoken study session doesn’t need to go to a hosted inference API, and there’s no per-request model API bill. Once the models are installed, transcription and chat run on the user’s computer.&lt;/p&gt;

&lt;p&gt;That does mean setup takes a little work, and the computer needs enough resources to run the models. Local models also make mistakes. I see OutLoud as a study aid, so its feedback should be checked against the course material.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma:&lt;/strong&gt; OutLoud uses Gemma 3 locally through Ollama to respond to reviewed explanations and support study conversations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of GitHub Copilot:&lt;/strong&gt; This category includes project automation with GitHub Actions. OutLoud’s pull-request workflow validates the web app and runs backend and desktop checks across Linux, Windows, and macOS.&lt;/li&gt;
&lt;/ul&gt;

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