JavaScript bundling for ZenGM, from 2012 to today

October 27, 2025-

(This is an updated version of a prior blog post, but you don't need to read that old one, this is self contained!)

Every now and then I write a blog post about purely technical issues I've dealt with that have nothing to do with sports or video games. This is another one of those blog posts! Today I want to talk about JavaScript bundling - how it was in the old days when I first started working on Basketball GM; how it's changed over time; and what I'm doing now.

Read more...


Schedule editor

ZenGM now has a schedule editor! I resisted adding this for a long time because it's pretty cumbersome to edit a schedule. In a default BBGM league, there are 1230 games each season, good luck manually specifying them!

But there are other situations where it might make some more sense:

Ultimately, it should be up to you what you want to do with the schedule. And now it is. Here's what it looks like:

Read more...


Streaming JSON parsing with the Web Streams API

As I sometimes do, this post is just me geeking out over some technical detail of the ZenGM codebase that doesn't directly impact gameplay. So maybe it's of interest to some fellow programmers or other people who just want to geek out with me, but for everyone else, I promise the next blog post will be about a new feature :)

ZenGM leagues can get quite large. So large that I need to be careful when importing/exporting them, because there may not be enough RAM to read a large league into memory. For this reason, I take advantage of the Web Streams API to import/export leagues incrementally, meaning you just read in a little bit of the data and a time, process that data, and then discard it before going on to the next little bit of data.

Read more...


Force historical rosters in real players leagues

The latest update to Basketball GM adds a couple new settings that enable some new ways to play historical real players leagues: Force Retire Real Players and Force Historical Rosters.

First, let me describe Force Retire Real Players. When enabled, real players in your league will retire after the same season they did in real life. This works well with the existing Real Player Determinism (RPD) setting, if you want to see career arcs play out as they did in real life. Because previously there would be some cases where a guy would retire in real life, and then he has no BBGM ratings for subsequent years, but he hangs around in your league and possibly progs into a star. That won't happen if players like that are automatically retired!

Read more...


"Randomize teams" improvements

September 4, 2025-

When creating a new Random Players or Custom league, there is a little "Customize" button next to the team selector that brings you to the Customize Teams page. There you can pick how many conferences/divisions/teams you want, and what exactly those teams are. Including both fictional teams filled with random players and real historical teams.

There is also a "Randomize..." button at the bottom that can generate a bunch of stuff for you. That's not new, but it did just get a few new features which I will explain here.

Here's what the "Randomize teams" dialog looks like now:

Read more...


The AI will now trade more than 2 draft picks at a time

August 18, 2025-

For a long time, the trade AI has been hardcoded to never trade away more than 2 picks in a single trade. I did this as a quick fix many years ago to prevent people from scamming the AI out of too many picks. Because some people are able to aquire way too many picks even with this constraint. But ultimately it was an imperfect solution, for two reasons:

  1. It treated 1st round picks and 2nd round picks the same. If it's okay to trade away 2 first round picks, it should definitely be okay to trade away 3 second round picks, but that was not possible. That was always just kind of dumb, and was only done to save a few lines of code.

  2. Instead of a hard limit at 2 picks, I could just make the AI increasingly reluctant to trade away more. So maybe a great offer gets 3 first round picks, but 5 would be nearly impossible.

Read more...


20 new teams

July 15, 2025-

I just added 20 new teams to all the ZenGM games. Thank you to all the users who helped pick team names and to Elliott Strauss for actually making the logos. He's the same designer who made almost all the existing ZenGM team logos.

I'll show all the new teams below, but first I want to mention a few related changes you may notice:

And finally, here are all the new teams:

Read more...


New achievements

July 7, 2025-

I recently realized that there are 4 people who have all the achievements in Basketball GM on insane difficulty. That means I need to add a few more! Although they might make quick work of these, I'm probably fighting a losing battle...

Read more...


Import Real Players, and how you can use it to create custom historical teams

Today I added a new feature to Basketball GM called "Import Real Players". It works similar to the old "Import Players" feature, except instead of you providing a file containing some players to add to your league, it just shows you a list of every single real player in the BBGM historical database. You can pick any age, or even have multiple versions of the same player, at the same age or different ages.

I think that's all pretty straightforward - just enable God Mode go to Tools > Import/Export Players and click Import Real Players.

But I also wanted to write this blog post to explicitly describe how to use this feature for one cool application that several people have asked me how to do over the years. How can you create an entire team (or even an entire league) made up of some particular set of real players?

Read more...


Real players leagues created during the current playoffs now include draft lottery results

In real life, the draft lottery happens in the middle of the playoffs.

In BBGM, the draft lottery happens after the playoffs.

This poses a little bit of a problem when real players leagues are started in BBGM after the draft lottery has happened, but before the playoffs have ended. Because in real life the lottery is over so a lot of people want those results in their BBGM leagues, but in BBGM the lottery hasn't happened yet.

Read more...