diff --git a/qt/launcher-gui/src/routes/Action.svelte b/qt/launcher-gui/src/routes/Action.svelte
new file mode 100644
index 000000000..1aa6d5f6c
--- /dev/null
+++ b/qt/launcher-gui/src/routes/Action.svelte
@@ -0,0 +1,90 @@
+
+
+
+
+ {#if latest != null && latest != current}
+
+
+
+ {/if}
+ {#if current != null}
+
+
+
+ {/if}
+
+
+
+ {"->"}
+
+
+
+
+
+
+
+
diff --git a/qt/launcher-gui/src/routes/AnkiWillStart.svelte b/qt/launcher-gui/src/routes/AnkiWillStart.svelte
new file mode 100644
index 000000000..1626dc0ad
--- /dev/null
+++ b/qt/launcher-gui/src/routes/AnkiWillStart.svelte
@@ -0,0 +1,65 @@
+
+
+
+
+
+{#await launch}
+
+ {$tr.launcherAnkiIsWarmingUp()}
+ {#if warmingUp}
+ {$tr.launcherThisMayTake()}
+ {/if}
+
+{:then}
+
+
+
+
+
+
+{/await}
diff --git a/qt/launcher-gui/src/routes/Options.svelte b/qt/launcher-gui/src/routes/Options.svelte
new file mode 100644
index 000000000..be656f926
--- /dev/null
+++ b/qt/launcher-gui/src/routes/Options.svelte
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+ {$tr.launcherAllowBetasToggle()}
+
+
+
+
+
+
+ {$tr.launcherDownloadCaching()}
+
+
+
+
+
+
+ {$tr.launcherUseMirror()}
+
+
+
+
diff --git a/qt/launcher-gui/src/routes/Spinner.svelte b/qt/launcher-gui/src/routes/Spinner.svelte
new file mode 100644
index 000000000..259232897
--- /dev/null
+++ b/qt/launcher-gui/src/routes/Spinner.svelte
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+ {label}
+ {@render children?.()}
+
+
+
+
diff --git a/qt/launcher-gui/src/routes/Term.svelte b/qt/launcher-gui/src/routes/Term.svelte
new file mode 100644
index 000000000..7982fef05
--- /dev/null
+++ b/qt/launcher-gui/src/routes/Term.svelte
@@ -0,0 +1,85 @@
+
+
+
+
+
+