{"id":"8604849c-d07a-4ae9-93e3-2b915330bd2c","slug":"mosaicflow-svelte","kind":"mcp","name":"MosaicFlow-Svelte","summary":"A powerful node-based canvas application for visual information mapping and research. Built with Tauri 2.0, Svelte 5, and TypeScript.","owner":"Fanaperana","repoUrl":"https://github.com/Fanaperana/MosaicFlow-Svelte","license":"MIT","licenseTier":"permissive","trust":"community","stars":4,"match":null,"fewStars":true,"format":"mcp","createdAt":"2025-12-18T04:53:59.000Z","addedAt":"2026-10-21T16:28:05.014Z","logoUrl":"https://avatars.githubusercontent.com/u/31814043?u=ddd42b0143e2e4c6dc06df9e86c1c948daea2169&v=4","linkOnly":false,"collection":null,"skillPath":null,"categories":["design-media"],"tags":["canvas","desktop-app","information-mapping","node-based","research-tool","rust","svelte","svelte5"],"runtime":"binary","local":true,"cloudCapable":false,"cloudCapability":"unknown","cloudReadyOnPlatform":false,"needsApiKey":false,"reviewed":false,"syncedAt":"2026-10-25T23:13:18.167Z","sample":false,"url":"https://conduits.dev/tools/mosaicflow-svelte","language":"TypeScript","transports":["stdio"],"install":{},"requirements":{"env":[],"upstreamMayCharge":false},"tools":null,"readme":"<p align=\"center\">\n  <img src=\"static/MosaicFlow-Word.png\" alt=\"MosaicFlow\" width=\"400\">\n</p>\n\n<h3 align=\"center\">See how your knowledge connects. Let your AI build on it.</h3>\n\n<p align=\"center\">\n  An infinite canvas for notes, research and ideas, stored as plain Markdown files you own,<br>\n  with a <strong>built-in MCP server</strong>: flip one switch and Claude, Copilot or Cursor can read, search and build your maps.\n</p>\n\n<p align=\"center\">\n  <a href=\"#-connect-your-ai-in-60-seconds\"><strong>Connect your AI</strong></a> •\n  <a href=\"#why-mosaicflow\">Why MosaicFlow</a> •\n  <a href=\"#features\">Features</a> •\n  <a href=\"#getting-started\">Get started</a> •\n  <a href=\"#plugins\">Plugins</a> •\n  <a href=\"docs/README.md\">Docs</a>\n</p>\n\n<p align=\"center\">\n  <img src=\"https://img.shields.io/badge/MCP-built--in-8b5cf6?style=flat-square\" alt=\"Built-in MCP server\">\n  <img src=\"https://img.shields.io/badge/local--first-plain%20Markdown-10b981?style=flat-square\" alt=\"Local-first, plain Markdown\">\n  <img src=\"https://img.shields.io/badge/Tauri-2.0-blue?style=flat-square&logo=tauri\" alt=\"Tauri 2\">\n  <img src=\"https://img.shields.io/badge/Svelte-5-orange?style=flat-square&logo=svelte\" alt=\"Svelte 5\">\n  <img src=\"https://img.shields.io/badge/License-MIT-green?style=flat-square\" alt=\"MIT License\">\n</p>\n\n<p align=\"center\">\n  <img src=\"docs/images/canvas.png\" alt=\"MosaicFlow canvas with the pages sidebar and the properties panel\" width=\"100%\">\n</p>\n\n> **\"Build me a study map of competitive programming in Rust, with code snippets, a 4-week plan and links between topics.\"**\n> Your assistant calls MosaicFlow, and the page appears on your canvas, laid out, colour-coded and connected, while you watch.\n\n---\n\n## Why MosaicFlow\n\n**🧠 Think in maps, not folders.** Ideas are rarely linear. Put notes, people, sources, code, maps, timelines and checklists on one infinite canvas, connect them with labelled edges or `[[wikilinks]]`, and see the structure your notes have been hiding.\n\n**🤖 AI-native, without the cloud.** A Model Context Protocol server runs *inside* the app on `127.0.0.1`, protected by a key. Nothing to install or host, no account: paste one generated snippet into your assistant. It gets 26 purpose-built tools to search your vault, answer from your notes with citations, and build whole knowledge maps in a single call.\n\n**📁 Plain files you own, forever.** A vault is a folder. Every node is a Markdown file with frontmatter. Use Git, Dropbox or any editor; nothing is locked in a database or behind a login. It works offline, and it still works if MosaicFlow disappears.\n\n**🧩 Yours to extend.** Add blocks, panels, commands, templates, layouts and themes with a few lines of JavaScript, no rebuild needed. Plugins travel with the pages that use them.\n\n---\n\n## 🔌 Connect your AI in 60 seconds\n\n1. **Settings → AI / MCP → Enable.** MosaicFlow starts a local server at `http://127.0.0.1:4317/mcp`. It is reachable only from your machine and only while the app runs.\n2. **Copy the snippet** for your client: VS Code, Claude Code, Claude Desktop, Cursor and more are generated for you, key included.\n3. **Ask.** Changes appear live on the canvas.\n\n```text\n\"Build a knowledge map of the Space Race: people, missions, a timeline, grouped by country.\"\n\"What do my notes say about shortest paths? Cite the pages.\"\n\"Tidy this page: fix overlaps, route the edges cleanly, and tag related cards with net labels.\"\n\"Add this diagram to the Segment tree note: https://…/segment-tree.png\"\n```\n\nWhat the AI can do on your behalf:\n\n| | |\n|-|-|\n| **Build** | Whole maps in one call (`build_knowledge`): page, groups, cards, labelled edges, layout and a reading order |\n| **Answer** | Search the vault (`search`, `read_nodes`, `get_links`) and answer from *your* notes, with sources |\n| **Lay out** | Auto layout, hand-placed arrangements, obstacle-aware edge routing, and a `check_layout` pass that finds and fixes overlaps |\n| **Relate** | Edges, `[[wikilinks]]`, `#tags`, and **net labels**: one name on many cards links them all, KiCad-style, without a tangle of lines |\n| **Illustrate** | Store pictures in the vault (`add_image`) as image nodes or inline in notes |\n| **Style** | Palettes, edge shapes, strokes, arrows and animation, for one edge or many |\n\nPrefer it headless? The same server ships as a standalone stdio command that works on the vault files even when the app is closed. Full setup, all client snippets and the complete tool list are in [AI assistants (MCP)](#ai-assistants-mcp).\n\n---\n\n## Who it's for\n\nAnyone whose knowledge is made of **things and how they relate**, and who wants to see it, not scroll through it.\n\n| You are | MosaicFlow helps you |\n|---------|----------------------|\n| **Student** | Turn courses into connected study maps: notes with formulas (LaTeX) and diagrams (Mermaid), a Story view to revise step by step, timers for focus sessions and a calendar for exams. |\n| **Researcher / academic** | Map literature, authors, institutions and findings; link sources across projects with `[[wikilinks]]` and backlinks; let an AI assistant build or query maps through MCP. |\n| **Doctor / clinician / health professional** | Organise clinical knowledge, protocols, differentials and study notes as linked pages. Everything stays in local files on your machine, with no account or cloud sync. |\n| **OSINT / security investigator** | Build investigation boards with Person, Organization, Domain, Hash, Credential, Social post, Router, Snapshot and Map blocks, timelines, labelled relations and view-only (locked) pages for sharing findings. |\n| **Journalist / analyst** | Connect people, organisations, events and sources; keep evidence and reasoning on one canvas and export it as an image or a shareable `.mosaic` package. |\n| **Developer / engineer** | Sketch architectures and processes, keep code snippets with syntax highlighting, import Mermaid flowcharts and document systems next to the decisions behind them. |\n| **Writer / teacher / product team / anyone curious** | Map arguments and outlines, plan and brainstorm, capture team knowledge: notes, checklists, callouts, groups and links on a canvas that grows with your ideas. |\n\nYour vault is a folder of Markdown files, so it works offline, syncs with whatever you already use (Git, a cloud drive) and never locks your knowledge in.\n\n---\n\n## Features\n\n### 🧭 Navigate like Notion and Obsidian\n- **Pages sidebar**: every canvas of the vault one click away, with recent pages, inline rename and new pages, without leaving the canvas.\n- **Back / forward** history (`Alt + ←/→` or mouse buttons) and a **quick switcher** (`Ctrl + K`) for pages and nodes.\n- **Vault switcher** (`Ctrl + Shift + O`): jump between vaults; each one reopens the page you last used.\n- **Hover previews**: hover any `[[wikilink]]`, backlink or embed to see the target node and a mini-map of its page.\n\n<p align=\"center\">\n  <img src=\"docs/images/link-preview.png\" alt=\"Hover preview of a link to a node on another page\" width=\"100%\">\n</p>\n\n### ✍️ Add blocks the Notion way\nPress <kbd>/</kbd> or double-click empty canvas space to open the block menu: type to filter, arrows to move, <kbd>Enter</kbd> to insert. Dragging a connection into empty space opens the same menu and links the new block automatically.\n\n<p align=\"center\">\n  <img src=\"docs/images/insert-menu.png\" alt=\"The / block menu\" width=\"100%\">\n</p>\n\n### 📝 Rich notes\n- **Math**: LaTeX with KaTeX, inline `$E = mc^2$` or display `$$ … $$` blocks.\n- **Diagrams**: ` ```mermaid ` blocks render as flowcharts, sequence, timeline, mind-map and other diagrams.\n- **Tables that format themselves**: <kbd>Tab</kbd> moves between cells and re-aligns the table as you type.\n- **`/` commands inside notes**: headings, lists, tasks, code, tables, math, diagrams and links from one menu.\n- Live Markdown rendering, syntax-highlighted code blocks, task lists, `[[links]]` and `#tags`.\n\n### 🔗 A connected knowledge base\n- `[[Wikilinks]]` between nodes, across pages (`[[Page#Node]]`) or to whole pages, with **backlinks** and **#tags**.\n- **Stable links by id**: type `[[` in a note to browse every node in the vault and insert `[[node-id]]`, or use **Copy link** in the properties panel / right-click menu. Id links always show the node's current title, so titles can repeat and renames never break links.\n- **Graph view** (`Ctrl + Alt + G`): an Obsidian-style force graph of the whole vault or the current page, colored by page; drag, zoom, search and click a node to jump to it.\n- Labelled, styled edges (bezier, straight, step; solid, dashed, dotted, animated; arrow markers).\n- **Groups** (`Ctrl + G`) to frame related ideas, and a **Story** view to step through a page in a chosen order.\n- Vault-wide **search** across every page and node, plus a canvas filter that fades out non-matching nodes.\n- **View-only pages** (`Ctrl + Shift + K` or the lock in the page header): read and follow links without accidentally moving or editing anything.\n\n### 🏷️ Net labels: connections without the spaghetti\nBorrowed from circuit design (KiCad local labels): drag from any connection point, choose **Local label**, and give it a name. Every card with the same name is linked, many-to-many, with no line crossing the page.\n- Hover a label to light up every card in its net (on the canvas and the minimap) and get a list to jump between them.\n- Labels stack neatly, can be reordered and moved to another side or card, and share one style per name.\n- An unpaired label shows a red badge, so nothing dangles. Switch any edge to labels, or a two-card label back to a line, in one click.\n\n### 🪄 Layouts that stay readable\n- **Smart edge routing** steers lines around cards and picks the best connection sides.\n- Notes and checklists **grow to fit their content**; groups wrap their children; nothing overlaps.\n- Edge labels slide out of the way of net labels.\n\n### 🎨 Fast styling\nOne-click **colour presets** (text over fill) for any card, from the properties panel or the command palette, plus your own saved presets. Edges come in bezier, straight, step and smooth step, solid, dashed or dotted, animated, with arrows.\n\n### 🖼️ Pictures in, the easy way\nDrag images from your file manager onto a page, or paste a screenshot with <kbd>Ctrl</kbd> + <kbd>V</kbd>. They are copied into your vault's `attachments/` folder (once, de-duplicated) and placed as image nodes sized to the picture.\n\n### 💻 Comfortable on any screen\nCompact mode for small windows, a focus mode (`Ctrl + .`), floating properties, Alt-peek previews, keyboard navigation between nodes, and scrolling inside long notes instead of zooming the page. Drag pages in the sidebar to put them in your order.\n\n### 🎛️ Compact, Notion-style properties\nSelect a node or edge to edit it in a dense side panel: page-style title, typed properties, tags, links and backlinks, colors, borders, layout and locks.\n\n### 📁 Your data, as plain files\n- A **vault** is a folder; each page is a folder; each node is a **Markdown file** with frontmatter. Edit them in any editor (or let an AI agent do it) and changes sync live. The full format is in [docs/VAULT_FORMAT.md](docs/VAULT_FORMAT.md).\n- **Import** `.mosaic` packages, Obsidian `.canvas`, MosaicFlow JSON, Mermaid flowcharts, or a whole folder of Markdown notes (e.g. an Obsidian vault, where `[[links]]` become edges). Drag & drop works too.\n- **Export** a page or a whole vault as `.mosaic`, or a page as Obsidian canvas, JSON, PNG or SVG.\n\n<p align=\"center\">\n  <img src=\"docs/images/overview.png\" alt=\"A full page: grouped code snippets, notes, links and a 4-week plan\" width=\"100%\">\n</p>\n\n---\n\n## Getting started\n\n### Prerequisites\n- [Node.js](https://nodejs.org/) 18+\n- [pnpm](https://pnpm.io/)\n- [Rust](https://www.rust-lang.org/tools/install) and the [Tauri prerequisites](https://v2.tauri.app/start/prerequisites/) for your OS\n\n### Run\n\nDownload an installer for Windows, macOS or Linux from [Releases](https://github.com/Fanaperana/MosaicFlow-Svelte/releases), or build from source:\n\n```bash\ngit clone https://github.com/Fanaperana/MosaicFlow-Svelte.git\ncd MosaicFlow-Svelte\npnpm install\n\npnpm tauri dev      # run the desktop app in development\npnpm tauri build    # build an installer\n```\n\nOn first launch, create a vault (any folder) or open an existing one, then start adding blocks with <kbd>/</kbd>. The [user guide](docs/USER_GUIDE.md) covers everything else.\n\n---\n\n## Blocks\n\n| Group | Blocks |\n|-------|--------|\n| **Basic blocks** | Note (Markdown), Simple Text, Checklist, Callout, Page link, Image, Link, Code, Iframe |\n| **People & organizations** | Person, Organization, Timestamp |\n| **Research & OSINT data** | Domain, Hash, Credential, Social Post, Router, Snapshot |\n| **Layout & embeds** | Group, Map, Link List, Action, Annotation, Embed, Calendar, Timer |\n| **Plugins** | Anything you install, e.g. the example [Flashcard](plugins/example-flashcard/) |\n\nHighlights:\n- **Note**: Markdown with live rendering, math, Mermaid diagrams, self-formatting tables, `[[wikilinks]]` and `#tags`.\n- **Checklist**: tasks with progress; <kbd>Enter</kbd> adds a task, <kbd>Backspace</kbd> on an empty one removes it.\n- **Callout**: tip / info / warning / danger box; click the emoji to change its style.\n- **Page link**: a card linking to another page, with a live outline of it.\n- **Embed**: a live, read-only copy of a node from anywhere in the vault.\n- **Map**: interactive MapLibre map with markers.\n- **Calendar**: month grid and upcoming list; events can repeat (daily, weekdays, weekly, monthly, yearly) and send a desktop notification before they start, from any page.\n- **Timer**: countdown with presets, stopwatch with laps, and pomodoro cycles; keeps running across page switches and notifies when time is up.\n\n---\n\n## Keyboard shortcuts\n\nEvery shortcut can be changed in **Settings → Keyboard shortcuts** (<kbd>Ctrl</kbd> + <kbd>/</kbd>). Defaults:\n\n| Shortcut | Action |\n|----------|--------|\n| <kbd>/</kbd> or double-click | Insert a block |\n| <kbd>Ctrl</kbd> + <kbd>P</kbd> | Command palette (commands, templates, layouts, panels) |\n| <kbd>Ctrl</kbd> + <kbd>K</kbd> / <kbd>Ctrl</kbd> + <kbd>O</kbd> | Search pages and nodes |\n| <kbd>Ctrl</kbd> + <kbd>,</kbd> | Settings |\n| <kbd>Ctrl</kbd> + <kbd>/</kbd> | Keyboard shortcuts |\n| <kbd>Ctrl</kbd> + <kbd>N</kbd> | New page |\n| <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>O</kbd> | Switch vault |\n| <kbd>Ctrl</kbd> + <kbd>\\\\</kbd> / <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>\\\\</kbd> | Pages sidebar / properties panel |\n| <kbd>Alt</kbd> + <kbd>←</kbd> / <kbd>→</kbd> | Back / forward between pages |\n| <kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>G</kbd> | Graph view |\n| <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>K</kbd> | Lock / unlock page (view only) |\n| <kbd>[[</kbd> in a note | Link to a node or page |\n| <kbd>Ctrl</kbd> + <kbd>V</kbd> on the canvas | Paste a picture (or an image link) as an image node |\n| <kbd>Shift</kbd> + <kbd>1</kbd> | Fit view |\n| <kbd>Ctrl</kbd> + <kbd>=</kbd> / <kbd>Ctrl</kbd> + <kbd>-</kbd> | Zoom in / out |\n| <kbd>Ctrl</kbd> + scroll / <kbd>Alt</kbd> + scroll or horizontal wheel | Pan up/down / left/right |\n| <kbd>V</kbd> / <kbd>H</kbd> | Select tool / hand tool |\n| <kbd>Ctrl</kbd> + <kbd>G</kbd> / <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>G</kbd> | Group / ungroup |\n| <kbd>Ctrl</kbd> + <kbd>D</kbd> | Duplicate selection |\n| <kbd>Ctrl</kbd> + <kbd>A</kbd> | Select all nodes |\n| <kbd>Ctrl</kbd> + <kbd>Z</kbd> / <kbd>Ctrl</kbd> + <kbd>Y</kbd> | Undo / redo |\n| <kbd>Delete</kbd> | Delete selection |\n| <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>E</kbd> | Export as `.mosaic` |\n| <kbd>Esc</kbd> | Clear selection / close menus |\n\n## Settings\n\nOpen with the gear at the bottom of the left ribbon or <kbd>Ctrl</kbd> + <kbd>,</kbd>: **General** (hover previews, delete confirmation), **Appearance** (theme, accent color, interface scale, text size, density, corner radius, fonts, icon size/color/weight, reduced motion, custom CSS), **Canvas** (background, grid, snapping, minimap, controls), **AI / MCP** (built-in MCP server, key and client setup), **Keyboard shortcuts**, **Plugins** and **About**. Everything is saved to `settings.json` in the app data folder, so you can back it up or copy it to another machine.\n\n---\n\n## Plugins\n\nAdd your own blocks without rebuilding the app. Plugins live in your app data folder:\n\n| Platform | Folder |\n|----------|--------|\n| Windows | `%APPDATA%\\com.mosaicflow.app\\plugins` |\n| macOS | `~/Library/Application Support/com.mosaicflow.app/plugins` |\n| Linux | `~/.local/share/com.mosaicflow.app/plugins` |\n\nOpen **Plugins** (puzzle icon at the bottom of the left ribbon) to open that folder, rescan, and switch plugins on or off. New plugins stay **disabled until you enable them**, because they run with the same access as the app.\n\n<p align=\"center\">\n  <img src=\"docs/images/plugins.png\" alt=\"The Plugins dialog\" width=\"100%\">\n</p>\n\nA plugin is a folder with a `plugin.json` and a single ES module. It can add:\n\n| | Where it shows up |\n|-|-------------------|\n| **Blocks** (node types) | The `/` menu; saved as Markdown like built-in blocks |\n| **Panels** | A ribbon button that opens a sidebar next to the canvas |\n| **Commands** | The command palette (`Ctrl + P`) and optional shortcuts |\n| **Templates** | \"Insert template: …\" in the palette |\n| **Layouts** | \"Arrange: …\" in the palette |\n| **Themes** | Settings → Appearance → Theme |\n| **Appearance** | Read and change every appearance option (scale, text and icon size, fonts, colours, custom CSS) |\n| **Settings** | Settings → Plugins |\n\nStart from the ready-made template:\n\n```bash\npnpm create-plugin \"My Plugin\" --author \"Your Name\"   # copies plugins/plugin-template into your plugins folder\n```\n\nThen **Plugins → Rescan**, switch it on, and edit `index.js`. A node is a few lines:\n\n```js\nexport function activate(api) {\n  api.registerNodeTypes([{\n    type: 'hello',\n    label: 'Hello',\n    render(container, ctx) {\n      container.textContent = `Hello from ${ctx.data.title}`;\n      return { update: (next) => (container.textContent = `Hello from ${next.data.title}`) };\n    },\n  }]);\n}\n```\n\nPlugins travel with your pages: exported `.mosaic` files include the plugins they use, and whoever imports them\nis asked before they're installed. Read the [plugin guide](docs/PLUGIN_DEVELOPMENT.md), the\n[API reference](docs/PLUGIN_API.md), the [starter template](plugins/plugin-template/) and the\n[Flashcard example](plugins/example-flashcard/).\n\n---\n\n## AI assistants (MCP)\n\nMosaicFlow ships with a built-in [Model Context Protocol](https://modelcontextprotocol.io/) server, so any MCP-capable assistant (VS Code Copilot, Claude Code, Cursor, Claude Desktop, Windsurf, LM Studio, …) can read, search and build pages directly in your vault. Nothing to install: it runs inside the app, and changes appear live on the canvas.\n\n**1. Turn it on** in **Settings → AI / MCP**. The app serves MCP over Streamable HTTP at `http://127.0.0.1:4317/mcp` (port configurable), reachable only from your computer and only while MosaicFlow runs. Clients send a key (`mosaic_…`) as `Authorization: Bearer …`; it stays the same until you regenerate it.\n\n**2. Connect your assistant.** The settings page shows a ready-to-copy snippet for each client, for example:\n\n<details open>\n<summary>VS Code (Copilot agent mode) — <code>.vscode/mcp.json</code> or the user <code>mcp.json</code></summary>\n\n```json\n{\n  \"servers\": {\n    \"mosaicflow\": {\n      \"type\": \"http\",\n      \"url\": \"http://127.0.0.1:4317/mcp\",\n      \"headers\": { \"Authorization\": \"Bearer mosaic_…\" }\n    }\n  }\n}\n```\n</details>\n\n<details>\n<summary>Claude Code</summary>\n\n```bash\nclaude mcp add --transport http mosaicflow http://127.0.0.1:4317/mcp --header \"Authorization: Bearer mosaic_…\"\n```\n</details>\n\n<details>\n<summary>Claude Desktop, Cursor and other clients</summary>\n\nCursor takes the same `url` and `headers` in `~/.cursor/mcp.json` (under `mcpServers`). Claude Desktop only starts local commands, so it connects through the [mcp-remote](https://www.npmjs.com/package/mcp-remote) bridge (needs Node.js); the settings page generates that config too. For clients that only accept a URL, enable **Allow key in URL** to get `…/mcp?token=mosaic_…`.\n</details>\n\n<details>\n<summary>Without the app running (stdio)</summary>\n\n`packages/mcp-server` is the same server as a standalone command that works directly on the vault files, even when MosaicFlow is closed. Build it once (only Node.js 20+ is needed to run it):\n\n```bash\npnpm install\npnpm --filter @mosaicflow/mcp-server build\n# -> packages/mcp-server/dist/mosaicflow-mcp.mjs\n```\n\nThen point your client at it, replacing both paths:\n\n```json\n{\n  \"mcpServers\": {\n    \"mosaicflow\": {\n      \"command\": \"node\",\n      \"args\": [\"C:/path/to/MosaicFlow-Svelte/packages/mcp-server/dist/mosaicflow-mcp.mjs\", \"E:/MosaicVault/MyVault\"]\n    }\n  }\n}\n```\n\nVS Code uses `\"servers\"` with `\"type\": \"stdio\"` instead of `\"mcpServers\"`. The vault can also be passed as the `MOSAICFLOW_VAULT` environment variable instead of the second argument.\n</details>\n\n**3. Ask for knowledge, or ask your knowledge.** For example: *\"Build a MosaicFlow knowledge map about the history of cryptography, with people, algorithms and a timeline.\"* or *\"What do my notes say about shortest paths?\"* The server tells the model to look things up in the vault before answering and to cite the pages and nodes it used. Clients that support MCP prompts also offer **knowledge_map** (build a map) and **ask_vault** (answer from your notes).\n\n| Tool | What it does |\n|------|--------------|\n| `get_guide` | Node types, fields, palette and layout rules (called first) |\n| `build_knowledge` | Creates a whole map in one call: page, groups, nodes, labelled edges, auto layout and story order |\n| `search`, `read_nodes`, `get_links`, `list_tags` | Find notes (strict, or `match: \"any\"` for questions), read their full text with links and backlinks, follow `#tags` |\n| `list_canvases`, `read_canvas` | List pages and read a whole page |\n| `create_canvas`, `update_canvas`, `delete_canvas` | Create pages; rename, describe, tag, lock/unlock or delete them |\n| `create_node`, `update_node`, `delete_node` | Edit nodes (rename with `update_node`; ids never change) |\n| `connect`, `update_edge`, `delete_edge` | Edit edges |\n| `style_edges` | Restyle many edges at once (shape, stroke, colour, arrows, animation) |\n| `label_nodes` | Net labels: tag nodes with a shared name so they read as connected without a line (many-to-many), or remove/restyle a net |\n| `add_image` | Store a picture (URL or data URL) in the vault's `attachments/` and place an image node, or get markdown to show it inside a note |\n| `create_group`, `set_story_order`, `auto_layout`, `import_mermaid` | Structure and tidy a page |\n| `arrange_nodes` | Place and size many nodes in one step for a hand-designed layout |\n| `check_layout` | Reports overlapping nodes, nodes outside their group and edges with a poor route; `fix: true` repairs them |\n\nOpen the vault in MosaicFlow once before connecting so `.mosaicflow/node-types.json` exists; it tells the assistant which node types and fields are available. Agents without MCP can edit the files directly by following [docs/VAULT_FORMAT.md](docs/VAULT_FORMAT.md).\n\n---\n\n## Development\n\n### Tech stack\n- **[Tauri 2](https://v2.tauri.app/)** + **Rust** for the desktop shell, file access and vault services\n- **[SvelteKit](https://kit.svelte.dev/)** with **Svelte 5 runes** and **TypeScript**\n- **[Svelte Flow](https://svelteflow.dev/)** for the canvas\n- **[Tailwind CSS v4](https://tailwindcss.com/)**, [bits-ui](https://bits-ui.com/), [Lucide](https://lucide.dev/) icons\n- **[CodeMirror](https://codemirror.net/)** editors and **[MapLibre GL](https://maplibre.org/)** maps\n\n### Project structure\n\n```\nMosaicFlow-Svelte/\n├── src/                     # SvelteKit app\n│   ├── lib/components/      # Canvas, sidebars, panels, node components\n│   ├── lib/kernel/          # Plugin loader and registries\n│   ├── lib/plugins/         # Built-in plugins (core node sets)\n│   ├── lib/stores/          # Svelte 5 rune stores (workspace, vault, pages, plugins…)\n│   └── lib/services/        # Navigation, import/export, file services\n├── packages/\n│   ├── node-*/              # Built-in node types, one package each\n│   ├── node-sdk/            # Shared node building blocks\n│   ├── vault-core/          # Vault format, Markdown codec, knowledge index, importers\n│   └── mcp-server/          # MCP server for AI assistants\n├── plugins/example-flashcard/  # Example user plugin\n├── crates/                  # Shared Rust crates\n├── src-tauri/               # Tauri app (Rust commands and services)\n└── docs/                    # Architecture, API and plugin docs\n```\n\n### Checks\n\n```bash\npnpm check                                   # svelte-check / TypeScript\npnpm --filter ./packages/vault-core exec vitest run   # vault-core unit tests\ncd src-tauri && cargo check                  # Rust\n```\n\n### Releasing and code signing\n\nBump `version` in `src-tauri/tauri.conf.json`, then push a matching tag (`git tag v0.2.0 && git push origin v0.2.0`). The [Release workflow](.github/workflows/release.yml) runs the CI checks, then builds six installers into one **draft** GitHub release with a download table:\n\n| System | x64 | ARM64 |\n|--------|-----|-------|\n| Windows | `.exe` (NSIS) and `.msi` | `.exe` (NSIS) |\n| macOS | `.dmg` (Intel) | `.dmg` (Apple Silicon) |\n| Linux | `.AppImage`, `.deb`, `.rpm` | `.AppImage`, `.deb`, `.rpm` |\n\nReview the draft, then publish it. Each platform is signed when its secrets are set, and built unsigned (with a warning in the log) when they aren't.\n\n| Platform | Signing | Repository secrets (Settings → Secrets and variables → Actions) |\n|----------|---------|----------------------------------------------------------------|\n| macOS | Developer ID certificate + notarization (Apple Developer Program). Without it: ad-hoc signature, users allow the app in Privacy & Security | `APPLE_CERTIFICATE` (base64 `.p12`), `APPLE_CERTIFICATE_PASSWORD`, `APPLE_SIGNING_IDENTITY`; for notarization `APPLE_ID`, `APPLE_PASSWORD` (app-specific password), `APPLE_TEAM_ID` |\n| Windows | [Azure Artifact Signing](https://v2.tauri.app/distribute/sign/windows/#azure-artifact-signing). Without it: SmartScreen warns on download | Secrets `AZURE_CLIENT_ID`, `AZURE_CLIENT_SECRET`, `AZURE_TENANT_ID`; variables `AZURE_SIGNING_ENDPOINT`, `AZURE_SIGNING_ACCOUNT`, `AZURE_SIGNING_PROFILE` |\n| Linux | Not required | |\n\nSee the Tauri guides for [macOS](https://v2.tauri.app/distribute/sign/macos/) and [Windows](https://v2.tauri.app/distribute/sign/windows/) for how to get the certificates.\n\nMore in [docs/](docs/README.md): the [user guide](docs/USER_GUIDE.md), [architecture](docs/ARCHITECTURE.md), [internal API](docs/API.md), [vault format](docs/VAULT_FORMAT.md) and [plugin guide](docs/PLUGIN_DEVELOPMENT.md).\n\n---\n\n## Contributing\n\nContributions are welcome! Work in this repo is issue-driven, so every change maps to an issue and a closing commit.\n\n- **Start with an issue** (`bug`, `feature`, `enhancement`, `refactor` or `docs`) describing the change and its acceptance criteria.\n- **Branch**: `<type>/<issue-number>-<slug>`, e.g. `feature/42-maplibre-integration`.\n- **Commits**: [Conventional Commits](https://www.conventionalcommits.org/), closing the issue in the footer (`Closes #42`).\n- **PRs**: reference the issue and keep the scope to it; run `pnpm check` first.\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for details.\n\n---\n\n## License\n\nMIT; see [LICENSE](LICENSE).\n\n## Acknowledgments\n\n[Tauri](https://tauri.app/), [Svelte](https://svelte.dev/), [xyflow](https://xyflow.com/), [shadcn-svelte](https://shadcn-svelte.com/) and [MapLibre](https://maplibre.org/), and the Notion and Obsidian teams for the inspiration.\n\n<p align=\"center\">\n  Made with ❤️ for students, researchers, clinicians, investigators and every curious mind that thinks in connections\n</p>\n"}