<?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: E. Smith</title>
    <description>The latest articles on DEV Community by E. Smith (@eszter_kovacs_37c655dc5e9).</description>
    <link>https://dev.to/eszter_kovacs_37c655dc5e9</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%2F1837887%2Fe1c694b7-6e8b-42a7-8976-078c022a645f.jpg</url>
      <title>DEV Community: E. Smith</title>
      <link>https://dev.to/eszter_kovacs_37c655dc5e9</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/eszter_kovacs_37c655dc5e9"/>
    <language>en</language>
    <item>
      <title>Slothstep: a lazy-friendly app that turns "ugh, I'll do it later" into three tiny steps</title>
      <dc:creator>E. Smith</dc:creator>
      <pubDate>Fri, 23 Oct 2026 14:43:22 +0000</pubDate>
      <link>https://dev.to/eszter_kovacs_37c655dc5e9/slothstep-a-lazy-friendly-app-that-turns-ugh-ill-do-it-later-into-three-tiny-steps-5cd3</link>
      <guid>https://dev.to/eszter_kovacs_37c655dc5e9/slothstep-a-lazy-friendly-app-that-turns-ugh-ill-do-it-later-into-three-tiny-steps-5cd3</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest"&gt;Hacktoberfest Open-Source AI Challenge: Week 3 – Slow and Steady&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Slothstep&lt;/strong&gt; is a tiny web app for the thing sloths do best: not panicking.&lt;/p&gt;

&lt;p&gt;You type whatever you keep putting off ("clean the whole flat before Saturday", "write that difficult email to my boss", "sort the files on my laptop") and an open-weight model answers with exactly &lt;strong&gt;three steps&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;one you can start &lt;em&gt;right now&lt;/em&gt; and finish in two minutes or less,&lt;/li&gt;
&lt;li&gt;one that follows naturally,&lt;/li&gt;
&lt;li&gt;one that finishes the job.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every step has a realistic time estimate, and you can tick them off as you go. The point is not a perfect plan. The point is that the first step is so small there is no excuse left not to start.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The effort it saves:&lt;/strong&gt; the hardest part of a dreaded task is rarely the task, it is the staring. Slothstep replaces "where do I even begin?" with one concrete, two-minute action. (On my machine a plan takes about 25 seconds to generate with a 4B model.)&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Live app (demo mode with sample plans, because a free host cannot run a model): &lt;a href="https://slothstep.onrender.com/" rel="noopener noreferrer"&gt;https://slothstep.onrender.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Real thing: clone the repo, &lt;code&gt;ollama pull gemma3:4b&lt;/code&gt;, &lt;code&gt;pip install -r requirements.txt&lt;/code&gt;, &lt;code&gt;python app.py&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Code: &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/banana0000" rel="noopener noreferrer"&gt;
        banana0000
      &lt;/a&gt; / &lt;a href="https://github.com/banana0000/slothstep" rel="noopener noreferrer"&gt;
        slothstep
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Slothstep: turn a task you keep putting off into three tiny steps with an open-weight model (Gemma 3 + Ollama). Dash app.
    &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;🦥 Slothstep&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Describe a task you keep putting off and get &lt;strong&gt;three tiny, realistic steps&lt;/strong&gt;. The first one takes two minutes or less, so there is no excuse left not to start.&lt;/p&gt;
