+ {#if hasTieredPosts}
+
+ Tier
+ {#each TIER_CHIPS as chip (chip.value)}
+
+ {/each}
+
+ {/if}
+
{#if paginatedPosts.length === 0}
No posts yet.
{:else}
diff --git a/src/routes/stream/+page.svelte b/src/routes/stream/+page.svelte
new file mode 100644
index 00000000..01b71231
--- /dev/null
+++ b/src/routes/stream/+page.svelte
@@ -0,0 +1,82 @@
+
+
+
+ Stream — transscendsurvival.org
+
+
+
+
+
+
+
+
+ {#if items.length === 0}
+
Nothing in the stream yet.
+ {:else}
+
+ {#each items as item (item.id)}
+ -
+
+
+
+ {kindLabel(item)}
+
+
+
+
+
+ {#if item.summary}
+
{item.summary}
+ {/if}
+
+
+ {/each}
+
+ {/if}
+
diff --git a/src/routes/stream/+page.ts b/src/routes/stream/+page.ts
new file mode 100644
index 00000000..81345d81
--- /dev/null
+++ b/src/routes/stream/+page.ts
@@ -0,0 +1,25 @@
+import { getPosts } from '$lib/posts';
+import { loadPulseSnapshot } from '$lib/pulse/load';
+import { blendStream } from '$lib/stream/blend';
+import type { PublicPulseItem } from '@blog/pulse-core/schema';
+import type { PageLoad } from './$types';
+
+export const prerender = true;
+
+// Shadow ingestion surface: blend published long-form posts with the public
+// pulse snapshot into one reverse-chronological, tier-weighted timeline. The
+// pulse snapshot is best-effort — if it is missing or fails validation the
+// stream still prerenders from posts alone (graceful, never blocks the build).
+export const load: PageLoad = async ({ fetch }) => {
+ const posts = await getPosts();
+
+ let pulseItems: PublicPulseItem[] = [];
+ try {
+ const snapshot = await loadPulseSnapshot(fetch);
+ pulseItems = snapshot.items;
+ } catch {
+ pulseItems = [];
+ }
+
+ return { items: blendStream(posts, pulseItems) };
+};