npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

laneup

v0.1.0-beta.1

Published

Bootstrap Fastlane setup for React Native projects

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 keytool commands.
  • 🚀 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 laneup

Quick Start

cd your-react-native-project
laneup init

Laneup will:

  1. Detect your project structure (React Native/Expo, iOS/Android)
  2. Ask for LANEUP_PASSWORD if not set (used to encrypt all credentials)
  3. Parse bundle identifiers and package names automatically
  4. Generate Android keystore or import existing one (encrypted immediately)
  5. Set up iOS Match if needed
  6. Create Fastlane configuration files
  7. Generate encrypted credential storage

💡 One Password for Everything: Your LANEUP_PASSWORD encrypts 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 credentials

Prompts 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 configuration

laneup generate-lanes

Generate Fastfile from templates based on your configuration.

laneup generate-lanes [options]

Options:
  --force    Overwrite existing Fastfile

laneup validate-config

Validate Laneup configuration.

laneup validate-config [options]

Options:
  --check-secrets    Also validate encrypted secrets

laneup show-keystore

Display Android keystore information (fingerprints, validity, etc.).

laneup show-keystore

Requires LANEUP_PASSWORD environment variable.

laneup docs

Generate documentation files.

laneup docs

Generates:

  • .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 update

Configuration

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 beta

Bitrise

Add LANEUP_PASSWORD to Bitrise secrets, then:

- script:
    title: Decrypt credentials
    inputs:
      - content: laneup decrypt-credentials

CircleCI

Add LANEUP_PASSWORD to project environment variables, then:

- run:
    name: Decrypt credentials
    command: laneup decrypt-credentials

Development

# Install dependencies
bun install

# Build
bun run build

# Link for local testing
npm link

Project 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.md

Requirements

  • 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 -version

Decryption fails

Verify LANEUP_PASSWORD is set correctly:

echo $LANEUP_PASSWORD

iOS Match setup issues

Ensure you have:

  • Access to the Match git repository
  • SSH key configured for git access
  • Correct MATCH_PASSWORD in environment

License

MIT

Author

Built for React Native developers who want Fastlane without the headache.