<?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: Hua-I Yu</title>
    <description>The latest articles on DEV Community by Hua-I Yu (@stuartyo).</description>
    <link>https://dev.to/stuartyo</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%2F4185016%2F56b2096a-d5e0-469b-a3cd-b7805b90951e.jpg</url>
      <title>DEV Community: Hua-I Yu</title>
      <link>https://dev.to/stuartyo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/stuartyo"/>
    <language>en</language>
    <item>
      <title>Gemma got 3 of 22 contest deadlines right in Taiwan time. Now it only copies, and code does the math</title>
      <dc:creator>Hua-I Yu</dc:creator>
      <pubDate>Sat, 24 Oct 2026 04:43:55 +0000</pubDate>
      <link>https://dev.to/stuartyo/gemma-got-3-of-22-contest-deadlines-right-in-taiwan-time-now-it-only-copies-and-code-does-the-math-4opc</link>
      <guid>https://dev.to/stuartyo/gemma-got-3-of-22-contest-deadlines-right-in-taiwan-time-now-it-only-copies-and-code-does-the-math-4opc</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The Bound Jam page on itch.io has a schedule that says the jam ends &lt;code&gt;Nov 1, 18:00 CET&lt;/code&gt;. The same page has a countdown timer, and the time behind that timer is &lt;code&gt;2026-11-01 17:55:25 UTC&lt;/code&gt;. In Taiwan, the first one is 01:00 on November 2. The second one is 01:55. I almost put the wrong one in my calendar.&lt;/p&gt;

&lt;p&gt;I'm a 20-year-old information management student in Taiwan, and for the last month or so I've been entering online contests. My tracker says I've submitted 83. Almost every one of them had a deadline written for somebody else's clock: 11:59 PM PDT, 2:00pm PST, 23:59 UTC, "11:59pm Anywhere on Earth". For each one I opened a converter, checked whether daylight saving had ended in that country yet, typed the result into my notes, and then typed it again into Google Calendar.&lt;/p&gt;

&lt;p&gt;This week's theme is laziness, so I built the thing I wanted: paste the rules page, get the deadlines in my own time, press one button to get a calendar file.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Deadline Calendar&lt;/strong&gt; is one web page. You paste a contest's rules page (or send it with a bookmark), and you get back every date on it, converted to your time zone, each with the line it came from. One button downloads an &lt;code&gt;.ics&lt;/code&gt; file. Each event in it is a block from 30 minutes before the deadline to the deadline, with reminders 3 days and 3 hours before. Every row that passes the checks gets those reminders, except a start date when the same page has a later date. Each row also has an "Add to Google Calendar" link. Google's link has no field for reminders, so an event added that way gets your Google Calendar's default notification instead.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6l3iw7x2qvh2kk8ybvdq.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6l3iw7x2qvh2kk8ybvdq.gif" alt="Deadline Calendar reading a Devpost page live: Gemma 4 runs on my GPU, the deadline " width="760" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gemma 4 E2B runs inside the page on your own GPU. It doesn't convert anything. It reads the lines with dates on them and copies out three pieces of text for each event: the date, the clock time and the time zone, exactly as the page writes them. Everything else is plain JavaScript:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Every quote is looked up on the page. If the date isn't on the page in any form, it's thrown out and shown in a red box.&lt;/li&gt;
&lt;li&gt;A parser reads the date and time from the quote. A table maps zone words (&lt;code&gt;PDT&lt;/code&gt;, &lt;code&gt;CET&lt;/code&gt;, &lt;code&gt;AoE&lt;/code&gt;, &lt;code&gt;Pacific Time&lt;/code&gt;, &lt;code&gt;日本時間&lt;/code&gt;) to a fixed offset or a region.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://moment.github.io/luxon/" rel="noopener noreferrer"&gt;Luxon&lt;/a&gt; and the browser's time zone database do the conversion, so the tz database decides whether daylight saving applies on that exact date.&lt;/li&gt;
&lt;li&gt;If the page names no time zone at all, the date is listed but kept off the calendar instead of guessed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That last rule is the Bound Jam case. Gemma found the countdown's &lt;code&gt;17:55:25&lt;/code&gt; too, but nothing on that line says UTC, so the tool shows it as "zone not stated" and keeps it off the calendar. Two Bound Jam rows do go in. One is &lt;code&gt;Oct 1, 18:00 CEST&lt;/code&gt; from the schedule, which Gemma called "Schedule". The other is the deadline, &lt;code&gt;Nov 1, 18:00 CET&lt;/code&gt;, which Gemma titled "Build Your Game" and gave the kind "other". My first version only put reminders on rows of kind "deadline", so the one date I needed had none. Now every row that passes the checks gets them, and the Bound Jam deadline has its 3-day and 3-hour reminders.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Live: &lt;a href="https://deadline-calendar-murex.vercel.app" rel="noopener noreferrer"&gt;deadline-calendar-murex.vercel.app&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Recorded runs&lt;/strong&gt; (the default tab) has eight real pages from my test. The Gemma outputs were saved during the test run, and the quote checker and the time zone code run live on them in your browser. Change "Your time zone" and every row moves. Under each example you can also see what the same Gemma said when I asked it for the Taiwan time directly. This tab works on any browser, phones included.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run Gemma 4 here&lt;/strong&gt; downloads the model once (about 2.8 GB) and reads any page you paste. It needs Chrome or Edge with WebGPU. In my test the median reply took 11.6 seconds on my laptop's RTX 4050.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most sites don't let another web page read them, so the address box usually can't fetch the page. You can press Ctrl+A, Ctrl+C on the rules page and paste. Or drag the "Send to Deadline Calendar" link to your bookmarks bar: clicking it on a rules page copies the page's text and opens the tool with it filled in.&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/StuartYo" rel="noopener noreferrer"&gt;
        StuartYo
      &lt;/a&gt; / &lt;a href="https://github.com/StuartYo/deadline-calendar" rel="noopener noreferrer"&gt;
        deadline-calendar
      &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;Deadline Calendar&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Paste a contest rules page. Gemma 4 E2B runs in your browser and points at the dates. Plain code checks every quote against the page, converts the time zones with Luxon and writes an &lt;code&gt;.ics&lt;/code&gt; file, or one Google Calendar link per date.&lt;/p&gt;
