
Last summer, Julia and I drove to Bryson City for her first club soccer team practice. At the time, it felt like a huge moment–our daughter was a rising freshman, but in our minds she was still very much a middle schooler. And now, suddenly, I was dropping her off at a field an entire county away so she could go try out for a team with a bunch of high school kids.
Those high school kids looked decidedly older.
My nerves, my word, my nerves. Every sense of athletic inadequacy in my body welled up to see her jog out onto the pitch and start passing the ball around. What on earth are we doing here? I wondered.
Of course I would never say these things out loud. Rather, when she made the club team, it quickly became clear that the she did, in fact, belong out there. She played an entire season with those girls, competing both on the U17 and U19 teams, matching up with opponents who were bigger or stronger or more experienced. She was a freshman and it showed, but by the end of the club season, she had grown both in skill and in strength.
Not long after, she began working out with the high school team. Julia doesn’t go to Smoky Mountain, so the girls reached out to her. (Of course they reached out to her, they’re in high school, high school kids reach out to each other, they have phones.) I will admit to another round of nerves. Who were these kids? I didn’t know most of them. You can imagine.
The good news is that the high school team’s culture was incredible. They did things together. (This was admittedly another scary-at-first thing. Girls, cliques, etc. I swear I don’t overthink everything. Except I do.) They worked hard. They were terribly responsible. There was a huge group of girls, and there was talk that for the first time, Smoky might be able to field a JV team. The idea of having a developmental roster was huge.
Of course, the odds seemed to me that Julia would end up there. She was a freshman, after all. Even Julia figured that there’d be a natural divide–upperclass students go to varsity. The rest on JV.
Eventually, though, it began to emerge that Julia might make varsity. In the car, on the way home from practices, she worked out that it would be fine either way–she’d either play JV and start and get lots of minutes, or she’d make varsity, spend plenty of time on the bench, and learn from playing more advanced players.
She made varsity.
And indeed, at first, she spent plenty of time on the bench. She certainly saw the field–just as a sub. Initially she was on to give starters a minute or two to rest. She rotated in and out several times, playing all kinds of different positions, including ones she wasn’t necessarily accustomed to playing. She played real time on the field.
Soon, she was a starter. It wasn’t because she’d earned a top roster spot–mostly it was due to a team rule that you couldn’t start a game if you missed the practice before the game, and several team members had missed practice. So Julia started. And she subbed out early. But she subbed back in.
Those early matches were largely non-conference, and the competition was a good mix of easy draws and hard challenges.
One day, Julia got in the car with me after a game. I congratulated her on the win and on her contribution. She gave me a sort of eye-roll, fine response. I asked what it was about. “I barely played!” she said.
I disagreed. “You had good minutes.” She disagreed.
Next match, I resolved to begin keeping up with the minutes.
I initially did this by texting Kelly when she went on the field along with the time on the scoreboard clock. Then, I went back and did some math and counted up the minutes. This was, admittedly, pretty cumbersome, but the net result worked–when the kiddo got in the car at the end of the game, I could congratulate her using quantifiable data.
When I was reporting the game live to Kelly by text, I was also sending along score updates. Eventually, I began to wonder if there was a stats app that I could download on my phone that would make all of this a lot simpler. There were none to be found.
At the same time, I had been reading a lot about how AI tools were becoming very capable of writing computer code. I pulled up ChatGPT and asked for its help in coding an app that would allow me to track stats for Julia’s team. Within a few minutes, I had my first working prototype.
ChatGPT wasn’t very good at writing code in its chat functionality, though. It kept forgetting things. I would ask it to fix one particular bug, and it would lose track of other changes I’d made previously and inadvertently undo them. This got to be pretty frustrating.
Then I read about Codex, which is ChatGPT’s coding platform, and I downloaded a local copy onto my Macbook. The difference was immediate–Codex worked much faster and almost flawlessly. The experience, too, was mind-blowing. I could have a natural conversation with its interface, describing in normal language what I wanted to do, and it would simply code into existence my ideas. Its accuracy was next-level.
I took my initial version out to a soccer match. Parts of it worked, and parts of it were terribly difficult. I broke it a few times. I realized a lot of flaws. There were user experience issues everywhere.
I took these to Codex, and one by one, “we” fixed them–meaning that Codex would rewrite the code, save the file, and I would re-upload it to a folder on my website.
This early version was a simple stats tracker. I could load in players for our team and the opponent’s team, select starters, and then track stats like shots, shots on goal, fouls, corners, cards, and the like. I had an interface when players subbed on and off the field. And because all of these actions were timestamped (I had to manually input the time), I finally had what I wanted–a match log that I could copy and paste back into ChatGPT to then tabulate how many minutes my daughter played.
Yes, this is what happens when I get into a disagreement with Julia.
Eventually, though, two things happened. First, I realized it was kind of fun to log that stats at a match–I paid closer attention and enjoyed the game on a different level. And second, I discovered that ChatGPT couldn’t keep up with a lot of stats.
This created a new problem: I was generating a fair amount of data with these match logs, but I didn’t have anything to do with it that was reliable.
Back to Codex I went.
Soon, it was helping me create a database that would begin logging these matches and tabulating the data for each one to display the stats like any normal sports website might. I could view all of the players’ minutes and stats in my browser. This was, admittedly, really cool to see happen.
Other folks began to notice me in the stands. I had worked through a few iterations of the stats tracker by then, migrating to my iPad because it was easier to see and enter info on. A couple of other parents asked questions. The project was beginning to grow.
By then, I’d coded a couple of public-facing pages that I could share with other people by texting a link. That, in turn, led to the design of a much more user-friendly public website, one that allowed users to select matches, view stats, etc. Although I had stopped using ChatGPT to tabulate the data, I still found it was really good at writing match summaries. I tweaked its writer’s voice to sound like a Premier League reporter, which added a mildly humorous amount of seriousness to its tone. This was, after all, a high school soccer team.
My group of fellow parents in the stands, however, got an enormous kick out of it. I used my Match Reporter GPT to generate pre-match previews, uploading conference standings and other data to help create an informed outlook for the upcoming games.
As we reached the last half dozen games of the season, I had added live stats tracking ability–meaning that I could share a link with others ahead of time and they could follow the match in real time in their browser. The page auto-refreshed every 15 seconds and featured a scoreboard-style container, live stats log, and team stats. When the game ended, the page updated with the match report. Then, I built tables with the full season’s games.
It only made sense at that point to fully commit. I registered DadStats.com, pointed it to the folder on my website, and officially christened the project. I (we? Hard to know how to qualify Codex and ChatGPT) created graphics, layout, and so forth for the entire gambit. Soon, I was sharing pre-match links with my family and other parents by text and Facebook.
A couple of weeks ago, Smoky traveled to Forestview High School in Gastonia to play a second-round 5A state playoff game. Thanks entirely to the nerd-level status I’d achieved this season, I had a full preview story ready to go. The game would be difficult but winnable.
I found my way to the visitor bleachers, opened up my iPad, and loaded the match, ready to document the game and keep others updated on the live stats page. As the public address speaker announced the lineup for Smoky Mountain, I dutifully recorded the starters for the match.
He called out: Number Five, Julia Hogan.
Our kiddo, who only yesterday it seemed I had watched jog onto a field unsure and nervous, was starting a second-round playoff match. I’m pretty sure I levitated from my seat with pride.
It was a tremendous game–both teams played their butts off and were evenly matched. It ended… well, I think you should go read how it ended by reading the match report.
With Julia’s freshman year behind us, I’ve spent a few weeks away from Codex and this project, but this week, I picked it back up. There’s more to do, including adding player profiles so Julia’s stats can accumulate from one season to another and from one team to another if she chooses to play club soccer again. And hopefully there will be a boy’s middle school district soccer season to keep up with for Thomas.
Codex just finished the most recent updates. Time to go upload them.
Leave a Reply