Website profiles · Technology insights · Alternatives

tints.dev

A fast and flexible, HSL-tweakable palette generator and API for Tailwind CSS

No paid content found
Visit website
Profile views 10 Outbound visits 1 Normal
Tailwind CSS 11-color Palette Generator and API Full homepage screenshot

At a glance

Category
Color Tools
Language
English
Paid-content signal
No paid content foundObserved
Registered
2022
Hosting
CloudflareInferred
HTTPS certificate trusted
PassedObserved
Last updated

Website review

This review may include AI-generated content and is not individually verified. Domain, certificate and other facts come from the observed data on this page.

What is tints.dev?

tints.dev is a browser-based palette generator and API for Tailwind CSS. You give it a base hex color, and it produces a full 50–950 color scale you can copy into Tailwind theme variables. The page also exposes an API that returns a palette from a single hex value, aimed at design tools that need to generate scales on the fly.

H3 What you can actually do with it

  • Generate a scale from one color. Enter a valid hexadecimal value; by default it is treated as stop 500, but you can set it to any stop from 50 to 950.
  • Tweak the spread. Adjust hue shift, saturation shift, and minimum/maximum lightness or luminance to control how colors behave toward white and black.
  • Switch modes. Toggle between linear and perceived lightness, and between lightness and luminance, to get different distributions at the extremes.
  • Choose output format. The generated theme block can be shown in oklch, hex, or hsl, ready to paste into a CSS file.
  • Fetch palettes programmatically. The API returns a palette using only the base hex value, with no HSL tweaks.

H3 Who it suits

Front-end and design-system developers who already use Tailwind and want a quick starting scale rather than hand-picking eleven stops. It is also useful for tool builders who need a single-hex-to-palette endpoint. Teams without Tailwind can still use the output, but the surrounding workflow is clearly Tailwind-oriented.

H3 A practical trade-off

The page itself notes that the principles are inspired by Refactoring UI, and that the same book recommends against automated tools like this one. That is a fair warning: generated scales are a fast starting point, not a substitute for checking contrast, brand fit, and real UI states. If you want a comparison point for hand-tuned scales, Tailwind’s own palette reference is at Tailwind CSS.

H3 Next step

Pick a brand or primary color, set it as stop 500, and generate the scale. Then test the 50, 500, and 950 stops in actual components before committing the values to your theme.

How do I use the Palette API to generate a Tailwind CSS palette from a hex color?

The Palette API on tints.dev turns a single hex color into a Tailwind-ready 50–950 palette. You send the hex value, and it returns the full set of stops already formatted for Tailwind's CSS variables. It is meant for design tools or build steps that need to generate a palette on the fly from one base color, without manually tweaking each stop.

The API currently returns a palette based only on the base hex value. The HSL controls you see in the web UI — hue shift, saturation shift, and lightness distribution — are not available through the API, so treat the API output as the untweaked version.

A minimal workflow

  1. Pick your base hex color (for example, your brand blue).
  2. Request the palette from the API using that hex value.
  3. Copy the returned @theme block into your Tailwind CSS file.
  4. Use the generated variables as --color-blue-50 through --color-blue-950 in your classes.

The output uses oklch() color values by default, which is what Tailwind CSS v4 expects. The page also shows hex and HSL output modes you can switch between in the UI, so match the format to your setup.

Example result shape

A generated palette looks like a block of custom properties:

@theme {
  --color-blue-50: oklch(0.965 0.015 273.9);
  --color-blue-100: oklch(0.924 0.033 272.8);
  /* ... through --color-blue-950 */
}

Paste that into your CSS file, and Tailwind picks up the blue scale automatically.

When to use the API vs. the UI

Situation Better choice
Generating palettes inside a design tool or script API
You need hue, saturation, or lightness tweaks Web UI
One-off palette for a personal project Web UI
Reproducible palettes across many projects API

A practical next step: generate one palette in the UI first, compare the hex output against the API result for the same base color, and confirm they match before wiring the API into a build pipeline. If they differ, your base stop assumption is likely the cause — the UI treats the input as stop 500 by default, while the API derives the whole scale from the single value.

For background on the palette logic, the site points to the Refactoring UI book by Adam Wathan and Steve Schoger, which inspired the lightness and saturation principles. Notably, that book recommends against automated palette tools, so use this as a fast starting point and adjust the extremes by eye where brand accuracy matters. The tool's own page is at Tailwind CSS 11-color Palette Generator and API.

How can I adjust hue, saturation, and lightness to create a custom Tailwind CSS color palette?

At tints.dev, the palette generator exposes three main controls — Hue Shift, Saturation Shift, and Lightness Distribution / Minimum–Maximum Lightness — plus a base hex value that anchors the whole 50–950 scale. You pick a starting color (by default it fills stop 500, but you can move it to any stop from 50 to 950), then tweak the shifts to spread the remaining stops toward white and black.

