News & Forums
One page for what's new in the community, so a debater doesn't have to separately check several pages. It has two tabs: News, the feed of product updates and community announcements, and Forums, the discussion threads. It is the "News & Forums" row in the sidebar's Coaching section.
- Route:
/news(News tab),/news?section=forums(Forums tab) - Old address:
/practice/forumsredirects to the Forums tab. A single thread still opens at/practice/forums/<id>, and the sidebar keeps the News & Forums row highlighted there. - Package:
debate-card-search
Forums
Anyone signed in can open a thread from the form at the top of the tab. The list below it shows every thread, ordered by when each was last posted to, so the live discussion is on top. Opening a thread shows its replies; its back link returns to the Forums tab.
What the News tab shows
Every item, newest first, filterable by category: Product Updates (hand-maintained, plus auto-generated "Tool spotlight" posts for every cataloged feature), Daily Best Card, Contributor Awards, and five Community sources — Quest Streak milestones, Group Challenge completions, Revision Incentives' daily top reviser, Team Collaboration Mode prep notes, new Argument Library submissions, and new AI Coach Mode sessions. Each item can be liked and is marked read on hover.
Following shows updates from the teams and schools the reader follows from their profile pages: new rounds, new caselist research, tournament results and monthly recaps (see Team Rankings). The followed profiles are listed above the feed. These items are fetched after the page loads, so the panel rebuilds when the set of extra item ids changes.
Data flow
lib/news-stream.ts — NewsItem type, PRODUCT_NEWS, buildAutoFeatureNews()
state/newsStream.ts — buildNewsFeed(extraItems?) merges every source
@debate/videos useFollowingNews() — "following" items, passed in as extraItems
panels/NewsStreamPanel.tsx — category filter tabs, read/like UIRead/like state is account-synced via /api/settings as a union merge, not
a full two-way sync.
Known gaps
Unliking on one device doesn't clear the like on another device until that
device's own next toggle overwrites the account row. Fixed:
mergeRemoteViewerState (state/newsStream.ts) now tracks
lastSyncedRemoteLiked — this browser's own account row as of its last
successful hydrate — alongside the local liked set. On the next hydrate (a
page load/reload; hydrate still only runs once per mount, not live), an id
that was part of that last-known-synced snapshot but is missing from the
fresh fetch was confirmed liked before and confirmed unliked since, so it's
now cleared locally too. A like this browser made but hasn't pushed yet (or
whose push failed) was never part of a synced snapshot, so reconciliation
leaves it untouched — it still survives a merge exactly as before. Read
state is unaffected: there's no "unread" op, so it stays a pure union.
