# Electron Release

> Guides Electron app release process including build, code signing, notarization, and GitHub Release with auto-update support. Use when releasing Electron apps, creating DMG installers, setting up auto-update, or troubleshooting notarization issues. Use when this capability is needed.

- Skill: `tomevault-io/electron-release` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add tomevault-io/electron-release`
- Raw SKILL.md: https://api.skillmd.com/api/skills/tomevault-io/electron-release/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: tomevault-io (https://skillmd.com/u/tomevault-io)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/tomevault-io/electron-release

---


# Electron Release Guide

Complete release workflow for Electron applications with auto-update support.

## Supported Configurations

| Stack | Platform | Build Type | Status |
|-------|----------|------------|--------|
| Vite + electron-builder | macOS | Local | ✅ Documented |
| Other configurations | - | - | 📝 To be added |

## Quick Start (macOS + Vite + electron-builder)

```bash
# 1. Build with notarization
APPLE_KEYCHAIN_PROFILE=your-profile pnpm build:mac

# 2. Rename ZIPs (GitHub converts spaces to dots)
cp "dist/App Name-X.Y.Z-arm64-mac.zip" "dist/App-Name-X.Y.Z-arm64-mac.zip"
cp "dist/App Name-X.Y.Z-mac.zip" "dist/App-Name-X.Y.Z-mac.zip"

# 3. Create release with ALL files
gh release create vX.Y.Z \
  dist/latest-mac.yml \
  "dist/App-Name-X.Y.Z-arm64-mac.zip" \
  "dist/App-Name-X.Y.Z-mac.zip" \
  dist/app-name-X.Y.Z-arm64.dmg \
  dist/app-name-X.Y.Z-x64.dmg \
  --title "vX.Y.Z" --notes "Release notes..."
```

## Complete Workflow

### Phase 1: Pre-Release

1. **Update version** in `package.json`
2. **Commit version bump**:
   ```bash
   git add package.json
   git commit -m "chore(release): bump version to X.Y.Z"
   git push origin main
   ```

### Phase 2: Build

3. **Build with notarization**:
   ```bash
   APPLE_KEYCHAIN_PROFILE=your-profile pnpm build:mac
   ```

   | Env Var | Purpose |
   |---------|---------|
   | `APPLE_KEYCHAIN_PROFILE` | Keychain profile for notarization |
   | Alternative: `APPLE_ID`, `APPLE_APP_SPECIFIC_PASSWORD`, `APPLE_TEAM_ID` | Direct credentials |

4. **Verify build output**:
   ```bash
   ls -la dist/*.dmg dist/*.zip dist/*.yml
   ```

   Expected files:
   - `latest-mac.yml` - Auto-update metadata
   - `App Name-X.Y.Z-arm64-mac.zip` - ARM64 update payload
   - `App Name-X.Y.Z-mac.zip` - x64 update payload
   - `app-name-X.Y.Z-arm64.dmg` - ARM64 installer
   - `app-name-X.Y.Z-x64.dmg` - x64 installer

### Phase 3: Prepare Release Assets

5. **Rename ZIP files** (critical for auto-update):
   ```bash
   # GitHub converts spaces to dots, but latest-mac.yml expects hyphens
   cp "dist/App Name-X.Y.Z-arm64-mac.zip" "dist/App-Name-X.Y.Z-arm64-mac.zip"
   cp "dist/App Name-X.Y.Z-mac.zip" "dist/App-Name-X.Y.Z-mac.zip"
   ```

6. **Verify `latest-mac.yml` URLs match renamed files**:
   ```bash
   cat dist/latest-mac.yml
   # Check that 'url:' entries match your renamed ZIP filenames
   ```

### Phase 4: GitHub Release

7. **Create release with all required files**:
   ```bash
   gh release create vX.Y.Z \
     dist/latest-mac.yml \
     "dist/App-Name-X.Y.Z-arm64-mac.zip" \
     "dist/App-Name-X.Y.Z-mac.zip" \
     dist/app-name-X.Y.Z-arm64.dmg \
     dist/app-name-X.Y.Z-x64.dmg \
     --title "vX.Y.Z" \
     --notes "$(cat <<'EOF'
   ## What's Changed
   - Feature 1
   - Bug fix 2
   EOF
   )"
   ```

8. **Verify release assets**:
   ```bash
   gh release view vX.Y.Z --json assets --jq '.assets[].name'
   ```

## Required Files for Auto-Update

| File | Purpose | Missing = |
|------|---------|-----------|
| `latest-mac.yml` | Version + SHA512 hashes | "No updates available" |
| `*-arm64-mac.zip` | ARM64 update payload | Download fails on M1/M2/M3 |
| `*-mac.zip` | x64 update payload | Download fails on Intel |
| `*.dmg` | Manual download | No manual install option |

## Common Mistakes

| Mistake | Symptom | Fix |
|---------|---------|-----|
| DMG only, no ZIP | Auto-update silently fails | Upload all ZIP files |
| Missing `latest-mac.yml` | "No updates available" | Upload `latest-mac.yml` |
| Wrong ZIP filename | Download error | Rename to match `latest-mac.yml` URLs |
| No notarization env var | Gatekeeper blocks app | Set `APPLE_KEYCHAIN_PROFILE` |
| Spaces in filename | 404 on download | Rename: spaces → hyphens |

## Troubleshooting

### "Download error" on auto-update
```bash
# Check if filenames match
cat dist/latest-mac.yml | grep url:
gh release view vX.Y.Z --json assets --jq '.assets[].name'
# URLs in yml must exactly match asset names
```

### "No updates available"
```bash
# Verify latest-mac.yml is uploaded
gh release view vX.Y.Z --json assets --jq '.assets[].name' | grep yml
```

### Gatekeeper blocks app
```bash
# Rebuild with notarization
APPLE_KEYCHAIN_PROFILE=your-profile pnpm build:mac
# Check build log for "notarization successful"
```

## electron-builder.yml Reference

```yaml
mac:
  target:
    - target: dmg
      arch: [arm64, x64]
    - target: zip
      arch: [arm64, x64]
  notarize: true
  hardenedRuntime: true

publish:
  provider: github
  owner: your-org
  repo: your-repo
```

## Success Criteria

- [ ] Build completes with "notarization successful"
- [ ] All 5 files uploaded to GitHub Release
- [ ] ZIP filenames match `latest-mac.yml` URLs exactly
- [ ] Test: older version detects update
- [ ] Test: download and install succeeds

---
> Converted and distributed by [TomeVault](https://tomevault.io/claim/laststance) — claim your Tome and manage your conversions.
<!-- tomevault:4.0:skill_md:2026-04-13 -->