Tailwind CSS 11-color Palette Generator and API

What each control does in practice

  • Hue Shift: rotates the hue across the scale. The page notes this is most useful when your base color has 100% saturation, where shifting hue up or down makes the palette less flat.
  • Saturation Shift: changes how saturated the extremes become. The guidance is that a low-saturation base color becomes more interesting if you increase saturation at the ends of the scale.
  • Lightness / Luminance: two related modes. Adjusting Minimum and Maximum Lightness (or Luminance) controls how far the lightest and darkest stops push toward white and black. Switching between Lightness and Luminance produces a different spread at the extremes.
  • Output format: you can output in oklch, hex, or hsl and copy a @theme block for Tailwind CSS v4, so the palette drops straight into your CSS.

A concrete workflow

  1. Enter a valid hex value as the initial color — pick the stop it represents (500 is the default).
  2. If the base is fully saturated, nudge Hue Shift to avoid a one-note ramp.
  3. If the base is muted, raise Saturation Shift so the light and dark ends don't turn gray.
  4. Widen Minimum/Maximum Lightness to push stops 50 and 950 toward white and black, then compare Lightness vs Luminance mode to see which spread you prefer.
  5. Copy the generated @theme values and paste them into your CSS file.

Trade-offs to weigh

The page itself points out that the approach is inspired by Refactoring UI, and that the same book recommends against automated tools like this one. That's worth taking seriously: a generator is fast for bootstrapping a consistent ramp, but it won't know your brand, accessibility contrast targets, or how the color behaves against your actual backgrounds. Use it to get a solid starting scale, then hand-check contrast and adjust individual stops.

The Palette API is the other half of the offering: it returns a 50–950 palette from a single hex value, which is handy for design tools that need to generate a scale on the fly. Note the current limitation — the API returns the palette from the base hex only, with no HSL tweak options, so anything you'd normally do with the shift controls has to be done in the UI.

Next step: generate one palette from your brand hex, export the @theme block, and test the 50, 500, and 950 stops against your real UI backgrounds before committing the full scale.

What are the best practices for generating accessible color palettes for Tailwind CSS?

Start from contrast checks, not from the palette generator. A palette is accessible when the text/background pairs you actually ship meet WCAG contrast minimums (4.5:1 for normal text, 3:1 for large text and UI boundaries), and when color is never the only signal for state or meaning. Generators help you build the scale; they don't certify the pairings.

Tailwind CSS 11-color Palette Generator and API is a useful concrete example of the workflow: you set a base hex at a chosen stop (default 500), then tune hue, saturation and lightness distribution across 50–950, and export CSS variables or an @theme block in oklch, hex or hsl. Its own documentation notes the approach is inspired by Refactoring UI, and that the same book advises against automated tools — the tool is positioned as a fast-track for creating palettes, not a replacement for judgment.

A practical routine

  1. Pick one brand hue and generate the 50–950 scale.
  2. Decide which stops are for surfaces (usually 50–200), borders (200–300), and text (600–950).
  3. Test real pairings: 600 text on 50 background, 950 text on 100 background, white on 600, etc.
  4. Check hover, focus, disabled and dark-mode variants — those are where contrast usually fails.
  5. Verify with a contrast checker, then re-tune lightness rather than swapping hues.

Why the HSL tweaks matter

The generator exposes hue shift, saturation shift, and minimum/maximum lightness or luminance, with a linear/perceived toggle. Practically:

  • Highly saturated base colors can look flat across the scale; a small hue shift keeps light and dark stops from looking muddy.
  • Low-saturation base colors often need saturation increased at the extremes so the lightest and darkest stops don't collapse into gray.
  • Adjusting min/max lightness spreads the ramp toward white and black, which is what gives you room for accessible text-on-surface pairs.

Where to verify

Task What to use
Build the 50–950 ramp tints.dev
Check contrast ratios of specific pairs WebAIM Contrast Checker
Confirm the rules themselves W3C WCAG

Decision criteria

Choose a base stop that already has enough contrast against your lightest surface, then let the ramp do the rest. If your primary button color can't pass white-on-color at 600, shift the button to 700 rather than darkening the whole palette. If you need programmatic generation, note that tints.dev's API returns a palette from a single hex value without HSL tweaks — so any hue/saturation adjustments you make in the UI won't carry over to API-generated palettes.

Next step: generate a palette, then immediately test the four or five pairings your interface actually uses. If any fail, adjust lightness distribution before touching hue.

How does tints.dev compare to other Tailwind CSS palette generators?

tints.dev is a focused palette generator for Tailwind CSS that produces a full 50–950 scale from a single base color, with an API for programmatic use. Its distinguishing trait is HSL-style fine-tuning—hue shift, saturation shift, and lightness distribution controls—rather than just spitting out a scale from one hex value.

Compare it to other common approaches:

