Skip to content
BreachPilot

Home Page (/)

Route: webui/src/App.tsx:61webui/src/routes/HomePage.tsx:62 (HomePage, eager-loaded).

Purpose

Landing dashboard. Mirrors CLI menu as web entry: hero + stats + active-run banner + two action cards + recent sessions list. Footer safety reminder.

Data

HookCallUse
useRuns(50,0)HomePage.tsx:63All header stats + banner + recent list. queryKeys.runs(50,0,"created_desc") (api/hooks.ts:78)

Derived:

ValueExpressionNote
activeRunrows.find(isActiveState)HomePage.tsx:65
recentrows.slice(0,5)top 5
doneCountfilter(isTerminalState)HomePage.tsx:67
failedCountfilter(s==="failed")HomePage.tsx:68
returningrows.length>0 && !isLoadingcontrols welcome vs returning hero copy
lastTargetlastRow.target || target_ipfallback in subtitle

isActiveState / isTerminalState from api/types.ts:824.

Sections

FullAccessNotice dialog

FullAccessNotice (HomePage.tsx:29) — sessionStorage breachpilot.fullNotice.shown.v1 once-per-session. Dialog (components/ui/dialog.tsx:Radix) with ShieldAlert + read-only/approve blurb. Triggered via useEffect on mount.

Hero (HomePage.tsx:77)

bg-grid bg-radial-fade + animate-scan + blurred primary orb. Conditional h1:

  • returning: Welcome back. (text-gradient-primary)
  • first visit: BreachPilot

Subtitle: returning → "<n> runs on record, last targeting <target> <relative>" using formatRelative (lib/utils.ts:14); first → authorized-assets tagline.

CTA row (HomePage.tsx:110):

ButtonLinkIconNote
New recon/runs/new?path=reconScanSearchglow-primary, primary
Resume active/runs/<id> (when activeRun)Activity pulseyellow outline border-yellow-500/40
Take the tourdispatch breachpilot:open-welcomeCompassopens WelcomeGate (components/WelcomeScreen.tsx)

Stats strip (HomePage.tsx:142)

Grid cols-2 → cols-4, Stat (HomePage.tsx:244) wrapper with accent color:

LabelValueAccent
Total runsrows.length— (or "loading" hint while isLoading)
Active"1" or "0"yellow when active
CompleteddoneCountemerald
FailedfailedCountred if >0

Active-run banner (HomePage.tsx:156)

When activeRun: Card border-yellow-500/40 bg-yellow-500/5, Activity pulse + Badge variant="warn" + mono target + StatusBadge + Open run link (Button outline).

Action cards (HomePage.tsx:171)

ActionCard (HomePage.tsx:278) — Link styled as card with icon pill + title/desc + Start →:

CardtoTitleDesc
Recon/runs/new?path=reconRecon & Suggest GoalsScan first, AI-ranked goals
Attack/runs/new?path=attackAttackFull exploitation

Single accent cyan (hover:border-primary/50 hover:glow-primary, text-primary).

Recent sessions (HomePage.tsx:189)

Header: History + Recent sessions + count + View all → /sessions (ListFilter).

States:

ConditionRender
runs.errordestructure + Retry button (runs.refetch())
recent.length===0 && !isLoading && !errorempty (Target icon, "No past sessions yet.")
isLoading && recent emptySkeletonRows count=3 (components/Loading.tsx)
recent>0ul.divide-y of RecentRow

RecentRow (HomePage.tsx:311): Link /runs/<id> row with truncateId mono id, StatusBadge, title vs target fallback (title preferred), mode (hidden on mobile), formatRelative(created_at) timestamp.

"Run only against assets you own or are explicitly authorized to test." with dot.

Styling hooks

Stat uses text-[10px] uppercase tracking-wide label + font-mono text-xl tabular-nums value. Cards use bg-card/30 (tailwind.config.ts HSL vars). Animations animate-fade-in-up with 0.1s/0.2s delays (index.css:180).

source: repo docs (build sync)Edit this page on GitHub →