Editor setup

Open a *.otm.yaml file and see structural + STRIDE findings inline as you type. The editor integrations all speak to the same engine โ€” the CLI, your editor, and CI never disagree.

First: the language server

Zed, VS Code, and IntelliJ are thin clients over wyrm-lsp. Install it once, on your PATH:

cargo install --git https://github.com/1ARdotNO/wyrm wyrm-lsp

Obsidian is the exception โ€” it bundles the engine as WebAssembly, so it needs no binary.

Zed shipped

  1. Install the dev extension

    Command palette (Cmd-Shift-P) โ†’ zed: install dev extension โ†’ select editors/zed. Zed compiles it (needs the wasm32-wasip2 target: rustup target add wasm32-wasip2).

  2. Open a model

    Open any .otm.yaml โ€” the WYRM findings appear inline and in the Problems panel (Cmd-Shift-M).

Diagnostics not showing? Launch Zed from a terminal so it inherits your PATH (with ~/.cargo/bin), or restart it after installing Rust.

VS Code shipped

  1. Build the extension

    cd editors/vscode
    npm install
    npm run build
  2. Run it

    Press F5 to launch an Extension Development Host, or package with npx @vscode/vsce package and install the .vsix.

  3. Open a model

    Open a .otm.yaml file. Point wyrm.serverPath at your wyrm-lsp in Settings if it isn't on PATH.

IntelliJ / JetBrains scaffold

Uses LSP4IJ for the LSP integration. This one ships as a scaffold โ€” build it with a JDK 17+ and verify the LSP4IJ API against your platform version.

cd editors/intellij
./gradlew runIde        # sandbox IDE with the plugin
./gradlew buildPlugin   # build/distributions/*.zip

Install the LSP4IJ plugin in your IDE, and keep wyrm-lsp on PATH.

Obsidian shipped

  1. Build the plugin

    cd editors/obsidian
    npm install
    npm run build     # needs wasm-pack: cargo install wasm-pack
  2. Install into your vault

    Copy manifest.json, main.js, and styles.css into <vault>/.obsidian/plugins/wyrm/ and enable it.

  3. Use it

    Write an otm fenced code block in any note โ€” wyrm renders the data-flow diagram and STRIDE findings below it. No binary needed (bundled WASM engine).

Neovim, Emacs, Sublime & any LSP editor shipped

Every editor with an LSP client can use wyrm-lsp โ€” the universal recipe is "run wyrm-lsp over stdio, scoped to *.otm.yaml." Drop-in configs live in editors/lsp/.

Neovim (0.11+)

vim.filetype.add({ pattern = { [".*%.otm%.ya?ml"] = "yaml.otm" } })
vim.lsp.config.wyrm = { cmd = { "wyrm-lsp" }, filetypes = { "yaml.otm" },
  root_markers = { ".threatmodel", ".git" } }
vim.lsp.enable("wyrm")

Emacs (Eglot)

(define-derived-mode wyrm-otm-mode yaml-ts-mode "OTM")
(add-to-list 'auto-mode-alist '("\\.otm\\.ya?ml\\'" . wyrm-otm-mode))
(with-eval-after-load 'eglot
  (add-to-list 'eglot-server-programs '(wyrm-otm-mode . ("wyrm-lsp"))))
(add-hook 'wyrm-otm-mode-hook #'eglot-ensure)

Sublime Text (LSP package)

Copy OTM.sublime-syntax to Packages/User/, then merge into LSP settings:

{ "clients": { "wyrm": { "enabled": true, "command": ["wyrm-lsp"], "selector": "source.yaml.otm" } } }

JetBrains family

GoLand, PyCharm, WebStorm, RubyMine, Rider, and the rest are all covered by the IntelliJ plugin above โ€” it's a platform plugin, so it loads across the whole family.

Helix & anything else

Point any LSP client at wyrm-lsp (stdio) for *.otm.yaml. Full snippets (incl. Helix languages.toml) in editors/lsp/.