Learn/IDE Integration

IDE Integration

IDE integration means editing Eustress scripts in the code editor you already use. Scripts are plain files in the Space folder, Studio reloads Rune scripts when you save, and the Eustress Rune LSP extension connects VS Code and editors built on it to the Rune language server that Studio starts.

Time8 min readLevelBeginnerUpdatedUpdated Sep 2026

01Overview

Scripts Are Files

A script in Eustress is a text file inside a Space folder: .rune for Rune, .luau (or .lua) for Luau. Studio keeps each script as a file in the Space folder and watches that folder while the Space is open, so you can edit scripts in any editor that saves text files.

Inserting a Script from the Studio ribbon writes a folder of three files. With nothing selected in the Explorer, the folder goes into the Space's SoulService folder; otherwise it goes into the selected item's folder on disk.

Universe folder
MyUniverse/
  .eustress/
    lsp.port                 port of the language server Studio started
    runtime-snapshot.json    simulation values, rewritten 4 times a second
  Spaces/
    MySpace/
      SoulService/
        SoulScript/
          _instance.toml     says what the folder is
          SoulScript.rune    the code you edit
          SoulScript.md      a short summary

The _instance.toml names the class and points at the source file. The LocalScript and ModuleScript inserts write LuauLocalScript and LuauModuleScript folders with a .luau source instead.

SoulScript/_instance.toml
[metadata]
class_name = "SoulScript"
archivable = true

[script]
source = "SoulScript.rune"

Choosing an Editor

Every option below edits the same files. They differ in how much the editor understands about Rune:

EditorRune supportSetup
VS Code, Cursor, WindsurfHighlighting, diagnostics, hover, completion, go to definition, renameInstall the Eustress Rune LSP extension
Neovim, Helix, other LSP clientsThe same language features, from the same serverPoint the client at eustress-lsp
Studio's script editorSquiggles and the Problems panel, from the same analyzerBuilt in
Any other text editorPlain editing; Studio still reloads Rune scripts on saveNone
Info
One analyzer everywhere

Studio's squiggles, its Problems panel and the external language server all run the same Rune analyzer, so a script reports the same errors, in the same words, in every editor.

02Editing on Disk

Open the Universe

Open the Universe folder, the one that contains Spaces/, as your editor's workspace. The language server walks up from the workspace to that folder and indexes every .rune file below it, which is what lets go to definition and rename reach across scripts.

Opening a single Space folder works as well, because the server walks up from there to the Universe. A folder outside any Universe limits those features to the file you have open.

Save and Reload

Studio watches the folder of the Space that is open. After a save, the watcher waits 300 ms for the file system to settle, then until 350 ms pass with no new changes (1.2 s at most), and applies the whole batch at once, so a single save reaches Studio in under a second. Editors that save by writing a temporary file and renaming it over the original are treated as an ordinary edit.

When you save a Rune scriptWhat Studio does
During PlayRecompiles the script right away and runs its on_init again against the new code. Compile errors appear in the Output panel.
While editingKeeps the new text and compiles it when you press Play.

Live reload covers Rune scripts only in this build.

To see the loop work:

  1. Open a Space that has a Rune script and press Play.
  2. In your editor, delete a closing brace from the script and save.
  3. The Output panel shows the compile error, tagged rune.
  4. Put the brace back and save. The script recompiles and its on_init runs again.

What the Watcher Skips

Advanced
Saves in the first 5 seconds are ignored

For 5 seconds after a Space opens, the watcher ignores changes to files that already exist, because the operating system reports a burst of spurious edits while the watch starts. If you saved in that window, save again.

  • Other Spaces. Studio watches the Space that is open, not the whole Universe.
  • Hidden folders. Anything inside a folder whose name starts with a dot, such as .eustress, is ignored.
  • Studio's own writes. A file Studio wrote in the last 2 seconds is not reloaded, so its saves never loop back as edits.

03VS Code Extension

Install

The extension is Eustress Rune LSP, published on the Open VSX registry as WeaveITMeta.rune-lsp (version 0.3.6). It needs VS Code 1.85 or newer, or an editor built on it.

  • Editors that install from Open VSX: search the Extensions view for Eustress Rune LSP.
  • VS Code: Microsoft's marketplace does not list the extension. Download WeaveITMeta.rune-lsp-0.3.6.vsix from its Open VSX page, then run Extensions: Install from VSIX from the Command Palette, or install it from a terminal.
Terminal
code --install-extension WeaveITMeta.rune-lsp-0.3.6.vsix

