Skip to content
MartzcodePublic

About

Cross-platform Markdown editor built with Tauri 2 (Rust) and Angular 22, a lightweight, fast alternative to browser-based editors. Custom per-platform UI with native window controls, read/edit/hybrid modes, PDF export, light & dark themes, and full i18n (FR, EN, DE, ES). Native, secure, and open source for Windows, macOS and Linux.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

Markify

Cross-platform Markdown editor built with Tauri 2 (Rust) and Angular.

Éditeur Markdown multiplateforme développé avec Tauri 2 (Rust) et Angular.

🇬🇧 English · 🇫🇷 Français

Markify is a desktop application for writing and reading Markdown documents, available on Windows, macOS and Linux. It combines a modern Angular frontend with a lightweight Rust backend, a custom interface, and full localization.

Markify est une application de bureau pour écrire et lire des documents Markdown, disponible sur Windows, macOS et Linux. Elle associe un frontend Angular moderne à un backend Rust léger, une interface personnalisée et une localisation complète.


English

Why this project stands out

  • Full-stack desktop development: Angular (TypeScript) frontend + Rust backend communicating through Tauri commands
  • UI/UX craft: custom title bar adapted per platform (native macOS traffic lights, custom window controls elsewhere), window dragging, dropdown menus with submenus
  • Internationalization: UI fully translated into 4 languages (French, English, German, Spanish), automatic detection of the system language, persisted choice, type-safe translations verified at compile time
  • Theming: light, dark and system themes selectable from the title bar, following the system preference in real time in auto mode, through a CSS design-token system
  • Software engineering practices: service architecture with Angular Signals, unit testing (332 tests, Vitest), Tauri capability permissions model

Features

  • Open & save Markdown files (.md, .markdown, .mdx) with native file dialogs
  • Export to PDF (File → Export, Ctrl/Cmd+E): full rendering with system fonts and embedded images, native save dialog
  • Three view modes: Read, Edit, and Hybrid (edit + live preview side by side)
  • Unsaved changes protection: a Save / Don't save / Cancel prompt before closing the window, creating a new file, switching documents or closing the current document
  • Close the current document (File → Close document, Ctrl/Cmd+W) without closing the window
  • Close the current folder (File → Close Folder, or the sidebar header button): asks for confirmation and closes the open document too
  • Save as / Save a copy (File → Save As…, Ctrl/Cmd+Shift+S) through the native dialog
  • Local images: relative paths are resolved against the document's folder and shown in the preview; paste from the clipboard, drag & drop, or Edit → Insert Image… copies the image into ./assets next to the document and inserts the Markdown link
  • Find & replace (Ctrl/Cmd+F, Ctrl/Cmd+H): occurrence counter, next/previous navigation, match case, whole word and regular expressions, with highlighting in both the editor and the preview; replace all is a single undo step
  • Syntax-highlighted code blocks in the preview and the PDF export (25 common languages, light and dark palettes), with optional line numbers (View → Code line numbers) and the existing copy button
  • Spellcheck: the WebView's native spellchecker is enabled by default and can be turned off via View → Check spelling; the language follows the system or can be set to French, English, German or Spanish, is remembered across sessions, and syntax highlighting stays intact
  • Hardened preview: Markdown output is sanitized with DOMPurify, raw HTML is disabled by default (View → Allow raw HTML) and stays sanitized when enabled, unsafe link schemes are neutralized, and a strict Content Security Policy replaces the previous null policy. Local images shown in the preview or embedded in a PDF must live inside the document's folder
  • Session restore: on startup, reopens the last file and folder, view mode, visible panels, expanded folders, scroll position and the window's size
  • Undo/Redo with grouped typing history, Cut/Copy/Paste via the native clipboard
  • 4 languages: Français, English, Deutsch, Español
  • Light & dark themes following the system
  • Single cycling theme button in the title bar, next to the window controls: its icon shows light, dark or system mode, and each click moves to the next one; the choice is remembered across sessions
  • Single cycling view-mode button next to the theme switch: its icon shows read, edit or hybrid mode, and each click moves to the next one
  • Save confirmation notifications (toast)
  • Custom title bar with menus, submenus and window controls — native traffic lights on macOS, custom controls on Windows/Linux
  • About dialog: real-time app version, clickable developer profile (opens in the system browser)

Tech stack

Layer Technology
Frontend Angular 22, TypeScript, Angular Signals, marked, highlight.js, DOMPurify
Desktop shell Tauri 2
Backend Rust — std::fs file I/O, Tauri commands
Plugins dialog, clipboard-manager, log, opener
Testing Vitest, @angular/build:unit-test

Architecture

Markify/
├── .github/                    # CI: automatic cross-platform releases (build-release.yml, build-msix.ps1)
├── CHANGELOG.md                # Version history (Keep a Changelog)
├── src/                        # Angular frontend
│   ├── app/
│   │   ├── components/
│   │   │   ├── title-bar/      # Custom title bar, menus, window controls
│   │   │   ├── editor-view/    # Markdown editor (read / edit / hybrid)
│   │   │   └── about-dialog/   # About dialog (automatic version, developer link)
│   │   ├── i18n/               # Translations (FR/EN/DE/ES) + i18n service
│   │   ├── services/           # Document, Theme, Toast, EditorRef services
│   │   └── utils/              # PDF export
│   └── test-setup.ts           # Tauri API mocks for unit tests
└── src-tauri/                  # Rust backend
    ├── src/lib.rs              # Tauri app, file I/O commands, plugins
    ├── capabilities/           # Permission model (windows, dialogs, clipboard…)
    └── tauri.macos.conf.json   # macOS-specific window configuration

The frontend and backend communicate through typed Tauri commands (read_markdown_file, write_markdown_file, read_system_fonts, read_image_base64, save_image, save_image_from_path, write_pdf_file) and official plugins, all gated by a declarative capabilities/permissions system.

Getting started

Prerequisites: Node.js ≥ 22, Rust, and the Tauri system dependencies (on Linux: webkit2gtk-4.1, GTK 3, libsoup-3.0).

npm install         # Install frontend dependencies
npm run tauri:dev   # Run the app in development mode
npm test            # Run the unit tests (Vitest)
npm run tauri:build # Build a production bundle (.deb, .AppImage, .msi, .msix, .dmg…)

Testing

332 unit tests (32 files) covering the document service (open/save/new, unsaved-changes guard, undo/redo, clipboard operations), the window close guard, the session service (restore, persistence, missing files), the explorer, the i18n service (all 4 languages, persistence), the theme service (light/dark/auto cycle, persistence), the title bar menus, the editor view, the search service and its matching/replacement utilities, the code block preferences, the spellcheck preferences, the Markdown renderer (syntax highlighting, escaping, PDF colours), local image paths and image saving, the HTML sanitizer and security preferences (raw HTML, link schemes, CSP-related rendering), the about dialog and the PDF export. Tauri APIs are mocked in src/test-setup.ts to run in isolation.

Releases

Pushing to main triggers a GitHub Actions workflow that computes the next version (YYYY.M.N), builds the full cross-platform matrix (Windows .msi/.exe, macOS .dmg, Linux .deb/.rpm) plus an MSIX package for the Microsoft Store, and publishes a GitHub release. Once released, a chore(release) commit aligns package.json, package-lock.json, src-tauri/tauri.conf.json (and its MSI/WiX version), src-tauri/Cargo.toml and src-tauri/Cargo.lock on the published version, so the working tree is never behind the latest release. Release notes link to the changelog; the full history lives in CHANGELOG.md.

License

AGPL-3.0


Français

Ce qui rend ce projet intéressant

  • Développement desktop full-stack : frontend Angular (TypeScript) + backend Rust communiquant via des commandes Tauri
  • Soin de l'UI/UX : barre de titre personnalisée adaptée à chaque plateforme (traffic lights natifs sur macOS, contrôles de fenêtre personnalisés ailleurs), gestion du drag de la fenêtre, menus déroulants avec sous-menus
  • Internationalisation : interface entièrement traduite en 4 langues (français, anglais, allemand, espagnol), détection automatique de la langue du système, choix mémorisé, traductions typées vérifiées à la compilation
  • Thème clair/sombre/système : sélecteur à trois états dans la barre de titre, suivi du système en temps réel en mode auto, via un système de design tokens CSS
  • Pratiques d'ingénierie : architecture en services avec les Signals d'Angular, tests unitaires (332 tests, Vitest), modèle de permissions de Tauri

