From 27bb82761bee83ce20716b24d6f0e246bec4bcf3 Mon Sep 17 00:00:00 2001
From: adamelmore <2363879+adamdottv@users.noreply.github.com>
Date: Tue, 27 Jan 2026 07:32:36 -0600
Subject: perf(app): shared terminal ghostty-web instance

---
 packages/app/src/components/terminal.tsx | 21 ++++++++++++++++++---
 1 file changed, 18 insertions(+), 3 deletions(-)

(limited to 'packages/app/src/components/terminal.tsx')

diff --git a/packages/app/src/components/terminal.tsx b/packages/app/src/components/terminal.tsx
index 78c33baff..022369afe 100644
--- a/packages/app/src/components/terminal.tsx
+++ b/packages/app/src/components/terminal.tsx
@@ -16,6 +16,19 @@ export interface TerminalProps extends ComponentProps<"div"> {
   onConnectError?: (error: unknown) => void
 }
 
+let shared: Promise<{ mod: typeof import("ghostty-web"); ghostty: Ghostty }> | undefined
+
+const loadGhostty = () => {
+  if (shared) return shared
+  shared = import("ghostty-web")
+    .then(async (mod) => ({ mod, ghostty: await mod.Ghostty.load() }))
+    .catch((err) => {
+      shared = undefined
+      throw err
+    })
+  return shared
+}
+
 type TerminalColors = {
   background: string
   foreground: string
@@ -53,7 +66,6 @@ export const Terminal = (props: TerminalProps) => {
   let handleResize: () => void
   let handleTextareaFocus: () => void
   let handleTextareaBlur: () => void
-  let reconnect: number | undefined
   let disposed = false
 
   const getTerminalColors = (): TerminalColors => {
@@ -112,8 +124,11 @@ export const Terminal = (props: TerminalProps) => {
 
   onMount(() => {
     const run = async () => {
-      const mod = await import("ghostty-web")
-      ghostty = await mod.Ghostty.load()
+      const loaded = await loadGhostty()
+      if (disposed) return
+
+      const mod = loaded.mod
+      ghostty = loaded.ghostty
 
       const once = { value: false }
 
-- 
cgit v1.2.3

