nelsoki
My take on Flexoki, the inky color scheme for prose and code by Steph Ango. It keeps Flexoki's aim, a palette for reading and writing on screens, and makes two changes. The ground is neutral black, with no warm tint, and the green is the wetland green, the color of the wetland.io mark. The other hues moved to make room for it.
Palette
Every swatch is one step of a scale, from 50 (lightest) to 950 (darkest). Each family has the same 13 steps Flexoki has, and the 400 step is the one that carries the color on the black ground. Click a swatch to copy its hex value.
Ground and ink
The ground is neutral black. The ink runs from white down to base-950, and none of it has chroma, so the only color on a page comes from the accents.
Accents
Roles
Roles name a job, as Flexoki's do. The palette is built for the black ground, and the text roles are checked against it, each needing 4.5:1 or more for normal text.
| Role | Use | Step | Hex | Contrast on ground |
|---|---|---|---|---|
| bg | main background | black | #0f0f0f | not text |
| bg-2 | secondary background | base-950 | #1b1b1b | not text |
| ui | borders | base-900 | #272727 | not text |
| ui-2 | borders, hovered | base-850 | #333333 | not text |
| ui-3 | borders, active | base-800 | #3e3e3e | not text |
| tx | primary text | base-200 | #cccccc | 11.9:1 |
| tx-2 | muted text, punctuation and operators | base-400 | #9d9d9d | 7.1:1 |
| tx-3 | faint text, comments | base-500 | #858585 | 5.2:1 |
Light mode
The editor themes add a light mode, Nelsoki Light, on the white end of the same scale. Its ground steps are Flexoki's light ones. Its text roles sit darker than a mirror of the dark ones, because base-500 is too light to read on white, and its accents take the 700 step, the first at which every family clears 4.5:1 on white.
| Role | Use | Step | Hex | Contrast on ground |
|---|---|---|---|---|
| bg | main background | white | #fcfcfc | not text |
| bg-2 | secondary background | base-50 | #f0f0f0 | not text |
| ui | borders | base-100 | #e4e4e4 | not text |
| ui-2 | borders, hovered | base-150 | #d8d8d8 | not text |
| ui-3 | borders, active | base-200 | #cccccc | not text |
| tx | primary text | base-950 | #1b1b1b | 16.8:1 |
| tx-2 | muted text, punctuation and operators | base-700 | #565656 | 7.2:1 |
| tx-3 | faint text, comments | base-600 | #6e6e6e | 5.0:1 |
Accents
The 400 step of each family is the one for color on the ground. The hue column shows where each family sits now, beside its place in Flexoki. Green is the anchor, and cyan and blue moved away from it.
Red's 400 is 4.4:1 on the ground, just under the 4.5:1 that normal text needs, so red text that has to meet AA takes red-300 at 6.3:1.
| Family | Letter | Nelsoki 400 | Flexoki 400 | Hue, degrees | Contrast on ground |
|---|---|---|---|---|---|
| Red | re | #d14d41 | #d14d41 | 28° to 28° | 4.4:1 |
| Orange | or | #da702c | #da702c | 49° to 49° | 5.8:1 |
| Yellow | ye | #c5a818 | #d0a215 | 87° to 96° | 8.2:1 |
| Green | gr | #7fb3a2 | #879a39 | 119° to 172° | 8.1:1 |
| Cyan | cy | #3aa5bb | #3aa99f | 187° to 214° | 6.6:1 |
| Blue | bl | #5581c1 | #4385be | 247° to 258° | 4.8:1 |
| Purple | pu | #8b7ec8 | #8b7ec8 | 291° to 291° | 5.4:1 |
| Magenta | ma | #ce5d97 | #ce5d97 | 350° to 350° | 5.1:1 |
Mappings
The variable names match Flexoki's, so a port written against those names needs only nelsoki's values swapped in. Punctuation and operators use tx-2, and comments use tx-3.
| Family | Letter | Interface | Syntax |
|---|---|---|---|
| Red | re | error text | invalid code, imports |
| Orange | or | warning text | functions |
| Yellow | ye | none | constants |
| Green | gr | success text, links, active states (anchor) | keywords |
| Cyan | cy | informational text | strings |
| Blue | bl | none | variables, attributes |
| Purple | pu | none | numbers |
| Magenta | ma | none | language features |
Sample
Each token takes the color that its role names in the mappings above.
// Each swatch name pairs with a step count. const ANCHOR = '#7fb3a2'; export function swatch(name, steps = 13) { return Array.from({ length: steps }, (_, i) => name + '-' + i); }
Editors
Two themes for each editor, Nelsoki on the black ground and Nelsoki Light on the white one, with the syntax colors in the mappings above and the interface on the ground and ink steps. Nelsoki Light sets its text on base-950, base-700, and base-600 and its accents on the 700 step, the first at which every family clears 4.5:1 on white.
VS Code
Download the extension, which holds both themes. In VS Code, open the Extensions view, choose Install from VSIX in its menu and pick the file, then choose Nelsoki or Nelsoki Light in Preferences: Color Theme. To follow the system's appearance, turn on Window: Auto Detect Color Scheme and set Nelsoki Light and Nelsoki as the preferred light and dark themes.
Sublime Text
Download Nelsoki and Nelsoki Light. Put them in the User folder that Preferences, Browse Packages opens, then choose one in UI: Select Color Scheme, or choose Auto there to follow the system, with Nelsoki Light for light and Nelsoki for dark. The Adaptive theme takes the sidebar and tabs from the scheme.
Why
Flexoki was made for its author's own site. Its aim is a palette for reading and writing on digital screens, distinctive yet familiar, calibrated for legibility and perceptual balance across devices. Nelsoki keeps that aim.
Its lightness steps are Flexoki's, except green, which is remapped so its 400 step is the anchor. Each family keeps its own shape from 50 to 950. The text roles sit at 11.9:1, 7.1:1, and 5.2:1 on the ground, so all three clear 4.5:1 for normal text.
The ground and ink are neutral. Flexoki's paper and black both carry a warm tint that suits its ink, and nelsoki drops that tint, so the accents are the only color on the page.
The anchor is #7fb3a2, the flat green disc of the wetland.io mark. Flexoki's olive green sat at hue 119, close to its cyan at 187, and the anchor sits at 172. So cyan moved to 214, blue moved to 258, and yellow leaned toward olive to take part of the room that olive left. Red, orange, purple, and magenta did not move.
Tokens
The palette as CSS custom properties and as JSON, which also carries the role references for both modes and the accent letters. The variable names match Flexoki's, so a port written against those names needs only these values swapped in.
Version 1.1, 2026-11-09. Built from the Flexoki v2.0 values with a neutral black ground, the wetland green (#7fb3a2) as the anchor, cyan, blue, and yellow moved, and the text roles set on base-200, base-400, and base-500. Version 1.1 added the light mode that Nelsoki Light uses.
Credit
Nelsoki is based on Flexoki by Steph Ango (kepano), Copyright (c) 2023 Steph Ango, released under the MIT License, and its changes are released under the same license. Nelsoki is not made by or endorsed by Steph Ango.