<?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: Amrit Kang</title>
    <description>The latest articles on DEV Community by Amrit Kang (@amritkang165).</description>
    <link>https://dev.to/amritkang165</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%2F3962125%2F3cb88888-9668-4030-bdec-9956cd41c3b9.png</url>
      <title>DEV Community: Amrit Kang</title>
      <link>https://dev.to/amritkang165</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/amritkang165"/>
    <language>en</language>
    <item>
      <title>I Built a Voice-First AI Khata for a Shopkeeper Who Shouldn’t Have to Type</title>
      <dc:creator>Amrit Kang</dc:creator>
      <pubDate>Mon, 05 Oct 2026 06:21:29 +0000</pubDate>
      <link>https://dev.to/amritkang165/i-built-a-voice-first-ai-khata-for-a-shopkeeper-who-shouldnt-have-to-type-3086</link>
      <guid>https://dev.to/amritkang165/i-built-a-voice-first-ai-khata-for-a-shopkeeper-who-shouldnt-have-to-type-3086</guid>
      <description>&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;I built &lt;strong&gt;Khata Ledger&lt;/strong&gt;, a voice-first AI credit ledger for &lt;strong&gt;Family Friend&lt;/strong&gt;, who runs &lt;strong&gt;Baba gernal store&lt;/strong&gt; in &lt;strong&gt;Ludhiana&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Small neighbourhood shops often give groceries and other essentials on credit. These transactions are usually written in a notebook, saved in scattered messages, or simply remembered.&lt;/p&gt;

&lt;p&gt;That works until the shop becomes busy.&lt;/p&gt;

&lt;p&gt;A customer’s name gets forgotten, a payment is recorded incorrectly, or someone promises to pay on Friday without there being a useful reminder when Friday arrives.&lt;/p&gt;

&lt;p&gt;Most accounting applications expect the shopkeeper to stop serving customers, open a form, type several fields, and understand formal bookkeeping terminology.&lt;/p&gt;

&lt;p&gt;I wanted the interaction to feel as natural as speaking across the counter:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Ramesh bhai ko 850 rupaye ka ration diya, Friday tak dega.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Khata Ledger extracts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Customer: Ramesh&lt;/li&gt;
&lt;li&gt;Amount: ₹850&lt;/li&gt;
&lt;li&gt;Transaction: credit given&lt;/li&gt;
&lt;li&gt;Context: ration&lt;/li&gt;
&lt;li&gt;Due date: Friday&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It then safely adds the transaction to the shopkeeper’s private ledger.&lt;/p&gt;

&lt;p&gt;The shopkeeper can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;create a private shop account;&lt;/li&gt;
&lt;li&gt;record a voice note directly in the browser;&lt;/li&gt;
&lt;li&gt;see a real waveform and recording duration;&lt;/li&gt;
&lt;li&gt;discard and re-record an incorrect note;&lt;/li&gt;
&lt;li&gt;convert natural Hindi or Hinglish into structured ledger data;&lt;/li&gt;
&lt;li&gt;review uncertain entries before they affect a balance;&lt;/li&gt;
&lt;li&gt;see every customer’s outstanding amount;&lt;/li&gt;
&lt;li&gt;record repayments;&lt;/li&gt;
&lt;li&gt;search and filter the complete passbook;&lt;/li&gt;
&lt;li&gt;receive reminders only when payment is due;&lt;/li&gt;
&lt;li&gt;generate a message containing the customer’s dated account history.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The application does not blindly trust its AI model. If an amount is missing or extraction confidence is below &lt;code&gt;0.6&lt;/code&gt;, the note is placed in an owner review queue instead of being added to the financial ledger.&lt;/p&gt;

&lt;p&gt;AI can assist with bookkeeping, but uncertainty should never quietly become financial truth.&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%2Fbwl0xnpxfnr4t7t4vh5f.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%2Fbwl0xnpxfnr4t7t4vh5f.png" alt="Khata Ledger voice interface" width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Live application:&lt;/strong&gt; [&lt;a href="https://khata-ledger-3deb.onrender.com" rel="noopener noreferrer"&gt;https://khata-ledger-3deb.onrender.com&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub repository:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/amritkang165/khata-ledger" rel="noopener noreferrer"&gt;https://github.com/amritkang165/khata-ledger&lt;/a&gt;&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Shopkeeper speaks
        ↓
