baoyu-electron-extract
- Use it when:
- You want to read how a desktop Electron app, such as Codex or VS Code, is built.
- It does:
- Finds the app's app.asar bundle on macOS or Windows, unpacks it, then rebuilds sources from .js.map files or runs Prettier on minified code.
- You get:
- A folder in ~/Downloads with the raw contents, the restored source tree when maps allow, and a JSON report.
- Needs:
- Bun or npx; it fetches asar and Prettier through npx on first run.
- Leaves alone:
- node_modules, and any non-empty output folder unless you pass --force.
TL;DR
A wrapper around one bundled script. You give it an app name or a path to the .app, install folder or .asar file; it searches /Applications and ~/Applications on macOS and the usual program folders on Windows, and asks you to choose when several match. On Linux you pass the .asar path yourself. A dry run prints what it found without writing anything. The output folder, ~/Downloads/<AppName>-electron-extract/ by default, holds extracted/ with the raw bundle, extracted.unpacked/ with native modules and large assets when present, restored/ with the original source tree when a source map embeds its sources, and extract-report.json with counts and warnings. Where no usable map exists, JavaScript and CSS are formatted in place with Prettier instead. Restored paths are kept inside restored/, and it refuses to write to /, your home folder or the current directory.
Summarizes the skill at ca703c2.
npx skills add https://github.com/jimliu/baoyu-skills --skill baoyu-electron-extract skills.sh pageSource on GitHubAll skills from jimliu/baoyu-skills
- Total Downloads
- 8,200 on skills.sh, Nov 9, 2026
- Repo stars
- 27,397 jimliu/baoyu-skills
- First seen
- May 24, 2026 on skills.sh
Weekly values
| Week to | Installs |
|---|---|
| Sep 21 | 267 |
| Sep 28 | 99 |
| Oct 5 | 85 |
| Oct 12 | 145 |
| Oct 19 | 129 |
| Oct 26 | 139 |
| Nov 2 | 151 |
| Nov 9 | 170 |
| Category |
Compliance, guardrails, skill vetting and browser fingerprinting. Everything for building software: planning, coding, debugging, design, frameworks, cloud, agents and skills. |
|---|---|
| Type |
Operates a CLI, API, app or bundled script to get something done. |
| Effect |
Its own steps create or change files, git state or local tools. |
| Needs |
A specific command-line tool or desktop app must be installed, such as gh, agent-browser, LibreOffice, Obsidian or a vendor CLI. |
| Publisher |
Everyone else. Unverified vendor claims default to community. |
| Topics | |
| Stack |
SKILL.md
From jimliu/baoyu-skills at ca703c2. Checked daily, last changed Nov 6, 2026.
Frontmatter
name: baoyu-electron-extract
description: Extracts resources and JavaScript from any installed Electron app (`.asar` bundle), restoring original sources from `.js.map` files when available or formatting minified code with Prettier otherwise. Use when user wants to "extract Electron app", "decompile Electron", "get the source code of <app>", "inspect app.asar", "看 Electron 应用源码", "提取 .asar", or asks how a desktop Electron app is built. Skips `node_modules` and supports both macOS and Windows.
version: 1.119.0
metadata:
openclaw:
homepage: https://github.com/JimLiu/baoyu-skills#baoyu-electron-extract
requires:
anyBins:
- bun
- npxElectron App Extract
User Input Tools
When this skill prompts the user, follow this tool-selection rule (priority order):
- Prefer built-in user-input tools exposed by the current agent runtime — e.g.,
AskUserQuestion,request_user_input,clarify,ask_user, or any equivalent. - Fallback: if no such tool exists, emit a numbered plain-text message and ask the user to reply with the chosen number/answer for each question.
- Batching: if the tool supports multiple questions per call, combine all applicable questions into a single call; if only single-question, ask them one at a time in priority order.
Concrete AskUserQuestion references below are examples — substitute the local equivalent in other runtimes.
Script Directory
{baseDir} = this SKILL.md's directory. Resolve ${BUN_X}: bun if installed; else npx -y bun; else suggest installing bun. Replace {baseDir} and ${BUN_X} with actual values.
| Script | Purpose |
|---|---|
scripts/main.ts |
App discovery + asar extraction + source-map restoration + Prettier formatting |
Workflow
1. Determine the input. Accepts an app name (e.g., Codex) or absolute path (/Applications/Codex.app, a .asar file, or a Windows install dir). Ask for it if not given; ask for a custom output directory if they want one.
2. Run the script.
${BUN_X} {baseDir}/scripts/main.ts "<app>" [--output <dir>] [--asar <path>] [--force]
If unsure discovery will find the right bundle, run with --dry-run first (prints resolved paths, writes nothing).
3. Handle the result.
- Success → report output paths and counts (extracted / restored / formatted).
- Multiple matches → script lists candidates and exits non-zero. Ask the user which one (via
AskUserQuestionor the runtime equivalent), then re-run with the chosen absolute path. - Existing non-empty output dir → script refuses without
--force. Ask whether to overwrite (--force) or pick a new--output. - Unsupported platform / no match → suggest
--asar /full/path/to/app.asarif the user knows where the bundle lives.
4. Point the user at the result (default ~/Downloads/<AppName>-electron-extract/):
restored/exists → original source tree reconstructed from.js.mapfiles; read this first.- Only
extracted/(no maps) → JS/CSS inextracted/was Prettier-formatted in place; read from there.
Usage
${BUN_X} {baseDir}/scripts/main.ts Codex # → ~/Downloads/Codex-electron-extract/
${BUN_X} {baseDir}/scripts/main.ts "/Applications/Visual Studio Code.app" # .app bundle, install dir, or .asar
${BUN_X} {baseDir}/scripts/main.ts "C:\Users\you\AppData\Local\Programs\codex"
${BUN_X} {baseDir}/scripts/main.ts --asar /Applications/Codex.app/Contents/Resources/app.asar Codex
${BUN_X} {baseDir}/scripts/main.ts Codex --output ~/work/codex-source
${BUN_X} {baseDir}/scripts/main.ts Codex --json # one JSON line on stdout
Options
| Option | Short | Description | Default |
|---|---|---|---|
<app> |
App name or absolute path. Required unless --asar is given. |
— | |
--output |
-o |
Output directory | ~/Downloads/<AppName>-electron-extract |
--asar |
Override the resolved .asar path |
auto-discovered | |
--force |
-f |
Allow writing into a non-empty existing output dir | false |
--skip-format |
Skip Prettier formatting | false | |
--skip-restore |
Skip source-map restoration | false | |
--no-unpacked |
Don't copy app.asar.unpacked/ alongside |
false | |
--dry-run |
Print resolved paths and exit without writing | false | |
--json |
Emit one JSON-line summary on stdout (suppresses normal output) | false |
Output layout
~/Downloads/<AppName>-electron-extract/
├── extract-report.json # JSON summary: counts, warnings, resolved paths
├── extracted/ # raw asar contents (JS/CSS Prettier-formatted when no map)
│ └── ... # node_modules left untouched (skipped from format)
├── extracted.unpacked/ # copied from <asar>.unpacked/ if present
│ └── ... # native modules (.node), large assets
└── restored/ # only present if at least one .js.map was usable
└── <original/source/tree> # rebuilt from sourcesContent in each .js.map
Source-Map Path Restoration
Original source names and directory structure are preserved as far as the map allows:
- Each
sources[]entry resolves withsourceRootwhen present, then relative to the.js.mapfile's directory insideextracted/— e.g..vite/main/index.js.map+../../src/main.ts→restored/src/main.ts. ../segments are not treated as automatically unsafe: resolve from the map location first, then sanitize the final path so it stays underrestored/. A path climbing aboveextracted/keeps its readable remainder —.vite/main/index.js.map+../../../shared/src/lib/foo.ts→restored/shared/src/lib/foo.ts.- URL/query decorations are stripped (
webpack://,file://,?loadersuffixes). restored/__unknown/<hash>.<ext>only when the source name is empty or can't be reduced to a safe file path.node_modulesandwebpack/runtime/*entries are skipped (bundler/runtime noise).
Notes
- node_modules is always skipped, for both source-map restoration and Prettier formatting.
- Restoration needs embedded
sourcesContent(common for webpack, esbuild, Vite, rollup). Maps referencing external files without embedding them are skipped and the.jsis Prettier-formatted instead; skipped maps appear inextract-report.jsonunderwarnings. - App discovery: macOS
/Applications+~/Applications; Windows%LOCALAPPDATA%\Programs,%PROGRAMFILES%,%PROGRAMFILES(X86)%,%APPDATA%. Multiple matches → script exits and lists them; re-run with an absolute path. Linux/other: pass--asar /path/to/app.asar. - Safety: refuses to write to
/, the user home directly, or the current working directory, and refuses to populate an existing non-empty output dir without--force. - No global installs:
@electron/asarandprettierresolve on-the-fly vianpx -y; first run is slower while npx caches them.