- TypeScript 65.8%
- Vue 27.1%
- Rust 5.8%
- JavaScript 0.9%
- CSS 0.3%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
Tauri routes menu events through one app-global map keyed by the item id string, registered at item creation — not at setAsAppMenu. With every window building its menu under identical ids, the last window to build silently owned every id app-wide: Cmd+S (and all menu items) fired in that window instead of the focused one, or nowhere once it closed, until a menu rebuild happened to re-register the handlers. Suffix every action-carrying item id with the window label so each window's handlers live on distinct keys and events always route to the window whose menu is installed. |
||
| .github/workflows | ||
| screenshots | ||
| scripts | ||
| src | ||
| src-tauri | ||
| .gitignore | ||
| bun.lock | ||
| eslint.config.js | ||
| index.html | ||
| LICENSE.txt | ||
| package.json | ||
| README.md | ||
| tsconfig.json | ||
| vite.config.js | ||
| vitest.config.ts | ||
Texodus
Texodus is a modern, fast, and beautiful Markdown editor built with Tauri 2 and Vue 3. Designed for performance and a premium user experience, it combines the power of Rust with the flexibility of modern web technologies to provide a native-feeling desktop writing environment with robust support for the GitHub Flavored Markdown (GFM) standard.
📥 Installation
Download the latest release from the releases page. It's available for macOS, Windows, and Linux. You can also build it from source.
✨ Features
- CodeMirror 6 Editor: Modern editing experience with markdown syntax highlighting, smart indentation, and large-document performance.
- Live Markdown Preview: Real-time, debounced rendering with full GitHub Flavored Markdown (GFM) support — tables, strikethrough, autolinks, and interactive task list checkboxes you can toggle directly in the preview.
- Mermaid Diagrams: Render flowcharts, sequence diagrams, and other Mermaid graph types inline in the preview, themed to match the active color scheme.
- Local Images: Embed images with relative (
) or absolute filesystem paths — resolved against the open document's directory via Tauri's asset protocol. - Export: Save the current document as standalone HTML or PDF.
- Workspace Sidebar: Open a folder to browse its Markdown files in a lazy-loaded tree, with a context menu to create, rename, delete, and reveal files. Clicking a file opens it in the current window;
Cmd/Ctrl+Click(or the context menu) opens it in a new window. - Quick Open: A
Cmd/Ctrl+Ppalette to fuzzy-find and jump to any file in the workspace. - Document Search: A full-width find bar (
Cmd/Ctrl+F) with live match counts and case-sensitive, whole-word, and regular-expression toggles — works in both the editor and the live preview, with a configurable highlight color. - Multi-Document & Multi-Window: Open multiple documents in a new tabbed interface or separate native windows. A file that is already open elsewhere gets its window focused instead of being opened twice.
- Auto-Reload: Files are automatically reloaded when they are changed on disk by external programs.
- Settings Mode: A dedicated settings mode for easier configuration.
- Dynamic Layouts: Switch between Split View, Focus Mode (editor only), and Preview Only modes.
- 10 Color Schemes: Default, Solarized, Nord, Monokai, Dracula, GitHub, Catppuccin, Gruvbox, Everforest, and Matrix — each with light and dark variants.
- Document Statistics: Live word / character / line counts and reading-time estimates.
- Custom Typography: Curated editor and preview fonts (JetBrains Mono, Iosevka, Inter, Roboto, Merriweather, …), all bundled locally — no network fonts.
- Native Integration:
- Full system menu support with keyboard accelerators.
- Open Recent submenu in the File menu.
- Drag-and-drop file support.
- Window state persistence (remembers size, position, and maximized state).
- Unsaved changes protection.
- Secure & Fast: Built on Tauri 2 with a strict CSP and a local-first philosophy — no telemetry, no cloud.
📸 Gallery
Preview Only Mode (dark theme)
Split View Mode
🛠️ Tech Stack
- Core: Tauri 2 (Rust)
- Frontend: Vue 3 (Composition API) + Vite
- Editor: CodeMirror 6
- State: Pinia
- Markdown: marked.js compliant with the GitHub Flavored Markdown (GFM) specification, with DOMPurify for sanitization.
- Diagrams: Mermaid
- Syntax Highlighting: Prism.js (preview code blocks)
- Styling: Vanilla CSS (no frameworks) with CSS variables for theming.
- Package Manager: Bun (recommended)
🚀 Getting Started (for Developers)
Prerequisites
- Rust installed.
- Bun (preferred) or Node.js.
- System-specific dependencies for Tauri (see Tauri Prerequisites).
Installation
-
Clone the repository:
git clone https://github.com/w512/texodus.git cd texodus -
Install dependencies:
bun install -
Run the development server:
bun run tauri dev
📦 Building
To create a production-ready installer for your current platform:
bun run tauri build
Linux builds produce .deb, .AppImage, and .rpm packages; macOS produces .dmg and .app; Windows produces an NSIS installer.
Note (Linux/AppImage): the release pipeline strips the bundled Wayland/DRM client libraries (
libwayland-*,libgbm,libdrm*) from the AppImage after packaging so they resolve from the host — otherwise WebKitGTK's EGL init fails on recent Mesa (see the repack step inrelease.yml). A locally built AppImage does not get this treatment; if it aborts withEGL_BAD_PARAMETER, remove those libraries from the AppImage the same way.
🏗️ Project Structure
src/: Vue.js frontend source code.assets/: App icons and static assets.components/: Reusable Vue components.composables/: Shared logic (CodeMirror, native menus, formatting, scroll sync).services/: Core application services (file I/O, export, Mermaid, sanitization).stores/: Pinia state management (editor, settings, workspace).themes/: Color scheme definitions and Prism stylesheet.utils/: Path helpers and other small utilities.
src-tauri/: Rust backend and Tauri configuration.screenshots/: Application screenshots for documentation.
📄 License
This project is licensed under the GNU General Public License v3 - see the LICENSE file for details.


