<?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: Atharv Mohite</title>
    <description>The latest articles on DEV Community by Atharv Mohite (@atharv96k).</description>
    <link>https://dev.to/atharv96k</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%2F4152548%2F82f84d7e-b370-40c3-aa79-5734e286a5bf.jpg</url>
      <title>DEV Community: Atharv Mohite</title>
      <link>https://dev.to/atharv96k</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/atharv96k"/>
    <language>en</language>
    <item>
      <title>VoiceLedger: Turn a 20-Second Voice Note into a GST Invoice Using Open-Weight Gemma and MongoDB Atlas</title>
      <dc:creator>Atharv Mohite</dc:creator>
      <pubDate>Mon, 19 Oct 2026 03:45:18 +0000</pubDate>
      <link>https://dev.to/atharv96k/voiceledger-turn-a-20-second-voice-note-into-a-gst-invoice-using-open-weight-gemma-and-mongodb-4cfa</link>
      <guid>https://dev.to/atharv96k/voiceledger-turn-a-20-second-voice-note-into-a-gst-invoice-using-open-weight-gemma-and-mongodb-4cfa</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;Independent contractors in India—plumbers, electricians, freelance event photographers, mechanics, and home bakers—spend their entire day doing hands-on work. The last thing they want to do at 9:00 PM is sit at a desk, open a spreadsheet, look up HSN/SAC tax codes, separate material costs from labor charges, calculate CGST/SGST splits, and format a PDF bill. Because of this friction, many either delay billing (hurting their cash flow) or send rough text messages on WhatsApp that look unprofessional and make quarterly GST filing a mess.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;VoiceLedger&lt;/strong&gt; turns that 45-minute evening chore into a 20-second voice note recorded right after finishing a job.&lt;/p&gt;

&lt;p&gt;A contractor simply taps the microphone and speaks naturally in English or Hinglish:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Sharma ji ka 2 copper valve change kiya, 1400 parts ka laga, aur 2 ghante fitting labor at my standard 500 rate. 18% GST laga ke bill bana do."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In under two seconds, VoiceLedger:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Transcribes&lt;/strong&gt; the noisy, code-switched audio using &lt;strong&gt;ElevenLabs Scribe (&lt;code&gt;scribe_v1&lt;/code&gt;)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Matches the client&lt;/strong&gt; (&lt;em&gt;"Sharma ji"&lt;/em&gt; $\rightarrow$ &lt;em&gt;Rajesh Sharma&lt;/em&gt;) against a &lt;strong&gt;MongoDB Atlas&lt;/strong&gt; collection to automatically pull their saved address, phone number, GSTIN, and the contractor's default hourly rate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extracts a strict JSON schema&lt;/strong&gt; using open-weight &lt;strong&gt;Google Gemma 2 (&lt;code&gt;gemma2-9b-it&lt;/code&gt;)&lt;/strong&gt; or &lt;strong&gt;Llama 3.3 (&lt;code&gt;llama-3.3-70b-versatile&lt;/code&gt;)&lt;/strong&gt;, separating physical parts (&lt;code&gt;MATERIALS&lt;/code&gt; - HSN 8481) from service work (&lt;code&gt;LABOR&lt;/code&gt; - SAC 9954).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runs deterministic math guardrails&lt;/strong&gt; in JavaScript to calculate taxable subtotals, CGST/SGST splits, and the grand total—ensuring zero LLM math hallucinations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Renders a live, editable invoice&lt;/strong&gt; across three switchable templates (&lt;em&gt;GST Pro&lt;/em&gt;, &lt;em&gt;Minimal Studio&lt;/em&gt;, &lt;em&gt;Express Receipt&lt;/em&gt;) with a dynamically generated &lt;strong&gt;UPI Payment QR code&lt;/strong&gt; (&lt;code&gt;upi://pay?...&lt;/code&gt;), 1-click A4 PDF export, WhatsApp share link, and spoken voice confirmation via &lt;strong&gt;ElevenLabs Flash TTS&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Who Would Pay For It?
&lt;/h3&gt;

&lt;p&gt;VoiceLedger is designed as a &lt;strong&gt;₹499/month (~$6/month) or $9/month micro-SaaS&lt;/strong&gt; for independent contractors, solo service professionals, and small studios. Getting even a single overdue invoice paid faster—or saving 10 hours of manual bookkeeping a month—pays for the subscription many times over.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Application:&lt;/strong&gt; &lt;a href="https://voiceledgerai.vercel.app" rel="noopener noreferrer"&gt;https://voiceledger.tech&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;(Tip for Judges: If you are testing in a quiet environment without a microphone, you can click any of the **3 Instant Judge Demo Presets&lt;/em&gt;* directly below the voice orb to run the full pipeline immediately.)*&lt;/p&gt;

