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:
bash1ide 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
bash1# 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
bash1# 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.
kotlin1@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.
