FinNode is a desktop project navigator built with Tauri (Rust backend) and Svelte (frontend). It gives you a draggable node board window and a separate settings/control window so you can launch project actions, run macros, type text, and send keyboard shortcut sequences quickly.
This README is intentionally detailed and maps directly to the current codebase.
- Product Overview
- Core Capabilities
- Runtime Windows Model
- Repository Layout
- Requirements
- Quick Start
- Command Reference
- Usage Guide
- Macro Actions (Detailed)
- Keyboard Shortcut Recorder (Detailed)
- Persistence and Data Model
- System Tray and Global Hotkeys
- Platform Input Automation Behavior
- Build and Packaging
- Windows Cross-Compile from Linux
- Troubleshooting
- Security and Operational Notes
- Development Notes
FinNode runs as a desktop app with two windows:
- A settings/control window (main) where you manage workspaces, nodes, and app settings.
- A desktop node board overlay (desktop) where nodes and links are visualized and launched.
Each workspace contains nodes with launch targets and optional macro steps. Node actions can open paths, editors, URLs, scripts, or execute automation steps such as typing text and keyboard shortcuts.
- Multi-workspace node graph management.
- Draggable node board with SVG link rendering.
- Node-level launch targets:
- path
- editor command/path
- browser URL
- script command or uploaded script file
- Macro engine with sequential steps:
- run-script
- run-uploaded-script
- type-text
- keyboard-shortcut
- open-path
- open-editor
- open-browser
- open-application
- delay (milliseconds)
- Keyboard shortcut recorder with multi-switch sequence support.
- System tray controls and global shortcuts.
- Start-on-boot toggle (enabled by default).
- Desktop window size/position persistence across move, resize, close, app exit, and restart.
- Single-instance process lock.
- Label:
main - Role: settings, workspaces, node editor, status/activity
- Minimize button behavior: hides to tray/taskbar-off state via backend command
- Close button behavior: fully exits app
- Can be reopened from tray menu or tray click
- Label:
desktop - Transparent overlay-style board, resizable and movable
- Designed to stay low in z-order (platform-specific best effort)
- Supports click-through mode logic (not over interactive node bounds)
- Position and size are persisted and restored
.
|- index.html
|- package.json
|- README.md
|- scripts/
| |- make-executable.sh
| |- make-windows-executable.sh
|- src/
| |- App.svelte
| |- main.js
| |- style.css
|- src-tauri/
| |- Cargo.toml
| |- tauri.conf.json
| |- src/
| |- main.rs
|- artifacts/
|- windows/
- Node.js with npm available on PATH
- Dependencies are installed via
npm install --include=dev
- Rust toolchain required for desktop build/run
- Build scripts auto-install rustup if missing
On apt-based systems, helper scripts can auto-install required packages. If doing manual install, use:
sudo apt-get update
sudo apt-get install -y \
pkg-config \
libgtk-3-dev \
libayatana-appindicator3-dev \
librsvg2-dev \
libsoup2.4-dev \
patchelf
# One of the following based on distro availability
sudo apt-get install -y libwebkit2gtk-4.0-dev
# or
sudo apt-get install -y libwebkit2gtk-4.1-devFor automation features on Linux:
type-textaction:- uses
xdotoolfirst - falls back to
wtype
- uses
keyboard-shortcutaction:- requires
xdotool
- requires
Recommended install:
sudo apt-get install -y xdotool wtypenpm installnpm run dev:desktopThis invokes scripts/make-executable.sh dev, which handles environment checks and launches npx tauri dev.
npm run devNote: desktop runtime uses built assets (dist) via Tauri config (beforeDevCommand is npm run build:web).
| Command | What it does |
|---|---|
npm run dev |
Start Vite web dev server |
npm run dev:desktop |
Run desktop app in dev mode through helper script |
npm run build:web |
Build web assets into dist/ |
npm run build:exe |
Build desktop bundle through helper script |
npm run make |
Alias for build:exe |
npm run build:windows |
Build Windows executable from Linux helper script |
npm run make:windows |
Alias for build:windows |
Helper scripts:
scripts/make-executable.sh- bootstraps Rust if missing
- validates Linux deps
- applies WebKit 4.1 compatibility shim for Tauri v1 when needed
- installs npm deps
- runs Tauri dev/build
scripts/make-windows-executable.sh- installs Rust windows target
x86_64-pc-windows-gnuif needed - installs MinGW (
gcc-mingw-w64-x86-64) on apt systems - builds web assets
- compiles
finnode.exe - exports artifacts to
artifacts/windows/by default
- installs Rust windows target
- Create workspace: enter name and click
+ - Switch workspace: select from dropdown
- Delete workspace: removes active workspace (cannot delete last workspace)
- Add node:
+ Add - Layout:
Layoutbutton - Search: opens quick launcher
- Clone/Delete nodes from list or context menu
- Main node is locked and cannot be deleted
- Startup macro trigger is per-node in Edit Node (
Run Macro On System Start); main node is always excluded
Node expanded/context actions may include:
- Open path
- Open editor
- Open browser
- Run script
- Run macro
- Edit node
- Global hotkey can trigger launcher event (
Alt+Space) - In-app shortcuts:
Ctrl/Cmd + KAlt + Space
- Enter launches selected result
- Settings minimize: hide settings to tray
- Settings close: full app exit
- Desktop board can be resized/moved and state is restored at startup
Macro steps execute sequentially in the order shown in the editor.
- Executes shell command string
- Can optionally use node working directory
- If value points to an existing file, executes file directly
- Uses node-uploaded script file path
- Requires uploaded script file to exist
- Sends keystrokes to active window
- FinNode releases settings focus before macro input actions
- Linux tries
xdotool, thenwtype
- Sends key combinations/chords to active window
- Supports multi-switch sequence, e.g.:
Ctrl+K, Ctrl+CCtrl+Shift+P
- Opens path or target with OS default opener
- Executes editor target/path fallback
- Opens URL in default browser
- Runs command as script/shell command
- Sleeps for provided milliseconds (default parse fallback:
1000)
Recorder behavior in node macro editor:
- Choose macro action
Keyboard shortcut. - Click
Record. - Press key combination (must include a non-modifier key).
- Press next combo to append sequence (multi-switch chain).
- Click
Stopor pressEscto end recording.
Normalization rules:
- Modifier ordering is normalized to:
Ctrl,Alt,Shift,Meta
- Chords are separated by commas for sequence execution.
- In editor display, keys are shown with explicit
+separators.
Example stored value:
Ctrl+K, Ctrl+C
Example display in editor preview:
Ctrl + K, Ctrl + C
FinNode persists state in config directory under FinNode/config.json.
Typical config base directories:
- Linux:
~/.config/FinNode/ - Windows:
%APPDATA%/FinNode/ - macOS:
~/Library/Application Support/FinNode/
Saved items include:
- active workspace id
- workspace list
- all node definitions per workspace
- node links and targets
- macro definitions
- command history cache
- app settings:
start_on_bootdesktop_windowgeometry
Additional files:
- Uploaded scripts are saved under
FinNode/scripts/ - Single instance lock file:
FinNode/app.lock
Desktop board geometry is saved when:
- desktop window is moved
- desktop window is resized
- desktop window close is requested
- full app exit is requested
Desktop board geometry is restored during setup at startup.
- UI toggle in Application settings
- Default: enabled
- Backed by
tauri-plugin-autostart(v1 branch) - Startup macro execution is configured in each node's Edit panel via
Run Macro On System Start
Tray menu entries:
- Open Settings
- Toggle Stealth
- Show/Hide Desktop Nodes
- Toggle Background Click-Through
- Exit
Tray interactions:
- Left click/double click opens settings window
Registered global shortcuts:
Alt+S: toggle stealth modeAlt+I: toggle desktop click-throughAlt+Space: toggle quick launcher
type-text:xdotool type --clearmodifiers --delay 1- fallback
wtype
keyboard-shortcut:xdotool key --clearmodifiers- requires
xdotool
- Uses PowerShell +
System.Windows.Forms.SendKeys Meta(Windows key) is not supported in shortcut sender path
- Uses
osascript+System Events - Supports modifier combinations and common special keys in implementation
Desktop bundle build:
npm run build:exeOutput is generated under Tauri target bundle directories.
Web-only build:
npm run build:webBuild command:
npm run make:windowsDefault exported artifacts:
artifacts/windows/FinNode.exe
Default target behavior:
- Target triple defaults to
x86_64-pc-windows-msvc - MSVC build links the WebView2 loader statically, so
FinNode.exeis exported as a standalone file (noWebView2Loader.dllsidecar) - GNU targets require
WebView2Loader.dllnext to the EXE and are blocked by default unless explicitly opted in
Environment variables:
FINNODE_WINDOWS_EXPORT_DIR:- override final artifact export directory
FINNODE_WINDOWS_TARGET_TRIPLE:- override windows target triple
- default:
x86_64-pc-windows-msvc - GNU targets require explicit opt-in with
FINNODE_ALLOW_WEBVIEW2_DLL=1 - GNU example:
FINNODE_ALLOW_WEBVIEW2_DLL=1 FINNODE_WINDOWS_TARGET_TRIPLE=x86_64-pc-windows-gnu npm run make:windows
FINNODE_ALLOW_WEBVIEW2_DLL:- default:
0 - set to
1to intentionally allow GNU builds that requireWebView2Loader.dll
- default:
FINNODE_WINDOWS_TARGET_DIR:- override cargo target dir for windows builds
CARGO_TARGET_DIR:- respected when explicit windows target dir is not set
FINNODE_WINDOWS_EXE_NAME:- override exported executable basename (example:
MyToolexportsMyTool.exe) - optional
.exesuffix in the variable value is normalized away before export - note: Windows executables still require the
.exeextension
- override exported executable basename (example:
Notes:
- Script may relocate target dir automatically for
/mnt/*workspace cases to avoid resource file issues. - On Linux with MSVC target, first build may install
cargo-xwinand download cross-linker components.
- Settings minimize hides app window to tray.
- Reopen from tray icon/menu.
- Ensure target window is focused before macro trigger.
- FinNode now hides/releases settings focus before input actions, but OS focus policies can still affect behavior.
- On Linux, verify
xdotoolis installed for shortcut injection.
- Install
xdotool. - Verify desktop environment allows synthetic input.
- Install
xdotoolandwtype. - Wayland/X11 security policies can limit synthetic input in some environments.
- Ensure required GTK/WebKit dev packages are installed.
- Use helper script to auto-install when on apt-based distro.
- Remove stale lock only if app is fully closed:
- lock path is under config dir:
FinNode/app.lock
- lock path is under config dir:
- Shell launching is enabled by Tauri allowlist and used for commands/scripts.
- File-system scope includes user home and appdata paths in current config.
- Input automation sends synthetic key events; treat macros as privileged local automation.
Frontend stack:
- Svelte 4
- Vite 5
@tauri-apps/api1.6
Backend stack:
- Rust + Tauri v1
notify,open,serde,fs2tauri-plugin-autostart(v1 branch)
Important source files:
src/App.svelte: main UI, node editor, macro recorder, launchersrc-tauri/src/main.rs: commands, tray/hotkeys, macro execution, persistencesrc-tauri/tauri.conf.json: window definitions and allowlist
If you are changing runtime behavior, keep frontend action names and backend macro action handlers in sync.