Building in the open
What's new
Every release ships something for your league. The full history lives here. Back home
- v0.1.92026-08-12Latest
- Marketing deep dive: demo league door, rivalry & PWA showcases, live archive stats (#91)
- Let the beta talk back: a feedback bubble on every signed-in screen (#92)
- Say what every page is, to the machines that ask (#90)
- Marketing site rebuild: story-driven pages, drawn-in-code football art, and a real waitlist funnel (#89)
- Leagology talks to Slack (#87)
- Remove the shared-password login bootstrap (#88)
- Claim the root namespace, and stop the front page drawing its own tables (#86)
- Point the root domain at www.leagology.app (#85)
- Marketing site: a real front door, a public players archive, and a waitlist (#82)
- Give a phone its screen back, and let the tab bar carry the league (#84)
- v0.1.82026-08-12
- Keep the mirrored bracket on a wide screen, and run it one way on a phone (#83)
- A league you can keep on your home screen (#81)
- Manager pages: lead with the manager, and give them a profile to lead with (#78)
- Make the postseason readable on a phone, and stop a blue league painting wins green (#79)
- Player pages: say who he played, and who actually owned him when (#80)
- Pin the dashboard rail to the viewport edge (#77)
- Dashboard: one navigation rail, not two (#76)
- Sync on two clocks, so a nightly run stops re-reading finished football (#75)
- Correct the record book's backfill predicate, forward (#74)
- Codebase polish, phase 6: error boundaries and the last streaming holdouts (#73)
- Read the ticker and the score rail from the archive, not from Sleeper on every request (#68)
- Make the optional pages opt-in, per league (#70)
- Codebase polish, phase 5: cache the history reads and the Sleeper client (#72)
- Codebase polish, phase 4: consolidate shared atoms, split the oversized pages (#71)
- Codebase polish, phase 3: dedupe the lib layer (#67)
- Codebase polish, phase 2: dissolve components/_migration into feature folders (#66)
- Codebase polish, phase 1: dead code, unused deps, named-export convention (#65)
- Matchup pages: read the game across, and say what was at stake (#62)
- Give a franchise a section, not one very tall page (#64)
- Apply migrations on main as well as production releases (#63)
- Playoff bracket: one column grid, a title game you can see, and a tab per bracket (#59)
- Schedule: filters in a column, a slate you can scan, and links that say where they go (#57)
- Every team name is a way into that team (#61)
- Score rail: carry the whole season, and say which games mattered (#58)
- Admin: wear the league you are editing, and pick its type set (#60)
- Themes: the accent is the league's, not always red (#56)
- Give every franchise its own history: trophy case, record shelf, trade desk (#55)
- League sites: themes, dark mode, search, a bottom bar, a schedule and rivalries (#54)
- v0.1.72026-08-11
- Hall of Fame: judge a tight end against tight ends, not quarterbacks (#53)
- Managers are addressed by slug everywhere, never by id (#51)
- Serve the schedule from the archive, and make every game a page (#52)
- Hall of Fame: judge the final by who won the season, and let managers knock (#49)
- Manager page: lead with the career line, and name the players behind it (#50)
- Record Book: read it a chapter at a time, and stop crowning the third-place game (#48)
- Run migrations only on production deploys (#47)
- Live pages: read the whole Sleeper history, not just the renewed chain (#45)
- Power rankings, and an honours board that names more than the champion (#46)
- Make the manager the fixture: slugs, name history, DB-backed Teams (#41)
- Split the Hall of Fame into a Record Book and a Hall of Fame (#43)
- Standings: report each manager's lineup ceiling, not just their score (#44)
- Yahoo import: upload any season, exclude the years Sleeper owns, and name the people (#42)
- League sites: a real sports-league design system (#36)
- Player pages: name the unknowns, sort the index, tell a bye from a benching (#40)
- Standings: report the league's own season, and let you pick a year (#39)
- Draft board: show the season in progress, and make the grid readable (#34)
- Playoff bracket: mirror the halves so they meet at the championship (#37)
- Dashboard: fix broken links, move to /app/leagues/<slug>, drop mock analytics (#38)
- Remove GitHub OAuth, add self-serve password setting (#35)
- Playoffs: draw the bracket, and let the weeks point into it (#33)
- Email + password accounts, with invite-gated signup and commissioner-issued reset (#32)
- Matchups: playoff nav and bracket view, and say when the schedule lands (#31)
- Yahoo-era import + cross-era Hall of Fame (#30)
- League history database: platform-agnostic schema, Sleeper sync, manager lineage (#29)
- v0.1.62026-08-07
- Keeper value: blend multiple ADP sources into one market read (#28)
- v0.1.52026-08-07
- Keepers: show market ADP and value over the pick you surrender (#27)
- Keeper eligibility: the trade deadline is a moment, not a week (#26)
- Keeper costs: read the draft's real round count, price no-ADP players as undrafted (#25)
- v0.1.42026-08-04
- Keeper ADP: stop pricing off search_rank, harden the Sleeper ADP fetch (#24)
- v0.1.32026-08-04
- Keepers page: show the full roster and the UDFA math; log ADP fallback (#22)
- Release flow: gate production deploys behind a production branch (#23)
- v0.1.22026-08-04
- Fix keeper rules to match the bylaws: drops void status, trades don't, FFC ADP (#21)
- v0.1.12026-08-03
- Actually drop outputFileTracingIncludes — #19 merged the wrong snapshot (#20)
- Fix Vercel deploy: drop outputFileTracingIncludes (ENOENT) (#19)
- v0.1.02026-08-03
- Add release flow: GitHub Releases + public /changelog, version 0.1.0 (#18)
- Fix keeper calcs: trade-deadline eligibility + per-league rule settings (#17)
- Fix UI regressions: scorebug width/scrollbar, dead season dropdown, player names in game detail (#16)
- Link a Sleeper league when creating one (#15)
- Drop commish.cloud: leagology.vercel.app is the root domain (#14)
- Add keepers: per-league rules + cost projections from Sleeper ADP (#13)
- Fix dashboard/league URLs and the dark-mode mismatch (#12)
- Build the Teams page: manager cards with season + lifetime context (#11)
- Let commissioner members reach league settings and their dashboard (#10)
- Add Hall of Fame: champions, lifetime standings, all-time records (#9)
- Add bylaws chatbot (ask-the-rulebook) (#8)
- Add dues tracking (#7)
- Make bylaws per-league editable content (Site.bylaws markdown) (#6)
- Add polls & voting (#4)
- Add league membership: invites, join flow, member management (#3)
- Move the account list behind its own Suspense boundary
- Allow password sign-in per environment instead of only off-production
- Add vitest test suite (37 tests) for Sleeper data layer and URL helpers (#2)
- Add CI workflow, rewrite README, finalize env template
- Migrate AI editor to AI SDK v6; retire openai-edge and @vercel/kv
- Wire drafts page, real champion banner, real matchup-bar week
- Add caching architecture: Sleeper client policies + Cache Components
- Modernize UI stack: Tailwind 4 + shadcn/ui, remove Tremor
- Ignore tsconfig.tsbuildinfo build artifact
- Remove dead code, quarantine historical data, strip debug UI
- Switch from subdomain to path-based multi-tenancy
- Path-based tenancy refactor + .env.example
- Upgrade next-mdx-remote 4.4.1 -> 6.0.0
- Restore database to Neon and add local dev login
- save
- fix schedules
- save
- save draft data
- add local data
- add transactions
- update matchups
- fix nav
- add matchups
- remove blog posts from home
- create front office / reloacte blog
- save
- try again
- relocate
- save
- save it
- Initial commit