QANode Logo

Desktop Version

QANode Desktop is a Community Edition application with no restrictions on core flow features.


Desktop Advantages

FeatureDescription
Simple InstallationSingle installer, no external dependencies
Embedded DatabaseIntegrated PostgreSQL, no manual setup
Local NodesBuild custom nodes as local files (hot-reload)
All-in-OneFrontend, API, Worker, and database in one app
PortableWorks offline, no server required

Installation

See Installation for full steps.

Minimum Requirements

  • Windows 10/11 (64-bit)
  • RAM: 4 GB minimum (8 GB recommended)
  • Disk: 500 MB for installation + data space

First Run

On first startup, QANode:

  1. Shows splash progress
  2. Initializes embedded PostgreSQL
  3. Runs migrations (creates tables)
  4. Starts API server
  5. Opens main UI

First initialization may take a few extra seconds while database setup completes.


Data Structure

QANode stores data under user folders:

%APPDATA%\QANode\
├── pg-data/              # Embedded PostgreSQL data
├── storage/              # Artifacts (screenshots, PDFs)
└── logs/                 # App logs
%USERPROFILE%\Documents\QANode\
└── custom nodes/         # Local custom nodes
    └── sample-hash-node/ # Sample node

Important: do not manually modify files under pg-data/.


Local Custom Nodes

Desktop supports local nodes: JavaScript files automatically detected and loaded.

Nodes Folder

%USERPROFILE%\Documents\QANode\custom nodes\

Creating a Local Node

  1. Create a file with extension .node.js, .node.mjs, or .node.cjs
  2. Export manifest and execute
  3. QANode auto-detects changes in ~1.5 seconds

Example: .node.js (CommonJS)

// my-node.node.js
module.exports = {
  manifest: {
    type: 'my-node',
    name: 'My Node',
    category: 'My Nodes',
    inputSchema: {
      text: { type: 'string', required: true },
    },
    outputSchema: {
      result: { type: 'string' },
    },
  },
  async execute({ inputs }) {
    return {
      status: 'success',
      outputs: { result: String(inputs.text || '').toUpperCase() },
      logs: [`Processed: ${inputs.text}`],
      artifacts: [],
    };
  },
};

Example: .node.mjs (ESM)

// my-node.node.mjs
export const manifest = {
  type: 'my-node-mjs',
  name: 'My Node MJS',
  category: 'My Nodes',
  inputSchema: {
    text: { type: 'string', required: true },
  },
  outputSchema: {
    result: { type: 'string' },
  },
};

export async function execute({ inputs }) {
  return {
    status: 'success',
    outputs: { result: String(inputs.text || '').toUpperCase() },
    logs: [`Processed: ${inputs.text}`],
    artifacts: [],
  };
}

Full details: Local Desktop Nodes.


Hot Reload

Local provider monitors the custom nodes folder and reloads automatically:

  • Interval: 1.5 seconds
  • Detection: file modified time + size
  • Reload: automatic, no app restart

Native Theme

Desktop supports native light/dark theme integration:

  • Light: light UI with light title bar
  • Dark: dark UI with dark title bar

Desktop vs Web

AspectDesktopWeb (Enterprise)
DatabaseEmbedded PostgreSQLExternal PostgreSQL
InstallationSingle installerManual (Node.js + PostgreSQL)
Local NodesSupportedHTTP providers only
Multi-userSingle-userTeam usage
NetworkOffline capableNetwork required
UpdatesInstaller updateGit pull + rebuild

Troubleshooting

App does not start

  • Verify another instance is not running
  • Try running as administrator
  • Check port conflicts

Database does not initialize

  • %APPDATA%\QANode\pg-data may be corrupted
  • Rename/remove folder and restart (data loss expected)

Local nodes do not appear

  • Check extension: .node.js, .node.mjs, .node.cjs
  • Check exports: manifest and execute
  • For .node.js, use CommonJS (module.exports) or configure type: "module" in package.json
  • Open %APPDATA%\@qanode\desktop\desktop-main.log and search Failed loading

Quick import error verification

  1. Open Settings > Providers and test Desktop Local JS Provider
  2. Check %APPDATA%\@qanode\desktop\desktop-main.log
  3. Look for messages like:
  • Failed loading ".../your-node.node.mjs": Cannot find package 'x'
  • Unexpected token 'export' (usually .node.js with ESM syntax and no type: "module")

Tips

  • Use .node.js with CommonJS for simple compatibility
  • Use .node.mjs when you need explicit ESM
  • Keep one folder per node with its own package.json
  • Use hot-reload for fast iteration