Use OAuth later, or enter the mock workspace now.
++ New here? Create an account +
+diff --git a/apps/web/src/app/app/blindspot-map/page.tsx b/apps/web/src/app/app/blindspot-map/page.tsx
new file mode 100644
index 0000000..bd5b9c4
--- /dev/null
+++ b/apps/web/src/app/app/blindspot-map/page.tsx
@@ -0,0 +1,45 @@
+"use client";
+
+import { PageHeader } from "@/components/app/page-header";
+import { LoadingPanel } from "@/components/app/loading-panel";
+import { Badge } from "@/components/ui/badge";
+import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
+import { Progress } from "@/components/ui/progress";
+import { useBlindspotsQuery } from "@/lib/mock-data/hooks";
+
+export default function BlindspotMapPage() {
+ const { data: blindspots, isLoading } = useBlindspotsQuery();
+
+ if (isLoading || !blindspots) return
Evidence
+{blindspot.evidence}
+Next action
+{blindspot.nextAction}
+{stat.value}
+{stat.copy}
+{dashboard.activeTrack.description}
+ +{module.title}
+{module.summary}
+ + ))} +Name: {profile.name}
+Role: {profile.role}
+Completed modules: {profile.completedModules}
+{track.description}
+Use OAuth later, or enter the mock workspace now.
++ New here? Create an account +
+Mock onboarding keeps frontend work unblocked.
++ Already training? Sign in +
+
- src/app/page.tsx
-
- .
- + UnVibe turns passive tutorials into an active sequence: read production code, rebuild it, then defend your reasoning in live sessions. +
+live module
+{signal.label}
+ 0{index + 1} +{signal.value}
+const session = defend(rebuild);
+score.update(session.reasoning);
+{"// next question streams into War Room"}
+{feature.copy}
+mock workspace
+{user?.name ?? "Guest"}
+{user?.email ?? "mock session"}
+{label}
+{description}
: null} +{annotation.note}
+Submission
+Mock diff scoring keeps the flow local.
+{line.left ?? ""}
+ {line.right ?? ""}
+ {entry.name}
+{entry.track}
+{module.summary}
+{question.prompt}
+{question.explanation}
: null} + +{streak}
+days in training
+{message.body}
+