
limrun-gradle
Build an Android app on a remote Gradle sandbox with lim gradle build instead of local Gradle or Android Studio, from any environment (Linux, Windows, macOS, VM, container). Use when the user wants to build an APK or AAB, sign a release with an upload key, prepare a Play Store publish, inspect build logs, or select sandbox tools and run shell commands, for native Android projects, React Native, and Expo. To run, tap, screenshot, or otherwise interact with the built APK on an emulator, use limrun-android-emulator. For iOS builds, use limrun-xcode or limrun-expo-development.
- Installs
- 40.1K
- Last 24h
- +45
- Trending rank
- #3608
- Security
- Pass
Install
Works with every agent the skills CLI supports.
npx skills add https://github.com/limrun-inc/skills --skill limrun-gradle- 01
Install
Run the command in your project. The CLI asks which agents to install for.
- 02
Describe the task
Ask your agent for something this skill covers. It loads limrun-gradle automatically when relevant.
- 03
Review the result
The agent follows the SKILL.md steps, scripts and references bundled with the skill.
Security audits
Independent scans of the skill's instructions and bundled files.
SKILL.md
The instructions your agent reads when the skill is triggered.
Remote Gradle build
Build Android projects on Limrun's remote Gradle sandboxes, from any
environment (Linux, Windows, macOS, VM, container). lim gradle build syncs
your sources to a remote instance, runs the project's own Gradle wrapper
there, and streams the build output. This workflow builds on the remote instance; local Gradle, a local Android
SDK, and local emulators are not part of it. A finished run has the app
running on a Limrun emulator or the artifact delivered.
For iOS builds, use limrun-xcode instead of this skill. For the Expo
dev-client loop (Metro, hot reload) on either platform, use
limrun-expo-development; it comes back here for the Android Debug
build.
Auth and CLI
Install if needed: npm install --global lim. Auth is lim login or
LIM_API_KEY (it may already be set in the user's environment even when .env and the shell do not show it; check before asking for it). The CLI is the source of truth:
the commands in this skill are verified, but if a flag errors or you need one
not shown here, check --help instead of guessing:
lim gradle --help
lim gradle build --help
Build an APK
Instead of ./gradlew, build with:
lim gradle build .
This creates or reuses the remembered Gradle instance, syncs the current
directory, and runs assembleDebug by default. Pick tasks explicitly with
--task (repeatable):
lim gradle build . --task :app:assembleRelease
Use --project-path when the Gradle root is nested and auto-discovery is
ambiguous (for example a bare React Native repo where Gradle lives in
android/; the server usually finds it on its own):
lim gradle build . --project-path android
Expo managed-workflow projects (no android/ directory) are detected
automatically: the sandbox installs dependencies and runs expo prebuild
before Gradle. Setting --expo-app-dir (monorepos) or --abi forces that
pipeline and errors when no Expo app is detected:
lim gradle build ./my-monorepo --expo-app-dir apps/mobile
For iterating on an Expo app with Metro and hot reload rather than plain
builds, use limrun-expo-development.
Private dependency credentials
Copy existing credential files with --additional-file, also supported by sync:
lim gradle build . \
--additional-file "$HOME/.npmrc=~/.npmrc" \
--additional-file "$HOME/.netrc=~/.netrc"
Remote ~/ targets the sandbox home; other destinations are workspace-relative.
Repeat the flags on later syncs to retain the files. Pass --env for environment
variables referenced by the configuration.
Detached builds and logs
Use --detach to return once the build is accepted; a webhook is optional.
logs reads the latest build without an exec ID, including persisted logs after
instance deletion; add --follow to wait for completion.
lim gradle build . --detach
lim gradle logs
lim gradle logs --follow
Tool versions and shell commands
After syncing, lim gradle use selects tools in the sandbox and installs missing versions.
Run lim gradle tools install for synced project tool selections (details). Builds keep the project's gradlew; Android SDK/NDK/CMake use sdkmanager.
lim gradle tools
# Node includes npm/npx.
lim gradle use node@24 pnpm@10 yarn@4 bun@1 java@temurin-17 bundletool@1
lim gradle tools install
lim gradle run -- mise use --pin node@24.5.0
lim gradle run --env APP_ENV=staging -- npm run generate
lim gradle build . --env APP_ENV=staging
Download sandbox files
Use lim gradle pull-file <remote-path> [destination] --id <instance-ID>.
Paths can be absolute or relative to the synced project root.
Never use build or run logs to transfer files, including text, binary, or base64 content.
Wait for the command writing the file to finish. Archive directories first,
and download before deleting the instance.
Run it on an emulator
Upload the built APK as a named asset, then install it on an Android instance:
lim gradle build . --upload myapp.apk
lim android create --install-asset=myapp.apk
Build uploads default to a 14-day TTL: each build pushes the asset's expiry
to 14 days from that upload. Pass --upload-ttl with a Go duration (e.g.
720h; 1d is invalid) to change it.
Share the signed stream URL from the create output with the user as a
Markdown link, such as [Live emulator](<signed-stream-url>). For rebuild
iterations, patch the installed APK in place instead of recreating the
instance:
lim android sync ./path/to/app-debug.apk
For everything else on the device (tapping, typing, element tree, screenshots, video, logcat over adb), use limrun-android-emulator.
Sign a release AAB
The default signing path needs NO credentials from the user:
lim gradle build . --sign --upload myapp.aab
On first use, Limrun generates an upload keystore, escrows it as the
organization's signing key for this app, and signs with it. Every later
--sign build of the same app, from any machine or CI, uses the same key, so
Play Store uploads keep matching. The key is named by the Android application
ID, detected from app.json (Expo) or app/build.gradle(.kts); pass
--application-id <id> when detection fails or picks the wrong flavor.
--sign makes bundleRelease the default task and the build fails before
starting if an explicit --task list contains no bundle task. A SUCCEEDED
build means the AAB carries the signature (the server verifies it before
upload), so don't re-verify the artifact unless the user asks.
Expect one of these lines before the build starts and relay its meaning:
Signing with the organization's upload key for <app> (newly generated).: first build of this app; the key now exists for the whole organization.Signing with the organization's upload key for <app> (existing).: reusing the escrowed key, as intended.
Bring your own upload key
When the app already has a registered upload key (an existing Play listing),
the user can sign with their own keystore instead. The keystore path, key alias
and both passwords are supplied by the user on their own machine, as the
--keystore, --key-alias, --keystore-password and --key-password flags or
the LIM_KEYSTORE_PASSWORD and LIM_KEY_PASSWORD environment variables
(lim gradle build --help lists them). Never ask for or handle these values in
the conversation; if one is missing, name the flag or variable to set. All four
travel together. Add
--save-key to escrow the provided key so later builds can drop the flags and
use plain --sign. --save-key refuses to overwrite: if a DIFFERENT key is
already escrowed for the app it fails before any instance is created.
The keystore file itself stays on the user's machine: never commit it or paste
its bytes into files. keytool -list -keystore <file> shows the alias when the
user does not know it.
Failure strings to recognize on the bring-your-own path:
The organization already has a different upload key escrowed for <app>:--save-keyconflict. Builds with--signuse the escrowed key; drop--save-keyto sign with the provided keystore for this build only, or ask the user which key is the real upload key.Signing with your own key requires ... as well: the BYO flag group is incomplete; the message lists exactly the missing flags.signing <field> contains an unsupported character: the password or alias has characters outside ISO-8859-1. Change it in place with keytool (-storepasswd,-keypasswd, or-changealias) to a Latin-1 value. Never regenerate the key itself: that changes the upload key.
Publish to Play Store
When the user has Play credentials configured on their own machine (a
service-account JSON file or an access token, passed through the
--playstore-service-account or --playstore-access-token flag), the build
publishes the signed release AAB directly, no browser involved. Never ask for
these credentials in the conversation:
lim gradle build . --sign --upload-to-playstore --playstore-service-account sa.json --auto-version-code
--auto-version-code makes the server resolve the next free versionCode from
Google Play before the build and stamp it into the workspace copy
(expo.android.versionCode in app.json for Expo projects, the single literal
versionCode in the conventional app/ module build script for native
Gradle projects), so repeat publishes never collide. Without it, or on
projects with computed or flavor-split versionCodes (which it rejects at
request time), manage the versionCode yourself as below. Without Play
credentials you cannot run the publish itself: it is a browser flow with a
Google sign-in. Prepare the artifact, upload it as an asset, and hand off:
lim gradle build . --sign --upload <app>-v<versionCode>.aab
Tell the user to open https://console.limrun.com and, on the Secrets page,
click Connect Play Console to sign in with a Google account that has
release access to the app (the session lives in the browser only; nothing is
stored). Then on the Registry page they click Publish to Play Store on
the uploaded AAB and enter the package name (the application ID). The app
listing must already exist in Play Console. Google Play requires a versionCode
it has never seen: --auto-version-code handles that on publish builds;
without it, bump versionCode in app/build.gradle(.kts) (Expo:
expo.android.versionCode in app.json) before the build.
Failure strings to recognize on the --sign path:
Cannot determine the Android application ID for signing: detection found noapp.jsonandroid.package and noapplicationIdinapp/build.gradle(.kts); pass--application-id <id>.--sign produces a Play-ready signed AAB; include a bundle task: the explicit--tasklist has no bundle task; addbundleReleaseor drop--task.the built AAB carries no signature: the server's post-build check found an unsigned bundle; the signing config was not applied. Not a problem in the user's code; retry, and report it if it persists.
Android previews on pull requests
For repeatable previews on pull requests, prefer the packaged Android preview action. It builds and uploads the app, updates the PR preview comment, and cleans up the builder; see the repository for inputs and workflow examples.
Gotchas
- Build errors are part of the job. If a build fails, read the error output, fix the code, and rebuild before reporting back.
- A project mise file installs tools the build never uses. The first
build or run in a sandbox runs
mise installfor every[tools]entry in the synced mise files, so a monorepo's rootmise.tomlfull of databases and cloud CLIs slows it down or fails it. Keep using the project file when it works. If it doesn't, add amise.limrun.tomlbeside it listing only the build's tools (for example node and pnpm); in that directory Limrun reads it instead of the other mise files. - Instance reuse is per git worktree. Commands resolve the remembered
instance from the worktree of your cwd; pass
--id <gradle-instance-id>(fromlim gradle list) to target a specific one. - versionCode must increase for every Play upload. Prefer
--auto-version-codeon publish builds. A rejected publish saying the version code already exists means bump, rebuild, republish. If a publish RETRY reports it, the earlier attempt already succeeded; don't publish again. - Application ID detection reads the first uncommented
applicationId. Flavor-specific IDs and dynamic Gradle logic are out of its scope; use--application-idthere. - Keystore passwords must be non-empty and ISO-8859-1. Empty passwords and characters outside Latin-1 are rejected at request time instead of failing minutes into the build.
- Keep synced files small and out of build dirs. Root-level
build/,.gradle,.kotlinand anylocal.propertiesnever sync, and.gitignorefiles (including nested ones) are honored. Use--ignore <regex>for other large local artifacts and--include <regex>to force-sync gitignored inputs the build needs.
FAQ
What does the limrun-gradle skill do?
Build an Android app on a remote Gradle sandbox with lim gradle build instead of local Gradle or Android Studio, from any environment (Linux, Windows, macOS, VM, container). Use when the user wants to build an APK or AAB, sign a release with an upload key, prepare a Play Store publish, inspect build logs, or select sandbox tools and run shell commands, for native Android projects, React Native, and Expo. To run, tap, screenshot, or otherwise interact with the built APK on an emulator, use limrun-android-emulator. For iOS builds, use limrun-xcode or limrun-expo-development.
How do I install limrun-gradle?
Run npx skills add https://github.com/limrun-inc/skills --skill limrun-gradle in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/limrun-gradle/ (personal) or .claude/skills/limrun-gradle/ (project).
Which AI agents can use limrun-gradle?
Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.
Is limrun-gradle safe to install?
Security partners have reviewed it: Gen Agent Trust Hub passed; Socket passed; Snyk passed. As with any skill, read the SKILL.md and bundled scripts before installing.
Who maintains limrun-gradle?
It is published by limrun-inc in limrun-inc/skills. It has 40,071 recorded installs.
More from limrun-inc/skills
limrun-ios-simulator
limrun-inc/skills
Drive an app running on a Limrun cloud iOS simulator: launch, tap, type, read the accessibility element tree, read app logs and simulator syslog, screenshot, record video, connect the app to local services or a private tunnel, play a video file as the camera, send all traffic through the user's proxy and trust its CA, set the clipboard, read and write user defaults, post notifications, and run timed action chains. Use after a build (from any builder) when the user wants to see, test, or interact with their app on a simulator, or says 'show me a screenshot', 'tap', 'run the UI test', 'record a video', 'read the logs', 'connect localhost', 'reach my local server from the simulator', 'route all traffic through my proxy', 'trust my CA', 'mock the camera', 'paste into the app', 'change the language', 'simulate Face ID', or 'launch on simulator'. To build the app first, use limrun-xcode-bazel (Bazel workspaces) or limrun-xcode (xcodebuild projects).
limrun-xcode
limrun-inc/skills
Build an iOS / Apple app on remote Xcode with lim xcode build instead of local xcodebuild, run project commands with lim xcode run, or run its XCTest suites with lim xcode test, from any environment (Linux, Windows, macOS, VM, container). Use for non-Bazel projects (an .xcodeproj / .xcworkspace, an XcodeGen project.yml with a gitignored project, React Native / Expo native build) when the user wants to build, compile, run code generation or Make targets, test, inspect build logs, reload, produce a preview build, or ship a signed device IPA. To run, tap, screenshot, or otherwise interact with the result on a simulator, use limrun-ios-simulator. For Bazel workspaces, use limrun-xcode-bazel.
limrun-detox-testing
limrun-inc/skills
Configure, run, or debug Detox on Limrun iOS simulators. Use when attaching the Limrun Detox runtime to an app, wiring Detox mediator connectivity, or validating app/tester connections over destination tunnels.
limrun-expo-development
limrun-inc/skills
Prepare and run Expo / React Native apps on Limrun with Expo dev-client iteration. Use when the user wants an Expo dev build, Metro tunnel, hot reload, JS/TS iteration without repeated native rebuilds, or to run/test an Expo app on a remote iOS simulator or Android emulator.
limrun-xcode-bazel
limrun-inc/skills
Legacy: build a Bazel iOS app with lim xcode rbe on a dedicated Xcode sandbox and install it on a remote iOS simulator attached to that sandbox. Use only when the workspace already runs on lim xcode rbe (its .limrun/ came from lim xcode rbe) or the user explicitly asks for it, or when a lim xcode rbe build, upload, or install misbehaves. For every other Bazel build, including new workspaces, iOS or Android, and running the app on a simulator, use limrun-bazel. To tap, type, screenshot, or otherwise interact with the running app, use limrun-ios-simulator.
limrun-maestro-testing
limrun-inc/skills
Run Maestro YAML flows against a Limrun cloud iOS simulator with lim ios maestro, from any environment (Linux, Windows, macOS, VM, container). Use when the user wants to run, write, or debug Maestro flows or maestro test on iOS, migrate an existing Maestro suite to remote simulators, or asks for UI testing with Maestro. iOS simulators only today. For Detox suites use limrun-detox-testing; for driving the simulator without a test framework use limrun-ios-simulator.
Popular mobile skills
design-mobile-apps
designed-by-ai/skills
Design mobile app screens with Sleek, edit Sleek projects, and implement their designs in React Native or HTML.
ios-design
uizze.sh
Design and review iOS UI/UX for iPhone apps in SwiftUI, UIKit, or React Native. Use for mobile app design, screen redesigns, navigation flows, typography, forms, keyboard and safe-area layout, and accessibility checks. Apply Apple Human Interface Guidelines and consult real product references through the optional Uizze connection.
vercel-react-native-skills
vercel-labs/agent-skills
React Native and Expo best practices for building performant mobile apps. Use when building React Native components, optimizing list performance, implementing animations, or working with native modules. Triggers on tasks involving React Native, Expo, mobile performance, or native platform APIs.
animate-expo
emilkowalski/skills
Build animations in React Native and Expo, making the decisions in the order that determines whether they feel right — should it animate, which thread it runs on, which properties, spring or timing, how the gesture hands off, how it degrades. Writes the implementation with Reanimated, Gesture Handler, Expo Router and expo-haptics. Use when animating anything in an Expo app, adding gestures, sheets, screen transitions, press feedback or haptics, or fixing motion that stutters on device. For web animation use animate.
xcode-project-setup
firebase/agent-skills
Safely modifies Xcode projects (.pbxproj) to add Swift Packages and link files. Use this skill whenever an iOS project needs dependencies installed (e.g. Firebase, Alamofire).
firebase-remote-config-basics
firebase/agent-skills
Manages Firebase Remote Config templates, feature flags, loading strategies, and SDKs (Android, iOS). Use when downloading/deploying remoteconfig JSON templates, managing version history/feature flags, setting in-app defaults, fetchAndActivate(), real-time listeners, or SDK setup. Don't use for Firebase Hosting, Auth, Firestore, Data Connect, Crashlytics, or App Hosting.