[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-94298":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":13,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":15,"stars7d":15,"stars30d":16,"stars90d":15,"forks30d":15,"starsTrendScore":15,"compositeScore":17,"rankGlobal":10,"rankLanguage":10,"license":18,"archived":19,"fork":19,"defaultBranch":20,"hasWiki":19,"hasPages":21,"topics":22,"createdAt":10,"pushedAt":10,"updatedAt":37,"readmeContent":38,"aiSummary":39,"trendingCount":15,"starSnapshotCount":15,"syncStatus":40,"lastSyncTime":41,"discoverSource":42},94298,"cendre","Aejkatappaja\u002Fcendre","Aejkatappaja","A dark colorscheme for Neovim. One wood fire, taken apart: five pigments, none of them chosen.","https:\u002F\u002Fcendretheme.com\u002F",null,"Lua",108,1,101,0,7,41.6,"MIT License",false,"main",true,[23,24,25,26,27,28,29,30,31,32,33,34,35,36],"colorscheme","dark-theme","ghostty","helix","lua","neovim","neovim-colorscheme","nvim","oklch","terminal-theme","theme","tmux","treesitter","vim-colorscheme","2026-08-25 04:01:21","\u003Cp align=\"center\">\n  \u003Cimg src=\"assets\u002Fbanner.svg\" alt=\"cendre\" width=\"880\">\n\u003C\u002Fp>\n\nDark colorscheme for Neovim. One wood fire, taken apart.\n\nEvery pigment hue was computed from something measurable in a burning log:\nPlanck's law for the coals, published emission wavelengths for everything else,\npushed through the CIE 1931 colour matching functions into OKLCH. Lightness and\nchroma are chosen, because a spectral line sits far outside sRGB and has to be\nbrought into gamut anyway. Nothing was nudged toward a nicer number.\n\nDark only, on purpose. Every hue, ratio and surface is laid out at\n**[cendretheme.com](https:\u002F\u002Fcendretheme.com\u002F)**.\n\n```lua\n{ \"Aejkatappaja\u002Fcendre\" }\n```\n\nNeovim 0.9 or newer, with `termguicolors`.\n\n\u003Cimg src=\"assets\u002Feditor.svg\" alt=\"Go code in cendre, with git signs, diagnostics and a statusline\" width=\"880\">\n\nDiagnostics, git signs, diff and statusline draw from the semantic family. An\nerror never wears the same red as a keyword.\n\n## 28 surfaces, one palette\n\nNeovim is where this starts, not where it stops. Ghostty, kitty, wezterm, foot,\nAlacritty, Konsole, tmux, bat, delta, lazygit, yazi, eza, fzf, btop, starship,\nhelix, Zed, Obsidian, Firefox and the rest, with the path each one installs to:\n[cendretheme.com\u002F#surfaces](https:\u002F\u002Fcendretheme.com\u002F#surfaces).\n\nNothing under `extras\u002F` or `assets\u002F` is written by hand, nor the favicon and share\ncard under `docs\u002F`. All of it is rendered from `lua\u002Fcendre\u002Fpalette.lua`, so a\ncolour cannot be right in the editor and stale in a terminal, in this README, or\non the site:\n\n```sh\nnvim --headless --noplugin -u NONE -c \"set rtp+=.\" -c \"luafile scripts\u002Fextras.lua\" -c q\n```\n\n**Every surface ships at all three depths.** A reader on `soft` wants `soft` in\ntheir terminal too, so each directory holds `cendre`, `cendre-medium` and\n`cendre-soft`. The unsuffixed name is the depth the plugin defaults to, so the\neditor and everything around it match with no second decision.\n\nAnything that stores a theme name rather than taking it from its filename gets\nthat name qualified per depth, or installing two of them collides on one entry in\nZed, bat, Obsidian and the rest. The test asserts that.\n\nGhostty, for example:\n\n```\ntheme = cendre\n```\n\nInside the editor, these get groups of their own rather than whatever their\ndefaults land on: gitsigns, blink.cmp, Snacks, fzf-lua, which-key, Noice,\nneo-tree, nvim-tree, flash, trouble, lazy.nvim, mason, nvim-dap and dap-ui,\nneotest, mini.indentscope, mini.hipatterns, hlchunk, grug-far, diffview,\nilluminate, treesitter-context and rainbow-delimiters.\n\nThe 16 ANSI slots are also exported as `vim.g.terminal_color_*`, so `:terminal`\nmatches. Slot 5 is potassium's 404 nm line, derived the same way as the pigments,\nand it exists because ANSI wants six hues while the editor needs five.\n\n## Three depths, one palette\n\nThe pigments are the identity, so they never move. Only the ground under them\ndoes, at three depths. A screenshot at one depth is recognisably the same theme\nas a screenshot at another, which is the whole point.\n\n| depth    | bg0       | L     | text     | comment | dimmest pigment |\n| -------- | --------- | ----- | -------- | ------- | --------------- |\n| `hard`   | `#171311` | 0.191 | 12.89:1  | 3.32:1  | 4.77:1          |\n| `medium` | `#1d1917` | 0.217 | 12.18:1  | 3.14:1  | 4.51:1          |\n| `soft`   | `#231f1d` | 0.243 | 11.41:1  | 2.94:1  | 4.22:1          |\n\n`hard` is the default. It is deeper than any theme this was measured against, and\nis the reason the ramp above it has to be finely stepped. `soft` is lifted to\nwhere the dark themes people keep for years actually sit.\n\nSwitch at runtime, no restart:\n\n```\n:CendreBackground soft\n:CendreBackground hard\n```\n\n## Install\n\nlazy.nvim:\n\n```lua\n{\n  \"Aejkatappaja\u002Fcendre\",\n  lazy = false,\n  priority = 1000,\n  config = function()\n    require(\"cendre\").setup({\n      background = \"hard\", -- \"hard\" | \"medium\" | \"soft\"\n      italic_virtual_text = false,\n    })\n  end,\n},\n{\n  \"LazyVim\u002FLazyVim\",\n  opts = { colorscheme = \"cendre\" },\n}\n```\n\nWithout LazyVim, just `vim.cmd.colorscheme(\"cendre\")` after setup.\n\nlualine picks it up with `options.theme = \"cendre\"`, or leave `\"auto\"`.\n\n`:help cendre` covers the options, the commands and the role map in full.\n\n## Options\n\n| option            | default    | effect                                                   |\n| ----------------- | ---------- | -------------------------------------------------------- |\n| `background`      | `\"hard\"`   | ground depth: `hard`, `medium` or `soft`                  |\n| `transparent`     | `false`    | strips Normal, floats and the statusline; plugin windows follow |\n| `italic_virtual_text` | `false` | italics on inlay hints, ghost text, git blame, the dashboard footer |\n| `italic_comments` | `true`     | italics on comments, independently of the above             |\n| `on_colors`       | noop       | `function(colors)` mutates the palette before highlights  |\n| `on_highlights`   | noop       | `function(highlights, colors)` gets the last word         |\n\nThe background is painted by default. The ash bed is a colour the theme derived,\nso it may as well be on screen.\n\nThe two italic switches are independent, not one overriding the other, so\n`italic_virtual_text = false` on its own leaves comments italic. Set both to\n`false` for no italics. `italic` is the old name for `italic_virtual_text`, kept\nas an alias that warns, and removed in 2.0. `Italic` and `@markup.italic` are\noutside both, because italic is their entire definition: strip it and\n`*emphasis*` renders as body text.\n\nWith `transparent = true`, plugin windows go through too, without being listed one\nby one: which-key, the Snacks picker, Noice and fzf-lua link their windows to\n`NormalFloat`, so stripping that strips all of them, including plugins released\nafter this README. The completion menu is the exception and stays painted, since a\ntransparent popup over code is not readable. That covers `Pmenu` and blink.cmp's own\nwindows, which read neither `Pmenu` nor `NormalFloat`.\n\n```lua\nrequire(\"cendre\").setup({\n  on_highlights = function(hl, c)\n    hl.Comment = { fg = c.bg5 }\n  end,\n})\n```\n\n## The cursor stays your terminal's\n\n`Cursor`, `lCursor`, `CursorIM` and `TermCursor` are all set to `ember`, and outside\n`:terminal` Neovim never asks for them. Its default `'guicursor'` names a highlight\ngroup only for terminal mode:\n\n```\nn-v-c-sm:block,i-ci-ve:ver25,r-cr-o:hor20,t:block-blinkon500-blinkoff500-TermCursor\n```\n\nWith no group on the other parts, the terminal draws its own cursor in its own\ncolour. So a black cursor on this theme is your terminal's setting, not a missing\nhighlight.\n\nThe theme does not set `'guicursor'`, because that option carries the cursor's\nshape and blink rather than its colour, and those are yours.\n\nTwo ways to change it. Install the terminal theme for whatever you run, and the\ncursor matches in the editor and in the shell, since every file under `extras\u002F`\nsets it. Or hand the cursor to Neovim by naming the group on the other modes:\n\n```lua\nvim.opt.guicursor = \"n-v-c-sm:block-Cursor,i-ci-ve:ver25-Cursor,\"\n  .. \"r-cr-o:hor20-Cursor,t:block-blinkon500-blinkoff500-TermCursor\"\n```\n\n## Palette\n\nGround, hue 43°, which is wood ash under a 1300 K flame. Ash is spectrally flat,\nso it lands within a degree of the bare flame itself. Shown at `hard`, the default:\n\n| token     | hex       | L     | use                |\n| --------- | --------- | ----- | ------------------ |\n| `bg_deep` | `#0f0c0a` | 0.156 | floats, sidebars   |\n| `bg0`     | `#171311` | 0.191 | editor             |\n| `bg1`     | `#201b19` | 0.227 | cursorline         |\n| `bg2`     | `#2a2422` | 0.266 | statusline         |\n| `bg3`     | `#362f2c` | 0.312 | borders, splits    |\n| `bg4`     | `#463e3a` | 0.371 | hover              |\n| `bg5`     | `#5a504c` | 0.440 | highest layer      |\n\nInk, shared by every depth. Ratios against `bg0` at `hard`:\n\n| token     | hex       | ratio   | use                   |\n| --------- | --------- | ------- | --------------------- |\n| `fg`      | `#e6d5c2` | 12.89:1 | body text             |\n| `fg_dim`  | `#a09384` |  6.15:1 | operators, delimiters |\n| `comment` | `#73665b` |  3.32:1 | comments              |\n| `gutter`  | `#4e4641` |  2.00:1 | line numbers, inlay   |\n\n`comment` is deliberately under AA. Every dark theme people keep for years puts\ncomments below that line, most around 3.3:1, and a comment as loud as the code\nit explains is noise.\n\nThe five pigments, in order of lightness, which is also order of distance from\nthe fire:\n\n| name     | hue    | L     | source              | role                            |\n| -------- | ------ | ----- | ------------------- | ------------------------------- |\n| `brass`  |  61.4° | 0.838 | sodium D 589 nm     | functions, methods, calls       |\n| `ember`  |  43.8° | 0.754 | blackbody 1300 K    | properties, fields, params, UI  |\n| `sap`    | 123.4° | 0.721 | C₂ Swan 563 nm      | every literal value             |\n| `cinder` |  25.9° | 0.665 | CaOH band 622 nm    | keywords, control flow, storage |\n| `frost`  | 227.4° | 0.600 | C₂ Swan 474 nm      | types, classes, constructors    |\n\nArc 202°, smallest gap 17.6°, chroma 0.072 to 0.115. A fire does not offer\nwell-spaced warm hues: cinder, ember and brass sit within 36° of each other\nbecause that is where calcium, soot and sodium actually are. They stay legible\non lightness instead, which is also why `brass` is the brightest thing on screen\nand `frost` the dimmest.\n\nSemantic colours (`error` `warn` `ok` `hint` `info`) are a separate family, all\ncarrying more chroma than any pigment, so a diagnostic never wears the same red\nas a keyword. Chroma is held inside 0.125 to 0.160: unbounded, the optimiser\nthat placed them produced neon.\n\nEach hue traced from its spectrum to its hex:\n[cendretheme.com\u002F#derivation](https:\u002F\u002Fcendretheme.com\u002F#derivation).\n\n## Rules it obeys\n\n1. Hue comes from the source, separation is bought with lightness.\n2. One role, one pigment. No token depends on bold or italic.\n3. A declared name is not a role. Variables and constant names stay in `fg`, and\n   only the value a constant holds takes a pigment.\n4. Punctuation is not a token. Operators, commas and brackets take `fg_dim`.\n5. Diagnostics are their own family, separate from the pigments.\n6. Nothing readable under 4.5:1, with three exceptions that are stated rather\n   than hidden: `comment` everywhere, and `frost` and `error` on `soft`.\n\n## Test\n\n```sh\nnvim --headless --noplugin -u NONE -c \"set rtp+=.\" -c \"luafile test\u002Fsmoke.lua\"\n```\n\nLoads every depth through `nvim_set_hl`, which throws on a missing palette key,\nthen asserts that the switches behave, that `:CendreBackground` swaps the live\nground and rejects junk, that the pigments never drift between depths, that no\npigment collides with a diagnostic, that every published contrast ratio is what\nthe code actually measures, that the role map lands where this README says, that\nno readable token leans on bold or italic, and that every committed file under\n`extras\u002F`, `assets\u002F` and `docs\u002F` matches a fresh render of the palette. Exits\nnon-zero on failure.\n\n## Discussions\n\nFour threads are open, and none of them is a bug report:\n\n- [Show your setup](https:\u002F\u002Fgithub.com\u002FAejkatappaja\u002Fcendre\u002Fdiscussions\u002F43), any\n  surface, any depth. The only screenshot here is mine.\n- [Which surface next](https:\u002F\u002Fgithub.com\u002FAejkatappaja\u002Fcendre\u002Fdiscussions\u002F47), a\n  poll over eight candidates.\n- [Argue with the palette](https:\u002F\u002Fgithub.com\u002FAejkatappaja\u002Fcendre\u002Fdiscussions\u002F44).\n  The hue is not negotiable, everything chosen around it is.\n- [Install and setup questions](https:\u002F\u002Fgithub.com\u002FAejkatappaja\u002Fcendre\u002Fdiscussions\u002F45),\n  including the black cursor.\n\n## Licence\n\nMIT.\n","Cendre 是一个为 Neovim 设计的深色配色方案，基于燃烧木材的物理光谱（如黑体辐射与元素发射线）通过 OKLCH 色彩空间科学推导出五种核心色相，确保语义化色彩区分（如错误、关键词、Git 状态互不混淆）。支持 Neovim 0.9+（需启用 termguicolors），并统一覆盖终端（Ghostty、kitty、tmux 等）、CLI 工具（bat、delta、fzf）、编辑器（Helix、Zed、Obsidian）及桌面应用（Firefox）等 28 种表面，提供 soft\u002Fmedium\u002Fdefault 三档明暗深度，所有资源均由单一 Lua 调色板自动生成，保证全栈一致性。适用于追求科学配色、跨工具视觉统一与深度沉浸式编码体验的开发者。",2,"2026-08-05 02:30:08","CREATED_QUERY"]