Editor › Settings file (Ctrl+,) opens ~/.config/kaivalya-editor/settings.toml, which lists every option below with the same comment, so you rarely need this page. A setting not written in the file keeps the value shown here. A project can change any of them for itself in .kaivalya/settings.toml, writing only what differs — see A project’s own settings.
This page is generated from the editor’s own defaults and comments each time the site is built.
theme
Default: "Kaivalya Blue"
The colours. One of:
"system" follow the desktop, light or dark
"light" the same as "Kaivalya Light"
"dark" the same as "Kaivalya Dark"
"Kaivalya Night" a deeper, cooler dark
"Kaivalya Kiln" warm light, red accents
"Kaivalya Ember" warm dark, red accents
"Kaivalya Blue" the window itself in blue
"Kaivalya Red" the window itself in red
Any name but “system” stops following the desktop. Your own: a .json file in the themes folder beside this one, which is ~/.config/kaivalya-editor/themes/ unless XDG_CONFIG_HOME says otherwise. Saving one changes the colours without restarting.
locale
Default: not set — locale = "fr-FR"
The language of the menus and messages. “en-US” or “fr-FR”. Leave it out to follow the desktop’s own language.
font_family
Default: "JetBrainsMonoNL Nerd Font Mono"
The font the document is written in. Anything installed on this machine, or "" for your desktop’s own monospace. A name nothing answers to falls back to that and says so. A font with no ❤ of its own, as JetBrains Mono, lets ❤ and its kind draw in colour, as an emoji. The NL (no ligatures) variant keeps as typed.
interface_font_family
Default: not set — interface_font_family = "Inter"
The font the menus, tabs and status bar are drawn in. Left out, IBM Plex Sans if it is installed, otherwise the first installed font of the framework’s own list — Ubuntu, Noto Sans, DejaVu Sans… — that has a bold of its own.
pane_font_family
Default: not set — pane_font_family = "Inter"
The font the panes are drawn in. Left out, it follows interface_font_family.
font_size
Default: 17.0
The size of the text you are editing, in pixels. It is also the size of the cells in the table grid, which hold your prose too. The panes and the menus keep their own size.
interface_font_size
Default: 16.0
The size of the menus, tabs, panes and status bar, in pixels. A separate number from font_size on purpose: that one is how big the prose you write should be, this one is how big the screen should be, and you may well want one without the other. In the table grid it sizes the buttons around the cells, and how much room a column is given to hold them; the cells themselves follow font_size.
pane_font_size
Default: 16.0
The size of the text in the explorer, the outline and the search results. A third size because a pane asks a third question: how big a list of file names should be is neither how big your prose should be nor how big the menus should be. It was 12.8 and out of reach until you asked. The table grid is not a pane: its cells follow font_size.
tab_size
Default: 2
How many columns one indentation step is. Markdown and the web indent by two, and a nested list is the indentation you meet most in a markdown editor; a Rust or Python project wants 4. Format this file uses the same width.
insert_spaces
Default: true
true indents with spaces, false with tab characters. false writes one tab per step, whatever width tab_size says a step is. Format this file obeys it too.
soft_wrap
Default: true
Whether a line too long for the window is wrapped rather than scrolled. On by default: this is a markdown editor first, and prose that runs off the right of the window is prose you cannot read. Alt+Z turns it off for the window you are in.
show_line_numbers
Default: true
The numbers down the left of the text.
show_invisibles
Default: false
Show spaces, tabs and line ends as faint marks.
on_open
Default: "home"
What a window started on nothing shows. “home” a list to choose from, the last project first; “last_project” straight back into it with no click; “empty” an untitled buffer, which is what this editor did before the setting existed.
markdown_mode
Default: "edit"
Which of the three views a markdown file opens in. “preview” the rendered document, “edit” the text, “split” both side by side.
markdown_properties
Default: false
Whether a document’s front matter is drawn as a table above it. The block between the — lines at the top of a file: title, tags, css, and anything else you keep there. false leaves it out of the rendered document, which is what it has always been — front matter is an instruction to the editor rather than part of what you wrote. true draws it, which is what you want if that block is notes rather than settings. Only the rendered views change: the text is the text either way.
markdown_stylesheet
Default: "github-light"
Which stylesheet the preview uses when nothing else has said. A name in styles/, beside this file — not a path. “github-light” is GitHub’s light one, whatever your theme is doing. “github” is the pair, and follows your theme light or dark. “kaivalya” is this editor’s own, which carries both palettes itself. The rule is one:
heavy_preview
Default: true
Whether the heavy preview is offered: real CSS, in a window of its own. It is the one feature here with a memory cost worth stating — a second process holding a style engine and a GPU device, about 120 MB while a document is on screen. It costs nothing until it is opened. A build made without the renderer says so rather than pretending.
maths_scale
Default: 1.1
How large a formula is drawn, against the text around it. A ratio, not a size: maths is drawn in em, so a formula takes the size of whatever it sits in — a paragraph, a heading, a table cell — under your stylesheet or anybody else’s, and this multiplies that. A little over 1.0 reads best, because a maths face beside a body face at the same em reads small; 1.1 on the bundled kaivalya stylesheet is exactly 14 pt. 1.0 is the text’s own size. Only the heavy preview and the exports draw formulae.
export_mathjax_url
Default: "https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js"
Where the second export loads MathJax from. “Export as HTML, drawn by the browser” writes this URL into the page and the reader’s browser fetches it — so that page needs the network to be read, and asks somebody else’s host for a script. Point it at your own copy if that is not what you want. The default is MathJax’s own CDN, the SVG build: no web fonts, so the page prints as what it looks like. The ordinary “Export as HTML…” ignores this: it draws the maths here, and the page it writes needs nothing.
export_mermaid_url
Default: "https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs"
Where that same export loads mermaid from, on the same terms. The ES module build, which is what mermaid’s documentation imports.
paste_image_folder
Default: "images"
The folder a pasted image is written to, beside the document — and a dropped one, unless it is already beside the document or under it. Created on the first paste. Empty means beside the document itself.
daily_note_folder
Default: "journal"
The folder inside your project that Today’s note is written in. YYYY-MM-DD.md, created on the first one. Empty means the project’s root.
daily_note_template
Default: "journal"
The template a new note of the day starts from, by name, without the .md — or as folder/name for one in a folder, “notes/daily”. Empty starts an empty note. Its placeholders are filled in as usual. “journal” is the one that ships, in the templates folder beside this file.
whiteboard_background
Default: ""
The colour behind a whiteboard (a .canvas file): "" for the theme’s own, or “#rrggbb”. Obsidian’s file keeps no background, so this is for every board, and Obsidian draws its own.
whiteboard_text
Default: ""
The colour of a whiteboard’s text: "" for the theme’s own, or “#rrggbb”. Change it with the background when the theme’s text would not read on it: a dark background under a light theme wants light text.
whiteboard_grid
Default: true
Whether a whiteboard draws a grid of dots behind its cards.
show_markdown
Default: true
How this document is drawn, as a pane: its stylesheet, and the commands that act on markdown, in named sections you can fold away. On does not mean open: an edge shows one pane, so this puts its icon on the rail beside whichever one is.
markdown_side
Default: "right"
“left” or “right”.
show_colour
Default: false
A colour picker, and the colours this file already uses, as a pane.
colour_side
Default: "right"
“left” or “right”.
colour_as
Default: "window"
“pane”: on the rail, docked or peeked. “window”: a window of its own, opened by the same icon and keys, writing where your cursor was. With “window”, turning the show_ setting off takes the icon off the rail; the keys and the palette still open the window.
show_characters
Default: false
Every character you cannot type — arrows, symbols, emoji, HTML entities — as a pane: a search, the ones you used last, and a grid. One click inserts.
characters_side
Default: "right"
“left” or “right”.
characters_as
Default: "window"
“pane”: on the rail, docked or peeked. “window”: a window of its own, opened by the same icon and keys, writing where your cursor was. With “window”, turning the show_ setting off takes the icon off the rail; the keys and the palette still open the window.
show_outline
Default: true
The headings of the file you are in, as a pane.
outline_side
Default: "right"
“left” or “right”.
show_explorer
Default: true
The files of the project, as a pane.
explorer_side
Default: "left"
“left” or “right”. Both panes may name one edge: that edge shows one of them and offers the other as an icon beside it, which opens on a click and peeks on a hover.
show_search
Default: true
The project search, as a pane. On does not mean open: an edge shows one pane, so this puts its icon on the rail beside whichever one is.
search_side
Default: "left"
“left” or “right”.
show_files
Default: true
Every document open in this window, as a pane: the tab bar as a list, the active one marked. Click one to go to it.
files_side
Default: "left"
“left” or “right”.
open_files_button
Default: "right"
Which ends of the tab bar carry the button that lists the open documents: “left”, “right”, “both” or “none”.
show_git
Default: true
What has changed since the last commit, as a pane: a diff of any file on a double click, and a message box to commit the files ticked.
git_side
Default: "left"
“left” or “right”.
show_todo
Default: true
Every line of the project that carries one of todo_tags, in any file, as a pane. Click one to go to it.
todo_side
Default: "left"
“left” or “right”.
todo_tags
Default: ["TODO", "FIXME"]
The words the TODO pane looks for, whole and as written: “TODO” finds TODO: and // TODO(ana), not todo or TODOS.
scrollbar_marks
Default: true
Marks down the scrollbar: the headings or definitions of the file, and its TODO lines. Drawn from what the outline and the TODO pane already know.
peek_on_hover
Default: false
Whether hovering a rail icon opens its pane over the editor. Off: a pane opens on a click only, and stays.
preview_follows_caret
Default: true
In the split view, the preview follows the caret from heading to heading, scrolling either side brings the other to the same heading, and a click on a heading in the preview takes the text there.
local_history
Default: true
Every save keeps a version of the file, on this machine and never in the project: File > Local history lists them, shows each against the file, and puts one back. The same text twice is kept once.
local_history_keep
Default: 50
How many versions of a file are kept, the newest. 0 keeps any number.
local_history_days
Default: 30
How many days a version is kept. 0 keeps them however old.
copy_on_select
Default: false
Selecting text copies it to the clipboard, as a terminal does. Off by default because it also replaces what you copied when you select text to paste over it.
clipboard_history
Default: 20
How many things copied or cut Edit > Paste from history (Alt+V) offers, newest first. Kept in memory only, never written to disk. 0 keeps none.
rail_order
Default: ["explorer", "files", "search", "todo", "git", "outline", "markdown", "characters", "colour"]
The order of the pane icons on the rail, by name, for both edges: “explorer”, “files”, “search”, “todo”, “git”, “outline”, “markdown”, “characters”, “colour”. A pane left out comes after the ones listed. The first pane of an edge is the one it opens on.
rail_icon_size
Default: 25.0
How big the rail’s icons are, in pixels, from 12 to 40. The rail is as wide as they need.
show_hidden
Default: true
Whether names beginning with a dot are listed. On: .gitignore, .github/ and .env are files this editor is for. .git/ is never listed at any setting.
use_gitignore
Default: false
Whether what .gitignore excludes is left out. On: target/ and node_modules/ are not what you opened the project to read. Off shows them again, in the explorer, the file picker and the search at once. Ctrl+Shift+G flips it for a minute without editing this file.
toc_min_level
Default: 2
The shallowest heading a generated table of contents lists. 2 leaves out the H1, which is the document’s own title.
toc_max_level
Default: 6
The deepest heading it lists. 1 to 6.
line_width
Default: 80
The column the formatter aims at.
format_wrap_text
Default: false
Whether formatting re-wraps prose that runs past line_width. Off by default: re-wrapping rewrites every line of a paragraph, so one format of a document written a sentence per line touches the whole file.
format_on_save
Default: "off"
Whether saving formats the file first: “off”, “embedded” or “always”. “embedded” formats only where the formatter is built in — markdown, JavaScript, TypeScript, JSON, CSS, HTML, XML, Vue, YAML, TOML, PHP — which costs no process; “always” also runs rustfmt, gofmt, shfmt, ruff, or dprint when the project has a dprint.json. Off by default: reformatting a repository whose conventions the editor has guessed produces diffs nobody can review.
format_on_save_languages
Default: {}
The same, per language: { rust = “always”, markdown = “off” }.
format_timeout_ms
Default: 400
How long a formatter that is a program may take, in milliseconds, before it is stopped and the text left as it was.