Fonctionnalités

  • Ouvrir & enregistrer des fichiers Markdown (.md, .markdown, .mdx) avec les boîtes de dialogue natives
  • Exporter en PDF (Fichier → Exporter, Ctrl/Cmd+E) : rendu complet avec polices système et images intégrées, dialogue d'enregistrement natif
  • Trois modes de vue : Lecture, Édition et Hybride (édition + aperçu en direct côte à côte)
  • Protection des modifications non enregistrées : dialogue Enregistrer / Ne pas enregistrer / Annuler avant la fermeture de la fenêtre, la création d'un fichier, le changement de document ou la fermeture du document courant
  • Fermer le document courant (Fichier → Fermer le document, Ctrl/Cmd+W) sans fermer la fenêtre
  • Fermer le dossier courant (Fichier → Fermer le dossier, ou bouton dans l'en-tête de l'explorateur) : demande confirmation et ferme aussi le document ouvert
  • Enregistrer sous / Enregistrer une copie (Fichier → Enregistrer sous…, Ctrl/Cmd+Shift+S) via le dialogue natif
  • Images locales : les chemins relatifs sont résolus par rapport au dossier du document et affichés dans l'aperçu ; le collage depuis le presse-papiers, le glisser-déposer ou Édition → Insérer une image… copient l'image dans ./assets à côté du document et insèrent le lien Markdown
  • Rechercher / remplacer (Ctrl/Cmd+F, Ctrl/Cmd+H) : compteur d'occurrences, navigation précédent/suivant, respect de la casse, mot entier et expressions régulières, avec surlignage dans l'éditeur et l'aperçu ; « Remplacer tout » ne fait qu'une seule étape d'annulation
  • Blocs de code colorés dans l'aperçu et l'export PDF (25 langages courants, palettes claire et sombre), avec numéros de ligne optionnels (Affichage → Numéros de ligne du code) et le bouton « Copier » existant
  • Correcteur orthographique : le correcteur natif de la WebView est activé par défaut et se désactive via Affichage → Vérifier l’orthographe ; la langue suit le système ou peut être fixée au français, à l’anglais, à l’allemand ou à l’espagnol, le choix est mémorisé et le surlignage syntaxique reste intact
  • Aperçu sécurisé : le rendu Markdown est assaini avec DOMPurify, le HTML brut est désactivé par défaut (Affichage → Autoriser le HTML brut) et reste assaini lorsqu'il est activé, les schémas de liens dangereux sont neutralisés, et une CSP stricte remplace l'ancienne politique null. Les images locales affichées dans l'aperçu ou intégrées à un PDF doivent se trouver dans le dossier du document
  • Restauration de session : au démarrage, réouverture du dernier fichier et dossier, du mode de vue, des panneaux visibles, des dossiers dépliés, de la position de défilement et de la taille de la fenêtre
  • Annuler/Rétablir avec historique de frappe groupé, Couper/Copier/Coller via le presse-papiers natif
  • 4 langues : Français, English, Deutsch, Español
  • Thèmes clair & sombre suivant le système
  • Bouton de thème unique et cyclique dans la barre de titre, à côté des contrôles de fenêtre : son icône indique le mode clair, sombre ou système, et chaque clic passe au suivant ; le choix est mémorisé entre les sessions
  • Bouton de mode de vue unique et cyclique à côté du bouton de thème : son icône indique le mode lecture, édition ou hybride, et chaque clic passe au suivant
  • Notifications de sauvegarde (toast)
  • Barre de titre personnalisée avec menus, sous-menus et contrôles de fenêtre — traffic lights natifs sur macOS, contrôles personnalisés sur Windows/Linux
  • Boîte À propos : version de l'application en temps réel, profil de l'éditeur cliquable (ouvert dans le navigateur système)

Technologies utilisées