Browser records temporary audio
        ↓
ElevenLabs Scribe transcribes it
        ↓
FastAPI sends the transcript to local Gemma
        ↓
Gemma extracts validated ledger fields
        ↓
Low confidence? → Owner review queue
Confident?      → Private SQLite ledger
        ↓
Balances, passbook and payment reminders
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Example notes:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ramesh bhai ko 850 rupaye ka ration diya, Friday tak dega
Sunita owes 420 rupees for school books, payment by Monday
Vanshika ne 500 rupaye wapas de diye
Deepak ko aaj 333 rupaye ka school samaan diya
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Credit given increases the customer’s outstanding balance. A received payment reduces it.&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/amritkang165" rel="noopener noreferrer"&gt;
        amritkang165
      &lt;/a&gt; / &lt;a href="https://github.com/amritkang165/khata-ledger" rel="noopener noreferrer"&gt;
        khata-ledger
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Voice-first, local-first AI credit ledger for small shopkeepers
    &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;Khata Ledger&lt;/h1&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Bol ke likho. Hisaab simple rakho.&lt;/h3&gt;
&lt;/div&gt;

&lt;p&gt;Khata Ledger is a voice-first credit ledger for kirana stores and other small shops. A shopkeeper can speak a natural note such as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Ramesh bhai ko 850 rupaye ka ration diya, Friday tak dega.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The app transcribes the audio, extracts the customer, amount, transaction type and due date, then safely adds the entry to that shopkeeper's private ledger.&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/amritkang165/khata-ledger/results/khata-voice-entry.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%2Famritkang165%2Fkhata-ledger%2FHEAD%2Fresults%2Fkhata-voice-entry.png" alt="Khata Ledger voice entry interface"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why this exists&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Many neighbourhood shopkeepers still manage credit in notebooks, memory, or scattered chat messages. Traditional accounting products often expect careful typing, formal bookkeeping language, and constant connectivity.&lt;/p&gt;

&lt;p&gt;Khata Ledger is designed around the way a shopkeeper already works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;speak naturally in Hindi, Hinglish, Punjabi-accented English, or everyday shop language;&lt;/li&gt;
&lt;li&gt;review uncertain entries instead of silently saving bad financial data;&lt;/li&gt;
&lt;li&gt;keep customer balances separated by shop account;&lt;/li&gt;
&lt;li&gt;see exactly who owes money and when a reminder is actually due;&lt;/li&gt;
&lt;li&gt;retain the real financial…&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/amritkang165/khata-ledger" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The project is built with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;FastAPI&lt;/li&gt;
&lt;li&gt;SQLite&lt;/li&gt;
&lt;li&gt;Gemma 3 4B&lt;/li&gt;
&lt;li&gt;Ollama&lt;/li&gt;
&lt;li&gt;ElevenLabs Scribe v2&lt;/li&gt;
&lt;li&gt;MongoDB Atlas Vector Search&lt;/li&gt;
&lt;li&gt;Sentry Agent Tracing&lt;/li&gt;
&lt;li&gt;Tinker&lt;/li&gt;
&lt;li&gt;Vanilla HTML, CSS, and JavaScript&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The repository contains the complete application, tests, synthetic datasets, Atlas scripts, Tinker evaluation assets, Docker configuration, and Render Blueprint configuration.&lt;/p&gt;

&lt;p&gt;To 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/amritkang165/khata-ledger.git
&lt;span class="nb"&gt;cd &lt;/span&gt;khata-ledger

&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env
uv &lt;span class="nb"&gt;sync&lt;/span&gt; &lt;span class="nt"&gt;--extra&lt;/span&gt; dev

ollama pull gemma3:4b
./start.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;h3&gt;
  
  
  Voice transcription with ElevenLabs
&lt;/h3&gt;

&lt;p&gt;The browser records a temporary audio file and sends it to the FastAPI backend.&lt;/p&gt;

&lt;p&gt;The backend forwards that audio to ElevenLabs Scribe v2. Khata Ledger uses the returned transcript but does not save the uploaded recording.&lt;/p&gt;

