exolot
Analyze code locally from the command line with the language server from SonarQube for IDE (formerly SonarLint). No SonarQube account or server needed.
exolot is an independent project. It is not affiliated with or endorsed by SonarSource. "SonarQube" and "SonarLint" are trademarks of SonarSource.
Why
The old sonarlint-cli was discontinued years ago. SonarSource's current
SonarQube CLI needs a SonarQube Cloud or Server account, and its code analysis
runs on the server. exolot fills the gap: account-free analysis that runs
entirely on your own machine. It needs network access only to download the
language server the first time (and see the note on C/C++ and C# below).
How it works
exolot downloads the SonarQube for IDE extension for VS Code (a .vsix file,
which is a zip) from the
sonarlint-vscode GitHub releases,
checks its sha256 digest, and unpacks the language server, the language
analyzers and the bundled Java runtime into a cache directory. It then runs the
language server headlessly, opens each file you ask it to analyze, and prints
the issues the server reports.
The idea comes from sonarqube.nvim, which does the same thing for Neovim.
Usage
uvx exolot # analyze the current directory
uvx exolot src/ tests/foo.py # analyze specific files or directories
uvx exolot --format json . # machine-readable output
uvx exolot install # just download and unpack the server
uvx exolot cache-dir # show where the server is cached
Directories are expanded with git ls-files when inside a git repository (so
.gitignore is respected), and by walking the tree otherwise. Binary files and
files over 2 MiB are skipped.
Exit status is 0 when no issues are found, 1 when issues are found, and 2 on errors.
Options
--server-version TAGpicks a sonarlint-vscode release (default: the version exolot was tested with). Unknown versions are downloaded without digest verification, with a warning.--platform PLATFORMoverrides the detected VSIX platform (linux-x64,darwin-arm64,darwin-x64,win32-x64, oruniversal).--java PATHuses a different Java executable.--node PATHsets the Node.js used for JavaScript/TypeScript analysis (otherwise the server looks fornodeon thePATH).--rules FILEreads rule settings from a JSON file, in the same format as VS Code'ssonarlint.rulessetting, e.g.{"python:S1764": {"level": "off"}}.-v/--verboseshows the server's logs.
Platforms
Platform-specific builds with a bundled Java runtime exist for linux-x64,
darwin-arm64, darwin-x64 and win32-x64. On other platforms (such as
Linux on ARM) exolot uses the universal build, which needs Java 17 or later
from JAVA_HOME, the PATH, or --java.
Notes
- The language server keeps its own state in
~/.sonarlint, shared with any SonarQube for IDE installation you have. - Telemetry is disabled.
- C/C++ and C# analyzers are not included in the VSIX; the server tries to
download them from
binaries.sonarsource.comwhen it starts. - Each run starts a fresh JVM and loads every analyzer, so even a single file takes around 15 seconds.
- The bundled analyzers are licensed by SonarSource under their own terms. exolot downloads them from SonarSource's releases at run time and does not redistribute them.
Development
uv sync
uv run exolot --help
uv run pytest
Metadata
Release files for exolot 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| exolot-0.1.0.tar.gz | 19.8 kB | Without provenance | Details for exolot-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| exolot-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for exolot-0.1.0-py3-none-any.whl |
Total release size: 36.0 kB
Release files / exolot-0.1.0.tar.gz
| Download URL | exolot-0.1.0.tar.gz |
|---|---|
| Size | 19.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8b20b6cc10c27fd22040b6e3ab7650722da41fbe9f34b51db4b561ebb141a016
|
|
BLAKE2b-256 checksum How to use checksums |
1f263cf2fb8eafc183bc08ccf1726b1774698fee3b6309eaf0f02f53a5748bb0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.6 {"installer":{"name":"uv","version":"0.13.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / exolot-0.1.0-py3-none-any.whl
| Download URL | exolot-0.1.0-py3-none-any.whl |
|---|---|
| Size | 16.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b26a255dab5dcf7a3b1a0f8e355e94e484115ce79031ed11013e05597802c65d
|
|
BLAKE2b-256 checksum How to use checksums |
77dce39806747295ecb5382b4362aaa52fc62008e073a19a5e34970f575f9f4f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.6 {"installer":{"name":"uv","version":"0.13.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for exolot 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.