Documentation / The IDE

Language servers and build

The language servers Yuli installs and maintains for you, without npm or a system Node, and the build adapters for Python, Go, .NET, sbt, Bazel and Node.

For each language, Yuli uses the reference language server (LSP) and manages it for you: it downloads it with your permission, verifies it and keeps it outside your projects. Java has its own native engine, and CSS, SCSS and LESS are handled by the editor.

Managed servers

Language Server Installed from
TypeScript and JavaScript typescript-language-server with typescript (the real tsserver) npm registry
Python Pyright npm registry
Go gopls go install
Kotlin kotlin-language-server GitHub zip
C# csharp-ls dotnet tool
PHP Intelephense npm registry
Ruby ruby-lsp gem
C and C++ clangd 19.1.2 GitHub zip
Bash bash-language-server npm registry
Dockerfile dockerfile-language-server-nodejs npm registry
Rust rust-analyzer GitHub binary

No npm or Node on your machine

  • Packages are downloaded straight from the npm registry and checked against the SHA-512 hash the registry publishes.
  • Install scripts and optional dependencies are not run.
  • They run on Yuli's own Electron in Node mode, or on a Node that Yuli downloads. You don't need npm or Node installed.
  • They are kept in <runtimes>/<server>/<version>/.
  • A download is stopped only if no data arrives for 60 seconds; a slow but active download is not interrupted.

Yuli's runtimes folder (<runtimes>) depends on the system:

%LOCALAPPDATA%\.yulicode\runtimes

With your permission

If a language's server is missing, the editor shows "No language server for…" with these options:

Option What it does
Allow download / Allow installation Yuli installs it and starts it
Not now It doesn't ask again during this session
Don't ask again It remembers your decision for that server

Nothing will be downloaded or run without your permission. Decisions are saved in lsp-install-consent.json, next to your settings, per server and per target (this machine or a remote host).

In Global options → Language servers you can set the path of a server you already have, or a trusted URL or mirror.

Build adapters

Yuli detects how each project is built from its files, without running anything to find out, and uses those tools to build, run, test and show results in the Tests panel.

  • Managers: pip (requirements*.txt, setup.py or a plain pyproject.toml), Poetry, uv, Pipenv and Hatch.
  • Environment: it uses the project's virtual environment (.venv/venv, the Poetry and Pipenv folders or Hatch's). With none, it uses the manager's run and, failing that, the system Python.
  • Tests: pytest if the project configures or depends on it; otherwise unittest.
  • The same environment is passed to Pyright, so autocomplete sees your dependencies.

Maven, Gradle, Ant and Cargo work as always; see Run and debug.

▶ in the margin

Next to the code, a ▶ lets you run or debug what is in front of you. It is shown only when the project really is of that kind.

Language Run Debug
Python if __name__ == "__main__": and pytest or unittest tests if __name__ == "__main__":
Go func main and func TestX func main and func TestX
C# xUnit, NUnit and MSTest tests static void Main(

Also, in a package.json each script has its ▶ (it runs with the project's package manager), and in Java there is a ▶ for classes with main, tests and Maven and Gradle tasks.

See Debugging for debug sessions and Editor and languages for the rest of the editor.