Knockoff Release Shipper
Shpigford/chops
Cuts a new Knockoff release by bumping the version, rolling release notes, tagging and shipping to the Chrome, Firefox and Apple stores with a per-store report.
Summarize mobile changes since the previous release, bump the Beancount mobile version, prepare localized release notes and listings, and release to the Apple App Store and Google Play.
$ npx skills add bex-co/beancount-io --skill mobile-release -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install bex-co/beancount-io mobile-release --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/bex-co/beancount-io.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/mobile-release .claude/skills/mobile-release && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "mobile-release" agent skill from https://github.com/bex-co/beancount-io/tree/main/.agents/skills/mobile-release into .claude/skills/mobile-release/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "mobile-release", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/bex-co/beancount-io/tree/main/.agents/skills/mobile-releaseType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add bex-co/beancount-io --skill mobile-release -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install bex-co/beancount-io mobile-release --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/bex-co/beancount-io.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/mobile-release .agents/skills/mobile-release && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "mobile-release" agent skill from https://github.com/bex-co/beancount-io/tree/main/.agents/skills/mobile-release into .agents/skills/mobile-release/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "mobile-release", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add bex-co/beancount-io --skill mobile-release -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install bex-co/beancount-io mobile-release --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/bex-co/beancount-io.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/mobile-release .cursor/skills/mobile-release && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "mobile-release" agent skill from https://github.com/bex-co/beancount-io/tree/main/.agents/skills/mobile-release into .cursor/skills/mobile-release/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "mobile-release", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/bex-co/beancount-io.git --path .agents/skills/mobile-release--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add bex-co/beancount-io --skill mobile-release -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install bex-co/beancount-io mobile-release --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/bex-co/beancount-io.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/mobile-release .gemini/skills/mobile-release && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "mobile-release" agent skill from https://github.com/bex-co/beancount-io/tree/main/.agents/skills/mobile-release into .gemini/skills/mobile-release/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "mobile-release", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install bex-co/beancount-io mobile-releaseInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add bex-co/beancount-io --skill mobile-release -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/bex-co/beancount-io.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/mobile-release .github/skills/mobile-release && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "mobile-release" agent skill from https://github.com/bex-co/beancount-io/tree/main/.agents/skills/mobile-release into .github/skills/mobile-release/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "mobile-release", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add bex-co/beancount-io --skill mobile-release -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install bex-co/beancount-io mobile-release --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/bex-co/beancount-io.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/mobile-release .opencode/skills/mobile-release && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "mobile-release" agent skill from https://github.com/bex-co/beancount-io/tree/main/.agents/skills/mobile-release into .opencode/skills/mobile-release/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "mobile-release", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
mobile-releaseSummarize mobile changes since the previous release, bump the Beancount mobile version, prepare localized release notes and listings, and release to the Apple App Store and Google Play.
Mobile Release is an agent skill from bex-co/beancount-io. Summarize mobile changes since the previous release, bump the Beancount mobile version, prepare localized release notes and listings, and release to the Apple App Store and Google Play. Use for $mobile-release or requests to cut a mobile store release. Skip ordinary code shipping, OTA-only updates, release-status questions, and requests to create or edit this skill.
Its SKILL.md is about 3.5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 4 other files (for example `agents/openai.yaml` and `evals/evals.json`).
It sits in Development, covering App store release and Changelog and release notes. It works with Git. The repository describes itself as: 💰 Double-entry bookkeeping made easy — plain-text accounting for humans and AI agents. Polished iOS & Android app built with React Native + Expo. The licence is MIT.
Read from SKILL.md and the folder at commit 2103ca1. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
yarngitFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
docs.expo.devgithub.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Mobile Release loads about 3.5k tokens when it runs. Until then it costs about 96 tokens; SKILL.md has 1,790 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from bex-co/beancount-io at commit 2103ca1, republished under its MIT licence (© bex-co). 1,790 words, ~3,485 tokens.
.claude/skills/mobile-release/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.Usage: $mobile-release [optional release context] (Claude Code: /mobile-release).
Carry a release through preparation, verification, shipping, and both stores. A release request authorizes the necessary store writes, build/submission jobs, and push to main. Naming individual steps — bump the version, write the release notes, cut the build — still requests the whole release: yarn bump exists only to cut one, and the release workflow is gated on a bumped-but-untagged version, so a bump that is not shipped strands the release half-done. Narrow the scope only on an explicit stop signal such as “prepare only”, “do not publish yet”, or “just the notes”; without one, carry through to both stores rather than stopping to confirm. Creating this skill does not invoke it. Do not ask again for authorization already given. Review concrete plans before recording approvals; never bypass the repository's release gates.
Locate the repository with git rev-parse --show-toplevel. Read root and mobile AGENTS.md, mobile/docs/app-store-localization.md, mobile/scripts/app-store-release.sh, mobile/scripts/play-release.sh, mobile/eas.json, and .github/workflows/deploy.yml. Run package commands inside mobile/; keep scratch artifacts in mobile/tmp/. Discover installed gh, asc, and the workflow's pinned EAS CLI capabilities with --help rather than assuming newer commands exist.
Inspect branch, staged and unstaged changes, and remote state. Fetch origin and tags. Preserve unrelated work; release only reviewed changes. Bring the release base up to date before preparing notes. Do not push a version bump until its store staging receipt is ready.
Find the previous reachable mobile tag using git describe --tags --match 'mobile-v*' --abbrev=0 HEAD. Compare that tag to the candidate release using mobile-scoped git log and git diff; inspect release workflow changes too. If no tag exists, label this a first release and inspect available mobile history. Tags from other packages are not a baseline.
Check GitHub release runs, EAS builds/submissions, App Store Connect versions, and Google Play tracks. A mobile-v<version> tag proves both EAS builds finished and their submissions completed, because the workflow waits for them; tags up to mobile-v1.20260912.48 were cut with --no-wait and only prove kickoff. A tag does not prove either store is live. Report any difference between the tag baseline and the last live version; include still-unreleased changes in store notes when needed.
If the current version is untagged or has incomplete jobs, determine whether it is an existing release to resume before bumping. Do not create another version merely to retry. Do not edit an Apple version already in review; report the pending review as the blocker to a new release.
Verify credentials and access without printing secrets. Check the effective Android submission profile, Google Play application identity, service-account access, production track, release status, and review settings. submit.production.android currently targets production with completed release status; verify service-account access separately because the profile does not contain a local key path. Resolve needed non-secret configuration within release scope, or identify the precise missing access. Never substitute a testing track for the requested production release.
Check the iOS scene life cycle before an iOS store build. UIKit requires the scene-based life cycle for apps built with the iOS 27 SDK (Xcode 27), and Expo adopted it in expo 58.0.0-preview.0 (expo/expo#46733). Apps on an earlier SDK fail to launch when built with that SDK (expo/expo#46663). Read the expo version in mobile/package.json, and confirm which Xcode the production EAS build will use: mobile/eas.json pins no iOS image, so EAS picks its default image for the SDK. If that build would use the iOS 27 SDK or newer while expo is below 58, stop before bumping and report the SDK upgrade as the release blocker. Do not hand-write UIApplicationSceneManifest into app.json: without the matching delegate adoption it fails worse, and prebuild reverts it. After an SDK upgrade, confirm a cold-launch native iOS log no longer reports UIScene lifecycle will soon be required.
Write concise user-facing release notes grounded in the inspected diff: features, fixes, and material behavior changes. Omit internal churn and unsupported claims. Show the baseline tag/SHA and candidate SHA, and keep the summary for the final report and commit context.
For a new release, run yarn bump once. Use the version it emits: this repository uses 1.YYYYMMDD.build, not a conventional patch increment. Inspect all generated changes, including native versions when present. For a resumed release, retain its version and completed preparation.
Fill every metadata/version/<version>/<locale>.json whatsNew using the same factual summary, translated using shipped terminology and metadata/store-locales.json. Preserve stable listing copy unless the release warrants a change. Keep template whatsNew blank. Fill the Android changelog emitted by the bump script, if present; inspect the actual script/output rather than assuming the legacy fastlane directory exists or is uploaded by EAS. Ensure the same notes are applied to the Google Play release through available authenticated tooling.
EAS uses remote native build numbers with auto-increment. Inspect the actual resulting iOS build number and Android version code; do not assume they equal the local suffix when selecting builds or attaching Android notes.
Set GOOGLE_PLAY_SERVICE_ACCOUNT to the local JSON key path used by EAS Submit, without printing the key or token. Run yarn play:baseline, inspect tmp/play-baseline/baseline.json, and record the actual locale coverage. Do not assume the existing listing is English-only. Baseline reads create and delete an uncommitted edit; avoid concurrent Play edits with that account.
Run yarn play:generate after the bump and baseline review. It derives metadata/play/<locale>.json from canonical app-info/version metadata, using metadata/play-source/bg.json and fa.json for the languages Apple cannot offer. The result must cover all 16 Play locales / 13 runtime languages. Regenerate after any canonical listing change. Keep the baseline and credentials ignored; commit only the generated public copy and its canonical inputs.
Run yarn format:check, yarn test, and yarn metadata:validate. Fix release-related failures and inspect any lint autofixes. Build and validate screenshots using yarn screenshots:build and yarn screenshots:validate; use the public demo sources, never a private ledger.
Follow the current release helper and localization guide. The required order is below; replace <version> with the actual target. Repeating the version is the helper's confirmation mechanism, not a reason to solicit authorization again.
./scripts/app-store-release.sh create <version> <version>
./scripts/app-store-release.sh plan <version>
# Inspect metadata/plan.md, metadata/keywords-plan.md, and screenshots/index.html
# under mobile/.asc/releases/<version>/; visually inspect generated screenshots.
./scripts/app-store-release.sh approve <version> <version>
./scripts/app-store-release.sh apply-metadata <version> <version>
./scripts/app-store-release.sh plan-screenshots <version>
# Inspect the separate screenshot replacement/order plan before applying.
./scripts/app-store-release.sh apply-screenshots <version> <version>
./scripts/app-store-release.sh verify <version>
yarn store:staging-checkInspect helper assumptions before using it (including its metadata-copy source and automatic release setting). The verification writes metadata/releases/<version>.json bound to the exact listing inputs. Never fabricate or hand-edit that receipt. If any bound input changes afterward, repeat the affected plan/review/apply and parity verification. Keep .asc/, generated screenshots, credentials, and raw remote responses out of Git.
If authorization is actually missing, finish all possible local preparation first, present the target version, notes, intended store actions, and available plans, then ask only for the missing scope. Cite the precise applicable instruction if it requires additional human approval. Do not claim to have obtained operator approval that was never given.
After building and validating all screenshots, run ./scripts/play-release.sh plan-play (also the default command). It uses the recorded baseline without credentials or network access and writes tmp/play-release/plan.txt and plan.json. Review every locale's title, short/full description diff, and ordered phone screenshots/feature graphic. Visually inspect the generated Play images, including Persian text shaping.
Run ./scripts/play-release.sh apply-play <plan-sha256> with the exact SHA-256 printed by the reviewed plan, within the release authorization already given. The helper checks for changed local inputs and remote baseline drift, updates only listing text and the phone/feature images, validates, and commits. It refuses to cancel another review in progress. It then checks all 16 locales' text and image checksums; rerun ./scripts/play-release.sh verify-play to repeat that read-only parity check. After drift, pull a new baseline and review a new plan rather than bypassing the check.
API parity does not prove publication. Check the review/publishing state in Play Console and sample the public listings, including Bulgarian and Persian. If review is pending, report that state and resume verification when it completes. Do not manage tracks or release notes through the listing helper; those remain part of the platform release steps below.
Review the final diff and run the required secret scan before pushing. Use the repository's ship skill for the reviewed release files, including notes and staging receipt. If rebasing changes release contents or bound inputs, update the notes, repeat affected checks and parity verification before the push.
The main push triggers Release (mobile): checks → receipt verification → production OTA → EAS builds for both platforms with auto-submit, waiting for builds and submissions → tag/GitHub release. Use this workflow as the single build kickoff; do not also start duplicate local builds. Locate the run for the shipped SHA with gh, follow it, and capture the exact EAS build and submission IDs for both platforms. Poll long jobs in bounded waits while giving progress updates.
Complete each store's remaining steps with available authenticated tools, checking current CLI help/documentation:
Use Expo iOS submission documentation, submission automation, and EAS configuration to verify current store semantics when needed; prefer the repository-pinned CLI's supported commands.
On failure, inspect status/logs before retrying. Resume the failed platform or step using its exact build ID; never use submit --latest, delete a release tag to retrigger everything, or rebuild the successful platform unnecessarily. Rerun the workflow only after checking for in-flight jobs and whether the tag gate will skip deployment. A tagged release with a failed submission needs targeted recovery. After a retry encounters the same unresolved failure, stop retrying and report the required fix; do not create endless paid builds.
Finish all automatable steps. If store review is pending, report it explicitly with links and the next action; do not wait indefinitely or call it live. If credentials, mandatory store answers, or an unavailable console action block completion, name the exact action and continue independent work on the other platform.
Return the version and baseline, a short change summary, shipped SHA and workflow link, checks performed, and separate iOS/Android statuses with build/submission links. Distinguish build queued, uploaded, submitted for review, approved, and live. Claim both stores released only when both production states have been verified. Report an unfinished run as unfinished, leading with where it stopped and the next required step; never present preparation — a bump, localized notes, or green checks — as a release.
© bex-co, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 2 other files in .agents/skills/mobile-release of bex-co/beancount-io.
Open the folder on GitHubat commit 2103ca1
Mobile Release next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Mobile Release this skillbex-co/beancount-io | 295 | — | ~3.5k | Automated safety check: Pass | MIT | |
| Knockoff Release ShipperShpigford/chops | 1.9k | — | ~1.2k | Automated safety check: Notes | Custom licence | |
| App Store Changelogharperreed/dotfiles | 334 | 4 repos | ~465 | Automated safety check: Pass | None | |
| Releasevaayne/mori | 303 | — | ~1.2k | Automated safety check: Pass | MIT | |
| Asc Whats New WriterCamilleScholtz/swmpc | 239 | 5 repos | ~1.8k | Automated safety check: Pass | EUPL-1.2 | |
| Happy Monorepo Releaseslopus/happy | 24k | — | ~6.6k | Automated safety check: Pass | MIT |
Shpigford/chops
Cuts a new Knockoff release by bumping the version, rolling release notes, tagging and shipping to the Chrome, Firefox and Apple stores with a per-store report.
harperreed/dotfiles
Create user-facing App Store release notes by collecting and summarizing all user-impacting changes since the last git tag (or a specified ref).
vaayne/mori
Release workflow for Mori macOS workspace terminal and MoriRemote iOS app.
CamilleScholtz/swmpc
Generate engaging, localized App Store release notes (What's New) from git log, bullet points, or free text using canonical metadata under ./Store.
slopus/happy
Walks you through releasing a component of the Happy monorepo (CLI, mobile, web or server) from a clean local main that matches origin/main.
jillesvangurp/kt-search
A skill your agent uses when the user wants to cut, publish, tag, or create a GitHub release for kt-search, especially when the task includes version bumping, validating that commits are pushed…
bex-co/beancount-io
Close an accounting period in a Beancount ledger by reconciling each active account through beancount-reconcile, checking assertions and recurring gaps, reviewing flags, then proposing a commit with…
bex-co/beancount-io
Import a bank or card CSV, OFX/QFX, or QIF export into an existing Beancount ledger.
bex-co/beancount-io
Write or repair a reusable Beangulp importer from a sample bank export, with reviewed golden files and a passing test harness.
bex-co/beancount-io
Scaffold a new Beancount ledger with bea init and validation, with optional Fava browser setup when requested.
bex-co/beancount-io
Record a described options trade or lifecycle event as validated Beancount transactions through bea, after review and confirmation.
bex-co/beancount-io
Reconcile one Beancount account against a CSV statement or pasted PDF text.
Works with
Categories
Summarize mobile changes since the previous release, bump the Beancount mobile version, prepare localized release notes and listings, and release to the Apple App Store and Google Play. Mobile Release is an agent skill from bex-co/beancount-io. Summarize mobile changes since the previous release, bump the Beancount mobile version, prepare localized release notes and listings, and release to the Apple App Store and Google Play.
Mobile Release fits situations like: $mobile-release; requests to cut a mobile store release.
Run `npx skills add bex-co/beancount-io --skill mobile-release -a claude-code`. Or copy the skill folder (.agents/skills/mobile-release in bex-co/beancount-io) into .claude/skills/mobile-release in your project. Claude Code loads it when a task matches its description.
Run `npx skills add bex-co/beancount-io --skill mobile-release -a codex`. Or copy the skill folder (.agents/skills/mobile-release in bex-co/beancount-io) into .agents/skills/mobile-release in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add bex-co/beancount-io --skill mobile-release -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/mobile-release, .gemini/skills/mobile-release, .github/skills/mobile-release and .opencode/skills/mobile-release in your project.
Going by SKILL.md and its folder, Mobile Release needs the command-line tools its instructions call (yarn and git).
SKILL.md names 2 domains. As links in the text: docs.expo.dev and github.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Mobile Release is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.5k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Mobile Release: Knockoff Release Shipper (Shpigford/chops, 1.9k stars), App Store Changelog (harperreed/dotfiles, 334 stars), Release (vaayne/mori, 303 stars) and Asc Whats New Writer (CamilleScholtz/swmpc, 239 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
bex-co (a GitHub organization) maintains it in bex-co/beancount-io, which has 295 GitHub stars. The repository holds 27 skills in this directory. The repository was last updated on October 7, 2026.
Source: bex-co/beancount-io on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.