Volt
00000000

Everything it does

The whole editor, on one page

Most editors keep a feature list short because the list is the marketing. This one is the opposite: every command, every setting and every behaviour that is actually in the build you can download today, grouped so you can find yours. Search it — a menu name, a shortcut, a format, a habit you would miss.

Try it instead of reading about it

The beta is free and needs no account. Each build runs for seven days, and every update gives another seven.

Download Volt for Mac

Large files and speed

The size of a file is not supposed to be your problem. Past a threshold you set, a file is not read to be opened at all — so the time to open it does not depend on how big it is, and neither does the memory it costs.

Opening

  • A 4.23 GB log opens in 2 ms50.4 million lines, on a few megabytes of memory — measured on an M-series Mac, not estimated.
  • The threshold is yoursSettings decides the size past which a file is mapped rather than read; 64 MB by default.
  • The status bar says which it didMapped or in memory, with the size on disk and the line count beside it.
  • Progress never blocks the textLong work appears as a strip above the status bar with a Stop button — never a modal sheet — and the text stays readable and scrollable while it runs.
  • Small files skip all of itUnder 4 MB a file opens straight away, and the strip only appears at all if work is still running after a quarter of a second.
  • A line of any length is drawnA minified bundle or a JSON document on one line is shown, up to a megabyte of it.

Line numbers and the scroller

  • Absolute, relative or hybrid numbersThe caret's line absolute and the rest counted from it, for the people who move by counts.
  • Numbers set in tabular figuresWhich matters the moment the editor is not in a monospaced font.
  • The scroller is a mapSearch hits, changes against HEAD, bookmarks, errors and warnings are all drawn down its track. Clicking the track goes there.

Minimap and wrapping

  • Minimap, one row per lineThe shape of the code beside the code, with bookmarks down one edge and search hits down the other.
  • It says where you are pointingLine 412 · Server.start — the line number and what encloses it.
  • Soft wrap, on by default⌥⌘W turns it off. Continuation rows keep the line's own indentation, so wrapped code keeps its shape.
  • Wrapped text still behavesPage Up and Page Down move a page, End goes to the end of the row, a resize keeps what you were looking at, and the caret never slips off the bottom.

Files, character sets and line endings

219 character sets, 9 line endings, and detection that explains itself rather than guessing quietly. This is the half of the editor most others leave to the command line.

Character sets

  • Detection that scores every setByte order mark, then structure, then language scoring, then the 8-bit code pages — sampled at the head, the middle and the tail, because a log can change halfway.
  • It tells the lookalikes apartWindows-1252 from Mac Roman, Latin-2 from Latin-1, KOI8-R from Windows-1251 — the pairs every "does it decode?" detector gets wrong.
  • A short file is not ChineseA handful of accented bytes in a French or Russian note is read as what it is, not as three ideographs.
  • Compare Character Sets…The same bytes read every way, side by side, scored — for the file the detector cannot settle. Only the sets that can genuinely read those bytes are offered.
  • Reinterpret, or convert on saveChoosing a set asks which you meant: read the same bytes again, or write the text out in that set.
  • Nothing becomes a ? without a wordA character the chosen set cannot spell is reported before it is lost, not after.
  • 62 EBCDIC code pagesWestern and Central Europe, the Baltic, Cyrillic, Greek, Turkish, Arabic, Hebrew, Farsi, Urdu, Japan, Thailand, Vietnam, Laos and Devanagari.
  • Japanese mainframe files, Kanji and allEBCDIC 930, 939, 1390 and 1399 — and the shift-out and shift-in runs put back exactly where they belong on save.
  • Library records in MARC-8Accents shown as one character so a search finds them, and written back the way a MARC 21 record needs — lengths and directory kept valid.
  • Six-bit codes, older than EBCDICIBM's BCD, GBCD, Burroughs, CDC and the rest — chosen from a list, because nothing in such a file says which it is.
  • The character-set menu is yours to setTick the sets that belong in it; the rest stay one level down, grouped by region rather than in a flat list of fifty-eight.
  • A file named for its set is read as itpayroll.ebcdic, MASTER.CP273, extract.ibm-1047 — believed about EBCDIC, doubted about everything else.
  • UTF-16 and UTF-32, in and outOpened as text, written back in the encoding they came in, and what nobody touched is written back byte for byte.
  • volt --encodingPrints what it decided and why, with the runners-up and their scores behind --verbose.

