A visual workflow automation platform. Build chains of executable plugins, trigger them via cron, webhook, or terminal, and monitor execution in real-time.
This project started from a single script file that automated repetitive tasks — manual deployments, server health checks, file operations — because I had no access to tools like n8n or a proper CI/CD pipeline. Over time that script grew too large to maintain, so I took inspiration from n8n and rebuilt it as a visual node-based editor. Node Connector is a personal project; while the codebase has been hardened with production-grade security practices, it was built for personal use and is not intended as a production platform.
A visual workflow automation platform. Build chains of executable plugins on an SVG canvas, connect them to form pipelines, and trigger execution via cron, webhook, or terminal. A visual workflow automation platform. Build chains of executable plugins, trigger them via cron, webhook, or terminal, and monitor execution in real-time.
This project started from a single script file that automated repetitive tasks — manual deployments, server health checks, file operations — because I had no access to tools like n8n or a proper CI/CD pipeline. Over time that script grew too large to maintain, so I took inspiration from n8n and rebuilt it as a visual node-based editor. Node Connector is a personal project; while the codebase has been hardened with production-grade security practices, it was built for personal use and is not intended as a production platform.
- Visual Node Editor — Drag-and-drop SVG canvas with pan, zoom, and real-time connection drawing
- Plugin System — Auto-discovered plugins from
api/plugins/. Add a.jsfile and it appears instantly - Three Trigger Modes — Cron (scheduled), Webhook (HTTP POST), Terminal (CLI or UI)
- Real-Time Execution — Live progress streaming via Server-Sent Events (SSE) with per-node status indicators
- Multi-Input Execution — Nodes with multiple inputs wait for all upstream nodes to complete; failures propagate downstream
- Data Flow —
{{variable}}template syntax with dot notation for referencing previous node outputs - Execution History — Track every cron/webhook/terminal execution with duration, status, and node count
- Multi-User Auth — JWT-based authentication with access and refresh tokens
- Single Docker Image — Nginx + API + Scheduler bundled in one container
| Plugin | Tags | Description |
|---|---|---|
| Custom Script | script |
Execute custom Node.js code with async function main() |
| SSH | network |
Run commands on remote servers via SSH |
| FTP | network |
Upload files to FTP servers |
| HTTP Request | network |
Make REST API calls (GET, POST, PUT, DELETE) |
| Download File | network, io |
Download a file from a URL to the filesystem |
| Send Email | notification |
Send emails via SMTP |
| Read/Write File | io |
Read, write, or append content to files |
| Rename File | io |
Move or rename files on the filesystem |
| Zip / Unzip | io |
Compress or extract ZIP archives |
| JSON Transform | data |
Parse, transform, and reshape JSON data |
| Database Query | data |
Execute SQL queries against a SQLite database |
| If Condition | flow |
Evaluate a condition and pass or block execution |
| Loop | flow |
Re-execute all downstream nodes for each item in a list or count range |
| Loop End | flow |
Marks the end of a loop body; nodes after this run once with aggregated results |
| Delay | flow |
Wait for a specified duration before continuing |
| Linux Terminal | terminal, linux |
Execute bash/shell commands |
| Windows CMD | terminal, windows |
Execute CMD commands |
| PowerShell | terminal, windows |
Execute PowerShell scripts |
Run directly on your machine for full access to host tools (Python, CMD, bash, etc.).
Prerequisites: Node.js 18+ installed.
# Windows
start.bat
# Linux / macOS
./start.shOr directly:
node start.jsThis single command:
- Installs all dependencies (API, frontend, scheduler)
- Builds the frontend
- Starts the API + scheduler
- Opens on
http://localhost:3001
Terminal plugins have full access to your host machine — run Python, CMD, bash, and any installed tool.
To have Node Connector start automatically when the system boots:
# Windows (run as Administrator)
service-install.bat
# Linux (run as root)
sudo ./service-install.shTo remove auto-start:
# Windows (run as Administrator)
service-uninstall.bat
# Linux (run as root)
sudo ./service-uninstall.shUse Docker if you prefer an isolated container (note: host tools like Python won't be accessible).
docker build -t node-connector .
docker run -d -p 80:80 --name node-connector node-connectorOpen http://localhost in your browser, register an account, and start building workflows.
With host volume (for file access only, not host tools):
# Linux / macOS
docker run -d -p 80:80 --name node-connector -v /path/on/host:/data node-connector
# Windows
docker run -d -p 80:80 --name node-connector -v C:\Users\You\Desktop:/data node-connector| Variable | Default | Description |
|---|---|---|
JWT_SECRET |
change_me_jwt_secret |
Secret for signing JWT access tokens |
REFRESH_TOKEN_SECRET |
change_me_refresh_secret |
Secret for signing refresh tokens |
INTERNAL_API_KEY |
change_me_internal_key |
Key for scheduler/CLI to API communication |
docker run -d -p 80:80 \
-e JWT_SECRET=my_secret \
-e REFRESH_TOKEN_SECRET=my_refresh_secret \
-e INTERNAL_API_KEY=my_internal_key \
node-connector+---------------------------------------------------+
| Docker Container |
| |
| +----------+ +-------------+ +-----------+ |
| | Nginx | | API | | Scheduler | |
| | :80 |--->| :3001 |<---| | |
| | | | Express.js | | node-cron | |
| +----------+ +------+------+ +-----------+ |
| | | |
| | +------+------+ |
| Static Files | SQLite | |
| (React build) | + JSON | |
| +-------------+ |
+---------------------------------------------------+
node-connector/
├── api/ # Express.js REST API
│ ├── index.js # Server entry point
│ ├── cli.js # CLI execution tool
│ ├── plugins/ # Plugin files (auto-loaded)
│ │ ├── custom-script.js
│ │ ├── ssh.js
│ │ ├── ftp.js
│ │ ├── http-request.js
│ │ ├── download-file.js
│ │ ├── send-email.js
│ │ ├── read-write-file.js
│ │ ├── rename-file.js
│ │ ├── zip.js
│ │ ├── json-transform.js
│ │ ├── database-query.js
│ │ ├── if-condition.js
│ │ ├── loop.js
│ │ ├── loop-end.js
│ │ ├── delay.js
│ │ ├── linux-terminal.js
│ │ ├── windows-cmd.js
│ │ ├── powershell.js
│ │ └── example.js
│ └── src/
│ ├── routes/ # auth.js, sheet.js
│ ├── models/ # user.js, plugin.js, execution-history.js
│ ├── middleware/ # JWT auth, internal key auth
│ ├── executer.js # Execution engine
│ └── tool-loader.js # Plugin discovery
├── scheduler/ # Cron scheduler service
├── front/ # React 19 + Vite 6
│ └── src/
│ ├── components/ # Sheet editor, list, modals
│ ├── services/ # API clients
│ └── models/ # SVG node rendering
├── Dockerfile # Single-image build
├── nginx.conf # Reverse proxy config
├── docs.html # Full documentation
├── start.js # Cross-platform launcher
├── start.bat # Windows start wrapper
├── start.sh # Linux/macOS start wrapper
├── service-install.bat # Windows auto-start installer
├── service-uninstall.bat # Windows auto-start uninstaller
├── service-install.sh # Linux auto-start installer (systemd)
└── service-uninstall.sh # Linux auto-start uninstaller
Add a .js file in api/plugins/ — it's auto-discovered on restart:
const Plugin = require("./../src/models/plugin");
class MyPlugin extends Plugin {
name() { return "My Plugin"; }
description() { return "What it does"; }
icon() { return "🚀"; }
// iconBase64() { return "data:image/png;base64,..."; } // Optional image icon
tags() { return ["custom"]; }
paramsDefinition() {
return [
{ name: "My Param", alias: "my_param", type: "string", default: "", value: undefined }
];
}
async logic(params = {}) {
const myParam = params.my_param;
const input = params.input || {};
this.log("Processing...");
return {
status: { error: false, message: "Done" },
output: { result: "value" } // Passed to downstream nodes
};
}
}
module.exports = MyPlugin;# From inside the container
node api/cli.js <sheet-uid>
# From host
docker exec node-connector node api/cli.js <sheet-uid>Full documentation is available at docs.html — open it in a browser for the complete API reference, plugin guide, and architecture details.
See LICENSE for details. This project is available for personal, non-commercial use only. See docs.html for full documentation.