&lt;h3&gt;
  
  
  Application Screenshots
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhlio5mmxfu7jqfn9ax98.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%2Fhlio5mmxfu7jqfn9ax98.png" alt=" " width="800" height="581"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Vaani Studio — Voice-to-Invoice Command Center
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Interactive Liquid-Gradient Voice Orb:&lt;/strong&gt; Radial tick-ring audio visualizer with 1-tap &lt;code&gt;MediaRecorder&lt;/code&gt; capture (&lt;code&gt;Ready · Step 1 of 3&lt;/code&gt;), built to handle natural English and Hinglish speech.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open-Weight Model Switcher &amp;amp; Observability Bar:&lt;/strong&gt; Top navigation bar providing instant model selection (&lt;code&gt;OpenAI GPT-OSS 120B&lt;/code&gt;, &lt;code&gt;Gemma 2&lt;/code&gt;, &lt;code&gt;Llama 3.3&lt;/code&gt;), a live &lt;strong&gt;MongoDB Atlas Tax Ledger&lt;/strong&gt; counter (&lt;code&gt;12&lt;/code&gt; persisted bills), and real-time &lt;strong&gt;Sentry Active&lt;/strong&gt; status.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1-Click Judge Demo Presets:&lt;/strong&gt; Pre-configured contractor scenarios (&lt;em&gt;Plumber &amp;amp; Electrical&lt;/em&gt;, &lt;em&gt;Wedding Photographer&lt;/em&gt;, and &lt;em&gt;Artisanal Home Baker&lt;/em&gt;) that trigger the full extraction pipeline without requiring microphone access.&lt;/li&gt;
&lt;/ul&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%2Fe7chai8inie1y61khjq5.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%2Fe7chai8inie1y61khjq5.png" alt=" " width="799" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Split-Screen AI Co-Pilot &amp;amp; Live Editable GST Invoice Workspace
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ElevenLabs Scribe &amp;amp; Voice Read-Back (Left Panel):&lt;/strong&gt; Displays the verbatim transcript (&lt;em&gt;"Create an order bill for Neha Kulkarni: 2 kg Belgian chocolate truffle cake at 1200 per kg, and 12 assorted artisanal cupcakes at 90 each. Apply 5% GST."&lt;/em&gt;) alongside an interactive waveform audio player for hands-free confirmation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Atlas Client Match &amp;amp; Tax Controls (Middle-Left Panel):&lt;/strong&gt; Automatically populates client details (&lt;code&gt;Neha Kulkarni&lt;/code&gt;), configures the applicable tax slab (&lt;code&gt;5% GST&lt;/code&gt;), and provides 1-click persistence to &lt;strong&gt;MongoDB Atlas&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live Agent Trace &amp;amp; Unit Economics Card (Bottom-Left Panel):&lt;/strong&gt; Surfaces the active Sentry Trace ID (&lt;code&gt;#8188b901994e8bf7&lt;/code&gt;), end-to-end execution latency (&lt;code&gt;1017ms&lt;/code&gt;), and a live cost comparison showing &lt;strong&gt;$0.00015&lt;/strong&gt; on open-weight inference versus &lt;strong&gt;$0.03400&lt;/strong&gt; on closed frontier APIs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  * &lt;strong&gt;Multi-Template Printable Canvas (Right Panel):&lt;/strong&gt; Features a 4-way template switcher (&lt;code&gt;GST Pro&lt;/code&gt;, &lt;code&gt;Minimal&lt;/code&gt;, &lt;code&gt;Express&lt;/code&gt;, &lt;code&gt;Artisan&lt;/code&gt;), inline-editable line items (&lt;code&gt;₹2,400&lt;/code&gt; + &lt;code&gt;₹1,080&lt;/code&gt; = &lt;code&gt;₹3,480&lt;/code&gt; subtotal + &lt;code&gt;₹174&lt;/code&gt; GST = &lt;strong&gt;&lt;code&gt;₹3,654&lt;/code&gt; Grand Total&lt;/strong&gt;), a scannable QR code box, &lt;strong&gt;Save PDF&lt;/strong&gt;, and &lt;strong&gt;WhatsApp&lt;/strong&gt; instant sharing.
&lt;/h2&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/atharv96k" rel="noopener noreferrer"&gt;
        atharv96k
      &lt;/a&gt; / &lt;a href="https://github.com/atharv96k/VoiceLedger" rel="noopener noreferrer"&gt;
        VoiceLedger
      &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&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/atharv96k/VoiceLedger/client/public/Logo.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%2Fatharv96k%2FVoiceLedger%2FHEAD%2Fclient%2Fpublic%2FLogo.png" alt="ColdOpen" width="420"&gt;&lt;/a&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Open-Source AI Voice-to-Invoice &amp;amp; GST Tax Engine for Independent Contractors&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/5ba01dda2d0a9c1d047ab7be74ff382cc11218605aea91b5ca1e6c8a6a78adf3/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4861636b746f626572666573742d323032362d6666366233353f7374796c653d666c61742d737175617265"&gt;&lt;img src="https://camo.githubusercontent.com/5ba01dda2d0a9c1d047ab7be74ff382cc11218605aea91b5ca1e6c8a6a78adf3/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4861636b746f626572666573742d323032362d6666366233353f7374796c653d666c61742d737175617265" alt="Hacktoberfest 2026"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/3ac3319c0f3ec107981070a2f7ebf6e6ab608cba43e9cd20bd2aa7a9dbd67c7a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f41492d47656d6d61253230322532302537432532304c6c616d61253230332e332d3432383546343f7374796c653d666c61742d737175617265"&gt;&lt;img src="https://camo.githubusercontent.com/3ac3319c0f3ec107981070a2f7ebf6e6ab608cba43e9cd20bd2aa7a9dbd67c7a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f41492d47656d6d61253230322532302537432532304c6c616d61253230332e332d3432383546343f7374796c653d666c61742d737175617265" alt="Gemma 2 &amp;amp; Llama 3.3"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/8ed69929bb6745f3adabf64cd2cbf608ef0404e5cf6bcf3e8907df90637e3969/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5370656563682d456c6576656e4c6162732532305363726962652d6631653035613f7374796c653d666c61742d737175617265"&gt;&lt;img src="https://camo.githubusercontent.com/8ed69929bb6745f3adabf64cd2cbf608ef0404e5cf6bcf3e8907df90637e3969/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5370656563682d456c6576656e4c6162732532305363726962652d6631653035613f7374796c653d666c61742d737175617265" alt="ElevenLabs Scribe"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/2c34c07a2f6c84d4ff1528dcf7a05dd28f81af007fb1a504433d32a14d29e55f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f52656163742d566974652532302537432532305461696c77696e6425323076342d3631646166623f7374796c653d666c61742d737175617265"&gt;&lt;img src="https://camo.githubusercontent.com/2c34c07a2f6c84d4ff1528dcf7a05dd28f81af007fb1a504433d32a14d29e55f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f52656163742d566974652532302537432532305461696c77696e6425323076342d3631646166623f7374796c653d666c61742d737175617265" alt="React Vite"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/2e5d8d41a1381dbd6690a81a44bdc56d2fd27c257a0e8efd58315a27f4ca3be7/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4e6f64652d457870726573732532302537432532304d6f6e676f44422d3333393933333f7374796c653d666c61742d737175617265"&gt;&lt;img src="https://camo.githubusercontent.com/2e5d8d41a1381dbd6690a81a44bdc56d2fd27c257a0e8efd58315a27f4ca3be7/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4e6f64652d457870726573732532302537432532304d6f6e676f44422d3333393933333f7374796c653d666c61742d737175617265" alt="Node Express MongoDB"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/f45209b3407f29474f1cefbcc2e74eb64e25de78203b76a95557ec973c31e4c0/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f54726163696e672d53656e7472792d3336326435393f7374796c653d666c61742d737175617265"&gt;&lt;img src="https://camo.githubusercontent.com/f45209b3407f29474f1cefbcc2e74eb64e25de78203b76a95557ec973c31e4c0/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f54726163696e672d53656e7472792d3336326435393f7374796c653d666c61742d737175617265" alt="Sentry Agent Tracing"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/ac049ef4e7a0b7196b09add6ac2d4f180e544c0ac779c2b2ac2fd2723a209579/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75653f7374796c653d666c61742d737175617265"&gt;&lt;img src="https://camo.githubusercontent.com/ac049ef4e7a0b7196b09add6ac2d4f180e544c0ac779c2b2ac2fd2723a209579/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75653f7374796c653d666c61742d737175617265" alt="License"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;VoiceLedger converts unstructured English and Hinglish voice notes into HSN/SAC-compliant GST invoices, automated tax ledgers, and scannable UPI QR payments in under two seconds.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/atharv96k/VoiceLedger#overview" rel="noopener noreferrer"&gt;Overview&lt;/a&gt; • &lt;a href="https://github.com/atharv96k/VoiceLedger#system-architecture" rel="noopener noreferrer"&gt;Architecture&lt;/a&gt; • &lt;a href="https://github.com/atharv96k/VoiceLedger#api-reference" rel="noopener noreferrer"&gt;API Reference&lt;/a&gt; • &lt;a href="https://github.com/atharv96k/VoiceLedger#local-development-setup" rel="noopener noreferrer"&gt;Setup&lt;/a&gt;&lt;/p&gt;


&lt;/div&gt;
&lt;br&gt;


&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Overview&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Independent contractors plumbers, electricians, event photographers, mechanics, and home bakers frequently lose billable hours to manual evening paperwork, itemized quoting, and quarterly tax reconciliation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;VoiceLedger&lt;/strong&gt; eliminates manual data entry through a 5-stage open-weight AI agent pipeline. A contractor records a quick voice memo after finishing a job (or selects a pre-configured workflow preset). The backend transcribes the audio via &lt;strong&gt;ElevenLabs Scribe&lt;/strong&gt;, retrieves repeat client billing records from &lt;strong&gt;MongoDB Atlas&lt;/strong&gt;, extracts a strict JSON schema using open-weight &lt;strong&gt;Google Gemma 2 (&lt;code&gt;gemma2-9b-it&lt;/code&gt;)&lt;/strong&gt; or &lt;strong&gt;Meta Llama 3.3 (&lt;code&gt;llama-3.3-70b-versatile&lt;/code&gt;)&lt;/strong&gt;, verifies line-item arithmetic deterministically, and returns an editable multi-template invoice with a live UPI payment…&lt;/p&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/atharv96k/VoiceLedger" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;





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

&lt;p&gt;VoiceLedger is structured as a decoupled full-stack monorepo (&lt;code&gt;/client&lt;/code&gt; and &lt;code&gt;/server&lt;/code&gt;) built around a 5-stage agentic pipeline[cite: 1, 20].&lt;/p&gt;

&lt;h3&gt;
  
  
  Architecture &amp;amp; Request Pipeline
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[React + Vite Client: MediaRecorder (audio/webm)]
       │
       ▼ POST /api/voice-invoice (multipart/form-data)
[Node.js + Express Backend wrapped in Sentry Root Transaction]
       │
       ├─► Span 1 (ai.stt): ElevenLabs Scribe v1 converts audio buffer to raw text
       ├─► Span 2 (db.query): Mongoose queries MongoDB Atlas for client aliases &amp;amp; rates
       ├─► Span 3 (ai.chat_completions): Open-weight Gemma-2-9b-it / Llama-3.3-70b
       │          extracts lineItems[], category (MATERIALS|LABOR), and HSN/SAC codes
       ├─► Guardrail: Deterministic JS engine computes Subtotal, CGST, SGST &amp;amp; UPI URI
       ├─► Span 4 (ai.tts): ElevenLabs Flash v2.5 synthesizes voice confirmation MP3
       └─► Persistence: Stores finalized document in MongoDB Atlas 'invoices' collection

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Technical Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Open-Weight AI Core:&lt;/strong&gt; &lt;code&gt;gemma2-9b-it&lt;/code&gt; and &lt;code&gt;llama-3.3-70b-versatile&lt;/code&gt; served in strict JSON mode (&lt;code&gt;response_format: { type: "json_object" }&lt;/code&gt;) with low temperature (&lt;code&gt;0.1&lt;/code&gt;) for deterministic schema extraction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speech Processing:&lt;/strong&gt; &lt;strong&gt;ElevenLabs&lt;/strong&gt; &lt;code&gt;scribe_v1&lt;/code&gt; handles multi-accent English/Hinglish speech-to-text, while &lt;code&gt;eleven_flash_v2_5&lt;/code&gt; generates low-latency spoken confirmations so contractors can verify totals hands-free.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data Layer &amp;amp; Client RAG:&lt;/strong&gt; &lt;strong&gt;MongoDB Atlas&lt;/strong&gt; stores two primary collections (&lt;code&gt;Client&lt;/code&gt; and &lt;code&gt;Invoice&lt;/code&gt;). When a transcript arrives, the backend scans the &lt;code&gt;Client&lt;/code&gt; collection for matching names or aliases (e.g., &lt;code&gt;"sharma ji"&lt;/code&gt;), injecting the client's saved GSTIN, billing address, and default hourly rate directly into Gemma's system prompt.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Frontend Experience:&lt;/strong&gt; Built with &lt;strong&gt;React 19&lt;/strong&gt;, &lt;strong&gt;Vite&lt;/strong&gt;, and &lt;strong&gt;Tailwind CSS v4&lt;/strong&gt; (&lt;code&gt;@tailwindcss/vite&lt;/code&gt;). It features inline table editing, real-time SVG QR generation via &lt;code&gt;qrcode.react&lt;/code&gt;, client-side PDF compilation via &lt;code&gt;html2pdf.js&lt;/code&gt;, and a mouse-responsive spotlight ledger drawer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Agent Observability:&lt;/strong&gt; Instrumented with &lt;strong&gt;&lt;code&gt;@sentry/node&lt;/code&gt;&lt;/strong&gt; (&lt;code&gt;instrument.js&lt;/code&gt;) using custom spans to measure latency and token consumption at every step of the pipeline.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;When building a vertical SaaS for price-sensitive independent workers in emerging markets, &lt;strong&gt;unit economics and schema control determine whether the business can survive.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Viable Unit Economics for a $9/Month Side Hustle
&lt;/h3&gt;

&lt;p&gt;If a busy contractor generates 150 invoices a month—including client context lookups, multi-item tax classification, and retries—running that pipeline on closed frontier audio/reasoning APIs costs roughly &lt;strong&gt;$0.034 per run&lt;/strong&gt; (~$5.10/month in raw API costs per user), wiping out margins once payment gateway fees and hosting are factored in.&lt;/p&gt;

&lt;p&gt;By using open-weight &lt;strong&gt;Gemma 2 (&lt;code&gt;gemma2-9b-it&lt;/code&gt;)&lt;/strong&gt; for structured JSON extraction, each inference call consumes ~480 tokens at an effective cost of &lt;strong&gt;$0.00010 per invoice&lt;/strong&gt;. Even at 200 invoices per month, the LLM cost per user is under &lt;strong&gt;$0.02/month&lt;/strong&gt;, sustaining a &lt;strong&gt;98.8% gross margin&lt;/strong&gt;.&lt;/p&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;Open-Weight Stack (&lt;code&gt;gemma2-9b-it&lt;/code&gt;)&lt;/th&gt;
&lt;th&gt;Closed Frontier API Stack&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Avg. Extraction Latency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~390 – 420 ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~1,400 – 2,200 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost per Invoice Run&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.00011&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~$0.03400&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;200 Invoices / Mo Cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.022&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~$6.80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Model Portability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Swap between Gemma &amp;amp; Llama in 1 click&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vendor lock-in&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  2. Zero Vendor Lock-In &amp;amp; Model Swapping
&lt;/h3&gt;

&lt;p&gt;In the top navigation bar of VoiceLedger, users can switch the underlying extraction engine between &lt;code&gt;google/gemma-2-9b-it&lt;/code&gt;, &lt;code&gt;google/gemma-3-27b-it&lt;/code&gt;, and &lt;code&gt;meta/llama-3.3-70b&lt;/code&gt;. Because our prompt architecture relies on standard open-weight JSON schemas rather than proprietary tool-calling wrappers, we can route requests to whichever open model or inference provider offers the best latency and price-to-performance ratio.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Hybrid AI + Deterministic Code
&lt;/h3&gt;

&lt;p&gt;General-purpose closed chatbots try to do everything inside the LLM—including arithmetic, which frequently leads to rounding errors on tax percentages. Our open-weight pipeline restricts the model strictly to &lt;strong&gt;semantic entity extraction&lt;/strong&gt; (identifying item descriptions, quantities, unit rates, and HSN/SAC categories) while delegating all tax math and UPI URI formatting to deterministic JavaScript.&lt;/p&gt;




&lt;h2&gt;
  
  
  My First User
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;[Optional: Customize this section with your real test experience before publishing, or keep this structure if you tested it with a local contractor/friend!]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;To test whether VoiceLedger actually works outside a developer environment, I put the app in front of &lt;code&gt;[Insert Name / Role, e.g., a local electrical contractor / freelance photographer friend in Kolhapur]&lt;/code&gt; right after they wrapped up a job.&lt;/p&gt;

&lt;p&gt;Instead of typing out a bill at night, they recorded a 15-second voice note in Hinglish listing the parts replaced and their labor charge.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What worked immediately:&lt;/strong&gt; Seeing their spoken Hinglish turn into a clean English GST table with separate Materials and Labor columns—and a working UPI QR code that they could immediately forward on WhatsApp—got an instant reaction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feedback &amp;amp; what they asked for next:&lt;/strong&gt; They mentioned they would gladly pay ₹300–₹500/month if the app could also let them snap a photo of a hardware store purchase bill to automatically subtract input GST credit from their monthly tax ledger. That is next on the roadmap.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;I am submitting &lt;strong&gt;VoiceLedger&lt;/strong&gt; for the following partner prize categories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Best Use of Gemma:&lt;/strong&gt; Uses Google's open-weight &lt;code&gt;gemma2-9b-it&lt;/code&gt; / &lt;code&gt;gemma-3-27b-it&lt;/code&gt; as the core structured extraction engine to parse noisy transcripts into line items, classify &lt;code&gt;MATERIALS&lt;/code&gt; vs. &lt;code&gt;LABOR&lt;/code&gt;, and assign Indian HSN/SAC tax codes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Best Use of ElevenLabs:&lt;/strong&gt; Uses &lt;strong&gt;ElevenLabs Scribe (&lt;code&gt;scribe_v1&lt;/code&gt;)&lt;/strong&gt; for accurate Speech-to-Text transcription across English and Hinglish accents, and &lt;strong&gt;ElevenLabs Flash TTS (&lt;code&gt;eleven_flash_v2_5&lt;/code&gt;)&lt;/strong&gt; for hands-free spoken invoice confirmations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Best Use of MongoDB Atlas:&lt;/strong&gt; Uses &lt;strong&gt;MongoDB Atlas&lt;/strong&gt; (&lt;code&gt;Client&lt;/code&gt; and &lt;code&gt;Invoice&lt;/code&gt; collections) both for pre-inference RAG context lookup (matching repeat clients and default rates) and for persisting the contractor's tax ledger.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Best Use of Sentry Agent Tracing:&lt;/strong&gt; Wraps the entire Express backend pipeline in a &lt;code&gt;@sentry/node&lt;/code&gt; root transaction (&lt;code&gt;voice_to_invoice_agent&lt;/code&gt;) with child spans tracking STT, MongoDB queries, Gemma token usage/latency, and TTS synthesis.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Best Use of Render:&lt;/strong&gt; Deployed the full-stack application on Render.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Best Use of a .tech Domain:&lt;/strong&gt; Hosted live on a custom &lt;code&gt;.tech&lt;/code&gt; domain.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Atharv Mohite</dc:creator>
      <pubDate>Mon, 12 Oct 2026 08:48:58 +0000</pubDate>
      <link>https://dev.to/atharv96k/-3fi0</link>
      <guid>https://dev.to/atharv96k/-3fi0</guid>
      <description>&lt;div class="crayons-card my-2 p-4"&gt;
  &lt;p class="color-base-60"&gt;Post not found or has been removed.&lt;/p&gt;
&lt;/div&gt;


</description>
      <category>agents</category>
      <category>ai</category>
      <category>llm</category>
      <category>travel</category>
    </item>
    <item>
      <title>Cold emails in her voice: I made an open-weight AI show its work, phrase by phrase</title>
      <dc:creator>Atharv Mohite</dc:creator>
      <pubDate>Sat, 03 Oct 2026 09:53:50 +0000</pubDate>
      <link>https://dev.to/atharv96k/coldopen-an-open-weight-model-that-learns-how-you-write-then-drafts-the-email-youd-actually-send-1ogg</link>
      <guid>https://dev.to/atharv96k/coldopen-an-open-weight-model-that-learns-how-you-write-then-drafts-the-email-youd-actually-send-1ogg</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;ColdOpen&lt;/strong&gt; for my sister, Aishwarya. She's a software engineer with 5+ years of experience, and she's good at her job. She still puts off one task for weeks: writing the first message to someone she doesn't know. That could be a referral request, a note to a recruiter, or a question to someone who changed roles the way she wants to.&lt;/p&gt;

&lt;p&gt;She told me "I rewrite the first line ten times and then close the tab". The AI tools she'd tried made it worse. The drafts were polished, but they started with "I hope this email finds you well" and sounded like nobody she knows. If it doesn't sound like her, she won't send it.&lt;/p&gt;

&lt;p&gt;ColdOpen starts from her own writing instead of a template:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;She pastes 2-3 messages she has actually written.&lt;/li&gt;
&lt;li&gt;She says who she's writing to and what she wants (15 goals: referral, recruiter intro, alumni intro, resume feedback, mock interview, mentoring, follow-up, thank-you, reconnect, reference, switching roles, and more).&lt;/li&gt;
&lt;li&gt;ColdOpen writes a short &lt;strong&gt;"voice learned" note&lt;/strong&gt; (greeting, sign-off, sentence length, habits) that she can check. Then it writes &lt;strong&gt;three emails and three subject lines&lt;/strong&gt;: Direct &amp;amp; Concise, Warm &amp;amp; Respectful, and Curiosity-First.&lt;/li&gt;
&lt;li&gt;One checkbox shows the same request written with &lt;strong&gt;no voice&lt;/strong&gt;, side by side, so she can see what the voice step changed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The highlights are the part I'm proudest of. In the side-by-side view, &lt;span&gt;green&lt;/span&gt; marks wording that carries her voice, &lt;span&gt;pink&lt;/span&gt; marks stock template phrases in the generic draft, and &lt;span&gt;amber&lt;/span&gt; marks &lt;code&gt;[placeholders]&lt;/code&gt; she has to fill in before sending.&lt;/p&gt;

&lt;p&gt;It also won't invent facts. If she doesn't tell it about a shared project or a talk, it writes &lt;code&gt;[bracketed placeholder]&lt;/code&gt; and doesn't make something up.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://coldopen-fe.onrender.com/" rel="noopener noreferrer"&gt;https://coldopen-fe.onrender.com/&lt;/a&gt; (hosted on Render's free tier, and an UptimeRobot monitor pings the &lt;code&gt;/api/health&lt;/code&gt; endpoint every 5-10 minutes so the service stays awake)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Screenshot:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;1. Direct &amp;amp; Concise: the same reference request, in her voice and without it&lt;/strong&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkjmwrtik32bji1c5x49u.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%2Fkjmwrtik32bji1c5x49u.png" alt="ColdOpen Direct &amp;amp; Concise tone: a reference request to a former manager, written in the user's voice (top) and as a generic draft (bottom), with highlights" width="799" height="467"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Top: "In your voice". Bottom: "Generic (no voice)". Green marks her phrasing, pink marks stock template phrases, and amber marks &lt;code&gt;[Your name]&lt;/code&gt;, which she has to fill in.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Warm &amp;amp; Respectful: the same request, a softer tone&lt;/strong&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4x26kybunc9yk0hfnfbm.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%2F4x26kybunc9yk0hfnfbm.png" alt="ColdOpen Warm &amp;amp; Respectful tone: voice draft and generic draft side by side" width="800" height="466"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Screen recording:&lt;/strong&gt; &lt;a href="https://drive.google.com/file/d/154JrBEXIZEkQHYuivElIQ-7X-v0bPnop/view?usp=drive_link" rel="noopener noreferrer"&gt;Watch the 1-minute walkthrough on Google Drive&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/atharv96k" rel="noopener noreferrer"&gt;
        atharv96k
      &lt;/a&gt; / &lt;a href="https://github.com/atharv96k/ColdOpen" rel="noopener noreferrer"&gt;
        ColdOpen
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Cold emails in your own voice. Paste your past messages, get 3 drafts that sound like you.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/atharv96k/ColdOpen/docs/Logo2.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%2Fatharv96k%2FColdOpen%2FHEAD%2Fdocs%2FLogo2.png" alt="ColdOpen" width="420"&gt;&lt;/a&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Cold emails that sound like you wrote them&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;Paste a few of your own messages. ColdOpen learns how you write and drafts three cold emails and three subject lines in your voice, then shows you what changed next to a generic AI draft.&lt;/p&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/5ba01dda2d0a9c1d047ab7be74ff382cc11218605aea91b5ca1e6c8a6a78adf3/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4861636b746f626572666573742d323032362d6666366233353f7374796c653d666c61742d737175617265"&gt;&lt;img src="https://camo.githubusercontent.com/5ba01dda2d0a9c1d047ab7be74ff382cc11218605aea91b5ca1e6c8a6a78adf3/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4861636b746f626572666573742d323032362d6666366233353f7374796c653d666c61742d737175617265" alt="Hacktoberfest 2026"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/64a44b8deb11fddfbd6bcc09beb9823a7d197d9c2759b85cf68f10923673274c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4445562532305765656b656e642532304368616c6c656e67652d4275696c64253230666f7225323061253230467269656e642d3666343263313f7374796c653d666c61742d737175617265"&gt;&lt;img src="https://camo.githubusercontent.com/64a44b8deb11fddfbd6bcc09beb9823a7d197d9c2759b85cf68f10923673274c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4445562532305765656b656e642532304368616c6c656e67652d4275696c64253230666f7225323061253230467269656e642d3666343263313f7374796c653d666c61742d737175617265" alt="Weekend Challenge"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/7b5a3696d47b7d135bb2e78cf600b603f740ec55eec9641c71d151367e0486b6/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f41492d6f70656e2d2d7765696768742532306d6f64656c732d3265613434663f7374796c653d666c61742d737175617265"&gt;&lt;img src="https://camo.githubusercontent.com/7b5a3696d47b7d135bb2e78cf600b603f740ec55eec9641c71d151367e0486b6/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f41492d6f70656e2d2d7765696768742532306d6f64656c732d3265613434663f7374796c653d666c61742d737175617265" alt="Open-weight models"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/aa2656c56d263e83dc1eaf5f4b34da640de82afda99cceae130cae0397e2a6ad/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f52656163742d566974652d3631646166623f7374796c653d666c61742d737175617265"&gt;&lt;img src="https://camo.githubusercontent.com/aa2656c56d263e83dc1eaf5f4b34da640de82afda99cceae130cae0397e2a6ad/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f52656163742d566974652d3631646166623f7374796c653d666c61742d737175617265" alt="React"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/5405c65912f08b8c4813094ae10af3ffe5a505ea1bd93fd4b8e3332958590b19/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4e6f64652d457870726573732d3333393933333f7374796c653d666c61742d737175617265"&gt;&lt;img src="https://camo.githubusercontent.com/5405c65912f08b8c4813094ae10af3ffe5a505ea1bd93fd4b8e3332958590b19/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4e6f64652d457870726573732d3333393933333f7374796c653d666c61742d737175617265" alt="Node"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/ac049ef4e7a0b7196b09add6ac2d4f180e544c0ac779c2b2ac2fd2723a209579/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75653f7374796c653d666c61742d737175617265"&gt;&lt;img src="https://camo.githubusercontent.com/ac049ef4e7a0b7196b09add6ac2d4f180e544c0ac779c2b2ac2fd2723a209579/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75653f7374796c653d666c61742d737175617265" alt="License"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://coldopen-fe.onrender.com/" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;Live demo&lt;/strong&gt;&lt;/a&gt; · &lt;a href="https://dev.to/your-post" rel="nofollow"&gt;&lt;strong&gt;Write-up on DEV&lt;/strong&gt;&lt;/a&gt; · &lt;a href="https://github.com/atharv96k/ColdOpen/../../issues" rel="noopener noreferrer"&gt;&lt;strong&gt;Report an issue&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/atharv96k/ColdOpen/docs/sc.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%2Fatharv96k%2FColdOpen%2FHEAD%2Fdocs%2Fsc.png" alt="ColdOpen side-by-side comparison"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;/div&gt;
&lt;br&gt;


&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Motivation&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;ColdOpen was built for a software engineer with more than five years of experience. Reaching out to someone you do not know is difficult; the first message is often the one that never gets sent. Generic AI email tools produce polished drafts that do not sound like the sender, so those drafts go unsent as well.&lt;/p&gt;

&lt;p&gt;ColdOpen begins with the user’s own writing rather than a template.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;&lt;div class="table-wrapper-paragraph"&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;table&gt;

&lt;thead&gt;

&lt;tr&gt;

&lt;th&gt;Feature&lt;/th&gt;

&lt;th&gt;Description&lt;/th&gt;

&lt;/tr&gt;

&lt;/thead&gt;

&lt;tbody&gt;

&lt;tr&gt;

&lt;td&gt;&lt;strong&gt;Voice learning&lt;/strong&gt;&lt;/td&gt;

&lt;td&gt;Analyzes 2–3 of your own messages and produces a short “voice learned” note (greeting, sign-off, sentence length, habits) that you can review.&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;&lt;strong&gt;Three drafts,&lt;/strong&gt;&lt;/td&gt;

&lt;/tr&gt;

&lt;/tbody&gt;

&lt;/table&gt;&lt;/div&gt;…&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/atharv96k/ColdOpen" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;React + Vite frontend, Node/Express backend, MIT licensed.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;The model.&lt;/strong&gt; ColdOpen calls open-weight models (default &lt;code&gt;openai/gpt-oss-120b&lt;/code&gt;, with &lt;code&gt;qwen/qwen3.8-27b&lt;/code&gt; and &lt;code&gt;openai/gpt-oss-20b&lt;/code&gt; as fallbacks) through Groq's hosted API. The list is one environment variable (&lt;code&gt;GROQ_MODELS&lt;/code&gt;). If a model is rate limited or unavailable, the server moves to the next one. I started out thinking of running the model locally, but I wanted Aishwarya to be able to open a link and use it without installing anything, so I switched to a hosted open-weight model and deployed the app. Because the model is open-weight and the list is a single environment variable, that switch was a config change, not a rewrite, and the same prompts can point back at a local runtime later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt design.&lt;/strong&gt; The model describes how she writes &lt;em&gt;before&lt;/em&gt; it drafts anything. That voice-notes step is shown in the UI so she can tell whether it understood her. Her text goes into the prompt fenced as data, not as instructions. The fact rules are strict: the model may only use what she typed into &lt;em&gt;About you&lt;/em&gt;, &lt;em&gt;Your question&lt;/em&gt; and &lt;em&gt;Anything specific&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Most of the work was guardrails around a small model.&lt;/strong&gt; The prompt alone wasn't enough, so the server checks the output:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It validates the JSON.&lt;/li&gt;
&lt;li&gt;It rejects stock clichés like "I hope you're doing well" in the voice column and retries once.&lt;/li&gt;
&lt;li&gt;It repairs one-line emails into a proper email layout (greeting, short paragraphs, sign-off).&lt;/li&gt;
&lt;li&gt;It checks that every highlighted phrase really appears in the email. If the model's picks fail the check, it falls back to simple methods: overlap with her samples for the voice column and a hand-written stock-phrase list for the generic column.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Looking back, getting highlights to work was harder than getting emails to work. Early on the model returned empty highlight arrays, and exact-match checks failed on curly quotes and dashes. I fixed that by normalizing punctuation before matching.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Other things.&lt;/strong&gt; The API is rate limited to 10 requests a minute per IP, and inputs have length caps. In development there's a test bar with 15 sample cases, one per goal. I wrote them from an experienced engineer's point of view, because that's who the app is for. The whole app deploys as a single Render web service, since Express serves the built React client.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Moving from local to hosted was a config change.&lt;/strong&gt; I needed a deployed link she could open, so I moved from a local setup to a hosted open-weight model by changing one environment variable. A closed API would have tied the prompts and guardrails to one provider's models.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I could see where the model stopped and my code started.&lt;/strong&gt; With open weights and a swappable model list, I could tell which problems were the model's (clichés, invented details, one-line emails) and which were mine to guard against. Most of this project is that second part.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It cost nothing to build.&lt;/strong&gt; A free-tier key was enough for a weekend of testing, and I tested a lot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An honest limit:&lt;/strong&gt; ColdOpen calls a &lt;em&gt;hosted&lt;/em&gt; open-weight model, so the writing samples are sent to that provider to generate drafts. This app doesn't store them, but they do leave the machine. Writing samples can be personal, and the open-weight advantage I'd most like to use is running locally so they never leave. My machine isn't configured well enough to run an LLM locally, so this version uses a hosted open-weight model instead, and I'd rather say that than imply privacy it doesn't have. Because the model is just a setting, the same app can point at a local runtime on a machine that can handle one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where a closed model might have done better:&lt;/strong&gt; The models kept falling back on "I hope you're doing well" even when told not to, and sometimes returned the whole email as one line. I added a banned-phrase check with a retry and a layout repair step. A frontier model might have followed those instructions the first time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hand-over
&lt;/h2&gt;

