Dev Logs: A World Cup companion app, and a love letter to my own journey
An attempt to find my ways once more and learning how to love what I am doing again.
Well, it has been a while since I have written something here, and firstly, I want to apologise for that. Life has gotten in the way and I have to prioritise what is more important at the moment, and blogging is quite low on my priority order. Nonetheless, it is World Cup season and I want to join the rest of the football analytics community in doing something for one of the biggest occasions on the football calendar. That has led to the project above, the World Cup Anything & Everything companion app!
The what app?
The name for the app sounds terrible, I know, but I cannot come up with a good name for an app that is meant to be multi-purposed. So it just has to be the ‘Anything & Everything’ app for now until I can come up with a better name for it without any help from generative AI models.
Coming up with a World Cup related project in this day and age sounds easy enough given the availability of gen AI that can suggest ideas for someone to work on. But I want none of that, mainly because it does not feel human to be fed an idea that will be worked on, that is a machine’s job. I miss the feeling of coming up with an idea that I resonate with, no matter how shitty that idea is, because in the end that is my own idea and it does not come from an aggregated AI model.
One original idea that I immediately crossed off the list is building a machine learning model for predicting the results. There are a million of predictive models specifically and ML models being made by other amazing data enthusiasts out there, the community does not need another shitty model with an accuracy of below 80%. It does not help that I am also quite burnt out, which means getting into the mindset to create an ML model is a challenge itself.
A football app is nothing new either because there is a football-related Streamlit app being made and shared on social media every few weeks. Not to discredit anyone’s work, but to me, Streamlit dashboards have become saturated due to the easiness to make one with the help of ChatGPT or Claude. Plus, working on the Match Analysis Tool 2.0 helped me realised that Streamlit can be quite limiting with its capability to go beyond what have already been made by the Streamlit team themselves. Because it is Python-based and Python is not meant to be used for web developing, there is only so much that Streamlit can do.
Thus, I wanted to build upon what I did with the MAT 2.0 and made good use of my web developing knowledge to make a similar app using TypeScript and Svelte. Personally, given that Streamlit is pretty much overused by the football analytics community at this point, it seems like the natural next step to move towards an actual language that is meant to develop web apps. One reason why I think not many people have done so is because there is a lack of football-focused packages or libraries for JavaScript and TypeScript like mplsoccer for Python, thus requiring plenty of custom-built functions for each use case.
I am also choosing not to rely on scraping data from any specific sources because that can get into the grey area of legality that I cannot be bothered to deal with. During the tournament, I will be relying on getting data via Wikipedia’s API and build my own data structure for the entire app. Ideally, that data structure would be in a cloud service somewhere and combine with either SQL and MySQL, but I am too lazy to set those up so JSON files will work for now. Not that I am going to sustain the lifecycle of this app beyond the tournament anyway. However, I will do a few patches after the World Cup ends if there is public data available for the entire tournament.
What does it look like?
This is where the part about the ‘love letter’ comes into play, because this companion app is meant to reflect some of the things that I enjoy about following football as a whole. Instead of having to do those things manually like when I was a kid, these things can be done manually by automated jobs and workflows, which is also a reflection on how much I have learned about computer science as a whole so far.
Schedule



Schedule is meant to be my attempt at replicating those tournament wallcharts that used to be sold at magazine stalls or supermarkets before a big tournament started. It was fun and engaging to keep up with the results of all matches and manually fill in the results as the tournament progressed, or at least that was how I felt as a kid. With everything being digital nowadays, there is less of a need to buy and update those wallcharts anymore since most fans now have access to football apps like Fotmob or Sofascore, or websites that update results in almost real time.
Technically speaking, this page is not doing anything different to most apps out there. But with this page, I can customise how results are displayed and expand on those results to include more information that I want to see, like xG, possession percentage, etc., things that wallcharts cannot have due to how little spaces available on an A3 or A2 paper.
Teams


