diff --git a/web/src/lib/components/timeline/AssetLayout.svelte b/web/src/lib/components/timeline/AssetLayout.svelte
index 4ecf71f517..c6ee04a21f 100644
--- a/web/src/lib/components/timeline/AssetLayout.svelte
+++ b/web/src/lib/components/timeline/AssetLayout.svelte
@@ -1,6 +1,5 @@
- {#each filterIsInOrNearViewport(viewerAssets) as viewerAsset (viewerAsset.id)}
+ {#each visibleViewerAssets as viewerAsset (viewerAsset.id)}
{@const position = viewerAsset.position!}
{@const asset = viewerAsset.asset!}
diff --git a/web/src/lib/components/timeline/Month.svelte b/web/src/lib/components/timeline/Month.svelte
index 3f4b9b0661..ccd1d025d9 100644
--- a/web/src/lib/components/timeline/Month.svelte
+++ b/web/src/lib/components/timeline/Month.svelte
@@ -101,6 +101,8 @@
this.viewerAssets.some((viewAsset) => viewAsset.isInOrNearViewport));
// Indices into viewerAssets bounding the in-or-near range. -1/-1 means no assets are in-or-near.
// Updated imperatively by updateAssetBoundaries() from updateViewportProximities() and layout().
firstInOrNearIndex = $state(-1);
lastInOrNearIndex = $state(-1);
+ isInOrNearViewport = $derived(this.firstInOrNearIndex !== -1);
#top: number = $state(0);
#start: number = $state(0);