Tool type Typical strength Where tints.dev differs
tints.dev HSL tweaks, lightness distribution, API, Tailwind v4 @theme output More manual control; API returns only the base palette without HSL tweaks
General palette generators (Coolors, Adobe Color) Broad color exploration, mood boards, multi-color schemes Not Tailwind-specific; you must map stops to 50–950 yourself
Tailwind's own default palette Battle-tested, consistent across projects Not customizable from your brand color
Hand-rolled HSL/OKLCH scripts Full control More setup; no built-in UI or copy-ready CSS variables

When to pick tints.dev: you have a brand hex and want a Tailwind-shaped scale fast, you want to nudge hue/saturation/lightness to avoid muddy extremes, or you need an API to generate palettes inside a design tool. The page notes the API currently returns a palette from the base hex only, with no HSL tweak options—so if your workflow depends on those tweaks, generate in the UI and copy the output.

Trade-off to weigh: the site itself cites Refactoring UI, which recommends against automated palette tools. tints.dev is positioned as a fast-track starting point, not a replacement for design judgment. Check contrast and perceived lightness in context, especially for text and UI states, rather than trusting the generated scale outright.

Next step: pick your base hex, set it as stop 500, then adjust the minimum/maximum lightness to spread the ends toward white and black. If the base is highly saturated, try a small hue shift; if it is desaturated, raise saturation at the extremes. Copy the resulting @theme block into your CSS. For broader color exploration before committing, Coolors and Adobe Color are useful complements; for Tailwind's built-in reference palette, see Tailwind CSS.

Can I use tints.dev to generate palettes for dark mode or other design systems?

Yes. tints.dev generates a full 50–950 Tailwind palette from a single base hex value, and that range is exactly what you need for dark mode and for feeding other design systems.

For dark mode, the practical workflow is to pick your brand colour as the 500 stop, then use the darker stops (800–950) as surfaces and the lighter stops (50–200) as text or accents in dark themes — or invert that logic if your dark theme uses light text on deep backgrounds. The generator exposes controls that matter here: minimum and maximum lightness/luminance let you spread the extremes toward pure white and black, and you can switch between Lightness and Luminance modes to get a different distribution at those extremes. A palette tuned in Luminance mode often produces more even perceived contrast steps, which helps when you're checking text-on-surface pairs in a dark UI.

For other design systems, the output is not locked to Tailwind. The page shows copy-ready output in oklch, hex and hsl, plus a Tailwind @theme block with CSS custom properties. That means you can:

  • Paste the @theme variables straight into a Tailwind v4 CSS file.
  • Take the hex or hsl list into Figma variables, a SCSS map, or a tokens JSON file.
  • Use the Palette API to fetch a 50–950 palette from a single hex value — useful for design tools or build scripts that need to generate tokens on the fly.

Trade-offs to know before you commit:

Need What tints.dev gives you What to plan for
Dark-mode surfaces Dark stops from the same hue family Manually verify contrast ratios; generated steps aren't accessibility-checked
Non-Tailwind systems hex / hsl / oklch output You convert to your own token format yourself
Automated pipelines Palette API The API returns a palette from the base hex only — no HSL tweaks via API
Hue-heavy or low-saturation brands Hue Shift and Saturation Shift controls Tuning is manual and per-palette

Note that the page itself cites Refactoring UI (Adam Wathan and Steve Schoger) as inspiration and points out that the book actually recommends against automated palette tools — the stated purpose here is fast-tracking a first draft, not replacing design judgement.

Next step: generate your brand palette once, copy the oklch or hex values, then build your dark-mode set by remapping which stops serve as background, surface and text. If you want a second reference point for how a mature system structures its dark tokens, compare against Material Design 3 or Tailwind CSS's own colour documentation.

Related questions

More questions →
How to Use a tints.dev Palette in Your Tailwind CSS Project

tints.dev generates a 50–950 color palette and outputs it as Tailwind CSS theme variables, so you can paste the result straight into your CSS. The tool supports Tailwind CSS v4 and v3, and lets you export in oklch, hex, or hsl. The main condition to know: the Palette API returns a palette built from a single base hex value only — it does not apply your HSL tweaks (hue shift, saturation shift, lightness distribution) that you set in the visual creator.

Step 1: Generate the palette

Open the Palette Creator on tints.dev and set your starting point:

  • Initial Value — enter a valid hexadecimal color. By default this maps to stop 500, but you can assign it to any stop from 50 to 950.
  • Hue Shift — useful when your base color has 100% saturation; shifting the hue up or down makes the palette more interesting.
  • Saturation Shift — for base colors with little saturation, increasing saturation at the extremes keeps the palette from looking washed out.
  • Maximum / Minimum Lightness — spread the remaining colors toward white and black.
  • Lightness vs. Luminance — switching between these modes produces a different spread of colors at the extremes.

These controls follow principles from the Refactoring UI book by Adam Wathan and Steve Schoger. Note that the same book actually recommends against automated palette tools — tints.dev exists to fast-track a first draft, not to replace design judgment.

