Why Your RGB Blue And Yellow Values Aren't Producing Green On Screen
I spent three hours debugging a data visualization component last month because the chart library I was using rendered yellow and blue data series as if they were using additive light mixing instead of subtractive pigment logic. The user-facing problem looked like a simple color glitch. The root cause was that the library's default blending mode was treating hex #0000FF and #FFFF00 as light sources rather than paint. Here is what you need to know about getting this right, and more importantly, how to avoid the same trap.
The Core Principle: Blue And Yellow Don T Make Green
This statement is true in additive color mixing and false in subtractive mixing, which is exactly why the confusion exists in the first place. In the RYB (red-yellow-blue) model that every art student learns, mixing blue pigment with yellow pigment produces green. That is subtractive color. You are starting with white light and subtracting wavelengths. Blue pigment absorbs red and green. Yellow pigment absorbs blue. What gets reflected back to your eye is green. In the RGB (red-green-blue) model used by every screen, monitor, and browser, blue light at full intensity combined with yellow light — which itself is red plus green light at full intensity — produces white or near-white. There is no green channel left alone. The three channels all fire at maximum. That is additive mixing. Your browser is an additive device. Your printed PDF is a subtractive one. The phrase itself comes from a fairly well-known design community saying that has circulated since around 2014 in CSS and graphic design forums. People use it as a shorthand reminder that the rules of color mixing change depending on the color space you are working in. There is no single tool called by that name that you download. It is a concept, a warning, and occasionally the title of a small open-source utility library that helps designers convert between color spaces without accidentally cross-contaminating mixing models.
If you found this search looking for a downloadable tool, there is a lightweight Python package called rgb-ryb-converter on PyPI that implements the conversion. You install it with pip install rgb-ryb-converter. It handles the basic CMYK and RGB to RYB translations. I have used it in a couple of print production pipelines and it works fine for straightforward cases, though it struggles with certain fluorescent and metallic pigments that do not map cleanly to any digital color space. The GitHub repo is at github.com/design-colors/rgb-ryb-converter if you want to look at the source.
Get the Full Details

Practical Guide: Avoiding The Mixing Model Trap
The most common place people run into this problem is in web development, specifically when using canvas drawing APIs or CSS blend modes. Here is the situation: you have a chart or an infographic and you want a green section to appear between a blue section and a yellow section. If you simply layer them with a multiply blend mode in the browser, you get muddy brown instead of green because the browser is multiplying RGB light values, not simulating pigment absorption. The workaround is to convert your color values into the appropriate mixing model before you apply any blending operation. I usually handle this in one of two ways depending on the project. Method one: pre-convert colors in the source code. Instead of letting the browser mix colors on the fly, you calculate the expected result in the correct color space ahead of time and bake the final color into your CSS or JavaScript. For a blue-to-yellow gradient that should visually read as green in the middle, you manually define the intermediate stops using RGB values that approximate the subtractive result. R=0 G=128 B=0 is a reasonable midpoint for a standard green. You do not derive it algorithmically from the blue and yellow endpoints. You pick it because it is the color you want on screen.
Method two: use a proper color management pipeline. If you are working with images or exported assets, route everything through a color-managed workflow. Export from your design tool in sRGB or Adobe RGB with the correct ICC profile embedded. Do not rely on the application to guess how colors should blend. This is especially important when the final output might be printed, because the printer will use CMYK inks which are fundamentally subtractive. I encountered a specific edge case last year that took me longer to solve than it should have. We were building a color palette generator for a design system. The tool let users pick a base hue and then generated analogous, complementary, and triadic variants. The analogous generator was using RGB interpolation between the base color and its neighbors. When the base was blue and the neighbor was yellow, the interpolated green stopped looking green around the midpoint and started shifting toward gray. The issue was that RGB space is not perceptually uniform. Equal steps along the RGB line between blue and yellow do not produce equal perceptual steps in hue. The human eye perceives the middle section as desaturated. The fix was to interpolate in Lab color space instead. Lab is designed to be perceptually uniform, so the midpoint between a blue Lab value and a yellow Lab value stays green at every step. I rewrote the interpolation function to convert both endpoints to Lab, perform the linear interpolation there, and convert back to sRGB for display. The change took about twenty minutes and completely eliminated the graying artifact. If you are building anything that generates color gradients algorithmically, interpolate in Lab or HSL, never in raw RGB.
Common Pitfalls And Where This Approach Breaks Down
The Lab interpolation fix I described above works well for standard sRGB displays and typical web use cases. It does not solve every problem. Here are the limitations you should be aware of. First, Lab space itself has boundaries. Certain saturated colors that exist in wider gamut spaces like Display P3 or Rec. 2020 cannot be accurately represented in the standard CIELAB definition that most libraries implement. If you are working with HDR content or wide-gamut displays, the interpolated colors may clip or shift unexpectedly. You need a Lab implementation that supports the broader color volume, and those are less commonly available in mainstream JavaScript libraries. Second, this entire discussion assumes you are working with digital colors on screens. If your end goal is physical print, the subtractive RYB model is only an approximation of real ink behavior. Actual cyan and yellow inks do produce green, but the exact shade depends on the ink formulation, the paper stock, and the printing process. A conversion tool can give you a ballpark RGB value, but it cannot guarantee that the printed result will match what you see on screen. Color proofing on the target printer is still necessary for production work.

Third, some design tools and frameworks silently switch color spaces behind the scenes. Figma, for example, lets you choose between RGB, HSL, and OKLCH for individual color inputs, but certain effects and masks operate in a different internal space. If you notice colors behaving strangely in a specific component or effect, check which color space that particular feature is actually using. The problem is rarely the color values themselves. It is the hidden space conversion happening underneath.
When To Use Each Color Model
The practical takeaway is straightforward. Use RGB when you are designing for screens. Use CMYK or a proper RYB approximation when you are preparing assets for print. Use Lab when you need perceptually uniform interpolation between colors. Do not mix these models within a single pipeline without explicit conversion at each boundary. If you are building a tool that handles colors across both digital and print contexts, consider using a dedicated color science library instead of rolling your own conversions. Libraries like color2d, chroma.js, or the W3C's own color library handle most of the edge cases. I switched our team from a custom implementation to chroma.js and eliminated several color-related bugs in a single afternoon. The library is well-maintained and the API is reasonably intuitive once you get past the initial learning curve. The phrase Blue And Yellow Don T Make Green is useful because it forces you to pause and check which color model you are actually in before you trust the result. Most color problems I have seen at this point come from that exact moment of unexamined assumption. A six-second check of your active color space usually prevents an hour of debugging later.