mirror of
https://github.com/block/buzz.git
synced 2026-11-08 10:21:46 +00:00
The seed read getThreadReadAt(rootId, activeChannelId), which AppShell folds to max(thread_own, channel) via the NIP-RS hierarchical resolver. Channel-open markChannelRead advances the channel term to the newest top-level message, and the monotonic seed (Math.max in nextThreadBadgeFrontier) then bleeds that channel timestamp back past an unread reply -- planting the frontier ahead of it so computeThreadBadgeCounts reads zero and the badge vanishes (LP4 Case 3, seed-timing face; the flaky 'no badge' correlated with newer channel messages). Omit the channelId so the seed reads the thread's OWN marker (getOwnTimestamp, no parent fold). Thread badges are channel-independent by design (NIP-RS Option 1: channel-open leaves them intact until each thread is read); the own marker advances only via markThreadRead, preserving advance-on-read. This is immune to the channel bleed by construction -- no channel term ever enters -- so it needs no render-time ref capture. 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