- Persist display names in per-channel JSON cache files (Name +
DisplayName fields on cachedChannel). GetAllTitles reads all ch_*.json
files; PutTitle updates a channel file in-place without losing messages.
- Replace blocking FetchTitles calls in fetchMeta and refreshChannel with
an instant disk read (GetAllTitles) applied before the SSE broadcast,
so channels appear with cached titles immediately on every load.
- ensureTitlesFetched runs in a single background goroutine (titlesMu +
titlesLoading guard prevents duplicates). On success it persists titles
and pushes an SSE update. On error or empty response it backs off for
5 minutes so an old server does not cause endless retries.
- Block 0 of TitlesChannel now carries a uint16 total-block-count prefix
(added in rebuildTitlesBlocks). FetchTitles reads the count from block 0
and fetches all remaining blocks in parallel instead of sequentially.
- FetchTitles timeout raised from 10 s to 1 minute.