I am a football nerd now and I was also a football nerd as a kid, which meant I really enjoyed doing my homework on teams that would be playing in a tournament. The process of discovering which team each player played for, learning their squad numbers, each team’s fixtures was quite satisfying for me in past tournaments. It was one of the reasons why I am doing what I am doing now because I was eager to learn about players that I did not know and did not play in one of the top 5 European leagues.
Nowadays I have an unnecessary encyclopedia of football players in my brain thanks to football analytics work and Football Manager, but I still like learning and scouting players that have not come up on my radar before. Thus, this Teams page act like a resource for me to do my own homework on players from all teams and get to know where they currently play.
This additional feature is still in the work, but I want to include a Tactical DNA Breakdown for each team to highlight their playing style during the tournament. That is also part of the homework that I will be doing because I hope to watch as many matches as I can and make my own observations on each team’s playing style, then rank those attributes on a scale of 1 to 5. It is a bit of a blend between current me enjoy seeing the tactical aspects of each match and past me wanting to learn more about football stats and tactics.
Preview
Preview is also part of me wanting to do homework, but along with the Teams page above, it is also an homage to those bulky tournament preview handbooks of ye olden days. This page is meant to show all information that I can get my hands on for each match, thus giving me an idea of what to expect in upcoming matches. I am currently unsure where those insights and information will go because I am not doing any predicting, betting, or fantasy leagues for this World Cup, but I guess I will try to use it for future projects or articles.
The entire page is currently in the workshop so I do not have any preview images here, but I might update this section when I have a version that I am happy with.
Live
Live is a page for current and future me to scout players and analyse matches. I want this page to act somewhat like a note-taking page that I can use while I watch the matches, whether it is live or a replay. Most of the information contained in this page will also be from me manually updating from publicly available sources like Fotmob or FIFA because I want to keep the scraping process strictly limited to just Wikipedia.
Figuring out a way to store my own notes, build a somewhat working note-taking app, and link those data together in a meaningful way is a big project on its own. But I do not really shy away from a challenge, so I will try to find a solution that is as efficient as possible and work ‘well enough’. It is one of the challenges that I am learning to overcome as a perfectionist, which is learning when to say ‘it is good enough’ and not chasing the unrealistic standard that I set for myself.
Data
As I have mentioned, I want to keep this app strictly to just scraping data from Wikipedia API. It also means I am making things harder for myself to extract meaningful data from HTML pages and build a data structure from only JSON files, which I totally agree. But there are a few reasons for why I made this decision.
Firstly, it is very hard nowadays to get good football data when most of the top data providers charge a crazy amount for a subscription to their raw data API. It is cheaper to use their data via their own platform, but you then lose the ability to build a custom solution and have to be restricted to what are available. For some, that is not a problem because it serves the purposes that they want to achieve. But for me, I want to explore beyond what is offered by data providers without having to spend thousands of dollars every month. Basically, I hate corpos and the monopoly that they currently have, so I want to build my own solution.
Secondly, I have the technical abilities and knowledge to build a custom solution, so the question simply becomes ‘why not?’. There are going to be challenges along the way, but I like to push myself through a challenge and really enjoy the process of coming up with a solution to solve that challenge. It might not be the best or the most optimal solution, but ‘best’ and ‘optimal’ can both be subjective and unobtainable at the same time. It is a solution that I can come up with at this point in time, and I want to learn to be content with that solution until I know more and improve on that solution. Part of the learning process, I suppose.
Finally…
I do not intend for this project that seeks engagements on social platforms as I have done that for a while and it has led me to burnouts on so many occasions. Just like the MAT 2.0, these two projects are meant for my creative soul and it is hopefully a part of the healing process.
I have taken a step back from working on football analytics projects and observed other creative people thriving at doing their own things, which explains the absent period so far. That period helped me realised that people are the most creative when they enjoy what they are doing and they are creating things from the heart and soul instead of the brain. That is where I want to get back to and I do not want to rush the process, I understand that it is going to be a long journey to get back to loving what I do and that is okay. So I just want to apologise for being inconsistent for the foreseeable future, but I hope to get back to my best self and create more amazing things.
For now, though, if you want to see how messy my codes and repository organisation are, feel free to take a look at the repository for this project here! Don’t blame that I did not warn you before viewing the dumpster fire that is my repo.






