A local-first Markdown note-taking app for macOS & Linux.
Built with Tauri + React. No cloud lock-in. Your notes, your machine.
- Installation
- Features
- Keyboard Shortcuts
- Architecture
- Tech Stack
- Development
- Testing
- Building
- Contributing
- License
- Go to Releases
- Download the
.dmgfor your architecture:- Apple Silicon (M1/M2/M3/M4):
Ragnar.Notes_*_aarch64.dmg - Intel:
Ragnar.Notes_*_x64.dmg
- Apple Silicon (M1/M2/M3/M4):
- Open the DMG and drag Ragnar Notes into Applications
- Launch from Applications
Gatekeeper warning: Right-click the app β "Open", or run:
xattr -cr /Applications/Ragnar\ Notes.app
- Go to Releases
- Choose your preferred format:
Debian / Ubuntu (.deb):
sudo dpkg -i ragnar-notes_*.deb
sudo apt-get install -f # resolve dependencies if neededAppImage (universal):
chmod +x Ragnar_Notes_*.AppImage
./Ragnar_Notes_*.AppImageLinux dependencies: The
.debpackage declares its dependencies automatically. For AppImage or building from source, ensure you have:libwebkit2gtk-4.0-37,libgtk-3-0,libayatana-appindicator3-1
macOS β Requires macOS 12+, Node.js 18+, Rust stable, and Xcode CLI tools.
git clone https://github.com/VidhyadharanSS/RagnarNotes.git
cd RagnarNotes
npm install
npm run tauri buildLinux β Requires Node.js 18+, Rust stable, and system libraries.
# Install system dependencies (Debian/Ubuntu)
sudo apt-get update
sudo apt-get install -y \
libwebkit2gtk-4.0-dev \
libgtk-3-dev \
libayatana-appindicator3-dev \
librsvg2-dev \
patchelf
# Clone and build
git clone https://github.com/VidhyadharanSS/RagnarNotes.git
cd RagnarNotes
npm install
npm run tauri buildBuild outputs:
| Platform | Location |
|---|---|
| macOS | src-tauri/target/release/bundle/dmg/*.dmg |
| Linux .deb | src-tauri/target/release/bundle/deb/*.deb |
| Linux AppImage | src-tauri/target/release/bundle/appimage/*.AppImage |
- Full GitHub Flavored Markdown β tables, task lists, footnotes, callouts
- Syntax highlighting for 150+ languages via highlight.js
- Split view β Edit + Preview side-by-side with synchronized scrolling
- Zen / Focus mode β distraction-free writing with ambient sounds, breathing guide, and session timer
- Smart Enter β auto-continues lists, tasks, blockquotes
- Slash commands (
/heading,/table,/code,/callout, etc.) [[Wiki-link autocomplete β type[[to fuzzy-search and link to other notes- Undo/Redo with full snapshot history
- Inline emoji picker
- Callout blocks:
> [!NOTE],> [!WARNING],> [!TIP]
- Pin notes to top
- Color labels β 8 colors for visual organization
- Tags with Obsidian-style inline
#tagsuggestions - Move notes between folders via right-click
- Bulk select for trash/delete/export
- Import individual files or entire folders of
.mdfiles - Duplicate notes
- Hover preview cards
- Nested folder hierarchy with subfolder support
- Right-click context menu: Rename, Create Subfolder, Delete
- Drag-friendly folder tree with expand/collapse
- Knowledge graph β visual map of note connections with PageRank, community detection, pan/zoom, and tag filtering
- Note templates β 8 prebuilt templates (Meeting, Journal, Project, etc.)
- Backlinks panel β see which notes link to the current note
- Outline panel β heading-based document structure
- Floating Table of Contents β collapsible minimap that shows all headings, click to jump to any section
- Note history panel
- Bookmarks bar for quick access
- Quick Switcher for rapid note navigation (
βO) - Command Palette (
βK) β search commands, notes, and actions
- Word Frequency Cloud β interactive tag cloud visualizing your most-used words
- Reading Stats Bar β Flesch readability score, reading level, grade level, vocabulary richness
- Writing Activity Sparkline β 7-day activity chart in the sidebar
- Quick Stats β total notes, pinned, today's edits, writing streak
- Session Timer β tracks how long you've been writing (visible in status bar)
- Pomodoro Timer β fully editable with work/break/rounds configuration
- PDF, Markdown, HTML export per note
- Bulk export β select multiple notes and export all at once (as individual files or ZIP)
- Code block copy with visual "Copied" feedback
- OAuth 2.0 with PKCE for secure authentication
- Two-way sync with conflict resolution
- Selective sync per folder
- Sync status indicators throughout the UI
- 8 themes: Dark, Light, System, RosΓ© Pine, Nord, Catppuccin, Gruvbox, Solarized
- 14 font families across Sans-serif, Serif, and Monospace
- 10 accent colors
- Adjustable font size, line height, editor width
- Resizable sidebar and note list panels
- Full-screen reading and editing mode
- Auto-save with configurable delay (0.5sβ10s)
- Spell check toggle
- Compact mode
- Word count in status bar
- Storage manager with usage info
- In-app update checker (checks GitHub releases)
| Shortcut | Action |
|---|---|
βK |
Command Palette / Search |
βO |
Quick Switcher |
βN |
New Note |
β, |
Settings |
β/ |
Toggle Sidebar |
β. |
Zen / Focus Mode |
βE |
Edit Mode |
ββ§P |
Preview Mode |
ββ§S |
Split View |
ββ§E |
Export Note |
βF |
Find in Note |
βZ |
Undo |
ββ§Z |
Redo |
βB |
Bold |
βI |
Italic |
β` |
Inline Code |
ββ§X |
Strikethrough |
ββ§H |
Highlight |
On Linux, replace
βwithCtrl.
src/
βββ components/
β βββ editor/ MarkdownEditor, EditorToolbar, EditorSidePanel,
β β MarkdownPreview, StatusBar
β βββ features/ CommandPalette, ExportModal, BulkExportModal, SettingsPanel,
β β NoteTemplates, NoteGraph, FolderTree, QuickSwitcher,
β β WikiLinkSuggestion, FloatingTOC, FocusTimer,
β β CloudSyncPanel, WritingAnalytics, SmartInsights, ...
β βββ layout/ Sidebar, NoteList, EditorPane, TitleBar, ResizeHandle
β βββ onboarding/ VaultPicker
β βββ ui/ Toast, Tooltip, ContextMenu, HoverPreview, NoteColorPicker,
β ProgressBar, ReadingProgress, SyncStatusIndicator
βββ hooks/ useTheme, useAutoSave, useKeyboardShortcut, useResizable,
β useUndoRedo, useClickOutside, useDebounce, useGoogleDriveSync
βββ stores/ appStore, editorStore, notesStore, searchStore, syncStore (Zustand)
βββ services/ googleDrive.ts (Drive API client)
βββ utils/ format, sanitize, keyboard, markdown, fonts, exportPdf,
β graphAlgorithm, nlp, search, cn
βββ styles/ globals.css (design tokens, prose, theme variables),
β highlight.css
βββ lib/ seedData, tauri (API bridge)
βββ types/ index.ts, type declarations
src-tauri/
βββ src/
β βββ main.rs Tauri entry point, command handler registration
β βββ lib.rs Library crate root (for clippy --all-targets)
β βββ error.rs Unified AppError type with CmdResult alias
β βββ models.rs Rust β TypeScript data models (Note, Folder, Vault)
β βββ commands/
β βββ mod.rs Module declarations
β βββ fs.rs File system: read/write/create/delete notes & folders,
β β bulk move, recursive folder import
β βββ app.rs App version, vault dialog, fetch_url (CORS bypass)
β βββ gdrive.rs Google Drive OAuth2 with PKCE (Desktop flow)
βββ build.rs Compile-time secret injection from .env.secrets
βββ Cargo.toml Rust dependencies
βββ tauri.conf.json Tauri app configuration (macOS + Linux bundles)
βββ Entitlements.plist macOS entitlements for ad-hoc signing
| Layer | Technology |
|---|---|
| Shell | Tauri 1.6 (Rust) β native macOS & Linux |
| Frontend | React 18, TypeScript 5 (strict mode) |
| Styling | Tailwind CSS 3, CSS custom properties |
| Animations | Framer Motion 11 |
| State | Zustand 4 (devtools + persist middleware) |
| Markdown | marked (GFM) + custom renderer |
| Syntax | highlight.js |
| html2pdf.js | |
| NLP | compromise.js |
| Archive | JSZip |
| HTTP | reqwest (Rust), fetch (browser) |
| Testing | Vitest + @testing-library/react |
| Build | Vite 5, tauri-build |
| CI/CD | GitHub Actions (lint β test β clippy β build β release) |
- Node.js 18+ and npm
- Rust stable (1.70+) via rustup
- macOS: Xcode Command Line Tools (
xcode-select --install) - Linux: System libraries:
sudo apt-get install -y \ libwebkit2gtk-4.0-dev \ libgtk-3-dev \ libayatana-appindicator3-dev \ librsvg2-dev
git clone https://github.com/VidhyadharanSS/RagnarNotes.git
cd RagnarNotes
npm installnpm run dev # Web preview at http://localhost:1420
npm run tauri dev # Native window with hot-reloadnpm run lint # ESLint (0 errors, 0 warnings)
npm run lint:fix # Auto-fix ESLint issues
npm run typecheck # TypeScript strict type-checking
npm run format # Prettier formatting
# Rust
cd src-tauri
cargo clippy --all-targets --all-features -- -D warnings
cargo fmt --all -- --checknpm test # 256 tests across 12 suites
npm run test:watch # Watch mode
npm run test:coverage # Coverage reportTest suites cover:
- Stores:
appStore,editorStore,notesStore,searchStore,syncStore - Features:
noteGraph(PageRank, community detection, layout) - Services:
googleDrive(OAuth flow, token management) - Utils:
cn,format,keyboard,markdown,sanitize
# Universal (host architecture)
npm run tauri build
# Target-specific
npm run tauri build -- --target aarch64-apple-darwin # Apple Silicon
npm run tauri build -- --target x86_64-apple-darwin # Intelnpm run tauri buildProduces both .deb (Debian/Ubuntu) and .AppImage (universal) packages in:
src-tauri/target/release/bundle/deb/src-tauri/target/release/bundle/appimage/
The GitHub Actions workflow (.github/workflows/main.yml) runs:
- π Lint & Type Check β ESLint + TypeScript strict mode (
ubuntu-latest) - π§ͺ Unit Tests β 256 tests with coverage (
ubuntu-latest) - π¦ Rust Clippy β zero-warning policy +
cargo fmtcheck (ubuntu-latest) - ποΈ Build macOS App β on push to
main(macos-latest) - π§ Build Linux App β
.deb+ AppImage on push tomain(ubuntu-22.04) - π Release β on version tags (
v*.*.*):- Builds macOS (Apple Silicon + Intel) with ad-hoc codesigning
- Builds Linux (x86_64) with
.deband AppImage - Publishes all artifacts to GitHub Releases
For builds that include Google Drive sync:
- Create a Desktop OAuth 2.0 client in Google Cloud Console
- Copy the Client Secret
- Local dev: Create
src-tauri/.env.secrets:GOOGLE_CLIENT_SECRET=GOCSPX-your-secret-here - CI: Set the
GOOGLE_CLIENT_SECRETrepository secret in GitHub
The
build.rsscript injects the secret at compile time. For non-release builds (clippy, check), a placeholder is used automatically.
- Fork the repository
- Create a feature branch:
git checkout -b feature/my-feature - Make your changes
- Run the full quality check:
npm run lint && npm run typecheck && npm test cd src-tauri && cargo clippy --all-targets -- -D warnings && cargo fmt --check
- Commit with a descriptive message
- Push and open a Pull Request
MIT β Vidhya Dharan S S