Step 2: Pick your output format

Before copying, choose the color mode and Tailwind version:

Setting Options
Tailwind CSS Version 4 or 3
Output color mode oklch, hex, hsl

The output is a set of CSS custom properties following Tailwind's color naming convention, from --color-<name>-50 through --color-<name>-950. For example, a blue palette in oklch looks like this:

@theme {
  --color-blue-50: oklch(0.965 0.015 273.9);
  --color-blue-100: oklch(0.924 0.033 272.8);
  --color-blue-200: oklch(0.847 0.071 271.55);
  --color-blue-300: oklch(0.771 0.108 268.07);
  --color-blue-400: oklch(0.701 0.144 265.29);
  --color-blue-500: oklch(0.623 0.188 259.81);
  --color-blue-600: oklch(0.532 0.171 258.32);
  --color-blue-700: oklch(0.426 0.139 258.76);
  --color-blue-800: oklch(0.33 0.107 258.44);
  --color-blue-900: oklch(0.234 0.077 258.58);
  --color-blue-950: oklch(0.189 0.063 258.86);
}

Step 3: Paste into your CSS

Use the Copy to Clipboard button, then paste the block into the CSS file that holds your Tailwind theme configuration. Because the variables use Tailwind's standard naming (--color-blue-500, etc.), utilities like bg-blue-500, text-blue-700, and border-blue-200 resolve to your new palette without any extra mapping.

Expected result: after saving, your Tailwind color utilities render with the generated values. If you use Tailwind v4, the @theme block is the correct place for these definitions; if you selected v3, use the output format that matches your v3 configuration.

Using the Palette API

The Palette API fetches a palette programmatically, which is handy for design tools that need to turn a single hex value into a full 50–950 scale. The important limitation: the API returns a palette using only the base hex value — there are no options to apply HSL tweaks. So if your design depends on hue shift, saturation shift, or custom lightness distribution, generate that palette in the creator and copy the output rather than calling the API.

Common snags

  • Tweaks missing from API output. If a palette fetched via API looks flatter than what you saw in the creator, that's expected — the API ignores HSL adjustments.
  • Wrong Tailwind version. The v3 and v4 outputs differ. Match the version selector to your project before copying.
  • Color mode mismatch. oklch, hex, and hsl are all valid, but pick the one your project already uses to avoid mixing formats in one theme.

tints.dev was made by Simeon Griggs, built with Tailwind CSS, React Router, Headless UI, and HeroIcons, hosted on Cloudflare, with content in Sanity.io.

Cybersecurity Basics: What It Protects and How to Apply It to Your Website

Cybersecurity is the practice of keeping your data, accounts, and services from being accessed, stolen, altered, or knocked offline by someone who shouldn't have them. For a personal site or small online presence, that reduces to a short list of concrete jobs: protect your login credentials, keep your software current, serve traffic over HTTPS, and lock down the domain and DNS layer that everything else depends on. You don't need an enterprise security team to cover the basics — but you do need to treat your registrar account and your hosting account as the two most valuable things you own, because whoever controls those controls the site.

What cybersecurity actually protects

It helps to separate the assets from the threats, because most small-site incidents come from a handful of causes.

Asset What can go wrong Primary protection
Accounts (registrar, hosting, email, CMS admin) Credential theft, password reuse, session hijacking Unique passwords + multi-factor authentication (MFA)
Data in transit Eavesdropping, tampering, browser warnings HTTPS/TLS certificate
Software (CMS, plugins, themes) Malware, backdoors, defacement Timely updates, minimal plugins
Domain and DNS records Unauthorized transfer, DNS hijacking, spoofed email Registrar account protection, registrar lock, DNSSEC
Availability DDoS, resource exhaustion Hosting/CDN/WAF layer

The pattern: each asset has one or two controls that remove most of the risk. You don't need all of them on day one, but skipping the account and domain layers is the mistake that's hardest to undo.

The threat categories a small site actually faces

  • Credential theft — reused or weak passwords, or credentials leaked from another breached service. This is the most common way small sites fall.
  • Phishing — fake login pages or "your domain is expiring" emails designed to capture your registrar or hosting password.
  • Malware and backdoors — usually arriving through an outdated CMS, plugin, or theme.
  • DDoS — flooding a site until it's unreachable; often handled by your host or a CDN rather than by you.
  • Misconfiguration — an open admin panel, directory listing, or default credentials left in place.

Notice that four of the five are about access, not exotic exploits. That's why the basics work.

Core protections to apply first

Use strong, unique passwords and a password manager

Every account tied to your site — registrar, host, CMS, email — should have a different password. A password manager makes this practical. The goal is that one leaked password can't be replayed anywhere else.

Turn on multi-factor authentication

MFA is the single highest-value control for your registrar and hosting accounts. Even if a password is stolen, an attacker without the second factor can't log in. Prefer an authenticator app or hardware key over SMS where the service supports it.