Compressed files

  • A .gz opens as its textA rotated log, a dump, a config out of a backup — read, edited and saved as a .gz again.
  • bzip2, Zstandard and xz too.bz2, .zst and .xz open and save exactly as .gz does, with nothing to install.
  • Several members read as one textAppended logs, cat a.gz b.gz, anything bgzip writes — one document, not a refusal.
  • The inner file decides everythingnginx.conf.gz is highlighted as an nginx configuration and dump.sql.bz2 as SQL, each with the icon it would have without the wrapper.
  • The bytes decide, not the nameA compressed file is unpacked whatever it is called, and a file saved without the extension comes out plain — the only way to unwrap one from inside an editor.
  • Saved as hard as it cameA file packed at the strongest setting is packed that way again.

Logs

  • A log is recognised by its linesNot by its name — from the way its first two hundred lines start.
  • Every line coloured for what is in itThe time, the level, addresses, identifiers, HTTP methods, exceptions, key=value pairs and durations.
  • Errors red, warnings amberMarked down the scroller as well, and the stack trace under an error belongs to the record above it.
  • Show Only ErrorsAnd errors and warnings — a filter that keeps each record's own lines with it.
  • Go to Time…The first line at or after a moment: 14:03, a full date, or +5m and -1h from the line you are on.
  • A file that grows is followedNew lines are added to what is on screen rather than the file being read again.

Line endings

  • LF, CRLF, CR — and mixed files reportedConverted in the same pass that reads the character set.
  • NEL, LS, PS, VT, FF and LFCRNine endings in all, including the ones from mainframes and from Unicode itself — files that open as one enormous line everywhere else.
  • A form feed is a page markIt only counts as a line ending in a file that plainly uses it as one.
  • A final newline, if you want oneOff by default, and when it is on it appears in the window as an ordinary, undoable edit.

The file on disk

  • It notices when a file changesModified, truncated, replaced or deleted — with nothing unsaved it reloads by itself and keeps your caret and scroll position.
  • Locked and read-only files say soIn the title bar, before a save fails — and a lock is Volt's to undo, so Save offers to unlock.
  • The File menu does the Finder's workReveal in Finder, Copy Path and Copy Relative Path, Save a Copy…, Rename…, Move To…, Move to Trash, Reopen Last Closed Window.
  • Volt is in Open With for any fileAlways as an alternate, never taking a file away from the application it belongs to.
  • Quick Look in the FinderThe space bar on a file gives Volt's own reading — records, character set, line endings — where the system's preview shows a wall of question marks. Gzip files are read too.
  • Drag a file into the textIts path is typed, relative to the document; Markdown writes a link or an image, HTML writes a tag, CSS writes url().
  • A filetype icon in front of each nameIn the project sidebar and in Go to Anything, grouped by what a file is for.
  • Project ReportWhat every file in the project is — character set, byte order mark, line ending, final newline, and what a hygiene scan found — filtered to Not UTF-8, Not LF, Something wrong.
  • Save when you walk awaySwitching window or application writes the file, if you turn it on — and it refuses where refusing is right.
  • Text that never was a filegit diff | volt opens the diff in a window, highlighted as a diff.
  • Normalise UnicodeNFC, NFD, NFKC and NFKD, over the selection or the document.

Mainframe files, records and the bytes themselves

Files that have no lines in them, columns a copybook defined sixty years ago, and a hex editor for when the question has no other answer.

Records

  • IBM RDW recordsVariable-length records with their four-byte descriptor word are recognised by following the chain, not by guessing.
  • Fixed-width records80 columns from a card, 133 from a printer — turned into lines on the way in, with the padding taken off.
  • The window says what it readBecause what is on screen is Volt's reading of the file: it saves lines, not records.
  • EBCDIC with an ASCII line feedThe half-converted file that comes off a mainframe through the wrong tool still reads as lines.

Fixed-width fields

  • Field Widths…Type the widths the way a copybook writes them — 3 15 10 20 20 20 3 10 40 — and a hairline is ruled down each boundary.
  • Detect from FileWorks the columns out from the runs of padding that every record shares.
  • Fields as CSV in a New DocumentEach record cut at its field widths, the padding taken off — or tab-separated, behind ⌥.
  • Named layouts, remembered3 id, 15 surname, 10 first name — and the layout is offered again for the next file like this one.

