Flexoki is an inky color scheme for prose and code. Flexoki is designed for reading and writing on digital screens. It is inspired by analog printing inks and warm shades of paper.

Flexoki is minimalistic and high-contrast. The colors are calibrated for legibility and perceptual balance across devices and when switching between light and dark modes.

Flexoki is open-source under the MIT license. Flexoki is available for many popular apps listed below, including Obsidian using my theme Minimal.

Color palette

Flexoki is the color palette used on this site. To switch between light and dark mode press the D key or use the toggle at the top of the page. Click any swatch to copy a color to your clipboard.

Syntax highlighting

Why?

I created Flexoki for my personal site, stephango.com. You’re reading it now. I wanted the colors to feel distinctive yet familiar. Like ink on paper.

The name Flexoki comes from flexography — a common printing process for paper and cardboard[^1]. I spent many years working with dyes and inks particularly for my companies Inkodye and Lumi. I also have a fascination with digital paper. I wanted to bring the comfort of analog color to emissive digital screens.

One challenge is that ink on paper is a subtractive process whereas LCD and OLED screens use additive color. Replicating the effect of mixing pigments digitally is difficult. The following video illustrates the problem:

See the full SIGGRAPH 2021 talk

Mixing blue and yellow paint creates green, whereas digital color mixing results in a brownish hue. Watercolors retain their saturation when you dilute them, whereas reducing the opacity of digital colors makes them look desaturated.

Another challenge with digital color is human perception across color spaces. For example, yellow appears much brighter than blue. Ethan Schoonover’s color scheme Solarized (2011) was an important inspiration for Flexoki. His emphasis on CIELAB lightness relationships helped me understand how to find colors that appear cohesive.

I found that choosing colors with perfect perceptual consistency can be at odds with the distinctiveness of colors in practical applications like syntax highlighting. If you adhere too closely to evenness in perceptual lightness you can end up with a palette that looks washed out and difficult to parse.

Solving for all these problems is how I arrived at Flexoki. I wish it could have been more science than art, but it wasn’t. Some day I hope to arrive at a more reliable way to generate digital color palettes that respect the constraints I laid out. In the meantime, I hope you find this iteration of Flexoki useful.

Ports

Flexoki is available for the following apps and tools.

Apps

Frameworks

Other

Contributing

Flexoki is MIT licensed. You are free to port Flexoki to any app. Please include attribution and a link to stephango.com/flexoki. You can submit your port to the list via pull request on the Flexoki repo.

Base tones

Flexoki uses warm monochromatic base tones that blend the black ink tone with the base paper tone. 8 colors are used in light and dark mode:

  • 3 text colors: normal, muted, faint
  • 3 interface colors: normal, hover, active
  • 2 background colors: primary, secondary

Incremental values can be derived using opacity. For example, you can use a 60% opacity black tone on top of the paper tone to create the 600 value.

ColorNameLight themeDark theme
#100F0Fblacktxbg
#1C1B1Abase-950bg-2
#282726base-900ui
#343331base-850ui-2
#403E3Cbase-800ui-3
#575653base-700tx-3
#6F6E69base-600tx-2
#878580base-500tx-2
#B7B5ACbase-300tx-3
#CECDC3base-200ui-3tx
#DAD8CEbase-150ui-2
#E6E4D9base-100ui
#F2F0E5base-50bg-2
#FFFCF0paperbg

Accent colors

8 accent colors are available for accents and syntax highlighting. Each color is available in two tones calibrated for light and dark modes.

In the future, a full range of tones from 50 to 950 will be added. Unlike the base tones, colors cannot be blended using opacity because this desaturates the pigment effect.

Dark tones

ColorNameLight themeDark theme
#AF3029red-600rere-2
#BC5215orange-600oror-2
#AD8301yellow-600yeye-2
#66800Bgreen-600grgr-2
#24837Bcyan-600cycy-2
#205EA6blue-600blbl-2
#5E409Dpurple-600pupu-2
#A02F6Fmagenta-600mama-2

Light tones

ColorNameLight themeDark theme
#D14D41red-400re-2re
#DA702Corange-400or-2or
#D0A215yellow-400ye-2ye
#879A39green-400gr-2gr
#3AA99Fcyan-400cy-2cy
#4385BEblue-400bl-2bl
#8B7EC8purple-400pu-2pu
#CE5D97magenta-400ma-2ma

Mappings

This table describes how to use each variable in the context of user interfaces and syntax highlighting. Best viewed on desktop.

ColorVariableUISyntax highlighting
bgMain background
bg-2Secondary background
uiBorders
ui-2Hovered borders
ui-3Active borders
tx-3Faint textComments
tx-2Muted textPunctuation, operators
txPrimary text
reError textInvalid, imports
orWarning textFunctions
yeConstants
grSuccess textKeywords
cyLinks, active statesStrings
blVariables, attributes
puNumbers
maLanguage features

Changelog

Date
2023-10-07Initial release