A fast, local-first Markdown editor, whiteboard, and knowledge graph for your desktop.
Built with Tauri v2, React 18, and Monaco.
No cloud. No accounts. No telemetry. Everything lives on your machine.
- Why Notiq?
- Features
- Getting Started
- Keyboard Shortcuts
- Tech Stack
- Project Structure
- Architecture
- Data & Privacy
- Contributing
- License
Most note-taking apps either lock you into a cloud ecosystem or sacrifice power for simplicity. Notiq gives you the full Monaco editor (the same engine behind VS Code), an Excalidraw whiteboard, a 3D knowledge graph, an embedded terminal, and an optional AI assistant — all in a single offline desktop app that starts in under a second. Your files stay on your disk as plain Markdown, and the AI is strictly opt-in: leave it off (the default) and nothing ever leaves your machine, or point it at a local Ollama instance to keep even AI fully offline.
- Monaco-powered — syntax highlighting, multi-cursor editing, find/replace, code folding, bracket matching, and every keyboard shortcut you already know from VS Code
- Three view modes — Source (raw Markdown), Preview (rendered HTML), or Split (side-by-side with synchronized scrolling)
- Formatting toolbar — one-click buttons for bold, italic, headings, lists, tables, code blocks, blockquotes, links, images, and more
- GFM support — GitHub Flavored Markdown including tables, task lists, and strikethrough
- Mermaid diagrams — render flowcharts, sequence diagrams, and Gantt charts inside fenced
```mermaid ```code blocks - LaTeX math — write equations with
$inline$and$$block$$syntax, rendered via KaTeX - Syntax highlighting — code blocks highlighted for 180+ languages
- Wiki-links — link notes using
[[Note Title]]syntax; links resolve across all open tabs - Admonitions — GitHub-style alert blocks (
> [!NOTE],> [!WARNING], etc.) - Prettier auto-format — clean up your Markdown structure with a single click
- Live word count — character and word count displayed in the status bar
Optional, opt-in and off by default. Run your own local Ollama instance for fully offline AI, or connect to Ollama Cloud with an API key. Works with any OpenAI-compatible Ollama model.
- Inline autocomplete — Copilot-style grey ghost-text suggestions as you type; press
Tabto accept,Escto dismiss. Choose automatic (on pause) or manual (Alt+\) triggering, with a configurable debounce and context window - AI actions — continue writing, summarize the note, fix grammar, generate a title, and repair broken Mermaid diagrams — from the command palette (
Ctrl+Shift+P) or the right-click menu - Ask AI on a selection — select text to explain it inline or replace it with an AI edit; replace-style edits get an inline Accept / Reject / Retry review before anything changes
- AI chat panel — a dockable, resizable chat sidebar grounded in your current note, with streaming replies, conversation history, and per-message copy / insert / regenerate; code blocks add copy and "open as new file" actions
- Calm, cancellable feedback — a subtle "Thinking…" indicator in the status bar that never flashes on quick replies; keep typing and the in-flight suggestion is cancelled instantly
- Secure key storage — your Ollama Cloud API key lives in the OS keychain (Windows Credential Manager, macOS Keychain, Linux Secret Service), never in plain text and never exposed to the web layer
- Model picker — list, select, and test models for the selected provider right from Settings
- Unlimited tabs — open as many notes and whiteboards as you need
- Drag-to-reorder — rearrange tabs by dragging them in the tab bar
- Tab pinning — pin important tabs to prevent accidental closure
- Unsaved-changes detection — dot indicator on dirty tabs with a confirmation dialog on close
- Session persistence — all open tabs, their content, cursor positions, and scroll state are saved to IndexedDB and restored on next launch
- Quick navigation — jump to any tab with
Ctrl+1throughCtrl+9
- Open files — single or multiple files at once (
Ctrl+O) - Open folder — recursively load all Markdown and text files from a directory (
Ctrl+Shift+O) - File selection modal — when opening many files, pick exactly which ones to load and preview the folder tree
- Drag & drop — drop files from Explorer/Finder directly onto the window to open them as tabs
- Save / Save As — write directly to your local filesystem via Tauri's FS plugin
- Export PDF — print the rendered preview to PDF (
Ctrl+P) - File associations — register
.md,.markdown,.txt, and.notiqextensions so files open directly in Notiq from Explorer or Finder - Windows shell integration — adds "Open with Notiq" to the right-click menu for any file, plus "Open folder in Notiq" on directories
- Excalidraw integration — full hand-drawn style canvas for sketching, diagramming, and brainstorming
- Per-tab persistence — whiteboard drawings are saved automatically and restored when you reopen the tab
- Linked whiteboards — attach a whiteboard to a specific note and navigate between them with one click
- Library panel — save custom shapes and browse the official Excalidraw component library
- 3D visualization — interactive force-directed graph showing all open notes as nodes and their connections as edges
- Auto-detected links — edges drawn for both
[text](Target Note)markdown links and[[Target Note]]wiki-links - Click-to-navigate — click any node to jump directly to that note in split view
- Live updates — the graph rebuilds automatically as note content or titles change
- Themed colors — node colors adapt to your current theme
- Built-in terminal — resizable panel at the bottom of the window powered by xterm.js
- Native shell — spawns PowerShell on Windows, bash or zsh on macOS/Linux via a real PTY
- Multi-session tabs — open multiple shells side-by-side and switch between them
- Theme-aware — the terminal palette (foreground, background, ANSI 16) tracks the active app theme
- Configurable — adjust font size, cursor style, blinking, and scrollback buffer in Settings
- Shortcuts —
Ctrl+`toggles the panel,Ctrl+Shift+`opens a new session
- Floating windows — create small, always-visible notes that live on your desktop as separate windows
- Monaco-powered — every sticky note runs the same editor as the main app
- Independent persistence — each sticky note is saved and restored individually
- Sticky notes list — dedicated window listing all your sticky notes, with search and quick reopen
- Quick access — launch new sticky notes or open the list from the system tray menu
- Minimize to tray — keep Notiq running in the background
- Quick actions — show/hide the main window, create sticky notes, or quit from the tray icon
- Single instance — opening a file with Notiq reuses the existing window instead of launching a duplicate
Thirteen built-in color themes — switch instantly from the sidebar or Settings (Ctrl+,):
| Theme | Style |
|---|---|
| Dark | Default dark with warm amber accent |
| Light | Clean, high-contrast light mode |
| One Dark Pro | Atom-inspired dark palette |
| Nord | Arctic, north-bluish tones |
| Dracula | Purple and pink dark theme |
| Catppuccin Mocha | Pastel dark with lavender highlights |
| Tokyo Night | Deep blue Japanese-inspired dark theme |
| Rose Pine | Muted, elegant dark with rose and pine accents |
| Gruvbox Dark | Retro, warm beige-on-brown |
| Solarized Dark | Classic Ethan Schoonover palette |
| GitHub Dark | GitHub's official dark theme |
| Monokai Pro | Modern take on the original Monokai |
| Kanagawa | Japanese woodblock-inspired tones |
Extensive editor customization:
- Font — size (8–32 px), family (JetBrains Mono, Fira Code, Cascadia Code, Consolas, Courier New)
- Editor — word wrap, line numbers, minimap, bracket colorization, cursor style & blinking, auto-closing brackets, whitespace rendering, smooth scrolling, folding, format on paste
- Tab behavior — tab size (2–8 spaces), default editor mode for new tabs
- Terminal — font size, cursor style, cursor blinking, scrollback buffer size
- AI — enable/disable AI, choose provider (Ollama Cloud or Local), manage your API key, select and test a model, and tune autocomplete (trigger mode, debounce, context lines)
- Node.js 18+
- Bun — package manager and script runner
- Rust + Cargo
- Tauri v2 prerequisites for your OS (WebView2 on Windows)
git clone https://github.com/trexolab-solution/notiq.git
cd notiq
bun installbun run tauri devStarts the Vite dev server on http://localhost:1420 and opens the Tauri window with hot module replacement.
bun run tauri buildThe installer is output to src-tauri/target/release/bundle/.
bun run build:linuxSpins up a Docker container (defined in docker/Dockerfile.linux) that produces .deb and .AppImage artifacts in dist-linux/. Requires Docker Desktop.
| Shortcut | Action |
|---|---|
Ctrl+N |
New note |
Ctrl+W |
Close current tab |
Ctrl+S |
Save file |
Ctrl+Shift+S |
Save As |
Ctrl+O |
Open file(s) |
Ctrl+Shift+O |
Open folder |
Ctrl+P |
Export PDF |
Ctrl+3 |
New whiteboard |
Ctrl+, |
Open Settings |
| Shortcut | Action |
|---|---|
Ctrl+Shift+P |
Open command palette (tabs, actions, AI, themes) |
Alt+\ |
Trigger inline autocomplete |
Tab |
Accept the current ghost-text suggestion |
Esc |
Dismiss the suggestion / stop in-flight AI |
| Shortcut | Action |
|---|---|
Ctrl+Tab |
Next tab |
Ctrl+Shift+Tab |
Previous tab |
Ctrl+1 … Ctrl+9 |
Jump to tab N |
| Shortcut | Action |
|---|---|
Ctrl+` |
Toggle terminal panel |
Ctrl+Shift+` |
Open terminal and start a new session |
| Shortcut | Action |
|---|---|
Ctrl+/ |
Toggle line comment |
Ctrl+D |
Duplicate line down |
Shift+Alt+Up/Down |
Copy line up / down |
Alt+Up/Down |
Move line up / down |
Ctrl+Shift+K |
Delete line |
Ctrl+L |
Select line |
Ctrl+Shift+L |
Select all occurrences |
Ctrl+] / Ctrl+[ |
Indent / Outdent |
Ctrl+F |
Find |
Ctrl+H |
Find and replace |
Ctrl+G |
Go to line |
Ctrl+Scroll |
Zoom font size |
| Shortcut | Action |
|---|---|
Ctrl+B |
Bold |
Ctrl+I |
Italic |
Ctrl+Shift+X |
Strikethrough |
Ctrl+E |
Inline code |
Ctrl+K |
Insert link |
Ctrl+Alt+1 / 2 / 3 |
Heading 1 / 2 / 3 |
Ctrl+Shift+8 |
Bullet list |
Ctrl+Shift+7 |
Ordered list |
Ctrl+Shift+9 |
Task list |
Ctrl+Shift+. |
Blockquote |
Ctrl+Alt+C |
Code block |
Ctrl+Shift+T |
Table |
| Layer | Technology |
|---|---|
| Desktop shell | Tauri v2 (Rust) |
| UI framework | React 18 + TypeScript |
| Build tool | Vite 6 |
| Styling | Tailwind CSS v4 + CSS custom properties |
| State management | Zustand v5 |
| Code editor | Monaco Editor |
| Markdown rendering | react-markdown + remark-gfm + rehype-highlight + rehype-katex |
| Diagrams | Mermaid |
| Whiteboard | Excalidraw |
| Knowledge graph | 3d-force-graph (via react-kapsule) + Three.js |
| Terminal | xterm.js + portable-pty (Rust) |
| AI | Ollama Cloud + Local (OpenAI-compatible) via Rust reqwest |
| Secret storage | OS keychain via keyring (Rust) |
| Drag & drop | @dnd-kit |
| Session storage | IndexedDB via idb |
| PDF export | jsPDF |
| Icons | Lucide |
notiq/
├── src/ # React frontend
│ ├── main.tsx # Entry point — routes to main / sticky-note / list window
│ ├── mainApp.tsx # Main window bootstrap (theme hydration, show)
│ ├── App.tsx # Root component — shortcuts, context menus, layout
│ ├── App.css # Global styles and Tailwind theme tokens
│ ├── assets/ # App logo and static assets
│ ├── components/
│ │ ├── ai/ # AI chat panel + onboarding wizard
│ │ ├── editor/ # Monaco editor, preview, toolbar, split view
│ │ ├── graph/ # 3D force-directed knowledge graph
│ │ ├── layout/ # Sidebar, TabBar, StatusBar, titlebar, menus
│ │ ├── whiteboard/ # Excalidraw canvas integration
│ │ ├── sticky-note/ # Sticky note window + sticky notes list
│ │ ├── terminal/ # Embedded xterm.js terminal (multi-session)
│ │ └── ui/ # Reusable components (Button, Modal, Toast, etc.)
│ ├── store/ # Zustand store (tabs, prefs, sticky notes)
│ ├── lib/ # Utilities (file I/O, session, themes, graph, PDF)
│ │ └── ai/ # AI client, prompts, actions, inline completions
│ ├── hooks/ # React hooks (shortcuts, session, scroll sync)
│ ├── types/ # TypeScript type definitions
│ ├── config/ # App metadata (name, version, identifier)
│ └── styles/ # Theme CSS variables
├── src-tauri/ # Tauri backend (Rust)
│ ├── src/lib.rs # Commands, file associations, PTY, tray, plugins
│ ├── src/ai.rs # AI backend — Ollama proxy + secure key storage
│ ├── tauri.conf.json # App config, window, bundling, file associations
│ ├── capabilities/ # Permission scopes (main + sticky note windows)
│ ├── nsis/ # Windows installer hooks
│ ├── linux/ # Linux .desktop template
│ ├── mime/ # Linux MIME type registration
│ └── icons/ # Platform-specific app icons
├── docker/Dockerfile.linux # Reproducible Linux build environment
├── scripts/ # Icon sync + Linux build helpers
├── package.json
├── vite.config.ts
└── tsconfig.json
┌──────────────────────────────────────────────────────────┐
│ Tauri v2 (Rust) │
│ File I/O · PTY terminal · System tray · File assoc. │
└────────────────────────┬─────────────────────────────────┘
│ IPC (invoke / events)
┌────────────────────────▼─────────────────────────────────┐
│ React 18 Frontend │
│ │
│ ┌─────────┐ ┌──────────────┐ ┌────────────────────┐ │
│ │ TabBar │ │ Editor │ │ Knowledge Graph │ │
│ │ (dnd- │ │ (Monaco + │ │ (3D force-graph) │ │
│ │ kit) │ │ Preview) │ │ │ │
│ └─────────┘ └──────────────┘ └────────────────────┘ │
│ ┌─────────┐ ┌──────────────┐ ┌────────────────────┐ │
│ │Sidebar │ │ Whiteboard │ │ Terminal │ │
│ │+ Themes │ │ (Excalidraw) │ │ (xterm.js) │ │
│ └─────────┘ └──────────────┘ └────────────────────┘ │
│ │ │
│ ┌──────────▼──────────┐ │
│ │ Zustand Store │ │
│ │ tabs · theme · │ │
│ │ prefs · graph │ │
│ └──────────┬──────────┘ │
│ │ │
│ ┌──────────▼──────────┐ │
│ │ IndexedDB Session │ │
│ │ (auto-persist) │ │
│ └─────────────────────┘ │
└──────────────────────────────────────────────────────────┘
Key design decisions:
- Debounced persistence — content changes are batched (300ms) before writing to IndexedDB to avoid excessive writes
- Lazy-loaded views — Whiteboard, Knowledge Graph, and Terminal are code-split and loaded on demand
- Session hydration before render — the window stays hidden until IndexedDB restores the previous session, preventing visual flash
- Single instance — Tauri enforces one running instance; opening a file externally sends it to the existing window
- AI proxied through Rust — all Ollama requests go through the Rust backend, so the API key never touches the web layer and there are no CORS constraints; AI is disabled by default
- All note content is stored locally in IndexedDB inside the Tauri WebView
- Whiteboard drawings are stored in localStorage keyed by tab ID
- File saves write directly to your filesystem — allowed paths are
$HOME,$DESKTOP,$DOCUMENT, and$DOWNLOAD - No telemetry, ever — no analytics, no crash reporting, no update checks, no accounts
- AI is opt-in and off by default. When you enable it, only the text needed for a request is sent to the Ollama endpoint you configure — your own machine with local Ollama (fully offline), or Ollama Cloud if you provide an API key. Nothing is sent anywhere else, and nothing is sent at all while AI is disabled. Your API key is kept in the OS keychain, never in a plain-text file
Contributions are welcome. To get started:
- Fork the repository and create a feature branch (
git checkout -b feature/my-change). - Make your changes and verify the app builds (
bun run tauri dev). - Keep commits focused and write a clear commit message.
- Open a pull request describing what you changed and why.
For bugs and feature requests, please open an issue.
Released under the MIT License.
© TrexoLab
