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:
- Old userData folder is preserved
- Migration marker file indicates completion
- 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-editorpackage namenoodl-runtimepackage namenoodl-core-uipackage name@noodl/npm scope (if any)- Internal imports like
from '@noodl-models/...'
Changing these would require massive refactoring with no user benefit.