
I like Tailwind's color system as a design tool: having 50 shades of blue pre-named and ready to go is genuinely useful. But there's a downside: every Tailwind site uses the same 50 shades of blue. When I moved my personal projects to vanilla CSS, I didn't just lose the utility classes; I lost the crutch of a pre-built palette.
Here are the alternatives I've settled on, with actual code.
Uchu is a carefully curated palette of warm, muted colors that work well for content-heavy sites. It's available as a CSS file you can drop into any project.
:root {
--uchu-blue: #3b82f6;
--uchu-indigo: #6366f1;
--uchu-amber: #f59e0b;
--uchu-rose: #f43f5e;
--uchu-slate: #64748b;
}
What I like about it: the colors have enough personality to not look generic, but they're muted enough to not clash with content. It's a good middle ground.
Flexoki is an inky, low-contrast palette designed for long-form reading. It uses warm blacks and off-whites instead of pure #000 and #fff, which reduces eye strain.
:root {
--flexoki-black: #100f0f;
--flexoki-paper: #fffcf0;
--flexoki-muted: #6f6e69;
--flexoki-accent: #205ea6;
}
I use this for my personal blog. The off-white background (#fffcf0) is noticeably more comfortable to read on than pure white, especially in dark mode.
Reasonable Colors is built from the ground up for WCAG compliance. Every color in the palette meets at least AA contrast ratios when used as text on its recommended background.
:root {
--rc-primary: #0057b3;
--rc-primary-bg: #e8f1fa;
--rc-success: #1e7a1e;
--rc-warning: #9e5d00;
--rc-error: #c41e1e;
}
This is what I reach for on client projects where accessibility requirements are explicit. The documentation includes contrast ratios for every combination.
If you want to generate colors programmatically instead of picking from a pre-built palette, look into OKLCH. It's a color model that maintains perceptual uniformity: meaning a 10% lightness step looks like a 10% step to the human eye, unlike HSL where the same numeric shift can look dramatically different depending on the hue. Libraries like culori or oklab.ts make this work in practice.
If you don't want to commit to a full palette, you can get surprisingly far with just CSS custom properties based on a single primary color:
:root {
--primary: #2563eb;
--primary-light: oklch(from var(--primary) 0.7 0.15 h);
--primary-dark: oklch(from var(--primary) 0.3 0.2 h);
--surface: #fafafa;
--text: #171717;
}
The oklch(from ...) syntax is supported in all modern browsers now (2026) and lets you derive an entire palette from one color value without manual picking.
Once you select or generate an alternative palette, integrating it cleanly into Tailwind depends on whether you're using Tailwind CSS v3 or the newer CSS-first engine in Tailwind CSS v4.
tailwind.config.ts)Extend your theme with CSS custom properties or static hex values:
// tailwind.config.ts
import type { Config } from 'tailwindcss';
const config: Config = {
theme: {
extend: {
colors: {
// Semantic palette driven by CSS variables
primary: {
50: 'var(--color-primary-50)',
100: 'var(--color-primary-100)',
500: 'var(--color-primary-500)',
900: 'var(--color-primary-900)',
},
surface: {
light: '#fffcf0', // Flexoki paper background
dark: '#100f0f', // Flexoki black
},
},
},
},
};
export default config;
@theme Directive)In Tailwind CSS v4, configure palettes directly in your primary CSS entry point without tailwind.config.js:
/* app/globals.css */
@theme {
--color-brand-50: oklch(0.97 0.02 260);
--color-brand-100: oklch(0.92 0.05 260);
--color-brand-500: oklch(0.62 0.24 260);
--color-brand-900: oklch(0.25 0.12 260);
--color-canvas-paper: #fffcf0;
--color-canvas-ink: #100f0f;
}
Now classes like bg-brand-500, text-canvas-ink, and border-brand-100 are immediately available in your JSX with full autocomplete.
Interactive frosted glass generator with live Tailwind export
Design modern frosted glass UI with live backdrop-filter sliders, blur, opacity, borders, and copy ready-to-use Tailwind CSS or pure CSS snippets.
When replacing Tailwind's battle-tested defaults with custom hues, check these 3 rules before deploying:
:hover), active (:active), and keyboard focus rings (:focus-visible).Why is OKLCH preferred over HSL when generating programmatic color scales for design systems?
Clean AI CLI logs, build cron expressions, decode JWTs, and calculate chmod permissions offline.

Tailwind CSS v4 brings massive performance improvements, a new engine, and zero-configuration setups. Explore the new features and learn how to migrate your existing projects.
Read more
Stop guessing between CSS Grid and Flexbox. Side-by-side comparison of 1D vs 2D layouts with interactive visual demos, responsive alignment rules, and a decision tree.
Read more
Learn how to master css hardware accelerated animations, the difference between css transform vs opacity, and when to use css spring animations.
Read more