-
Notifications
You must be signed in to change notification settings - Fork 0
Monorepo Setup
Guide for using DevMirror in monorepo projects with multiple packages.
DevMirror automatically detects all package.json files in your workspace:
- Open monorepo root in VS Code
- DevMirror Scripts panel shows all packages
- Each package appears as a collapsible folder
- Configure each package independently
monorepo/
├── package.json # Root package
├── lerna.json
└── packages/
├── app/
│ └── package.json # Detected
├── lib/
│ └── package.json # Detected
└── cli/
└── package.json # Detected
monorepo/
├── package.json
└── packages/
├── frontend/
│ └── package.json
├── backend/
│ └── package.json
└── shared/
└── package.json
monorepo/
├── package.json
├── pnpm-workspace.yaml
└── apps/
├── web/
│ └── package.json
└── api/
└── package.json
monorepo/
├── package.json
├── nx.json
└── packages/
└── [packages detected]
Each package has its own config (recommended):
packages/frontend/devmirror.config.json:
{
"mode": "cdp",
"url": "http://localhost:3000",
"outputDir": "../../logs/frontend"
}For CEF-based applications in monorepo:
packages/backend/devmirror.config.json:
{
"mode": "cef",
"cefPort": 8555,
"outputDir": "../../logs/backend"
}Using auto-detection for varying ports:
packages/app/devmirror.config.json:
{
"mode": "cdp",
"autoDetectPort": true,
"outputDir": "../../logs/app"
}Avoid port conflicts in monorepos:
packages/app1/devmirror.config.json:
{
"mode": "cdp",
"url": "http://localhost:3000",
"outputDir": "../../logs/app1"
}packages/app2/devmirror.config.json:
{
"mode": "cdp",
"url": "http://localhost:3001",
"outputDir": "../../logs/app2"
}Root package.json:
{
"scripts": {
"dev:all": "lerna run dev:mirror --parallel",
"dev:apps": "lerna run dev:mirror --scope=@myorg/app-*"
}
}{
"scripts": {
"dev:all": "npm run dev:mirror --workspaces",
"dev:frontend": "npm run dev:mirror -w frontend",
"dev:backend": "npm run dev:mirror -w backend"
}
}{
"scripts": {
"dev:all": "yarn workspaces run dev:mirror",
"dev:frontend": "yarn workspace frontend dev:mirror"
}
}{
"scripts": {
"dev:all": "pnpm -r run dev:mirror",
"dev:apps": "pnpm --filter './apps/**' run dev:mirror"
}
}logs/
├── frontend/
│ ├── 2025-09-22-143052.log
│ └── current.log
├── backend/
│ ├── 2025-09-22-143052.log
│ └── current.log
└── shared/
└── build.log
logs/
├── 2025-09-22/
│ ├── frontend/
│ ├── backend/
│ └── admin/
logs/
├── frontend-2025-09-22-143052.log
├── backend-2025-09-22-143052.log
└── admin-2025-09-22-143052.log
{
"scripts": {
"mirror:setup": "node scripts/setup-devmirror.js",
"mirror:all": "npm run mirror:frontend & npm run mirror:backend",
"mirror:frontend": "cd packages/frontend && npm run dev:mirror",
"mirror:backend": "cd packages/backend && npm run dev:mirror",
"mirror:clean": "rm -rf **/devmirror-logs"
}
}myproject.code-workspace:
{
"folders": [
{ "path": "packages/frontend" },
{ "path": "packages/backend" },
{ "path": "packages/shared" }
],
"settings": {
"devmirror.autoRefresh": true,
"devmirror.autoFold": true
}
}# Lerna
lerna run dev:mirror --scope=frontend
# Yarn
yarn workspace frontend dev:mirror
# PNPM
pnpm --filter frontend dev:mirror
# Nx
nx run frontend:dev:mirrorUse .gitignore patterns or simply don't add mirror scripts to packages you don't want to mirror.
config/devmirror-ports.js:
module.exports = {
frontend: {
url: 'http://localhost:3000',
outputDir: './logs/frontend'
},
backend: {
url: 'http://localhost:8080',
outputDir: './logs/backend'
},
admin: {
url: 'http://localhost:4000',
outputDir: './logs/admin'
}
};- Use consistent port numbering across packages
- Centralize log output to monorepo root
- Add .gitignore entries for all log directories
- Document port assignments in README
- Use workspace scripts for coordination
- Set up CI/CD to handle multiple packages
- Clean logs regularly with workspace scripts
- Use sequential port numbers
- Configure each package with unique ports
- Use port detection with ranges
- Configure central log directory
- Use consistent outputDir paths
- Create cleanup scripts
- Use shared base configuration
- Set defaults at root level
- Use environment variables
- Run only needed packages
- Use filtering and scoping
- Disable unused packages
scripts/setup-devmirror.js:
const fs = require('fs');
const path = require('path');
const packages = [
{ name: 'frontend', url: 'http://localhost:3000' },
{ name: 'backend', url: 'http://localhost:8080' },
{ name: 'admin', url: 'http://localhost:4000' }
];
packages.forEach(pkg => {
const config = {
mode: 'cdp',
url: pkg.url,
outputDir: `../../logs/${pkg.name}`
};
const configPath = path.join('packages', pkg.name, 'devmirror.config.json');
fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
console.log(`Created config for ${pkg.name}`);
});DevMirror v0.4.82 | GitHub | Issues | VS Code Marketplace
Capture 100% of browser console output with Chrome DevTools Protocol
v0.4.82