Skip to content

About

NeatEditor is a minimal, fast-launching macOS plain text editor built with SwiftUI and AppKit, designed for distraction-free writing, native desktop interactions, and efficient multi-tab editing.

Topics

Resources

Contributing

Stars

1 star

Watchers

1 watching

Forks

Latest commit

 

History

347 Commits

Folders and files

Repository files navigation

NeatEditor

NeatEditor app icon

Platform Swift UI Project License

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

Screenshot

NeatEditor screenshot showing the main writing workspace on macOS

Why NeatEditor

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.

Highlights

  • 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 ~/Documents folder 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.

Main Shortcuts

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.

Current Status

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

Quick Start

Install (macOS)

  1. 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 with SHA256SUMS.txt when provided.
  2. Open the DMG and drag NeatEditor.app to Applications.
  3. First launch:
open -a NeatEditor

The app opens with a ready-to-use document; press Command + N for a new one.

Supported Platforms

  • 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.

Requirements (Building From Source)

  • macOS 26.0+
  • Xcode 26.0+
  • XcodeGen 2.44+

Clone And Open

git clone <repo-url>
cd NeatEditor
xcodegen generate
open NeatEditor.xcodeproj

Build From Terminal

xcodebuild -project "NeatEditor.xcodeproj" \
  -scheme "NeatEditor" \
  -configuration Debug \
  -destination 'platform=macOS' \
  -derivedDataPath build/DerivedData \
  build

Development Notes

  • project.yml is the source of truth for the project structure.
  • Run xcodegen generate after adding or removing source files.
  • NeatEditorTests covers 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.

Releases

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 the CHANGELOG.md entry 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.

Project Structure

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

Repository Docs

Known Gaps

  • Add a general CI workflow for pushes and pull requests (today only the tag validation workflow exists).

Contributing

Issues, suggestions, and pull requests are welcome. Please read CONTRIBUTING.md first.

License

NeatEditor is released under the MIT License.

About

NeatEditor is a minimal, fast-launching macOS plain text editor built with SwiftUI and AppKit, designed for distraction-free writing, native desktop interactions, and efficient multi-tab editing.

Topics

Resources

Contributing

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages