Files
OpenNoodl/dev-docs/tasks/phase-8-distribution/TASK-7.1-rebrand-nodegex.md

7.4 KiB

Task 7.1: Rebrand to Nodegex

Overview

Rename the application from "OpenNoodl" to "Nodegex" (Node Graph Expression) across all user-facing surfaces while maintaining backward compatibility for existing users.

Scope

In Scope

  • Application name and branding
  • Window titles
  • Protocol handlers
  • Package identifiers
  • userData path (with migration)
  • Documentation references

Out of Scope (Keep as "noodl")

  • Internal package names (noodl-editor, noodl-runtime, etc.)
  • Code variables and function names
  • Git history
  • NPM package names (if published)

Changes Required

1. Package Configuration

packages/noodl-editor/package.json

{
  "name": "noodl-editor",                    // Keep internal
  "productName": "Nodegex",                  // Change from OpenNoodl
  "description": "Full stack low-code React app builder - Nodegex",
  "author": "The Low Code Foundation",
  "homepage": "https://nodegex.dev",         // Update when domain ready
  "build": {
    "appId": "com.nodegex.app",              // Change from com.opennoodl.app
    "protocols": {
      "name": "nodegex",                      // Change from opennoodl
      "schemes": ["nodegex"]                  // Change from opennoodl
    }
  }
}

2. Main Process

packages/noodl-editor/src/main/main.js

Update any hardcoded "OpenNoodl" or "Noodl" strings in:

  • Window titles
  • Dialog messages
  • Menu items
// Example changes
const mainWindow = new BrowserWindow({
  title: 'Nodegex',  // Was: OpenNoodl
  // ...
});

3. Window Titles

packages/noodl-editor/src/editor/src/views/windows/BaseWindow/BaseWindow.tsx

export function BaseWindow({
  title = ProjectModel.instance.name,  // Default project name as title
  // ...
}) {
  // The TitleBar component may show app name
}

packages/noodl-core-ui/src/components/app/TitleBar/TitleBar.tsx

Check for any hardcoded "Noodl" references.

4. Platform Identification

packages/noodl-platform-electron/src/platform-electron.ts

The userData path is determined by Electron using productName. After changing productName, the path becomes:

  • Windows: %APPDATA%/Nodegex
  • macOS: ~/Library/Application Support/Nodegex
  • Linux: ~/.config/Nodegex

5. User Data Migration

Critical: Existing users have data in the old location. We need migration.

Create: packages/noodl-editor/src/main/src/migration.js

const { app } = require('electron');
const fs = require('fs');
const path = require('path');

const OLD_NAMES = ['OpenNoodl', 'Noodl'];  // Possible old names
const NEW_NAME = 'Nodegex';

function migrateUserData() {
  const userDataPath = app.getPath('userData');
  
  // Check if we're already in the new location
  if (userDataPath.includes(NEW_NAME)) {
    // Look for old data to migrate
    for (const oldName of OLD_NAMES) {
      const oldPath = userDataPath.replace(NEW_NAME, oldName);
      
      if (fs.existsSync(oldPath) && !fs.existsSync(path.join(userDataPath, '.migrated'))) {
        console.log(`Migrating user data from ${oldPath} to ${userDataPath}`);
        
        // Copy contents (not move, safer)
        copyDirectory(oldPath, userDataPath);
        
        // Mark as migrated
        fs.writeFileSync(path.join(userDataPath, '.migrated'), oldPath);
        
        console.log('Migration complete');
        break;
      }
    }
  }
}

function copyDirectory(src, dest) {
  if (!fs.existsSync(dest)) {
    fs.mkdirSync(dest, { recursive: true });
  }
  
  const entries = fs.readdirSync(src, { withFileTypes: true });
  
  for (const entry of entries) {
    const srcPath = path.join(src, entry.name);
    const destPath = path.join(dest, entry.name);
    
    if (entry.isDirectory()) {
      copyDirectory(srcPath, destPath);
    } else {
      // Don't overwrite existing files in new location
      if (!fs.existsSync(destPath)) {
        fs.copyFileSync(srcPath, destPath);
      }
    }
  }
}

module.exports = { migrateUserData };

Update: packages/noodl-editor/src/main/main.js

const { migrateUserData } = require('./src/migration');

app.on('ready', () => {
  // Migrate before anything else
  migrateUserData();
  
  // ... rest of app initialization
});

6. Protocol Handler

Update deep links from opennoodl:// to nodegex://

packages/noodl-editor/src/main/main.js

// Register protocol handler
app.setAsDefaultProtocolClient('nodegex');

// Handle incoming URLs
app.on('open-url', (event, url) => {
  if (url.startsWith('nodegex://')) {
    // Handle URL
  }
});

7. macOS Info.plist

packages/noodl-editor/build/Info.plist (if exists) or via electron-builder:

{
  "build": {
    "mac": {
      "extendInfo": {
        "CFBundleDisplayName": "Nodegex",
        "CFBundleName": "Nodegex",
        "LSMultipleInstancesProhibited": true
      }
    }
  }
}

8. UI Strings

Search for and replace user-facing strings:

# Find all references
grep -r "OpenNoodl\|Noodl" packages/ --include="*.tsx" --include="*.ts" --include="*.js"

Common locations:

  • About dialogs
  • Error messages
  • Welcome screens
  • Help text
  • Tooltips

9. Launcher

packages/noodl-core-ui/src/preview/launcher/Launcher/

  • Update any branding in launcher UI
  • Logo/icon references
  • Welcome messages

10. Build Assets

packages/noodl-editor/build/

  • Icon files: Keep filenames, update icon content if needed
  • Installer background images
  • DMG background

11. Code Comments (Low Priority)

Internal comments can remain as "Noodl" for historical context. Only update user-visible strings.

File Change Summary

File Change Type
packages/noodl-editor/package.json productName, appId, protocols
packages/noodl-editor/src/main/main.js Add migration, protocol handler
packages/noodl-editor/src/main/src/migration.js Create new
packages/noodl-core-ui/**/TitleBar* Check for hardcoded strings
packages/noodl-core-ui/**/Launcher* Branding updates
Various .tsx, .ts files User-facing string changes

Testing Checklist

Fresh Install

  • App installs as "Nodegex"
  • userData created in correct location
  • Protocol handler nodegex:// works
  • App icon shows correctly
  • Window title shows "Nodegex"
  • About dialog shows "Nodegex"

Upgrade from OpenNoodl

  • User data migrates automatically
  • Projects list preserved
  • Settings preserved
  • No duplicate data created

Platform Specific

  • Windows: Start menu shows "Nodegex"
  • macOS: Menu bar shows "Nodegex"
  • macOS: Dock shows "Nodegex"
  • Linux: Desktop entry shows "Nodegex"

Rollback Plan

If issues arise, the migration is non-destructive:

  1. Old userData folder is preserved
  2. Migration marker file indicates completion
  3. Can revert productName and migrate back

Search Patterns

Use these to find remaining references:

# Case-insensitive search for noodl
grep -ri "noodl" packages/ --include="*.tsx" --include="*.ts" --include="*.js" \
  | grep -v "node_modules" \
  | grep -v ".bundle." \
  | grep -v "// " \
  | grep -v "* "

# Specific product names
grep -r "OpenNoodl\|opennoodl\|com\.opennoodl" packages/

Notes on Internal Names

These should NOT change:

  • noodl-editor package name
  • noodl-runtime package name
  • noodl-core-ui package name
  • @noodl/ npm scope (if any)
  • Internal imports like from '@noodl-models/...'

Changing these would require massive refactoring with no user benefit.