~/posts/single-command-ide-setup

Single Command IDE Setup

Bootstrap your Android Studio/IntelliJ IDE with customized configurations in seconds.

Single Command IDE Setup
$ cat content.md

Overview

IDE Provisioner is an intelligent IDE bootstrapping and management CLI tool created by the Android and Backend Developer Experience (DX) team that solves a critical challenge in large engineering organizations: the complexity and inconsistency of development environment setup and maintenance for JetBrains IDEs (Android Studio and IntelliJ).

Traditional onboarding involves dozens of manual steps—downloading the right IDE version, installing the Android SDK, configuring code styles, setting up IDE plugins, and tweaking performance settings. Each step is an opportunity for configuration drift, version mismatches, or suboptimal settings. IDE Provisioner eliminates this complexity with a single command that bootstraps an optimized, standardized development environment in under a minute:

bash
1ide run

Problem: Development Environment Entropy

In large codebases like Square's and CashApp's, the development environment is constantly evolving where:

  • IDE versions need regular updates, but not all versions are stable.
  • Performance optimizations exist in obscure registry settings that most developers never discover.
  • IDE Plugins need to be kept up-to-date and consistent across the team.
  • Build tool configurations require tuning for optimal performance.
  • Onboarding takes hours or days of manual setup following wiki instructions, as well as back-and-forth with longtime team members.
  • Tooling improvements have no centralized distribution mechanism.

The result? Teams waste countless engineering hours on environment issues, experience inconsistent build times, and struggle with "works on my machine" problems that stem from subtle configuration differences.

Solution: IDE Provisioner

Data-Driven IDE Version Management

IDE Provisioner ensures team consistency while providing intelligent, data-driven version selection. The DX teams perform daily benchmarking of IDE versions using gradle-profiler, measuring sync performance, build times, and stability metrics. Based on these benchmarks, the team selects optimal versions and automatically distributes them.

This proactive approach has caught and prevented several major IDE performance regressions before reaching developers. When regressions are detected, the team can block problematic versions until issues are resolved by JetBrains or Google.

Channel System for different risk tolerances:

  • Stable: Production-ready versions, thoroughly tested and benchmarked
  • Beta: Near-stable versions with newer features for early adopters
  • Canary: Cutting-edge builds for previewing upcoming changes
bash
1# subscribe to desired channel
2ide channel stable|beta|canary

Automated IDE Bootstrap and Configuration

The run command automates every environment setup step:

  • IDE Installation: Downloads and installs the correct Android Studio or IntelliJ IDEA version
  • Android SDK: Installs platform tools, build tools, and required SDK packages
  • Plugin Management: Auto-installs team-required plugins (Build Sync Metrics, MdxDaemon, Hermit, etc) while deactivating unnecessary default bundled plugins
  • VM Options: Configures optimal memory and performance settings
  • Gradle Properties: Sets performance-tuning flags in ~/.gradle/gradle.properties
  • Code Styles: Applies team code style configurations
  • Registry Settings: Configures hidden IDE performance optimizations
bash
1# Before: 20+ manual steps, day(s)
2# After: One command, <1 minute
3ide run

Performance Tuning

IDE Provisioner automatically applies

  • IDE plugins that directly or indirectly help improve build performance.
  • performance optimizations hidden in configuration files that most developers never touch, based on DX team research and testing.

IDE Plugins that provide sync telemetry, load focused subset of Gradle projects and pre-warm Gradle builds.

Learn more about IDE performance improvements in the Shrinking Elephants blog post.

VM Options (studio.vmoptions | idea.vmoptions):

1"-Xmx16g",
2"-XX:ReservedCodeCacheSize=2G",
3"-XX:G1HeapRegionSize=8M",
4"-XX:MinHeapFreeRatio=10",
5"-XX:MaxHeapFreeRatio=20",

Gradle Properties are automatically added, replaced, or removed as needed.

Registry Properties (IDE-specific settings not accessible via project files):

1Problem - IDE spending forever "searching for context actions"
2Solution - Auto-applies kotlin.k2.auto.import.from.subclass.objects.enabled=true

Profile System: Scalable Team Configurations

Different teams need different configurations. The Square Android team needs different plugins than CashApp Android or Backend teams. IDE Provisioner's profile system makes this scalable through LaunchDarkly-driven configuration.

kotlin
1@Serializable
2data class Profile(
3    val adks: Map<String, Adk> = mapOf(),
4    val ides: Map<String, List<Ide>> = mapOf(),
5    val channels: Map<String, Channel> = mapOf(),
6    val plugins: Map<String, Plugin> = mapOf(),
7    val vmoptions: List<String> = listOf(),
8    val gradleProperties: List<Property> = listOf(),
9    val registryProperties: List<RegistryProperty> = listOf(),
10    val name: String = "",
11    val ideType: IdeType = IdeType.ANDROID_STUDIO,
12)

A user's registry role (defines employee's job responsibility within company, e.g., square-android, cash-android, cash-backend) automatically maps to the appropriate profile, enabling zero-configuration onboarding—each developer runs the same command but receives team-specific configurations.

Profiles are defined as JSON feature flags in LaunchDarkly, allowing the DX team to update configurations instantly without code changes or rollback problematic changes.

MDX Daemon Integration

IDE Provisioner can run automatically via MDX Daemon, a lightweight background process that executes jobs on developer machines, enabling:

  • Automatic updates: IDE configurations update in the background
  • Zero-friction onboarding: New developers have the IDE configured without running any commands
  • Proactive maintenance: Environment health checks run automatically

Learn more in Rethinking Idle Time and the DPE Summit tech talk.

Developer Tools

IDE Provisioner includes utilities for troubleshooting and environment management:

ide doctor - Diagnoses development issues, checking IDE installation, plugin status, and Gradle configuration

ide scan - Collects comprehensive environment information formatted for sharing when filing tooling bugs

ide clear - Clears IDE and Gradle caches to resolve mysterious build issues

ide configuration-cache enable|disable|clear - Manages Gradle's configuration cache for debugging

ide clean - Performs a clean reinstall, resetting everything to a fresh state

Real-World Impact

Since rolling out IDE Provisioner:

  • Onboarding time reduced from hours/days to under a minute
  • Environment consistency eliminated "works on my machine" issues from IDE differences
  • Performance improvements through automatic application of expert-level optimizations
  • Proactive issue prevention catching IDE regressions before impacting developers
  • Scalable tooling improvements shipping updates to all developers instantly

By combining automation, intelligent version management, performance tuning, observability, and team-specific configuration, IDE Provisioner eliminates environment-related friction and enables developers to focus on building great products—one command at a time.

Special thanks to Tony Robalik for reviewing the draft and many others for getting the IDE Provisioner to this point.

$