After analyzing your codebase, I've identified several brand consistency issues across colors, typography, and design tokens. You have 130+ instances of hardcoded hex colors across 35 files, inconsistent purple variants, and mixed font usage patterns.
You have MULTIPLE purple variants scattered across the codebase:
In tailwind.config.ts:
ox-purple: #9455f4ox-purple-2: #7A45C3
Hardcoded in components:
#9159E2(Brands.tsx - gradient start)#341e7b(Brands.tsx - gradient end)#321D76(Brands.tsx - pseudo element)#5728f4(custom-button.tsx - gradient start)#5100FF(custom-button.tsx - gradient end)#6348fc(custom-button.tsx - border)#2c04b1(custom-button.tsx - box shadow)#3F1FBC(header.tsx - flickering grid)purple-400,purple-600(Tailwind utilities)
Impact: Your brand's primary color (purple) is inconsistent across the application, creating a disjointed visual identity.
Multiple black/dark backgrounds:
background: #101010(tailwind config)#0E0E10(ox-black-1)#15161A(ox-black-2)#141414(ox-sidebar)#1E1E1E(ox-profile-card)#1A1A1A(ox-content)#363636(ox-header)#111111(card-stack.tsx)#0d1117,#161b22,#30363d(navbar.tsx - GitHub button styles)
Impact: Inconsistent surface colors make the UI feel unpolished and reduce hierarchy clarity.
border-primary: #252525(tailwind config)border-[#252525](used 20+ times across components)#292929(card-stack.tsx)#30363d(navbar.tsx)border: hsl(var(--border))(defined but underutilized)
ActiveTag.tsxuses custom green:bg-[#002d21]andtext-[#00bd7c]- Not defined in design system at all
Found 130 instances of hardcoded hex colors like:
// Bad - scattered throughout components
className="bg-[#101010] border-[#252525]"
from-[#9159E2] to-[#341e7b]Instead of using:
// Good - using design tokens
className="bg-background border-border-primary"
from-ox-purple to-ox-purple-2In layout.tsx:
const dmReg = localFont({ src: "./fonts/DMMono-Regular.ttf", variable: "--font-dm-mono-req" })
const dmMed = localFont({ src: "./fonts/DMMono-Medium.ttf", variable: "--font-dm-mono-med" })
// But also imports:
import { GeistSans } from "geist/font/sans";In tailwind.config.ts:
fontFamily: {
DMfont: ["var(--font-dm-mono-med)", "var(--font-dm-mono-req)"],
MonaSans: ["var(--font-mona-sans-med)", "var(--font-mona-sans-req)"]
}In globals.css:
body {
@apply bg-background text-foreground font-MonaSans;
}Problems:
- Mona Sans is referenced but NEVER loaded in
layout.tsx - GeistSans is used in body but MonaSans is applied globally via CSS
- Font variables for Mona Sans are defined but fonts aren't loaded
font-monois used extensively (30+ times) but no clarity on which mono font
Components use different font approaches:
font-mono(30+ instances) - unclear if this refers to DMfont or system defaultfont-sans(5+ instances) - unclear which sans-seriffont-DMfont- rarely used directlyfont-MonaSans- defined but fonts not loaded
Breakdown:
- Color Consistency: 2/10 - Multiple purple variants, 130+ hardcoded colors
- Typography Consistency: 4/10 - Font loading issues, unclear hierarchy
- Design Token Usage: 3/10 - Tokens defined but underutilized
- Maintainability: 5/10 - Too many magic values make updates difficult
Create /apps/web/src/lib/design-tokens.ts:
export const colors = {
// Brand Colors
brand: {
purple: {
DEFAULT: '#9455f4', // Primary brand purple
light: '#a675f5', // Lighter variant
dark: '#7A45C3', // Darker variant
gradient: {
from: '#9455f4',
to: '#7A45C3',
}
}
},
// Backgrounds
background: {
primary: '#101010', // Main background
secondary: '#141414', // Sidebar, cards
tertiary: '#1A1A1A', // Content areas
elevated: '#1E1E1E', // Elevated cards
},
// Borders
border: {
DEFAULT: '#252525', // Primary border
light: '#363636', // Lighter borders
focus: '#9455f4', // Focus states
},
// Status Colors
status: {
success: {
bg: '#002d21',
text: '#00bd7c',
border: '#00bd7c',
},
// Add error, warning, info as needed
}
} as const;
export const gradients = {
purple: 'linear-gradient(to bottom, #9455f4, #7A45C3)',
purpleText: 'linear-gradient(to bottom, #9455f4, #341e7b)',
background: 'radial-gradient(circle at center, #101010 30%, transparent 100%)',
} as const;import { colors } from './src/lib/design-tokens';
const config: Config = {
theme: {
extend: {
colors: {
background: colors.background.primary,
foreground: "#ffffff",
// Brand colors
brand: {
purple: {
DEFAULT: colors.brand.purple.DEFAULT,
light: colors.brand.purple.light,
dark: colors.brand.purple.dark,
}
},
// Surface colors
surface: {
primary: colors.background.primary,
secondary: colors.background.secondary,
tertiary: colors.background.tertiary,
elevated: colors.background.elevated,
},
// Border colors
border: {
DEFAULT: colors.border.DEFAULT,
light: colors.border.light,
focus: colors.border.focus,
},
// Status colors
success: colors.status.success,
// Keep shadcn/ui tokens
card: {
DEFAULT: "hsl(var(--card))",
foreground: "hsl(var(--card-foreground))",
},
// ... rest of shadcn tokens
},
}
}
};Before:
<div className="bg-[#101010] border-[#252525]">
<span className="from-[#9159E2] to-[#341e7b]">After:
<div className="bg-surface-primary border-border">
<span className="from-brand-purple to-brand-purple-dark">import localFont from "next/font/local";
import { GeistSans } from "geist/font/sans";
// DM Mono for code/terminal elements
const dmMono = localFont({
src: [
{ path: "./fonts/DMMono-Regular.ttf", weight: "400", style: "normal" },
{ path: "./fonts/DMMono-Medium.ttf", weight: "500", style: "normal" },
],
variable: "--font-dm-mono",
display: "swap",
});
// Use GeistSans as primary sans-serif (REMOVE Mona Sans references or add it)
// Option 1: Stick with Geist Sans
const geistSans = GeistSans;
// Option 2: IF you have Mona Sans fonts, load them:
// const monaSans = localFont({
// src: [
// { path: "./fonts/MonaSans-Regular.woff2", weight: "400", style: "normal" },
// { path: "./fonts/MonaSans-Medium.woff2", weight: "500", style: "normal" },
// ],
// variable: "--font-mona-sans",
// display: "swap",
// });
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="en" suppressHydrationWarning>
<body className={`${geistSans.className} ${dmMono.variable} antialiased`}>
{children}
</body>
</html>
);
}fontFamily: {
sans: ["var(--font-geist-sans)", "system-ui", "sans-serif"],
mono: ["var(--font-dm-mono)", "monospace"],
}@layer base {
body {
@apply bg-background text-foreground font-sans;
}
code, pre, kbd {
@apply font-mono;
}
}Phase 1: Core Components (Week 1)
-
custom-button.tsx- Usebrand-purpletokens -
header.tsx- Usesurface-*andbordertokens -
navbar.tsx- Consolidate GitHub button colors -
ActiveTag.tsx- Usesuccesstokens
Phase 2: Landing Page (Week 2)
-
Hero.tsx- Replace hardcoded colors -
Brands.tsx- Use brand gradient tokens -
Bento.tsx- Use surface tokens -
CTA.tsx- Use brand tokens
Phase 3: Dashboard (Week 3)
-
ProjectsContainer.tsx- Keep language colors (they're semantic) -
Sidebar.tsx- Use surface tokens - All card components - Use surface tokens
Create /apps/web/docs/DESIGN_SYSTEM.md:
# Opensox Design System
## Colors
### Brand Colors
- Primary: `brand-purple` (#9455f4) - CTAs, links, highlights
- Gradient: `from-brand-purple to-brand-purple-dark`
### Surfaces
- `surface-primary` (#101010) - Main background
- `surface-secondary` (#141414) - Sidebars, navigation
- `surface-tertiary` (#1A1A1A) - Content containers
- `surface-elevated` (#1E1E1E) - Cards, modals
### Borders
- `border` (#252525) - Default borders
- `border-light` (#363636) - Lighter borders for nested elements
- `border-focus` (brand-purple) - Focus states
## Typography
### Font Families
- **Sans-serif (Primary):** Geist Sans - Body text, headings
- **Monospace:** DM Mono - Code, terminal output, tech content
### Usage
```tsx
// Body text
<p className="font-sans">Regular text</p>
// Code/Terminal
<code className="font-mono">Terminal output</code>- Use design tokens:
bg-surface-primary border-border - Use brand purple for CTAs and highlights
- Use semantic color names
- Hardcode hex colors:
bg-[#101010] - Use random purple variants
- Mix different surface colors arbitrarily
---
## 🛠️ IMPLEMENTATION CHECKLIST
### Immediate Actions (This Week)
- [ ] Create `design-tokens.ts` with all color constants
- [ ] Update `tailwind.config.ts` with new color system
- [ ] Fix font loading in `layout.tsx` (add Mona Sans OR remove references)
- [ ] Create `DESIGN_SYSTEM.md` documentation
### Short-term (Next 2 Weeks)
- [ ] Migrate core components (buttons, headers, navbars)
- [ ] Replace all `#9159E2`, `#341e7b` purple variants with tokens
- [ ] Replace all `#252525` border colors with `border` token
- [ ] Update all background colors to use `surface-*` tokens
### Medium-term (Next Month)
- [ ] Audit and migrate all 35 files with hardcoded colors
- [ ] Create Storybook/component library documentation
- [ ] Add ESLint rule to prevent hardcoded colors
- [ ] Set up design token tests
---
## 📈 EXPECTED IMPROVEMENTS
After implementing these recommendations:
1. **Consistency:** Brand will look cohesive across all pages
2. **Maintainability:** Update colors in one place, change everywhere
3. **Performance:** Reduced CSS bundle size (no duplicate color definitions)
4. **Developer Experience:** Clear guidelines, easier onboarding
5. **Scalability:** Easy to add dark/light mode, themes, or rebrand
**New Brand Consistency Score Target: 9/10** 🟢
---
## 🔍 ADDITIONAL NOTES
### Language Colors Exception
The `languageColors` object in `ProjectsContainer.tsx` is FINE as-is:
```tsx
const languageColors: Record<string, string> = {
javascript: "bg-yellow-500/15 text-yellow-500",
typescript: "bg-blue-500/15 text-blue-500",
// ...
};
These are semantic colors representing programming languages (industry standard).
Consider creating reusable gradient classes:
.gradient-purple {
@apply bg-gradient-to-b from-brand-purple to-brand-purple-dark;
}
.gradient-text-purple {
@apply bg-gradient-to-b from-brand-purple to-brand-purple-dark bg-clip-text text-transparent;
}🔴 CRITICAL:
- Consolidate purple brand colors (you have 8+ variants!)
- Fix font loading (Mona Sans is referenced but not loaded)
🟡 HIGH:
3. Create design-tokens.ts file
4. Update tailwind.config.ts with new tokens
5. Document design system
🟢 MEDIUM: 6. Migrate components phase by phase 7. Add ESLint rules for hardcoded colors
If you need help implementing any of these recommendations, let me know and I can:
- Create the design tokens file
- Update specific components
- Set up ESLint rules
- Create migration scripts
Would you like me to start implementing these fixes?