Hex editor

  • Show Hex Editor (⌃⌘X)Offsets, the bytes in groups of eight, the printable characters beside them — in the pane beside the text.
  • The bytes are editableThe caret stands between two bytes; type hex digits and they go in. Selections, cut, copy, paste and one shared undo with the text.
  • Overwrite Mode for patchingTyping changes a byte instead of inserting one — what patching a file without moving anything after it means.
  • It follows the caretMove in the text and the dump moves to the same place; 64 KB at a time, with an offset field that takes hex or decimal.
  • It says when the bytes are not the file'sA UTF-16, EBCDIC or packed file is edited as UTF-8 and written back in its own form, and the pane tells you so.

Files on another machine, and on a server

Four ways in, all of them ending in an ordinary window with your own settings, highlighting, formatter and linter — and ⌘S sending it back.

Over SSH

  • File ▸ Open Remote…user@host:/etc/nginx.conf, and the file is in a window. ⌘S writes it back.
  • It lists the directory as you typeBecause nobody knows the whole path past the first time.
  • Asked for a password once, not three timesAnd kept in the login keychain if you ask it to.
  • rmate config.yml on a serverOpens the file here, over the SSH session you are already in. The script ships with the editor.
  • It says what it is doingEach step while a file is fetched and while it goes back — and a save that does not arrive says so rather than failing quietly.
  • A dropped connection loses nothingThe save is written beside the real file and moved into place, so half a file is never what is left.
  • A remote window comes back tomorrowRemembered by web1:/etc/nginx.conf rather than by a temporary path that will be gone.

FTP and SFTP

  • File ▸ FTP…Your servers down one side, what is on the picked one down the other — for the shared host or the appliance that has no shell at all.
  • SFTP is the same windowA saved connection can be one over SSH, or an sftp:// link.
  • Plain FTP, or FTP over TLSExplicit or implicit, with passive mode — the one that works from behind a router.
  • A connection is saved onceName, server, port, user, the folder to start in. The password goes to the login keychain, not into a settings file.
  • The folders behave like a Finder windowA source list, kept until Refresh, because each listing is a login and a round trip.
  • New folder, rename, deleteOn the right-click menu — and the delete says plainly that a server has no Trash.
  • Saving goes up under its own nameAnd is renamed over the file once every byte is there.

Together, through iCloud Drive

  • File ▸ Share…For a file in iCloud Drive, the people you invite get the same file and edit it with you.
  • Their changes arrive as they saveMerged into the text on screen; yours stay, and your caret keeps its place.
  • Marked in the gutter, by nameEvery line a merge brought in, with who changed it when you point at it.
  • A save never writes over something newerWhen two Macs saved at once, both versions come into the window with every difference marked.

Unsaved work

The promise is small and absolute: what you typed is still there. Quitting, closing, crashing, a battery that ran out — none of them is a way to lose it.

  • Unsaved work survives quittingAnd closing the window, and a crash, and a forced quit. It is written as you type, not at the end.
  • A draft that was never a file is kept tooThe window that was never saved comes back with what was in it.
  • A window that shows what is heldEvery draft Volt is keeping, in one list, so nothing is held in secret.
  • Letting go of a draft means the wastebasketDiscarding is an explicit act with a sound, not a silent deletion.
  • A big file is kept tooThe rule does not stop applying because the file is inconvenient.
  • Come back to exactly what you leftOpen files, caret, selection, scroll position, character set, language, window size and split, restored on the next launch.

Editing

Sixty-five things the Edit menu does, and the ones people actually reach for every day are in the first two lists.