&lt;p&gt;This gives the project accurate speech transcription while keeping its financial system of record separate.&lt;/p&gt;

&lt;h3&gt;
  
  
  Local extraction with Gemma and Ollama
&lt;/h3&gt;

&lt;p&gt;The transcript is processed by &lt;strong&gt;Gemma 3 4B running locally through Ollama&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Gemma converts everyday shop language into validated JSON:&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;"customer_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Ramesh"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"amount_rupees"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;850&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"due_day"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Friday"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"context"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ration"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"transaction_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"credit_given"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.95&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;Natural shop language can be ambiguous.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ramesh ko 500 rupaye ka ration diya
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means the shopkeeper gave goods on credit.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ramesh ne 500 rupaye de diye
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means the customer repaid money.&lt;/p&gt;

&lt;p&gt;A wrong interpretation would reverse the customer’s balance.&lt;/p&gt;

&lt;p&gt;Along with the model prompt, I added deterministic transaction-direction safeguards for important phrases such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ration diya&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;udhaar diya&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Friday tak dega&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;payment kar diya&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;jama kar diya&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;paise wapas diye&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This combines the flexibility of an open model with predictable financial safeguards.&lt;/p&gt;

&lt;h3&gt;
  
  
  A review gate for uncertain entries
&lt;/h3&gt;

&lt;p&gt;The model is not allowed to write every answer directly into the ledger.&lt;/p&gt;

&lt;p&gt;An entry requires manual review when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the amount is missing; or&lt;/li&gt;
&lt;li&gt;model confidence is below &lt;code&gt;0.6&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The shopkeeper can correct the customer, amount, context, due date, or transaction type before saving it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Duplicate-entry protection
&lt;/h3&gt;

&lt;p&gt;People double-tap buttons, mobile connections fail, and browsers retry requests.&lt;/p&gt;

&lt;p&gt;In a credit ledger, one repeated request could create a false debt.&lt;/p&gt;

&lt;p&gt;Every submission receives an idempotency key. SQLite enforces that the same key cannot create two transactions for the same shop owner.&lt;/p&gt;

&lt;p&gt;The button also locks while a request is processing, but correctness does not depend only on the frontend.&lt;/p&gt;

&lt;h3&gt;
  
  
  Local authentication and isolated ledgers
&lt;/h3&gt;

&lt;p&gt;I deliberately kept authentication beside the ledger instead of requiring a hosted identity provider.&lt;/p&gt;

&lt;p&gt;Accounts, sessions, customers, and transactions live in the same local SQLite database.&lt;/p&gt;

&lt;p&gt;Passwords use salted PBKDF2-SHA256 hashes. Raw session tokens are not stored, sessions expire on the server, and every query is scoped to the authenticated owner.&lt;/p&gt;

&lt;p&gt;Each registered shop therefore receives an isolated ledger.&lt;/p&gt;

&lt;h3&gt;
  
  
  Useful reminders rather than instant pressure
&lt;/h3&gt;

&lt;p&gt;My first implementation immediately displayed a collection message for every outstanding balance.&lt;/p&gt;

&lt;p&gt;That felt wrong.&lt;/p&gt;

&lt;p&gt;If someone received groceries today, the app should not immediately pressure the shopkeeper to contact them.&lt;/p&gt;

&lt;p&gt;The updated rule shows a reminder only when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the promised due date has arrived; or&lt;/li&gt;
&lt;li&gt;the credit has remained open for at least three days.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The application never sends a message automatically.&lt;/p&gt;

&lt;p&gt;The shopkeeper taps &lt;strong&gt;Send message&lt;/strong&gt;, reviews the draft, and can copy or share it. The message contains the current balance and the complete dated history of credits and payments.&lt;/p&gt;

&lt;h3&gt;
  
  
  Synthetic-only MongoDB Atlas search
&lt;/h3&gt;

&lt;p&gt;I used MongoDB Atlas Vector Search to retrieve similar repayment patterns.&lt;/p&gt;

&lt;p&gt;However, Atlas only contains explicitly synthetic customer profiles. Real customers, real transactions, and the SQLite ledger are never uploaded.&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%2F36imauuvqj6pwj4yp9pj.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%2F36imauuvqj6pwj4yp9pj.png" alt="MongoDB Atlas Vector Search" width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This allowed me to explore vector retrieval without breaking the project’s privacy boundary.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sentry Agent Tracing
&lt;/h3&gt;

