How Nyxd works
Nyxd Editor is a fast, dark macOS text editor built around drafts. This page explains its two modes and walks through every feature in plain language.
Installing & first run
Drag Nyxd Editor to your Applications folder and open it. There is no setup, no account and no first-run wizard — it opens straight into a draft.
Why it sticks. macOS remembers whether a given menu-bar item is shown, and it remembers it per app, in your user preferences — not inside the app. So the choice survives quitting, updating, and even deleting and reinstalling Nyxd Editor. If the icon is missing, that setting is where it went; reinstalling will not bring it back, and toggling it on will.
The nyxd command
Nyxd Editor installs a small nyxd command so you can open things from a
terminal. Open a new terminal window after installing — a shell only picks up a new command when
it starts.
nyxd
Open the app.
nyxd notes.md
Open a file, by relative or absolute path.
nyxd ./src
Open a folder as a project, with the navigator on the left.
A name you half-remember
If the name is not a file in the current folder, Nyxd Editor looks it up in your Favourites, then your History — so nyxd prompt.md finds the file you were working on, wherever it lives.
Two modes
Nyxd Editor works in one of two modes. It picks the right one for you automatically based on what you open.
One clean page
You get a single page to write on. This is the normal mode for quick notes, snippets, and scratch code. Every draft feature below is on.
All draft tools — auto-save, naming, tags, and search — work here.
A full file tree
Open a folder — or drop one on the app — and Nyxd Editor shows the whole file tree in the right column so you can jump between files. Right-click any row for New File, New Folder, Rename, Duplicate, Move to Trash, Get Info (size, dates, permissions, owner, tags), or Reveal in Finder — full file management without leaving the app.
You enter project mode automatically. Here the draft features are turned off, because you are editing real files on disk — not scratch notes.
Draft features
Drafts are Nyxd Editor's heart. In draft mode the app saves, names, tags, and finds your notes for you — so you never have to think about files or folders.
Auto-save to drafts
Whatever you type saves itself to your drafts folder as you go. You never get asked to save, and you never lose work.
Smart naming
A new draft is named from its first line and given the right file ending for its language, all on its own.
Auto-tags & classify
The app reads each draft on your Mac and adds tags by itself, so your notes sort into groups without any effort.
Typo-proof search
Type a few rough, even misspelled words and Nyxd Editor still finds the right draft. The search runs fully offline.
Silent close
Close a draft and it is already saved to your folder. No "Save changes?" pop-up ever appears.
Paste & run
Paste a snippet and the app spots its language right away, names it, and saves it — ready to run in one click.
Title-bar rename
Rename a draft from the title bar and the file on disk follows. The title, Recents, and editor all update together.
⌘K — Search Drafts
If Nyxd Editor has one feature the whole app was really built to justify, this is it. Drafts have no folders to browse and no names you chose yourself — so finding one again had to work by feel, not by filing. This got more design and engineering time than anything else in the app.
Works from anywhere in the app
Press it, start typing — no menu, no click. A Spotlight-style panel drops in, ranks as you type, and Return jumps you straight into the result, cursor and all.
The story
A normal project has a file tree you organize by hand, so a fuzzy filename matcher is enough — you already half-remember the path. A draft has neither: it's an auto-named scratch note, one of maybe hundreds, and the thing you remember is never the filename. It's a stray keyword, a typo, half a phrase in the wrong order, or just the general idea of what the file was about. A plain substring filter fails at all four of those. So instead of one matching algorithm, ⌘K runs an ensemble — exact title, title-prefix, contains, token-prefix, subsequence compactness, preview-contains, and trigram similarity are each scored and summed, so one strong signal wins even when the others come up empty. A fourth layer of on-device semantic embeddings sits on top of that, gated so it only engages once the lexical signals already suggest relevance. All of it runs fully on-device, model-free where it can be — no network round-trip, which is also why it's instant.
Where it earns its keep
A stray keyword, not a filename
You remember the curl command had "Bearer token" in it somewhere — you never remember what you named the file. Type the phrase, not the name, and it still surfaces.
Typos don't break it
Type "kubernets" or "recieve" and the draft you're thinking of still comes up — exact spelling was never the requirement.
Half-remembered, wrong order
Type "parse json" for a file actually named json-parser.py — word order doesn't matter, only that the pieces are there.
Search the idea, not the words
Type "sort algorithm" and a draft titled quicksort.swift that never uses those two words together still surfaces — the semantic layer understands the concept, not just the letters.
Writing & editing
The tools you use while you type.
Editor grid
An optional graph-paper grid of square cells, colored to match your theme.
Reformat JSON & XML
Press Ctrl+Opt+F to unfold a squished, minified blob into clean, readable lines. One undo puts it back. JSON and XML are done in-process by Foundation and always work. Other languages used to be handed to prettier, clang-format or php-cs-fixer — the sandbox cannot launch them, so Nyxd Editor now tells you which tool the file would have needed instead of failing silently.
Clickable links
Any URL in your text gets underlined automatically. Cmd+click one and it opens in your browser — no need to select and copy it first.
Multi-cursor
⌘-click anywhere to drop an extra caret, or press ⇧⌘L to select every match of the current word at once (there's an "Add Next Match" command in the palette too). Then type — every caret edits at the same time.
Bracket-pair highlight
Put your caret next to any ( { [ or its matching ) } ] and the paired bracket flashes instantly — works in both directions, so it doesn't matter which side of the pair you land on.
Ligatures on by default
Coding fonts that ship ligatures (Fira Code, Cascadia Code, and friends) render them right away — ->, !=, and >= merge into their single-glyph arrows automatically, no setting to find and flip. Fonts without ligatures (SF Mono, JetBrains Mono) are unaffected.
Syntax highlighting
Fast, accurate color for 79 languages across 306 file extensions, built in with nothing to install — Swift, Python, Rust, Go, TypeScript, SQL, Terraform, and dozens more. It also recognizes dotfiles and no-extension files by name or shebang: .bashrc, .zshrc, Dockerfile, Makefile, Gemfile, nginx and SSH configs all light up correctly with no setup.
Minimap
A tiny scaled picture of the whole file sits on the right edge and keeps pace as you scroll. Click or drag anywhere on it to jump straight there. Run a find and every match lights up as a tick on the strip, the current one taller and brighter, so you can see where all your matches are before you even step through them. It also reads the file's shape — headings, MARK: comments, function and class declarations, even main/entry points — and labels them right on the map, Xcode-style, so you can spot the structure of a huge file at a glance.
Find & replace
We studied a lot of editors' find bars before building this one — VS Code's is the one that got out of the way the most, so that's the model we followed, then went further. One find bar, whether you press the toolbar search button or ⌘F. A live match count, regex support, matches lit up in the text and on the minimap, and replace that keeps your capital letters. Under the hood it's a byte-by-byte search over the buffer, not a string scan, so it stays fast no matter the file size. ⌘G and ⇧⌘G walk to the next and previous match. Find All opens a clickable list of every match with its line number — click to jump. This one feature got more polish than almost anything else in the app.
Markdown read mode
Open a Markdown file and a book icon appears in the toolbar. Press it — or ⌃⇧⌘R — to swap the raw text for a clean, comfy reading page: generous line height, a proper heading hierarchy, and a warm daylight paper page by default — even when the rest of the app is dark — because long-form prose reads best on light. The toolbar streamlines too: it drops the code and file controls and leads with just the three things that matter while reading — read mode, the theme colour toggle, and Pin on Top. It stays live as you edit — no separate preview to refresh. Press ⇧⌘F to cycle the reading font through three setups: Mixed (New York serif body, San Francisco sans headings — the default), all-Serif (New York throughout), and all-Sans (San Francisco throughout). Pair it with Pin on Top and you've got a clean, distraction-free page for reading documentation while you work — the page stays put above whatever else you're doing.
Open & inspect
Nyxd Editor opens far more than plain text. It no longer runs or unpacks it — see App Store & sandbox for why those three features were removed.
Open anything
Drag and drop any file at all. If there is text in it you get the text; if there isn't, you get the bytes. Nothing is refused, and nothing has to be installed first — a 6.98 GB database dump opens the same way a note does.
Paste a path, open the file
Paste or type a file path on the first line of any document — a fresh, empty one works fine — and press ⌥⌘O (File ▸ Open Path in First Line). Nyxd Editor opens that file. Copy a path out of Terminal, a log, a stack trace or a build error, drop it in, and you're there. Absolute paths and ~/ paths both work; ~ is expanded for you. Put a folder path there instead — /etc, ~/Projects/site — and it opens as a project, with that folder's tree in the sidebar. Only line 1 is read, so it's instant even on a huge file. If the line isn't a path to something that exists, Nyxd Editor just beeps and leaves your text alone. One sandbox caveat: typing a path is not the same as choosing a file, so if the app has never been granted access to that location, an open panel appears at the right folder instead — one keystroke more, and macOS remembers it afterwards.
Peek inside any binary
Open a database, image, or program and Nyxd Editor shows it as a hex and text dump, with its magic bytes and structure laid out.
Workspace & looks
How the app feels around your text.
Twelve dark themes
Twelve calm dark looks, and the whole window tints to the color of the theme you pick.
An empty window says hello
A new, untouched document isn't a blank rectangle — it carries a short greeting and the three keys worth knowing first: ⌘N for a draft, ⌘K to find anything you ever wrote, and ⌥⌘O to open the path on line 1. It is drawn, never typed in for you: it is not in the file, so it is never saved, never searched and never counted in the line and character totals. The first byte you type erases it.
Pin on top
Float a small editor above any other app — handy to paste a command, copy a value, or fix small things in a loop.
Menu-bar favorites
A menu-bar icon opens files fast — drop one onto it to open, pin your favorites, and browse recent files. Nyxd Editor starts with your Mac and stays in the menu bar, so the icon is always there to catch a drop — even with no window open. You can turn that off in Settings ▸ General, or from the icon's own menu.
Drop selected text → a new draft
Select text anywhere — a web page, Notes, Terminal, a PDF, an email — and drag it onto the menu-bar icon. It opens as a new document, already named from what you dropped and already coloured: drop a Python snippet and it lands as a .py file with syntax highlighting, drop Markdown and reading mode is one keystroke away. No new window to make first, no Save dialog, no filename to invent. It's the fastest path there is from "I want to keep this" to a real, findable file — and because it becomes a draft, ⌘K can find it again later by a stray keyword. Dropping a file still opens that file, so the two never collide.
Stays fluid on huge files
A 1 GB log opens in about 92 ms; a real 6.98 GB database dump takes 167 ms and holds about 30 MB of RAM — 0.004× its own size. The file is never fully loaded, just memory-mapped, so opening, scrolling, and searching stay fast no matter the size. How it works ↓
Jump back & forward
Ctrl+Cmd+Left and Ctrl+Cmd+Right retrace your steps through the file — every jump from Find, Find Results, or Go to Line is remembered, just like a browser's back button.
Lock a file
Toggle a file to read-only right from the app — it locks in Finder too, so it stays protected everywhere, not just here.
Copy path, reveal & share
Right-click the title bar for Copy Path, Copy Name, Reveal in Finder, or Share — the standard macOS share sheet (AirDrop, Messages, Mail, and anything else installed) for the file you're editing.
When something happens
Nyxd Editor has three ways of speaking to you, and which one it picks tells you how much it wants from you.
A banner, at the top
Only for a decision. The file changed on disk while you had unsaved edits, and one of the two versions is about to lose: Reload or Keep Mine. It stays until you answer, because there is no safe default to pick for you.
A pill, at the bottom
Something happened and there is nothing to choose. It shows for two seconds and leaves. Pills queue one at a time per window, and an identical message arriving while its twin is still up folds into it as ×2 rather than stacking up.
The status island, in the corner
Continuous state, not events — the language, the character and line counts, how long the last open took, the version, and the wall-clock time of your last save. Nothing here interrupts; it is there when you look for it.
What the pill will tell you
Saved
Every save says so, whether you pressed ⌘S or the app saved for you. The island keeps the time — Saved at 15:21:11 — after the pill has gone.
A save that failed
Shown in red, and worded as an error, not a chime. A failed save used to render in the same accent colour as a success — it doesn't any more, and a window whose save failed will not close itself out from under you.
The file was deleted
Deleted or renamed underneath you. The window marks itself dirty, because it is now holding the only copy of that text.
Read-only, and writable again
Permissions changed on disk while the file was open — both directions are announced, so you find out before ⌘S does.
Reloaded from disk
The file changed on disk and you had no unsaved edits, so there was nothing to decide — it just reloaded and said so.
Draft archived
A draft was filed away, named. Same for Save As and for Revert.
Accessibility
Nyxd Editor supports VoiceOver, Voice Control, Dark Interface, Sufficient Contrast, Differentiate Without Color and Reduced Motion. Everything below follows the system settings — there is nothing to turn on inside Nyxd Editor.
VoiceOver
Read the document line by line, move the insertion point, and hear the selection — including in the fast, streaming and huge-file views, which draw their own text. Line numbers spoken by VoiceOver match the numbers in the gutter.
Voice Control
Every control has a spoken name, so "click Timing", "click Navigator options" or "click Close Find Bar" all work. Buttons that were only clickable — the status island's timing segment, the ⌘K result rows — are now real, nameable controls rather than invisible click targets.
Sufficient contrast
Both built-in themes clear WCAG AA on every syntax colour, measured rather than assumed, and a test keeps them there. Turn on Increase Contrast in System Settings and every colour is pushed further from the background — along its own hue, so the theme still looks like itself — until it clears AAA.
Differentiate without colour
With that setting on, search matches gain an underline, and the current match a thicker one — so "this is a match" and "this is the one you're on" no longer depend on telling two shades of one colour apart.
Reduced motion
Honoured throughout: the find bar, the command palette, go-to-line, banners, the caret blink and the moon in the status island. Deliberate gestures keep a gentle cross-fade; motion you did not ask for — like the moon's one turn when a window opens — is skipped entirely, which is what the setting is for.
Dark interface
Twelve dark themes, and the window chrome follows the theme rather than only the system appearance — so a dark theme never leaves you with a bright title bar.
App Store & sandbox
On 31 July 2026 Nyxd Editor adopted Apple's App Sandbox so it could ship on the Mac App Store. This is the one page that tells you exactly what that cost, because it cost real features and you should not have to discover that yourself.
What was removed
The Runner
The ▶ button that ran your script with the right interpreter. Running a script means launching python3, node or bash — all outside the bundle.
Archive extraction
Unpacking a .zip, .app or any of the other containers that are really archives. It shelled out to the system's own tools.
Office extraction
Turning Word, Excel, PowerPoint and PDF into readable text and CSV. Same reason.
External reformatters
prettier, clang-format and php-cs-fixer. JSON and XML survived because Foundation does those in-process — see Reformat.
The font downloader
Fetching and installing coding fonts for you. JetBrains Mono still ships inside the app, and any font you install yourself works normally.
What changed instead of vanishing
Open Recent remembers permission, not just paths
A sandboxed app that stores a path has stored nothing usable — the path grants no access after a relaunch. Recent files are now security-scoped bookmarks, which carry the permission with them, so reopening still works across launches.
Open Path in First Line may ask
Building a URL from text you typed is not choosing a file, and the sandbox only grants access to files you chose. If the location was never granted, ⌥⌘O opens a panel at the right folder rather than failing.
Under the hood
Nyxd Editor's editor is built on CoreNG, a clean-room text engine written from scratch to replace the old forked core (TextKit + NSDocument). You're technical, so here's the honest, no-marketing version of why it exists and how it actually works.
Why we rewrote the core
The old core loaded a file into memory as one Swift String and handed it straight to NSTextStorage — no streaming, no viewport, no large-file mode. Above roughly 100 MB it simply froze: syntax highlighting stalled, layout blocked the main thread, and there was no way out short of force-quitting. Rather than patch TextKit, CoreNG is a ground-up rewrite with a written behavioral contract and a numbered set of hard performance gates (P1–P12) that every build must clear before it ships — measured end-to-end on a 1 GB test file, through the real viewport, not synthetic micro-benchmarks.
Ten modules, one job each
How a huge file stays fast
Opening a file just memory-maps it — nothing is read up front, and edits go through the same piece table, so inserting or deleting text never moves the rest of the file.
memchr bounded scan
Jump to the nearest checkpoint, then scan at most 2,048 lines directly on the mapped memory — the same primitive that gives grep its speed.
How search works
In-buffer find runs on raw UTF-8 bytes, not grapheme clusters — no Unicode segmentation overhead — streaming the mapped buffer in 4 MiB windows, so cost scales with matches found, not file size.
⌘K Draft Search is a different problem — a half-remembered name, not a path — so it runs an ensemble of signals instead of one algorithm, each scored and summed so a strong signal wins even when the others come up empty:
Keyboard shortcuts
Every built-in shortcut, grouped by what it does. All of these also live in the Command Palette (⌘P) if you'd rather search than memorize.
Essentials
Find & Multi-cursor
Lines & Code
Navigation
View & Appearance
Window & Misc
Mouse gestures worth knowing: ⌘-click empty text drops a multi-cursor caret; ⌘-click a link opens it; double-click inside a quoted string or bracket pair selects the whole enclosed content; ⌘ + scroll zooms the editor font.
FAQ
Questions we actually get asked.
Will the code go on GitHub?
Honest answer: no plan to. Not out of secrecy — the actual reasoning is that the case for "publish it publicly on GitHub" was built for a collaboration model that AI coding assistants have quietly made optional.
Open source's real value was never the license text — it was the protocol: a public repo plus Git let a stranger read your code, fix a bug, and hand the fix back as a pull request. That protocol needed the code to be public, because the collaborator was a person who had no other way in.
An AI agent doesn't need the code on GitHub to read it, understand it, extend it, or fix it — it needs access to the codebase, which it already has, locally, the same way this app's own development happens. The collaborator-onboarding problem that GitHub solved for humans is solved differently now. That's the whole argument — not that open source is wrong, just that its reason for existing has moved.