Every day

  • Multiple cursors and block editing⌥-click adds a cursor, ⌥-drag makes a rectangle, ⌃⇧↑/↓ add one above or below, ⌘D selects the next occurrence — and the whole batch is one undo step.
  • Undo, a word at a timeNot a burst at a time: ⌘Z after a sentence takes back a word, not the sentence.
  • Toggle Comment (⌘/)The language's own token, at the shallowest indentation so the markers line up — and the block form when the selection is inside one line.
  • Move, duplicate and delete lines⌥⌘↑/↓, ⇧⌘D, ⌃⌘K — and New Line Below (⌘↩) and Above (⇧⌘↩), indented to match.
  • Shift Left and Right (⌘[ / ⌘])And Tab and ⇧Tab over a selection that spans lines.
  • Paste with Indentation (⇧⌘V)Moves what you paste to where you are pasting it. Plain ⌘V still pastes exactly what was copied.
  • Paste from History (⌥⇧⌘V)What was cut or copied lately, searchable — with pins for the signature or the boilerplate you paste every day.
  • Drag text to move itInside a document that is one undoable change; between windows, the text leaves one and arrives in the other.
  • Overwrite ModeThe Insert key, or the Edit menu.
  • ⌘C with nothing selected takes the lineThe way every editor people arrive from behaves — and it can be turned off.

Lines, numbers and case

  • Sort lines the way a list is sortedNatural order — line 10 after line 9 — as well as plain, reversed, and by the columns a block of cursors spans.
  • Remove duplicates, empties and repeatsThe first of each kept, or only consecutive ones, as uniq does.
  • Join Lines, Split Lines At…Turn a, b, c into three lines, each with the indentation of the line it came from.
  • Rewrap ParagraphsThe selected lines, or the paragraph the caret is in — never a whole file of code by accident.
  • Increment and Decrement NumbersEvery number in the selection by one, or the one under the caret.
  • Change Numbers…+ 5, − 3, × 1.1, ÷ 2 over every number in the selection.
  • Convert to Decimal, Hex, Binary, OctalEvery whole number in the selection, or the one at the caret.
  • A column of figures is added upSelect them and the status bar says Σ 60 · 3 numbers · average 20.
  • Convert Case, eleven waysUPPERCASE, lowercase, Title, Sentence, iNVERT, UpperCamelCase, lowerCamelCase, kebab-case, snake_case, CONSTANT_CASE, dot.case.
  • Statistics…Characters, words, lines and Unicode scalars, over the selection or the document.
  • Checksums…SHA-256, SHA-512, SHA-1 and MD5 in one pass, a click from the clipboard.
  • Encode and DecodeHTML, URL, Base64 and the rest, over the selection or the document, both ways.
  • Insert DateISO 8601 at every cursor, or your own pattern from Settings.
  • Redact SelectionEvery character becomes █, spaces and line breaks kept — so a log keeps its shape when you send it on.

Selection, brackets and tags

  • Move through the parts of a name⌃⌥← and ⌃⌥→ walk parse, HTTP, Server, 2 in parseHTTPServer2, and the words of snake_case.
  • Expand Selection (⌃⇧⌘→)Grows by the text's own structure: the word, the dotted name, the string, the call, the block.
  • Matching brackets, tags and commentsBoth halves boxed, or neither — including the two ends of a block comment.
  • Change or remove the brackets around itAnd move to the next bracket in the file with ⌃⌘] and ⌃⌘[.
  • Tags close themselvesIn HTML, XML, Markdown, PHP and JSX — and it knows when not to: void elements, comments, doctypes, generics.
  • Wrap Selection in Tag… (⌃⌘T)The selection stays selected, so wrapping twice works.
  • Open SelectionOpens what the selection names — a web address in the browser, a file in Volt.
  • Read Only for All DocumentsEvery window at once, for reading a set of files without a stray keystroke.

Indentation

  • Return indents by the language's rulesOne level in after a brace or a colon, and pulled back out when the line closes one.
  • A file's own indentation is adoptedTabs, or 2, 4 or 8 spaces, for that document alone — shown in the status bar.
  • Convert Indentation to Spaces or TabsKeeping where each line starts.
  • Tab width and indent width are two numbersThe same by default, and separable for the files where they are not.

One bar with both fields always showing, and sixty-odd things built on it — because finding something in a very large file is most of what a very large file is for.

The find bar

  • Literal or ICU regular expressionsWith case, whole words, wrap-around and $1 templates in the replacement.
  • Escape sequences\n, \t, \xHH and \uXXXX in both fields, without turning on regular expressions.
  • Find AllOne pass gives the total, the first 10,000 matches as a clickable list, and markers down the scroller.
  • Markers sampled across the whole fileNot taken from the first few matches — in a big log that is the difference between a map and a smudge at the top.
  • It says how far it has gotSearching… 42%, with the elapsed time on anything slower than half a second, and a Stop button.
  • Replace All is undoableEven on a mapped file — nothing is written to disk until you save.
  • Search in SelectionLimits Find Next, Find All and Replace All to what was selected when you switched it on.
  • Preserve Case When Replacingword becomes name, WORD becomes NAME, Word becomes Name.
  • The last search, anywhereShared with every other Mac application through the system's find pasteboard.
  • Find in Recent Files (⌃⌘F)The files you had open lately, wherever they live.
  • The fields take line breaksSo a two-line pattern is typed as two lines.

Counting, marking, filtering

  • Count Matches42 matches on 30 lines, with nothing opened and nothing moved.
  • Tally MatchesEvery match counted by what it says, most frequent first, in a new document.
  • Mark All MatchesKeeps a search painted in one of five colours while other searches come and go — three things to watch in a log is three markers.
  • Show Only Matching Lines (⌥⌘L)grep, still in its window: the lines keep their numbers and stay editable.
  • Hide Matching Lines (⌥⇧⌘L)The other way round, and the two combine — show the errors, hide the ones you have seen.
  • Filter Lines…Several conditions at once, each one a switch, and saved filters you can turn on together.
  • A filter outlasts a rotated logWhen the file is written again, the filter is still on.

Across a project

  • Find in Project (⇧⌘F)The same engine and the same results list, over every file of the project.
  • Replace in Project (⇧⌘H)Searches first, says how many matches in how many files, and only then writes.
  • File Filter…Include and exclude lists in the patterns you already know — *.swift, Sources/, *.{js,ts} — and a replace obeys the same filter.
  • Find in Open Documents (⌥⌘F)Every window as it is now, unsaved changes and untitled windows included.
  • Structural searchCode with holes in it: print(:[what]) finds every call however long its argument, if (:[cond]) { :[body] } finds the whole statement. The same holes put it back in the replacement.

Batch replace and saved searches

  • Batch Replace…A list of pairs — what a spreadsheet puts on the clipboard when two columns are copied — run in one go, with each pair's own switches.
  • Over every open documentEach document's changes one undo step in its own window — and Count says what would happen without changing anything.
  • Lists you keepA house style's spellings, a migration's renames, saved under a name.
  • Searches worth keepingSaved with their options, because a regular expression brought back without "Regular Expression" on is a literal string that finds nothing.
  • On every Mac you useYour saved searches, language modes and snippets follow an account, merged rather than overwritten when two Macs save at once.
  • Go to Anything (⌥⌘P)@name for symbols, :123 for a line, anything else for open documents and recent files.
  • Commands… (⇧⌘P)Every command in the menus in one field, with the menu it sits under and its shortcut.
  • An outline that needs no language serverBuilt from the same lexer that colours the text, so it works on files far too large for one.
  • Jump to Definition (⌃⌘J) and Find UsagesOr ⌘-click.
  • Outline sidebar and breadcrumbsThe sidebar follows the caret; each breadcrumb drops a menu of its siblings.
  • HTML and XML have an outline tooBecause a page is read by its headings.
  • Go to Line… (⌘L)Takes 12:5 for line and column, and a byte offset, because a line number is not the only thing a person is told.
  • Bookmarks, with notes⌥⌘M marks a line, the number is drawn on a tag in the gutter, and Bookmark with Note… says why. They move with the text as you edit.
  • Bookmark Shown LinesFilter to the errors, mark them, show the file again — and the marks are where the errors were.
  • Back and forward (⌃⌘← / ⌃⌘→)Records jumps, not arrow keys: a move of fewer than twelve lines is typing, not travelling.
  • Scope headerThe definition you are inside, pinned above the text as its own first line scrolls away — keeping its real line number.
  • Code foldingFrom braces, from indentation, and from a language's own markers, with a ribbon down the gutter showing every region in view. Folds are per pane.
  • Jump to Selection (⌘J)Back to where the caret is, after the view has wandered off.

Languages and syntax

123 languages and 439 file extensions, each one a table of keywords, comments, string delimiters, indentation, folding and symbols — which is why you can add one yourself as a plain file instead of waiting for a release. The full list of what it opens is its own page.

Highlighting

  • Everything you work inSwift, C/C++/Objective-C, JavaScript/TypeScript, Python, Rust, Go, Java, Kotlin, C#, PHP, Ruby, Perl, Lua, Shell, SQL, CSS, SCSS, HTML, Markdown, YAML, JSON, TOML and the rest.
  • And what the mainframe runsCOBOL, JCL, RPG in both forms, ABAP, PL/SQL, Delphi, Visual Basic, Visual FoxPro, SAS.
  • And the newer onesMojo (.mojo and .🔥), Zig, Nix, Julia, Elixir, Haskell, OCaml, Lisp, Ada, Fortran, Tcl, R, PowerShell.
  • The files that build the softwareMakefile, Dockerfile, CMake, Terraform/HCL, Gradle, Bazel — read as themselves rather than as shell scripts.
  • Servers and their configurationApache and .htaccess, nginx, Caddyfile, crontab, SSH config.
  • CSV and TSV get a mode of their ownNot a language, and worth colouring: where the fields end and which one you are in.
  • Templates lex as what they holdERB, EEx, EJS, PHP-HTML, Jinja, Nunjucks, Twig, Liquid, Handlebars, Mustache and Go templates — the page as a page, each tag as its own language.
  • HTML with other languages in it<script> is JavaScript and <style> is CSS, with their own comments and strings.
  • Strings with code in themThe expression inside "\(name.count)" or ${a + 1} is lexed as the code it is — and only where that delimiter really interpolates.
  • Heredocs<<EOF, <<~EOF, <<'EOF' and PHP's <<<EOT — and a << b is still a shift.
  • Character references, right and wrong&#233; is marked as what it is and &nsbp; as the mistake it is.
  • Bracket colours by depthSo the one that closes the line you are on is obvious.
  • No extension, no problemThe words in the file decide, and a #! line is read — a script called deploy is what its first line says it is.
  • A new file works out what it is turning intoPaste a page of Python into an untitled window and the window is a Python window.
  • .m is Objective-C and it is MATLABNo rule about names can tell them apart, so the file itself is asked.

Per language, per project

  • Settings ▸ LanguagesIndentation, wrapping, formatter, linter and character set per language — each control with a Default that means "whatever the settings say".
  • .editorconfig is readindent_style, indent_size, tab_width, end_of_line, charset, trim_trailing_whitespace, insert_final_newline — and the project has the last word.
  • .gitattributes tootext, eol=lf|crlf and working-tree-encoding, after .editorconfig.
  • New files in a language can have their own rulesLine endings and character set, decided per language.

Code intelligence

  • Language servers, when you want themDiagnostics as you type, completion, hover documentation (⌃⌘H), Rename Symbol (⌃⌘R) and code actions — off until you switch a language on, because nobody should get a long-running process by opening a file.
  • A rename says what it will touch firstHow many changes, in how many files, and how many of those are not open.
  • Signature helpThe signature above the line with the parameter you are on in bold — and it never takes the keyboard.
  • Find Symbol in Project… (⌥⇧⌘O)The names a server knows anywhere in the project.
  • Completion, with or without a serverFrom the server when one is running, otherwise from the words already in the file, ranked by how often and how near they are.
  • It never covers what you are typingAnd typing carries on into the document underneath the list.
  • Snippets with stops and variablesTab between the stops, $TM_FILENAME, $CLIPBOARD and the rest by the names other editors use — and a number used twice is one stop in two places.
  • Linting (⌃⌘L)Defaults for swiftlint, ruff, eslint, go vet, clippy, shellcheck, cppcheck, rubocop, yamllint and markdownlint; anything else is a command you configure.
  • Findings in four placesA dot in the gutter, a mark down the scroller, the message on the line, and the list — which opens itself only when you asked for the check.

Git

  • Change bars against HEADAdded, modified, and a wedge where lines were deleted — in the gutter and down the scroller.
  • Outside a repository, against its saved selfSo the marks mean something in any file you edit.
  • The branch, and how many lines differIn the status bar, with Next and Previous Change (⌃⌘↓ / ⌃⌘↑).
  • A moved block reads as a moveNot as every brace realigned.
  • Revert ChangePuts the hunk under the caret back to what HEAD says, as one ordinary undoable edit — nothing written to disk.
  • Show BlameWho last touched each line and when, labelled once per run — or ⌃⌘B for just the line you are on.
  • Compare with Revision…Then and now in two panes, rows aligned, with Take Left to bring a difference back.
  • Compare with File…Two files that are not versions of one another, unsaved changes included.
  • Show Changes (⌃⌘D)The diff against HEAD as a patch, in a window — highlighted, folded and listed like any other file.
  • The project is what Git says it isGo to Anything and the files sidebar list the repository's files, so .gitignore decides and a build folder is not in your way.

Tools and external commands

  • Format Document (⌥⇧⌘F)Through the formatter you configured for that language — and only the part that differs is replaced, so your caret and scroll position survive it.
  • Format before savingPer language, if you want it.
  • Minify JSONWith no tool at all.
  • Filter Through Command (⌃⌘U)Pipes the selection — or the document — through a shell command and replaces it with what came back. A command that fails changes nothing and says why.
  • Commands run in a login shellSo Homebrew and nvm tools are found, and a missing one is named rather than reported as a generic failure.
  • Run Script (⌘R)Runs the document with its language's interpreter — python3, ruby, perl, node, osascript — and what is on screen is what runs.
  • Compile Script…Writes the .scpt that Automator, Folder Actions, Mail rules and the Script menu expect.
  • Install Command Line Tool…Writes a volt command, after saying whether it will work — and asks for an administrator's password the way the system does.

Preview, printing and output

Preview

  • Markdown rendered as you type (⌘R)From the buffer, so it follows what you type without saving.
  • HTML previewed from diskWith its own stylesheet, reloaded when you save.
  • A CSV is previewed as the table it isOf any size — and the separator is read from the file, because a .csv from a German spreadsheet is as often semicolons.
  • Plain text and RTF as a pageProportional type, a comfortable measure, line breaks kept.
  • Clicking the preview goes to that place in the fileAnd the pane follows the caret the other way.
  • A contents button in the pane's barEvery heading in the document, indented by level.
  • Nothing is fetched from the networkJavaScript is off in the rendered page, and a clicked link opens in your browser rather than in the pane.
  • Images shown under the line that names themIn Markdown, in CSS url(), in an src attribute, or a bare path in a comment.

Printing and copying out

  • Print… (⌘P) and Export as PDF…With the file's colours, optional line numbers, the name at the top of every page and the page number at the foot.
  • The page header can be turned offAs can the date beside it.
  • Printing uses the light themeWhatever the editor is set to — a dark theme on white paper is a black rectangle — and prints the selection when there is one.
  • Copy with Syntax Highlighting (⌥⌘C)RTF, HTML and plain text at once, so it keeps its colours in Pages, Word or a mail message.
  • Colour swatches, and a pickerEvery #hex, rgb() and hsl() gets a bar in its own colour, and Edit Colour… writes your choice back in the notation it was found in.
  • volt --pdf file out.pdfThe same PDF, from the command line.

Text hygiene and security

  • Clean Up Document… (⌥⇧⌘K)Says what is in the file that is not in the text, with a checkbox for each kind — and applies every ticked one as a single undoable change.
  • Bidirectional controls are reported as errorsThey can reorder what a reader sees without changing what a compiler reads. That is an attack, not untidiness.
  • What it refuses to remove is the pointA tab is text, a form feed is a page mark, and the joiners inside 👨‍👩‍👧 are what make it one emoji.
  • Show Invisible CharactersSpaces as ·, an arrow inside each tab's own width, ¬ at a real end of line.
  • The ones worth finding are marked as wrongA non-breaking or ideographic space, a soft hyphen, a zero-width character — what a word processor leaves in pasted text.
  • Control characters are always shownEach drawn as a picture of its own name — ␀, ␇, ␡ — with its number over it if you ask.
  • Trimming on saveTrailing whitespace, and the invisible half of the clean-up, on every save if you want it.
  • Column guidesAt the columns your project cares about.
  • Character Inspector (⌥⌘I)What that character actually is: its code point, its name, its bytes in this file's character set.

Themes, fonts and appearance

  • Three themes, and yoursPaper (warm and light), Midnight (cold and dark) and Coffee (warm and dark), plus colour-blind-safe Light and Dark.
  • A theme decides the whole windowTitle bar, the bars above and below the text, the sidebars — and the light or dark appearance follows.
  • A theme editorEvery colour a theme has, grouped, as colour wells over a live sample of real code.
  • Themes are plain JSON filesAnything you leave out is inherited, so a theme can be four lines long.
  • Language modes are files tooKeywords, comments, string delimiters, indentation, folding and symbols — and a mode whose id matches a built-in language replaces it, which is how you add a keyword without waiting for a release.
  • A mode can paint its own patternsA regular expression on top of what the scanner found — IP addresses in a log, ticket numbers in a comment.
  • A theme can let the desktop throughTranslucency, from a slider or one line in the file.
  • Any font on the machineAt any size — not only the monospaced ones.
  • Font Features…Small capitals, old-style figures, alternates and rare ligatures — whatever the font you chose can do.
  • Ligatures that come apart under the caretAn arrow you cannot see the halves of is a poor thing to edit.
  • Letter spacingIn points, negative to pull the text together, with the guides following it.

Windows, tabs and the session

  • Split viewSide by side (⌥⌘S) or stacked (⌃⇧⌘S) — one document, but each pane keeps its own caret, scroll, folds and filters.
  • Tabs, and windows, explicitly⌘T always tabs and ⌘N always opens a window — and Sort Tabs by Name or by Type puts them in order.
  • A window can be two lines tallSmall enough to keep a log's last lines in the corner of the screen.
  • What a window shows is that window's ownLine numbers, minimap, outline, breadcrumbs, blame, issues and invisibles — per window, not per application.
  • A large session is usable at onceTwo hundred windows come back without the application going still.
  • The session is written as you workNot only on a clean quit, so it survives a crash.
  • A files sidebar (⌃⌘1)The project as a list, with a filter field at the foot, Finder's own row height, and the context menu you expect — Quick Look, Show in Finder, Rename, Duplicate, Compress, Move to Trash.
  • My CommandsA menu of your own, made of any commands Volt has.
  • A file on a share does not hold Volt stillWhen the server behind it has gone.

Accessibility, and five languages

  • Increase Contrast is honouredEvery token colour is pushed away from the background until it meets the ratio.
  • Colour-blind-safe themesLight and dark. Contrast cannot fix colour blindness; a different palette can.
  • VoiceOverThe editor answers for itself as a text area — how many characters, what is on line n, where the insertion point is — and the rotor moves by definitions, bookmarks and issues.
  • What a command says is said aloudBookmarked line 12, 42 matches — the notices that come and go at the bottom of the window.
  • Accessibility Zoom follows the caretA magnified screen keeps up with where you are typing.
  • English, Deutsch, Français, Italiano, EspañolThe whole interface, with numbers and sizes in the interface language too.
  • Indent guides, at the strength you wantIncluding none.

Automation and keys

  • AppleScriptA real dictionary: documents expose name, path, text, selection, line count, encoding, line ending and language — and open, count, exists and quit work as they do in any Mac application.
  • Scripted commandsselect line document 1 number 42, find document 1 for "needle" using regex true, replace…, and do menu command for anything else.
  • Vim modeNormal, Insert, Visual and Visual Line, with counts, the usual motions, operators, registers, macros and . to repeat the last change.
  • ⌘ always belongs to the menusAn editor that swallowed ⌘S because it was in Normal mode is an editor that loses work.
  • Every command is rebindableSettings ▸ Keys lists them all, records a new shortcut by pressing it, and warns when the key is taken.
  • Shortcuts live in a readable fileWritten as the symbols people already read, so it can go in your dotfiles.

Finding your way around

  • Volt Help (⌘?)Every feature there is, on one page, in a window of its own — offline.
  • A command that cannot work says soGreyed out before it is clicked, with an honest sentence when you ask why: no language server for this file, this file is not in a repository, no changes to compare.
  • Menus you can find things inThe small switches one level down, nothing in two places, and every shortcut where it always was.
  • The status bar is four pickersCharacter set, line ending, language and indentation — each one a menu, each one saying what the document actually does.

That was the list. The editor is 7 MB.

Free beta, no account, no sign-up. Each build runs for seven days, and every update gives another seven. macOS 13 or later.

Download Volt for Mac

Prefer to wait for 1.0? Ask us to write once when it ships, or read what changed in the last build.