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.
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.
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 summaryThe _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.
[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:
| Editor | Rune support | Setup |
|---|---|---|
| VS Code, Cursor, Windsurf | Highlighting, diagnostics, hover, completion, go to definition, rename | Install the Eustress Rune LSP extension |
| Neovim, Helix, other LSP clients | The same language features, from the same server | Point the client at eustress-lsp |
| Studio's script editor | Squiggles and the Problems panel, from the same analyzer | Built in |
| Any other text editor | Plain editing; Studio still reloads Rune scripts on save | None |
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 script | What Studio does |
|---|---|
| During Play | Recompiles the script right away and runs its on_init again against the new code. Compile errors appear in the Output panel. |
| While editing | Keeps the new text and compiles it when you press Play. |
Live reload covers Rune scripts only in this build.
To see the loop work:
- Open a Space that has a Rune script and press Play.
- In your editor, delete a closing brace from the script and save.
- The Output panel shows the compile error, tagged
rune. - Put the brace back and save. The script recompiles and its
on_initruns again.
What the Watcher Skips
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.vsixfrom its Open VSX page, then run Extensions: Install from VSIX from the Command Palette, or install it from a terminal.
code --install-extension WeaveITMeta.rune-lsp-0.3.6.vsixBesides 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
- When a Space is open, Studio starts
eustress-lspin TCP mode, and the server writes its port number to.eustress/lsp.portin the Universe folder. - The extension activates in any workspace that contains a
.runefile or a.eustress/lsp.portfile. - When you open a
.runefile, it walks up to the Universe folder, reads the port file and connects to127.0.0.1on that port. A connection attempt is abandoned after 1.5 seconds, so a stale port file never hangs the editor. - Each Universe gets its own connection, limited to its own
.runefiles, so one window can edit scripts from Universes open in two copies of Studio.
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 bar | Meaning | Click to |
|---|---|---|
Rune LSP with a check mark | Connected | Restart the connections |
Rune LSP: starting… | Connecting to Studio or launching a server | Show the server path |
Rune LSP: engine not running | No port file, and no standalone server found | Open setup help |
Rune LSP: error | The connection or the server failed | Open the output |
The Command Palette has four commands:
| Command | What it does |
|---|---|
| Eustress: Restart Rune Language Server | Stops 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 path | Shows the standalone server the extension would launch, and the live connections |
| Eustress: Show Rune Language Server output | Opens 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:
- The
eustress.serverPathsetting - The
EUSTRESS_LSP_PATHenvironment variable target/release/eustress-lsp, thentarget/debug/eustress-lsp, in the first workspace folder (a source build of Eustress)- A server packaged inside the extension, if the package has one
eustress-lspon yourPATH
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:
{
"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:
| Setting | Value |
|---|---|
| Command | eustress-lsp, or its full path if its folder is not on PATH |
| Files | .rune, as a language named rune |
| Root marker | Spaces, 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.