# Investigation Guide: Dashboard Routing Error
**Issue Reference:** ISSUE-routing-error.md
**Error:** `ERR_FILE_NOT_FOUND` for `file:///dashboard/projects`
**Discovered:** 2026-01-07
---
## Quick Summary
The Electron app fails to load the dashboard route with `ERR_FILE_NOT_FOUND`. This investigation guide provides a systematic approach to diagnose and fix the issue.
---
## Step 1: Verify the Error
### Reproduce the Issue
```bash
# Clean everything first
npm run clean:all
# Start dev server
npm run dev
# Observe error in terminal:
# Editor: (node:XXXXX) electron: Failed to load URL: file:///dashboard/projects with error: ERR_FILE_NOT_FOUND
```
### Check Console
1. Open DevTools in Electron app (View → Toggle Developer Tools)
2. Look for errors in Console tab
3. Look for failed network requests in Network tab
4. Note exact error messages and stack traces
---
## Step 2: Understand the Architecture
### Electron Main Process vs Renderer Process
**Main Process** (`packages/noodl-editor/src/main/`):
- Handles window creation
- Registers protocol handlers
- Manages file:// URL loading
- Sets up IPC communication
**Renderer Process** (`packages/noodl-editor/src/editor/`):
- Runs React app
- Handles routing (React Router or similar)
- Communicates with main via IPC
### Current Architecture (Post-TASK-001B)
TASK-001B made these changes:
1. **Electron Store Migration** - Projects stored in Electron's storage
2. **Service Integration** - New `ProjectOrganizationService`
3. **Remove List View** - Simplified launcher UI
4. **Create Project Modal** - New modal-based creation
---
## Step 3: Check Route Configuration
### A. React Router Configuration
**File to check:** `packages/noodl-editor/src/editor/src/router.tsx` (or similar)
```typescript
// Look for route definitions
// Check if route was renamed or removed
```
**What to verify:**
- Does the `/dashboard/projects` route exist?
- Was it renamed to something else?
- Is there a redirect from old to new route?
### B. Electron Protocol Handler
**File to check:** `packages/noodl-editor/src/main/` (main process files)
```typescript
// Look for protocol registration
protocol.registerFileProtocol('file', (request, callback) => {
const url = request.url.substr(7); // Remove 'file://'
callback({ path: path.normalize(`${__dirname}/${url}`) });
});
```
**What to verify:**
- Is file:// protocol properly registered?
- Does the path resolution work correctly?
- Are paths correctly normalized?
### C. Window Loading
**File to check:** Main window creation code
```typescript
// Check how the window loads the initial URL
mainWindow.loadURL('file:///' + path.join(__dirname, 'index.html'));
// Or for dev mode
mainWindow.loadURL('http://localhost:3000/dashboard/projects');
```
**What to verify:**
- Is it using file:// or http:// in dev mode?
- Is webpack dev server running on the expected port?
- Is the initial route correct?
---
## Step 4: Compare Before/After TASK-001B
### Files Changed in TASK-001B
Review these files for routing-related changes:
```bash
# Check git history for TASK-001B changes
git log --oneline --grep="TASK-001B" --all
# Or check recent commits
git log --oneline -20
# Compare specific files
git diff packages/noodl-editor/src/editor/src/router.tsx
git diff packages/noodl-editor/src/main/
```
### Key Questions
1. **Was the dashboard route path changed?**
- From: `/dashboard/projects`
- To: `/launcher`, `/projects`, or something else?
2. **Was the launcher moved?**
- Previously: Separate route
- Now: Modal or embedded component?
3. **Was the initial route changed?**
- Check where the app navigates on startup
---
## Step 5: Check Webpack Dev Server Configuration
### Development Server Setup
**File to check:** `packages/noodl-editor/webpackconfigs/editor.dev.config.js`
```javascript
devServer: {
contentBase: path.join(__dirname, '../build'),
port: 3000,
historyApiFallback: {
// Important for SPA routing
rewrites: [
{ from: /^\/dashboard\/.*/, to: '/index.html' },
]
}
}
```
**What to verify:**
- Is historyApiFallback configured?
- Are the route patterns correct?
- Is the dev server actually running?
### Check if Dev Server is Running
```bash
# While npm run dev is running, check in terminal
# Look for: "webpack-dev-server is listening on port 3000"
# Or check manually
curl http://localhost:3000/dashboard/projects
# Should return HTML, not 404
```
---
## Step 6: Check Electron Build Configuration
### Electron Main Entry Point
**File to check:** `packages/noodl-editor/package.json`
```json
{
"main": "src/main/index.js",
"scripts": {
"dev": "..."
}
}
```
**What to verify:**
- Is the main entry point correct?
- Does the dev script properly start both webpack-dev-server AND Electron?
### Development Mode Detection
**File to check:** Main process initialization
```typescript
const isDev = process.env.NODE_ENV === 'development';
if (isDev) {
mainWindow.loadURL('http://localhost:3000/dashboard/projects');
} else {
mainWindow.loadURL('file://' + path.join(__dirname, 'index.html'));
}
```
**What to verify:**
- Is dev mode correctly detected?
- Is it trying to load from webpack dev server or file://?
- If using file://, does the file exist?
---
## Step 7: Check Project Storage Changes
### LocalStorage to Electron Store Migration
TASK-001B migrated from localStorage to Electron's storage. Check if this affects routing:
**File to check:** `packages/noodl-editor/src/editor/src/services/ProjectOrganizationService.ts`
```typescript
// Check if service initialization affects routing
export class ProjectOrganizationService {
constructor() {
// Does this redirect to a different route?
// Does this check for existing projects and navigate accordingly?
}
}
```
**What to verify:**
- Does the service redirect on initialization?
- Is there navigation logic based on stored projects?
- Could empty storage cause a routing error?
---
## Step 8: Test Potential Fixes
### Fix 1: Update Route References
If the route was renamed:
```typescript
// In main process or router
// OLD:
mainWindow.loadURL('http://localhost:3000/dashboard/projects');
// NEW:
mainWindow.loadURL('http://localhost:3000/launcher'); // or '/projects'
```
### Fix 2: Add Route Redirect
If maintaining backward compatibility:
```typescript
// In router.tsx
```
### Fix 3: Fix Webpack Dev Server
If historyApiFallback is misconfigured:
```javascript
// In webpack config
historyApiFallback: {
index: '/index.html',
disableDotRule: true,
rewrites: [
{ from: /./, to: '/index.html' } // Catch all
]
}
```
### Fix 4: Fix Protocol Handler
If file:// protocol is broken:
```typescript
// In main process
protocol.interceptFileProtocol('file', (request, callback) => {
const url = request.url.substr(7);
callback({ path: path.normalize(`${__dirname}/${url}`) });
});
```
---
## Step 9: Verify the Fix
After applying a fix:
```bash
# Clean and restart
npm run clean:all
npm run dev
# Verify:
# 1. No errors in terminal
# 2. Dashboard/launcher loads correctly
# 3. DevTools console has no errors
# 4. Can create/open projects
```
### Test Cases
1. ✅ App launches without errors
2. ✅ Dashboard/projects list appears
3. ✅ Can create new project
4. ✅ Can open existing project
5. ✅ Navigation between routes works
6. ✅ Reload (Cmd+R / Ctrl+R) doesn't break routing
---
## Step 10: Document the Solution
Once fixed, update:
1. **ISSUE-routing-error.md** - Add resolution section
2. **CHANGELOG** - Document what was changed
3. **LEARNINGS.md** - Add entry if it's a gotcha others might hit
### Example Resolution Entry
```markdown
## Resolution (2026-01-XX)
**Root Cause**: The route was renamed from `/dashboard/projects` to `/launcher` in TASK-001B but the Electron main process was still trying to load the old route.
**Fix Applied**: Updated main process to load `/launcher` instead of `/dashboard/projects`.
**Files Modified**:
- `packages/noodl-editor/src/main/index.js` (line 42)
**Verification**: App now loads correctly in dev mode.
```
---
## Common Scenarios & Solutions
### Scenario 1: Route was Renamed
**Symptoms:**
- Error: `ERR_FILE_NOT_FOUND`
- Old route reference in main process
**Solution:**
- Find where the route is loaded in main process
- Update to new route name
- Add redirect for backward compatibility
### Scenario 2: Dev Server Not Running
**Symptoms:**
- Error: `ERR_CONNECTION_REFUSED` or `ERR_FILE_NOT_FOUND`
- Port 3000 not responding
**Solution:**
- Check if `npm run dev` starts webpack-dev-server
- Check package.json scripts
- Verify port isn't already in use
### Scenario 3: Webpack Config Issue
**Symptoms:**
- 404 on route navigation
- Dev server runs but routes return 404
**Solution:**
- Add/fix historyApiFallback in webpack config
- Ensure all SPA routes fall back to index.html
### Scenario 4: Electron Protocol Handler Broken
**Symptoms:**
- Production build also fails
- File:// URLs don't resolve
**Solution:**
- Review protocol handler registration
- Check path normalization logic
- Verify \_\_dirname points to correct location
---
## Additional Resources
- Electron Protocol Documentation: https://www.electronjs.org/docs/latest/api/protocol
- Webpack DevServer: https://webpack.js.org/configuration/dev-server/
- React Router: https://reactrouter.com/
---
## Quick Debugging Checklist
- [ ] Reproduced the error
- [ ] Checked console for additional errors
- [ ] Verified route exists in router configuration
- [ ] Checked if route was renamed in TASK-001B
- [ ] Verified webpack dev server is running
- [ ] Checked main process window.loadURL call
- [ ] Reviewed historyApiFallback configuration
- [ ] Tested with clean build
- [ ] Verified fix works after reload
- [ ] Documented the solution
---
**Remember**: The goal is to understand WHY the route fails, not just make it work. Document your findings for future reference.