Serve everything over HTTPS

An HTTPS/TLS certificate encrypts traffic between visitors and your site and prevents browser "not secure" warnings. Most hosts and registrars offer a free certificate; the important part is that it's installed and that HTTP redirects to HTTPS.

Update promptly and keep the surface small

Apply CMS, plugin, and theme updates as they're released, and delete anything you're not using. Fewer components means fewer places for a known vulnerability to sit unpatched.

Apply least privilege

Give each person (and each integration) only the access they need. Don't run your site day-to-day from an administrator account, and don't hand out admin rights for tasks that don't require them.

Secure the domain and DNS layer

This layer is easy to overlook and expensive to lose, because a hijacked domain can point anywhere.

  • Protect the registrar account with a unique password and MFA. Your registrar account is the root of control over the domain.
  • Enable the registrar lock (often called a transfer lock or clientTransferProhibited) so the domain can't be moved without your action.
  • Keep registrant contact email secure — that inbox is often the recovery path for the domain.
  • Enable DNSSEC where your registrar and DNS provider support it, so responses can be cryptographically validated and spoofing is harder.
  • Watch for unauthorized DNS changes — if records you didn't touch appear, treat it as a compromise.

Porkbun is an ICANN-accredited domain registrar, which means it operates under ICANN's registrar rules — relevant here because those rules govern transfers, locks, and registrant contact requirements. Its site lists Stripe among its payment platforms. Beyond that, check your specific registrar's and DNS provider's current feature set for lock and DNSSEC support, since availability varies.

Warning signs and first steps if something looks wrong

Watch for: unexpected DNS records, visitors reporting malware warnings, unexplained admin accounts, a sudden traffic drop, or emails about transfers you didn't request.

If you suspect a compromise:

  1. Change passwords on registrar, hosting, and CMS accounts, starting with the registrar.
  2. Revoke active sessions and reset MFA where possible.
  3. Check DNS records against what you expect and revert unauthorized changes.
  4. Restore from a known-good backup if files were altered.
  5. Re-scan and update the software before reopening the site.

Containment first, then recovery — don't try to clean a live, still-compromised site.

What to outsource vs. manage yourself

Decide based on Manage yourself Outsource
Site size Small static or low-traffic site Growing or high-traffic site
Risk tolerance Low-stakes personal project Anything handling user data or payments
Time You can patch and monitor regularly You can't commit to ongoing upkeep
Threats Basic credential and update hygiene DDoS, WAF, and 24/7 monitoring needs

Hosting-level security, CDN, and WAF are usually worth outsourcing because they require scale and constant attention. Account hygiene, MFA, updates, and domain/DNS protection are things you should keep in your own hands regardless of size — they're cheap to do and costly to skip.

What Is OpenAPI-Generated API Documentation and How Does It Work?

OpenAPI-generated API documentation is reference documentation that is produced automatically from an OpenAPI description file rather than written by hand. You write (or generate) a machine-readable specification of your API — endpoints, parameters, request bodies, responses, schemas, and auth — and a documentation tool reads that file and renders a browsable, often interactive reference site. The spec becomes the single source of truth; the docs become a build artifact.

This differs from manually written docs in one fundamental way: with hand-written docs, the prose is the source of truth and the API is described separately. With spec-driven docs, the API description is the source, and every page, table, and code sample is derived from it.

How the workflow actually runs

A typical spec-driven documentation pipeline has five stages:

  1. Author or generate the spec. You either write an OpenAPI document by hand (YAML or JSON), or generate it from code annotations, framework metadata, or a design-first editor. Design-first means the spec is written before implementation; code-first means it is extracted from existing code.
  2. Validate and lint. The spec is checked against the OpenAPI schema and against style rules — consistent naming, required descriptions, no undocumented 4xx responses, no orphaned schemas.
  3. Bundle and transform. Multi-file specs are combined, $ref pointers are resolved, and the document is optionally split into per-tag or per-version outputs.
  4. Render. A documentation tool converts the spec into HTML: an endpoint list, a sidebar of operations, parameter tables, response schemas, and a "try it" console.
  5. Publish and version. The rendered site is deployed, and each API version gets its own snapshot so consumers can read docs matching the version they call.

Steps 2 through 5 are usually automated in CI. If the spec fails validation, the docs build fails — which is the point.

Spec-driven vs. hand-written documentation

Dimension OpenAPI-generated Hand-written
Source of truth The spec file The prose
Consistency with the API High, if the spec is accurate Drifts as the API changes
Effort per endpoint Low after setup Repeated for every endpoint
Narrative and tutorials Weak; needs separate pages Strong
Code samples Generated per language from schemas Written and maintained manually
Customization Bounded by the tool's templates Unlimited
Failure mode Accurate spec, poor docs, or stale spec Beautiful docs that describe an API that no longer exists

