A minimal, fast-launching macOS plain text editor built with SwiftUI and AppKit for distraction-free writing, native desktop interactions, and efficient multi-tab editing.
Languages: English | Simplified Chinese | Japanese | Korean | Spanish | French | German
NeatEditor is built around a simple goal: reduce interface noise and keep your attention on the text.
- Fast launch: avoid unnecessary blocking work on the app startup path.
- Space-first UI: keep the editor surface front and center instead of surrounding it with chrome.
- Native macOS behavior: preserve familiar title bar, menus, shortcuts, and window interactions.
- Plain-text focus: ideal for notes, drafts, scratch writing, and lightweight editing.
- Multi-tab plain text editing with a ready-to-use document on launch.
- Low-latency tab selection, closing, and in-place renaming.
- Open local text files through Finder, drag and drop, or pasted file URLs.
- Built-in line numbers, native find, undo, IME composition handling, and
Command +/-zooming. - Debounced autosave plus save-on-tab-switch and save-on-app-deactivation behavior.
- Pin-to-top window support and native title bar double-click zoom behavior.
- Disk-backed rename behavior that preserves editable file extensions.
- Blank content never overwrites existing files by design.
- App-created documents live in your
~/Documentsfolder by default; switch folders in Settings → Editor → Documents Folder. New documents save to the current folder, and documents left in the older app library are copied over on first launch.
| Shortcut | Action |
|---|---|
Command + N |
Create a new document. |
Command + T |
Open another new tab. |
Command + O |
Open one or more local text files. |
Command + S |
Save the current tab immediately. |
Command + W |
Save and close the current tab. |
Shift + Command + T |
Reopen the most recently closed tab. |
Command + F |
Show the inline find bar for the current editor. |
Command + = or Command + + |
Zoom in the editor text. |
Command + - |
Zoom out the editor text. |
Command + , |
Open Settings. |
Shift + Return |
Insert a new line at the end of the current line. |
Standard macOS text shortcuts such as Command + Z, Command + X, Command + C, and Command + V also work through the native text system.
NeatEditor is ready to use as a lightweight macOS plain text editor.
- Platform target: macOS 26.0+
- Stack: Swift 6, SwiftUI, AppKit bridge, Observation, XcodeGen
- Validation today:
xcodebuild ... test(unit tests covering editor text sync, document persistence, autosave scheduling, workspace failure paths, native composition commits, and font preferences), build verification, and manual testing - Distribution today: Developer ID-signed + notarized DMG built locally via
scripts/publish-release.sh(see RELEASING.md) - Scope today: plain text workflow, no rich text, plugins, or cross-platform support
- Open GitHub Releases and pick a Release whose notes state Developer ID-signed + notarized. Only signed artifacts are an install path: older
*-macOS-universal.*assets (for example on v1.0.3) are unsigned CI placeholders — do not install those. Verify withSHA256SUMS.txtwhen provided. - Open the DMG and drag
NeatEditor.apptoApplications. - First launch:
open -a NeatEditorThe app opens with a ready-to-use document; press Command + N for a new one.
- Supported: macOS 26.0+ (Apple silicon and Intel, universal build).
- Not supported: Linux and Windows. The app depends on AppKit and macOS-only code signing/notarization, so it neither builds nor runs there and no packages are provided.
- macOS 26.0+
- Xcode 26.0+
- XcodeGen 2.44+
git clone <repo-url>
cd NeatEditor
xcodegen generate
open NeatEditor.xcodeprojxcodebuild -project "NeatEditor.xcodeproj" \
-scheme "NeatEditor" \
-configuration Debug \
-destination 'platform=macOS' \
-derivedDataPath build/DerivedData \
buildproject.ymlis the source of truth for the project structure.- Run
xcodegen generateafter adding or removing source files. NeatEditorTestscovers editor text sync, document persistence, autosave scheduling, workspace failure paths, native composition commits, and font preferences. Manual editing scenarios live in docs/editing-text-sync-test-cases.md. Run them with:
xcodebuild -project "NeatEditor.xcodeproj" \
-scheme "NeatEditor" \
-configuration Debug \
-destination 'platform=macOS' \
test- For behavior changes, prefer validating with the built app rather than relying on previews alone.
Public installs come from the signed local release route, not from CI:
- The maintainer builds the DMG + Sparkle ZIP on the signing Mac with
scripts/publish-release.sh(Developer ID-signed, notarized, stapled; published from a draft only after all three files upload and read back). - Each signed public Release holds the signed DMG (first install), the signed Sparkle update ZIP (in-app updates), and
SHA256SUMS.txt, with bilingual notes taken from theCHANGELOG.mdentry for the version. - The tag-triggered GitHub Actions workflow only builds and validates the tagged source and keeps unsigned packages as login-required workflow artifacts (any signed-in person with access can download them); never install those as a release.
The full route, requirements, and coordinator handoff are documented in RELEASING.md. No delivery in this checkout is claimed as verified beyond what the Release notes and checksums state.
NeatEditor/
├── docs/
│ └── images/
│ └── neateditor-main-window.png
├── project.yml
├── README.md
├── CONTRIBUTING.md
├── CHANGELOG.md
└── Sources/
└── NeatEditor/
├── App/ # App entry point, commands, and external file opening
├── Features/
│ ├── Editor/ # AppKit bridge editor, line numbers, and zoom
│ └── Workspace/ # Tab strip, workspace state, and main UI
├── Services/ # Autosave and document persistence
├── SharedUI/ # Shared styling and title bar helper views
├── Resources/ # Localization resources
└── Assets.xcassets # Image assets
- README.ja.md: Japanese overview
- README.ko.md: Korean overview
- README.es.md: Spanish overview
- README.fr.md: French overview
- README.de.md: German overview
- README.zh-CN.md: Simplified Chinese overview
- CONTRIBUTING.md: development environment and contribution notes
- CHANGELOG.md: project release history
- RELEASING.md: tag-driven GitHub Release workflow
- TabStripGestures.md: design notes for tab click and rename interactions
- Add a general CI workflow for pushes and pull requests (today only the tag validation workflow exists).
Issues, suggestions, and pull requests are welcome. Please read CONTRIBUTING.md first.
NeatEditor is released under the MIT License.