&lt;p&gt;Built for the Hacktoberfest Open-Source AI Challenge (Week 3: &lt;em&gt;Slow and Steady&lt;/em&gt;) with an open-weight model (&lt;a href="https://ai.google.dev/gemma" rel="nofollow noopener noreferrer"&gt;Gemma 3&lt;/a&gt;) served by &lt;a href="https://ollama.com/" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Live demo:&lt;/strong&gt; &lt;a href="https://slothstep.onrender.com" rel="nofollow noopener noreferrer"&gt;https://slothstep.onrender.com&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Three steps with time estimates, validated so the model cannot return malformed plans&lt;/li&gt;
&lt;li&gt;Tick steps off as you go&lt;/li&gt;
&lt;li&gt;Light and dark mode (remembered in the browser)&lt;/li&gt;
&lt;li&gt;A badge showing whether the model server is running&lt;/li&gt;
&lt;li&gt;Runs fully offline with a local model, or against any OpenAI-compatible host serving an open-weight model&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stack: &lt;a href="https://dash.plotly.com/" rel="nofollow noopener noreferrer"&gt;Dash&lt;/a&gt; + &lt;a href="https://www.dash-mantine-components.com/" rel="nofollow noopener noreferrer"&gt;Dash Mantine Components&lt;/a&gt;, Python.&lt;/p&gt;

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

&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;ollama pull gemma3:4b
pip install -r requirements.txt
python app.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Open &lt;a href="http://127.0.0.1:8050" rel="nofollow noopener noreferrer"&gt;http://127.0.0.1:8050&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Configuration&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;table&gt;

&lt;thead&gt;

&lt;tr&gt;

&lt;th&gt;Variable&lt;/th&gt;

&lt;th&gt;Default&lt;/th&gt;

&lt;th&gt;Purpose&lt;/th&gt;

&lt;/tr&gt;

&lt;/thead&gt;

&lt;tbody&gt;

&lt;tr&gt;

&lt;td&gt;&lt;code&gt;OLLAMA_MODEL&lt;/code&gt;&lt;/td&gt;

&lt;td&gt;&lt;code&gt;gemma3:4b&lt;/code&gt;&lt;/td&gt;

