<?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: Jyotish Pabbisetti</title>
    <description>The latest articles on DEV Community by Jyotish Pabbisetti (@jyotish08).</description>
    <link>https://dev.to/jyotish08</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%2F3972056%2Ff8ac2196-808f-486e-8bdb-0d0eeab518ab.png</url>
      <title>DEV Community: Jyotish Pabbisetti</title>
      <link>https://dev.to/jyotish08</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jyotish08"/>
    <language>en</language>
    <item>
      <title>The Spike on the Desk: Teaching a Local AI to Read a Rice Mill’s Invoices</title>
      <dc:creator>Jyotish Pabbisetti</dc:creator>
      <pubDate>Sat, 17 Oct 2026 13:31:03 +0000</pubDate>
      <link>https://dev.to/jyotish08/the-spike-on-the-desk-teaching-a-local-ai-to-read-a-rice-mills-invoices-5056</link>
      <guid>https://dev.to/jyotish08/the-spike-on-the-desk-teaching-a-local-ai-to-read-a-rice-mills-invoices-5056</guid>
      <description>&lt;p&gt;This is a submission for the Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/p&gt;

&lt;p&gt;What I Built&lt;br&gt;
In a rice mill office, the room at the front never gets completely quiet. You can feel the steady, low thrum of the destoner and the rubber-roll huskers vibrating through the concrete floor, and the air holds the dry, warm scent of paddy dust.&lt;/p&gt;

&lt;p&gt;In the middle of that room sits a wooden desk, an older desktop PC running Tally, and a heavy steel paper spike—the upright metal pin with a weighted base where incoming slips get impaled to wait their turn. Twice a month, the pressure at that desk spikes. In India, monthly GST compliance follows an unforgiving calendar: GSTR-1 sales returns are due on the 11th, and GSTR-3B tax summaries follow on the 20th.&lt;/p&gt;

&lt;p&gt;Before those deadlines, an independent bookkeeper sits at that desk. He manages the ledgers for this mill alongside two dozen other local traders. He opens a digital bill on one half of the monitor, Tally or an Excel spreadsheet on the other, and manually enters vendor names, GSTINs, invoice numbers, line-item quantities, rates, and tax splits row by row.&lt;/p&gt;

&lt;p&gt;Roughly half the paperwork arriving over WhatsApp and email consists of photographed weighbridge (Dharmakanta) slips, gate passes, or handwritten chits. The other half, however, is clean, computer-generated B2B PDFs: custom-milling charges from partner mills, packaging invoices for gunny bags, transport bills, and machinery spare receipts.&lt;/p&gt;

&lt;p&gt;I built local-invoice to handle the digital half of that pile. It is a lightweight, air-gapped document extraction microservice built with FastAPI, PyMuPDF, and Google’s Gemma 2 (2B) running locally via Ollama. It parses native digital PDF invoices and extracts validated header fields and line items into structured JSON right on the local machine—acting as an automated, quiet descendant of the steel spike on the desk.&lt;/p&gt;

&lt;p&gt;The Side Hustle Opportunity&lt;br&gt;
Cloud-based invoice tools like Suvit, Vyapar TaxOne, and AutoEntry already exist to automate data entry, and urban accounting firms use them daily. But when you ask independent bookkeepers in regional trading towns why they still type bills by hand, their hesitation comes down to two practical concerns:&lt;/p&gt;

&lt;p&gt;Subscription fatigue versus thin workflow margins: A freelance bookkeeper typically charges a small merchant a modest monthly retainer for basic compliance and filing. Cloud tools charge per-company subscriptions or per-page processing fees. If an accountant serves 20 small businesses, paying recurring monthly SaaS fees across every client ledger significantly eats into their take-home income. An open-source tool running on the laptop they already own has a marginal operating cost of zero. Once the model weights are downloaded, they can process hundreds of invoices across all their clients without paying a rupee in API token fees.&lt;/p&gt;

&lt;p&gt;Data confidentiality and regulatory compliance: Supplier rates, buyer identities, and per-quintal processing margins represent a commodity trader's entire competitive moat. Furthermore, accounting bodies—such as the Institute of Chartered Accountants of India (ICAI) confidentiality code and global ICAEW guidance on public AI—strictly caution against feeding identifiable client records into third-party cloud tools. With India’s Digital Personal Data Protection (DPDP) Rules notified in November 2025 and moving toward full enforcement in May 2027, passing invoices containing individual proprietor names, PAN-linked GSTINs, and bank accounts through external APIs creates compliance risks independent practitioners prefer to avoid.&lt;/p&gt;

