Dynamic loading is mandatory even if the catalog were small. - [ ] `first` + `after` Relay-style connection - [ ] `IntersectionObserver` prefetches the next page - [ ] a real `Load more` **button** alongside it - infinite scroll alone is a keyboard trap - [ ] Apollo `typePolicies` merge concatenates edges on `fetchMore` **Acceptance:** paging 20 at a time through 100k albums stays fast and never returns an already-seen album.