&lt;p&gt;I added Sentry spans around the extraction pipeline.&lt;/p&gt;

&lt;p&gt;The traces record:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;model name;&lt;/li&gt;
&lt;li&gt;extraction latency;&lt;/li&gt;
&lt;li&gt;token usage;&lt;/li&gt;
&lt;li&gt;fallback reason;&lt;/li&gt;
&lt;li&gt;parsing failure;&lt;/li&gt;
&lt;li&gt;whether manual review was required.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Parsed financial output is redacted by default.&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%2Fqeieuxb5ftdise648agr.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%2Fqeieuxb5ftdise648agr.png" alt="Sentry extraction trace" width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This helped me confirm that the local model call dominated request time while FastAPI and SQLite work remained small.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tinker fine-tuning experiment
&lt;/h3&gt;

&lt;p&gt;I also ran a separate extraction experiment using Tinker and Qwen 3.5 4B.&lt;/p&gt;

&lt;p&gt;The Tinker model catalog available during development did not expose a Whisper or audio fine-tuning path, so I measured transcript-to-ledger extraction instead.&lt;/p&gt;

&lt;p&gt;The reproducible synthetic dataset contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;160 training examples&lt;/li&gt;
&lt;li&gt;40 fixed held-out examples&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Baseline&lt;/th&gt;
&lt;th&gt;Fine-tuned&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Valid JSON&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Customer exact match&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Amount exact match&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transaction direction&lt;/td&gt;
&lt;td&gt;80%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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%2Fvfifeyq6cmbqp68wrx51.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%2Fvfifeyq6cmbqp68wrx51.png" alt="Tinker evaluation" width="800" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This result measures text extraction accuracy, not speech-recognition word error rate. The application’s normal runtime continues to use Gemma through Ollama.&lt;/p&gt;

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

&lt;p&gt;Open innovation is central to Khata Ledger because this application handles personal financial relationships.&lt;/p&gt;

&lt;h3&gt;
  
  
  The ledger stays under the shopkeeper’s control
&lt;/h3&gt;

&lt;p&gt;The real financial ledger remains in a local SQLite database. Gemma runs on the shopkeeper’s machine through Ollama.&lt;/p&gt;

&lt;p&gt;Customer names, balances, and transaction history do not need to be stored by a hosted LLM provider.&lt;/p&gt;

&lt;h3&gt;
  
  
  The model can be inspected and replaced
&lt;/h3&gt;

&lt;p&gt;The extraction prompt, validation schema, language rules, and fallback logic are all visible in the repository.&lt;/p&gt;

&lt;p&gt;I can improve the prompt, change the model, add another language, or run a different open-weight model without rebuilding the product around another provider.&lt;/p&gt;

&lt;h3&gt;
  
  
  Local inference reduces recurring cost
&lt;/h3&gt;

&lt;p&gt;After the model has been downloaded, extraction can run locally without paying for every ledger entry.&lt;/p&gt;

&lt;p&gt;That matters for a product intended for small shops, where a recurring AI fee could cost more than the value provided by the application.&lt;/p&gt;

&lt;h3&gt;
  
  
  The application can degrade safely
&lt;/h3&gt;

&lt;p&gt;If Ollama becomes unavailable, Khata Ledger uses a deterministic local fallback and reports that fallback in its response.&lt;/p&gt;

&lt;p&gt;It does not silently pretend the model succeeded.&lt;/p&gt;

&lt;h3&gt;
  
  
  Privacy affected the architecture
&lt;/h3&gt;

&lt;p&gt;“Local-first” was not added as marketing text after development.&lt;/p&gt;

&lt;p&gt;It changed where I placed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;authentication;&lt;/li&gt;
&lt;li&gt;model inference;&lt;/li&gt;
&lt;li&gt;financial storage;&lt;/li&gt;
&lt;li&gt;observability;&lt;/li&gt;
&lt;li&gt;vector retrieval;&lt;/li&gt;
&lt;li&gt;review and validation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The application is not completely offline because high-quality voice transcription currently uses ElevenLabs. However, its financial system of record and structured AI extraction remain local.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;I did not record a DevRelay session for this build.&lt;/p&gt;