&lt;p&gt;Demo&lt;br&gt;
GitHub Repository: &lt;a href="https://github.com/your-username/local-invoice" rel="noopener noreferrer"&gt;https://github.com/your-username/local-invoice&lt;/a&gt; (Update with your repo link)&lt;/p&gt;

&lt;p&gt;API Documentation &amp;amp; Swagger UI: Accessible locally at &lt;a href="http://localhost:8000/docs" rel="noopener noreferrer"&gt;http://localhost:8000/docs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How It Works in Practice&lt;br&gt;
The microservice exposes a simple endpoint: POST /api/v1/extract. You send a native PDF file as multipart form-data, and receive a validated, strictly typed JSON payload:&lt;/p&gt;

&lt;p&gt;Bash&lt;br&gt;
curl -X POST "&lt;a href="http://localhost:8000/api/v1/extract" rel="noopener noreferrer"&gt;http://localhost:8000/api/v1/extract&lt;/a&gt;" \&lt;br&gt;
  -H "accept: application/json" \&lt;br&gt;
  -H "Content-Type: multipart/form-data" \&lt;br&gt;
  -F "file=@sample_data/invoice_sample.pdf;type=application/pdf"&lt;br&gt;
Sample Extracted Payload&lt;br&gt;
JSON&lt;br&gt;
{&lt;br&gt;
  "vendor_name": "Acme Tech Solutions",&lt;br&gt;
  "invoice_number": "INV-2026-001",&lt;br&gt;
  "invoice_date": "2026-03-31",&lt;br&gt;
  "total_amount": 1475.0,&lt;br&gt;
  "tax_amount": 225.0,&lt;br&gt;
  "line_items": [&lt;br&gt;
    {&lt;br&gt;
      "description": "Cloud Architecture Consulting",&lt;br&gt;
      "quantity": 10.0,&lt;br&gt;
      "unit_price": 125.0,&lt;br&gt;
      "total_price": 1250.0&lt;br&gt;
    }&lt;br&gt;
  ]&lt;br&gt;
}&lt;br&gt;
Every numerical field is returned as a sanitized, clean float, ready for downstream processing, Excel conversion, or accounting database insertion.&lt;/p&gt;

&lt;p&gt;Code&lt;br&gt;
The project is structured as a modular FastAPI microservice designed for low-resource environments:&lt;/p&gt;

&lt;p&gt;Invoice-Extractor-LLM-APP/&lt;br&gt;
├── app/&lt;br&gt;
│   ├── &lt;strong&gt;init&lt;/strong&gt;.py&lt;br&gt;
│   ├── main.py          # FastAPI application, streaming ingestion, routing&lt;br&gt;
│   ├── pdf_parser.py    # PyMuPDF in-memory parsing &amp;amp; scanned PDF heuristics&lt;br&gt;
│   └── extractor.py     # Ollama integration, Gemma 2 prompt &amp;amp; Pydantic models&lt;br&gt;
├── sample_data/         # Synthetic sample generator and test PDFs&lt;br&gt;
├── tests/               # Smoke tests and validation fixtures&lt;br&gt;
├── requirements.txt&lt;br&gt;
└── README.md&lt;br&gt;
Key Technical Implementation Details&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In-Memory Parsing &amp;amp; Scanned Document Guardrails (app/pdf_parser.py)
Most basic document tutorials save uploaded files to /tmp before reading them. If a server crashes mid-request, confidential client records remain on the disk. In local-invoice, incoming files are read directly into memory as a byte stream:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Python&lt;br&gt;
import fitz  # PyMuPDF&lt;/p&gt;

&lt;p&gt;def extract_text_from_pdf_stream(pdf_bytes: bytes) -&amp;gt; str:&lt;br&gt;
    with fitz.open(stream=pdf_bytes, filetype="pdf") as doc:&lt;br&gt;
        extracted_pages = []&lt;br&gt;
        total_non_whitespace = 0&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    for page_num in range(len(doc)):
        page = doc[page_num]
        text = page.get_text("text")
        total_non_whitespace += len("".join(text.split()))
        extracted_pages.append(f"--- Page {page_num + 1} ---\n{text}")

    # Guardrail: Fail honestly on scanned PDFs without OCR layers
    if total_non_whitespace &amp;lt; 30:
        raise ScannedPDFError("OCR not supported yet, please upload a native PDF")

    return "\n\n".join(extracted_pages)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;By counting non-whitespace characters across the stream, the system aborts with an HTTP 400 Bad Request whenever an image-only or scanned PDF is provided, preventing blank strings from being sent to the LLM where they would cause hallucinations. Documents exceeding 12,000 characters (~3,000 tokens) are safely truncated to protect Gemma's attention window.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Grammar-Guided Structured Decoding (app/extractor.py)
