A distraction-free Markdown editor for macOS that lets you focus on writing.
- Live Preview — What you see is what you get. Markdown syntax is rendered inline as you type, just like Typora
- Clean Interface — Minimal UI that stays out of your way so you can focus on your words
- Syntax Highlighting — Subtle, readable highlighting for Markdown elements and code blocks (via Highlightr)
- Focus Mode — Dims everything except the current paragraph to keep you in the zone
- Typewriter Scrolling — Keeps the active line centered on screen for a comfortable writing posture
- Full Screen — Immersive full-screen writing with no distractions
- GFM Support — Headings, bold, italic, strikethrough, lists, task lists, tables, code blocks, blockquotes, horizontal rules, links, and images
- Image Support — Drag & drop or paste images directly into your document (auto-saved to
{filename}.assets/) - Export — Save as HTML or PDF
- Native macOS App — Built with Swift 6 and SwiftUI + AppKit (TextKit 2) for a fast, lightweight experience
- File Management — Open, edit, and save
.mdfiles with standard macOS file handling (auto-save, Versions) - Dark Mode — Full support for macOS light and dark appearances with override option
- Sidebar — Quick access to recently opened files
- Preferences — Customizable font, font size, line spacing, and appearance
- macOS 14 (Sonoma) or later
- Download the latest version from the Releases page
- Open the
.zipor.dmgand moveshoechoo.appto your Applications folder - Launch Shoe Choo
Note: This app is not notarized. On first launch, macOS will block it. To open it:
Option A (Terminal):
xattr -cr "/Applications/shoechoo.app"Then launch the app normally.
Option B (System Settings):
- Try to open
shoechoo.app(it will be blocked)- Open System Settings > Privacy & Security
- Scroll down to find the blocked app message and click Open Anyway
- Launch Shoe Choo — a new editor window opens
- Start writing in Markdown — formatting is rendered live as you type
- ⌘N — Create a new document
- ⌘O — Open an existing Markdown file
- ⌘S — Save the current document
- ⇧⌘F — Toggle focus mode
- ⇧⌘E — Export to HTML
| Shortcut | Action |
|---|---|
| ⌘N | New document |
| ⌘O | Open file |
| ⌘S | Save |
| ⇧⌘S | Save as |
| ⌘B | Bold |
| ⌘I | Italic |
| ⌘K | Insert link |
| ⇧⌘K | Inline code |
| ⌘1–6 | Set heading level |
| ⇧⌘F | Toggle focus mode |
| ⇧⌘T | Toggle typewriter scroll |
| ⇧⌘E | Export to HTML |
| ⇧⌥⌘E | Export to PDF |
| ⌃⌘F | Toggle full screen |
- macOS app
- iOS / iPadOS app
- iCloud sync across devices
| Layer | Technology |
|---|---|
| Language | Swift 6 (strict concurrency) |
| UI framework | SwiftUI (window/settings/toolbar) + AppKit NSTextView (text editing) |
| Markdown parsing | swift-markdown |
| Testing | Swift Testing (@Test, #expect, @Suite) |
| PDF generation | WebKit WKWebView.pdf(configuration:) |
| Persistence | ReferenceFileDocument (SwiftUI document model) |
| Minimum | macOS 14 Sonoma |
See ARCHITECTURE.md for full details. Core pipeline:
User Input → Coordinator.textDidChange()
→ EditorViewModel.sourceText update
→ MarkdownParser.parse() → EditorNodeModel.applyParseResult()
→ SyntaxHighlighter.apply() → NSTextStorage attributes
→ Focus Mode dimming (when enabled)
shoechoo/
├── App/ # ShoechooApp, MarkdownDocument
├── Models/ # EditorNode, EditorNodeModel, EditorViewModel, EditorSettings
├── Parser/ # MarkdownParser (swift-markdown AST → EditorNode)
├── Renderer/ # SyntaxHighlighter (EditorNode → NSTextStorage attributes)
├── Theme/ # EditorTheme, ThemePresets, ThemeRegistry
├── Editor/ # ShoechooTextView (NSTextView), WYSIWYGTextView (NSViewRepresentable)
├── Views/ # EditorView, SidebarView, OutlineView, PreferencesView
└── Services/ # ExportService, FileService, ImageService (all actors)
- Colors accessed via
EditorThemeprotocol — never hardcoded ThemeRegistrymanages active theme selection- 7 preset themes: GitHub, Newsprint, Night, Pixyll, Whitey, Solarized Dark/Light
Requires Xcode 16+ and XcodeGen.
git clone https://github.com/yoshidashingo/shoechoo.git
cd shoechoo
brew install xcodegen
xcodegen generate
xcodebuild -project shoechoo.xcodeproj -scheme shoechoo -configuration Release CODE_SIGN_IDENTITY="-" buildOr run xcodegen generate, then open shoechoo.xcodeproj in Xcode and build with ⌘B.
# Build
xcodebuild -scheme shoechoo -destination 'platform=macOS' build
# Test (Swift Testing framework — outputs ◇/✔/✘)
xcodebuild -scheme shoechoo -destination 'platform=macOS' test<type>: <description>
Types: feat, fix, refactor, docs, test, chore, perf, ci
- Design docs: specs and plans in
docs/ - Steering files: work-in-progress docs in
.steering/[YYYYMMDD]-[title]/