&lt;td&gt;Model name (Ollama tag, or model id on&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/banana0000/slothstep" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;

&lt;/li&gt;

&lt;/ul&gt;


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

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


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

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

&lt;p&gt;The free host may take about a minute to wake up on the first visit.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;UI:&lt;/strong&gt; &lt;a href="https://dash.plotly.com/" rel="noopener noreferrer"&gt;Dash&lt;/a&gt; with &lt;a href="https://www.dash-mantine-components.com/" rel="noopener noreferrer"&gt;Dash Mantine Components&lt;/a&gt; (light and dark mode), a single Python file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model:&lt;/strong&gt; &lt;a href="https://ai.google.dev/gemma" rel="noopener noreferrer"&gt;Gemma 3&lt;/a&gt; (4B) running locally through &lt;a href="https://ollama.com/" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt;. The same code can also talk to any OpenAI-compatible host serving an open-weight model. The free hosted demo runs in a clearly labelled demo mode with sample plans, since a free host cannot run a model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reliable output:&lt;/strong&gt; the model is asked for JSON only, then the app validates it (exactly three steps, non-empty text, positive integer minutes) and shows a friendly error instead of garbage if the model misbehaves.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompting:&lt;/strong&gt; low temperature, a hard limit of two minutes for step one, and an explicit "do not invent missing details" instruction so it doesn't hallucinate a kitchen you don't have.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deploy:&lt;/strong&gt; a &lt;code&gt;render.yaml&lt;/code&gt; Blueprint for a free Render web service running with &lt;code&gt;DEMO_MODE=true&lt;/code&gt;. A real model needs a private Ollama service on a paid instance, which the repo's &lt;code&gt;ollama/Dockerfile&lt;/code&gt; supports.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Open Innovation Matters Here
&lt;/h2&gt;

&lt;p&gt;What people procrastinate on is personal: unanswered emails, messy folders, awkward conversations. I don't want those sent to a closed API.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Private by default:&lt;/strong&gt; run it locally and your to-dos never leave your machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Works offline:&lt;/strong&gt; no internet, no problem. Ollama and a 4B model are enough.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set up once, free forever:&lt;/strong&gt; no subscription, no per-token bill for something you use ten times a week.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swappable:&lt;/strong&gt; because Slothstep speaks both Ollama and the OpenAI-compatible API, moving from a local Gemma to a hosted open-weight model is two environment variables, not a rewrite.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A closed model might write slightly nicer sentences. But for a three-line plan, a small open model is more than good enough, and I keep control of my data.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma:&lt;/strong&gt; Gemma 3 is the model at the core of the app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Render:&lt;/strong&gt; the app is deployed from a &lt;code&gt;render.yaml&lt;/code&gt; Blueprint.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for reading, and please take it slow. 🦥&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>hacktoberfest</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Receipt Box: a private receipt sorter for freelancers, powered by Gemma</title>
      <dc:creator>E. Smith</dc:creator>
      <pubDate>Sat, 17 Oct 2026 07:43:55 +0000</pubDate>
      <link>https://dev.to/eszter_kovacs_37c655dc5e9/receipt-box-a-private-receipt-sorter-for-freelancers-powered-by-gemma-136m</link>
      <guid>https://dev.to/eszter_kovacs_37c655dc5e9/receipt-box-a-private-receipt-sorter-for-freelancers-powered-by-gemma-136m</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Receipt Box&lt;/strong&gt; is a receipt and invoice sorter for freelancers that runs entirely on your own laptop.&lt;/p&gt;

&lt;p&gt;Every freelancer knows the end-of-quarter ritual: a folder of crumpled photos, PDF invoices in six currencies, and an accountant asking "which of these have VAT?" Receipt Box turns that folder into a clean expense dashboard in a few minutes. Drop in photos or PDFs and a vision model reads each one: vendor, date, total, VAT, currency, and a category such as Software, Travel or Meals. You get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A dashboard&lt;/strong&gt;: total spend, VAT to reclaim, spend by category and by month.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A VAT-by-quarter table&lt;/strong&gt;, because that is the number a freelancer actually has to hand over.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An editable table.&lt;/strong&gt; A 4B model will sometimes be wrong, so every cell is fixable. Change a vendor's category once and Receipt Box remembers it: that vendor is sorted the same way from then on.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duplicate detection&lt;/strong&gt;, so the same invoice uploaded twice gets flagged instead of counted twice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-currency handling&lt;/strong&gt;, with a currency switch instead of silently adding euros to forints.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exports&lt;/strong&gt; to CSV and to an Excel workbook (receipts, spend per category, VAT per quarter) that goes straight to the accountant.&lt;/li&gt;
&lt;li&gt;Optional &lt;strong&gt;line-item extraction&lt;/strong&gt; for when you want to see what was bought, not just the total.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Who would pay?&lt;/strong&gt; Freelancers and tiny agencies who want bookkeeping help but cannot (or should not) upload client invoices, travel documents and personal receipts to a cloud service. The same goes for the accountants who serve them: with many clients' paperwork on their desk, "nothing leaves this machine" is a feature they can promise. I see it as a one-time licence for freelancers, or a small monthly fee per accountant seat.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Live app:&lt;/strong&gt; &lt;a href="https://receipt-box-69v1.onrender.com" rel="noopener noreferrer"&gt;https://receipt-box-69v1.onrender.com&lt;/a&gt; (hosted on Render; click &lt;strong&gt;Load demo data&lt;/strong&gt; to explore the dashboard)&lt;/p&gt;

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

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

&lt;p&gt;The repo includes three fictional sample documents in &lt;code&gt;samples/&lt;/code&gt; (a PDF invoice and two receipt images in different currencies). Drop them in and the dashboard fills in as each document is read.&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/banana0000" rel="noopener noreferrer"&gt;
        banana0000
      &lt;/a&gt; / &lt;a href="https://github.com/banana0000/receipt-box" rel="noopener noreferrer"&gt;
        receipt-box
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Private receipt &amp;amp; invoice sorter for freelancers: Gemma 3 reads your receipts locally via Ollama. Editable table, learned categories, VAT by quarter, multi-currency, CSV/Excel export.
    &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;Receipt Box&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A receipt and invoice sorter for freelancers that runs entirely on your laptop
Photos and PDFs go to an open-weight vision model (Gemma 3 via Ollama), and the result is a
categorised expense dashboard plus a CSV or Excel file for your accountant
Nothing is uploaded anywhere.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Reads receipt photos (JPG / PNG) and PDF invoices (text layer or scanned) with Gemma 3.&lt;/li&gt;
&lt;li&gt;Dashboard: total spend, VAT to reclaim, spend by category and by month, VAT by quarter.&lt;/li&gt;
&lt;li&gt;Editable table: fix any cell, delete rows. Changing a category teaches the app: that vendor is
sorted the same way from now on (saved in &lt;code&gt;rules.json&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Possible duplicates are highlighted.&lt;/li&gt;
&lt;li&gt;Several currencies: pick one, or "All currencies" to see them side by side. Amounts are never converted.&lt;/li&gt;
&lt;li&gt;Export to CSV or Excel (receipts, spend per category, VAT per quarter).&lt;/li&gt;
&lt;li&gt;Optional line-item extraction (slower).&lt;/li&gt;
&lt;li&gt;Files are read one at…&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/banana0000/receipt-box" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


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

&lt;p&gt;The whole project is built around one open-weight model: &lt;strong&gt;Gemma 3 (4B, vision)&lt;/strong&gt;, running locally through &lt;strong&gt;Ollama&lt;/strong&gt;. The only network call the app makes goes to &lt;code&gt;localhost&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Structured output.&lt;/strong&gt; Each image is sent to Gemma with a JSON schema (&lt;code&gt;vendor&lt;/code&gt;, &lt;code&gt;date&lt;/code&gt;, &lt;code&gt;total&lt;/code&gt;, &lt;code&gt;vat&lt;/code&gt;, &lt;code&gt;currency&lt;/code&gt;, &lt;code&gt;category&lt;/code&gt;), and the category is constrained to a fixed list. The reply always parses, with no regex and no retry loop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Two paths for PDFs.&lt;/strong&gt; If a PDF has a text layer, the text goes to the model directly, which is faster. Scanned PDFs are rendered to an image (PyMuPDF) and go through the vision path.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Queue with visible progress.&lt;/strong&gt; On a CPU a receipt takes roughly 15-20 seconds, so files are processed one at a time and the page shows "Reading 2 of 5: name.png" instead of freezing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The model is allowed to be wrong.&lt;/strong&gt; The prompt tells it to use only what is printed and not to guess. After that, the human-in-the-loop table and the learned vendor rules do the rest. In my tests the three sample documents were read correctly, and for real-world crumpled receipts the correction table is what makes the tool usable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dashboard.&lt;/strong&gt; A Dash app with Plotly charts and pandas for the numbers (quarterly VAT, duplicates, per-currency totals). Excel export uses openpyxl.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tests.&lt;/strong&gt; The data layer (duplicates, quarters, rules, exports) is covered with pytest.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Hosting.&lt;/strong&gt; The same app also deploys to Render from a Blueprint (&lt;code&gt;render.yaml&lt;/code&gt;): a private Ollama service with Gemma 3 baked into its Docker image, and the web app talking to it over Render's private network, so the model is never exposed to the internet. Gemma 3 4B needs about 4-5 GB of RAM, so the Ollama service runs on a large instance. On a laptop none of this is needed.&lt;/p&gt;

&lt;p&gt;Honest limits: a 4B model on a CPU is slow, and line-item extraction is slower still, so it is off by default. A bigger Gemma or a GPU is a one-line change (&lt;code&gt;RECEIPT_MODEL&lt;/code&gt;).&lt;/p&gt;

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

&lt;p&gt;Receipts are about the most sensitive "boring" data a freelancer has: who you work for, where you travel, what you pay for. A closed API would force a trade-off between convenience and privacy, and that is exactly where I would lose the customers who care about it most.&lt;/p&gt;

&lt;p&gt;An open-weight model removes the trade-off. Because Gemma runs on the user's own machine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the documents never leave the laptop, so there is nothing to leak, retain or train on;&lt;/li&gt;
&lt;li&gt;there is no per-receipt API bill, so the price of the product is not tied to someone else's pricing;&lt;/li&gt;
&lt;li&gt;it keeps working offline, on a train or in a client's office with no Wi-Fi;&lt;/li&gt;
&lt;li&gt;the user can swap the model by changing one environment variable as better open models arrive.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A small open model that runs on a laptop is what makes "private by design" a real promise here, not a marketing line.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemma&lt;/strong&gt;: the entire product is built on Gemma 3 running locally.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Render&lt;/strong&gt;: the web app and a private Gemma/Ollama service are deployed together from one Blueprint.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>gemma</category>
      <category>python</category>
    </item>
    <item>
      <title>Exam AI – something I built during the MeDo hackathon</title>
      <dc:creator>E. Smith</dc:creator>
      <pubDate>Mon, 04 May 2026 07:30:20 +0000</pubDate>
      <link>https://dev.to/eszter_kovacs_37c655dc5e9/exam-ai-something-i-built-during-the-medo-hackathon-23a1</link>
      <guid>https://dev.to/eszter_kovacs_37c655dc5e9/exam-ai-something-i-built-during-the-medo-hackathon-23a1</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7k0eq811li30ii364je2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7k0eq811li30ii364je2.png" alt=" " width="800" height="374"&gt;&lt;/a&gt;&lt;br&gt;
🚀 During the MeDo hackathon,I built something surprisingly simple — but genuinely useful: &lt;strong&gt;Exam AI&lt;/strong&gt; 📚🤖&lt;/p&gt;

&lt;p&gt;The idea came from a pretty common frustration.&lt;/p&gt;

&lt;p&gt;A lot of studying turns into passive repetition:&lt;br&gt;
reading the same notes again and again, scrolling slides, highlighting things… and hoping it somehow sticks.&lt;/p&gt;

&lt;p&gt;I wanted to build something more active.&lt;br&gt;
Something that actually makes you &lt;em&gt;think&lt;/em&gt; while learning.&lt;/p&gt;

&lt;p&gt;So I created Exam AI. This AI tool is very easy to use.&lt;/p&gt;

&lt;p&gt;You give it a topic, and it:&lt;br&gt;
✨ generates exam-style questions&lt;br&gt;
✨ lets you answer interactively&lt;br&gt;
✨ explains the answers clearly&lt;br&gt;
✨ helps you dig deeper when something doesn’t fully click&lt;/p&gt;

&lt;p&gt;It feels less like a quiz app and more like studying with someone who keeps asking the right questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙️ Building it
&lt;/h2&gt;

&lt;p&gt;I used MeDo to build the project, which let me move really fast.&lt;/p&gt;

&lt;p&gt;Instead of spending the whole hackathon dealing with setup or infrastructure, I could focus on:&lt;br&gt;
🧠 refining prompts&lt;br&gt;
🧠 improving explanations&lt;br&gt;
🧠 making the experience actually helpful&lt;/p&gt;

&lt;p&gt;Most of the work wasn’t technical complexity — it was figuring out how to make the AI respond in a way that feels useful and natural.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧩 The difficult part
&lt;/h2&gt;

&lt;p&gt;The biggest challenge was keeping things consistent.&lt;/p&gt;

&lt;p&gt;With AI, small changes in prompts can completely change the quality of the output.&lt;br&gt;
Some questions were great. Others… not so much 😅&lt;/p&gt;

&lt;p&gt;We also had to constantly fight the urge to add more and more features.&lt;/p&gt;

&lt;p&gt;In the end, keeping the product focused was probably one of the best decisions we made.&lt;/p&gt;

&lt;h2&gt;
  
  
  📚 Biggest takeaway
&lt;/h2&gt;

&lt;p&gt;Hackathons really remind you that:&lt;br&gt;
⚡ speed matters&lt;br&gt;
⚡ simple ideas win&lt;br&gt;
⚡ shipping something beats endlessly planning it&lt;/p&gt;

&lt;p&gt;And honestly, AI becomes much more powerful when you focus less on “cool features” and more on helping people in a practical way.&lt;/p&gt;

&lt;p&gt;I am excited to keep improving it — especially around personalization, progress tracking, and adapting to weak areas over time.&lt;/p&gt;

&lt;p&gt;But for now, we’re just happy we turned an idea into something real 🙌&lt;/p&gt;

&lt;p&gt;You can check my app here:&lt;br&gt;
&lt;a href="https://medo.dev/projects/app-bdybwhukvg8x" rel="noopener noreferrer"&gt;https://medo.dev/projects/app-bdybwhukvg8x&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=aFDX8r6-ULY" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=aFDX8r6-ULY&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Register here and you can get 300 credit:  pagea.uk/ono2bg&lt;/p&gt;

</description>
      <category>ai</category>
      <category>learning</category>
      <category>builtwithmedo</category>
    </item>
    <item>
      <title>🎃 My Kiroween Hackathon Experience — I Built a Spooky Landing Page with MCP Integration using Kiro IDE</title>
      <dc:creator>E. Smith</dc:creator>
      <pubDate>Wed, 26 Nov 2025 10:17:39 +0000</pubDate>
      <link>https://dev.to/eszter_kovacs_37c655dc5e9/my-kiroween-hackathon-experience-i-built-a-spooky-landing-page-with-mcp-integration-using-kiro-5al1</link>
      <guid>https://dev.to/eszter_kovacs_37c655dc5e9/my-kiroween-hackathon-experience-i-built-a-spooky-landing-page-with-mcp-integration-using-kiro-5al1</guid>
      <description>&lt;p&gt;I joined the Kiroween hackathon with one goal: &lt;strong&gt;build something fun&lt;/strong&gt;.&lt;br&gt;
A few late-night ideas later, I ended up creating a &lt;strong&gt;Halloween-themed, API-powered landing page&lt;/strong&gt; — entirely by myself, inside &lt;strong&gt;Kiro IDE&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9x3ejlvwbv0jsbix5svg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9x3ejlvwbv0jsbix5svg.png" alt=" " width="799" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  👻 What I made
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Spooky Landing Page with MCP Integration&lt;/strong&gt; — an animated, glowing UI that pulls real-time spooky quotes via MCP.&lt;br&gt;
It reacts, flickers, whispers Halloween mood into the screen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔮 MCP + ZenQuotes API connection&lt;/li&gt;
&lt;li&gt;💀 Animated UI states (ghost / moon / crystal ball)&lt;/li&gt;
&lt;li&gt;🎨 DiceBear avatar generation&lt;/li&gt;
&lt;li&gt;⚡ Smooth transitions + spooky sound cues&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Short project — big vibes.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧰 Built in &lt;strong&gt;Kiro IDE&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I didn’t code this traditionally — I &lt;strong&gt;built it through conversation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Using Kiro IDE, I generated components, refined effects, and integrated MCP endpoints quickly.&lt;br&gt;
It felt less like typing code, more like &lt;em&gt;designing an idea in real time&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  🏁 Why this mattered to me
&lt;/h2&gt;

&lt;p&gt;I learned how fast a solo developer can move when the tooling flows with creativity.&lt;br&gt;
Kiro IDE helped me think, build, and refine — not just code.&lt;/p&gt;

&lt;p&gt;Small project, but it left a big smile.👻🔥&lt;/p&gt;

</description>
      <category>kiro</category>
      <category>mcp</category>
      <category>vibecoding</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
