Build a release APK and a simulator .app file locally for a React Native Expo app using gradlew and xcodebuild. Use when the user wants to produce installable artifacts without EAS (for e2e testing, sharing a build with a teammate, or quick iteration on a real device/simulator). Generates two shell scripts wired up to the user's actual app name, scheme, and bundle identifier.
npx skills add https://github.com/Code-with-Beto/skills --skill local-build
Generate two shell scripts that build release artifacts for an Expo / React Native project using the platform toolchains directly:
scripts/build-android.sh → runs ./gradlew assembleRelease and copies the APK into builds/scripts/build-ios.sh → runs xcodebuild for the iOS Simulator and copies the .app into builds/Both scripts replace the previous artifact on each run, so the output path is always predictable.
Why this exists: Debug builds on an Expo project include expo-dev-client and launch the "Development Servers" picker instead of the app UI. For e2e runs, teammate previews, or real device installs, you need a Release build, and that's what these scripts produce.
Before doing anything else, verify the current directory is an Expo/React Native project:
package.json with expo in dependencies.app.json or app.config.ts / app.config.js.If neither exists, stop and tell the user the skill only works inside an Expo project.
The scripts need three values specific to the user's project. Do not hardcode "YourApp" or assume any name. Read them from the config.
| Value | Where to find it | Used for |
|-------|------------------|----------|
| name | app.config.ts / app.config.js / app.json → expo.name | iOS scheme and .app filename |
| slug | expo.slug | APK filename (fallback: lowercased name) |
| ios.bundleIdentifier | expo.ios.bundleIdentifier | xcrun simctl launch command |
| android.package | expo.android.package | adb shell am start command |
app.json — plain JSON, parse directly. The top-level key is usually expo.app.config.ts / app.config.js — exports a function that returns the config. Read the file and extract the literal values from the returned object. Do not try to execute it. If a value is computed dynamically, ask the user what to use.The iOS scheme file is generated from expo.name during expo prebuild. Confirm it's there before wiring it into the script:
ls ios/*.xcworkspace 2>/dev/null
ls ios/*.xcodeproj/xcshareddata/xcschemes/*.xcscheme 2>/dev/null
The .xcworkspace name and the .xcscheme filename (without the extension) are what you pass to xcodebuild -workspace and -scheme. They usually match expo.name, but if they don't, use what's on disk.
If ios/ or android/ doesn't exist yet, run:
npx expo prebuild
Then re-check the scheme.
Write scripts/build-android.sh. Replace <SLUG> with the value from Step 1.
#!/usr/bin/env bash
set -euo pipefail
HERE="$(cd "$(dirname "$0")" && pwd)"
ROOT="$(cd "$HERE/.." && pwd)"
ARTIFACT="$ROOT/android/app/build/outputs/apk/release/app-release.apk"
DEST_DIR="$ROOT/builds"
DEST="$DEST_DIR/<SLUG>.apk"
echo "==> Building Android release APK"
cd "$ROOT/android"
./gradlew assembleRelease
if [ ! -f "$ARTIFACT" ]; then
echo "Build did not produce $ARTIFACT" >&2
exit 1
fi
mkdir -p "$DEST_DIR"
rm -f "$DEST"
cp "$ARTIFACT" "$DEST"
echo "Done: $DEST"
Notes:
assembleRelease is required. assembleDebug launches expo-dev-client instead of the app.Write scripts/build-ios.sh. Replace <SCHEME> with the value from Step 1 (it's the same string used for -workspace <SCHEME>.xcworkspace and -scheme <SCHEME>, and the output file is <SCHEME>.app).
#!/usr/bin/env bash
set -euo pipefail
HERE="$(cd "$(dirname "$0")" && pwd)"
ROOT="$(cd "$HERE/.." && pwd)"
ARTIFACT="$ROOT/ios/build/Build/Products/Release-iphonesimulator/<SCHEME>.app"
DEST_DIR="$ROOT/builds"
DEST="$DEST_DIR/<SCHEME>.app"
echo "==> Building iOS Simulator .app (Release)"
cd "$ROOT/ios"
xcodebuild \
-workspace <SCHEME>.xcworkspace \
-scheme <SCHEME> \
-configuration Release \
-sdk iphonesimulator \
-derivedDataPath build \
CODE_SIGNING_ALLOWED=NO \
-quiet
if [ ! -d "$ARTIFACT" ]; then
echo "Build did not produce $ARTIFACT" >&2
exit 1
fi
mkdir -p "$DEST_DIR"
rm -rf "$DEST"
cp -R "$ARTIFACT" "$DEST"
echo "Done: $DEST"
Notes:
-sdk iphonesimulator produces a simulator .app. It will not run on a physical device.CODE_SIGNING_ALLOWED=NO is safe for simulator builds and avoids the need for a signing identity..app is a directory bundle, not a file, so cp -R is required.chmod +x scripts/build-android.sh scripts/build-ios.sh
builds/ to .gitignoreAppend this to .gitignore (check it's not already there):
# Local build artifacts
builds/
Give the user this summary:
Built two scripts for you:
./scripts/build-android.sh → builds/<slug>.apk
./scripts/build-ios.sh → builds/<scheme>.app
Install and run:
# Android (connected device or emulator)
adb install -r builds/<slug>.apk
adb shell am start -n <android.package>/.MainActivity
# iOS Simulator
xcrun simctl boot "iPhone 16" 2>/dev/null; open -a Simulator
xcrun simctl install booted builds/<scheme>.app
xcrun simctl launch booted <ios.bundleIdentifier>
Substitute the real values from Step 1 when producing the message so the user can copy/paste directly.
expo-dev-client, which is the launcher screen with the "Development Servers" list. For anything where you want the real UI, you need Release.eas build or manual Xcode archive.eas build.app.config.ts / app.json and verify against files on disk.The xcodebuild or gradlew command succeeded but the artifact isn't where the script expects. Usually means:
ios/*.xcworkspace and ios/*.xcodeproj/xcshareddata/xcschemes/)derivedDataPath or output directory is configured in a build-script or Gradle overridexcodebuild: error: The workspace ... does not existRun npx expo prebuild to regenerate ios/. If you already have an ios/ folder but no workspace, the CocoaPods install likely failed — run cd ios && pod install.
The script ran assembleDebug somewhere in the chain. Make sure Step 2's script calls assembleRelease.
.app opens and shows "Development Servers"Same issue on iOS — the script was built with -configuration Debug instead of Release. Check Step 3's script.
xcrun simctl install says "incorrect executable format"The user tried to open the .app directly on macOS. Simulator .app bundles only run inside xcrun simctl, not as a macOS application. Use the xcrun simctl install booted <path> command.
Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.
Use when implementation is complete, all tests pass, and you need to decide how to integrate the work - guides completion of development work by presenting structured options for merge, PR, or cleanup
Use when implementing any feature or bugfix, before writing implementation code
Use when encountering any bug, test failure, or unexpected behavior, before proposing fixes
Use when about to claim work is complete, fixed, or passing, before committing or creating PRs - requires running verification commands and confirming output before making any success claims; evidence before assertions always
Expert guidance for systematic backtesting of trading strategies. Use when developing, testing, stress-testing, or validating quantitative trading strategies. Covers "beating ideas to death" methodology, parameter robustness testing, slippage modeling, bias prevention, and interpreting backtest results. Applicable when user asks about backtesting, strategy validation, robustness testing, avoiding overfitting, or systematic trading development.
Cloud laboratory platform for automated protein testing and validation. Use when designing proteins and needing experimental validation including binding assays, expression testing, thermostability measurements, enzyme activity assays, or protein sequence optimization. Also use for submitting experiments via API, tracking experiment status, downloading results, optimizing protein sequences for better expression using computational tools (NetSolP, SoluProt, SolubleMPNN, ESM), or managing protein design workflows with wet-lab validation.
This skill should be used for time series machine learning tasks including classification, regression, clustering, forecasting, anomaly detection, segmentation, and similarity search. Use when working with temporal data, sequential patterns, or time-indexed observations requiring specialized algorithms beyond standard ML approaches. Particularly suited for univariate and multivariate time series analysis with scikit-learn compatible APIs.
Take code-with-beto/local-build from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.
The instructions reference npx.
Without those the skill loads but fails at the first command.