Volt
00000000

macOS · private beta

A Mac text editor with everything you need and nothing in your way.

Volt is a macOS text editor for the work you do every day. It opens instantly, keeps out of the way, and never loses what you typed — and it does everything you would leave your current editor for: 119 languages, project-wide search and replace, Git, language servers, multiple cursors, split view.

The same design that makes it quiet makes it quick. A small file is simply read; past a size you set, it is not read at all — so a 4.23 GB log of 50.4 million lines opens in two milliseconds, on a few megabytes. And the files nothing else will open, it opens too.

Get the beta

One email when the next round of invitations goes out. Then one question: what should we build next?

instanton every file, every size
2 msto open a 4.23 GB log
6 MBone binary, no runtime
71languages highlighted
neverloses what you typed
00000200

Speed

Measured, not claimed

One file, one machine, one release build: a 4.23 GB web log of 50.4 million lines on an M-series Mac. Every number below comes out of Volt --benchmark, which you can run on your own file. Opening does no work you did not ask for, which is why the fans stay out of it.

OperationTimeWhat it does
Open the file2 msSettle the character set and the line ending
Read a random line41 µsLine 40 million as quickly as line 40
First regex match12 msNever over a decoded copy of the file
Count every line exactly0.2 sOnly when something asks for the total
Literal search, needle present1.50 s2.8 GB/s
Literal search, needle absent0.52 s8.1 GB/s, without decoding any of it
Memory while it is opena few MBFor a file of 4.23 GB

For comparison, rg -F -j 1 on the same file and machine takes 1.55 s and 0.69 s. Volt is in the same class as a dedicated search tool — and it keeps what it learned about the file afterwards, so every later jump, search and scroll is instant.

00000600

Powerful, and small

Everything a big editor does. None of what makes one big.

Editors usually pick a side. The capable ones arrive as a browser in a trench coat: hundreds of megabytes, a runtime to install, a plugin tree to maintain, a gigabyte of memory before you have opened anything. The small ones are viewers. Volt is one binary of about six megabytes that does the lot.

What it has

  • 119 languages highlighted, folded and outlined — the whole list
  • 219 character sets, 62 EBCDIC code pages, nine line endings
  • Editing together through iCloud Drive, with who changed what marked
  • Files on other machines, opened and saved over the ssh you already have
  • Language servers, linters and formatters, per language
  • Git change bars, blame, and a diff against any revision
  • Multiple cursors, Vim mode, block edit, split view, a minimap
  • Structural and regular-expression search and replace, project-wide
  • A hex editor, record fields, and compressed files opened as text
  • Five themes, a theme editor, and languages you can add yourself
  • Asked for, then built — the beta moves quickly and the waitlist sets the order

What it does not carry

  • No Electron, and no browser engine wrapped around a text box
  • No Java runtime to install before it will start
  • No node_modules, and no package manager behind it
  • No plugin system — a language or a theme is a file you drop in
  • No account, no sign-in, no licence server to reach
  • No telemetry: it does not phone home, ever
  • No third-party code at all — Swift and the system frameworks
  • No gigabyte of RAM to hold a file you only wanted one line of
  • No server of its own — sharing goes through your iCloud Drive, remote files through your ssh
  • No SSH library of its own — it drives the ssh macOS already ships
  • No crash reporter and no usage statistics sent anywhere

Six megabytes, one core, a few megabytes of memory — for a file of 4.23 GB. Lean is not a feature it lost; it is why it is quick. How that compares with BBEdit, Sublime Text, VS Code and Vim — including where Volt is the wrong choice.

00000A00

Legacy and mainframe

It opens what other editors will not

Most editors read one shape of file: UTF-8, LF, one line at a time. The files that actually arrive — from a mainframe, a Windows box in 1998, a word processor, a language model — are not always that shape. Volt reads them as they are and writes them back as they were.

EBCDIC · 62 code pages

Files off a mainframe

Fifty-eight national pages and four Japanese ones that mix single- and double-byte characters, every one read and written. A Western page is recognised from the language in it; Greek, Cyrillic, Arabic and Hebrew look like ordinary ASCII words, so those you pick.

RDW · fixed width

Files with no lines in them

IBM variable-length records with a four-byte descriptor, and 80- or 132-column punch-card records with nothing between them, become lines when they open. The padding goes back to the card it came from.

