A systems programming languagePre-1.0 · closed beta
EN / PTGitHub
VIIIPaper InkColorscheme · 24 inks · 2 variants · 1 accent

A colorscheme you read like print.

The palette behind this site, made official. Paper for daylight, Ink for the dark, warm ink for strings, and a single vermilion for what deserves your attention.

PaperLight · #F2F0EB

use io

decl Reading { sensor: string; value: f64; live: bool }

@mm(arena)
fn ingest(src: Channel[->Reading]) {
    loop r in src {
        if r.live == true && r.value > 40.0 {
            // strings in warm ink, numbers in ochre
            io.println("hot: {{r.sensor}} at {{r.value}}")
        }
    }
}

reply := store <-> batch timeout(5s)

InkDark · #12151B

use io

decl Reading { sensor: string; value: f64; live: bool }

@mm(arena)
fn ingest(src: Channel[->Reading]) {
    loop r in src {
        if r.live == true && r.value > 40.0 {
            // strings in warm ink, numbers in ochre
            io.println("hot: {{r.sensor}} at {{r.value}}")
        }
    }
}

reply := store <-> batch timeout(5s)

24 inks. Two papers.

Three grounds for each paper, three weights of text for each, the vermilion family, and four pigments that tell code apart. Each variant prints with its own half of the set.

PaperThe light grounds, from the page down to the recesses.
InkThe dark grounds, the same three steps reversed.
GraphiteText on Paper, from headings to captions.
ChalkText on Ink, the same three weights.
VermilionThe language's own words in red, and the warm ink for strings in orange: one tone of each for each paper.
OchreNumbers; warnings and changed lines.
MossFunction names; success and added lines.
IndigoTypes; information and links.
PlumConstants; hints.

Click any ink to copy it. The few in-between tones, like the code ground or the color of function names, are mixes of two inks, never new colors.

Every hue, in two tones.

A deep tone that reads on Paper and a light one that reads on Ink. In code every kind of token gets its own: vermilion for the language's own words, orange for strings, a pigment for each kind of name and value. Measured on the code ground: 5.6 to 5.8:1 on Paper, 4.7 to 8.6:1 on Ink.

VermilionKeywords, decorators, channels

fn loop @mm <->Shu deep5.6:1
fn loop @mm <->Shu → Chalk 10%4.7:1

Warm inkStrings

"hot: 40.0"Rust5.8:1
"hot: 40.0"Apricot8.5:1

OchreNumbers; warnings

40.0 5s 0xffOchre deep5.6:1
40.0 5s 0xffOchre8.4:1

MossFunctions; success

ingest printlnMoss deep5.7:1
ingest printlnMoss8.6:1

IndigoTypes; information

Reading f64Indigo deep5.6:1
Reading f64Indigo8.5:1

PlumConstants; hints

true nonePlum deep5.6:1
true nonePlum8.5:1

Every color, on its own ground.

Each swatch is shown where it lives, with its contrast measured against that ground. Syntax colors sit on the code background, text sits on the page.

RolePaperInk

Syntax

KeywordsKeywords, storage and modifiers
fn match loop spawn5.6:1 · AAShu deep
fn match loop spawn4.7:1 · AAMix · Shu → Chalk 10%
TypesTypes and type names
Reading Result Channel5.6:1 · AAIndigo deep
Reading Result Channel8.5:1 · AAAIndigo
FunctionsFunction names, declared and called
ingest println5.7:1 · AAMoss deep
ingest println8.6:1 · AAAMoss
IdentifiersIdentifiers and everything unmarked
src value batch10.5:1 · AAAMix · Graphite → Graphite muted 55%
src value batch9.9:1 · AAAMix · Chalk → Chalk muted 55%
StringsStrings and characters
"hot: {{r.sensor}}"5.8:1 · AARust
"hot: {{r.sensor}}"8.5:1 · AAAApricot
NumbersNumbers, with their units
40.0 5s 0xff 64kib5.6:1 · AAOchre deep
40.0 5s 0xff 64kib8.4:1 · AAAOchre
ConstantsConstants: true, false, none, self
true false none5.6:1 · AAPlum deep
true false none8.5:1 · AAAPlum
CommentsComments, quiet on purpose
// quiet on purpose4.6:1 · AAGraphite faint
// quiet on purpose4.6:1 · AAChalk faint
Decorators and channelsDecorators, channel operators, escapes
@mm(arena) <-> {{ }}5.6:1 · AAShu deep
@mm(arena) <-> {{ }}4.7:1 · AAMix · Shu → Chalk 10%
OperatorsOperators and punctuation
:= -> == +4.6:1 · AAGraphite faint
:= -> == +6.9:1 · AAChalk muted

Text

Primary textBody text and headings
A systems language that tells the truth.15.4:1 · AAA
A systems language that tells the truth.15.4:1 · AAA
Secondary textLedes and supporting text
You only pay for what you summon.6.7:1 · AA
You only pay for what you summon.7.2:1 · AAA
Tertiary textMetadata and captions
Spec · 72,796 words4.4:1 · AA large
Spec · 72,796 words4.8:1 · AA

Grounds

PageThe page
Paper · Page
Ink · Page
RaisedCards and panels lifted off the page
Paper · Raised
Ink · Raised
SunkRecessed areas, tab bars, inline code
Paper · Sunk
Ink · Sunk
CodeCode blocks and editor background
Paper · Code
Ink · Code

Four rules behind it.

Vermilion for the language

The language speaks in red.

Keywords, decorators, channel operators and escapes: the words that belong to the language itself share the site's one accent.

Color by kind

Each color names a kind.

Strings in orange, numbers in ochre, constants in plum, types in indigo, functions in moss. Learn the five and a line reads at a glance.

Quiet punctuation

Punctuation steps back.

Operators, brackets and comments sit in the faint tones, so the colored words carry the line. Nothing is bold; color does the work.

Measured contrast

20 of 20 syntax colors pass AA.

Measured on the code ground and computed from the palette when this page builds. Nothing drops under 4.6:1.

Ports

Paper Ink lives in its own repository as a single palette file: 24 inks, and every theme generated from them. Today it highlights this site; editor and terminal ports come later.