Private Seasons Are Here: Play With Your Friends, Not Against Strangers

By Vincent Luder
Published February 11, 2026

HappyCharts just got a massive update: private seasons, a friends system, payments, a redesigned navigation, and a bunch of quality-of-life improvements. Here's everything that changed and why.

If you've ever played a ranked tournament on HappyCharts and thought "this would be way more fun if I could trash-talk my friends while doing it," then this update is for you.

We just shipped one of the biggest updates since the platform launched. And I don't mean "we changed a button color and called it a major release" big. I mean: an entirely new way to play, a friends system, payments, a redesigned navigation, calendar improvements, and a cronjob that makes sure your private seasons actually start and end when they're supposed to. Let me walk you through it.

Friends System

First things first: you can now add friends on HappyCharts. I know, revolutionary concept. But hear me out — this isn't some social media feature where you collect followers for clout. This is practical. You add friends so you can invite them to private seasons.

The whole flow works like you'd expect: send a request, the other person accepts (or doesn't — rejection builds character), and boom, you're friends. There's a drawer that slides in from the side where you can manage everything: your friends list, pending requests, outgoing requests. Clean and simple. No algorithmic timeline, no stories, no "people you may know" nonsense.

Private Seasons: Your Own Tournament, Your Rules

This is the big one. Until now, everyone played in the same public ranked season. Same leaderboard, same rules, same timeline. That's cool for competition, but what if you want to run a private tournament with your trading group? Or challenge a friend to see who's actually better at reading charts?

Now you can. Private seasons let you:

  • Pick your tournament mode: Blitz (fast and aggressive), Casual (the default), or Snail (for the patient traders among us)
  • Set the timeframe: daily, weekly, whatever fits your style
  • Choose a pricing tier: S, A, B, or C — each with different participant limits and durations
  • Set a skip penalty: because skipping every round shouldn't be a winning strategy
  • Get a unique access code: share it with friends so they can join

The whole creation flow walks you through everything step by step. Pick your settings, pay, share the code, and you're live. Your friends join through the code, and you've got your own private leaderboard.

Payments

Speaking of paying — yes, private seasons cost money. We integrated Stripe so you can pay securely. The payment modal handles everything: card details, processing, confirmation. It's connected to our pricing tier system, so different tier levels have different prices.

And here's the thing: if you create a private season but don't pay within 24 hours, it gets automatically cancelled. No zombie seasons cluttering up the database. The system cleans up after itself.

The Calendar Got Smarter

The trading calendar now shows your trading range — so you can actually see which days fall within your season's active period. Before this, you had to mentally track "wait, did my season start on the 3rd or the 5th?" Now it's visual.

We also fixed a sneaky date bug. The calendar was using UTC dates for "today" highlighting, which meant that if you were in a timezone ahead of UTC (basically most of Europe), the calendar could show the wrong day as "today" after midnight. Not anymore. Dates are now calculated from your local time, like they should have been from the start.

The header navigation got a complete overhaul. Before, it was a flat list of links that got cramped on smaller screens. Now it's organized into dropdown groups: "Read & Learn" (articles, book), "Ranked" (leaderboard, tournaments, private seasons), and "Friends."

The dropdowns close when you click a link (which sounds obvious, but you'd be surprised how many sites get this wrong). They also close when you click anywhere outside of them. And on mobile, the burger menu has its own layout that makes sense for small screens.

Small thing, but: we removed the emojis from the navigation links. Cleaner look.

Simplified Tournament Screens

The tournament select screen and the ranked settings screen both got simplified. Less noise, more focus. When you're about to play a tournament, you don't need to be overwhelmed with options. You need to pick your settings and go.

We also changed the trade history from a list to a drawer. Instead of a full page of trades cluttering your view, you pull out a drawer, check your history, and slide it back. Much better for flow.

Season Names Are Locked

One small but important change: once a season is created, the name can't be changed anymore. This prevents confusion on leaderboards and in shared links. You pick a name, you commit to it.

Behind the Scenes: The Cronjob

None of the private season lifecycle stuff works without automation. Seasons need to transition from "upcoming" to "active" when the start date hits, and from "active" to "completed" when the end date passes. If this only happened when someone opened the app, you'd have seasons stuck in the wrong state.

So we built a dedicated cronjob service that runs continuously in its own Docker container. Every day at 00:05 UTC it checks all private seasons and transitions anything that's overdue. Every 6 hours it scans for unpaid seasons older than 24 hours and deletes them. On startup it does a catch-up pass in case it missed anything while it was down.

It's boring infrastructure work. But it's the kind of thing that makes the difference between a platform that "kind of works" and one that actually works.

Removed: Old Multiplayer Lobby System

We ripped out the old multiplayer lobby and tournament system. The lobby discovery, waiting room, multiplayer tournament headers, progress views, the whole lobby store — all gone. Private seasons replace all of that with a cleaner, more focused approach. Less code, fewer bugs, better experience.

What's Next

This update lays the groundwork for a lot more social features. Right now, lifecycle events are logged but there's no notification system yet. That's coming. Season archival, expiry notifications, and more polish are on the roadmap.

But for now: go add your friends, create a private season, and find out who actually has an edge — and who's been getting lucky.