&lt;p&gt;Instead, I kept the Git history intentionally divided into small, timestamped commits so that each backend, authentication, safety, and UI decision can be traced independently:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/amritkang165/khata-ledger/commits/main/" rel="noopener noreferrer"&gt;https://github.com/amritkang165/khata-ledger/commits/main/&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;I am entering Khata Ledger in the following applicable categories:&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of Gemma
&lt;/h3&gt;

&lt;p&gt;Gemma 3 4B is the open-weight model at the centre of the transaction-extraction pipeline. It runs locally through Ollama and converts natural Hinglish shop notes into validated ledger data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of ElevenLabs
&lt;/h3&gt;

&lt;p&gt;ElevenLabs Scribe v2 transcribes voice notes before the transcript is processed by the local Gemma model. Audio is not persisted by Khata Ledger.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of Tinker
&lt;/h3&gt;

&lt;p&gt;I used Tinker to fine-tune and evaluate transaction extraction on a reproducible synthetic dataset. Transaction-direction accuracy improved from 80% to 100% on the fixed held-out split.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of MongoDB Atlas
&lt;/h3&gt;

&lt;p&gt;Atlas Vector Search retrieves similar repayment profiles from an explicitly synthetic-only collection while real financial data remains in local SQLite.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of Sentry Agent Tracing
&lt;/h3&gt;

&lt;p&gt;Sentry traces show the complete extraction request, including model latency, token usage, parsing status, review requirements, and downstream HTTP work, while financial output remains redacted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building for one person
&lt;/h2&gt;

&lt;p&gt;After trying the project, &lt;strong&gt;Hardeep Singh&lt;/strong&gt; said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“He'll most definately use this”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Their feedback directly changed &lt;strong&gt;UX&lt;/strong&gt; had to make it more simple and easily readable.&lt;/p&gt;

&lt;p&gt;Building for one real person made every decision more concrete.&lt;/p&gt;

&lt;p&gt;The project began with one question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if maintaining a credit ledger felt as natural as speaking across the counter?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open-weight local AI made that idea practical without asking the shopkeeper to surrender control of their financial records.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>From Study Tracker to Study Companion: My Finish-Up-A-Thon Journey</title>
      <dc:creator>Amrit Kang</dc:creator>
      <pubDate>Sun, 07 Jun 2026 22:15:57 +0000</pubDate>
      <link>https://dev.to/amritkang165/from-study-tracker-to-study-companion-my-finish-up-a-thon-journey-41ng</link>
      <guid>https://dev.to/amritkang165/from-study-tracker-to-study-companion-my-finish-up-a-thon-journey-41ng</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-05-21"&gt;GitHub Finish-Up-A-Thon Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  From Prototype to Product: Why I Built Study Companion
&lt;/h2&gt;

&lt;p&gt;As a student, I found myself constantly switching between apps while trying to study.&lt;/p&gt;

&lt;p&gt;★One app for tasks.&lt;br&gt;
★One for focus sessions.&lt;br&gt;
★One for tracking progress.&lt;br&gt;
★One for getting help when I was stuck.&lt;/p&gt;

&lt;p&gt;Juggling multiple tools wasn't just annoying—it was a distraction machine. I didn't want another productivity app, I wanted a complete study system that students could genuinely rely on every single day.&lt;/p&gt;

&lt;p&gt;That is why I built Study Companion &lt;/p&gt;

&lt;p&gt;What is Study Companion?&lt;br&gt;
Study Companion is a full-featured study productivity platform available on both web and mobile. It combines task management, focus tools, AI assistance, and progress tracking into a single, seamless experience.&lt;/p&gt;

&lt;p&gt;Here is a look under the hood at what the platform includes:&lt;/p&gt;

&lt;p&gt;• Subject &amp;amp; Topic Management&lt;br&gt;
• Smart Task Management&lt;br&gt;
• Pomodoro Timer &amp;amp; Focus Sounds&lt;br&gt;
• AI Study Buddy&lt;br&gt;
• Progress Analytics&lt;br&gt;
• Consistency Heatmaps&lt;br&gt;
• Cloud-Backed Storage&lt;br&gt;
• Cross-Platform&lt;/p&gt;

