laneup
v0.1.0-beta.1
Published
Bootstrap Fastlane setup for React Native projects
Maintainers
Readme
🚀 Laneup
Fastlane automation for React Native made simple - One password for all CI/CD secrets, auto-generated Android keystores, and zero-config deployment to TestFlight and Play Store.
Why Laneup?
Stop managing dozens of secrets across multiple CI providers. Laneup encrypts all your credentials with a single password, generates secure Android keystores automatically, and sets up Fastlane in minutes.
Features
- 🔐 One Password, All Secrets - Encrypt iOS certificates, Android keystores, and API keys with
LANEUP_PASSWORD. Commit encrypted files safely to git. - 🔑 Auto-Generate Keystores - Create production-ready Android keystores with proper distinguished names—no manual
keytoolcommands. - 🚀 Deploy in Minutes - From zero to TestFlight/Play Store deployment with guided prompts and auto-detected project settings.
- 🔄 Portable CI/CD - Switch between GitHub Actions, Bitrise, and CircleCI without reconfiguring secrets. All credentials are portable.
- 🍎 iOS Match Ready - Set up Fastlane Match for code signing with repository validation and automatic Matchfile generation.
- 📦 Multi-format Config - JavaScript, TypeScript, or JSON config with full IntelliSense support in VS Code.
- 🤖 Zero-Config CI - Generate GitHub Actions, Bitrise, or CircleCI configs that only need one secret:
LANEUP_PASSWORD. - 🔥 Firebase Built-in - Firebase App Distribution integration for beta testing without extra setup.
- 🏗️ Monorepo Friendly - Works from any directory in your monorepo with automatic project detection.
Installation
npm install -g laneup
# or
bun install -g laneupQuick Start
cd your-react-native-project
laneup initLaneup will:
- Detect your project structure (React Native/Expo, iOS/Android)
- Ask for LANEUP_PASSWORD if not set (used to encrypt all credentials)
- Parse bundle identifiers and package names automatically
- Generate Android keystore or import existing one (encrypted immediately)
- Set up iOS Match if needed
- Create Fastlane configuration files
- Generate encrypted credential storage
💡 One Password for Everything: Your
LANEUP_PASSWORDencrypts all credentials. Save it securely—it's the only secret you need in CI!
Commands
laneup init
Initialize Fastlane setup in your React Native project.
laneup init [options]
Options:
--ios Enable iOS platform
--android Enable Android platform
--ci <provider> CI provider (github-actions, bitrise, circleci)
--format <format> Config format (js, ts, json)laneup setup-stores
Set up App Store Connect and Google Play API credentials.
laneup setup-stores [options]
Options:
--update Update existing credentialsPrompts for:
- iOS: App Store Connect API Key (.p8 file), Key ID, Issuer ID, Match password
- Google Play: Service account JSON for publishing
- Firebase: CI token (if Firebase App Distribution is enabled)
laneup setup-ci
Generate CI configuration files.
laneup setup-ci [options]
Options:
--provider <provider> CI provider (github-actions, bitrise, circleci)
--force Overwrite existing CI configurationlaneup generate-lanes
Generate Fastfile from templates based on your configuration.
laneup generate-lanes [options]
Options:
--force Overwrite existing Fastfilelaneup validate-config
Validate Laneup configuration.
laneup validate-config [options]
Options:
--check-secrets Also validate encrypted secretslaneup show-keystore
Display Android keystore information (fingerprints, validity, etc.).
laneup show-keystoreRequires LANEUP_PASSWORD environment variable.
laneup docs
Generate documentation files.
laneup docsGenerates:
.laneup/FASTLANE_ENV_VARS.md- Environment variables reference.laneup/CREDENTIALS_SETUP.md- Step-by-step credential setup guide
laneup update
Check for Laneup updates.
laneup updateConfiguration
Laneup stores configuration in one of these files (priority order):
.laneup.config.ts.laneup.config.js.laneup.config.json
Example configuration:
import type { LaneupConfig } from 'laneup';
export default {
projectName: "MyApp",
ciProvider: "github-actions",
fastlaneVersion: "2.220.0",
encryption: {
method: "native",
},
platforms: {
ios: true,
android: true,
},
fastlaneOptions: {
ios: {
enableAutomaticCodeSigning: true,
useMatch: true,
matchConfig: {
gitUrl: "[email protected]:company/certificates.git",
gitBranch: "main",
storageMode: "git",
},
},
android: {
gradleTask: "assembleRelease",
keystoreEncrypted: true,
keystoreAlias: "release",
},
},
lanes: {
beta: { ios: true, android: true },
release: { ios: true, android: true },
},
firebase: {
enabled: true,
appId: {
ios: "1:123456:ios:abc",
android: "1:123456:android:def",
},
},
plugins: [],
} satisfies LaneupConfig;Security
Encryption
Laneup encrypts sensitive data using:
- Algorithm: AES-256-GCM
- Key Derivation: PBKDF2 with 100,000 iterations
- Salt: 32 bytes (unique per file)
- IV: 16 bytes (unique per encryption)
Environment Variables
Set LANEUP_PASSWORD to encrypt/decrypt credentials:
export LANEUP_PASSWORD="your-secure-password"In CI environments, add LANEUP_PASSWORD as a secret.
Encrypted Files
.laneup/secrets/credentials.enc- Encrypted credentials (commit to repo).laneup/secrets/keystore.enc- Encrypted Android keystore (commit to repo)
Never commit:
.laneup/temp/directory (contains decrypted files)
CI Integration
GitHub Actions
- name: Decrypt credentials
run: laneup decrypt-credentials
env:
LANEUP_PASSWORD: ${{ secrets.LANEUP_PASSWORD }}
- name: Build iOS
run: bundle exec fastlane ios betaBitrise
Add LANEUP_PASSWORD to Bitrise secrets, then:
- script:
title: Decrypt credentials
inputs:
- content: laneup decrypt-credentialsCircleCI
Add LANEUP_PASSWORD to project environment variables, then:
- run:
name: Decrypt credentials
command: laneup decrypt-credentialsDevelopment
# Install dependencies
bun install
# Build
bun run build
# Link for local testing
npm linkProject Structure
laneup/
├── src/
│ ├── commands/ # CLI commands
│ │ ├── init.ts
│ │ ├── setup-stores.ts
│ │ ├── setup-ci.ts
│ │ ├── generate-lanes.ts
│ │ ├── validate-config.ts
│ │ ├── show-keystore.ts
│ │ ├── docs.ts
│ │ ├── update.ts
│ │ └── decrypt-credentials.ts
│ ├── utils/ # Utility functions
│ │ ├── config.ts # Config loading/saving
│ │ ├── credentials.ts # Credential management
│ │ ├── encryption.ts # AES-256-GCM encryption
│ │ ├── fs.ts # File system operations
│ │ ├── keystore.ts # Android keystore operations
│ │ ├── logger.ts # Terminal output
│ │ ├── project.ts # Project detection
│ │ ├── secrets.ts # Secret validation
│ │ ├── template.ts # Template rendering
│ │ └── validation.ts # Input validation
│ ├── types/ # TypeScript types
│ │ ├── config.ts
│ │ └── credentials.ts
│ ├── templates/ # File templates
│ │ ├── fastfile.template.rb
│ │ ├── gemfile.template
│ │ ├── appfile.template.ios
│ │ ├── appfile.template.android
│ │ ├── matchfile.template
│ │ ├── github-actions.template.yml
│ │ ├── bitrise.template.yml
│ │ ├── circleci.template.yml
│ │ ├── env-vars.template.md
│ │ └── credentials-guide.template.md
│ └── index.ts # CLI entry point
├── dist/ # Built output
├── package.json
└── README.mdRequirements
- Node.js: 18+ or Bun
- Java: Required for Android keystore operations (keytool)
- Ruby: 2.6+ for Fastlane
- Git: For iOS Match
Troubleshooting
Keystore generation fails
Ensure Java is installed and keytool is in your PATH:
keytool -versionDecryption fails
Verify LANEUP_PASSWORD is set correctly:
echo $LANEUP_PASSWORDiOS Match setup issues
Ensure you have:
- Access to the Match git repository
- SSH key configured for git access
- Correct
MATCH_PASSWORDin environment
License
MIT
Author
Built for React Native developers who want Fastlane without the headache.