Small 2-billion-parameter models can easily hallucinate markdown fences, pleasantries, or broken brackets if prompted with raw text. Instead of relying on prompt engineering, local-invoice passes our Pydantic v2 schema directly to Ollama's format parameter:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Python&lt;br&gt;
response = client.chat(&lt;br&gt;
    model="gemma2:2b",&lt;br&gt;
    messages=[&lt;br&gt;
        {"role": "system", "content": SYSTEM_PROMPT},&lt;br&gt;
        {"role": "user", "content": f"Invoice document text:\n\n{text_content}"}&lt;br&gt;
    ],&lt;br&gt;
    format=InvoiceData.model_json_schema(),&lt;br&gt;
    options={"temperature": 0.0}&lt;br&gt;
)&lt;br&gt;
Ollama compiles InvoiceData.model_json_schema() into a GBNF (GGML Backus-Naur Form) grammar. At generation time, tokens that violate the JSON syntax or schema data types are masked out at the logit level, guaranteeing that the model returns syntactically valid JSON.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pre-Validation Cleaning for Real-World Formatting
Even with constrained JSON decoding, models reading invoices frequently encounter values like "₹1,250.50", "$450.00", or missing tax fields. To prevent these values from breaking strict float validation, app/extractor.py applies Pydantic v2 @field_validator(..., mode="before") hooks:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Python&lt;br&gt;
class InvoiceData(BaseModel):&lt;br&gt;
    vendor_name: str = Field(description="Name of the business or vendor issuing the invoice")&lt;br&gt;
    invoice_number: str = Field(description="Invoice or bill reference number")&lt;br&gt;
    invoice_date: str = Field(description="Date the invoice was issued")&lt;br&gt;
    total_amount: float = Field(description="Total final payable amount")&lt;br&gt;
    tax_amount: float = Field(default=0.0, description="Total tax amount")&lt;br&gt;
    line_items: list[LineItem] = Field(default_factory=list)&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@field_validator("total_amount", "tax_amount", mode="before")
@classmethod
def _clean_float(cls, v: Any) -&amp;gt; float:
    if v is None or v == "":
        return 0.0
    if isinstance(v, (int, float)):
        return float(v)
    # Strip currency symbols, commas, and trailing characters
    cleaned = re.sub(r"[^\d.-]", "", str(v).strip())
    return float(cleaned) if cleaned else 0.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Asynchronous Event-Loop Protection (app/main.py)
FastAPI runs on a single-threaded asynchronous event loop. Running CPU-bound PyMuPDF stream parsing or synchronous Ollama network requests inside an async def route freezes the entire server, causing health checks and concurrent connections to hang. We bridge the synchronous parsing pipeline using anyio.to_thread.run_sync(), offloading compute to worker threads and keeping the API responsive.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;How I Built It&lt;br&gt;
To make this practical for everyday office hardware, the system had to run smoothly alongside Tally and Chrome on a standard 8GB RAM computer without requiring a dedicated graphics card.&lt;/p&gt;

&lt;p&gt;While newer models like the Gemma 4 family offer native vision and 128K context windows, their 4-bit quantized weights hover near 5GB of memory, leaving little headroom on an 8GB office PC. I deliberately chose Gemma 2 (2B) served locally through Ollama. At approximately 1.6GB in Q4 quantization, it leaves the host machine fully responsive while running text extraction quickly on standard CPU cores.&lt;/p&gt;

&lt;p&gt;[ Native B2B PDF ] &lt;br&gt;
       │&lt;br&gt;
       ▼&lt;br&gt;
[ In-Memory PyMuPDF Stream ] ──( &amp;lt; 30 non-ws chars? )──► [ HTTP 400 Scanned PDF Error ]&lt;br&gt;
       │&lt;br&gt;
       ▼ (Valid text layer)&lt;br&gt;
[ Threadpool Offload (anyio) ]&lt;br&gt;
       │&lt;br&gt;
       ▼&lt;br&gt;
[ Ollama: Gemma 2 (2B) ] ────► GBNF Schema-Constrained Decoding&lt;br&gt;
       │&lt;br&gt;
       ▼&lt;br&gt;
[ Pydantic v2 Sanitizer ] ───► Regex Currency Cleaning ('₹1,250.50' -&amp;gt; 1250.5)&lt;br&gt;
       │&lt;br&gt;
       ▼&lt;br&gt;
