Flexoki

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.

bg
bg-2
ui
ui-2
ui-3
tx-3
tx-2
tx
re
or
ye
gr
cy
bl
pu
ma

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 cardboard1. 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.

Color Name Light theme Dark theme
#100F0F black tx bg
#1C1B1A base-950   bg-2
#282726 base-900   ui
#343331 base-850   ui-2
#403E3C base-800   ui-3
#575653 base-700   tx-3
#6F6E69 base-600 tx-2  
#878580 base-500   tx-2
#B7B5AC base-300 tx-3  
#CECDC3 base-200 ui-3 tx
#DAD8CE base-150 ui-2  
#E6E4D9 base-100 ui  
#F2F0E5 base-50 bg-2  
#FFFCF0 paper bg  

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

Color Name Light theme Dark theme
#AF3029 red-600 re re-2
#BC5215 orange-600 or or-2
#AD8301 yellow-600 ye ye-2
#66800B green-600 gr gr-2
#24837B cyan-600 cy cy-2
#205EA6 blue-600 bl bl-2
#5E409D purple-600 pu pu-2
#A02F6F magenta-600 ma ma-2

Light tones

Color Name Light theme Dark theme
#D14D41 red-400 re-2 re
#DA702C orange-400 or-2 or
#D0A215 yellow-400 ye-2 ye
#879A39 green-400 gr-2 gr
#3AA99F cyan-400 cy-2 cy
#4385BE blue-400 bl-2 bl
#8B7EC8 purple-400 pu-2 pu
#CE5D97 magenta-400 ma-2 ma

Mappings

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

Color Variable UI Syntax highlighting
bg Main background  
bg-2 Secondary background  
ui Borders  
ui-2 Hovered borders  
ui-3 Active borders  
tx-3 Faint text Comments
tx-2 Muted text Punctuation, operators
tx Primary text  
re Error text Invalid, imports
or Warning text Functions
ye   Constants
gr Success text Keywords
cy Links, active states Strings
bl   Variables, attributes
pu   Numbers
ma   Language features

Changelog

Date  
2023-10-07 Initial release
  1. I also have a dog named Flexo whose greatness deserved to be immortalized.