Inspiration

I meet up privately every two weeks with a group of friends to play table foosball. This sport is particularly popular in Germany. There are tournaments and leagues for the game, and in many pubs, you can find a foosball table where you can play against complete strangers and literally feel the emotions on the other side with every goal. My friends and I use very poor apps to shuffle the teams after each round. The existing apps are not good in terms of UX and UI and on top of that, the apps don't even have much in common with Foosball and are generally just team shuffle apps. We also still use pen and paper to count the points. At the end of the year, we add up all the games won and choose the winner of the season. The app is certainly niche, but it solves my personal problem and I want to become the expert with this app, offering software that provides great features for table football enthusiasts like me. In other words, with the app, I can combine two of my passions: table soccer and iOS development. :-)

points list

What it does

The first version of the app includes basic functions, such as creating player profiles, a team shuffle feature, and a ranking list that tracks data on how many games each player has played, as well as their wins and losses.

How I built it

I built Foosball for iOS only (though I plan to expand to more platforms in future updates) and entirely natively. The entire application was developed using Swift 6 and Xcode 16 beta, with support for iOS 17 to ensure a broad range of users can access it immediately after launch. For the architecture, I used the classic MVVM pattern, using SwiftUI as the UI framework and the ViewModels are each StateObject variables within these views. I kept it simple and am quite happy with the codebase.

Challenges I ran into

There were certainly challenges with the app. One major challenge was deciding which features to include in the first version and which to save for future updates. I had to make compromises, and my wife often reminded me to stay focused and ship the product. Time was also a challenge. During the hackathon, I was on my honeymoon for two weeks and decided of course not to bring my laptop. As a result, time became increasingly tight towards the end, and I went through a pretty stressful period, to be honest. But the fun of building it far outweighed the stress!

A technical challenge was SwiftData. Shortly before launch, I rewrote the entire data logic and reverted to using good old JSON, saving my model locally on devices with my custom-built LocalStorageManager. This allowed me to have precise control over which data would end up in iCloud and which wouldn’t. SwiftData felt like too much magic for me, and when the app crashed, I had little visibility or control over what was going wrong in the background with that framework.

Although I reported everything I could publicly (I didn't try to hide anything or put a positive spin on everything, but trusted the #BuildInPublic idea completely, even if the development wasn't always colorful and pretty), I was relatively happy that I was able to contact a good friend via iMessage while I was building, and that he was simply willing to listen to my technical problems. That way, I didn't feel completely alone while I was developing, as my toots on Mastodon weren't answered very often or quickly (certainly also because of the lack of followers).

Accomplishments that I am proud of and what I learned

I'm proud of the BuildInPublic toots on Mastodon. I have never publicly built a product from scratch to launch. I've often read that people can learn the #BuildInPublic skill, and I think I've got the hang of it. It's a new personal skill I've developed. Furthermore, I had no experience with in-app purchases. Subscriptions were a new topic for me, and I had to read up on them during ShipAton. With the help of the RevenueCat SDK, I managed this relatively easily and am happy to add this skill to my list of experiences.

What's next for Foosball

I had to cut a lot of features for Foosball due to time constraints. The full vision for the app is far from realized. Through #BuildInPublic, some users have helped me refine the vision of the app, which I’d like to present here: It will be a pure iCloud app. At the moment, I store the data completely offline on the device, with iCloud as a supplement (if activated). There will also be a public database for the app, where shared games are tracked collectively if users have connected with each other as friends. In this way, I want to encourage other players in the same group to start a foosball game, the result of which I can then see in my app. It will be a sort of "social network" between a private and public database. This is why the data logic was so important to me to have complete control over which data ends up in iCloud.

I plan to monetize the app through a subscription. This will also include player profiles with their own statistics, an export function, and possibly a limited number of games created per day, unless you're a pro user.

I see a lot of potential! The market is large! :-)

Best regards Onur

kixx hamburg

Built With

Share this project:

Updates