"Colour is an integral element of Aalto's architecture... an inseparable part of his effort to harness rationalism in the service of better living." — Harald Arnkil, The Colours of Alvar Aalto (2018)
A browser-based preview of the aalto palette across multiple languages and UI contexts:
The showroom demonstrates the Neovim implementation, but the underlying OKLCH engine, material palette, and perceptual hierarchy are identical in the Vim port. Both versions compute the same colors from the same mathematical foundations.
This is not a "theme." It is a material palette borrowed from the late work of Alvar Aalto (1898–1976) and translated into perceptual color space.
Aalto's mature interiors — Villa Mairea (1938–39), the Experimental House in Muuratsalo (1952–53), the National Pensions Institute Headquarters (1952–57) — abandoned the bright primary polychromy of his early functionalist period (the canary yellows and crimsons of Paimio and Turun Sanomat) in favor of what Harald Arnkil calls "nature-inspired textures and muted colours of wood, stone, brick and ceramic tiling." Strong chromatic accents were reserved for furniture and detail. The walls became birch, linen, and off-white; the atmosphere became haptic, light, and psychological.
aalto.vim takes that same material chord and renders it as syntax highlighting.
| Material | Role | Hex |
|---|---|---|
| Deep violet-black (midnight ceramic) | Background (dark) | #18122E |
| Birch plywood, warm off-white | Foreground | #EAE1D8 |
| Unbleached linen | Comments | #706873 |
| Patinated copper | Constants | #B87333 |
| Deep moss / reindeer lichen | Strings | #7D8F6E |
| Distant winter sky / slate blue | Definitions | #6B7FD4 |
| Terracotta brick | Errors | #C46B6B |
| Brass lamp shade | Warnings | #D4A373 |
| Wet Nordic slate | Info / hints | #6B9A92 |
The light variant inverts the logic: birch plywood walls become the background, and the accents darken into forest moss, aged brass, and deep slate — the same materials viewed in summer daylight rather than winter lamplight.
Aalto did not choose colors by eye alone. In his early functionalist work he employed Le Corbusier's Claviers de couleurs, a systematic architectural polychromy. In his mature work he replaced that system with another: the logic of natural materials under natural light. Both approaches were rational and human-centered at once.
This colorscheme continues that tradition in a different medium.
Instead of curating hex codes and hoping they look correct, aalto.vim computes them in the OKLCH perceptual color space:
- Uniform lightness: A
definitionis provably more prominent than aconstant, which outranks astring, which outranks acomment. The hierarchy is enforced by iterative nudging against WCAG contrast ratios, not by guesswork. - Gamut fitting: Every computed color is binary-searched back into the sRGB boundary so nothing clips silently.
- Perceptual surfaces: The selection background, cursor line, and float backgrounds are not hand-picked grays. They are generated by walking the background color in OKLab space until a target perceptual distance (ΔE ≈ 0.10) is reached — a raised eyebrow, not a shout.
The result is a syntax highlighting environment that behaves like Aalto's architecture: systematic in its construction, but comfortable and atmospheric in its effect.
- Vim 9.0+ with
+float set termguicolorsin yourvimrc
A 256-color fallback is provided for older terminals, but the full experience requires true color. This is a hard requirement: without termguicolors, the OKLCH engine cannot run.
Plug 'micdzu/aalto.vim'git clone https://github.com/micdzu/aalto.vim.git \
~/.vim/pack/colors/start/aalto.vimCopy colors/aalto.vim to ~/.vim/colors/.
Set before colorscheme aalto:
| Variable | Type | Default | Description |
|---|---|---|---|
g:aalto_variant |
string | &background |
"dark" or "light" |
g:aalto_italic_comments |
bool | 0 |
Italicise comments |
g:aalto_italic_keywords |
bool | 0 |
Italicise keywords |
g:aalto_transparent |
bool | 0 |
Transparent background |
g:aalto_learner_mode |
bool | 0 |
Emphasise grammatical structures |
Example:
set termguicolors let g:aalto_variant = 'dark' let g:aalto_italic_comments = 1 colorscheme aalto
By default, aalto.vim uses semantic highlighting: keywords, operators, and identifiers fade into the neutral birch foreground, while definitions, constants, strings, and comments carry color. This is the "experienced programmer" view — you read by meaning, not by grammar.
When learning a new language, you read by pattern-matching syntax instead. You need to know "this is a keyword," "this is a type," "this is control flow."
Set g:aalto_learner_mode = 1 to reassign the same material palette to grammatical categories:
| Grammatical role | Semantic color | Rationale |
|---|---|---|
Type, Structure |
definition (blue) |
Types define the shape of the program |
Keyword, Statement, Conditional, Repeat |
constant (copper) |
Control flow is fixed vocabulary |
String, Character |
string (moss) |
Unchanged |
Comment |
comment (linen) |
Unchanged |
Identifier, Operator, Delimiter |
fg (birch) |
The background grammar |
No new colors are introduced. The same OKLCH weights and hierarchy enforcement apply. Once you read by meaning rather than syntax, return to semantic mode.
A colorscheme is only half a system. If your terminal still uses Solarized while Vim uses Aalto, htop, lazygit, and fzf will live in a different world.
Run :AaltoExportAnsi after loading the colorscheme to print ANSI palette blocks for Alacritty, WezTerm, and iTerm2, generated live from your current variant:
colorscheme aalto
AaltoExportAnsiCopy the output into your terminal config. The bright variants are derived by perceptually nudging the base accents toward the foreground color, keeping the same material identity under higher intensity.
| Kept | Dropped |
|---|---|
| Full OKLCH engine with gamut fitting | LSP semantic tokens |
| Perceptual hierarchy enforcement | Tree-sitter captures |
| Editor / UI highlight groups | Plugin-specific highlight groups |
| Learner mode | Lualine / statusline integration |
| 256-color + ANSI fallback | :checkhealth, :AaltoReload, etc. |
This is a Vim-native port. It does not attempt to emulate Neovim's LSP or tree-sitter ecosystems. It provides a solid, mathematically grounded foundation for core Vim editing.
The Neovim version is the modernist aalto — integrated, extensible, ecosystem-aware. The Vim version is the mature aalto — stripped, self-contained, and philosophically consistent with the editor it runs in. Both are valid. This one is smaller.
The color philosophy and material references are drawn from Harald Arnkil, The Colours of Alvar Aalto (Proceedings of the AIC Interim Meeting, Lisbon 2018), and from the ongoing colour research of the Alvar Aalto Foundation (Elina Riksman et al.).
The OKLCH mathematics follow Björn Ottosson's reference implementation of the Oklab color space (2020).
The original Neovim implementation is aalto.nvim by micdzu.
MIT — same as aalto.nvim.