Fields

The columns a copybook defined

Give the widths the way a copybook writes them — 3 15 10 20 — and a hairline rules every boundary, or let Volt find them from the gaps. Name the fields, export them as CSV, and have the layout remembered for tomorrow night's extract.

Hex

The bytes themselves, and editable

A hex editor beside the text, not instead of it. Type hex digits and the bytes go in; select, paste, overwrite in place; and undo is the document's own, so a change made in the bytes comes back out with ⌘Z like any other.

gzip

Compressed files, as text

A .gz opens as the text inside it and saves as a .gz again. nginx.conf.gz is highlighted as an nginx configuration and a rotated access.log.1.gz as a log — no unpacking on the command line first.

Six-bit

Codes older than the byte

IBM 1401 BCD, CDC Display Code, UNIVAC Fieldata, DEC SIXBIT, GOST 10859 — sixteen six-bit codes from the tapes of the fifties and sixties — and MARC-8, which library catalogues still exchange records in.

9 line endings

NEL, LS, PS, VT, FF, LFCR

Beside LF, CRLF and CR. A file separated by U+2028 or by a bare CR has no 0x0A in it at all, and used to open as one line several megabytes long.

219 character sets

Detection that explains itself

UTF-8, 16 and 32, every ISO-8859 part, the Windows, DOS and classic Mac pages, Chinese, Japanese and Korean in every wrapping, and the corners — VISCII, KOI8-T, ARMSCII-8. The common ones are detected on opening and the status bar says which and why; the rest you pick, and picking one asks whether to re-read the bytes or convert on save.

Ctrl-Z end marker UTF-8 BOM Trojan Source detection Zero-width characters Homoglyphs Hex editor gzip NFC / NFD / NFKC / NFKD
00000000  56 6f 6c 74 20 6f 70 65  |Volt ope|00000008  6e 73 20 61 20 34 2e 32  |ns a 4.2|00000010  33 20 47 42 20 6c 6f 67  |3 GB log|00000018  20 69 6e 20 32 20 6d 73  | in 2 ms|00000020  2e 0a                    |..      |

Two guides go further: EBCDIC on macOS — the sixty-two code pages, why the file opens as one long line, and how to write it back — and mainframe files on a Mac, on RDW records, fixed-width extracts and COBOL copybooks.

00001400

Every day

The editor you have open all day

The big files are the proof, not the point. Everything you would leave your current editor for is here, and none of it asks for your attention until you want it.

119 languages

Highlighting, folding, outline

Swift, Rust, Go, Python and TypeScript; COBOL, RPG, JCL and ABAP; Terraform, Dockerfiles, GraphQL, nginx and crontabs; Mermaid, Typst and G-code. Templates are read as two languages at once — the whole list.

Search

Regex, project-wide, kept

Literal and regular expressions over a project or files larger than RAM; many replacements in one pass; only the lines that match; searches saved and on every Mac you own.

Structural search

Find code by its shape

print(:[what]) finds every call to print, whatever its arguments, and if (:[cond]) { :[body] } finds the whole statement. Brackets inside a string or a comment are not counted, and the replacement puts back what each hole caught.

Editing

Multiple cursors, block edit, splits

⌥-click and ⌥-drag, one undo step for a batch, rectangular selection, two panes on one document, twenty-seven text commands, and every one of them bindable.

Vim mode

For the hands that know it

Normal, Insert and Visual; counts, motions and text objects; registers, marks, macros and . to repeat. It edits through the same document as everything else, so undo is one history — and ⌘ still belongs to the menus.

Minimap

The shape of the code, beside it

One row for every line, never squashed into a grey smear. Bookmarks and search hits are marked down its edges, and pointing at a row names the function it is inside.

Logs

Read a log like a log

Recognised by its lines, not its name. Times, levels, IPs and exceptions coloured; errors marked down the scroller; a stack trace kept with the error that threw it; Show Only Errors, and Go to Time 14:03.

Quick Look

The space bar, in the Finder

Press it on a mainframe extract, an 8-bit note or a record file and see the text — with the character set, the line endings and the record format named in the heading — instead of the wall of question marks the system shows.

Projects

EditorConfig, Git, a project report

The project's own rules win over personal settings. Change bars, blame and a diff of any revision beside the file — and a report of every file's character set and line ending, filtered to the seven that are not like the others.

