A lightweight macOS utility that converts Markdown ↔ Rich Text for seamless pasting into Microsoft Loop.
- Markdown → Loop — Converts clipboard Markdown to optimized HTML/RTF for pasting into Loop
- Loop → Markdown — Converts Loop's rich text back to clean Markdown
- Auto-detection — Automatically detects content type (Markdown vs HTML)
- One shortcut — ⌘⏎ does the right thing based on content
- Full Markdown support — Headings, bold/italic, lists, tables, code blocks, task lists, links, images, blockquotes
- Native macOS app — SwiftUI, lightweight, no Electron
Grab the latest release from the Releases page.
git clone https://github.com/trsdn/md2loop.git
cd md2loop
xcodegen generate
xcodebuild -project md2loop.xcodeproj -scheme md2loop -configuration Release buildThe macOS release flow builds and notarizes a Developer ID signed app, staples it before packaging,
then signs, notarizes, and staples the DMG. After those mutation steps it generates a basename-only
SHA-256 checksum, Gatekeeper-validates the DMG and its mounted app, and only then uploads assets for a
v* tag.
Required GitHub Actions secrets:
MACOS_CERTIFICATE— base64-encoded Developer ID Application.p12MACOS_CERTIFICATE_PWD— password for the.p12APPLE_ID— Apple ID used for notarizationAPPLE_TEAM_ID— Apple Developer Team IDAPPLE_APP_PASSWORD— app-specific password for notarization
Local release build:
./scripts/release_macos.shFor local signing and notarization, copy the example release environment and adjust it if needed:
cp .release.env.example .release.env
xcrun notarytool store-credentials md2loop \
--apple-id "your@email.com" \
--team-id "G69Z5BNY97" \
--password "app-specific-password"The local scripts load .release.env by default. Set RELEASE_ENV_FILE to use another file.
For unsigned local smoke builds only:
REQUIRE_SIGNING=0 ./scripts/build_release.sh- Copy Markdown text to your clipboard
- Open md2loop (or use ⌘⏎)
- The app detects the content and highlights the recommended conversion
- Choose Convert to Loop or Convert to Markdown; both buttons remain available when both clipboard representations exist
- Paste into Microsoft Loop (⌘V)
⌘⏎ runs the detected recommendation. Use either visible button to override detection.
- Uses apple/swift-markdown for Markdown → HTML via a custom
MarkupVisitoroptimized for Loop - Uses SwiftSoup for HTML → Markdown
- Sets the clipboard with HTML + RTF + plain text for maximum compatibility
- Loop-specific optimizations: minimal HTML, Unicode checkboxes for task lists (☑/☐), and safe code-language metadata
Remote Markdown images using http or https are emitted as escaped <img> elements. For an empty,
unsafe, relative, or unsupported image URL, md2loop emits an image element with escaped alt text but no
src; this deterministic fallback keeps image semantics without passing an unsafe URL to Loop.
macOS 14 (Sonoma) or later.
Contributions are welcome! See CONTRIBUTING.md for guidelines.
MIT — see LICENSE for details.



