<?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: Jiten Verma</title>
    <description>The latest articles on DEV Community by Jiten Verma (@jitenverma76).</description>
    <link>https://dev.to/jitenverma76</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%2F4181441%2F773e7530-0863-4b93-b1a6-275ad13e5da1.jpg</url>
      <title>DEV Community: Jiten Verma</title>
      <link>https://dev.to/jitenverma76</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jitenverma76"/>
    <language>en</language>
    <item>
      <title>Kiroku</title>
      <dc:creator>Jiten Verma</dc:creator>
      <pubDate>Sun, 18 Oct 2026 22:33:03 +0000</pubDate>
      <link>https://dev.to/jitenverma76/kiroku-458l</link>
      <guid>https://dev.to/jitenverma76/kiroku-458l</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;&lt;strong&gt;Kiroku turns financial documents into structured, exportable records—without them ever leaving your machine.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Drop in PDFs or phone photos. It extracts vendor details, document numbers, dates, currency, subtotal, tax, and total; scores confidence per field; detects exact duplicates using SHA-256 and probable duplicates using vendor, amount, and dates within ±7 days; and queues uncertain records for human review.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The result:&lt;/strong&gt; RFC-4180-compliant CSV exports ready for QuickBooks, Xero, or your accountant.&lt;/p&gt;

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


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://kiroku-jade-five.vercel.app/" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;kiroku-jade-five.vercel.app&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&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/jitenverma076" rel="noopener noreferrer"&gt;
        jitenverma076
      &lt;/a&gt; / &lt;a href="https://github.com/jitenverma076/Kiroku" rel="noopener noreferrer"&gt;
        Kiroku
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Kiroku turns a folder of invoices, receipts, and bills into searchable, exportable financial records. It reads the vendor, dates, and amounts off each document, flags whatever it is unsure about, and hands you a CSV your accountant can open.
    &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;Kiroku&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Kiroku (記録, "records") turns a folder of invoices, receipts, and bills into a
searchable, exportable set of financial records. It reads the vendor, dates, amounts
and tax off each document, flags anything it is unsure about, and exports a CSV your
accountant can use.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It runs entirely in your browser.&lt;/strong&gt; Documents are parsed, extracted, and stored in
the tab — nothing is uploaded to a server. There is also a self-hosted backend if you
would rather keep everything in a SQLite file on disk.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/a3ad04e1813250aaf6af1d9c40974c71e39fb4a5819aa0e83f7862601076aa25/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e63652d4d49542d626c7565"&gt;&lt;img src="https://camo.githubusercontent.com/a3ad04e1813250aaf6af1d9c40974c71e39fb4a5819aa0e83f7862601076aa25/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e63652d4d49542d626c7565" alt="MIT licence"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/jitenverma076/Kiroku/docs/screenshot.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fjitenverma076%2FKiroku%2FHEAD%2Fdocs%2Fscreenshot.png" alt="Kiroku's document list"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Use it&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Open the deployed app, or run the frontend yourself:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c1"&gt;cd&lt;/span&gt; frontend
npm install
npm run dev        &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; http://localhost:5173&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;&lt;code&gt;/&lt;/code&gt; is the landing page and &lt;code&gt;/documents&lt;/code&gt; is the app. Nothing else is required — no
Python, no database, no API keys.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How it works&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;In the browser&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Read a PDF&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;pdf.js&lt;/code&gt; reads the text layer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Read a scan or photo&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;tesseract.js&lt;/code&gt; runs OCR&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;…&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/jitenverma076/Kiroku" 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;&lt;strong&gt;An open-weight model, running entirely locally.&lt;/strong&gt; &lt;code&gt;typeform/distilbert-base-uncased-mnli&lt;/code&gt; (Apache 2.0) runs through Hugging Face Transformers on Apple MPS, CUDA, or CPU via PyTorch. Its job is deliberately narrow: classify documents as invoices, receipts, bills, or credit notes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Classification is probabilistic; financial extraction is deterministic.&lt;/strong&gt; Every monetary field comes from a labelled-regex extractor with per-field confidence scoring. A hallucinated total is worse than a blank one, so the extractor returns nothing rather than guessing, leaving uncertain fields for the review queue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Optional, non-blocking, and offline-capable.&lt;/strong&gt; The model sits in a separate &lt;code&gt;requirements-ml.txt&lt;/code&gt; and loads on a background thread that imports never await. Testing confirmed imports remain around one second offline instead of hanging. Without the model, keyword and document-structure matching take over, with zero network calls. Weights download once; subsequent inference runs offline.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;It's the only reason this product can exist.&lt;/strong&gt; Financial documents never leave your machine. A closed API would send sensitive data—client names, billing rates, bank details—to a third party that may retain or train on it. That's fundamentally a different product.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zero marginal cost changes the design.&lt;/strong&gt; Open weights make re-extraction free, turning it into a button rather than a billing decision. Freelancers processing 500 receipts a year shouldn't have to think twice about reprocessing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I could verify my own claims.&lt;/strong&gt; I blocked the Hugging Face endpoint, measured what broke, found offline imports hanging, and fixed them. With a closed API, you can't inspect what leaves your machine. You take the vendor's word for it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open weights give the app a working floor.&lt;/strong&gt; No network or model weights? Classification falls back to keyword matching, and imports still work. A closed API offers no such fallback: no key or connection means a dead app.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pinned weights mean reproducible books.&lt;/strong&gt; Hosted models can change silently and alter extraction results. For records that feed a tax return, unversioned model drift is a liability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The honest caveat:&lt;/strong&gt; Weights download from Hugging Face on first run. After that, the app runs fully offline. That dependency is transparent and verifiable precisely because the entire stack is open.&lt;/p&gt;

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