Tools

LSP, linters, formatters, scripts

A language-server client, per-language linter and formatter commands, and ⌥⌘R to run the script you are editing — with a formatter of its own when none is installed.

Fonts

Any font, and what it can do

Any typeface on the Mac, at any size and letter spacing, with the features the font carries — small capitals, old-style figures, alternates, the weight and width of a variable font.

Native

Swift, and nothing bundled with it

A macOS application written in Swift, with no third-party dependencies: no Java runtime to install, no Electron, no copy of a browser inside the download. One binary of about six megabytes, built for Apple silicon.

00001700

Nothing lost

Type it once. It is still there.

Quitting never asks. Closing a window never asks. Nothing you typed is written to the file until you save it, and nothing you typed is thrown away because you did something ordinary. The only way to lose text is to answer Don't Save — because that is somebody saying so.

Quitting

Come back to exactly what you left

A new file you have typed into and a file you have edited but not saved both come back as they were — the same window in front, the same tab selected. Quitting should not be a decision about your work, and a dialog asking whether to keep it is that decision in disguise.

Closing a window

The case that loses work everywhere else

A window closed with unsaved text in it took that text with it. Here it is set aside instead, and Recover Unsaved Documents lists what is waiting — for a week, or as long as you set.

Finding it again

A window that searches the text

They are nearly all called Untitled, so searching the names is useless. This searches what is in them, lists each match with the line it is on, and opens the preview at it. Beside every draft: which file it belongs to, when it was made, when it last changed, how big it is, and the first page of the text.

Size is not a reason

A big file is kept too

Work in a window that is still open is kept whatever its size and whatever the limits say. A limit is about a folder of old copies, never about the file being typed into. When the folder does have to shrink, the biggest drafts go first — losing one large draft is one loss, losing the hundred small ones it was worth is a hundred.

Changed underneath you

It notices, and says so

With nothing unsaved, a file changed on disk reloads by itself and keeps your caret and scroll position — a couple of milliseconds even at 4 GB. With unsaved changes it asks instead. And a draft written against a version of the file that no longer exists is marked as such, rather than quietly put back over somebody else's work.

If you want it

Save when you walk away

Switching to another window, tab or application can write the file. Off by default, because writing somebody's file when they clicked elsewhere is a surprise — and when it is on it still refuses the cases that would go wrong: a document that has never been saved, a locked file, one that belongs to somebody else.

00001800

Together, and elsewhere

Edit a file with someone. Edit a file on a server.

Share a file in iCloud Drive and whoever you invite edits the same text on their Mac, with their changes arriving in your window as they save. Or open a file on a machine across the network, from here, and have ⌘S write it back there.

Share

Invite someone into the file

File ▸ Share… on a file in iCloud Drive offers to edit it together. A file that is not in iCloud Drive yet is offered a move there first; one shared with you to read opens read only and still follows what its owner saves.

Merge

Their changes arrive; yours stay

What they save lands in the text on screen, your caret and selection stay by the same words, and the whole arrival is one step of Undo. Changes to different lines — or to different words of one line — are both kept.

Who changed it

Marked in the gutter, by name

Every line a merge brought in is marked down the gutter and the scroller, and resting the pointer on it says Changed by Anna at 10:42. The status bar says who has the file shared and who changed it last.

Never overwritten

A save never writes over something newer

A shared file saves itself a moment after you stop typing. If somebody saved since your window last agreed with the file, their change is merged in first — and when two Macs saved at once, every place the versions differ is marked for you.

Open Remote

user@host:/etc/nginx.conf

File ▸ Open Remote… lists the server's directories as you type, and ⌘S writes the file back. It uses the ssh already on your Mac, with your own keys and ~/.ssh/config; a password is asked for once, and can be kept in your keychain.

rmate

Or send it from the server

Already logged in somewhere? rmate config.yml opens the file here, and closing the window gives you your shell prompt back. The client ships with Volt — one small script, nothing to install on the server but that.

Safe to lose the line

A dropped connection loses nothing

A remote save either lands whole or leaves the file that was there — never half of the new one — and the file keeps its permissions. A remote window comes back tomorrow, with any unsaved work in it exactly as it was left.

Every Mac you own

Your searches, modes and snippets

