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

304 lines
7.4 KiB
Markdown

# 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`**
```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
```javascript
// Example changes
const mainWindow = new BrowserWindow({
title: 'Nodegex', // Was: OpenNoodl
// ...
});
```
### 3. Window Titles
**`packages/noodl-editor/src/editor/src/views/windows/BaseWindow/BaseWindow.tsx`**
```typescript
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`**
```javascript
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`**
```javascript
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`**
```javascript
// 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:
```json
{
"build": {
"mac": {
"extendInfo": {
"CFBundleDisplayName": "Nodegex",
"CFBundleName": "Nodegex",
"LSMultipleInstancesProhibited": true
}
}
}
}
```
### 8. UI Strings
Search for and replace user-facing strings:
```bash
# 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:
```bash
# 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.