refactor: rename Planarchy to CapaKraken (branding only)

User-facing rename across 20 files:
- Layout title/meta: "CapaKraken — Resource & Capacity Planning"
- Sidebar logo: "CapaKraken" with "RESOURCE & CAPACITY PLANNING"
- Sign-in page: "CapaKraken Control Center", "Sign in to CapaKraken"
- PWA manifest: name + short_name
- PDF reports: footer text
- Install prompt: "Install CapaKraken"
- AI assistant system prompt
- Webhooks test payload
- Email subject lines
- Tooltips, descriptions, empty states

NOT changed (technical identifiers):
- Package names (@planarchy/*)
- Import paths
- Database names
- Docker container names
- localStorage keys
- Domain URLs
- CLAUDE.md

Co-Authored-By: claude-flow <ruv@ruv.net>
This commit is contained in:
2026-03-25 21:46:15 +01:00
parent ea02ca7106
commit e5d7ca1293
20 changed files with 32 additions and 32 deletions
+2 -2
View File
@@ -1,6 +1,6 @@
{ {
"name": "Planarchy — Resource Planning", "name": "CapaKraken — Resource & Capacity Planning",
"short_name": "Planarchy", "short_name": "CapaKraken",
"description": "Resource planning and project staffing for 3D production", "description": "Resource planning and project staffing for 3D production",
"start_url": "/dashboard", "start_url": "/dashboard",
"display": "standalone", "display": "standalone",
@@ -1,7 +1,7 @@
import { PublicHolidayBatch } from "~/components/vacations/PublicHolidayBatch.js"; import { PublicHolidayBatch } from "~/components/vacations/PublicHolidayBatch.js";
import { EntitlementManager } from "~/components/vacations/EntitlementManager.js"; import { EntitlementManager } from "~/components/vacations/EntitlementManager.js";
export const metadata = { title: "Vacation Management — plANARCHY" }; export const metadata = { title: "Vacation Management — CapaKraken" };
export default function AdminVacationsPage() { export default function AdminVacationsPage() {
return ( return (
@@ -466,7 +466,7 @@ export function EstimatesClient() {
No estimates yet No estimates yet
</p> </p>
<p className="mt-2 text-sm text-gray-400 dark:text-gray-500"> <p className="mt-2 text-sm text-gray-400 dark:text-gray-500">
Start with the wizard to create a connected estimate from plANARCHY data. Start with the wizard to create a connected estimate from CapaKraken data.
</p> </p>
</div> </div>
) : ( ) : (
@@ -1001,7 +1001,7 @@ export function ResourcesClient() {
sortField={sortField} sortField={sortField}
sortDir={sortDir} sortDir={sortDir}
onSort={toggle} onSort={toggle}
tooltip="Unique employee identifier used across all plANARCHY records." tooltip="Unique employee identifier used across all CapaKraken records."
/> />
); );
case "displayName": case "displayName":
@@ -9,9 +9,9 @@ export async function generateMetadata(
try { try {
const trpc = await createCaller(); const trpc = await createCaller();
const resource = await trpc.resource.getById({ id }); const resource = await trpc.resource.getById({ id });
return { title: `${resource.displayName} — Resources | plANARCHY` }; return { title: `${resource.displayName} — Resources | CapaKraken` };
} catch { } catch {
return { title: "Resource — plANARCHY" }; return { title: "Resource — CapaKraken" };
} }
} }
+1 -1
View File
@@ -1,6 +1,6 @@
import { MyVacationsClient } from "~/components/vacations/MyVacationsClient.js"; import { MyVacationsClient } from "~/components/vacations/MyVacationsClient.js";
export const metadata = { title: "My Vacations — plANARCHY" }; export const metadata = { title: "My Vacations — CapaKraken" };
export default function MyVacationsPage() { export default function MyVacationsPage() {
return <MyVacationsClient />; return <MyVacationsClient />;
+2 -2
View File
@@ -37,7 +37,7 @@ export default function SignInPage() {
<div className="hidden rounded-[2rem] border border-white/70 bg-white/75 p-10 shadow-2xl backdrop-blur lg:flex lg:flex-col lg:justify-between dark:border-slate-800 dark:bg-slate-950/60"> <div className="hidden rounded-[2rem] border border-white/70 bg-white/75 p-10 shadow-2xl backdrop-blur lg:flex lg:flex-col lg:justify-between dark:border-slate-800 dark:bg-slate-950/60">
<div> <div>
<span className="inline-flex rounded-full border border-brand-200 bg-brand-50 px-3 py-1 text-[11px] font-semibold uppercase tracking-[0.18em] text-brand-700 dark:border-brand-900/50 dark:bg-brand-900/20 dark:text-brand-300"> <span className="inline-flex rounded-full border border-brand-200 bg-brand-50 px-3 py-1 text-[11px] font-semibold uppercase tracking-[0.18em] text-brand-700 dark:border-brand-900/50 dark:bg-brand-900/20 dark:text-brand-300">
plANARCHY Control Center CapaKraken Control Center
</span> </span>
<h1 className="mt-6 font-display text-5xl font-semibold leading-tight text-gray-900 dark:text-gray-50"> <h1 className="mt-6 font-display text-5xl font-semibold leading-tight text-gray-900 dark:text-gray-50">
Resource planning that stays readable under pressure. Resource planning that stays readable under pressure.
@@ -66,7 +66,7 @@ export default function SignInPage() {
<div className="app-surface-strong p-8"> <div className="app-surface-strong p-8">
<div className="mb-8"> <div className="mb-8">
<p className="text-xs font-semibold uppercase tracking-[0.18em] text-brand-600">Welcome Back</p> <p className="text-xs font-semibold uppercase tracking-[0.18em] text-brand-600">Welcome Back</p>
<h2 className="mt-3 font-display text-4xl font-semibold text-gray-900 dark:text-gray-50">Sign in to plANARCHY</h2> <h2 className="mt-3 font-display text-4xl font-semibold text-gray-900 dark:text-gray-50">Sign in to CapaKraken</h2>
<p className="mt-2 text-sm text-gray-500">Resource Planning, staffing, and forecasting.</p> <p className="mt-2 text-sm text-gray-500">Resource Planning, staffing, and forecasting.</p>
</div> </div>
+5 -5
View File
@@ -19,23 +19,23 @@ const displayFont = Manrope({
export const metadata: Metadata = { export const metadata: Metadata = {
metadataBase: new URL("https://planarchy.hartmut-noerenberg.com"), metadataBase: new URL("https://planarchy.hartmut-noerenberg.com"),
title: "plANARCHY — Resource Planning", title: "CapaKraken — Resource & Capacity Planning",
description: "Interactive resource planning and project staffing tool", description: "Interactive resource planning and project staffing tool",
manifest: "/manifest.json", manifest: "/manifest.json",
appleWebApp: { appleWebApp: {
capable: true, capable: true,
statusBarStyle: "default", statusBarStyle: "default",
title: "Planarchy", title: "CapaKraken",
}, },
openGraph: { openGraph: {
title: "plANARCHY — Resource Planning", title: "CapaKraken — Resource & Capacity Planning",
description: "Estimates, staffing, chargeability, and timelines in one workspace.", description: "Estimates, staffing, chargeability, and timelines in one workspace.",
images: [{ url: "/og-image.png", width: 1024, height: 1024, alt: "plANARCHY Logo" }], images: [{ url: "/og-image.png", width: 1024, height: 1024, alt: "CapaKraken Logo" }],
type: "website", type: "website",
}, },
twitter: { twitter: {
card: "summary_large_image", card: "summary_large_image",
title: "plANARCHY — Resource Planning", title: "CapaKraken — Resource & Capacity Planning",
description: "Estimates, staffing, chargeability, and timelines in one workspace.", description: "Estimates, staffing, chargeability, and timelines in one workspace.",
images: ["/og-image.png"], images: ["/og-image.png"],
}, },
@@ -176,7 +176,7 @@ export function WebhooksClient() {
<div> <div>
<h1 className="text-2xl font-bold text-gray-900 dark:text-white">Webhooks</h1> <h1 className="text-2xl font-bold text-gray-900 dark:text-white">Webhooks</h1>
<p className="mt-1 text-sm text-gray-500 dark:text-gray-400"> <p className="mt-1 text-sm text-gray-500 dark:text-gray-400">
Configure outbound webhooks to notify external services about events in Planarchy. Configure outbound webhooks to notify external services about events in CapaKraken.
</p> </p>
</div> </div>
<button className={PRIMARY_BUTTON} onClick={openCreateModal}> <button className={PRIMARY_BUTTON} onClick={openCreateModal}>
@@ -441,7 +441,7 @@ export function EstimateWizard({ onClose }: { onClose: () => void }) {
<p className="text-xs font-semibold uppercase tracking-[0.24em] text-brand-600">Estimate Wizard</p> <p className="text-xs font-semibold uppercase tracking-[0.24em] text-brand-600">Estimate Wizard</p>
<h2 className="mt-2 text-2xl font-semibold text-gray-900">Create a connected estimate</h2> <h2 className="mt-2 text-2xl font-semibold text-gray-900">Create a connected estimate</h2>
<p className="mt-1 text-sm text-gray-500"> <p className="mt-1 text-sm text-gray-500">
Rates, resource snapshots, and project linkage are pulled from existing plANARCHY data. Rates, resource snapshots, and project linkage are pulled from existing CapaKraken data.
</p> </p>
</div> </div>
<button <button
@@ -490,7 +490,7 @@ export function EstimateWizard({ onClose }: { onClose: () => void }) {
<input value={name} onChange={(event) => setName(event.target.value)} className={INPUT_CLS} placeholder="CGI Breakdown Q2 2026" /> <input value={name} onChange={(event) => setName(event.target.value)} className={INPUT_CLS} placeholder="CGI Breakdown Q2 2026" />
</div> </div>
<div> <div>
<label className={LABEL_CLS}>Linked Project <InfoTooltip content="Link to an existing plANARCHY project. This enables automatic date-based phasing and planning handoff." /></label> <label className={LABEL_CLS}>Linked Project <InfoTooltip content="Link to an existing CapaKraken project. This enables automatic date-based phasing and planning handoff." /></label>
<ProjectCombobox value={projectId} onChange={setProjectId} placeholder="Link to project" /> <ProjectCombobox value={projectId} onChange={setProjectId} placeholder="Link to project" />
</div> </div>
<div> <div>
@@ -640,7 +640,7 @@ export function EstimateWizard({ onClose }: { onClose: () => void }) {
<div key={line.id} className="rounded-3xl border border-gray-100 p-4"> <div key={line.id} className="rounded-3xl border border-gray-100 p-4">
<div className="grid gap-4 lg:grid-cols-2"> <div className="grid gap-4 lg:grid-cols-2">
<div> <div>
<label className={LABEL_CLS}>Resource <InfoTooltip content="Link to a live plANARCHY resource. Auto-fills rates, chapter, and role." /></label> <label className={LABEL_CLS}>Resource <InfoTooltip content="Link to a live CapaKraken resource. Auto-fills rates, chapter, and role." /></label>
<ResourceCombobox value={line.resourceId} onChange={(resourceId) => applyResource(resourceId, line.id)} placeholder="Search resource" /> <ResourceCombobox value={line.resourceId} onChange={(resourceId) => applyResource(resourceId, line.id)} placeholder="Search resource" />
</div> </div>
<div> <div>
@@ -336,7 +336,7 @@ export function DemandLineEditor({
<div className="mb-4 grid gap-4 md:grid-cols-2"> <div className="mb-4 grid gap-4 md:grid-cols-2">
<label> <label>
<span className={LABEL_CLS}>Linked resource <InfoTooltip content="Link to a plANARCHY resource. Live-linked rates refresh automatically; manual overrides are persisted." /></span> <span className={LABEL_CLS}>Linked resource <InfoTooltip content="Link to a CapaKraken resource. Live-linked rates refresh automatically; manual overrides are persisted." /></span>
<select <select
className={INPUT_CLS} className={INPUT_CLS}
value={line.resourceId ?? ""} value={line.resourceId ?? ""}
@@ -353,7 +353,7 @@ export function DemandLineEditor({
<div className="rounded-2xl bg-gray-50 px-4 py-3"> <div className="rounded-2xl bg-gray-50 px-4 py-3">
<p className="text-xs uppercase tracking-wide text-gray-400">Snapshot behavior</p> <p className="text-xs uppercase tracking-wide text-gray-400">Snapshot behavior</p>
<p className="mt-1 text-sm text-gray-700"> <p className="mt-1 text-sm text-gray-700">
Linked resources refresh from live plANARCHY rates when a rate is set to live mode. Manual overrides are persisted on the demand line. Linked resources refresh from live CapaKraken rates when a rate is set to live mode. Manual overrides are persisted on the demand line.
</p> </p>
</div> </div>
</div> </div>
+3 -3
View File
@@ -381,9 +381,9 @@ function SidebarContent({
{!sidebarCollapsed && ( {!sidebarCollapsed && (
<div className="overflow-hidden"> <div className="overflow-hidden">
<h1 className="font-display text-xl font-semibold text-gray-900 dark:text-gray-50"> <h1 className="font-display text-xl font-semibold text-gray-900 dark:text-gray-50">
Pl<span className="text-brand-600">anarchy</span> Capa<span className="text-brand-600">Kraken</span>
</h1> </h1>
<p className="text-xs uppercase tracking-[0.18em] text-gray-500 dark:text-gray-400">Resource Planning</p> <p className="text-xs uppercase tracking-[0.18em] text-gray-500 dark:text-gray-400">Resource & Capacity Planning</p>
</div> </div>
)} )}
</div> </div>
@@ -852,7 +852,7 @@ export function AppShell({ children, userRole = "USER" }: { children: React.Reac
<HamburgerIcon /> <HamburgerIcon />
</button> </button>
<span className="ml-3 font-display text-sm font-semibold text-gray-900 dark:text-gray-50"> <span className="ml-3 font-display text-sm font-semibold text-gray-900 dark:text-gray-50">
Pl<span className="text-brand-600">anarchy</span> Capa<span className="text-brand-600">Kraken</span>
</span> </span>
</div> </div>
<PageTransition>{children}</PageTransition> <PageTransition>{children}</PageTransition>
@@ -74,7 +74,7 @@ export function InstallPrompt() {
</div> </div>
<div className="min-w-0 flex-1"> <div className="min-w-0 flex-1">
<p className="text-sm font-medium text-gray-900 dark:text-gray-50"> <p className="text-sm font-medium text-gray-900 dark:text-gray-50">
Install Planarchy Install CapaKraken
</p> </p>
<p className="text-xs text-gray-500 dark:text-gray-400"> <p className="text-xs text-gray-500 dark:text-gray-400">
Add to home screen for quick access Add to home screen for quick access
@@ -63,7 +63,7 @@ export function AllocationReport({ title, generatedAt, rows }: AllocationReportP
))} ))}
</View> </View>
<Text style={styles.footer}>plANARCHY · Confidential · {rows.length} allocations</Text> <Text style={styles.footer}>CapaKraken · Confidential · {rows.length} allocations</Text>
</Page> </Page>
</Document> </Document>
); );
@@ -169,7 +169,7 @@ export function SkillMatrixUpload({ resourceId, isOwner, onClose, onSuccess }: P
{preview.matchedRoleName && ( {preview.matchedRoleName && (
<p className="text-xs text-gray-600"> <p className="text-xs text-gray-600">
<span className="font-medium">Area of expertise</span> matched to plANARCHY role:{" "} <span className="font-medium">Area of expertise</span> matched to CapaKraken role:{" "}
<span className="font-semibold text-brand-700">{preview.matchedRoleName}</span> <span className="font-semibold text-brand-700">{preview.matchedRoleName}</span>
</p> </p>
)} )}
@@ -75,7 +75,7 @@ export function StaffingPanel() {
<div className="app-surface max-w-xl p-4"> <div className="app-surface max-w-xl p-4">
<p className="text-sm font-medium text-gray-900 dark:text-gray-100">How scoring works</p> <p className="text-sm font-medium text-gray-900 dark:text-gray-100">How scoring works</p>
<p className="mt-1 text-sm text-gray-500"> <p className="mt-1 text-sm text-gray-500">
plANARCHY blends skill fit, free capacity, cost, and current utilization. Add the must-have skills first, then narrow the date window to get cleaner results. CapaKraken blends skill fit, free capacity, cost, and current utilization. Add the must-have skills first, then narrow the date window to get cleaner results.
</p> </p>
</div> </div>
</div> </div>
+1 -1
View File
@@ -276,7 +276,7 @@ export const TOOL_DEFINITIONS: ToolDef[] = [
type: "function", type: "function",
function: { function: {
name: "navigate_to_page", name: "navigate_to_page",
description: "Navigate the user to a specific page in Planarchy, optionally with filters. Use this when the user wants to see data on a specific page (e.g. 'show me on the timeline', 'open the resources page').", description: "Navigate the user to a specific page in CapaKraken, optionally with filters. Use this when the user wants to see data on a specific page (e.g. 'show me on the timeline', 'open the resources page').",
parameters: { parameters: {
type: "object", type: "object",
properties: { properties: {
+1 -1
View File
@@ -12,7 +12,7 @@ import { TOOL_DEFINITIONS, executeTool, type ToolContext, type ToolAction } from
const MAX_TOOL_ITERATIONS = 8; const MAX_TOOL_ITERATIONS = 8;
const SYSTEM_PROMPT = `Du bist der plANARCHY-Assistent — ein hilfreicher AI-Assistent für Ressourcenplanung und Projektmanagement in einer 3D-Produktionsumgebung. const SYSTEM_PROMPT = `Du bist der CapaKraken-Assistent — ein hilfreicher AI-Assistent für Ressourcenplanung und Projektmanagement in einer 3D-Produktionsumgebung.
Deine Fähigkeiten: Deine Fähigkeiten:
- Fragen über Ressourcen, Projekte, Allokationen, Budget, Urlaub, Estimates, Org-Struktur, Rollen, Blueprints, Rate Cards beantworten - Fragen über Ressourcen, Projekte, Allokationen, Budget, Urlaub, Estimates, Org-Struktur, Rollen, Blueprints, Rate Cards beantworten
+1 -1
View File
@@ -71,7 +71,7 @@ async function notifyVacationStatus(
if (resource.user.email) { if (resource.user.email) {
void sendEmail({ void sendEmail({
to: resource.user.email, to: resource.user.email,
subject: `Planarchy${title}`, subject: `CapaKraken${title}`,
text: body, text: body,
}); });
} }
+1 -1
View File
@@ -144,7 +144,7 @@ export const webhookRouter = createTRPCRouter({
payload: { payload: {
webhookId: wh.id, webhookId: wh.id,
webhookName: wh.name, webhookName: wh.name,
message: "This is a test payload from Planarchy.", message: "This is a test payload from CapaKraken.",
}, },
}; };