The practical conclusion most teams reach: generate the reference, write the guides. Reference material is repetitive and mechanical, which is exactly what generation is good at. Conceptual explanations, migration notes, and tutorials carry judgment that a spec cannot express.

What you get out of the box

Generated reference pages commonly include:

  • An operation list grouped by tag or path, with HTTP method and path.
  • Parameter tables showing name, location (path, query, header, cookie), type, required flag, and description.
  • Request and response schemas rendered as expandable trees, including nested objects and arrays.
  • Authentication details pulled from the securitySchemes section.
  • Interactive request consoles that let a reader send a real call from the browser.
  • Generated code samples in several languages, derived from the same schemas.
  • Multiple output formats, such as a static site, a single HTML file, or a mock server.

Because all of these come from one document, changing a field name in the spec updates the parameter table, the schema tree, and every code sample at once.

Where spec-driven documentation breaks down

Generation is not free. The trade-offs are real:

Spec quality becomes documentation quality. A field with no description produces a table row with an empty cell. A vague summary produces a vague heading. Tools can enforce presence of descriptions via linting, but they cannot enforce that the description is useful.

Customization has limits. If you need a page that does not map to an OpenAPI concept — a conceptual overview, a pricing explanation, a comparison of two endpoints — you write it outside the generator and link to it.

Not everything is expressible. Webhooks, streaming responses, long-polling behavior, and complex multi-step flows are awkward or impossible to describe fully in OpenAPI. Those need prose.

The spec can go stale. If the spec is maintained separately from the implementation, it drifts just like hand-written docs. The mitigation is to generate the spec from code, or to test the implementation against the spec in CI.

Interactive consoles need care. A "try it" button that hits a production API with real credentials is a security and rate-limit problem. Point it at a sandbox, or disable it.

Deciding whether to adopt it

Adopt spec-driven reference documentation if most of these are true:

  • Your API has more than a handful of endpoints, or changes frequently.
  • You ship client SDKs or code samples in more than one language.
  • Multiple teams consume the API and need a consistent, always-current reference.
  • You already have, or are willing to maintain, an OpenAPI description.

Stay with hand-written docs, or a hybrid, if:

  • Your API is small and stable, and the reference fits on one page.
  • Your documentation is mostly conceptual and contains little endpoint-level detail.
  • You cannot commit to keeping the spec in sync with the implementation.

A reasonable middle path: generate the reference from the spec, and hand-write the getting-started guide, authentication walkthrough, and error-handling page. Link the two directions so readers can move from concept to endpoint and back.

A minimal starting checklist

  1. Produce one valid OpenAPI document for a single API version.
  2. Add a linter with rules for descriptions, operation IDs, and error responses.
  3. Wire the docs build into CI so a failing spec fails the build.
  4. Render the reference and review it as a reader, not as the author.
  5. Write the two or three conceptual pages the generator cannot produce.
  6. Version the published docs alongside the API version.

The core idea is simple: describe the API once, in a format both machines and humans can read, and let the reference documentation fall out of that description. Everything else — tooling, hosting, interactivity — is a detail on top of that decision.

How does the tints.dev Palette API work?

The tints.dev Palette API returns a full 50–950 Tailwind CSS color palette generated from a single hex value. You send one base color, and the API responds with the eleven stops that make up a Tailwind-style scale. It is built for design tools and workflows that need to turn one brand or base color into a complete palette without manual tuning. The important limitation: the API only returns a palette built from the base hex value, with no options for the HSL tweaks (hue shift, saturation shift, lightness distribution) that the on-page Palette Creator offers.

What the API returns

The output is a set of color stops labeled 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, and 950 — the same eleven-stop structure Tailwind CSS uses. The site's example output shows these values in oklch() format, which is what Tailwind CSS v4 uses by default:

@theme {
  --color-blue-50: oklch(0.965 0.015 273.9);
  --color-blue-100: oklch(0.924 0.033 272.8);
  --color-blue-200: oklch(0.847 0.071 271.55);
  --color-blue-300: oklch(0.771 0.108 268.07);
  --color-blue-400: oklch(0.701 0.144 265.29);
  --color-blue-500: oklch(0.623 0.188 259.81);
  --color-blue-600: oklch(0.532 0.171 258.32);
  --color-blue-700: oklch(0.426 0.139 258.76);
  --color-blue-800: oklch(0.33 0.107 258.44);
  --color-blue-900: oklch(0.234 0.077 258.58);
  --color-blue-950: oklch(0.189 0.063 258.86);
}

The generator also supports other output color modes — hex, hsl, and oklch — and a "Copy to Clipboard" action, so you can paste the result directly into a CSS file. The @theme block format is what you paste into a Tailwind CSS v4 stylesheet.

When to use the API instead of the Palette Creator

Use the API when you need palettes generated programmatically — for example, a design tool that lets a user pick one hex value and instantly produces a 50–950 scale, or a build step that generates theme tokens from a brand color.