&lt;a href="https://dev.toReady%20for%20downstream%20Pandas%20/%20Tally%20pipelines"&gt; Validated Structured JSON &lt;/a&gt;&lt;br&gt;
Why Does Open Innovation Matter?&lt;br&gt;
Let's be candid about the trade-off: frontier closed-source models will always parse unstructured, highly complex documents with greater baseline versatility than a 2-billion-parameter local model.&lt;/p&gt;

&lt;p&gt;Yet for the independent bookkeeper sitting in a mill office, open-source AI delivers where closed APIs cannot:&lt;/p&gt;

&lt;p&gt;Uncompromising Data Residency: Initial model weights are downloaded once during setup. After that, the network cable can be unplugged. Confidential client invoices, PAN details, and supplier price points never leave the local laptop.&lt;/p&gt;

&lt;p&gt;Deterministic Unit Economics: A solo practitioner can process 50 invoices or 5,000 invoices in a month without monitoring token meters or worrying about sudden API pricing changes.&lt;/p&gt;

&lt;p&gt;System Predictability: By combining small, efficient open-weight models with strict grammar constraints and deterministic validation, we create reliable, task-specific accounting tools that do not depend on cloud uptime.&lt;/p&gt;

&lt;p&gt;What's Next for the Project&lt;br&gt;
With local-invoice producing clean, normalized JSON, the extracted data is ready for direct downstream integration:&lt;/p&gt;

&lt;p&gt;Tabular Anomaly Detection with TabPFN: Because line items and tax amounts are output as normalized floats, they can be converted directly into a pandas DataFrame (pd.json_normalize) and passed into tabular foundation models like TabPFN (Prior Labs). This allows an accountant to compare incoming invoices against a merchant's historical ledger to catch abnormal unit prices, unexpected tax rate changes, or duplicate billings without training a custom model.&lt;/p&gt;

&lt;p&gt;Direct Tally Prime XML Export: Generating a downloadable Tally-compatible .xml voucher file alongside the JSON response, allowing bookkeepers to import an entire batch of verified invoices directly into Tally in two clicks.&lt;/p&gt;

&lt;p&gt;Local Multimodal Vision: Upgrading to Gemma 4's lightweight vision models on machines with 16GB of RAM to process photographed weighbridge slips and WhatsApp receipts locally, bridging the gap between digital PDFs and physical paper.&lt;/p&gt;

&lt;p&gt;On the night of the 10th, before the GSTR-1 portal locks, the goal of this software is straightforward: make sure that by the time the bookkeeper reaches the final paper on that steel spike, the manual entry is already done, the data has stayed private, and they can close the office door and go home on time.&lt;/p&gt;

&lt;p&gt;Prize Categories&lt;br&gt;
Best Use of Gemma: Integrated Google's open-weight Gemma 2 (2B) locally via Ollama with schema-constrained JSON decoding as the core privacy-preserving extraction engine.&lt;/p&gt;

&lt;p&gt;try it out&lt;br&gt;
github link:&lt;/p&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/Jyotish08" rel="noopener noreferrer"&gt;
        Jyotish08
      &lt;/a&gt; / &lt;a href="https://github.com/Jyotish08/local-invoice" rel="noopener noreferrer"&gt;
        local-invoice
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;local-invoice&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A 100% offline, zero-cost, private AI microservice for freelance accountants and financial data pipelines. Processes client invoice PDFs locally with &lt;strong&gt;FastAPI&lt;/strong&gt;, &lt;strong&gt;PyMuPDF&lt;/strong&gt;, and &lt;strong&gt;Gemma 2 (2B)&lt;/strong&gt; via &lt;strong&gt;Ollama&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Key Features&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero Cloud Leakage:&lt;/strong&gt; Works completely offline without an internet connection. No client data ever leaves your computer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero API Costs:&lt;/strong&gt; Replaces cloud LLMs (OpenAI, Gemini) with local inference using Google's &lt;code&gt;gemma2:2b&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PyMuPDF Native Ingestion:&lt;/strong&gt; High-speed text extraction across multi-page PDF documents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scanned PDF Guardrail:&lt;/strong&gt; Detects non-searchable/scanned PDFs and returns a clear &lt;code&gt;400 Bad Request&lt;/code&gt; informing the user that native text is required.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured Output via Ollama:&lt;/strong&gt; Enforces strict Pydantic v2 JSON schema adherence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TabPFN &amp;amp; Pandas Ready:&lt;/strong&gt; Flat, normalized JSON outputs directly ingestible into pandas and downstream anomaly detection models.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Architecture &amp;amp; Technology Stack&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Web Framework:&lt;/strong&gt; FastAPI (with Pydantic v2)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PDF Parser:&lt;/strong&gt; PyMuPDF (&lt;code&gt;fitz&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local Inference:&lt;/strong&gt; Ollama Python SDK running &lt;code&gt;gemma2:2b&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test Suite:&lt;/strong&gt;…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Jyotish08/local-invoice" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>A Dog's Day — What If You Could Experience a Morning Through a Dog's Eyes?</title>
      <dc:creator>Jyotish Pabbisetti</dc:creator>
      <pubDate>Sun, 16 Aug 2026 16:49:12 +0000</pubDate>
      <link>https://dev.to/jyotish08/a-dogs-day-what-if-you-could-experience-a-morning-through-a-dogs-eyes-2g7g</link>
      <guid>https://dev.to/jyotish08/a-dogs-day-what-if-you-could-experience-a-morning-through-a-dogs-eyes-2g7g</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/weekend-2026-08-13"&gt;Weekend Challenge: Dog Days Edition&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;We know what our dogs do all day.&lt;/p&gt;