&lt;p&gt;The goal wasn't to build another productivity app.&lt;br&gt;
The goal was to build a study system that students could genuinely rely on every day.'&lt;/p&gt;

&lt;p&gt;At the start of the challenge, Study Companion already worked.&lt;br&gt;
But it wasn't finished.&lt;/p&gt;

&lt;p&gt;The GitHub Finish-Up-A-Thon gave me the perfect excuse to revisit the project and finally transform it from a working prototype into a complete product :)&lt;/p&gt;

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

&lt;p&gt;Live Application: &lt;a href="https://mystudy-companion.vercel.app/" rel="noopener noreferrer"&gt;https://mystudy-companion.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Repository: &lt;a href="https://github.com/amritkang165/study-companion" rel="noopener noreferrer"&gt;https://github.com/amritkang165/study-companion&lt;/a&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Ffon3glicsompulhuwiko.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.amazonaws.com%2Fuploads%2Farticles%2Ffon3glicsompulhuwiko.png" alt=" " width="800" height="520"&gt;&lt;/a&gt;&lt;br&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.amazonaws.com%2Fuploads%2Farticles%2Futbzd4f632135wgnd08r.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.amazonaws.com%2Fuploads%2Farticles%2Futbzd4f632135wgnd08r.png" alt=" " width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Before vs After
&lt;/h3&gt;

&lt;p&gt;Data Storage&lt;/p&gt;

&lt;h1&gt;
  
  
  ✿ Before
&lt;/h1&gt;

&lt;p&gt;• Subjects stored in localStorage&lt;br&gt;
• Tasks stored in localStorage&lt;br&gt;
• Revisions stored in localStorage&lt;br&gt;
• Data tied to a single browser&lt;br&gt;
• No real backend&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.amazonaws.com%2Fuploads%2Farticles%2F0i43sfwr9o6iirlnj82q.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.amazonaws.com%2Fuploads%2Farticles%2F0i43sfwr9o6iirlnj82q.png" alt=" " width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✿ After
&lt;/h1&gt;

&lt;p&gt;• Full Supabase integration&lt;br&gt;
• Dedicated database tables&lt;br&gt;
• Row Level Security (RLS)&lt;br&gt;
• Automatic migration of existing user data&lt;br&gt;
• Cross device synchronization&lt;br&gt;
• Persistent cloud-backed storage&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.amazonaws.com%2Fuploads%2Farticles%2Fbkzbsn4pm61s56hav438.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.amazonaws.com%2Fuploads%2Farticles%2Fbkzbsn4pm61s56hav438.png" alt=" " width="800" height="520"&gt;&lt;/a&gt;&lt;br&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.amazonaws.com%2Fuploads%2Farticles%2Fn7pou1uahipx2eca9npu.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.amazonaws.com%2Fuploads%2Farticles%2Fn7pou1uahipx2eca9npu.png" alt=" " width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This was the biggest architectural upgrade in the project.&lt;br&gt;
What started as a browser-based prototype became a real cloud-backed application.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Improvements
&lt;/h3&gt;

&lt;p&gt;⋆ Advanced Analytics : streak tracking, consistency heatmaps, weekly comparisons, progress visualizations, and priority insights generated entirely from existing task data.&lt;br&gt;
⋆ Focus Mode : transformed a basic Pomodoro timer into a distraction-free study workspace with fullscreen mode, task panel, and focus sounds.&lt;br&gt;
⋆ AI Study Buddy : upgraded to Groq + Llama 3.3 70B with summaries, question generation, and dedicated learning views.&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.amazonaws.com%2Fuploads%2Farticles%2Fx1e7bt6cb5s6klo85z6e.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.amazonaws.com%2Fuploads%2Farticles%2Fx1e7bt6cb5s6klo85z6e.png" alt="ai study buddy" width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⋆ Profile Management : editable profiles, synced user data, instant dashboard updates, and account statistics.&lt;br&gt;
⋆ Mobile Support : fully responsive experience with mobile-optimized navigation and layouts.&lt;br&gt;
⋆ UI Redesign : complete neo-brutalist design system with light/dark mode, improved accessibility, cleaner navigation, and a more polished dashboard experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Comeback Story
&lt;/h2&gt;