&lt;p&gt;She didn't care much about the three tones. What she reacted to was the generic version next to her own. She pointed at the pink-highlighted "I hope this email finds you well" and laughed: "That's exactly what I hate." Then she pointed at the green phrases in her version and said, "That's actually how I'd say it."&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Best Use of Render:&lt;/strong&gt; the app is deployed as a single Render web service, with Express serving the built React client.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Language models sometimes add small details that weren't in the input. The fact rules and filters reduce this but don't remove it. Read every draft before you send it.&lt;/li&gt;
&lt;li&gt;Voice match depends on how much natural writing you paste in.&lt;/li&gt;
&lt;li&gt;Highlights are a guide, not an AI-text detector.&lt;/li&gt;
&lt;li&gt;With the generic comparison on, each request makes two model calls, so free-tier rate limits apply.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Gemma as an additional model, with a side-by-side voice comparison between models&lt;/li&gt;
&lt;li&gt;Remember writing samples in the browser&lt;/li&gt;
&lt;li&gt;"Make it shorter / more casual" per email&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Tutorial Hell Is Comfortable. Here's How I Got Out.</title>
      <dc:creator>Atharv Mohite</dc:creator>
      <pubDate>Wed, 30 Sep 2026 15:49:02 +0000</pubDate>
      <link>https://dev.to/atharv96k/tutorial-hell-is-comfortable-heres-how-i-got-out-1e49</link>
      <guid>https://dev.to/atharv96k/tutorial-hell-is-comfortable-heres-how-i-got-out-1e49</guid>
      <description>&lt;p&gt;Tutorial hell doesn't feel like hell. That's the problem.&lt;/p&gt;