&lt;p&gt;We don't really know what that day feels like to them.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;A Dog's Day&lt;/strong&gt; to explore that idea as a single interactive experience rather than another dog utility.&lt;/p&gt;

&lt;p&gt;You start by scrolling through a Golden Retriever's morning: waking up, waiting for breakfast, heading outside, meeting another dog, losing a favorite red ball, and eventually finding it again.&lt;/p&gt;

&lt;p&gt;The story is built around scroll-driven visual beats, so the page behaves more like a short interactive film than a collection of sections.&lt;/p&gt;

&lt;p&gt;Then, instead of simply ending the story, it asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What if you could experience the world through the eyes of your favorite animal?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That leads into the second half of the project.&lt;/p&gt;

&lt;p&gt;Choose an animal and talk to it.&lt;/p&gt;

&lt;p&gt;The Dog character is a fictional Golden Retriever with context from the story you just experienced. Ask why the ball mattered, why everything outside smells interesting, or what it noticed when it met another dog, and the conversation is grounded in that character's perspective rather than a generic "tell me about dogs" chatbot.&lt;/p&gt;

&lt;p&gt;The experience currently includes five animal perspectives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Golden Retriever&lt;/li&gt;
&lt;li&gt;Domestic Cat&lt;/li&gt;
&lt;li&gt;European Rabbit&lt;/li&gt;
&lt;li&gt;Red Fox&lt;/li&gt;
&lt;li&gt;Gray Wolf&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The idea is simple: &lt;strong&gt;the same world can feel very different depending on who is experiencing it.&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://dev-cha-git-main-jyotishpabbisetti2025-1209s-projects.vercel.app/" rel="noopener noreferrer"&gt;https://dev-cha-git-main-jyotishpabbisetti2025-1209s-projects.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Video:&lt;/strong&gt; &lt;a href="https://youtu.be/WRw55khrIBI" rel="noopener noreferrer"&gt;https://youtu.be/WRw55khrIBI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The demo shows the project as one continuous experience:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the opening story&lt;/li&gt;
&lt;li&gt;the missing-ball sequence&lt;/li&gt;
&lt;li&gt;the transition into the animal experience&lt;/li&gt;
&lt;li&gt;a voice conversation with the Dog&lt;/li&gt;
&lt;li&gt;interruption while the character is speaking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The part I wanted to get right is the transition from &lt;strong&gt;watching the story&lt;/strong&gt; to &lt;strong&gt;being able to talk to the character inside it&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/Jyotish08/dev-cha" rel="noopener noreferrer"&gt;https://github.com/Jyotish08/dev-cha&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project is a single Next.js application using the App Router.&lt;/p&gt;

&lt;p&gt;The story is organized around reusable components for scroll progress, scene beats, media, typography, and the transition into the interactive chapter.&lt;/p&gt;

&lt;p&gt;The conversation system has separate animal configurations, a voice conversation state layer, a Gemini Live WebSocket client, and a fallback API path.&lt;/p&gt;

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

&lt;p&gt;The first half is a small story engine.&lt;/p&gt;

&lt;p&gt;Each chapter has authored visual beats and text, and the user's scroll position determines which beat is active. The story uses sticky full-screen sections with Motion to control the pacing and crossfade between the story frames.&lt;/p&gt;

&lt;p&gt;For example, the four main chapters are:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Morning Comes Quietly&lt;/strong&gt; — the dog wakes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Breakfast&lt;/strong&gt; — anticipation, eating, and the empty bowl.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Walk&lt;/strong&gt; — the neighborhood, another dog, and the dog's sense of smell.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Missing Ball&lt;/strong&gt; — chase, loss, searching, discovery, and getting the ball back.&lt;/p&gt;