Saved searches, language modes and snippets follow you through iCloud, each with a version and a date, so the regex you built on one Mac is waiting on the other.

00001900

Highlighting and themes

Colour that comes from a file you can edit

A hundred and nineteen languages, five themes in the box, and both of them plain text you can change. Pick one — the window below is drawn with the same colour values the editor ships.

Theme
Theme.swift Swift · UTF-8 · LF
// A theme is JSON. What you leave out is inherited. import Foundation struct Theme: Codable { let name: String let appearance: Appearance var syntax: [Token: Colour] = [:] @discardableResult func colour(for token: Token) -> Colour { syntax[token] ?? appearance.fallback(token) } } let paper = try Theme(named: "Paper") // 13 colours
The Midnight theme: near-black page, coral keywords, blue types, pale blue strings.
Midnight
The Paper theme: warm off-white page, dark red keywords, green strings, teal types.
Paper
The Coffee theme: warm dark brown page, amber types, sage green strings.
Coffee
The built-in Light theme: white page, purple keywords, red strings, blue types.
Light
The built-in Dark theme: near-black page, magenta keywords, blue types, green numbers.
Dark

Five themes ship: Light, Dark, Paper, Midnight and Coffee. The one you pick colours the whole window — title bar, gutter and sidebars, not only the text.

Themes

JSON, or a colour well

A theme is a .volttheme file: named colours in hex, and anything you leave out inherited from light or dark. Or open the theme editor, which lays the colour wells over a live editor showing real code, and save what you made.

Languages

Add one without waiting for a release

A language is a .voltmode file — keywords, comments, string delimiters, indentation, folding, outline. Drop one in a folder and it is there. Give it the id of a built-in language and it replaces it. No plugin system, no signing, nothing to install.

Rules of your own

Colour what matters in your files

A mode can carry regular expressions painted on top: an IP address in a log, the name in a name = value pair, TODO inside a comment. A rule can colour plain text or one named kind, so nothing can make a comment stop looking like a comment.

Two languages, one file

Templates lex as what they hold

ERB, EEx, EJS and PHP-in-HTML: the page is read as a page and each <% … %> island as the language inside it, over several lines if it runs that far. The outline of a template is the outline of the language inside it.

Knows what it is looking at

No extension, no problem

A script called deploy is what its #! line says. .zprofile is recognised by its whole name. .m is asked whether it is Objective-C or MATLAB. T-SQL and PostgreSQL are told apart, and CSV and TSV get a mode of their own.

Readable by everyone

Colour-blind palettes, and Increase Contrast

Light and Dark palettes built on the blue-against-orange axis, chosen by running candidates through deuteranopia, protanopia and tritanopia simulations — and the test suite fails the build if any pair stops being distinguishable. macOS's Increase Contrast is honoured the moment it is switched on.

00002300

A look inside

What it looks like when you are using it

Four of the places you will actually spend time. Nothing here is hidden behind a configuration file, and nothing needs one.

Volt's Appearance settings: interface language, theme, line numbers, line
wrapping, current-line highlight, indent guides and their strength, invisible
characters, Git changes, syntax highlighting, and the system's Increase Contrast
setting.
Appearance — and it follows the system's Increase Contrast setting.
Volt's Languages settings: all 119 languages in a filterable list on the left, and
the indentation, tab width, line wrapping, column guides, formatter and linter for
the selected one on the right.
Languages — all 119, each with its own indentation, formatter and linter.
Volt's Files settings: what to reopen on launch, how long unsaved drafts are kept
and how much room they may take together, trailing whitespace, and the final
newline.
Files — how long unsaved work is kept, and how much room it may have.
Volt's Keys settings: every command listed with its keyboard shortcut, searchable,
and each one re-bindable.
Keys — every command, and every one of them re-bindable.
Find and replace in Volt: the search field, a Replace field, a Find All button, a
results list showing seven matches with their line numbers, and orange marks down
the scroller showing where the rest are.
Find and replace — every match listed, and marked down the scroller.
Volt's Unsaved Documents window: a field that searches the text of the kept
drafts, a table of four documents with the file each belongs to, when it was
created, when it last changed and how big it is, a preview of the selected one,
and Delete, Recover All and Recover buttons.
Recover Unsaved Documents — the field searches what is in the drafts.
Volt with a 9.23 GB CSV export open. The status bar reads 30,305,788 lines,
9.23 GB, mapped, CSV / TSV, LF (Unix), UTF-8.
A 9.23 GB export of 30,305,788 lines, open — the status bar counts them because something asked.
Volt's command palette, filtered to the word line: Sort Lines, Join Lines, Go to
Line, Wrap Lines, New Line Below, Move Lines Up — each with its menu path and
keyboard shortcut. The footer reads 34 of 157 commands.
The command palette — all 157 commands, by name, with their shortcuts.
00001E00