&lt;p&gt;I thought Study Companion was already finished. The tasks worked, the Pomodoro timer worked, and the AI worked.&lt;/p&gt;

&lt;p&gt;• To truly finish it, I rebuilt major parts of the app—adding a proper backend with Supabase, real authentication, analytics, profile management, mobile support, and a complete UI redesign. &lt;/p&gt;

&lt;p&gt;• I also refactored components, improved responsiveness, and polished the overall user experience.&lt;/p&gt;

&lt;p&gt;• The result is a far more complete, scalable, and polished study platform than the version that originally entered the challenge.&lt;/p&gt;

&lt;h3&gt;
  
  
  Technical Highlights
&lt;/h3&gt;

&lt;h2&gt;
  
  
  Frontend
&lt;/h2&gt;

&lt;p&gt;• React&lt;br&gt;
• Context API&lt;br&gt;
• Responsive Design&lt;br&gt;
• Web Audio API&lt;/p&gt;

&lt;h2&gt;
  
  
  Backend
&lt;/h2&gt;

&lt;p&gt;• Supabase Auth&lt;br&gt;
• Supabase Database&lt;br&gt;
• Row Level Security&lt;/p&gt;

&lt;h2&gt;
  
  
  AI
&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.amazonaws.com%2Fuploads%2Farticles%2Fhfd0o170aw9cl8tukamf.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.amazonaws.com%2Fuploads%2Farticles%2Fhfd0o170aw9cl8tukamf.png" alt=" " width="800" height="520"&gt;&lt;/a&gt;&lt;br&gt;
• Groq API&lt;br&gt;
• Llama 3.3 70B Versatile&lt;/p&gt;

&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;p&gt;• Optimistic UI updates&lt;br&gt;
• Automatic data migration&lt;br&gt;
• Cloud persistence&lt;br&gt;
• Analytics engine&lt;br&gt;
• AI-powered learning support&lt;br&gt;
• Streak tracking&lt;br&gt;
• Consistency monitoring&lt;br&gt;
• Mobile and web support&lt;/p&gt;

&lt;h2&gt;
  
  
  My Experience with GitHub Copilot
&lt;/h2&gt;

&lt;p&gt;GitHub Copilot served as a coding companion, turning ideas into implementations more efficiently.&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.amazonaws.com%2Fuploads%2Farticles%2Ftzk7c89ymmlbsno8q4gl.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.amazonaws.com%2Fuploads%2Farticles%2Ftzk7c89ymmlbsno8q4gl.png" alt=" " width="800" height="520"&gt;&lt;/a&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Frv7eu2xak81epbob9gt8.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.amazonaws.com%2Fuploads%2Farticles%2Frv7eu2xak81epbob9gt8.png" alt=" " width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I used Copilot extensively while:&lt;/p&gt;

&lt;h3&gt;
  
  
  Refactoring
&lt;/h3&gt;

&lt;p&gt;• Large portions of the project were rewritten during the migration from localStorage to Supabase.&lt;br&gt;
• Copilot helped accelerate repetitive CRUD patterns and state management logic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Backend Integration
&lt;/h3&gt;

&lt;p&gt;It was particularly useful while working with:&lt;br&gt;
• Authentication flows&lt;br&gt;
• Database queries&lt;br&gt;
• Validation logic&lt;br&gt;
• Error handling&lt;/p&gt;

&lt;h3&gt;
  
  
  UI Development
&lt;/h3&gt;

&lt;p&gt;• Copilot helped speed up:&lt;br&gt;
• Component creation&lt;br&gt;
• Responsive layouts&lt;br&gt;
• Dashboard improvements&lt;br&gt;
• Styling iterations&lt;/p&gt;

&lt;h3&gt;
  
  
  Feature Development
&lt;/h3&gt;

&lt;p&gt;• Analytics, profile management, Focus Mode, and AI-related features were much faster to iterate on thanks to Copilot's suggestions and scaffolding.&lt;/p&gt;

&lt;p&gt;The result wasn't code that Copilot built for me.&lt;/p&gt;

&lt;p&gt;It was code I could build faster because Copilot handled much of the repetitive work, allowing me to focus on architecture and user experience.&lt;/p&gt;

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