FantasyHockeyHelper — Technical Improvements 2023–2024

Tom Pedron
3 min readSep 16, 2023


I’ve been hard at work this summer making some more improvements to for the upcoming season. Below is a summary of the changes.

Points Pools Support

The app now has the concept of “Pool Types”. We still support the “head-to-head categories pools” (as the default pool type) that it was initially made for, but now I also let you configure your rankings for simpler “points pools” where you receive points for the output from your players and get ranked by total points, instead of winning individual categories against an opponent team.

The default values provided for each stat category are based on the default values that Yahoo Fantasy offers, see:

The Choose Stats section toggles between checkbox and numeric inputs based on the chosen Pool type.

“Points pools” have much less focus on balanced-output across statistic categories (and in my opinion are less interesting than categories pools), and were very simple to support with the existing codebase. From feedback from other users of the app and from comments on Reddit, there has been a desire to support “points pools” so I was happy to add it to the app.

I believe that for “points pools”, the best rankings are generated using pro-rated stats and career stats with a recency bias. However, you can generate rankings based on the same offerings offered for categories pools (with the exception of factoring in strength of your drafted team, player age and overvaluing offense).

Note that the Fantasy Score generated for these pools is a total predicted based on all the stats from the period of time factored in, so if you include the last 3 years of stats, then the score will reflect 3 years of stats aggregated. Really, the Fantasy Score is not quite as important as the ranking of a player relative to other players.

Cloud Improvements

Last year I migrated the app’s cloud hosting to Railway after Heroku removed their free tier offerings. This resulted in far more database space at a cheaper cost, allowing me to implement last year’s big feature, time-series rankings during the season. Overall this was a big win!

One thing I had wanted to take care of but had not had the time was a rearchitecting of the system that re-generates stats for players daily during the season. The way that worked previously was that each morning, a script ran on my local computer to scrape new stats from the internet, then made an active connection to the app’s production database (using a Railway shell) and ran a script (a ruby rake task) that would generate and insert new rankings to the database using a local deployment of the app (confusing, I know). This worked fine, but had an annoying hard requirement on my local computer running and having an active authentication with Railway to open the connection to the production database. There were times in the past where one of these things failed while I was away from my computer, resulting in stale stats in the website that I had to manually correct later on.

I have now moved that entire process to Railway as well using a second Railway compute service that spins up daily on a Cron schedule and runs the same process I described above in the cloud, removing the requirement of my local laptop running it. There are some improvements to the script as well to store the scraped stats files in AWS S3 and then load them back from there so that I have a copy of these stats from each day accessible if needed.

I will be on my honeymoon in Italy later this hockey season and this change will save me the worry of leaving my laptop on full-time during those weeks with no way to resolve issues if needed.

Two compute services, one always on for the app to run and one that runs for a minute each morning on a schedule.

Thats about it, I hope you enjoy using the tool this season and if you run into any issues or have any questions or feedback, please reach out! Happy drafting!