Overview
This document explains the current Shipyard deployment workflow for iOS and Android, including metadata, screenshots, builds, uploads, Fastlane automation, and app setup patterns.
The help screen behavior is correct. exit 1 is expected when no arguments are supplied.
Core Shipyard Scripts
scripts/deploy-app-store.sh
Purpose: iOS metadata and screenshots only.
# Push description, keywords, screenshots to App Store Connect
bash scripts/deploy-app-store.sh bondia
scripts/deploy-build.sh
Purpose: Build iOS binary and upload.
Choose one command below (most common first):
1) TestFlight build
bash scripts/deploy-build.sh bondia beta
2) TestFlight build + metadata sync
bash scripts/deploy-build.sh bondia beta --with-metadata
3) Full release (metadata + build + App Store submission)
bash scripts/deploy-build.sh bondia release --with-metadata
What --with-metadata Does
Running:
bash scripts/deploy-build.sh bondia beta --with-metadata
chains both scripts in one command:
- Screenshots — resize from
screenshots-source/and upload - Metadata — validate lengths and push to App Store Connect
- Pre-flight — check Xcode version and current build number
- Build — run
xcodebuild archiveand generate.ipa - Upload — push to TestFlight or App Store
Release Mode Safety
release mode includes a confirmation prompt before bumping the version and submitting, so accidental submissions to Apple review are less likely.
Where to Run Commands
Always run Shipyard scripts from the Shipyard root:
cd /Volumes/CurrentEx/shipyard
Examples:
bash scripts/deploy-app-store.sh bondia
bash scripts/deploy-build.sh bondia beta
The scripts resolve all paths automatically from there.
Optional Terminal Alias
Add this to ~/.zshrc:
alias shipyard="cd /Volumes/CurrentEx/shipyard"
Reload:
source ~/.zshrc
Then use:
shipyard
bash scripts/deploy-app-store.sh bondia
Android / Play Console Requirements
Still required in Play Console
- Create the app with package:
com.currentlyremote.bomdia
This must match applicationId.
- Complete required declarations:
- Data safety
- Content rating
- Ads declaration
- Target audience
- Add:
- Screenshots
- Feature graphic
These are not currently in the repo. Add them manually in Play Console or automate later under fastlane/metadata/android/.../images/.
- In the
bondiaapp directory, run:
bundle install
Then use the metadata/internal lanes as needed.
Android Build Note
A bundleRelease run failed in this environment with what appears to be a tooling-specific Gradle / JVM instrumentation issue, not a problem caused by these script edits.
From apps/bondia/android, run locally:
./gradlew :app:bundleRelease
If it fails, fix the local JDK / Gradle setup.
Signing and Secrets
Required file
Copy:
android/keystore.properties.example
to:
android/keystore.properties
Then set storeFile to the upload keystore path relative to android/.
Git ignore
In bondia, .gitignore already ignores:
keystore.properties*.jks- Play JSON keys
Play Store Metadata Structure
English
fastlane/metadata/android/en-US/
Contains:
title.txtshort_description.txtfull_description.txtchangelogs/2.txt(matchesversionCode 2)
Brazilian Portuguese
fastlane/metadata/android/pt-BR/
Contains the same set.
Checklist
fastlane/metadata/android/checklist.txt
Contains one-time setup steps for:
- Play Console
- Firebase
- signing
- SHA-1
Fastlane Android Wiring
fastlane/Fastfile
Contains Android lanes for:
- android metadata — upload listing and changelogs
- android internal — run
bundleReleaseand upload AAB to the internal track
Both require:
GOOGLE_PLAY_JSON_KEY
pointing to a Play service account JSON file.
Gemfile
Fastlane has been added. Run:
bundle install
inside bondia.
Shipyard wrapper script
export GOOGLE_PLAY_JSON_KEY=...
./scripts/deploy-play-store.sh bondia metadata
./scripts/deploy-play-store.sh bondia internal
Docs
fastlane/README.md now includes a short Android section.
Other Android Updates
AndroidManifestincludes<queries>forcom.google.android.gmsto help Google Sign-In visibility on newer Android versions.package.jsonversion is set to1.0.0to match AndroidversionName.
iOS Fastlane Commands
# Download current metadata from App Store
bundle exec fastlane ios download_metadata
# Upload metadata to App Store
bundle exec fastlane ios upload_metadata
# Update release notes
bundle exec fastlane ios update_release_notes version:1.0.0 notes:"New features!"
# Release now automatically uploads metadata
bundle exec fastlane ios release
# Process screenshots
bundle exec fastlane ios process_screenshots
# Full screenshot update
bundle exec fastlane ios full_screenshot_update
# Deliver using an explicit metadata path
bundle exec fastlane deliver --skip_metadata --skip_binary_upload --metadata_path ./fastlane/metadata
Example:
cd /Volumes/CurrentEx/shipyard/apps/eatme
bundle exec fastlane ios upload_metadata
VinylBank Wiring (Like EatMe)
Added files
scripts/process-screenshots.sh
New executable script that:
-
uses
../../scripts/resize-screenshots.sh -
reads from
screenshots-source/ -
writes resized screenshots into
fastlane/screenshots/en-US/by device size:iPhone_6.7_inchiPhone_6.5_inchiPhone_6.1_inchiPhone_5.5_inchiPad_Pro_12.9_inchiPad_Pro_11_inch
screenshots-source/README.md
Explains the workflow:
- Put raw screenshots in
screenshots-source/ - Run
./scripts/process-screenshots.sh - Upload with Fastlane
fastlane/screenshots/en-US/iPhone_6.7_inch/
Added to support 6.7-inch output.
fastlane/screenshots/README.md was also updated to reflect the resize workflow.
VinylBank usage
From the vinylbank app root:
- Put raw screenshots in
screenshots-source/ - Run:
./scripts/process-screenshots.sh
- Upload:
fastlane ios metadata
Resizing is handled by the shared script at:
/Volumes/CurrentEx/shipyard/scripts/resize-screenshots.sh
Optional Automation Later
Extend generator
Extend:
server/services/fastlane-setup.ts
so “Setup Fastlane” or a CLI can generate a full EatMe-style layout from:
- app path
- bundle ID
- team ID
- optionally credentials
Manual way to complete one app
Use eatme or vinylbank as the template.
Copy:
fastlane/scripts/process-screenshots.shscreenshots-source/
Then replace:
Appfile- metadata content
Fastfileapp and scheme names
Afterward, re-run:
node scripts/audit-fastlane-apps.js
and confirm it shows ✅.
Ensure / Verify / Deploy Workflow
Commands
Ensure + verify + deploy only OK apps
node scripts/ensure-and-verify-fastlane.js --deploy
Verify only, then deploy OK apps
node scripts/ensure-and-verify-fastlane.js --verify-only --deploy
Fill metadata with AI
node scripts/ensure-and-verify-fastlane.js --fill-with-ai
node scripts/ensure-and-verify-fastlane.js --fill-with-ai --deploy
Status
node scripts/ensure-and-verify-fastlane.js --status
What this script does
| Step | What it does |
|---|---|
| ENSURE | Creates/checks Appfile (apple_id, team_id), iOS + Android metadata, support/privacy URLs (currentlyremote.com), screenshot dirs, process-screenshots.sh, and screenshots-source; copies EatMe screenshots if empty; runs process-screenshots.sh when source has images but no resized output unless SKIP_PROCESS_SCREENSHOTS=1 |
| FILL-WITH-AI | Runs the AI script to generate description, release notes, and Android title / short / full description using a key from env or EatMe config |
| VERIFY | Checks every app and reports OK or issues such as missing files, placeholders, URLs, or screenshots |
Deployment Tracking and Metadata Checklist
Deployment tracking
Deployment history is saved to:
.fastlane-deploy-status.json
Metadata checklist covers all Fastlane-submittable fields
Required
- name
- subtitle
- description
- keywords
- release_notes
- support_url
- privacy_url
Optional
- marketing_url
- promotional_text
Root fields
- copyright
- primary_category
- secondary_category
Screenshots
- all device sizes
App Review
- contact info
- demo credentials
Maintenance / Cleanup Commands
Clear Xcode, CocoaPods, simulator, and local caches
rm -rf ~/Library/Developer/Xcode/DerivedData/* \
~/Library/Caches/com.apple.dt.Xcode/* \
~/Library/Developer/Xcode/iOS\ DeviceSupport/* \
~/Library/Caches/CocoaPods/* \
~/.gem/ruby/*/cache/* \
~/Library/Caches/Homebrew/* \
~/.Trash/* 2>/dev/null
npm cache clean --force 2>/dev/null
xcrun simctl delete unavailable 2>/dev/null
Disk usage checks
dust -d 1 ~
du -sh ~/Library/Application\ Support/* 2>/dev/null | sort -hr | head -15
du -sh ~/Library/* 2>/dev/null | sort -hr | head -20
Separate Follow-Up Task
Track this separately from deployment notes:
apply the ~/.gemini/antigravity/skills/frontend-claude/SKILL.md to /Volumes/CurrentEx/shipyard/apps/NestMonitor
Most Common Commands
iOS metadata only
cd /Volumes/CurrentEx/shipyard
bash scripts/deploy-app-store.sh bondia
iOS TestFlight build
cd /Volumes/CurrentEx/shipyard
bash scripts/deploy-build.sh bondia beta
iOS TestFlight build with metadata sync
cd /Volumes/CurrentEx/shipyard
bash scripts/deploy-build.sh bondia beta --with-metadata
iOS full release
cd /Volumes/CurrentEx/shipyard
bash scripts/deploy-build.sh bondia release --with-metadata
Android metadata upload
export GOOGLE_PLAY_JSON_KEY=...
./scripts/deploy-play-store.sh bondia metadata
Android internal upload
export GOOGLE_PLAY_JSON_KEY=...
./scripts/deploy-play-store.sh bondia internal
Suggested Next Improvements
- Add automated Play screenshot generation similar to iOS.
- Explicitly wire beta / production Play tracks in Fastlane.
- Expand
fastlane-setup.tsso new apps can be bootstrapped automatically from a complete template. - Standardize one template app (for example EatMe) as the canonical reference for all new app setups.