&lt;p&gt;The visual layer combines 1536×1024 story frames with short ambient MP4 overlays. The frames carry the actual narrative beats, while the videos add movement without making every moment depend on a full video sequence.&lt;/p&gt;

&lt;p&gt;The second half is where the architecture changes.&lt;/p&gt;

&lt;p&gt;Instead of sending recorded speech to a normal text-generation endpoint and then using browser text-to-speech, I connected the conversation directly to Google's &lt;strong&gt;Gemini Multimodal Live API&lt;/strong&gt; over a persistent WebSocket.&lt;/p&gt;

&lt;p&gt;Microphone audio is captured as 16 kHz linear PCM and streamed to Gemini. The returned 24 kHz audio is scheduled through the Web Audio API for continuous playback.&lt;/p&gt;

&lt;p&gt;That matters because the interaction is supposed to feel like a conversation, not:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;record → wait → generate → speak.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Live connection also supports interruption. If the Dog is speaking and the user starts talking, the current playback can be stopped and the conversation can continue from the new turn.&lt;/p&gt;

&lt;p&gt;The animal personalities are configured separately. The Dog's system instructions include the fictional events from the story itself, including breakfast, the walk, the other dog, and the red ball. That lets the conversation continue from the story instead of starting from zero at the bottom of the page.&lt;/p&gt;

&lt;p&gt;There is also a fallback path for the parts of the experience that depend on external AI services. Gemini rate limits, network conditions, microphone permissions, and temporary connection failures can all affect a live session, so the project does not silently pretend a failed request succeeded. A secondary Gemini text-streaming path and an offline scripted mode are available when the live connection cannot be established.&lt;/p&gt;

&lt;p&gt;The goal was not to make the project depend on AI for every part.&lt;/p&gt;

&lt;p&gt;The goal was to use Google AI exactly where it changes the experience:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;the story shows you the animal's world; Gemini Live lets you talk from inside it.&lt;/strong&gt;&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Best Use of Google AI
&lt;/h3&gt;

&lt;p&gt;I am submitting &lt;strong&gt;A Dog's Day&lt;/strong&gt; for &lt;strong&gt;Best Use of Google AI&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Gemini is not being used as a wrapper around a normal chatbot.&lt;/p&gt;

&lt;p&gt;The interactive chapter uses the &lt;strong&gt;Gemini Multimodal Live API&lt;/strong&gt; for the core voice experience: continuous microphone input, streamed spoken responses, story-aware animal personas, and interruption handling.&lt;/p&gt;

&lt;p&gt;Remove Gemini Live from that part of the project and the central interaction changes completely.&lt;/p&gt;

&lt;p&gt;The technology is what allows the final chapter to move from:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Here is a story about a dog."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"You can actually talk to the animal whose morning you just followed."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
    </item>
    <item>
      <title>The Ten Days I Wasted My AI Usage Limits (And What I Learned After)</title>
      <dc:creator>Jyotish Pabbisetti</dc:creator>
      <pubDate>Thu, 06 Aug 2026 16:33:07 +0000</pubDate>
      <link>https://dev.to/jyotish08/the-ten-days-i-wasted-my-ai-usage-limits-and-what-i-learned-after-239h</link>
      <guid>https://dev.to/jyotish08/the-ten-days-i-wasted-my-ai-usage-limits-and-what-i-learned-after-239h</guid>
      <description>&lt;p&gt;For almost four months, I did nothing but dream. I would think up a product, imagine how it would work, picture it finished — and never write a single line of code. In my head, building it was the easy part. I had ChatGPT and Claude. How hard could it be?&lt;/p&gt;

&lt;p&gt;Then summer break came. May 2026. And one thought kept hitting me: I had spent four months thinking about products and zero months building them.&lt;/p&gt;

&lt;p&gt;So I decided to actually start.&lt;/p&gt;

&lt;p&gt;The naive part&lt;/p&gt;

&lt;p&gt;People had already warned me — learn the basics first, don't skip the fundamentals. I nodded along, but I didn't really believe that was the real problem. I still thought AI was some kind of magician. Explain the idea, get the code, done. One idea, one solution, no friction.&lt;/p&gt;

&lt;p&gt;Here's how naive I actually was: I would describe my idea to ChatGPT, ask it for a plan and a prompt, then copy that prompt straight into my IDE — without reading what the prompt actually told the AI to do. I just trusted it.&lt;/p&gt;

&lt;p&gt;The output, unsurprisingly, was often the opposite of what I wanted. I burned through my usage limits chasing fixes for problems I had created myself, just by not reading my own prompts.&lt;/p&gt;

