28 desktop launcher review
Skill FluxonLab/Skillry/plugins/mobile-desktop/skills/28-desktop-launcher-review
Use when you need to review local desktop launchers, shortcuts, shell scripts, app wrappers, logging, and update safety.From its SKILL.md
npx -y skills add FluxonLab/Skillry --skill 28-desktop-launcher-reviewAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 2 stars2 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
9.8 KB, ~2.2k tokens by cl100k_base, as published. Nobody here has run it
Desktop Launcher Review
Purpose
Review local desktop launchers, shortcuts, shell scripts, app wrappers, logging, and update safety for packaged desktop apps (Electron, Electron-Vite, Tauri, and similar). The core obligation is fail-closed: if the packaged build is missing or stale, the launcher must refuse to open an older app and report the failing command — never silently fall back to a previous build. The output names the launch mode, a freshness verdict, the fail-closed assessment, script issues with fixes, and the next safe command.
When to use
- A desktop launcher or shortcut script needs review before being handed to a non-technical user who will double-click it.
- The launcher is suspected to be pointing at a dev or hot-reload mode instead of the packaged production app.
- A build update was deployed but the launcher may still reference a stale
dist/orout/path — freshness must be verified. - Atomic pointer-swap or rollback safety for launcher updates has not been designed or is broken.
When not to use
- The task is unrelated to mobile and desktop work.
- The work would require production deploys, destructive data actions, or secret disclosure.
- The concern is renderer or runtime security rather than launch correctness — use the Electron security review for
contextIsolation, CSP, and IPC hardening. - A narrower skill or existing project instruction already covers the need.
Procedure
- Identify the launcher target. Determine whether the shortcut or script starts the packaged app or a dev/hot-reload mode (
electron .,electron-vite dev,npm run dev). The default expectation is the packaged app via the main launcher unless the user explicitly asked for dev mode. - Check build freshness. Compare the packaged output against source, lockfile, assets, env shape, and any
.launcher/build-manifest.jsonordist-app/currentpointer. If any source input is newer than the packaged build, treat it as stale and require a rebuild before launch. - Inspect the build and package pipeline and entrypoints. Read the build/package scripts, the Electron
main/preload/rendererentries, the output folder, and the launcher's actual target path. Confirm the entry paths declared inpackage.jsonor builder config exist inside the package. - Apply fail-closed. If the packaged app is missing or stale, run the repo's production build/package command first. If that build fails, do not open an older packaged app — report the failing command and the log path and stop.
- Review launcher script safety. Check strict mode, quoting, absolute versus relative paths, error handling, the log destination, and graceful shutdown of the spawned process.
- Review update safety. Confirm a new build is staged and then the pointer is swapped atomically, the previous build is retained for rollback, and a manifest records what is current.
Concrete checks
Target and freshness:
- The launcher points at the
dist/,out/, orrelease/packaged app, notelectron .dev mode unless dev was requested. - Source, asset, and lockfile mtimes are not newer than the packaged build.
.launcher/build-manifest.jsonexists and matches the current source;dist-app/currentpoints at the fresh build.
Entrypoints and script hygiene:
- The
mainandpreloadpaths inpackage.jsonor builder config exist inside the package. - Bash launchers use
set -euo pipefail; every path is quoted. - No hardcoded per-user home paths that break on another machine.
Logging, shutdown, update:
- The launcher writes to a stable, timestamped log path per project policy.
- stdout and stderr are captured, not discarded to
/dev/null. - Closing the launcher or the app cleans up child processes; no orphaned main process.
- Updates stage then swap the pointer atomically, retain the previous build, and update the manifest.
- A failed update leaves the previous working build intact and launchable.
Build correctness:
- The production build/package command is identified and runnable.
- The build output matches the launcher's expected target path.
- If the build fails, the launcher does not open any older app.
Commands
# --- launch mode ---
# is the launcher targeting packaged vs dev?
rg -n 'electron \.|electron-vite dev|npm run dev|\.app|dist|out|release' <launcher-script>
# --- build pipeline / entrypoints ---
# build pipeline + entry definitions
cat package.json | jq '{main, scripts, build}'
# entrypoint files actually exist inside the package?
rg -n '"main"|"preload"' package.json
# --- freshness ---
# any source newer than the packaged build pointer?
find src electron -newer dist-app/current -type f 2>/dev/null | head
# manifest present and what it records
cat .launcher/build-manifest.json 2>/dev/null | jq '.' 2>/dev/null
# --- script safety ---
# machine-specific paths, destructive ops, strict mode
rg -n '/Users/[a-z]+/|/home/[a-z]+/|rm -rf|set -e|set -euo pipefail' <launcher-script>
# log destination configured?
rg -n 'logfile|>>|tee|LOG_DIR|log_path' <launcher-script>
# --- shutdown / orphans ---
# child-process spawn and cleanup handling
rg -n 'spawn|exec|trap|kill|SIGTERM|on\(.close.' <launcher-script>
# --- renderer security (quick sanity, not a full audit) ---
# BrowserWindow webPreferences hardening
rg -n 'contextIsolation|nodeIntegration|webSecurity|sandbox' . | head
# --- update mechanism ---
# auto-update / pointer-swap logic
rg -n 'autoUpdater|checkForUpdates|symlink|rename\(|pointer' . | head
# --- code signing / notarization markers ---
# packaged-app signing config (presence, not contents)
rg -n 'codeSign|notarize|hardenedRuntime|entitlements' . | head
Common issues & anti-patterns
- Silent dev fallback: the launcher tries the packaged app, fails, and quietly runs
npm run devinstead — the user thinks they are testing the release build but are not. - Stale-build open: the pointer still references last week's
dist-app/, so source changes never reach the user even though the launcher "works". - Hardcoded home path: the script embeds a specific user home path, so it breaks the moment it runs on a different machine or account.
- No strict mode: a bash launcher without
set -euo pipefailkeeps going after a failed build step and opens a half-baked app. - Non-atomic update: the updater overwrites the live
dist-app/in place; a mid-write crash leaves a corrupt, unlaunchable app with no rollback. - Orphaned process: closing the launcher window leaves the Electron main process running, so the next launch spawns a duplicate.
- Logs to /dev/null: the launcher discards stdout and stderr, so when launch fails there is no evidence to diagnose.
- Unquoted path with spaces: an unquoted
$APP_DIRthat contains a space splits into multiple arguments and the launch silently targets the wrong path. - Hot-reload masquerading as production: the shortcut runs
electron-vite dev, so the user is unknowingly testing an unoptimized dev build with source maps and debug tooling. - No build-freshness gate: the launcher opens whatever is in
dist-app/with no check that it reflects current source, so fixes appear to "not work" because the old build still launches. - Manifest not updated on swap: the pointer is swapped but
build-manifest.jsonis left stale, so the freshness check and rollback logic read the wrong current version. - Renderer left unhardened: the launched window runs with
nodeIntegration: trueandcontextIsolation: false, so any renderer flaw becomes full local code execution. - No previous build retained: the updater deletes the old build before staging the new one, so a failed update leaves nothing to roll back to.
Verification steps
Before clearing a launcher for handoff, walk it through these explicit states and confirm the behavior:
- Fresh build present: the launcher opens the packaged app and writes a timestamped log entry.
- Stale build: with source newer than the build pointer, the launcher refuses to open and prompts a rebuild.
- Missing build: with no packaged output, the launcher reports the build command and does not fall back to dev.
- Failed build: with the build command erroring, the launcher reports the failing command and log path and opens nothing.
- Update rollback: after a simulated failed update, the previous build is still intact and launchable.
- Clean shutdown: closing the app or launcher leaves no orphaned main process.
Required output
Return:
- Launch mode: packaged versus dev, and whether it matches intent.
- Build-freshness verdict: fresh, stale, or missing, with the evidence used.
- Fail-closed assessment: would a stale or failed build still open an old app?
- Launcher script issues:
file:line | issue | fix. - Logging and update-safety findings.
- Next safe command: usually the production build or package.
Safety
- Never recommend opening an older packaged app when the current build is missing or its build failed — fail closed and report the failing command plus the log path.
- Do not run a destructive or long package build silently; recommend it and let the owner trigger it.
- No hardcoded machine-specific home paths — keep launchers portable across machines.
- Redact any secrets surfaced in launcher env or logs.
- Do not delete or overwrite an existing packaged build during review.
Completion criteria
Done means the launch mode is confirmed against intent; build freshness is judged from evidence; the fail-closed rule is verified (a stale or failed build cannot open an old app); launcher-script and update-safety issues are listed with file:line fixes; and the safe next command (build or package) is named.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.