dev-prod-build-identity
Facilitates the setup of distinct development and production builds for apps, ensuring data isolation and preventing conflicts.
Install this skill
Security score
The dev-prod-build-identity skill was audited on Mar 8, 2026 and we found 84 security issues across 3 threat categories, including 5 high-severity. Review the findings below before installing.
Categories Tested
Security Issues
Direct command execution function call
| 397 | execSync(`electron-builder ${builderArgs} ${configOverride}`, { |
Direct command execution function call
| 425 | execSync(`electron-builder ${builderArgs} ${configOverride}`, { |
Template literal with variable interpolation in command context
| 279 | displayName: IS_DEV ? `${APP_NAME} [DEV]` : APP_NAME, |
Template literal with variable interpolation in command context
| 288 | databaseName: IS_DEV ? `${TECHNICAL_NAME}.dev.db` : `${TECHNICAL_NAME}.db`, |
Template literal with variable interpolation in command context
| 291 | urlScheme: IS_DEV ? `${TECHNICAL_NAME}-dev://` : `${TECHNICAL_NAME}://`, |
Template literal with variable interpolation in command context
| 351 | ```yaml |
Template literal with variable interpolation in command context
| 363 | Note the `${env.*}` references -- electron-builder reads these from the |
Template literal with variable interpolation in command context
| 392 | `--config.appId="${process.env.APP_ID}"`, |
Template literal with variable interpolation in command context
| 393 | `--config.productName="${process.env.PRODUCT_NAME}"`, |
Template literal with variable interpolation in command context
| 397 | execSync(`electron-builder ${builderArgs} ${configOverride}`, { |
Template literal with variable interpolation in command context
| 420 | `--config.appId="${process.env.APP_ID}"`, |
Template literal with variable interpolation in command context
| 421 | `--config.productName="${process.env.PRODUCT_NAME}"`, |
Template literal with variable interpolation in command context
| 425 | execSync(`electron-builder ${builderArgs} ${configOverride}`, { |
Template literal with variable interpolation in command context
| 503 | const iconPath = `./assets/images/${iconFolder}`; |
Template literal with variable interpolation in command context
| 509 | icon: `${iconPath}/icon.png`, |
Template literal with variable interpolation in command context
| 517 | foregroundImage: `${iconPath}/android-icon-foreground.png`, |
Template literal with variable interpolation in command context
| 518 | backgroundImage: `${iconPath}/android-icon-background.png`, |
Template literal with variable interpolation in command context
| 519 | monochromeImage: `${iconPath}/android-icon-monochrome.png`, |
Template literal with variable interpolation in command context
| 526 | image: `${iconPath}/splash-icon.png`, |
Template literal with variable interpolation in command context
| 787 | - **Electron-builder's `${env.*}` syntax reads from `process.env`.** The build |
Template literal with variable interpolation in command context
| 789 | via `${env.ARTIFACT_NAME}`, `${env.PRODUCT_NAME}`, etc. If these aren't set, |
Node child_process module reference
| 375 | const { execSync } = require("child_process"); |
Node child_process module reference
| 406 | const { execSync } = require("child_process"); |
Access to .env file
| 101 | **Why dotenv-flow?** It provides cascading environment files (`.env` → |
Access to .env file
| 102 | `.env.{NODE_ENV}` → `.env.local`) with no custom code. The `NODE_ENV` variable |
Access to .env file
| 103 | selects which override file loads, and `.env.local` (gitignored) handles |
Access to .env file
| 130 | .env # Base development configuration (committed) |
Access to .env file
| 131 | .env.production # Production overrides (committed) |
Access to .env file
| 132 | .env.local # Machine-specific overrides (gitignored) |
Access to .env file
| 133 | .env.example # Template documenting all variables (committed) |
Access to .env file
| 138 | `.env` (development defaults): |
Access to .env file
| 152 | `.env.production` (production overrides): |
Access to .env file
| 161 | `.env.example` (template with documentation): |
Access to .env file
| 175 | # API URL (use .env.local for machine-specific IP on physical devices) |
Access to .env file
| 179 | **1.4 Add .env.local to .gitignore** |
Access to .env file
| 182 | .env.local |
Access to .env file
| 183 | .env.*.local |
Access to .env file
| 194 | automatically available in the renderer via `import.meta.env.VITE_*`. |
Access to .env file
| 302 | import.meta.env.VITE_BUILD_ENV || // Explicit override |
Access to .env file
| 303 | import.meta.env.MODE || // --mode flag (development|production) |
Access to .env file
| 304 | (import.meta.env.DEV ? "development" : "production"); // Dev server detection |
Access to .env file
| 307 | `import.meta.env.MODE` is set by the `--mode` flag passed to electron-vite. This |
Access to .env file
| 379 | // Load .env (development mode) |
Access to .env file
| 386 | process.env.APP_ID = "com.myapp.dev"; |
Access to .env file
| 387 | process.env.PRODUCT_NAME = process.env.PRODUCT_NAME || "MyApp-Dev"; |
Access to .env file
| 388 | process.env.ARTIFACT_NAME = "myapp-dev"; |
Access to .env file
| 392 | `--config.appId="${process.env.APP_ID}"`, |
Access to .env file
| 393 | `--config.productName="${process.env.PRODUCT_NAME}"`, |
Access to .env file
| 399 | env: process.env, |
Access to .env file
| 410 | // Load .env.production |
Access to .env file
| 414 | process.env.APP_ID = "com.myapp"; |
Access to .env file
| 415 | process.env.PRODUCT_NAME = process.env.PRODUCT_NAME || "MyApp"; |
Access to .env file
| 416 | process.env.ARTIFACT_NAME = "myapp"; |
Access to .env file
| 420 | `--config.appId="${process.env.APP_ID}"`, |
Access to .env file
| 421 | `--config.productName="${process.env.PRODUCT_NAME}"`, |
Access to .env file
| 427 | env: process.env, |
Access to .env file
| 500 | process.env.EXPO_PUBLIC_APP_VARIANT || process.env.NODE_ENV || "production"; |
Access to .env file
| 531 | apiUrl: process.env.EXPO_PUBLIC_API_URL || "https://api.myapp.com", |
Access to .env file
| 532 | appVariant: process.env.EXPO_PUBLIC_APP_VARIANT || "production", |
Access to .env file
| 558 | `NODE_ENV` controls which `.env` files `dotenv-flow` loads. |
Access to .env file
| 617 | const parsed = envSchema.safeParse(process.env); |
Access to .env file
| 636 | ...env.ALLOWED_ORIGINS.split(",").map((s) => s.trim()), |
Access to .env file
| 644 | **6.3 Development vs production .env for the API** |
Access to .env file
| 646 | `.env` (development): |
Access to .env file
| 654 | `.env.production`: |
Access to .env file
| 691 | not the production one. The API URL in your `.env` files controls this |
Access to .env file
| 712 | | App Name | "MyApp Dev" | "MyApp" | `.env` / `.env.production` | |
Access to .env file
| 717 | | API URL | http://localhost:3011 | https://api.myapp.com | `.env` / `.env.production` | |
Access to .env file
| 719 | | Debug Logging | Enabled | Disabled | `.env` | |
Access to .env file
| 772 | - **dotenv-flow loads `.env` first, then overlays.** The base `.env` file is |
Access to .env file
| 773 | always loaded. `.env.production` only overrides the values it explicitly sets. |
Access to .env file
| 774 | This means your `.env` should contain development defaults, and |
Access to .env file
| 775 | `.env.production` should only contain values that differ in production. |
Access to .env file
| 777 | - **`.env.local` is for machine-specific values only.** Things like your local |
Access to .env file
| 779 | `.env.local`, which is gitignored. Never put variant-specific configuration |
Access to .env file
| 780 | here -- it should be in `.env` or `.env.production`. |
Access to .env file
| 787 | - **Electron-builder's `${env.*}` syntax reads from `process.env`.** The build |
External URL reference
| 64 | API URL: https://api.myapp.com API URL: http://localhost:3011 |
External URL reference
| 149 | API_URL=http://localhost:3011 |
External URL reference
| 158 | API_URL=https://api.myapp.com |
External URL reference
| 176 | API_URL=http://localhost:3011 |
External URL reference
| 531 | apiUrl: process.env.EXPO_PUBLIC_API_URL || "https://api.myapp.com", |
External URL reference
| 650 | ALLOWED_ORIGINS="http://localhost:3000,http://localhost:5173" |
External URL reference
| 717 | | API URL | http://localhost:3011 | https://api.myapp.com | `.env` / `.env.production` | |