&lt;p&gt;The part nobody warns you about&lt;/p&gt;

&lt;p&gt;The real barrier was never syntax or libraries. It was the gap between having an idea in your head and actually turning it into something real. That gap doesn't show up in any tutorial. You only find it by trying to cross it — and falling in.&lt;/p&gt;

&lt;p&gt;What changed&lt;/p&gt;

&lt;p&gt;The first ten days were pure confusion. But somewhere after that, things started clicking. I learned actual prompt engineering — not just "ask nicely," but understanding what a prompt does before I run it. I got a real feel for what AI is actually good at, and where it quietly hands you garbage dressed up as an answer.&lt;/p&gt;

&lt;p&gt;Oddly, this made me a better programmer, not a lazier one. Reading and correcting AI output forced me to understand code faster than writing it alone ever did. I started filling the gaps AI left with my own thinking, instead of just more prompts.&lt;/p&gt;

&lt;p&gt;It also made me more consistent — not just in coding, but in how I studied and how I showed up to work every day.&lt;/p&gt;

&lt;p&gt;The one thing I'd tell myself in May&lt;/p&gt;

&lt;p&gt;None of this — the prompt engineering, the sharper code sense, the consistency — happens if I don't take that first messy, confused step. The confusion wasn't a sign I was doing it wrong. It was the cost of finally doing it at all.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>**Rivalry Roast** — you talk smack about your team or favorite player, out loud, and an AI rival fan claps back at you, in voice, in real time.</title>
      <dc:creator>Jyotish Pabbisetti</dc:creator>
      <pubDate>Mon, 13 Jul 2026 02:26:21 +0000</pubDate>
      <link>https://dev.to/jyotish08/rivalry-roast-you-talk-smack-about-your-team-or-favorite-player-out-loud-and-an-ai-rival-mc5</link>
      <guid>https://dev.to/jyotish08/rivalry-roast-you-talk-smack-about-your-team-or-favorite-player-out-loud-and-an-ai-rival-mc5</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/weekend-2026-07-09"&gt;Weekend Challenge: Passion Edition&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Tomorrow I have my semester exam. Between assignments, revision, and general exam-season chaos, my schedule right now is not exactly forgiving. And yet — every day, no matter how packed things get, I carve out an hour, sometimes an hour and a half, just to build. Not because I have to. Because it's the one part of my day that actually feels like &lt;em&gt;mine&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;So when this challenge landed during exam week, it felt less like bad timing and more like an invitation. I'm a solo developer on this one, and I'm also a lifelong football fan — Ronaldo has been my guy for as long as I can remember. Building something around fan passion and rivalry wasn't a stretch for me; it's basically autobiographical.&lt;/p&gt;

&lt;p&gt;The goal was simple: talk smack, get roasted back — out loud, not just in text.&lt;/p&gt;

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