Questions

Questions people ask first

How can it open a 4 GB file instantly?

Because past a certain size it does not read the file at all. Under that size — 64 MB by default, and it is a setting — the file is simply read, which is faster than being clever about it. Above it, opening looks at about a megabyte, enough to settle the character set and the line ending, and everything after that is worked out on demand: scrolling, jumping to a line, editing. That is why the memory used for a 4.23 GB file is a few megabytes rather than 4.23 GB. The status bar says which of the two happened — in memory or mapped.

What happens to my unsaved work if I quit or close the window?

Nothing. Quitting never asks and never loses anything: a new file you typed into and a file you edited but did not save both come back exactly as you left them, in the same window and the same tab. Closing a single window — the case that loses text in most editors — sets the work aside instead, and Recover Unsaved Documents lists what is waiting, searchable by what is written in it rather than by a name that is always Untitled. The only way to throw text away is to answer Don't Save.

Can two people edit the same file?

Yes, through iCloud Drive. Share a file from File ▸ Share… and the people you invite edit it on their own Macs. What each of you saves arrives in the others' windows as it is saved: the changes are merged into the text on screen, your caret stays where it was, and every line somebody else changed is marked with who changed it and when. A save never writes over something newer — if the file changed since your window last agreed with it, that change is merged in first.

Can I edit files on a server?

Yes, two ways. File ▸ Open Remote… opens user@host:/path over the ssh already on your Mac, with your own keys and ssh configuration, lists directories as you type, and writes the file back on ⌘S. Or, from a shell on the server, rmate opens the file in Volt on your Mac. Either way a dropped connection leaves the file as it was, never half-written, and its permissions are kept.

Which macOS versions does it need?

macOS 13 or later, built natively for Apple silicon.

Is it a viewer or can I edit those files?

Edit. An insertion or a deletion is recorded against the file rather than rewritten into it, so typing a character into a 20 GB file costs the same as typing into a small one. Saving makes a single pass, converting the character set and the line endings on the way through.

What happens to a file it cannot fully understand?

It says so instead of guessing. Detection reports which character set it chose and on what evidence; a file with bidirectional controls in it warns you when it opens; a Greek EBCDIC file is never guessed at, because those bytes are indistinguishable from ordinary ASCII words — you pick the page and it reads perfectly.

Can I change the colours, or add a language?

Both, and both are plain text. A theme is a .volttheme file of named colours; leave one out and it is inherited. A language is a .voltmode file — keywords, comments, strings, indentation, folding, outline — and one that takes a built-in language's id replaces it, which is how you add a keyword without waiting for a release. There is a theme editor too, with a live preview that is a real editor showing real code.

What is it built with, and how big is the download?

Swift and the system frameworks, with no third-party dependencies. There is no Java runtime to install, no Electron and no bundled browser engine — the whole application is one binary of about six megabytes, built for Apple silicon. That is most of why it starts instantly and leaves the fans alone.

Does it need anything installed to work?

No. Formatting, linting, language servers and Git each use an external tool when one is there and say plainly when it is not. A copy of Volt that may not start other programs at all still opens, edits, searches, highlights, folds, outlines and saves.

How much of it is tested?

Over 3,400 checks run on every build — reading, editing, encodings, search, saving, and the user interface down to whether a settings pane's controls line up. The suite is part of the binary: Volt --selftest.

When can I have it, and what will it cost?

It is in private beta now. Join the waitlist and you will be emailed when the next round of invitations goes out. Pricing is not settled; waitlist members hear about it first and are asked before it is.

00002800

Private beta

Join the beta

One email when invitations go out — then one question about what to build next. It takes about twenty seconds, and it is not a suggestion box: the beta moves quickly, and what people ask for is what gets built. Say what your editor will not open and it becomes the next thing that opens.