A self-hosted, visual node-based AI workflow builder with multi-modal support, long-term memory, agentic tool calling, and multiple AI backends. Built for autonomy, extensibility, and enterprise-grade orchestration.
What is XteVision Prodigy and who is it for?
XteVision Prodigy is a self-hosted, visual node-based AI workflow builder designed for engineers, researchers, and teams who want to compose complex AI pipelines through an intuitive drag-and-drop interface. It provides multi-modal AI support, long-term memory (Wisdom), agentic tool calling, RAG embeddings, and integration with multiple AI backends—all running on a local network with full data ownership.
High-level design and communication flow
┌─────────────────────────────────────────────────────────┐
│ Browser (Any Device on LAN) │
│ HTTPS / LAN │
└──────────────────────┬──────────────────────────────────┘
│
┌──────────────────────▼──────────────────────────────────┐
│ Kali Linux Server (192.168.1.4) │
│ ┌──────────────────────────────────────────────────┐ │
│ │ proxy_server.py (Port 9999) │ │
│ │ • Serves UI (HTML/CSS/JS) │ │
│ │ • CORS proxy → AI backends │ │
│ │ • Auth (session tokens in PostgreSQL) │ │
│ │ • Wisdom long-term memory (PostgreSQL) │ │
│ │ • DB query (MySQL/MariaDB) │ │
│ │ • Document extraction (PDF/DOCX/XLSX/etc.) │ │
│ │ • Tool execution (web search, browser, etc.) │ │
│ └──────────────────────────────────────────────────┘ │
│ PostgreSQL (Port 5432) SearXNG (Port 8888) │
└──────────────────────┬─────────────────────────────────┘
│ LAN (192.168.10.3)
┌──────────────────────▼─────────────────────────────────┐
│ Apple Silicon Mac │
│ ┌────────────┐ ┌──────────┐ ┌──────┐ ┌──────────┐ │
│ │ MLX Server │ │LM Studio │ │Ollama│ │ Copilot │ │
│ │ Port 5010 │ │Port 1234 │ │Port │ │ Bridge │ │
│ │ │ │ │ │11434 │ │Port 5015 │ │
│ └────────────┘ └──────────┘ └──────┘ └──────────┘ │
└───────────────────────────────────────────────────────┘Prodigy is designed for local-first, network-accessible deployment:
Frontend, backend, and AI integration technologies
| Technology | Purpose |
|---|---|
| Vanilla JavaScript (ES6+) | Application logic with modular architecture |
| HTML5 Canvas | Visual node editor rendering |
| CSS3 | Styling with custom properties, dark/light modes |
| SVG | Connection lines between nodes |
| localStorage | Workflow auto-save and state persistence |
| Technology | Purpose |
|---|---|
| Python 3 | Multi-threaded HTTP server |
| PostgreSQL | Wisdom memory, user sessions, knowledge base |
| pymysql | MySQL/MariaDB integration for DB nodes |
| psycopg2-binary | PostgreSQL driver for Wisdom |
| pypdf, python-docx, openpyxl, python-pptx | Document extraction |
| chardet | Character encoding auto-detection (CJK, Cyrillic) |
| bcrypt | Password hashing for authentication |
| Playwright | Browser automation for agentic tools |
| Backend | Port | Type |
|---|---|---|
| MLX Server | 5010 | Local (Apple Silicon) |
| LM Studio | 1234 | Local (Any GGUF model) |
| Ollama | 11434 | Local (embeddings + inference) |
| GitHub Copilot Bridge | 5015 | Cloud (via Node.js bridge) |
Get Prodigy running on your network
pip install psycopg2-binary pymysql pypdf python-docx openpyxl \
python-pptx chardet bcrypt playwright
# Optional: Playwright browsers (for playwright_browse tool)
playwright install chromium
# Optional: agent-browser CLI for richer manual browser automation
npm install -g agent-browser
# Optional: OCR support inside Document nodes
sudo apt install tesseract-ocr poppler-utils
# Create the Prodigy PostgreSQL database and tables
psql -U postgres -f postgres.sql
# Apply auth session tables
psql -U postgres -d prodigy -f sql_auth_setup.sql
cd /home/xteve/prodigy
./start.sh
# or directly:
python3 proxy_server.py
LAN: http://192.168.1.4:9999
Public: https://prodigy.xtevision.net
Direct: http://192.168.1.4:9999
# MLX Server
mlx_lm.server --model <model-path> --port 5010
# LM Studio (GUI - starts automatically)
# Ollama
ollama serve # port 11434
# GitHub Copilot Bridge
cd /path/to/copilot
node copilot_bridge.mjs
Directory layout and module organization
prodigy/
├── index.html # Main UI entry point
├── styles.css # Application styling (dark/light modes)
├── config.json # Runtime config (backends, SearXNG, embedding, Wisdom DB)
├── proxy_server.py # Python HTTP server (port 9999)
├── copilot_bridge.mjs # GitHub Copilot ↔ OpenAI bridge (port 5015)
├── start.sh # Convenience launch script
├── postgres.sql # PostgreSQL schema (knowledge_base, users, sessions)
├── sql_auth_setup.sql # Auth table setup
├── js/
│ ├── main.js # Entry point
│ ├── state.js # Global state & backend config
│ ├── constants.js # NODE_TYPES enum, throttle values
│ ├── utils.js # fetchWithTimeout, abort controllers, URL helpers
│ ├── logic/
│ │ ├── execution.js # Core workflow engine — all node execution logic
│ │ └── workflow.js # Save / load / import / export
│ └── ui/
│ ├── auth.js # Login / register UI
│ ├── connections.js # SVG connection drawing
│ ├── dashboard.js # Dashboard & workflow generation
│ ├── node_manager.js # Node creation, settings panels
│ ├── playground.js # Canvas, drag, pan, resize
│ └── priority_manager.js # Execution order drag-and-drop
├── workflows/ # Ready-made workflow templates
│ ├── incident_triage_escalation.json
│ ├── customer_support_triage.json
│ ├── competitive_intel_brief.json
│ ├── sql_ops_assistant.json
│ ├── deep_research_sweep.json
│ ├── schema_migration_checklist.json
│ ├── db_incident_response.json
│ ├── xlsx2wisdom.json
│ ├── marketing.json
│ ├── software.json
│ ├── agency.json
│ └── developer/ # Software delivery agency templates
│ ├── software_development_agency_sota.json
│ ├── software_development_agency_enterprise_saas.json
│ ├── software_development_agency_ai_agent_platform.json
│ ├── software_development_agency_regulated_internal_tool.json
│ └── software_development_agency_parallel_specialists.json
├── plugins/ # Node plugins (built-in + manifest)
└── logs/
└── app.log # Application logmain.js (bootstrap)
├── state.js
├── constants.js
├── utils.js
├── logic/execution.js → state.js, constants.js, utils.js
├── logic/workflow.js → state.js, utils.js
├── ui/auth.js → state.js, utils.js
├── ui/connections.js → state.js, playground.js
├── ui/dashboard.js → state.js, workflow.js, node_manager.js
├── ui/node_manager.js → state.js, constants.js, execution.js
├── ui/playground.js → state.js, connections.js, constants.js
└── ui/priority_manager.js → state.js, workflow.js
Visual editor, authentication, memory, tools, and more
Drag-and-drop canvas for composing AI pipelines. Pan, zoom, resize nodes. Connections drawn with SVG lines.
User registration and login. All AI actions require valid X-Session-ID header. bcrypt password hashing.
PostgreSQL-backed knowledge base. AI nodes auto-recall relevant facts before inference and auto-store new facts after successful runs.
AI nodes can invoke web_search, fetch_webpage, playwright_browse, inspect_project, read_project_file, write_file, create_directory, update_memory, wisdom_memory during inference.
Built-in semantic chunk selection using nomic-embed-text via Ollama. Configurable chunk size and overlap.
Native vision support. Upload images via Image nodes and send to vision-capable models (Qwen-VL, LLaVA, etc.).
Upload PDF/DOCX/XLSX/PPTX/TXT/CSV. Text extracted and sent to AI nodes. OCR support via Tesseract.
Query MySQL/MariaDB directly from workflow nodes. DB Schema node for table/column introspection.
SearXNG metasearch with configurable engines and language per node. Default engines: google, bing, duckduckgo.
Gate any AI/Brainstorm/Translator/Decider node behind a boolean trigger signal for conditional execution.
Built-in and manifest node plugins define their own metadata. Dashboard reads from the same plugin registry.
Real-time heads-up display for tool calls, memory events, errors. Non-intrusive bottom-of-screen panel.
Complete catalog of available node types
| Node | Purpose |
|---|---|
| Input | Static text prompt input |
| Image | Upload image (Base64) for vision models |
| Document | Upload & parse PDF/DOCX/XLSX/PPTX/TXT/CSV |
| Excel Expert | Inspect XLSX sheets, formulas, dependencies; combine AI analysis with manual remap mappings |
| Exit | Final output with TXT/JSON download |
| Node | Purpose |
|---|---|
| DB Schema | Fetch table/column schema from MySQL/MariaDB |
| DB Query | Run SQL against MySQL/MariaDB databases |
| Node | Purpose |
|---|---|
| Fetch | Scrape a URL; handles CJK/Cyrillic encodings via chardet |
| SearXNG | Metasearch with configurable engines & language per node |
| Node | Purpose |
|---|---|
| AI | LLM inference with tool calling, RAG, Wisdom recall |
| AI Decider | LLM classifier → true / false / error for routing |
| Translator | Auto-detect source language → target language |
| Brainstorm | Multi-pass AI consensus (3 internal rounds) |
| Wisdom | Explicit long-term memory read/write |
| Node | Purpose |
|---|---|
| Deploy | Release planning, CI/CD, rollout, and rollback orchestration |
| Monitor | Observability, alerting, error tracking, and runbook planning |
| Strategist | Mission-level planning, tradeoffs, and approach selection |
| Tactical Director | Break strategy into assigned tasks, reports, and escalations |
| Worker Agent | Execute specialist tasks and return concrete deliverables |
| Innovator | Generate novel, technically grounded solution concepts |
| Security Police | Policy, privacy, security, and operational risk review |
| Node | Purpose |
|---|---|
| Logic Switch | Branch flow on true / false / error signals |
| Timer | Delay execution before continuing the flow |
| Trigger Port | Boolean gate for AI/Brainstorm/Translator/Decider nodes |
| Node | Purpose |
|---|---|
| Project | Initialize and lock a project path under projects/ |
| Coder | Open the linked coding workspace for the selected project |
| Communicator | Deliver node output through email, Telegram, or both |
| Node | Purpose |
|---|---|
| PLC / SPS | Run PLC-style logic with dynamic named I/O pins, retained state, backend rule/Python/ST engines, and OpenPLC bridge hooks |
| Math Processor | Deterministic calculations, seeded random generation, and function-table evaluation |
Extensible node catalog with manifest-based discovery
All node types are defined through the plugin registry. Each node plugin provides metadata such as:
class IProdigyNode:
def Initialize(self, config): ...
def Execute(self, input_data, ctx): ...
def Report(self): ...
def Hibernate(self): ...
def UpdateConfig(self, new_config): ...
The dashboard workflow architect reads the live plugin registry and uses each plugin's description field when generating workflows. This keeps generated workflows aligned with the actual node catalog, including newer role nodes and any future manifest-loaded plugins.
Configure and route to multiple AI providers
Backends are configured in config.json under the backends key. Each backend has a URL and default model.
| Backend | Host | Port | Type | Notes |
|---|---|---|---|---|
| MLX | 192.168.10.3 | 5010 | Local | Apple Silicon MLX server |
| LM Studio | 192.168.10.3 | 1234 | Local | Any GGUF model |
| Ollama | 192.168.10.3 | 11434 | Local | Also used for embeddings |
| GitHub Copilot | 192.168.10.3 | 5015 | Cloud | Requires copilot_bridge.mjs running |
The bridge translates OpenAI-compatible requests into GitHub Copilot SDK calls and runs separately on the Apple Silicon Mac:
cd /path/to/copilot
node copilot_bridge.mjs
# Override config path when needed:
COPILOT_BRIDGE_CONFIG_PATH=/path/to/copilot_bridge.config.json node copilot_bridge.mjs
| Model ID | Label |
|---|---|
| gemini-3-pro | Gemini 3 Pro (Preview) — default |
| gpt-5.3-codex | GPT-5.3-Codex |
| gpt-5.2-codex | GPT-5.2-Codex |
| gpt-5.2 | GPT-5.2 |
| gpt-5.1-codex-max | GPT-5.1-Codex-Max |
| gpt-5.1-codex | GPT-5.1-Codex |
| gpt-5.1 | GPT-5.1 |
| gpt-5.1-codex-mini | GPT-5.1-Codex-Mini (Preview) |
| gpt-5-mini | GPT-5 mini |
| gpt-4.1 | GPT-4.1 |
The bridge supports both streaming (stream: true) and non-streaming requests, and reuses sessions per model to avoid per-request handshake overhead.
/browseCompose, save, and import AI pipelines
[Input: topic] → [SearXNG] → [AI: summarise findings] → [Exit]
[Image upload] → [AI (vision model)] → [Exit]
[Document] → [AI (with Wisdom recall on)] → [Wisdom node: store result] → [Exit]
[Input] → [AI Decider] → true port → [AI: handle success] → [Exit]
→ false port → [AI: handle failure] → [Exit]
Connect any node's output to the trigger port of an AI / Brainstorm / Translator / Decider node. The downstream node will only execute when the trigger signal evaluates to true.
Ready-made templates are in workflows/. Import via the Import button in the toolbar.
| File | Description |
|---|---|
| incident_triage_escalation.json | Incident intake → AI severity gate → routed escalation path |
| customer_support_triage.json | Message normalisation → auto-resolve gate → human handoff |
| competitive_intel_brief.json | Web research sweep → source distillation → strategic brief |
| sql_ops_assistant.json | NL→SQL → DB execution → quality gate → ops insights |
| deep_research_sweep.json | Multi-source research with source consolidation |
| schema_migration_checklist.json | DB schema diff → migration checklist generation |
| db_incident_response.json | Database incident detection and response workflow |
| xlsx2wisdom.json | Parse spreadsheet → store rows into Wisdom knowledge base |
| marketing.json | Marketing copy generation pipeline |
| software.json | Software engineering workflow scaffold |
| agency.json | Multi-agent agency workflow |
The workflows/developer/ category includes software-delivery agency templates. They all start by locking a project codebase with a Project node before interpreting the client brief, and use role nodes plus governance gates to reduce ambiguity on complex client requests.
| File | Use When |
|---|---|
| software_development_agency_sota.json | Default high-discipline software agency flow for complex client work. Best all-round template. |
| software_development_agency_enterprise_saas.json | Multi-tenant SaaS product with onboarding, IAM, billing, migration, or enterprise support needs. |
| software_development_agency_ai_agent_platform.json | AI agent platform, orchestration layer, tool runtime, memory system, or agent operations stack. |
| software_development_agency_regulated_internal_tool.json | Internal regulated tool with approvals, audits, policy documents, or controlled deployment requirements. |
| software_development_agency_parallel_specialists.json | Complex request justifying parallel frontend, backend, and AI/data workstreams. |
PostgreSQL-backed knowledge base with auto-recall and auto-store
AI nodes can automatically recall relevant entries from the PostgreSQL knowledge_base table before inference, and store new facts after a successful run.
knowledge_base and messages queries to the current userusers, sessions, pg_*, and information_schema are not exposed through the Wisdom query endpointWisdom is configured in config.json under the wisdom key:
{
"wisdom": {
"host": "192.168.1.4",
"port": 5432,
"database": "prodigy",
"user": "prodigy_user",
"password": "your-password"
}
}
If you already have legacy shared Wisdom rows, run docs/sql_wisdom_user_isolation.sql and decide whether to backfill those old rows to a specific owner or leave them inaccessible to normal users.
Tools available to AI nodes during inference
| Tool | Description |
|---|---|
| web_search | Search the web via SearXNG metasearch |
| fetch_webpage | Scrape a URL with encoding auto-detection (CJK, Cyrillic) |
| playwright_browse | High-level rendered-page browse/read via Playwright HTTP bridge |
| inspect_project | Inspect existing project output before reruns; avoids overwriting files unless explicitly requested |
| read_project_file | Read a file from the project directory |
| write_file | Write or create a new file in the project directory |
| create_directory | Create a directory recursively in the project directory |
| update_memory | Update internal agent memory during inference |
| wisdom_memory | Read/write to the PostgreSQL Wisdom knowledge base |
Two levels of browser automation are available on the Apple Silicon host:
copilot_bridge.config.json. High-level API for navigating and reading rendered pages.agent-browser CLI. Lower-level structured automation for open/click/fill/press/wait/snapshot/get/is actions. Optionally uses CDP when playwrightCdpTarget or PLAYWRIGHT_CDP_TARGET is configured.Authentication, data isolation, and privacy controls
sessionStorage (cleared on tab close)X-Session-ID header on every requestusers, sessions, pg_*, information_schema) are never exposed through query endpointsThe server is multi-threaded — each request runs in its own thread, so long-running AI inference calls do not block the UI or other requests. Request size limit: 200 MB (for document uploads).
Server endpoints and request/response formats
| Method | Path | Description |
|---|---|---|
GET | /health | Health check — returns {status:'ok', server:'prodigy', ts:<unix>} |
GET | /* | Static file serving (UI assets) |
POST | /proxy | CORS proxy for arbitrary URLs (Fetch nodes, SearXNG) |
POST | /ai | All AI actions: auth, doc-extract, db-query, wisdom-query, embed, tool-execute, and AI backend proxy |
GET /health
X-Session-ID: your-session-token
POST /ai
Content-Type: application/json
X-Session-ID: your-session-token
{
"action": "ai_inference",
"backend": "mlx",
"model": "your-model",
"prompt": "Your prompt here",
"tools": ["web_search", "fetch_webpage"],
"wisdom_recall": true,
"wisdom_store": true
}
POST /proxy
Content-Type: application/json
X-Session-ID: your-session-token
{
"url": "https://api.example.com/data",
"method": "GET",
"headers": {}
}
Runtime configuration via config.json
config.json carries the administrable defaults for:
Each SearXNG node has two optional dataset attributes you can set directly in the node panel:
| Setting | Dataset Key | Default |
|---|---|---|
| Search engines | searxngEngines | google,bing,duckduckgo |
| Language | searxngLanguage | en-US |
These fall back to config.searxng.engines / config.searxng.language if not set on the node.
{
"embedding": {
"endpoint": "http://192.168.10.3:11434/api/embeddings",
"model": "nomic-embed-text",
"chunkSize": 500,
"chunkOverlap": 50
}
}
Email and Telegram delivery from Communicator nodes
The Communicator node reads defaults from an optional notifications block in config.json. Node-level fields can override these values at runtime.
{
"notifications": {
"defaults": {
"channel": "email",
"emailTo": "team@example.com",
"emailSubject": "Prodigy Update",
"telegramChatId": "123456789"
},
"smtp": {
"host": "smtp.example.com",
"port": 587,
"user": "mailer@example.com",
"password": "",
"fromAddress": "mailer@example.com",
"starttls": true,
"ssl": false,
"timeout": 30
},
"telegram": {
"botToken": "<telegram-bot-token>",
"chatId": "123456789",
"parseMode": "Markdown",
"disablePreview": false
}
}
}
Industrial prototyping with PLC-style logic
The built-in PLC / SPS node supports a second-stage runtime model aimed at industrial prototyping:
| Engine | Description |
|---|---|
| Built-in | Original blinker / counter / input-mirror patterns |
| Rules | Line-based PLC logic such as TON, TOF, TP, CTU, and Q0.0 := T1.Q |
| Python | Sandboxed backend execution via run_cycle(io, state, ctx) |
| Structured Text | Backend upload to an OpenPLC runtime |
For Structured Text deployment and Modbus/OpenPLC bridging, add an optional plc block to config.json:
{
"plc": {
"openplcApiUrl": "http://192.168.1.50:8080/api",
"modbusHost": "192.168.1.50",
"modbusPort": 502,
"inputCoilOffset": 0,
"outputCoilOffset": 100
}
}
The backend proxy uses this config for ST upload and Modbus I/O synchronization. This is intended for the remote Linux/OpenPLC side; the browser never talks to Modbus directly.
The VPN-connected Torizon board is configured separately from the PLC bridge so SSH access can be tested before camera or LiDAR hardware is present:
{
"toradex": {
"name": "Toradex Verdin VPN",
"host": "192.168.190.71",
"port": 22,
"user": "",
"sshKeyPath": "",
"remoteProjectPath": "/home/torizon",
"pythonPath": "python3",
"connectTimeoutSec": 8,
"probeCommand": "uname -a"
}
}
The Admin Config overlay exposes these fields and includes a Test Board Access action. That probe first checks raw TCP reachability to the SSH port, then attempts a non-interactive SSH login when a user is configured.
Extending Prodigy with custom nodes and plugins
plugins/IProdigyNode interfaceclass MyCustomNode:
id = "my_custom_node"
nodeType = "MY_CUSTOM"
title = "My Custom Node"
description = "Does something awesome"
def Initialize(self, config):
self.config = config
def Execute(self, input_data, ctx):
# Process input
result = "Output based on: " + input_data
return result
def Report(self):
return {"status": "ok"}
def Hibernate(self):
pass
def UpdateConfig(self, new_config):
self.config = new_config
The frontend is modular. Key extension points:
js/constants.js: Add new node types to the enumjs/ui/node_manager.js: Add settings panels for new nodesjs/logic/execution.js: Add execution logic for new node typesjs/ui/playground.js: Add custom rendering for new node visuals| Key / Action | Effect |
|---|---|
Delete | Remove selected node |
| Drag node header | Move node |
| Drag canvas (empty area) | Pan viewport |
| Drag node bottom-right corner | Resize node |
Common issues and solutions
PORT = 9999 in proxy_server.pypostgres.sql and sql_auth_setup.sql have been applied to the prodigy database192.168.1.4:5432 and the prodigy DB existscurl http://192.168.10.3:5010/v1/modelscopilot CLI on the Mac: copilot auth loginnode copilot_bridge.mjscurl http://192.168.10.3:5015/healthagent-browser --helpPLAYWRIGHT_CDP_TARGET or a different CLI path with AGENT_BROWSER_BINpip install pypdf.doc, .xls, .ppt) are not supported — convert to .docx/.xlsx/.pptxsudo apt install tesseract-ocr poppler-utilsexport TESSERACT_LANG=eng (or eng+chi_sim) before starting the serverknowledge_base table exists in the prodigy PostgreSQL databaseconfig.jsoncurl http://192.168.1.4:8888/search?q=test&format=jsonThe proxy server auto-detects encodings via chardet. If issues persist check the source site's declared charset.