<?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: Simon Wu</title>
    <description>The latest articles on DEV Community by Simon Wu (@simonwu).</description>
    <link>https://dev.to/simonwu</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3944996%2F6208f2b2-4a3e-48ac-be87-ef62c57c8283.jpg</url>
      <title>DEV Community: Simon Wu</title>
      <link>https://dev.to/simonwu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/simonwu"/>
    <language>en</language>
    <item>
      <title>I let Gemma 4 analyze my credit card statements so I wouldn't have to</title>
      <dc:creator>Simon Wu</dc:creator>
      <pubDate>Sun, 24 May 2026 05:44:43 +0000</pubDate>
      <link>https://dev.to/simonwu/i-let-gemma-4-analyze-my-credit-card-statements-so-i-wouldnt-have-to-4498</link>
      <guid>https://dev.to/simonwu/i-let-gemma-4-analyze-my-credit-card-statements-so-i-wouldnt-have-to-4498</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/google-gemma-2026-05-06"&gt;Gemma 4 Challenge: Build with Gemma 4&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Swipey, a local-first, privacy focused web app for people juggling multiple credit cards across multiple banks. Drag in a CSV of transactions from Chase or Capital One, pick a month, and Gemma 4 produces a digest of that month's spending: a spotlight, a few patterns, and a few suggestions. It also proposes "groups" that bundle similar transactions and sum the spend, which you can edit inline.&lt;/p&gt;

&lt;p&gt;The problem: I have four credit cards. I enjoy collecting credit card reward points (anyone else?!) to help subsidize travel costs &lt;sup id="fnref1"&gt;1&lt;/sup&gt;. This usually means chasing different category bonuses on each (one for dining, another for travel, a third for everything else). Past two or three cards, no single bank app shows you the whole picture, and the interesting questions ("what was my biggest category this month?", "how does this compare to last month?") get hard to answer.&lt;/p&gt;

&lt;p&gt;The first version shipped transaction-level data to Claude every month. Swipey on Gemma 4 keeps the same workflow but runs inference on Cloudflare Workers AI.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Workflow
&lt;/h3&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/mnb9ENfcr7Q"&gt;
  &lt;/iframe&gt;
&lt;br&gt;
&lt;em&gt;Note: Transaction data was mocked for demo purposes&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Gemma 4 powered features
&lt;/h3&gt;

&lt;p&gt;Monthly insights digest (spotlight, patterns, suggestions)&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.amazonaws.com%2Fuploads%2Farticles%2Fp7x6za9kr2fwzpc9cs1n.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%2Fp7x6za9kr2fwzpc9cs1n.png" alt=" " width="799" height="141"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Transaction grouping that bundles similar merchants/themes and sums their spend&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.amazonaws.com%2Fuploads%2Farticles%2F02tgpgouipmbf8qqb9un.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%2F02tgpgouipmbf8qqb9un.png" alt=" " width="800" height="280"&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/simonwu-git" rel="noopener noreferrer"&gt;
        simonwu-git
      &lt;/a&gt; / &lt;a href="https://github.com/simonwu-git/swipey" rel="noopener noreferrer"&gt;
        swipey
      &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;Swipey&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A local-first, privacy-focused way to manage credit card spend across multiple banks, built with Next.js and PostgreSQL.&lt;/p&gt;
&lt;p&gt;Supports Chase and Capital One CSV exports.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Work in progress, local use only.&lt;/strong&gt; This project is intended to run on your own machine against a local database. API routes have no authentication. If hosted, anyone who can reach the server can read or modify your transactions. The Docker Compose setup ships with default dev credentials that are not safe for any deployed environment. Don't expose this to the public internet as-is.&lt;/p&gt;
&lt;/blockquote&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;
&lt;strong&gt;Drag &amp;amp; Drop CSV Upload&lt;/strong&gt;: Upload transaction CSV files with a modern drag-and-drop interface&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Account Management&lt;/strong&gt;: Create and manage multiple bank accounts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transaction Preview&lt;/strong&gt;: Preview transactions before import with duplicate detection&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Bank Support&lt;/strong&gt;: Supports Chase and Capital One CSV formats&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Tech Stack&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: Next.js 14, React, TypeScript, Tailwind CSS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: Next.js API Routes…&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/simonwu-git/swipey" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  How I Used Gemma 4
&lt;/h2&gt;

&lt;p&gt;Model: &lt;code&gt;@cf/google/gemma-4-26b-a4b-it&lt;/code&gt; (the 26B MoE variant) on Cloudflare Workers AI. This is the only Gemma 4 variant Cloudflare hosts as of May 2026, but here's how I would have picked between variants:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gemma 4 2B and 4B: ideal for light use cases where memory is tight, like edge, or on-device deployments. In my opinion, may be too small for Swipey's synthesis across ~100 transaction rows.&lt;/li&gt;
&lt;li&gt;31B dense: highest quality of the lineup but also most parameters. First token latency will be higher than 26B.&lt;/li&gt;
&lt;li&gt;26B MoE: Latency is managable while the model maintains adequate quality. Just the right variant for Swipey's use case.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One caveat during the migration: Gemma 4 needed a stricter setup than Claude to emit my parser's format reliably. The fix was a system prompt insisting on the exact format, plus wrapping the user prompt in XML with an &lt;code&gt;&amp;lt;output&amp;gt;&lt;/code&gt; block showing the shape to mirror. Since migration, every run has parsed cleanly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Looking ahead
&lt;/h2&gt;

&lt;p&gt;What stood out most is how capable open-source models like Gemma 4 have become at the kind of work Swipey leans on: categorizing/grouping transactions, summarizing a month of spend, and surfacing patterns. For this use case, Gemma 4 was a quality drop-in replacement against Claude. As these open-source models keep improving, I expect that gap to keep narrowing.&lt;/p&gt;

&lt;p&gt;Swipey has already surfaced spending habits I didn't even think of to track. It's an incredibly exciting time to see how AI-powered features augment into existing workflows and surface insights I would have otherwise missed.&lt;/p&gt;

&lt;p&gt;Now if you'll excuse me, Gemma 4 has some thoughts about my dining out habits that I have to reflect on. Cya!&lt;/p&gt;




&lt;ol&gt;

&lt;li id="fn1"&gt;
&lt;p&gt;Careful. This only works if the balance is paid off in full each month. Otherwise the interest eats the perks many times over. The rewards stack up to something real if done responsibly. ↩&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>devchallenge</category>
      <category>gemmachallenge</category>
      <category>gemma</category>
    </item>
  </channel>
</rss>
