Shipyard

Deployment SOP

Scripts, Fastlane lanes, and store workflows for shipping iOS and Android apps from Shipyard.

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:

  1. Screenshots — resize from screenshots-source/ and upload
  2. Metadata — validate lengths and push to App Store Connect
  3. Pre-flight — check Xcode version and current build number
  4. Build — run xcodebuild archive and generate .ipa
  5. 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

  1. Create the app with package:
com.currentlyremote.bomdia

This must match applicationId.

  1. Complete required declarations:
  • Data safety
  • Content rating
  • Ads declaration
  • Target audience
  1. 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/.

  1. In the bondia app 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.txt
  • short_description.txt
  • full_description.txt
  • changelogs/2.txt (matches versionCode 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 bundleRelease and 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

  • AndroidManifest includes <queries> for com.google.android.gms to help Google Sign-In visibility on newer Android versions.
  • package.json version is set to 1.0.0 to match Android versionName.

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_inch
    • iPhone_6.5_inch
    • iPhone_6.1_inch
    • iPhone_5.5_inch
    • iPad_Pro_12.9_inch
    • iPad_Pro_11_inch

screenshots-source/README.md

Explains the workflow:

  1. Put raw screenshots in screenshots-source/
  2. Run ./scripts/process-screenshots.sh
  3. 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:

  1. Put raw screenshots in screenshots-source/
  2. Run:
./scripts/process-screenshots.sh
  1. 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.sh
  • screenshots-source/

Then replace:

  • Appfile
  • metadata content
  • Fastfile app 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

StepWhat it does
ENSURECreates/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-AIRuns the AI script to generate description, release notes, and Android title / short / full description using a key from env or EatMe config
VERIFYChecks 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

  1. Add automated Play screenshot generation similar to iOS.
  2. Explicitly wire beta / production Play tracks in Fastlane.
  3. Expand fastlane-setup.ts so new apps can be bootstrapped automatically from a complete template.
  4. Standardize one template app (for example EatMe) as the canonical reference for all new app setups.