&lt;p&gt;Live: &lt;a href="https://deadline-calendar-murex.vercel.app" rel="nofollow noopener noreferrer"&gt;https://deadline-calendar-murex.vercel.app&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How it works&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;src/core/lines.js&lt;/code&gt; keeps only the lines that contain a date, plus the short label above each one. Both the reader and the baseline read exactly this excerpt.&lt;/li&gt;
&lt;li&gt;Gemma 4 E2B (&lt;code&gt;gemma-4-E2B-it-q4f16_1-MLC&lt;/code&gt;, WebLLM 0.2.86) copies each date, time and zone exactly as written. The answer is held to a grammar (&lt;code&gt;src/core/prompts.js&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;src/core/pipeline.js&lt;/code&gt; looks every quote up on the page. A date that isn't there is thrown out. If Gemma rewrote a date that is on the page in other words ("October 29, 2026" for "29 October 2026"), the page's own words are used and the row says so.&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/StuartYo/deadline-calendar" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;MIT licensed. &lt;code&gt;src/core/&lt;/code&gt; is the part that matters: the line picker, the date and time parser, the zone table, the conversion, the quote checker and the &lt;code&gt;.ics&lt;/code&gt; writer, with 38 unit tests. &lt;code&gt;eval/&lt;/code&gt; has the test set and every raw model reply.&lt;/p&gt;

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

&lt;p&gt;The stack: Gemma 4 E2B (4-bit, &lt;code&gt;gemma-4-E2B-it-q4f16_1-MLC&lt;/code&gt;) on &lt;a href="https://github.com/mlc-ai/web-llm" rel="noopener noreferrer"&gt;WebLLM&lt;/a&gt; 0.2.86, Luxon for dates, Vite, and a static site on Vercel.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gemma copies, code converts
&lt;/h3&gt;

&lt;p&gt;Last week the Best Use of Gemma winner, &lt;a href="https://dev.to/codeswithroh/kal-means-yesterday-and-tomorrow-i-built-home-bakers-a-whatsapp-order-sheet-that-never-guesses-21p3"&gt;Pakka&lt;/a&gt;, split the work between Gemma and code like this for the Hindi word "kal". Time zones need the same split for a different reason. "Is it summer time in California on November 2?" depends on a rule that changes by country and by year, and the tz database already knows the answer. A 2-billion-parameter model only remembers it sometimes.&lt;/p&gt;

&lt;p&gt;So Gemma gets a narrow job. The prompt asks for each event's name, a kind (deadline, start, judging, results, event, other), and three quotes copied character for character. WebLLM holds the reply to a grammar I wrote, and the grammar makes every line of the reply one complete event in this shape:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Submission Deadline"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"deadline"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Nov 2, 2026"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"time"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2:00pm"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"zone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PST"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the reply hits the token limit partway through, the half-written last line is dropped and the complete lines are kept. Bound Jam, further down, is where that mattered. Gemma's own words are only used for the event name.&lt;/p&gt;

&lt;h3&gt;
  
  
  The page is too long for the model
&lt;/h3&gt;

&lt;p&gt;Gemma 4 E2B in WebLLM has a 4,096-token window, and the Devpost page in the GIF is 262 lines. Before the model sees anything, code keeps only the lines that contain a date, plus the short label above each one ("Submissions", "Judging"). For that page Gemma reads 4 lines. For the RenderJuice contest page, 11,601 characters became 604.&lt;/p&gt;

&lt;h3&gt;
  
  
  The test
&lt;/h3&gt;

&lt;p&gt;I wanted a number before I trusted this with my own deadlines. I went through my contest folders and took every deadline where my notes had the time zone as the organizer wrote it and the Taiwan time I'd worked out back then. That gave me 22 dates from 19 contests: Devpost, itch.io, DEV, Desall, lablab, Kaggle, Zindi and a few contest sites. 16 of the 22 are a saved page or the page's own sentence pasted into my notes. The other 6 are a line I wrote in my notes myself: the official date, time and zone copied in, with my own label around them (in Chinese for four of them). &lt;code&gt;testset.json&lt;/code&gt; marks which is which. My earlier Taiwan times are the answer key, and the line picker gives both setups the same text.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemma alone:&lt;/strong&gt; told today's date and that Taiwan is UTC+8 with no daylight saving, and asked for every date in Taiwan time. Its answer was held to a grammar too, so every time it gave was in the right format.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deadline Calendar:&lt;/strong&gt; Gemma copies, code converts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Same model, temperature 0, one run each.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Right Taiwan time&lt;/th&gt;
&lt;th&gt;Wrong time for a date it found&lt;/th&gt;
&lt;th&gt;Nothing near the right time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Gemma alone&lt;/td&gt;
&lt;td&gt;3 / 22&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deadline Calendar, first run&lt;/td&gt;
&lt;td&gt;20 / 22&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;"Right" means the correct Taiwan time, to the minute, shows up on one of the output rows. That row doesn't have to be labeled "deadline". "Wrong" means no row has the right time but one is within 36 hours of it, or within 36 hours of it a year off. "Nothing near" means no row is within 36 hours.&lt;/p&gt;

&lt;p&gt;The three Gemma got right on its own were all UTC deadlines with the year written out. Each of the 18 wrong answers was 4 to 20 hours too early, or a year off. A few of them show what went wrong:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;October 25: Submissions due at 11:59 PM PDT&lt;/code&gt; (this challenge) came back as 2026-10-25 23:59. That's the page's own clock time, labeled as Taiwan time.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;11:59pm Anywhere on Earth on October 31, 2026&lt;/code&gt; came back as 07:59 on November 1, which is what you get if AoE were UTC. AoE is UTC−12, so the answer is 19:59.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;January 31 — 9:00 AM ET&lt;/code&gt; came back as January 2026, which had already passed when I read the page. Code picks the next January after the date you read it.&lt;/li&gt;
&lt;li&gt;For Bound Jam it said 09:55 on November 1, fifteen hours before the jam closes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Early is the safer direction to be wrong in, but my calendar would have had those deadlines 4 to 20 hours earlier than the real ones, and the year mistake would have told me Hack-Nation was already over.&lt;/p&gt;

&lt;h3&gt;
  
  
  What the first run missed
&lt;/h3&gt;

&lt;p&gt;Deadline Calendar gave no wrong times in that run. It missed two deadlines, and both were my code's fault.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Desall.&lt;/strong&gt; The page says &lt;code&gt;29 October 2026 (1:59 PM UTC)&lt;/code&gt;. Gemma copied it as "October 29, 2026". The checker did what I told it to and threw the quote out, so only the start date survived. Now, when a quote isn't on the page word for word, code reads the date out of Gemma's version and looks for the same calendar date on the page. If it finds it, it uses the page's own words and says so on the row. A date that isn't on the page in any form is still thrown out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bound Jam&lt;/strong&gt;, again. Gemma listed the right line, &lt;code&gt;Nov 1, 18:00 CET&lt;/code&gt;, as its fifth event. Then it got stuck writing "Game Creation Window" over and over until it hit the 900-token limit, the JSON never closed, and my parser threw the whole reply away. The grammar puts one event per line, so now code keeps every line that is a complete event and shows a note that the answer was cut off.&lt;/p&gt;

&lt;p&gt;With those two fixes, the same saved replies score 22 of 22. I wrote both fixes after looking at this test set, so 20 of 22 is the number I'd quote. The first-run scores come from the code at commit &lt;code&gt;f96ac25&lt;/code&gt;, and &lt;code&gt;eval/results.json&lt;/code&gt; has both.&lt;/p&gt;

&lt;h3&gt;
  
  
  Smaller things code handles
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"PST" written in summer.&lt;/strong&gt; Plenty of pages say PST in August. Code compares the abbreviation with what Pacific clocks actually show on that date. If they disagree, the row says one of the two is a typo and the calendar gets the earlier time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No year.&lt;/strong&gt; "December 20 at 9:00pm PST" with no year becomes the first December 20 that isn't more than 60 days in the past, and the row says the year was assumed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Japanese pages with no zone.&lt;/strong&gt; Japanese contest pages often give &lt;code&gt;2026年11月7日（土）23時59分&lt;/code&gt; and nothing else. If the page is in Japanese, code assumes Japan time and says so on the row.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The calendar file.&lt;/strong&gt; Times are written in UTC with a &lt;code&gt;Z&lt;/code&gt;, so any calendar app shows them in its own zone. Long lines are folded at 75 bytes, as the iCalendar spec asks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Lazy Payoff
&lt;/h2&gt;

&lt;p&gt;Before: open the rules, find the deadline, look up whether that country has changed its clocks yet, convert, write it in my notes, make a calendar event, add a reminder. Do that for every contest, and do it twice when the page and the timer disagree.&lt;/p&gt;

&lt;p&gt;Now: paste, check the highlighted line, press one button. Gemma reads 1 to 13 lines instead of the whole page, and the rows that matter come with the original sentence next to them, so checking takes one look. The part I'd actually get wrong when tired, the daylight saving date and the AoE offset, is no longer something I do in my head.&lt;/p&gt;

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

&lt;p&gt;It runs where the data is. Rules pages aren't secret, but my list of what I'm entering and when is my business, and pasting it into a hosted chatbot every day would make it someone else's. Here nothing you paste leaves the tab. The only downloads are the page, WebLLM's runtime and the model weights.&lt;/p&gt;

&lt;p&gt;I could change how the model answers. The grammar that forces three plain quotes per event runs inside WebLLM, token by token. That only works because the weights and the runtime are open. Because of it, each line Gemma writes is one complete event in a fixed shape, and when a reply gets cut off, only the half-written last line is lost.&lt;/p&gt;

&lt;p&gt;The test is something anyone can rerun for free. All 44 replies, 22 items with two prompts each, ran on my laptop, and every raw reply is in the repo next to the scoring script.&lt;/p&gt;

&lt;p&gt;The time zone rules are open too. The IANA tz database is a public record, kept by hand for decades, of every daylight saving rule change, country by country, and the browser ships a copy that Luxon reads. That is why the program doesn't depend on a model remembering whether California has changed its clocks by November 2. The test above shows how a small model does when it has to remember.&lt;/p&gt;

&lt;p&gt;What a closed model would do better: a larger hosted model would probably get more of the Taiwan times right on its own, and it would work on phones without a 2.8 GB download. It would still be doing date math from memory, though, and I'd still want code checking it.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Best Use of Gemma.&lt;/strong&gt; Gemma 4 E2B is the only model in the project. It runs locally in the browser through WebLLM and is held to a custom grammar. I compared it with itself on 22 real contest deadlines: asked for the Taiwan time directly it got 3 right, and copying quotes for code to convert it got 20 right on the first run with no wrong times. Every raw output is in the repo.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>gemma</category>
      <category>webgpu</category>
    </item>
    <item>
      <title>I paid NT$945 for one freelance lead. Now Gemma 4 reads the job post first, in my browser</title>
      <dc:creator>Hua-I Yu</dc:creator>
      <pubDate>Wed, 14 Oct 2026 18:14:50 +0000</pubDate>
      <link>https://dev.to/stuartyo/i-paid-nt945-for-one-freelance-lead-now-gemma-4-reads-the-job-post-first-in-my-browser-25ph</link>
      <guid>https://dev.to/stuartyo/i-paid-nt945-for-one-freelance-lead-now-gemma-4-reads-the-job-post-first-in-my-browser-25ph</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;p&gt;In August I quoted on a points-and-rewards platform for a shop in Taichung. The client's budget was NT$100,000 to 150,000 and I asked for NT$120,000. Soon after, the client opened my contact details, and PRO360, the Taiwanese marketplace where I found the job, charged me NT$945 (about US$30) for it. That is how PRO360 works for this kind of request: you pay when the client reaches for you, before anything is agreed. I still don't have a contract.&lt;/p&gt;

&lt;p&gt;Around then I drafted two more quotes that never went out. One client cancelled the request and the other request closed before I hit send. Over the summer I also scrolled past a factory system that needed someone on site, a four-department ERP on a no-code tool I've never used for NT$20,000, and a "phone wall" setup for running a pile of social media accounts without getting caught. I saw that last kind on two platforms.&lt;/p&gt;

&lt;p&gt;Upwork, Thumbtack and Bark work the same way in different currencies: Connects, credits, a price per lead. The fee is small next to a real job. Paying it for the wrong job adds up, and so does the half hour each proposal takes.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;LeadToll&lt;/strong&gt;. You paste a job post and it says &lt;strong&gt;Pay&lt;/strong&gt;, &lt;strong&gt;Skip&lt;/strong&gt; or &lt;strong&gt;Close call&lt;/strong&gt;, and every reason comes with the line from the post that backs it up.&lt;/p&gt;

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

&lt;p&gt;LeadToll is a single web page. Gemma 4 E2B runs inside it on your own GPU through WebLLM, so the post, your rates and your win rate never leave the page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvr8qvs7a5lyf0fwx1ok8.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvr8qvs7a5lyf0fwx1ok8.gif" alt="LeadToll checking a clinic website job live in the browser: Gemma 4 reads the post, code says Pay and fills in the price" width="560" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The model only reads. It copies three things out of the post, each with an exact quote:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the budget&lt;/li&gt;
&lt;li&gt;the pieces of work (pages, login, payments, a LINE bot, a data migration, and so on)&lt;/li&gt;
&lt;li&gt;warning signs (must be on site, account farming, paid only if the app takes off, unpaid "test" work)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything after that is plain JavaScript:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Check every quote. If the quote isn't in the post, the claim is thrown out. If the quote is real but doesn't say what the label says, it's thrown out too.&lt;/li&gt;
&lt;li&gt;Read the money with code. "預算 3.5 萬到 4.5 萬", "around 2k", "$15-20/hr, about 40 hours" are parsed by a function with unit tests. The model's numbers are never used.&lt;/li&gt;
&lt;li&gt;Decide. A hard no ends it. Otherwise one formula:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cost per bid        = lead fee + proposal hours x your floor rate
above your floor    = what the job pays - estimated hours x your floor rate
break-even win rate = cost per bid / above your floor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;If you win more of these leads than the break-even rate, pay. Hours come from a rate card you can edit, and your floor rate, minimum project and win rate sit in a panel on the page. Change them and the verdict updates without running the model again.&lt;/p&gt;

&lt;p&gt;Who would pay for this? Freelancers who pay for leads. On Upwork the fee is small and the real cost is the half hour spent on a proposal for a job that was never going to work. Nobody has paid me for LeadToll yet, and so far I'm its only user. On my own ten leads it agreed with me nine times, and the leads it would have stopped were ones I never paid for anyway, so for me the saving is reading time. It would matter more if you looked at dozens of paid leads a week on Upwork or Thumbtack. If I sold it, it would be a one-time US$5 download; it costs me nothing per check because the model runs on the buyer's laptop.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Live: &lt;a href="https://leadtoll.vercel.app" rel="noopener noreferrer"&gt;leadtoll.vercel.app&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Recorded runs&lt;/strong&gt; (the default tab) shows ten real outputs saved from the same model. The quote checker and the math still run live on them, so changing your rates changes the verdicts. This works on any browser, phones included.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run Gemma 4 here&lt;/strong&gt; downloads the model (about 2.8 GB, once) and checks any post you paste. It needs Chrome or Edge with WebGPU. On my laptop's RTX 4050 one post takes about 7 to 15 seconds, depending on its length.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The examples are either made up or rewritten from my own notes, and each one is labeled. No client wrote any of the text.&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/StuartYo" rel="noopener noreferrer"&gt;
        StuartYo
      &lt;/a&gt; / &lt;a href="https://github.com/StuartYo/leadtoll" rel="noopener noreferrer"&gt;
        leadtoll
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Should you pay for this freelance lead? Gemma 4 reads the post in your browser; code checks every quote and does the math.
    &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;LeadToll&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;Should you pay for this freelance lead?&lt;/p&gt;

&lt;p&gt;Upwork (Connects), Thumbtack, Bark and PRO360 charge freelancers before the first conversation with a client. LeadToll reads the job post and tells you whether the fee is worth it: &lt;strong&gt;Pay&lt;/strong&gt;, &lt;strong&gt;Skip&lt;/strong&gt; or &lt;strong&gt;Close call&lt;/strong&gt;, with the quote from the post behind every reason.&lt;/p&gt;

&lt;p&gt;Live: &lt;a href="https://leadtoll.vercel.app" rel="nofollow noopener noreferrer"&gt;https://leadtoll.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemma 4 E2B runs in your browser&lt;/strong&gt; through &lt;a href="https://github.com/mlc-ai/web-llm" rel="noopener noreferrer"&gt;WebLLM&lt;/a&gt; and WebGPU. The post, your rates and your win rate never leave the page. The model is about 2.8 GB, downloads once from Hugging Face and then works offline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The model only reads.&lt;/strong&gt; It copies the budget, the pieces of work and any warning signs out of the post, each with an exact quote. Output is held to a small hand-written grammar through WebLLM's constrained decoding, so it is always valid JSON with known labels.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code checks and decides.&lt;/strong&gt; A quote that is not in the…&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/StuartYo/leadtoll" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;MIT licensed. &lt;code&gt;src/core/&lt;/code&gt; is the part that matters: the verifier, the money parser, the rules and the decision, with 43 unit tests. &lt;code&gt;eval/&lt;/code&gt; has every post, the labeling guide and every saved model run.&lt;/p&gt;
&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Stack
&lt;/h3&gt;

&lt;p&gt;Gemma 4 E2B (4-bit, &lt;code&gt;gemma-4-E2B-it-q4f16_1-MLC&lt;/code&gt;) on &lt;a href="https://github.com/mlc-ai/web-llm" rel="noopener noreferrer"&gt;WebLLM&lt;/a&gt; 0.2.86, a Web Worker so the page doesn't freeze, Vite, and &lt;a href="https://github.com/nk2028/opencc-js" rel="noopener noreferrer"&gt;OpenCC&lt;/a&gt; for one problem I'll get to. Hosted as a static site on Vercel. Tools: Claude (Anthropic) helped me brainstorm and wrote most of the code and the first draft of this post. I chose the problem, supplied my own lead notes and rules, and reviewed and edited everything. No image generation was used; the cover and screenshots are rendered from the app's own HTML.&lt;/p&gt;
&lt;h3&gt;
  
  
  The test
&lt;/h3&gt;

&lt;p&gt;Before writing any code I wrote down my rules as a labeling guide: remote only, my floor rate, what I don't build, and four hard no's. Then I measured four setups on the same posts with the same Gemma:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemma alone:&lt;/strong&gt; one prompt with all the same rules, asked for a verdict and its reasons with quotes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rules alone:&lt;/strong&gt; regexes and the money parser, no model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemma, unchecked:&lt;/strong&gt; LeadToll's prompt, but every claim trusted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LeadToll:&lt;/strong&gt; Gemma reads, code checks and decides.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There were three sets of posts. A dev set of 32 (22 made up, 10 rewritten from my own leads) that I used while building. Holdout 1, 12 posts written by a separate agent that only saw the labeling guide. Holdout 2, 16 more written the same way, run once after I froze the code.&lt;/p&gt;

&lt;p&gt;Scored with the code I froze before running holdout 2 (commit &lt;code&gt;1d97c7b&lt;/code&gt;):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Verdict matches the label&lt;/th&gt;
&lt;th&gt;Dev (32)&lt;/th&gt;
&lt;th&gt;Holdout 1 (12)&lt;/th&gt;
&lt;th&gt;Holdout 2 (16, run once)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Gemma alone&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rules alone&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemma, unchecked&lt;/td&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LeadToll&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;30&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;9&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;14&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;On holdout 2, the set nobody tuned anything on, "rules alone" let through 4 of the 5 hard-no posts and would have paid for all 4. Gemma alone paid for 1. LeadToll also paid for 1, and that one is a story below. Gemma alone also quoted text that isn't in the post 4 times out of 21.&lt;/p&gt;

&lt;h3&gt;
  
  
  What the checker throws out
&lt;/h3&gt;

&lt;p&gt;Across the three sets, the checker I shipped drops 43 of the 193 claims Gemma made. 24 are deadline flags (more on those below) and 10 are "budgets" with no number in them, like "Budget we can discuss". Only one quote was missing from the post: when Gemma is asked to copy, it mostly copies. When the same model was asked for a verdict with reasons, 4 of its 21 quotes on holdout 2 weren't in the post.&lt;/p&gt;

&lt;p&gt;The other 8 are real quotes under the wrong label, and 7 of those labels would have ended the lead. One of them, from the made-up post asking for "an Airbnb for pet sitters":&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Gemma: &lt;code&gt;shopify_theme&lt;/code&gt;, because "I have a business plan and logo ready"&lt;/p&gt;
&lt;/blockquote&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%2F4k65s99jgklqz9xun6s4.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%2F4k65s99jgklqz9xun6s4.png" alt="The checker throwing out two of Gemma's labels on the " width="800" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The quote is in the post. It has nothing to do with Shopify. Out-of-stack labels decide whether a lead gets skipped, so for those labels the quote has to contain a word that fits (Shopify, Liquid, Ragic, iOS, game, office, on site...). Same for the hard no's. "Fixed price $800." filed as "paid only on success" is out. "不用到店裡" ("no need to come to the shop") filed as "must be on site" is out, because the code looks for the negation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Constrained decoding
&lt;/h3&gt;

&lt;p&gt;My first version asked for JSON in the prompt. Gemma renamed my keys in 16 of 44 answers (&lt;code&gt;component_counts&lt;/code&gt;, &lt;code&gt;component_flags&lt;/code&gt;) and sometimes left out the quotes entirely. WebLLM can hold the output to a JSON schema, so I tried that next. It fixed the keys, and then 5 of the 32 dev answers stopped halfway through the JSON and filled the rest of the 700-token limit with blank lines. The schema let the model pick its own whitespace and it never stopped picking. I replaced the schema with a twelve-line grammar that spells out every newline and space, and since then every answer has parsed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Got Wrong
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;I tuned the rules on my test set.&lt;/strong&gt; After the first dev run I fixed every regex that missed, and "rules alone" went to 29 of 32, one behind the full system. Holdout 1 showed what that was worth: LeadToll got 6 of 12. The model had renamed keys, my parser read "3.5 萬到 4.5 萬" as 3 dollars, and a regex read "不用到店裡" as an on-site requirement. I fixed those, so holdout 1 doesn't count anymore, and I had another agent write holdout 2.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The quote checker cost me a hard no.&lt;/strong&gt; On holdout 2, a Kenting guesthouse job needed an engineer at the property four times to install door locks. Gemma caught it, but it copied the quote in Simplified Chinese (测试, 安装) from a post written in Traditional (測試, 安裝). The checker did its job and threw the quote out, and LeadToll said Pay. Now a quote that misses is converted with OpenCC and checked again, and drafts get the same treatment, because Gemma wrote my Chinese drafts in Simplified too. With the current code no hard no in any of the three sets gets paid. Holdout 2 still scores 14, because I also added a rule after looking at the recorded examples: if Gemma finds no piece of work it can count, LeadToll won't say Pay, since an hours estimate of "setup only" means nothing. That turned one correct Pay into a Close call. I'd rather have that than a confident Pay built on four hours of estimated work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemma calls everything a rush.&lt;/strong&gt; "Launch in six to eight weeks" and "before the end of next quarter" were both flagged as a too-short deadline. A rush flag never changes the verdict, and now it needs an urgency word in the quote to show up at all.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The hours are only as good as what Gemma notices.&lt;/strong&gt; For my real Ragic-to-CRM lead (66 people using it every day, a few hundred thousand records, a hard deadline) LeadToll estimated 20 to 68 hours and said Pay. I walked away from that job. Gemma saw "migration" and missed the size. Since then, when Gemma counts one piece of work or none, plain text rules add the obvious ones it skipped (booking, login, payments, a CMS), but nothing in the code knows how big a migration is.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;The post stays on the laptop. Leads on Taiwanese platforms often include the shop's district, the size of the team and what they currently use, and my floor rate and win rate are numbers I don't want in anyone's logs either. With the model in the tab, nothing you type goes to a server. The only downloads are the page, WebLLM's runtime file from GitHub and the model weights from Hugging Face; even the fonts are bundled.&lt;/p&gt;

&lt;p&gt;I could change how the model writes, too. The whitespace loop and the renamed keys were fixed with a grammar I wrote, applied token by token inside WebLLM. I could only find the Simplified Chinese problem because I had every raw output saved next to the post it came from.&lt;/p&gt;

&lt;p&gt;Nobody needs an account. A freelancer opens a link, with no key to paste and no bill per check.&lt;/p&gt;

&lt;p&gt;Swapping the model is one line, &lt;code&gt;MODEL_ID&lt;/code&gt; in &lt;code&gt;src/llm.js&lt;/code&gt;. The checker, the money parser and the decision don't care which model reads the post.&lt;/p&gt;

&lt;p&gt;A closed model would do better in two places. A bigger hosted model would probably have caught the size of that CRM migration, and would have answered Traditional Chinese in Traditional Chinese. The 2.8 GB download and the WebGPU requirement also leave out phones and Safari, which is why the recorded tab exists.&lt;/p&gt;

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

&lt;p&gt;Me. I ran LeadToll on the ten leads I wrote down this summer, rewritten from my notes. The lead fee is real for the first one; the rest use NT$200 per quote, from my notes on PRO360's points (NT$150 to 250), or zero on Tasker.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Lead&lt;/th&gt;
&lt;th&gt;What actually happened&lt;/th&gt;
&lt;th&gt;LeadToll&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Points platform, Taichung, NT$100-150k&lt;/td&gt;
&lt;td&gt;Quoted NT$120,000, charged NT$945, no contract yet&lt;/td&gt;
&lt;td&gt;Pay (break-even 1.5%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Export food site, NT$30-50k&lt;/td&gt;
&lt;td&gt;Client cancelled before I sent it&lt;/td&gt;
&lt;td&gt;Pay&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business site, under NT$30k&lt;/td&gt;
&lt;td&gt;Request closed before I sent it&lt;/td&gt;
&lt;td&gt;Pay&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trading company site, NT$50-100k&lt;/td&gt;
&lt;td&gt;Quoted NT$54,000, no reply yet&lt;/td&gt;
&lt;td&gt;Pay&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Factory system, on site&lt;/td&gt;
&lt;td&gt;Never bid&lt;/td&gt;
&lt;td&gt;Skip: must be on site&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Four-department ERP on Ragic, NT$20k&lt;/td&gt;
&lt;td&gt;Never bid&lt;/td&gt;
&lt;td&gt;Skip: not my stack&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mobile game, no budget&lt;/td&gt;
&lt;td&gt;Never bid&lt;/td&gt;
&lt;td&gt;Skip: not my stack&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shopify theme edits&lt;/td&gt;
&lt;td&gt;Never bid&lt;/td&gt;
&lt;td&gt;Skip: not my stack&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phone farm for social accounts&lt;/td&gt;
&lt;td&gt;Never bid&lt;/td&gt;
&lt;td&gt;Skip: breaks platform rules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ragic to CRM migration, NT$500k-1M&lt;/td&gt;
&lt;td&gt;Walked away&lt;/td&gt;
&lt;td&gt;Pay (wrong)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;It agrees with every lead I skipped except the last one. And on the NT$945 lead it says I should have paid, which I'd do again: on paper it was a good lead. What I learned from my own table is that on PRO360 the fee was never the problem. My break-even rate was between 0.7 and 4.2 percent on every lead I quoted. The money I'd actually save is the time spent reading the bad ones, and on Thumbtack-style prices the formula starts to matter.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Best Use of Gemma.&lt;/strong&gt; Gemma 4 E2B is the only model in the project. It runs locally in the browser through WebLLM, held to a custom grammar, and every one of its claims is checked against the post before it can change a verdict. The eval compares it with itself (alone, unchecked, checked) on 60 posts, and every raw output is in the repo.&lt;/p&gt;

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