The app opened signups for its first sitewide season. Season 0: Founding Heroes sits on the homepage now, visible without an account, open to every account, first scoring day September 1. Around it competitions learned share links with real previews, a one-competition-at-a-time rule, a start-day email. The site wears a new knight mark. Underneath, the Notion API migration closed for good. 132 changes shipped across the app and the site, carried by 20 production deploys. Tuesday alone saw 39 merges.
Sprint map
One row per story arc, one column per day.
| Mon 10 | Tue 11 | Wed 12 | Thu 13 | Fri 14 | Sat 15 | Sun 16 | |
|---|---|---|---|---|---|---|---|
| Season Zero opens its doors | |||||||
| A new coat of arms | |||||||
| Notion's new API, closed out | |||||||
| Scores you can trust | |||||||
| Removed habits keep their history | |||||||
| A warmer welcome | |||||||
| Account safety, quietly | |||||||
| Under the hood |
Saturday and Sunday show no merges. Everything had landed by Friday evening.
Merges per day
The arcs
Leading with the season, then in rough chronological order.
Season Zero opens its doors
Competitions used to hide behind an account. Now the homepage shows the current featured competition to everyone: Season 0: Founding Heroes, running through September, joinable the moment you have connected your tracker. Sharing followed. Every competition has a share link whose preview carries the competition's real name, so an invite looks like what it is before anyone signs up. One rule keeps the scoreboard honest: an account rides in one competition at a time; try to join a second and the app says so plainly instead of failing in silence. On the day a competition begins, every participant gets a starting-gun email. Whoever finishes a featured season earns a badge that stays on their account.
A new coat of arms
The product has a new mark: a knight. It now fronts the site header, the favicon, the social preview cards, the cover art. The old mark served since the first prototype; the knight fits where the product actually went, with its seasons, duels, taverns and badges. A sweep of small site fixes rode along: the featured blog post stacks properly on phones, preview cards stopped cropping their edges, dialog buttons sit centered on small screens, wrapped text on the front page centers cleanly.
Notion's new API, closed out
Last week the nightly sync's read path switched to Notion's new data-source model. This week the write paths followed, then every remaining call was unified onto one current API version. That closes the migration for good. The sync also learned about the trash: a journal database sitting in Notion's trash used to be a blind spot, now the overnight run recognizes it, clears its cached references and repairs the connection where repair is possible. The widget heals a stale database reference on demand instead of showing an error.
Scores you can trust
Freeze days protect your lifetime totals now instead of quietly eroding them. Freeze credit lands in the week it belongs to rather than leaking across a Sunday boundary. Days off in a duel are capped, counted, shown, so a duel average cannot be gamed by sitting in the tavern. Points from pooled habits respect the rest-day cap too. Weekly statistics are recomputed from the raw daily records, which lets corrections flow through history instead of freezing old mistakes in place.
Removed habits keep their history
Removing a habit used to be a small goodbye: add it back later and it started from zero. Now the history survives. Re-add a removed habit from the edit screen and its records come back with it. The days in between count for nothing on either side of the ledger, so the gap does not count against your streak.
A warmer welcome
The path from an invite link to a working account is continuous now: sign up from a duel or competition invite, confirm your email, land back where the invite pointed instead of on a blank dashboard. The widget picked up a stack of comfort fixes. Insight sparklines got their labels straightened. The heatmap tucks away behind a toggle the widget remembers. Notifications queue politely instead of overwriting each other. A weekly habit about to slip shows an at-risk badge before the week is lost. Fresh widget versions roll out to embeds on their own. Past competitions in a shared widget follow the person you are viewing, not you.
Account safety, quietly
Sign-in and confirmation-mail requests are rate limited against repeated attempts. Password-reset links expire after 24 hours. The widget's access token can be rotated if it ever leaks. Payment webhooks became idempotent, so a duplicated event cannot apply twice. Deleting an account now cleans up competition history correctly in every case we could construct. A few quieter hardening items shipped alongside; those stay unnamed on purpose.
Under the hood
The site jumped four major framework versions in one sitting, switched strict type checking on to keep itself honest, then gained a real unit-test runner. The server swapped its JSON engine for the current generation, took a newer token library, got a proper database connection pool. Builds and hosting moved to the current runtime LTS together. Dead dependencies came out by the handful. The architecture test suite runs with zero grandfathered exceptions now. Analytics run self-hosted, cookieless, served from our own domain: no third-party analytics script loads at all.
Compiled from the week's merge history across the Notion Habit Heroes app and this site, August 10 to August 16, 2026. The empty weekend bars are real: everything had merged by Friday evening.
