A markdown writing app for macOS, Windows, and Linux. The shapes loom before they take form.
Built with Tauri 2 + CodeMirror 6. ~12 MB binary, native system WebView, Rust backend.
Site: loomings.tiagojct.eu Try it in your browser: loomings.tiagojct.eu/app Downloads: Latest release Changelog: CHANGELOG.md
loomings.tiagojct.eu/app — runs entirely in the browser, nothing sent to a server. Chrome/Edge get real open/save via the File System Access API; other browsers fall back to a file picker for opening and a download for saving/exporting. See Web build below for hosting it yourself.
brew install --cask --no-quarantine tiagojct/loomings/loomingsThe --no-quarantine flag is required because the build is unsigned. Without it,
macOS Sequoia / Tahoe Gatekeeper will reject the app on first launch with
"Loomings.app is damaged". If you already installed without the flag, fix it with:
xattr -dr com.apple.quarantine /Applications/Loomings.app| Platform | File |
|---|---|
| macOS (Apple Silicon) | Loomings_<ver>_aarch64.dmg |
| Windows | Loomings_<ver>_x64-setup.exe or _x64_en-US.msi |
| Linux (Debian/Ubuntu) | Loomings_<ver>_amd64.deb |
| Linux (other) | Loomings_<ver>_amd64.AppImage |
| Linux (Fedora/RHEL) | Loomings-<ver>-1.x86_64.rpm |
Intel Macs: no pre-built Intel
.dmgis published — the free-tiermacos-13runner queue was consistently too long/unreliable for it to land with the rest of the release. Intel Mac users should build from source.
App is unsigned (no Apple Developer ID, $99/yr). macOS Sequoia/Tahoe blocks "right-click → Open" for unsigned apps. After moving Loomings.app to /Applications, strip the quarantine attribute:
xattr -dr com.apple.quarantine /Applications/Loomings.appApp opens normally after that. Alternative: open System Settings → Privacy & Security, attempt to launch, then click "Open Anyway".
- Real markdown syntax in the editor — bold reads bold, headings read as headings (H1/H2/H3/H4 sized), code reads code, links underline.
- Markdown shortcuts: ⌘B / ⌘I wrap, ⌘` code, ⌘K link.
- Smart list auto-continue:
-,*,+,1.,>extend on Enter; double-Enter exits. - Smart typography: straight quotes → curly,
--→ em-dash,...→ ellipsis. Toggle in View menu. - YAML frontmatter detection (
---\n…\n---at top is dimmed). - Native undo, IME, paste-as-plaintext, scroll, selection (CodeMirror 6).
- Outline palette (⌘P) — fuzzy-jump to any heading.
- Find/Replace (⌘F) — CodeMirror panel with regex, case, replace.
- Recent files menu (File → Open Recent).
- Cursor position (
Ln 5, Col 12) in statusbar.
- Focus mode (⌘⇧D) — dims everything outside the current sentence.
- Typewriter scrolling (View menu) — keeps the cursor line vertically centered.
- Preview (⌘⇧P) — full markdown-it rendering with sanitized URLs.
- Word goal (⌘⇧G) — set target, progress shows in statusbar.
- Reading time + selection word count in the stats bar (⌘⇧L).
- Column-width cycle (⌘⇧W) — wide / normal / narrow.
Three families, each with dark + light + system-follow (View → Theme):
- Pequod — navy below-deck dark / parchment light. The original.
- Glauca — Profundum dark / Pruina light, from the Glauca design system.
- Try-Works — Try-Fire dark / True Lamp light, from the Try-Works design system.
Cycle dark/light/system within the family with ⌘⇧T.
- Auto-save 2s after last edit, for named files. Atomic writes (temp + rename).
- Crash-recovery scratch buffer — last buffer restored on next launch.
- External file watcher — prompts reload if file changes on disk.
- Drag-and-drop a markdown file onto the window to open it.
- Export HTML (File menu) — standalone HTML styled with the current theme.
- About modal + populated macOS About panel (Help menu).
- Open Example (Help menu) — chapter 1 of Moby-Dick, the namesake of the app.
- Update check — banner appears if a newer release is published; links to GitHub. No auto-install (unsigned builds can't survive macOS quarantine).
Prerequisites: Xcode Command Line Tools (macOS) or build-essential (Linux) or Visual Studio Build Tools (Windows), Rust, Node 20+.
git clone https://github.com/tiagojct/loomings
cd loomings
npm install
npm run dev # dev with hot reload
npm run build # produces installer in src-tauri/target/release/bundle/Linux additionally needs:
sudo apt install libwebkit2gtk-4.1-dev libgtk-3-dev libayatana-appindicator3-dev librsvg2-dev patchelfFirst Rust compile: 3-5 min. Subsequent builds: seconds.
The web build (no Rust, no Tauri) is a static site: docs/ (landing page)
at the root, the app at /app. Build and preview locally:
npm install
npm run vite:build -- --base /app/ # matches the /app mount point
npm run vite:previewOr via Docker (matches what docker-publish.yml publishes to
ghcr.io/tiagojct/loomings):
docker build -t loomings .
docker run --rm -p 8081:80 loomingsdocker-compose.yml is the VPS deploy shape: a loopback-bound port for a
reverse proxy in front, plus a watchtower
sidecar that redeploys on new :latest image pushes (which only happen on
version-tagged releases, not every commit to main).
| Action | Shortcut |
|---|---|
| New | ⌘N |
| Open | ⌘O |
| Open Recent | File menu |
| Open Example (Moby-Dick chapter) | Help menu |
| Save / Save As | ⌘S / ⌘⇧S |
| Close Window / Quit | ⌘W / ⌘Q |
| Bold / Italic / Code / Link | ⌘B / ⌘I / ⌘` / ⌘K |
| Find | ⌘F |
| Jump to Heading | ⌘P |
| Focus Mode | ⌘⇧D |
| Preview | ⌘⇧P |
| Stats | ⌘⇧L |
| Cycle Column Width | ⌘⇧W |
| Cycle Theme | ⌘⇧T |
| Cycle Word Goal | ⌘⇧G |
| Font Size +/- | ⌘= / ⌘- |
| Fullscreen | F11 |
| DevTools | ⌘⌥I |
(⌘ = Cmd on macOS, Ctrl on Windows/Linux.)
loomings/
src/ # frontend (Vite + CodeMirror 6 + markdown-it)
editor.js # everything: editor, UI, event listeners
platform.js # picks the Tauri or web adapter at runtime
platform-tauri.js # native file I/O, menu, window (desktop build)
platform-web.js # File System Access API, IndexedDB (web build)
index.html
style.css
icon.png # served via Vite at runtime (About modal)
src-tauri/ # Rust backend (Tauri v2, desktop build only)
src/lib.rs # IPC commands, menu, file watcher, update check
capabilities/ # Tauri permission allowlist
icons/ # ICNS, ICO, sized PNGs
tauri.conf.json
Cargo.toml
examples/loomings.md # Moby-Dick chapter 1 (bundled as resource)
icons/ # Icon Composer .icon bundle + exports
scripts/ # icon build pipeline (Swift + sips)
docs/ # landing page, served at the site root
Dockerfile # web build: static site (docs/ + app at /app)
nginx.conf # served config for the Docker image
docker-compose.yml # VPS deploy (loopback port + watchtower)
.github/workflows/
release.yml # 3-platform desktop release automation
docker-publish.yml # web image build + push to ghcr.io
- Tauri 2 — Rust shell + system WebView (WKWebView / WebView2 / WebKitGTK). No bundled Chromium.
- Vite 5 — frontend bundler.
- CodeMirror 6 — editor with lezer markdown grammar + syntax highlighting + search + history.
- markdown-it 14 — preview renderer with linkify + typographer.
- notify (Rust) — external file watcher (desktop build only).
- ureq (Rust) — sync HTTP client for the update check (desktop build only).
- File System Access API — real open/save in the web build (Chromium; other browsers fall back to a file picker/download).
- nginx — serves the web build's static files + landing page.
MIT — see LICENSE.
Chapter 1 of Moby-Dick (bundled at examples/loomings.md) is public domain.