&lt;p&gt;It feels like progress. You watch a video, you type along, the code runs, and you think "I get it." Then you open a blank file and nothing comes.&lt;/p&gt;

&lt;p&gt;I lived in that loop for a long time. This is how I got out.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to know you're in it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You finish a course and immediately start another one&lt;/li&gt;
&lt;li&gt;You can follow along, but a blank editor freezes you&lt;/li&gt;
&lt;li&gt;You say "I'll start my own project once I learn a bit more"&lt;/li&gt;
&lt;li&gt;Your projects are clones of what the instructor built&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If that's you, you're not slow. You're practicing &lt;strong&gt;watching&lt;/strong&gt;, not &lt;strong&gt;building&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it happens
&lt;/h2&gt;

&lt;p&gt;In a tutorial, someone else makes every decision: what to build, what to name things, what comes next. You only do the typing.&lt;/p&gt;

&lt;p&gt;Real work is the opposite. Nobody tells you the next step. You have to decide, get stuck, search, and fix it. That struggle is where learning actually happens, and tutorials remove it.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  1. One tutorial, then a rule
&lt;/h3&gt;

&lt;p&gt;Finish the tutorial, then immediately build something &lt;em&gt;different&lt;/em&gt; with the same skills. No starting a new course until that's done.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Build small and ugly
&lt;/h3&gt;

&lt;p&gt;My first attempts were tiny: a CRUD API, a simple REST endpoint, a basic login. They were messy, and that was fine. A finished ugly project teaches more than a perfect abandoned one.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Get stuck on purpose, for 20 minutes
&lt;/h3&gt;

&lt;p&gt;When I hit an error, I gave myself 20 minutes before searching or asking. Reading the stack trace, guessing, and trying things is the skill you're actually training.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Ship it and write about it
&lt;/h3&gt;

&lt;p&gt;Push it to GitHub with a README. Explaining what you built in plain words shows you what you really understood and what you copied.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 80/20 rule I use now
&lt;/h2&gt;

&lt;p&gt;Spend about &lt;strong&gt;20% of your time learning&lt;/strong&gt; and &lt;strong&gt;80% building&lt;/strong&gt;. Most people do the opposite.&lt;/p&gt;

&lt;h2&gt;
  
  
  What real projects taught me that tutorials never did
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Error messages are not the enemy, they are the map&lt;/li&gt;
&lt;li&gt;Reading other people's code (open source is great for this) is a skill on its own&lt;/li&gt;
&lt;li&gt;"It works" and "it's structured well" are two different goals&lt;/li&gt;
&lt;li&gt;Nobody remembers syntax perfectly. Everyone searches. The real skill is knowing what to search for&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  If you're stuck right now
&lt;/h2&gt;

&lt;p&gt;Do this today:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Close the tutorial.&lt;/li&gt;
&lt;li&gt;Pick one small idea (a to-do API, an expense tracker, a URL shortener).&lt;/li&gt;
&lt;li&gt;Write down 3 features it needs.&lt;/li&gt;
&lt;li&gt;Build the first one, badly.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it. Momentum beats planning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your turn
&lt;/h2&gt;

&lt;p&gt;How long were you stuck in tutorial hell, and what finally got you out? Tell me in the comments, I'd love to hear it.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>api</category>
      <category>java</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
