Tools for preparing JetBrains IDE resources for restricted or offline environments.
jetbrains_plugins.pymirrors the latest Marketplace plugin versions compatible with a target IDE build and writes an IntelliJ PlatformupdatePlugins.xmlcustom plugin repository.jetbrains_fullline_models.pydownloads Inline Code Completion / Full Line local models and native inference runtimes into the cache layout used by JetBrains IDEs.
- Python 3.9 or newer.
requests.- Network access to JetBrains Marketplace, JetBrains Releases, and the Full Line model repositories while preparing the offline files.
Install the only external dependency if needed:
python3 -m pip install requestsMirror one or more plugins for a specific IDE version:
python3 jetbrains_plugins.py \
--build 2026.1.3 \
--plugin org.intellij.scala \
--plugin com.intellij.plugins.watcher \
--output dist--build accepts either a real IDE build number, such as 261.25134.95, or an IDE version, such as 2026.1.3. When an IDE version is used, the script resolves it through the JetBrains Releases API.
The default product code is IU for IntelliJ IDEA Ultimate. Use --product-code for other IDEs. JetBrains Marketplace expects the build value in the form <productCode>-<buildNumber>, for example IU-261.25134.95.
JetBrains product codes are documented here:
https://plugins.jetbrains.com/docs/marketplace/product-codes.html
The output directory looks like this:
dist/
updatePlugins.xml
plugins/
<plugin>.zip
If updatePlugins.xml already exists, only entries for the plugins mirrored in the current run are updated or appended. Existing entries for other plugins are preserved.
Serve dist as a static directory, for example with nginx, and add this custom plugin repository URL in the IDE:
http://your-nginx-host/updatePlugins.xml
By default, plugin URLs inside updatePlugins.xml are relative, such as plugins/<plugin>.zip. To write absolute URLs, pass --repo-url:
python3 jetbrains_plugins.py \
--build 2026.1.3 \
--plugin org.intellij.scala \
--output dist \
--repo-url http://your-nginx-host/Create a text file with one Marketplace plugin id per line:
org.intellij.scala
com.intellij.plugins.watcher
Then run:
python3 jetbrains_plugins.py \
--build 2026.1.3 \
--plugins-file plugins.txt \
--output distBlank lines and lines starting with # are ignored. Plugin ids can be XML ids such as org.intellij.scala, numeric Marketplace ids, or Marketplace plugin URLs. Numeric ids are resolved to XML ids when possible.
If Marketplace returns no compatible version for the requested build, that plugin is skipped and the script continues with the remaining plugins.
Useful options:
--channel <name> Use a specific Marketplace release channel.
--timeout <seconds> Network timeout. Default: 60.
--retries <count> Download retry count. Default: 3.
Download a single local model:
python3 jetbrains_fullline_models.py --model kotlinDownload multiple models:
python3 jetbrains_fullline_models.py --model kotlin,java,goThe default output is dist/full-line/models. If --output points directly to a full-line/models directory, the script writes there. Otherwise it creates full-line/models under the output directory.
The generated layout matches the IDE cache structure:
full-line/
models/
models.xml
<model-uid>/
model.xml
flcc.bpe
flcc.json
flcc.model
full-line-inference.zip_extracted/
ready.flag
To install models directly into an IDE system directory, pass the IDE system path or its full-line/models directory:
python3 jetbrains_fullline_models.py \
--model java \
--output ~/Library/Caches/JetBrains/IntelliJIdea2026.1For bare model tags such as --model kotlin, the script chooses the default version from its built-in model profile. The built-in profile currently maps 2026.1.3 to build 261.25134.95.
Web languages use JetBrains' shared ws model tag. For example, --model css, --model javascript, --model js, and --model ts download from /models/ws/..., matching the IDE behavior.
Python uses JetBrains' python-v2 model tag. --model python downloads from /models/python-v2/....
List available built-in profiles:
python3 jetbrains_fullline_models.py --list-model-profilesList model tags and versions for a profile:
python3 jetbrains_fullline_models.py --model-profile 2026.1.3 --list-modelsOverride a model version explicitly:
python3 jetbrains_fullline_models.py --model kotlin:0.1.163
python3 jetbrains_fullline_models.py --model kotlin:0.1.163-native-llama-bundleYou can also read model versions from an unpacked or installed Full Line plugin. Both decompiled layouts (resources/META-INF/plugin.xml plus modules/) and installed layouts (lib/fullLine.jar plus lib/modules/) are supported:
python3 jetbrains_fullline_models.py \
--plugin-dir "~/Library/Application Support/JetBrains/IntelliJIdea2026.1/plugins/fullLine" \
--model kotlin,java,go,html,css,javascript,python,rust,ruby \
--output dist--plugin-dir only affects model tag/version selection. It does not override the target runtime platform.
By default, the native inference runtime is downloaded for the current OS and architecture. Override it when preparing files for a different machine:
python3 jetbrains_fullline_models.py \
--model kotlin,java,go \
--os windows \
--arch x86_64 \
--output distCommon OS values are macos, windows, and linux. Common architecture values are x86_64 and arm_64.
If you already have a bundled full-line-model-*.zip, the script can read its model tag and version:
python3 jetbrains_fullline_models.py \
--model-zip /path/to/full-line-model-kotlin.zip \
--output distNormal model versions use JetBrains CDN by default:
https://download.jetbrains.com/resources/ml/full-line/models/<tag>/<version>/model.xml
https://download.jetbrains.com/resources/ml/full-line/models/<tag>/<version>/local-model-<tag>-<version>.jar
https://download.jetbrains.com/resources/ml/full-line/servers/<native_version>/<OS>/<ARCH>/full-line-inference.zip
Versions containing -beta use JetBrains Packages by default. Use --repository cdn or --repository maven to force a repository.
- Run the scripts on a machine with internet access.
- Copy or publish the generated
distdirectory to the offline network. - Serve
dist/updatePlugins.xmlas an IntelliJ custom plugin repository. - Put
full-line/modelsunder the target IDE system cache directory, or distribute it as part of your offline setup process.
See LICENSE.