diff --git a/src/params/handle.ts b/src/params/handle.ts
index 9fdb684..40d458b 100644
--- a/src/params/handle.ts
+++ b/src/params/handle.ts
@@ -1,5 +1,6 @@
+import { isActorIdentifier } from '@atcute/lexicons/syntax';
import type { ParamMatcher } from '@sveltejs/kit';
export const match = ((param: string) => {
- return param.includes('.') || param.startsWith('did:');
+ return isActorIdentifier(param);
}) satisfies ParamMatcher;
diff --git a/src/routes/[handle=handle]/[[page]]/+layout.server.ts b/src/routes/[handle=handle]/(pages)/+layout.server.ts
similarity index 100%
rename from src/routes/[handle=handle]/[[page]]/+layout.server.ts
rename to src/routes/[handle=handle]/(pages)/+layout.server.ts
diff --git a/src/routes/[handle=handle]/[[page]]/+page.svelte b/src/routes/[handle=handle]/(pages)/+page.svelte
similarity index 100%
rename from src/routes/[handle=handle]/[[page]]/+page.svelte
rename to src/routes/[handle=handle]/(pages)/+page.svelte
diff --git a/src/routes/[handle=handle]/[[page]]/edit/+page.svelte b/src/routes/[handle=handle]/(pages)/edit/+page.svelte
similarity index 100%
rename from src/routes/[handle=handle]/[[page]]/edit/+page.svelte
rename to src/routes/[handle=handle]/(pages)/edit/+page.svelte
diff --git a/src/routes/[handle=handle]/(pages)/p/[[page]]/+page.svelte b/src/routes/[handle=handle]/(pages)/p/[[page]]/+page.svelte
new file mode 100644
index 0000000..3419d88
--- /dev/null
+++ b/src/routes/[handle=handle]/(pages)/p/[[page]]/+page.svelte
@@ -0,0 +1,13 @@
+
+
+
diff --git a/src/routes/[handle=handle]/[[page]]/copy/+page.svelte b/src/routes/[handle=handle]/(pages)/p/[[page]]/copy/+page.svelte
similarity index 100%
rename from src/routes/[handle=handle]/[[page]]/copy/+page.svelte
rename to src/routes/[handle=handle]/(pages)/p/[[page]]/copy/+page.svelte
diff --git a/src/routes/[handle=handle]/(pages)/p/[[page]]/edit/+page.svelte b/src/routes/[handle=handle]/(pages)/p/[[page]]/edit/+page.svelte
new file mode 100644
index 0000000..e57bf31
--- /dev/null
+++ b/src/routes/[handle=handle]/(pages)/p/[[page]]/edit/+page.svelte
@@ -0,0 +1,6 @@
+
+
+
diff --git a/src/routes/p/[[page]]/+layout.server.ts b/src/routes/p/[[page]]/+layout.server.ts
new file mode 100644
index 0000000..faca3a0
--- /dev/null
+++ b/src/routes/p/[[page]]/+layout.server.ts
@@ -0,0 +1,25 @@
+import { loadData } from '$lib/website/load';
+import { env } from '$env/dynamic/public';
+import type { UserCache } from '$lib/types';
+import type { Did, Handle } from '@atcute/lexicons';
+
+export async function load({ params, platform, request }) {
+ const cache = platform?.env?.USER_DATA_CACHE as unknown;
+
+ const handle = env.PUBLIC_HANDLE;
+
+ const kv = platform?.env?.CUSTOM_DOMAINS;
+
+ const customDomain = request.headers.get('X-Custom-Domain')?.toLocaleLowerCase();
+
+ if (kv && customDomain) {
+ try {
+ const did = await kv.get(customDomain);
+ return await loadData(did as Did, cache as UserCache, false, params.page);
+ } catch {
+ console.error('failed');
+ }
+ }
+
+ return await loadData(handle as Handle, cache as UserCache, false, params.page);
+}
diff --git a/src/routes/p/[[page]]/+page.svelte b/src/routes/p/[[page]]/+page.svelte
new file mode 100644
index 0000000..3419d88
--- /dev/null
+++ b/src/routes/p/[[page]]/+page.svelte
@@ -0,0 +1,13 @@
+
+
+
diff --git a/src/routes/p/[[page]]/copy/+page.svelte b/src/routes/p/[[page]]/copy/+page.svelte
new file mode 100644
index 0000000..b456d15
--- /dev/null
+++ b/src/routes/p/[[page]]/copy/+page.svelte
@@ -0,0 +1,252 @@
+
+
+
+
+ {#if user.isLoggedIn}
+
Copy Page
+
+
+
+ Source Page
+
+
+ {sourceHandle}/{sourcePage || 'main'}
+
+
{sourceCards.length} cards
+
+
+
+
+
+
+
+ {#if error}
+
+ {error}
+
+ {/if}
+
+ {#if success}
+
+ Page copied successfully! Redirecting...
+
+ {/if}
+
+
+
+ Cancel
+
+
+
+ {:else}
+
+ You must be signed in to copy a page!
+
+
+
+
+
+ {/if}
+
+
diff --git a/src/routes/p/[[page]]/edit/+page.svelte b/src/routes/p/[[page]]/edit/+page.svelte
new file mode 100644
index 0000000..e57bf31
--- /dev/null
+++ b/src/routes/p/[[page]]/edit/+page.svelte
@@ -0,0 +1,6 @@
+
+
+