Use the on-page Palette Creator when you want to tune the result by hand. The Creator exposes controls the API does not:

Feature Palette Creator Palette API
Base hex input Yes Yes
Hue shift Yes No
Saturation shift Yes No
Lightness distribution (0–100) Yes No
Min/max lightness or luminance Yes No
Linear vs. Perceived mode Yes No
Output formats oklch, hex, hsl oklch, hex, hsl

So if a base color has 100% saturation and you want to shift the hue to make the palette more interesting, or if a low-saturation base needs more saturation at the extremes, that work has to happen in the Creator — the API will not apply those adjustments.

How the palette is built

The generator works by taking your base hex as a reference stop (by default stop 500, though the Creator lets you set it to any stop from 50–950) and spreading the remaining stops toward white and black. The Creator's guidance describes the levers involved:

  • Hue shift — useful when the base color is fully saturated; shifting hue up or down makes the palette less flat.
  • Saturation shift — useful when the base color has little saturation; increasing saturation at the extremes keeps the palette from looking washed out.
  • Minimum/maximum lightness (or luminance) — spreads the rest of the colors toward the extremes of white and black.
  • Lightness vs. luminance mode — switching between them produces a different spread of colors at the extremes.

These principles are credited to the Refactoring UI book by Adam Wathan and Steve Schoger. The site notes that the same book actually recommends against automated palette tools — tints.dev exists to fast-track palette creation, not to replace design judgment.

Practical notes

  • The API returns a palette from the base hex value only. If you need HSL tweaks baked in, generate the palette in the Creator first, then copy the CSS.
  • The site is built with React Router, hosted on Cloudflare, with content in Sanity.io, and designed with Tailwind CSS (plus Headless UI and HeroIcons). It was made by Simeon Griggs.
  • The page links to a launch blog post for full details on how the generation works — worth reading if you want to understand the math behind the stops.
  • Pricing and authentication requirements are not stated on the page, so treat access terms as unconfirmed until you check the site directly.
How to Use the tints.dev Palette Creator to Generate a Tailwind CSS Palette

Open tints.dev, enter a valid hexadecimal color as the initial Value, and the generator produces an 11-stop palette (50–950) you can copy as Tailwind CSS theme variables. By default that base color becomes stop 500, but you can assign it to any stop from 50 to 950. From there you refine the result with Hue Shift, Saturation Shift, Minimum/Maximum Lightness, and a Linear/Perceived toggle, then copy the output in your preferred color mode.

Step 1: Set the base color and its stop

The Palette Creator starts from a single hex value.

  1. Enter a valid hexadecimal color in the Value field (or use the Open Color Picker).
  2. Choose which stop that color represents. The default is Auto (500); you can change it to any stop from 50 to 950.

The base color anchors the palette. Every other stop is derived by spreading lightness toward white (100) and black (0) around it.

Step 2: Adjust Hue Shift and Saturation Shift

These two controls make a palette more interesting when a flat spread would look dull.

  • Hue Shift — for colors that have 100% saturation, shifting the hue up or down adds variation across the stops instead of repeating one flat hue.
  • Saturation Shift — palettes starting from a base color with little saturation become more interesting by increasing saturation at the extremes.

Both are optional. If your base color already reads well across the range, leave them at zero.

Step 3: Set Minimum and Maximum Lightness

The Lightness Distribution range runs 0–100, where 100 is white and 0 is black.

  • Shift the Minimum and Maximum Lightness to spread the remaining colors out toward the extremes of white and black.
  • A wider range pushes the lightest stops closer to white and the darkest stops closer to black; a narrower range keeps the palette more compressed.

Step 4: Switch between Linear and Perceived

Toggle between Linear and Perceived modes to produce a different spread of colors at the extremes. The two modes distribute lightness differently, so the same base color and range can yield noticeably different 50 and 950 stops. Try both and keep the one that matches how you want the ends of the scale to look.

Step 5: Copy the output

The generator outputs your palette as Tailwind CSS theme variables. Choose the color mode you want — oklch, hex, or hsl — then use Copy to Clipboard and paste into your CSS file. The output is formatted as a @theme block, for example:

@theme {
  --color-blue-50: oklch(0.965 0.015 273.9);
  --color-blue-100: oklch(0.924 0.033 272.8);
  --color-blue-200: oklch(0.847 0.071 271.55);
  --color-blue-300: oklch(0.771 0.108 268.07);
  --color-blue-400: oklch(0.701 0.144 265.29);
  --color-blue-500: oklch(0.623 0.188 259.81);
  --color-blue-600: oklch(0.532 0.171 258.32);
  --color-blue-700: oklch(0.426 0.139 258.76);
  --color-blue-800: oklch(0.33 0.107 258.44);
  --color-blue-900: oklch(0.234 0.077 258.58);
  --color-blue-950: oklch(0.189 0.063 258.86);
}

