<?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: chic.alors93</title>
    <description>The latest articles on DEV Community by chic.alors93 (@chic_99800ce9c10c).</description>
    <link>https://dev.to/chic_99800ce9c10c</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%2F3865920%2Fac91d919-eee3-4b2c-840f-364f4ac34d76.png</url>
      <title>DEV Community: chic.alors93</title>
      <link>https://dev.to/chic_99800ce9c10c</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/chic_99800ce9c10c"/>
    <language>en</language>
    <item>
      <title>I Built an EPL Match Prediction Service Solo with Claude Code (and I'm Not Really a Frontend Dev)</title>
      <dc:creator>chic.alors93</dc:creator>
      <pubDate>Tue, 07 Apr 2026 13:16:41 +0000</pubDate>
      <link>https://dev.to/chic_99800ce9c10c/i-built-an-epl-match-prediction-service-solo-with-claude-code-and-im-not-really-a-frontend-dev-2ggl</link>
      <guid>https://dev.to/chic_99800ce9c10c/i-built-an-epl-match-prediction-service-solo-with-claude-code-and-im-not-really-a-frontend-dev-2ggl</guid>
      <description>&lt;p&gt;I'm a backend-leaning developer working at an ed-tech company in Korea. I wanted to build something on the side — a football prediction service for the English Premier League. The problem? I hate writing CSS. I'm slow at React. And I had maybe 2–3 hours a week to work on it.&lt;/p&gt;

&lt;p&gt;So I leaned fully into vibe coding with Claude Code. Here's what happened.&lt;/p&gt;




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

&lt;p&gt;&lt;a href="//xkick.app"&gt;&lt;strong&gt;XKick&lt;/strong&gt;&lt;/a&gt; is an AI-powered EPL match prediction service. Every matchday, it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pulls live match data from the API-Football / AllFootball APIs&lt;/li&gt;
&lt;li&gt;Runs a prediction model based on recent form, lineup data, player grades, and historical stats&lt;/li&gt;
&lt;li&gt;Generates match insights and predicted lineups&lt;/li&gt;
&lt;li&gt;Shows win probabilities for each fixture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The stack: &lt;strong&gt;FastAPI + PostgreSQL&lt;/strong&gt; on the backend, &lt;strong&gt;Next.js&lt;/strong&gt; on the frontend. Deployed on a VPS. Built almost entirely through Claude Code sessions.&lt;/p&gt;




&lt;h2&gt;
  
  
  My Workflow
&lt;/h2&gt;

&lt;p&gt;I run everything inside &lt;strong&gt;cmux&lt;/strong&gt; (a terminal multiplexer) with tmux panes. One pane for Claude Code, one for the dev server, one for logs.&lt;/p&gt;

&lt;p&gt;My typical session looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open Claude Code in a tmux pane&lt;/li&gt;
&lt;li&gt;Describe what I want: &lt;em&gt;"Add a data pipeline that syncs player grades after each matchday and stores them in the lineup_predictions table"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Claude writes the code, runs tests, fixes errors&lt;/li&gt;
&lt;li&gt;I review the diff and either approve or tweak the prompt&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's basically it. I'm not writing code from scratch — I'm directing.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Part That Surprised Me
&lt;/h2&gt;

&lt;p&gt;The biggest win wasn't speed. It was &lt;strong&gt;data integrity&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;At one point I had a nasty bug: mixed fixture IDs from two different data sources (FD and AF) were colliding in my matches table. Predictions were running against the wrong matches. Six thousand rows of bad data.&lt;/p&gt;

&lt;p&gt;I described the problem to Claude Code. It:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Diagnosed the root cause (ID namespace collision)&lt;/li&gt;
&lt;li&gt;Wrote a full reset pipeline (&lt;code&gt;full_reset_af.py&lt;/code&gt;) — 11 steps covering schema reset, team/match import, player sync, events, lineups, grades, simulation, insights, translation, prediction evaluation, params rebuild, and lineup prediction backfill&lt;/li&gt;
&lt;li&gt;Ran the whole thing and verified row counts at each step&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That would have taken me a full weekend alone. With Claude Code, it took one session.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Claude Code Is (and Isn't)
&lt;/h2&gt;

&lt;p&gt;It's not magic. You still need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understand the architecture well enough to describe what you want&lt;/li&gt;
&lt;li&gt;Review every diff — Claude makes mistakes, especially with complex joins or multi-step transactions&lt;/li&gt;
&lt;li&gt;Know when something is overcomplicated and push back&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What it removes: the friction of translating intent into boilerplate. The "I know what this should do but I don't want to write the migration" problem. That's gone.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Honest Numbers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Time to MVP&lt;/strong&gt;: ~3 weeks of evenings and weekends&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lines of code written by hand&lt;/strong&gt;: maybe 5%&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bugs introduced by Claude&lt;/strong&gt;: yes, several — but it also fixed most of them&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Would I do it again&lt;/strong&gt;: absolutely&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;If you're into EPL, check out &lt;strong&gt;xkick.app&lt;/strong&gt; before the next matchday. Predictions go up a day before kickoff.&lt;/p&gt;

&lt;p&gt;And if you're a developer curious about vibe coding as a real workflow (not just a demo), happy to answer questions in the comments.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Tags: claudecode, ai, sideproject, webdev, football&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;P.S. This article was also written by Claude. Vibe coding goes all the way down.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>vibecoding</category>
    </item>
  </channel>
</rss>