Besides the server connection, the extension registers a rune language for .rune files: a TextMate grammar that colors Rune before the server connects, // and /* */ comments, bracket matching and auto-closing, and folding between // #region and // #endregion markers.

Its source lives in the Eustress repository under infrastructure/extensions/lsp/vscode, and infrastructure/extensions/lsp/scripts/build-vsix.sh packages a .vsix of your own.

How It Finds Studio

  1. When a Space is open, Studio starts eustress-lsp in TCP mode, and the server writes its port number to .eustress/lsp.port in the Universe folder.
  2. The extension activates in any workspace that contains a .rune file or a .eustress/lsp.port file.
  3. When you open a .rune file, it walks up to the Universe folder, reads the port file and connects to 127.0.0.1 on that port. A connection attempt is abandoned after 1.5 seconds, so a stale port file never hangs the editor.
  4. Each Universe gets its own connection, limited to its own .rune files, so one window can edit scripts from Universes open in two copies of Studio.
Eustress Studioeustress-lsp.eustress/lsp.portstartswrites portYour editorreads portLSP over TCP, 127.0.0.1
Studio starts the server and records its port inside the Universe. The extension reads the port from that file and connects on the loopback address, so the server only accepts connections from your own machine.
Tip
After Studio replaces its server

Studio runs one server per Universe and replaces it when you open a Space in a different Universe. Run Eustress: Restart Rune Language Server to reconnect.

Status and Commands

A status bar item on the right shows the connection:

Status barMeaningClick to
Rune LSP with a check markConnectedRestart the connections
Rune LSP: starting…Connecting to Studio or launching a serverShow the server path
Rune LSP: engine not runningNo port file, and no standalone server foundOpen setup help
Rune LSP: errorThe connection or the server failedOpen the output

The Command Palette has four commands:

CommandWhat it does
Eustress: Restart Rune Language ServerStops every connection, then reconnects each open Rune file
Eustress: Set up Rune Language Server…Offers the Eustress download page, this page, or the server path setting
Eustress: Show resolved server pathShows the standalone server the extension would launch, and the live connections
Eustress: Show Rune Language Server outputOpens the output of the first connection; each Universe has its own channel

Without Studio

With no port file to follow, the extension launches a server of its own over stdio, using the first of these that exists:

  1. The eustress.serverPath setting
  2. The EUSTRESS_LSP_PATH environment variable
  3. target/release/eustress-lsp, then target/debug/eustress-lsp, in the first workspace folder (a source build of Eustress)
  4. A server packaged inside the extension, if the package has one
  5. eustress-lsp on your PATH

If eustress.serverPath names a file that does not exist, the search stops there and the server is reported missing. When nothing is found, the status bar shows Rune LSP: engine not running and a prompt offers the download page.

The Windows installer puts eustress-lsp.exe beside the engine, in C:\Program Files\Eustress Engine by default, but does not add that folder to PATH. Point the setting at it:

settings.json
{
  "eustress.serverPath": "C:\\Program Files\\Eustress Engine\\eustress-lsp.exe"
}

A standalone server runs the same code as the one Studio starts, so every language feature is the same.

04Other Editors

Any LSP Client

Editors with a built-in LSP client, such as Neovim and Helix, need no extension. Tell the client three things:

SettingValue
Commandeustress-lsp, or its full path if its folder is not on PATH
Files.rune, as a language named rune
Root markerSpaces, the folder that makes a directory a Universe

The server talks over stdio unless you pass --tcp. The Rune LSP page has ready-to-paste Neovim and Helix configurations, and the flags for sharing one server over TCP.

Luau Files

Language features for Luau are not part of Eustress yet: eustress-lsp analyzes Rune only, and Studio writes no Luau type definitions or .luaurc for other tools to read. Editor support for .luau files comes from whatever Luau tooling you install, without knowledge of the Eustress API.

The Scripting page covers both languages and the API they share.

05What's Next

Luau in Your Editor

Luau will catch up with Rune on two fronts: a type-definition file for the engine's Luau API, so standard Luau language servers can check Eustress scripts, and live reload during Play, so a saved .luau file takes effect the way a saved .rune file does.

One Install Everywhere

Today only the Windows installer places eustress-lsp beside the engine; the Windows zip, the macOS disk image and the Linux archive do not include it yet. Every package will include the server, so Studio starts it on any platform without a source build, and the extension will be listed on Microsoft's marketplace as well as Open VSX.

Write scripts in the editor you know. Press Play in Studio.

Loading Eustress Engine...