A powerful node-based canvas for visual information mapping and research
Features β’ Installation β’ Usage β’ Node Types β’ Shortcuts β’ Tech Stack
- Infinite canvas with pan and zoom capabilities
- Drag & drop node creation from the sidebar palette
- Right-click context menu for quick node creation
- Smart collision detection to prevent node overlapping
- Two cursor modes: Select (for editing) and Drag (for navigation)
Create rich, interconnected investigations with specialized nodes for:
- Notes - Rich markdown editing with live preview
- Images - Visual evidence with captions
- Links - Web references with favicons
- Code - Syntax-highlighted code snippets
- Timestamps - Flexible date/time display
- People & Organizations - Entity mapping
- Domains & IPs - Network infrastructure tracking
- Hashes - File integrity and threat indicators
- Credentials - Breach data correlation
- Social Posts - Social media evidence capture
- Maps - Geolocation data
- Routers - Network device information
- Snapshots - Webpage archival
- Actions - Task tracking and to-dos
- Create edges between nodes to show relationships
- Multiple edge styles: solid, dashed, dotted, animated
- Arrow markers with customizable colors
- Label edges to describe relationships
- Group multiple nodes together with
Ctrl+G - Collapsible groups with customizable labels
- Font styling options for group headers
- Ungroup with
Ctrl+Shift+G
- Comprehensive node customization
- Color, border, opacity controls
- Node-specific options (timestamps, code language, etc.)
- Real-time property updates
- Save and load investigation files (.mosaic)
- Auto-save functionality
- File dialog integration
# Clone the repository
git clone https://github.com/Fanaperana/MosaicFlow-Svelte.git
cd MosaicFlow-Svelte
# Install dependencies
pnpm install
# Run in development mode
pnpm tauri dev
# Build for production
pnpm tauri build- Drag & Drop: Drag nodes from the left sidebar palette onto the canvas
- Context Menu: Right-click on the canvas and select a node type from the menu
- Quick Add: Use the toolbar buttons for common node types
- Hover over a node to reveal connection handles
- Drag from a handle to another node
- Release to create a connection
- Pan: Hold
Space+ drag, or use drag mode - Zoom: Scroll wheel or pinch gesture
- Select Multiple: Click and drag to create a selection box
- Group: Select nodes and press
Ctrl+G
- Click on a node to select it
- Use the Properties Panel on the right to customize:
- Colors and borders
- Node-specific content
- Visual styling options
| Category | Nodes | Description |
|---|---|---|
| Content | Note, Image, Code, Link | Core content nodes for evidence |
| Entities | Person, Organization | People and company tracking |
| Technical | Domain, Hash, Credential, Router | Technical indicators |
| Social | Social Post | Social media content |
| Utility | Timestamp, Map, Action, Snapshot | Supporting information |
| Organization | Group, Link List | Grouping and collection nodes |
| Shortcut | Action |
|---|---|
Ctrl + G |
Group selected nodes |
Ctrl + Shift + G |
Ungroup selected group |
Ctrl + S |
Save project |
Ctrl + O |
Open project |
Ctrl + N |
New project |
Delete |
Delete selected nodes/edges |
Space + Drag |
Pan canvas |
Escape |
Deselect all |
- Tauri 2.0 - Cross-platform desktop framework
- SvelteKit - Frontend framework with Svelte 5
- SvelteFlow - Node-based UI library
- TypeScript - Type-safe JavaScript
- Tailwind CSS - Utility-first styling
- shadcn-svelte - UI component library
- CodeMirror - Code editor for code nodes
- Lucide - Beautiful icons
mosaicflow/
βββ src/
β βββ lib/
β β βββ components/ # Svelte components
β β β βββ nodes/ # Custom node components
β β β βββ ui/ # shadcn UI components
β β β βββ editor/ # Rich text editor
β β βββ stores/ # Svelte stores
β β βββ services/ # File operations
β β βββ types.ts # TypeScript definitions
β βββ routes/ # SvelteKit routes
βββ src-tauri/ # Rust backend
β βββ src/ # Rust source code
β βββ tauri.conf.json # Tauri configuration
βββ static/ # Static assets
Contributions are welcome! All work in this repo is issue-driven so every change maps to an issue and a closing commit.
- Start with an issue: open a
bug,feature,enhancement,refactor, ordocsissue describing the change and acceptance criteria. - Branch naming:
<type>/<issue-number>-<slug>(e.g.,feature/42-maplibre-integration). - Commits: use Conventional Commits and close the issue in the footer (e.g.,
Closes #42). - PRs: reference the issue in the title/body and keep the scope limited to that issue.
- Checks: run
pnpm checkbefore opening a PR.
Quick flow:
- Fork the repository (or create a branch if you have access).
- Create an issue describing the change.
- Create your branch (
git checkout -b feature/42-maplibre-integration). - Commit with a closing footer (
fix(stores): lock blocks dragging\n\nCloses #42). - Push and open a Pull Request.
This project is licensed under the MIT License - see the LICENSE file for details.
- Tauri Team for the amazing framework
- Svelte Team for Svelte 5
- xyflow for SvelteFlow
- shadcn for the beautiful components
Made with β€οΈ for researchers and visual thinkers
