Rebrand arc-web app from Arc to Fabro

Replace logo/favicon SVGs with Fabro brick icon wordmark.
Update all page titles, alt text, auth UI copy, and GitHub App name prefix.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Bryan Helmkamp 2026-03-11 22:10:51 -04:00
parent f459aa78d7
commit 17efbe5168
23 changed files with 36 additions and 42 deletions

View file

@ -1,10 +1,10 @@
import type { ReactNode } from "react";
function ArcLogo({ className }: { className?: string }) {
function FabroLogo({ className }: { className?: string }) {
return (
<img
src="/logo.svg"
alt="Arc"
alt="Fabro"
className={className}
draggable={false}
/>
@ -22,7 +22,7 @@ export function AuthLayout({
<div className="flex min-h-screen flex-col items-center justify-center bg-atmosphere px-4">
<div className="w-full max-w-sm">
<div className="mb-8 flex justify-center">
<ArcLogo className="h-12 w-12" />
<FabroLogo className="h-12 w-12" />
</div>
<div className="rounded-xl border border-line bg-panel/80 p-8 shadow-lg backdrop-blur-sm">
{children}

View file

@ -101,7 +101,7 @@ export default function AppShell({ loaderData }: Route.ComponentProps) {
<div className="flex items-center">
<div className="shrink-0">
<Link to="/start">
<img alt="Arc" src={theme === "dark" ? "/logotype.svg" : "/logotype-light.svg"} className="h-8 w-auto" />
<img alt="Fabro" src={theme === "dark" ? "/logotype.svg" : "/logotype-light.svg"} className="h-8 w-auto" />
</Link>
</div>
<div className="hidden md:block">

View file

@ -38,7 +38,7 @@ export default function AuthLogin({ loaderData }: Route.ComponentProps) {
return (
<AuthLayout>
<h1 className="text-center text-lg font-semibold text-fg">
Sign in to Arc
Sign in to Fabro
</h1>
<p className="mt-2 text-center text-sm text-fg-3">
Authenticate with your GitHub account to continue.

View file

@ -6,7 +6,7 @@ import type { PaginatedSavedQueryList, PaginatedHistoryEntryList } from "@qltysh
import type { Route } from "./+types/insights";
export function meta({}: Route.MetaArgs) {
return [{ title: "Insights — Arc" }];
return [{ title: "Insights — Fabro" }];
}
export const handle = {

View file

@ -32,7 +32,7 @@ export async function loader({ request }: Route.LoaderArgs) {
}
export function meta({}: Route.MetaArgs) {
return [{ title: "Retros \u2014 Arc" }];
return [{ title: "Retros \u2014 Fabro" }];
}
const smoothnessOptions: Array<{ value: SmoothnessRating; label: string }> = [

View file

@ -49,7 +49,7 @@ export async function action({ params, request }: Route.ActionArgs) {
export function meta({ data }: Route.MetaArgs) {
const run = data?.run;
return [{ title: run ? `${run.title}Arc` : "Run — Arc" }];
return [{ title: run ? `${run.title}Fabro` : "Run — Fabro" }];
}
export default function RunDetail({ loaderData, params }: Route.ComponentProps) {

View file

@ -17,7 +17,7 @@ export async function loader({ request, params }: Route.LoaderArgs) {
export function meta({ data }: Route.MetaArgs) {
const retro = data?.retro;
return [{ title: retro ? `Retro: ${retro.goal} \u2014 Arc` : "Retro \u2014 Arc" }];
return [{ title: retro ? `Retro: ${retro.goal} \u2014 Fabro` : "Retro \u2014 Fabro" }];
}
function formatCost(cost: number | undefined): string {

View file

@ -25,7 +25,7 @@ import type { PaginatedRunList } from "@qltysh/arc-api-client";
import type { Route } from "./+types/runs";
export function meta({}: Route.MetaArgs) {
return [{ title: "Runs — Arc" }];
return [{ title: "Runs — Fabro" }];
}
const columnConfig: {

View file

@ -17,7 +17,7 @@ import type { Route } from "./+types/session-detail";
export const handle = { hideHeader: true, wide: true };
export function meta({}: Route.MetaArgs) {
return [{ title: "Session — Arc" }];
return [{ title: "Session — Fabro" }];
}
export async function loader({ request, params }: Route.LoaderArgs) {

View file

@ -4,7 +4,7 @@ import type { ServerConfiguration } from "@qltysh/arc-api-client";
import type { Route } from "./+types/settings";
export function meta({}: Route.MetaArgs) {
return [{ title: "Settings — Arc" }];
return [{ title: "Settings — Fabro" }];
}
export const handle = { hideHeader: true };

View file

@ -89,7 +89,7 @@ export default function SetupCallback({ loaderData }: Route.ComponentProps) {
<div className="flex min-h-screen flex-col items-center justify-center bg-atmosphere px-4">
<div className="w-full max-w-sm">
<div className="mb-8 flex justify-center">
<img src="/logo.svg" alt="Arc" className="h-12 w-12" draggable={false} />
<img src="/logo.svg" alt="Fabro" className="h-12 w-12" draggable={false} />
</div>
<div className="rounded-xl border border-line bg-panel/80 p-8 shadow-lg backdrop-blur-sm">
<div className="mx-auto mb-4 flex h-10 w-10 items-center justify-center rounded-full bg-coral/10">

View file

@ -13,7 +13,7 @@ export function loader({ request }: Route.LoaderArgs) {
const suffix = Math.random().toString(16).slice(2, 8);
const manifest = {
name: `Arc-${suffix}`,
name: `Fabro-${suffix}`,
url: baseUrl,
redirect_url: `${baseUrl}/setup/callback`,
callback_urls: [`${baseUrl}/auth/callback`],
@ -39,7 +39,7 @@ export default function Setup({ loaderData }: Route.ComponentProps) {
return (
<AuthLayout>
<h1 className="text-center text-lg font-semibold text-fg">
Set up Arc
Set up Fabro
</h1>
<p className="mt-2 text-center text-sm text-fg-3">
Register a GitHub App to enable OAuth login and repository access.

View file

@ -29,7 +29,7 @@ import type { Route } from "./+types/start";
export const handle = { hideHeader: true, wide: true };
export function meta({}: Route.MetaArgs) {
return [{ title: "Start — Arc" }];
return [{ title: "Start — Fabro" }];
}
export async function loader({ request }: Route.LoaderArgs) {

View file

@ -68,7 +68,7 @@ export async function loader({ request, params }: Route.LoaderArgs) {
export function meta({ data }: Route.MetaArgs) {
const name = data?.data?.control?.name ?? "Verification";
return [{ title: `${name} — Verification — Arc` }];
return [{ title: `${name} — Verification — Fabro` }];
}
type IconComponent = React.ComponentType<{ className?: string }>;

View file

@ -52,7 +52,7 @@ export async function loader({ request }: Route.LoaderArgs) {
export const handle = { wide: true };
export function meta({}: Route.MetaArgs) {
return [{ title: "Controls — Verification — Arc" }];
return [{ title: "Controls — Verification — Fabro" }];
}
type IconComponent = React.ComponentType<{ className?: string }>;

View file

@ -97,7 +97,7 @@ export async function loader({ request }: Route.LoaderArgs) {
export const handle = { wide: true };
export function meta({}: Route.MetaArgs) {
return [{ title: "Verifications — Arc" }];
return [{ title: "Verifications — Fabro" }];
}
type IconComponent = React.ComponentType<{ className?: string }>;

View file

@ -63,7 +63,7 @@ export async function loader({ request, params }: Route.LoaderArgs) {
export function meta({ data }: Route.MetaArgs) {
const name = data?.data?.name ?? "Criterion";
return [{ title: `${name} — Verification — Arc` }];
return [{ title: `${name} — Verification — Fabro` }];
}
type IconComponent = React.ComponentType<{ className?: string }>;

View file

@ -224,7 +224,7 @@ export async function loader({ request, params }: Route.LoaderArgs) {
export function meta({ data }: Route.MetaArgs) {
const title = data?.workflow?.name ?? "Workflow";
return [{ title: `${title}Arc` }];
return [{ title: `${title}Fabro` }];
}
export default function WorkflowDetail({ loaderData }: Route.ComponentProps) {

View file

@ -19,7 +19,7 @@ import type { PaginatedWorkflowList } from "@qltysh/arc-api-client";
import type { Route } from "./+types/workflows";
export function meta({}: Route.MetaArgs) {
return [{ title: "Workflows — Arc" }];
return [{ title: "Workflows — Fabro" }];
}
export const handle = {

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 567 B

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 567 B

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 99 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 99 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB