+ Could not load stacks: {error instanceof Error ? error.message : 'unknown error'}
+
+ {:else if groups.length === 0}
+
+
No stacks.
+
+ PhotoPrism stacks byte-identical (or EXIF-identical) files. If you don't have
+ any, this tab stays empty. Cross-folder copies PhotoPrism rejected at index
+ time live under the Cross-folder tab.
+
+
+ {:else}
+
+ {#each groups as group, i (group.photo.UID)}
+
+ {/each}
+
+ {/if}
+{/if}
-
- {#if activeTab === 'stacks'}
-
- {#if pending}
-
Loading stacks…
- {:else if error}
-
- Could not load stacks: {error instanceof Error
- ? error.message
- : 'unknown error'}
-
- {:else if stackCount === 0}
-
-
No stacks.
-
- PhotoPrism stacks byte-identical (or EXIF-identical) files. If you
- don't have any, this tab stays empty. Cross-folder copies that
- PhotoPrism rejected at index time live under the
-
- tab.
-
-
- {:else}
-
- {#each groups as group, i (group.photo.UID)}
-
- {/each}
-
- {/if}
-
- {/if}
+
+{#if activeTab === 'cross-folder'}
+
+
+
+ Byte-identical files PhotoPrism dropped at index time. Found by scanning the
+ originals tree directly.
+
+
+
-
- {#if activeTab === 'cross-folder'}
-
-
-
- Byte-identical files PhotoPrism dropped at index time. Found by
- scanning the originals tree directly.
-
-
-
-
- {#if !scanRequested}
-
- Click Scan filesystem to look for byte-identical files spread
- across folders. Pre-filtered by size, so even large libraries finish
- in a few seconds.
-
- {:else if crossQuery.isFetching && !crossQuery.data}
-
- No cross-folder duplicates found.
- {#if crossQuery.data}
-
- (scanned in {crossQuery.data.scannedMs} ms)
-
- {/if}
-
- {:else}
-
- {#each crossQuery.data?.groups ?? [] as group, i (group.hash)}
-
- {/each}
-
- {/if}
-
- {/if}
-
+ {#if !scanRequested}
+
+ Click Scan filesystem to look for byte-identical files spread across
+ folders. Pre-filtered by size, so even large libraries finish in a few seconds.
+
+ {:else if crossQuery.isFetching && !crossQuery.data}
+
- {:else if (labelsQuery.data ?? []).length === 0}
-
- No labels yet. PhotoPrism's TensorFlow indexer generates these from photo content; if the
- indexer hasn't run on real photos yet, the list will be empty.
-