diff --git a/AGENTS.md b/AGENTS.md
index 642d84e3..4f37ef36 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -172,6 +172,9 @@ callbacks and hot paths.
2. Use `+page.svelte` for page component
3. Use `+layout.svelte` for shared layouts
4. Top-level sync logic goes in root `+layout.svelte`
+5. Read params from the `params` prop, typed with `PageProps`/`LayoutProps` from the route's own
+ `./$types`. SvelteKit passes them down in the same update as the component swap, while the
+ `page` store is set a tick later. Only code outside `src/routes/` reads `$page.params`.
### Loading Data from Network
diff --git a/src/routes/[bech32]/+page.svelte b/src/routes/[bech32]/+page.svelte
index 24f01fd4..10a04aa2 100644
--- a/src/routes/[bech32]/+page.svelte
+++ b/src/routes/[bech32]/+page.svelte
@@ -1,18 +1,19 @@
-{#key $page.params.npub}
+{#key params.npub}
{@render children?.()}
{/key}
diff --git a/src/routes/people/[npub]/+page.svelte b/src/routes/people/[npub]/+page.svelte
index 7cd45b8c..b2bdc473 100644
--- a/src/routes/people/[npub]/+page.svelte
+++ b/src/routes/people/[npub]/+page.svelte
@@ -1,8 +1,6 @@
{#key params.relay}
diff --git a/src/routes/spaces/[relay]/+layout.svelte b/src/routes/spaces/[relay]/+layout.svelte
index 423ae746..e8b4a1f2 100644
--- a/src/routes/spaces/[relay]/+layout.svelte
+++ b/src/routes/spaces/[relay]/+layout.svelte
@@ -4,7 +4,6 @@
diff --git a/src/routes/spaces/[relay]/admin/+page.svelte b/src/routes/spaces/[relay]/admin/+page.svelte
index b21642eb..9840459b 100644
--- a/src/routes/spaces/[relay]/admin/+page.svelte
+++ b/src/routes/spaces/[relay]/admin/+page.svelte
@@ -1,6 +1,5 @@
diff --git a/src/routes/spaces/[relay]/articles/+page.svelte b/src/routes/spaces/[relay]/articles/+page.svelte
index 590844c3..6c1842f0 100644
--- a/src/routes/spaces/[relay]/articles/+page.svelte
+++ b/src/routes/spaces/[relay]/articles/+page.svelte
@@ -2,7 +2,6 @@
import {onDestroy, onMount} from "svelte"
import {readable} from "svelte/store"
import type {Readable} from "svelte/store"
- import {page} from "$app/stores"
import {goto} from "$app/navigation"
import {sortBy, partition, spec, max, pushToMapKey} from "@welshman/lib"
import type {Maybe} from "@welshman/lib"
@@ -24,8 +23,11 @@
import {makeCommentFilter} from "@app/content"
import {isFeedLoading, makeFeed, makeFeedContext, makeScrollLoader} from "@app/feeds"
import {makeArticleCreatePath} from "@app/routes"
+ import type {PageProps} from "./$types"
- const url = decodeRelay($page.params.relay!)
+ const {params}: PageProps = $props()
+
+ const url = decodeRelay(params.relay)
const context = makeFeedContext({relays: [url]})
onDestroy(context.cleanup)
diff --git a/src/routes/spaces/[relay]/articles/[address]/+page.svelte b/src/routes/spaces/[relay]/articles/[address]/+page.svelte
index 7ee82a63..41c009c4 100644
--- a/src/routes/spaces/[relay]/articles/[address]/+page.svelte
+++ b/src/routes/spaces/[relay]/articles/[address]/+page.svelte
@@ -1,9 +1,7 @@
diff --git a/src/routes/spaces/[relay]/classifieds/+page.svelte b/src/routes/spaces/[relay]/classifieds/+page.svelte
index 7ca8bef5..d3cec899 100644
--- a/src/routes/spaces/[relay]/classifieds/+page.svelte
+++ b/src/routes/spaces/[relay]/classifieds/+page.svelte
@@ -35,8 +35,11 @@
} from "@app/classifieds"
import {reader} from "@app/core"
import {pushModal} from "@app/modal"
+ import type {PageProps} from "./$types"
- const url = decodeRelay($page.params.relay!)
+ const {params}: PageProps = $props()
+
+ const url = decodeRelay(params.relay)
const context = makeFeedContext({relays: [url]})
onDestroy(context.cleanup)
diff --git a/src/routes/spaces/[relay]/classifieds/[address]/+page.svelte b/src/routes/spaces/[relay]/classifieds/[address]/+page.svelte
index 6c0669c4..813020d1 100644
--- a/src/routes/spaces/[relay]/classifieds/[address]/+page.svelte
+++ b/src/routes/spaces/[relay]/classifieds/[address]/+page.svelte
@@ -1,9 +1,7 @@