The site lists Tailwind CSS Version 4 as the output target.

Using the Palette API

If you need to generate a 50–950 palette from a single hex value inside a design tool, the Palette API can fetch any set of palettes. Note the current limitation: the API only returns a palette using the base hex value, with no options for HSL tweaks. The interactive Hue/Saturation/Lightness adjustments described above apply to the Palette Creator UI, not the API.

A note on the approach

The site states that these principles are inspired by Refactoring UI by Adam Wathan and Steve Schoger — and that the same book recommends against automated tools like this one. The tool is positioned as a way to fast-track creating new palettes, not to replace design judgment. Treat the generated scale as a starting point and adjust stops by eye where it matters.

Website Overview

Several search or sharing settings need attention. Together they may make snippets, preview images or preferred URLs less consistent across platforms. An active inbound-mail setup with incomplete authentication may leave the domain more open to impersonation. Provider hosting alone does not close that gap.

Domain and Registration

Transfer-protection status is present, helping reduce the risk of unauthorized domain transfers. The domain has about 3 years of registration history; its current configuration provides more context than age alone. The registrar is Namecheap Inc., a widely used domain service provider. The domain uses the common .dev extension, which is not an independent safety signal.

DNS and Email

The observed email authentication setup is incomplete: DMARC is missing. Nameservers are provided by Cloudflare, indicating managed DNS hosting. MX records point to the registrar-servers.com email service. No CNAME was found; the observed records resolve directly to addresses. TXT records include verification markers for Google. Such markers may also remain after a service stops being used.

TLS and Certificates

The public key uses EC with 256 bits. The server supplied a complete certificate chain. No organization name is present in the certificate; the available fields are consistent with domain validation. The certificate was issued within the Google Trust Services cloud or CDN ecosystem. The certificate's total validity is about 90 days, consistent with a short renewal cycle.

HTTP and Browser Security

The checked browser-security headers were not detected, leaving fewer explicit browser-side safeguards. No X-Powered-By header was found, reducing one common source of backend fingerprinting information. The cf-ray response header indicates a CDN or caching proxy in the delivery path. No obvious internal addresses or debug information were found in the headers. The Server header identifies cloudflare without an exact version.

Technology Stack Analysis

The public page identifies Tailwind CSS, Cloudflare without precise versions, leaving fewer clues for version-specific scanning.

Search and Social Sharing

The canonical URL points to another host: https://tints.dev. Search engines may consolidate indexing signals there. Open Graph is partially configured; og:description is missing. Twitter Card metadata is configured. The title has 47 characters, within a common display range. A meta description is present, with 77 characters.

Hosting and Email

DNSCloudflare
HostingCloudflare
Emailregistrar-servers.com
Approximate IP geolocation (inferred; a CDN or proxy may differ from the origin server) Location unknown Inferred 104.21.90.108

Registration details

RDAP / WHOIS

RegistrarNamecheap Inc.
Registered2022-12-06
Expires2026-12-06
Domain statusclient transfer prohibited
Nameserverscody.ns.cloudflare.com、iris.ns.cloudflare.com
DNSSECunsigned

DNS records

DNS

TypeNameValueTTLPriority
Awww.tints.dev104.21.90.108300—
Awww.tints.dev172.67.199.222300—
AAAAwww.tints.dev2606:4700:3031::6815:5a6c300—
AAAAwww.tints.dev2606:4700:3033::ac43:c7de300—
MXtints.deveforward1.registrar-servers.com30010
MXtints.deveforward2.registrar-servers.com30010
MXtints.deveforward3.registrar-servers.com30010
MXtints.deveforward4.registrar-servers.com30015
MXtints.deveforward5.registrar-servers.com30020
NStints.devcody.ns.cloudflare.com86400—
NStints.deviris.ns.cloudflare.com86400—
TXTtints.devgoogle-site-verification=rJvsc1_a6cxx81Axt5QuSXOHxxLo0m-3qA-rXcel41I300—
TXTtints.devv=spf1 include:spf.efwd.registrar-servers.com ~all300—

TLS and certificates

TLS / SSL

AssessmentNormal configuration
Supported protocolsTLSv1.2、TLSv1.3
Negotiated protocolTLSv1.3
Certificate subjecttints.dev
IssuerGoogle Trust Services
Valid until2026-12-15T13:15 · Remaining when checked: 71 days
Verification detailsCertificate trust: Passed · Hostname match: Passed

HTTP response headers

HTTP

HeaderValue
content-typetext/html
servercloudflare

Identified technologies

Tailwind CSSCloudflare

Pages, Search and Sharing

Meta descriptionA fast and flexible, HSL-tweakable palette generator and API for Tailwind CSS
Canonical URLhttps://tints.dev
LanguageEnglish (default)
Twitter Cardsummary_large_image

No rules found

No sitemaps found

User reviews (0)

  • No reviews yet.