&lt;p&gt;Youtube demo link(&lt;a href="https://youtube.com/shorts/QNnVdpfzGNE?si=GFmKuYos3FgXRtx4" rel="noopener noreferrer"&gt;https://youtube.com/shorts/QNnVdpfzGNE?si=GFmKuYos3FgXRtx4&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev-uq5k.onrender.com" rel="noopener noreferrer"&gt;https://dev-uq5k.onrender.com&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/Jyotish08/dev" rel="noopener noreferrer"&gt;https://github.com/Jyotish08/dev&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;The flow is simple to describe but has three real moving parts: you speak your trash talk, it gets converted to text, that text goes to an AI for a witty comeback, and the comeback gets converted back into voice so you actually &lt;em&gt;hear&lt;/em&gt; the rival roast you.&lt;/p&gt;

&lt;p&gt;I used &lt;strong&gt;Groq&lt;/strong&gt; for speech-to-text, &lt;strong&gt;Google Gemini&lt;/strong&gt; for generating the roast itself, and &lt;strong&gt;ElevenLabs&lt;/strong&gt; for turning that roast into voice.&lt;/p&gt;

&lt;p&gt;The voice piece was the part I was most excited about, and it wasn't totally unfamiliar territory — I've built voice cloning from scratch before, using open-source models, piecing together my own pipeline to get a voice to sound right. This was my first time using ElevenLabs specifically, and it was humbling: what used to take real pipeline-building effort on my end, it handled almost instantly once I found my footing with it.&lt;/p&gt;

&lt;p&gt;Gemini impressed me just as much on the other side — fast turnaround, and it consistently understood the tone I was going for without me needing to over-engineer the prompt.&lt;/p&gt;

&lt;p&gt;The part nobody tells you about: building the idea took maybe twenty minutes of thinking. Getting it &lt;em&gt;working&lt;/em&gt; took closer to two hours, and almost all of that time went into APIs that had quietly moved on without telling me. A model I called by name had already been retired. A voice model I picked had been phased out on the free tier. The specific voice I wanted wasn't available to my account at all due to a free-tier restriction I didn't know existed. Deployment brought its own round of small chaos — a build tool throwing a permission error, a config silently skipping a dependency it needed, a server going live but unable to find its own front end.&lt;/p&gt;

&lt;p&gt;None of these were dramatic bugs individually — each took a couple of minutes to fix once I knew what it was. But stacked back-to-back, on exam eve, with the clock ticking, it turned into a genuine debugging crawl through error messages and dashboards. And honestly, that's passion too — not just the fun highlight-reel part, but the part where something keeps refusing to work and you keep showing up anyway because you already care too much to walk away.&lt;/p&gt;

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

&lt;p&gt;Best Use of Google AI, Best Use of ElevenLabs&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
    </item>
    <item>
      <title>Building Confidence out of Chaos: How Copilot Saved My First AI Project</title>
      <dc:creator>Jyotish Pabbisetti</dc:creator>
      <pubDate>Sun, 07 Jun 2026 06:04:10 +0000</pubDate>
      <link>https://dev.to/jyotish08/building-confidence-out-of-chaos-how-copilot-saved-my-first-ai-project-1f9i</link>
      <guid>https://dev.to/jyotish08/building-confidence-out-of-chaos-how-copilot-saved-my-first-ai-project-1f9i</guid>
      <description>&lt;p&gt;This is a submission for the GitHub Finish-Up-A-Thon Challenge&lt;/p&gt;

&lt;p&gt;What I Built&lt;br&gt;
I built Local PDF, a completely local, privacy-first utility website designed to handle all your PDF processing needs right in the browser. The idea started because I wanted a fast, reliable tool that didn't force users to upload their sensitive documents to the cloud. As I navigate my first year of computer science, what makes this project so meaningful to me is that it was my true gateway into advanced, real-world development. It wasn't just another assignment; it was something I built from scratch to solve a real problem.&lt;/p&gt;

&lt;p&gt;Demo:&lt;br&gt;
&lt;/p&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__cover"&gt;
          &lt;a href="https://localpdf.dev/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flocalpdf.dev%2Fog-image.png" height="800" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://localpdf.dev/" rel="noopener noreferrer" class="c-link"&gt;
            Localpdf — Your PDFs. Done in Seconds. Right in Your Browser.
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Free online PDF tools that work entirely in your browser. Compress, merge, and split PDFs instantly with no uploads, no registration, and no data stored.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flocalpdf.dev%2Ffavicon.ico%3Ffavicon.0x3dzn~oxb6tn.ico" width="256" height="256"&gt;
          localpdf.dev
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The Comeback Story&lt;br&gt;
When I first started this project, my workflow was a complete mess. It was entirely disconnected. At one crucial point, the app was lagging horribly, the components were breaking, and I couldn't figure out why. I sat there for 45 incredibly frustrating minutes, just staring at my screen, trying to trace the errors by myself.&lt;/p&gt;

&lt;p&gt;It was my very first time experimenting with AI agents in a development environment, and the complexity felt overwhelming. Honestly, I was completely drained. I was so close to just shutting my laptop, throwing my hands up, and postponing the whole thing for "tomorrow"—which, let's be real, often means abandoning it entirely. The barrier felt too high.&lt;/p&gt;

&lt;p&gt;But instead of giving up, I decided to try a different approach. I stepped back, engineered a clear prompt to gather my thoughts using ChatGPT, and then I turned to the auto model selection feature in GitHub Copilot right inside VS Code.&lt;/p&gt;

&lt;p&gt;My Experience with GitHub Copilot&lt;br&gt;
That decision completely turned the project around. I asked Copilot to analyze the repository, and within just a few minutes, it handed me a comprehensive report detailing exactly where the bottlenecks were and why the app was breaking. I was absolutely blown away by how it handled the chaos of my code. I applied the changes it suggested, and it worked flawlessly.&lt;/p&gt;

&lt;p&gt;If Copilot hadn't helped me in that exact moment, that bug would have been the end of the road for Local PDF. But more importantly, solving that problem gave me an incredible surge of confidence. It made me realize that I can build complex, ambitious things. Since that night, I've gone on to build multiple other projects, and I haven't felt those negative emotions or the heavy weight of imposter syndrome while coding ever again. Copilot didn't just fix my code; it changed how I feel about being a developer.&lt;/p&gt;

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