From b7744a221575a8eb1174a459f0496897c4b3ec13 Mon Sep 17 00:00:00 2001
From: Dotta
Date: Wed, 11 Mar 2026 11:40:38 -0500
Subject: [PATCH 01/12] Add direct onboarding routes
Co-Authored-By: Paperclip
---
ui/src/App.tsx | 55 +++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 54 insertions(+), 1 deletion(-)
diff --git a/ui/src/App.tsx b/ui/src/App.tsx
index ed6c9c51..1cfdd9df 100644
--- a/ui/src/App.tsx
+++ b/ui/src/App.tsx
@@ -1,5 +1,5 @@
import { useEffect, useRef } from "react";
-import { Navigate, Outlet, Route, Routes, useLocation } from "@/lib/router";
+import { Navigate, Outlet, Route, Routes, useLocation, useParams } from "@/lib/router";
import { useQuery } from "@tanstack/react-query";
import { Button } from "@/components/ui/button";
import { Layout } from "./components/Layout";
@@ -108,6 +108,7 @@ function boardRoutes() {
<>
} />
} />
+ } />
} />
} />
} />
@@ -164,6 +165,57 @@ function LegacySettingsRedirect() {
return ;
}
+function OnboardingRoutePage() {
+ const { companies, loading } = useCompany();
+ const { onboardingOpen, openOnboarding } = useDialog();
+ const { companyPrefix } = useParams<{ companyPrefix?: string }>();
+ const opened = useRef(false);
+ const matchedCompany = companyPrefix
+ ? companies.find((company) => company.issuePrefix.toUpperCase() === companyPrefix.toUpperCase()) ?? null
+ : null;
+
+ useEffect(() => {
+ if (loading || opened.current || onboardingOpen) return;
+ opened.current = true;
+ if (matchedCompany) {
+ openOnboarding({ initialStep: 2, companyId: matchedCompany.id });
+ return;
+ }
+ openOnboarding();
+ }, [companyPrefix, loading, matchedCompany, onboardingOpen, openOnboarding]);
+
+ const title = matchedCompany
+ ? `Add another agent to ${matchedCompany.name}`
+ : companies.length > 0
+ ? "Create another company"
+ : "Create your first company";
+ const description = matchedCompany
+ ? "Run onboarding again to add an agent and a starter task for this company."
+ : companies.length > 0
+ ? "Run onboarding again to create another company and seed its first agent."
+ : "Get started by creating a company and your first agent.";
+
+ return (
+
+
+
{title}
+
{description}
+
+
+
+
+
+ );
+}
+
function CompanyRootRedirect() {
const { companies, selectedCompany, loading } = useCompany();
const { onboardingOpen } = useDialog();
@@ -242,6 +294,7 @@ export function App() {
}>
} />
+ } />
} />
}>
} />
From d4d1b2e7f924c60d999719846b807aa38408ee27 Mon Sep 17 00:00:00 2001
From: Dotta
Date: Wed, 11 Mar 2026 12:02:27 -0500
Subject: [PATCH 02/12] Style tweaks for onboarding wizard step 1
- Set animation panel (right half) background to #1d1d1d
- Add more margin above Company name form label
- Make form labels white when input is focused or has value
using Tailwind group/focus-within pattern
Co-Authored-By: Paperclip
Co-Authored-By: Claude Opus 4.6
---
ui/src/components/OnboardingWizard.tsx | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/ui/src/components/OnboardingWizard.tsx b/ui/src/components/OnboardingWizard.tsx
index a043655f..31373344 100644
--- a/ui/src/components/OnboardingWizard.tsx
+++ b/ui/src/components/OnboardingWizard.tsx
@@ -593,8 +593,8 @@ export function OnboardingWizard() {
-
-