mirror of
https://github.com/block/buzz.git
synced 2026-11-04 00:12:02 +00:00
Thread-unread badges relied on the direct-parent adjacency map to roll up replies under their root. When the loaded timeline window dropped a middle ancestor, a deep reply keyed under its absent parent and was unreachable from the root, so the channel-root badge under-counted (Case 1) and, when a root's only reply was such an orphan, the root was never seed-eligible and got no frontier at all (Case 3, seed face). Group replies by their resolved rootId instead. The root e-tag travels with every event (getThreadReference), so a reply reaches its true root even with the intermediate ancestor unloaded. For an intact chain every descendant carries the root's rootId, so counts are identical to the old walk. The thread-open mark-read ceiling gets a root-scoped variant that folds in rootId-matched orphans; the expand caller keeps its branch-scoped walk, since a branch node owns no rootId bucket and must advance only its own branch. Co-authored-by: Will Pfleger <pfleger.will@gmail.com> Signed-off-by: Will Pfleger <pfleger.will@gmail.com>
Buzz
Desktop chat shell with:
- Tauri + React + TypeScript + Vite
- Tailwind CSS
- shadcn/ui-ready shared components
- Biome (lint/format/check)
- Feature-driven frontend structure
Scripts
pnpm dev- run the web frontendpnpm tauri dev- run the desktop apppnpm build- typecheck and build frontendpnpm typecheck- TypeScript checkspnpm lint- Biome lintpnpm format- Biome format (write)pnpm check- Biome check
Structure
src/shared- reusable app-wide code (ui,lib,styles)src/features- feature modules (vertical slices)src/app- top-level app composition