Couche Technologie
Frontend Angular 22, TypeScript, Angular Signals, marked
Coquille desktop Tauri 2
Backend Rust — entrées/sorties fichiers std::fs, commandes Tauri
Plugins dialog, clipboard-manager, log, opener
Tests Vitest, @angular/build:unit-test

Architecture

Markify/
├── .github/                    # CI : releases multiplateformes automatiques (build-release.yml, build-msix.ps1)
├── CHANGELOG.md                # Historique des versions (Keep a Changelog)
├── src/                        # Frontend Angular
│   ├── app/
│   │   ├── components/
│   │   │   ├── title-bar/      # Barre de titre, menus, contrôles de fenêtre
│   │   │   ├── editor-view/    # Éditeur Markdown (lecture / édition / hybride)
│   │   │   └── about-dialog/   # Boîte À propos (version automatique, lien éditeur)
│   │   ├── i18n/               # Traductions (FR/EN/DE/ES) + service i18n
│   │   ├── services/           # Services Document, Theme, Toast, EditorRef
│   │   └── utils/              # Export PDF
│   └── test-setup.ts           # Mocks des API Tauri pour les tests unitaires
└── src-tauri/                  # Backend Rust
    ├── src/lib.rs              # Application Tauri, commandes fichiers, plugins
    ├── capabilities/           # Modèle de permissions (fenêtres, dialogs, presse-papiers…)
    └── tauri.macos.conf.json   # Configuration fenêtre spécifique à macOS

Le frontend et le backend communiquent via des commandes Tauri typées (read_markdown_file, write_markdown_file, read_system_fonts, read_image_base64, save_image, save_image_from_path, write_pdf_file) et des plugins officiels, tous encadrés par un système déclaratif de capacités/permissions.

Démarrage rapide

Prérequis : Node.js ≥ 22, Rust, et les dépendances système de Tauri (sur Linux : webkit2gtk-4.1, GTK 3, libsoup-3.0).

npm install         # Installer les dépendances frontend
npm run tauri:dev   # Lancer l'application en mode développement
npm test            # Lancer les tests unitaires (Vitest)
npm run tauri:build # Générer un paquet de production (.deb, .AppImage, .msi, .msix, .dmg…)

Tests

332 tests unitaires (32 fichiers) couvrant le service document (ouvrir/enregistrer/créer, garde des modifications, annuler/rétablir, opérations presse-papiers), le garde-fou de fermeture de fenêtre, le service de session (restauration, persistance, fichiers disparus), l'explorateur, le service i18n (les 4 langues, persistance), le service de thème (cycle clair/sombre/auto, persistance), les menus de la barre de titre, la vue éditeur, le service de recherche et ses utilitaires de correspondance/remplacement, les préférences des blocs de code, celles du correcteur orthographique, le moteur de rendu Markdown (coloration, échappement, couleurs PDF), les chemins et l'enregistrement des images locales, l'assainisseur HTML et les préférences de sécurité (HTML brut, schémas de liens, rendu lié à la CSP), la boîte À propos et l'export PDF. Les API Tauri sont mockées dans src/test-setup.ts pour fonctionner en isolation.

Releases

Pousser sur main déclenche un workflow GitHub Actions qui calcule la version suivante (YYYY.M.N), construit la matrice multiplateforme complète (.msi/.exe Windows, .dmg macOS, .deb/.rpm Linux) plus un paquet MSIX pour le Microsoft Store, et publie une release GitHub. Une fois la release publiée, un commit chore(release) aligne package.json, package-lock.json, src-tauri/tauri.conf.json (et sa version MSI/WiX), src-tauri/Cargo.toml et src-tauri/Cargo.lock sur la version publiée : l'arbre de travail n'est jamais en retard sur la dernière release. Les notes de release renvoient vers le changelog ; l'historique complet est dans CHANGELOG.md.

Licence

AGPL-3.0

About

Cross-platform Markdown editor built with Tauri 2 (Rust) and Angular 22, a lightweight, fast alternative to browser-based editors. Custom per-platform UI with native window controls, read/edit/hybrid modes, PDF export, light & dark themes, and full i18n (FR, EN, DE, ES). Native, secure, and open source for Windows, macOS and Linux.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages