diff --git a/frontend/src/routes/(root)/(logged)/apps/add/+page.svelte b/frontend/src/routes/(root)/(logged)/apps/add/+page.svelte
index 4c78bb7c06..e54568a9ed 100644
--- a/frontend/src/routes/(root)/(logged)/apps/add/+page.svelte
+++ b/frontend/src/routes/(root)/(logged)/apps/add/+page.svelte
@@ -1,22 +1,5 @@
-
+
diff --git a/frontend/src/routes/(root)/(logged)/apps/add/+page.ts b/frontend/src/routes/(root)/(logged)/apps/add/+page.ts
new file mode 100644
index 0000000000..d311b9ac2f
--- /dev/null
+++ b/frontend/src/routes/(root)/(logged)/apps/add/+page.ts
@@ -0,0 +1,18 @@
+import { redirect } from '@sveltejs/kit'
+import { base } from '$app/paths'
+import { get } from 'svelte/store'
+import { userStore } from '$lib/stores'
+import type { PageLoad } from './$types'
+
+// See /scripts/add/+page.ts for the rationale — redirect at load time
+// to avoid mounting a blank route component and flashing white.
+
+export const prerender = false
+
+export const load: PageLoad = ({ url }) => {
+ const username = get(userStore)?.username ?? 'me'
+ const uuid = crypto.randomUUID()
+ const params = new URLSearchParams(url.searchParams)
+ params.set('new_draft', 'true')
+ redirect(307, `${base}/apps/edit/u/${username}/draft_${uuid}?${params.toString()}`)
+}
diff --git a/frontend/src/routes/(root)/(logged)/apps_raw/add/+page.svelte b/frontend/src/routes/(root)/(logged)/apps_raw/add/+page.svelte
index 1f2334b8cb..e54568a9ed 100644
--- a/frontend/src/routes/(root)/(logged)/apps_raw/add/+page.svelte
+++ b/frontend/src/routes/(root)/(logged)/apps_raw/add/+page.svelte
@@ -1,22 +1,5 @@
-
+
diff --git a/frontend/src/routes/(root)/(logged)/apps_raw/add/+page.ts b/frontend/src/routes/(root)/(logged)/apps_raw/add/+page.ts
new file mode 100644
index 0000000000..e57a7443f6
--- /dev/null
+++ b/frontend/src/routes/(root)/(logged)/apps_raw/add/+page.ts
@@ -0,0 +1,18 @@
+import { redirect } from '@sveltejs/kit'
+import { base } from '$app/paths'
+import { get } from 'svelte/store'
+import { userStore } from '$lib/stores'
+import type { PageLoad } from './$types'
+
+// See /scripts/add/+page.ts for the rationale — redirect at load time
+// to avoid mounting a blank route component and flashing white.
+
+export const prerender = false
+
+export const load: PageLoad = ({ url }) => {
+ const username = get(userStore)?.username ?? 'me'
+ const uuid = crypto.randomUUID()
+ const params = new URLSearchParams(url.searchParams)
+ params.set('new_draft', 'true')
+ redirect(307, `${base}/apps_raw/edit/u/${username}/draft_${uuid}?${params.toString()}`)
+}
diff --git a/frontend/src/routes/(root)/(logged)/flows/add/+page.svelte b/frontend/src/routes/(root)/(logged)/flows/add/+page.svelte
index 403986cc14..e54568a9ed 100644
--- a/frontend/src/routes/(root)/(logged)/flows/add/+page.svelte
+++ b/frontend/src/routes/(root)/(logged)/flows/add/+page.svelte
@@ -1,22 +1,5 @@
-
+
diff --git a/frontend/src/routes/(root)/(logged)/flows/add/+page.ts b/frontend/src/routes/(root)/(logged)/flows/add/+page.ts
new file mode 100644
index 0000000000..56ea4bd08b
--- /dev/null
+++ b/frontend/src/routes/(root)/(logged)/flows/add/+page.ts
@@ -0,0 +1,18 @@
+import { redirect } from '@sveltejs/kit'
+import { base } from '$app/paths'
+import { get } from 'svelte/store'
+import { userStore } from '$lib/stores'
+import type { PageLoad } from './$types'
+
+// See /scripts/add/+page.ts for the rationale — redirect at load time
+// to avoid mounting a blank route component and flashing white.
+
+export const prerender = false
+
+export const load: PageLoad = ({ url }) => {
+ const username = get(userStore)?.username ?? 'me'
+ const uuid = crypto.randomUUID()
+ const params = new URLSearchParams(url.searchParams)
+ params.set('new_draft', 'true')
+ redirect(307, `${base}/flows/edit/u/${username}/draft_${uuid}?${params.toString()}`)
+}
diff --git a/frontend/src/routes/(root)/(logged)/scripts/add/+page.svelte b/frontend/src/routes/(root)/(logged)/scripts/add/+page.svelte
index 4b5a2f6346..7f7a19ca9b 100644
--- a/frontend/src/routes/(root)/(logged)/scripts/add/+page.svelte
+++ b/frontend/src/routes/(root)/(logged)/scripts/add/+page.svelte
@@ -1,30 +1,6 @@
-
+
diff --git a/frontend/src/routes/(root)/(logged)/scripts/add/+page.ts b/frontend/src/routes/(root)/(logged)/scripts/add/+page.ts
new file mode 100644
index 0000000000..1cb4b3d984
--- /dev/null
+++ b/frontend/src/routes/(root)/(logged)/scripts/add/+page.ts
@@ -0,0 +1,27 @@
+import { redirect } from '@sveltejs/kit'
+import { base } from '$app/paths'
+import { get } from 'svelte/store'
+import { userStore } from '$lib/stores'
+import type { PageLoad } from './$types'
+
+// Redirect at the load phase, before the +page.svelte ever mounts. The
+// onMount-then-goto version this replaces painted a blank component for
+// one frame before navigating, hence the white flash; doing the work in
+// `load` lets SvelteKit cancel the route transition and head straight
+// for the edit page.
+//
+// `userStore` is populated client-side by the (logged) layout, so by
+// the time this load runs (always after layout setup) it usually has
+// the real username. The `'me'` fallback is the same one the original
+// onMount used — keeps behavior identical for the rare race where the
+// store hasn't filled yet.
+
+export const prerender = false
+
+export const load: PageLoad = ({ url }) => {
+ const username = get(userStore)?.username ?? 'me'
+ const uuid = crypto.randomUUID()
+ const params = new URLSearchParams(url.searchParams)
+ params.set('new_draft', 'true')
+ redirect(307, `${base}/scripts/edit/u/${username}/draft_${uuid}?${params.toString()}`)
+}