Mod development for Crusader Kings III, Victoria 3 and Europa Universalis V: a language server with a real Paradox-script parser, scope-aware completion, instant diagnostics for the silent-failure class of bugs, deep tiger integration, a live mod overview, and a localization workflow no other tool has.
Beta (0.3.0). This is a young project and things will change. It is already useful day to day, but you will hit rough edges. Feedback is not just welcome, it is the point: see Contributing below.
CK3 is the game this toolkit grew up on and is where every feature exists. The other two get the same language core; Game support at the bottom says exactly where they stop.
- Scope-aware completion: key positions offer verbs (triggers/effects),
value positions offer nouns (traits, events, on_actions, loc keys), and
scope:,culture:,title:prefixes complete their referents. Items valid in the current scope rank first; others are annotated, never hidden. - Hover docs with texture previews: merged
script_docsand (on CK3) wiki docs, the live scope chain at the cursor, resolved loc text, and inline.ddsimage previews from a pure-TS DDS decoder. - Structural diagnostics for the bugs the game swallows silently: unbalanced
braces, missing UTF-8 BOM, loc header/filename mismatches, folder traps
(
localisation/, pluralon_actions), references to events that do not exist. - Deep tiger integration: auto-download of ck3-tiger or vic3-tiger, run on
save or manually, JSON reports as native Problems, and a baseline workflow to
adopt tiger on a legacy mod (suppress today's reports, see only new ones).
Dependency mods (
px.parentModsand the other workspace mods) are passed to tiger asload_modentries, so a submod's references into its parents resolve instead of coming back "unknown" — automatic when the mod has no tiger conf of its own, and written into the conf Generate ck3-tiger.conf creates. EU5 has no tiger build, so the toolkit says so instead of pretending. - Sidebar: mod overview, localization coverage, overrides and conflicts (with the LIOS/FIOS winner), an interactive event graph with a node inspector, and a GUI widget tree.
- Event simulator (Simulate Event): a static walkthrough of what happens
when an event fires (trigger, immediate, each option with its localized text,
after) where every onward
trigger_eventis a step-into link, so you can walk a whole chain with a breadcrumb and a Back button. It reads each game's own event vocabulary, so a Victoria 3 event shows itsflavorline and itscancellation_triggerin place. - DDS and images: zoomable
.ddspreview, a PNG/JPEG/WebP to DDS converter in the explorer right-click menu, and Show Image Guidelines with the sizes vanilla actually uses. - Localization workflow: inline loc as inlay hints, BOM-correct quick-fix editing, a coverage view, and scaffolds for whole translation mods.
- Content scaffolds: New Content generates events, decisions, interactions and on_action hooks that are correct by construction.
- Live debugging: Launch Game (debug mode) plus a Toggle error.log Watcher that surfaces in-game script errors as editor squiggles.
- GUI and data types in
.guifiles: completion, hover, widget tree, and[Character.GetFather...]data-type chains that resolve through return types. - GUI editor (Open GUI Editor, Ctrl+Alt+P): a pixel-accurate rendering of your window that you can work in. Click to select the widget you meant, read its properties with the template or type each one came from, drag and resize on the canvas, and edit, add or remove a property row. Every change is one surgical edit to your file (comments, tabs and single-line bodies survive), and one Ctrl+Z. When the engine would ignore what a gesture asks for, the editor says so before the widget moves instead of writing a line the game drops. CK3-only, since its layout engine was calibrated against CK3 in-game screenshots.
- Multi-mod workspaces: every workspace mod is a first-class mod, indexed together, with per-mod tiger baselines and no "primary mod" to configure.
- A Claude/agent skill for CK3 modding
ships in
skills/ck3-modding/for AI-assisted modding. - Not tied to VS Code: the language server is standard LSP over
--stdioand runs from neovim, Zed, Helix or your own application — see Outside VS Code.
The Project panel: the game is auto-detected, and every workspace mod has its own toggles for what gets indexed and which mod the views follow.
Simulate Event walks an event beside its source, options and the effects they run included.
Select a node in the event graph: blue is what it fires, orange is what fires it.
- Install the extension, open your mod folder, and run Run Setup & Health Check. It detects the game, finds the install via Steam, checks the dump folder, and offers to download tiger where one exists. The walkthrough covers the rest.
- (Recommended on CK3, essential on Vic3 and EU5) Launch the game with
-debug_mode, open the console (`), runscript_docs, then run Reload Game Data (script_docs). On CK3 this upgrades the token data from the bundled wiki lists to your exact game version; on the other two it is where the engine vocabulary comes from in the first place. EU5 writes its dumps toDocuments/Paradox Interactive/Europa Universalis V/docs, not tologs/.
The default configuration is nothing: open your mod folder(s), run Setup once,
and everything else is optional. px.gamePath, px.logsPath and
px.tigerPath describe whichever game is active and are honored whenever you
set them; leave them empty and each game is detected on its own. Full
walkthrough and every setting are in the wiki:
Getting Started
and Configuration.
The full docs live in the wiki:
- Home
- Feature Overview
- Getting Started
- Supported Games
- Editor Features
- Sidebar Views
- GUI Editor
- DDS and Images
- Configuration
- Multi-Mod and Translation
- Claude Skill
- Credits
Working in a workspace with a total conversion or a dozen mods?
docs/PERFORMANCE.md
has the measured costs and the settings that shrink them.
The language server runs standalone over --stdio from any LSP client
(neovim, Zed, Helix, ...). Grab px-lsp-server-<version>.tar.gz from the
releases, or
px-lsp-win-x64-<version>.zip if you want one download that already contains
Node and a px-lsp.cmd launcher; setup,
the per-language capability table and the per-game matrix are in
packages/server/README.md.
Embedding the server in your own application (a mod manager, a custom editor)
is a supported, documented path:
docs/EMBEDDING.md
covers the process contract, initialization options, and the paradox/* wire
methods beyond standard LSP (event graph, mod overview, GUI layout, scope
inference), with docs/PROTOCOL.md
as the method-by-method reference.
Every game gets the same language core. This table is where the differences live, and it is deliberately blunt about them.
| Crusader Kings III | Victoria 3 | Europa Universalis V | |
|---|---|---|---|
| Language support (completion, hover, navigation, references, rename, diagnostics) | full | full | full |
| Folder schema | 156 entries, verified against a live install | 72 entries, verified against a live install | 518 entries, community-sourced and not yet verified against a live install |
Engine vocabulary before you dump script_docs |
bundled wiki + dump snapshot | bundled dump snapshot | none yet |
| Deep validation | ck3-tiger, auto-download | vic3-tiger, auto-download | none exists yet |
| Sidebar views, event graph, event simulator, mod report, coverage | yes | yes | yes |
.gui language support and Widget Tree |
yes | yes | yes |
.gui pixel-accurate visual editor (drag, resize, inspector writes) |
yes | no (calibrated against CK3 only) | no |
| Bundled AI modding skill | yes | no (CK3 content) | no (CK3 content) |
| Mod descriptor | descriptor.mod |
.metadata/metadata.json |
.metadata/metadata.json |
Existing CK3 users need to change nothing. px.gameId defaults to auto
and the detection ladder ends in CK3: a mod folder with a descriptor.mod is
CK3, a folder with .metadata/ plus in_game/-style stage folders is EU5,
.metadata/ alone is Victoria 3, and anything else stays CK3. Set px.gameId
explicitly if that ever guesses wrong.
First run on Vic3 or EU5: dump your own game data before judging the
completion. Launch with -debug_mode, run script_docs in the console, then
run Reload Game Data (script_docs) from the command palette. Only CK3
ships bundled wiki tables to fall back on, so for the other two this is the
step that fills in effects, triggers, event targets and modifiers. Run Setup
& Health Check puts it at the top of the report when it is missing. Vic3 and
EU5 write their dumps to Documents/.../<game>/docs, not to logs/.
EU5 honesty note: the EU5 folder-to-definition table is imported from the
community cwtools-eu5-config
rules (MIT, pinned commit) and has not been checked against a live install. The
damage a wrong entry can do is bounded on purpose: a minimal hand-verified set
of reference fields and zero required-localization patterns, so a mistake
costs you navigation, never a false error squiggle. Gaps are fixable without
waiting for a release through the <mod>/.eu5modding/schema.json overlay, and
reports are very welcome.
The same table with the detection ladder, the per-game dump paths and the schema-overlay recipe is on the Supported Games wiki page.
This is a beta shaped by the people who use it. The best thing you can do is tell me what breaks and what is missing:
- File an issue for bugs, false diagnostics, or feature ideas. Concrete examples from real mods are gold. Wrong or missing folder mappings, especially for EU5, have their own "Schema gap" issue form.
- PRs are welcome. The per-game schema tables
(
packages/server/src/games/<game>/schema.ts) are deliberately small and community-editable: adding a folder kind or loc requirement is a good first contribution. - Fork it and take inspiration. If a piece of this is useful in your own tooling, use it. It is GPL-3.0-or-later, so keep distributed derivatives open.
pnpm install
pnpm run compile # esbuild bundles dist/extension.js (client) + dist/server.js
pnpm run typecheck
pnpm test # vitest; copy dev-paths.example.json to dev-paths.json to also run the vanilla corpus suites
Layout (pnpm monorepo): packages/vscode/ (this extension) ·
packages/server/ (language server: parser, index, scopes, features, per-game
profiles, bundled data) · packages/protocol/ (types, wire protocol, shared
helpers) · packages/*/test/ (vitest suites incl. corpus/fixture tests). The extension is a
client/server LSP split: the thin client runs in the extension host, all parsing
and analysis lives in a separate server process. Everything game-specific sits
behind one GameProfile boundary that CI enforces. The architecture map and
conventions are in AGENTS.md.
The extension stands on work by others. The key sources and inspirations:
- tiger by amtep, the validator behind the ck3-tiger and vic3-tiger diagnostics integration.
- cwtools and cwtools-vscode, for the landscape and design inspiration.
- kaiser-chris/cwtools-eu5-config, the source of the EU5 folder schema (MIT, pinned commit; the Victoria 3 equivalent was used as a cross-check only). Full notices in THIRD-PARTY-NOTICES.md.
- jesec/ck3-modding-wiki, the source of the bundled CK3 fallback token lists (CC BY-SA 3.0, see ATTRIBUTION.md).
- Paradox's own in-game
_*.infoformat docs, the primary ground truth for the CK3 schema layers. No game assets are redistributed.
The complete table with licenses is on the Credits wiki page.
GPL-3.0-or-later. In short: use, modify and redistribute freely, but any distributed fork or derivative must publish its source under the GPL too. See LICENSE. Bundled third-party data keeps its own terms (the CK3 wiki token lists are CC BY-SA, see ATTRIBUTION.md; the EU5 schema import is MIT, see THIRD-PARTY-NOTICES.md).


