<?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: hongpengtan0-max</title>
    <description>The latest articles on DEV Community by hongpengtan0-max (@hongpengtan0max).</description>
    <link>https://dev.to/hongpengtan0max</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%2F4186243%2Fb1b00df6-0e0f-479f-8ed5-c28b6e838700.png</url>
      <title>DEV Community: hongpengtan0-max</title>
      <link>https://dev.to/hongpengtan0max</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hongpengtan0max"/>
    <language>en</language>
    <item>
      <title>GigPitch: I lost 15 logo contests in a row, so I built a local AI that writes my bids</title>
      <dc:creator>hongpengtan0-max</dc:creator>
      <pubDate>Thu, 15 Oct 2026 08:06:49 +0000</pubDate>
      <link>https://dev.to/hongpengtan0max/gigpitch-i-lost-15-logo-contests-in-a-row-so-i-built-a-local-ai-that-writes-my-bids-1m2j</link>
      <guid>https://dev.to/hongpengtan0max/gigpitch-i-lost-15-logo-contests-in-a-row-so-i-built-a-local-ai-that-writes-my-bids-1m2j</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;Since October 4, I've been trying to earn my first money as a freelance logo designer on 猪八戒 (Zhubajie), China's largest gig marketplace. I entered &lt;strong&gt;15 logo design contests (比稿)&lt;/strong&gt; and won &lt;strong&gt;zero&lt;/strong&gt; of them. Total earnings: &lt;strong&gt;¥0&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Looking back, the designs weren't the main problem. The problem was everything around them: reading vague briefs, guessing a price, and writing the same bid again and again in Chinese and English, often at 2 a.m. Every losing contest cost me an hour of unpaid admin work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GigPitch&lt;/strong&gt; is the tool I wish I'd had from day one. You paste a gig brief from 猪八戒, Upwork, Fiverr, or anywhere else, and about 20 seconds later you get:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Brief analysis&lt;/strong&gt;: brand, industry, style keywords, whether VI or packaging is needed, urgency, and budget&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A quote suggestion&lt;/strong&gt;: calculated by transparent rules, with every line of the reasoning shown, and a warning when the client's budget is below it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bilingual bid text&lt;/strong&gt; in 中文 and English, citing &lt;em&gt;my own&lt;/em&gt; most relevant portfolio cases&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A deliverables checklist&lt;/strong&gt; (formats and versions), so scope is clear before the client says yes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Three logo concept prompts&lt;/strong&gt; to kick off the actual design&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Who would pay for it?&lt;/strong&gt; Solo designers and small studios who bid on many small jobs. Saving 30 to 45 minutes per bid is worth far more than a small monthly fee, and because the tool runs locally, it costs almost nothing to operate.&lt;/p&gt;

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

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/AVw0skfFAnE" width="710" height="399"&gt;
  &lt;/iframe&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%2Flre5hf3g99xgrrhxoqk1.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%2Flre5hf3g99xgrrhxoqk1.png" alt="GigPitch result for a coffee-shop brief" width="800" height="953"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Futz5p1nz7j8gt0qsyop4.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%2Futz5p1nz7j8gt0qsyop4.png" alt="GigPitch result for an English yoga-studio brief" width="800" height="1061"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/hongpengtan0-max" rel="noopener noreferrer"&gt;
        hongpengtan0-max
      &lt;/a&gt; / &lt;a href="https://github.com/hongpengtan0-max/gigpitch" rel="noopener noreferrer"&gt;
        gigpitch
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Local open-source AI bid assistant for freelance designers (Mastra + Gemma)
    &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;GigPitch 🎯&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;A local bid assistant for freelance designers.&lt;/strong&gt; Paste a gig brief from 猪八戒, Upwork, Fiverr, or anywhere else. GigPitch returns:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Brief analysis&lt;/strong&gt;: brand, industry, style keywords, whether VI is needed, urgency, budget&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quote suggestion&lt;/strong&gt;: computed by transparent pricing rules (not invented by the model), with the reasoning shown&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bilingual bid text&lt;/strong&gt;: one Chinese and one English draft, citing your &lt;em&gt;own&lt;/em&gt; matched portfolio cases&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deliverables checklist&lt;/strong&gt;: file formats and versions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logo prompt ideas&lt;/strong&gt;: three concepts for an image generator&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Everything runs &lt;strong&gt;on your own machine&lt;/strong&gt;: &lt;a href="https://ai.google.dev/gemma" rel="nofollow noopener noreferrer"&gt;Gemma 3&lt;/a&gt; (open weights) served by &lt;a href="https://ollama.com" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt;, orchestrated by a &lt;a href="https://mastra.ai" rel="nofollow noopener noreferrer"&gt;Mastra&lt;/a&gt; workflow. No API keys, no per-token bills, and client briefs never leave the machine.&lt;/p&gt;
&lt;p&gt;Built for the DEV × Hacktoberfest 2026 Open-Source AI Challenge, Week 2 ("Side Hustle").&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Architecture&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;brief ─▶ [Mastra step: analyze]  Gemma 3 → JSON (tolerant parser + rule guards)
      ─▶ [Mastra step:&lt;/code&gt;&lt;/pre&gt;…&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/hongpengtan0-max/gigpitch" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;MIT licensed. Run it with &lt;code&gt;ollama pull gemma3:1b &amp;amp;&amp;amp; npm install &amp;amp;&amp;amp; npm start&lt;/code&gt;.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model:&lt;/strong&gt; Gemma 3 (open weights), run &lt;strong&gt;locally with Ollama&lt;/strong&gt;. I used &lt;code&gt;gemma3:1b&lt;/code&gt; because my box only had about 3 GB of free RAM, and it runs CPU-only at roughly 44 tokens per second. With more memory, switching to &lt;code&gt;gemma3:4b&lt;/code&gt; is a single environment variable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orchestration: Mastra.&lt;/strong&gt; GigPitch is a Mastra &lt;code&gt;createWorkflow&lt;/code&gt; with three &lt;code&gt;createStep&lt;/code&gt;s around a Mastra &lt;code&gt;Agent&lt;/code&gt; backed by Gemma (via &lt;code&gt;ollama-ai-provider-v2&lt;/code&gt;):

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;analyze&lt;/code&gt;: Gemma extracts structured JSON from the brief.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;quote&lt;/code&gt;: a &lt;strong&gt;deterministic&lt;/strong&gt; pricing function plus retrieval from my portfolio file (&lt;code&gt;cases.md&lt;/code&gt;). I deliberately kept money out of the model's hands.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;write&lt;/code&gt;: four Gemma calls in parallel (Chinese bid, English bid, checklist, prompts).&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Making a 1B model reliable.&lt;/strong&gt; Small models return almost-valid JSON (I got a stray curly quote &lt;code&gt;”&lt;/code&gt; that broke &lt;code&gt;JSON.parse&lt;/code&gt;) and sometimes miss obvious facts. The fixes:

&lt;ul&gt;
&lt;li&gt;a tolerant, field-by-field JSON recovery parser&lt;/li&gt;
&lt;li&gt;rule-based guards for VI, urgency, budget (including &lt;code&gt;$&lt;/code&gt; budgets converted to ¥), and brand names in 「」 or quotes&lt;/li&gt;
&lt;li&gt;prompt rules plus post-filters: no self-praise like "经验丰富" or "experienced", no Chinese characters in the English bid, prices in the right currency, one &lt;code&gt;- [ ]&lt;/code&gt; checklist format, no &lt;code&gt;[Client Name]&lt;/code&gt; placeholders, and no claims that drafts already exist&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UI:&lt;/strong&gt; one HTML file and a small Express endpoint. &lt;code&gt;npm test&lt;/code&gt; runs the whole workflow end to end.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cost decides whether the business works.&lt;/strong&gt; My actual revenue so far is ¥0. A side hustle that loses money on API calls before it lands its first client is not a side hustle. With open weights on my own CPU, each extra bid costs nothing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client data stays private.&lt;/strong&gt; Briefs include unreleased brand names and business plans. Nothing leaves the machine, which I can tell clients truthfully.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No lock-in, works across borders.&lt;/strong&gt; I'm moving between China and the US, and not every closed API works or bills smoothly in both places. Ollama + Gemma + Mastra works the same anywhere and keeps working even if a vendor changes its pricing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Small models are good enough when the system is designed well.&lt;/strong&gt; With deterministic pricing and rule guards, a 1B open model handles a real niche task, and I can fine-tune it later on my own winning bids.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Mastra&lt;/strong&gt;: the whole pipeline is a Mastra workflow (&lt;code&gt;createWorkflow&lt;/code&gt; / &lt;code&gt;createStep&lt;/code&gt;) around a Mastra &lt;code&gt;Agent&lt;/code&gt; on an open model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma&lt;/strong&gt;: Gemma 3 runs locally through Ollama and handles every language task.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Built with help from an AI coding assistant; I directed the design and tested the outputs.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
