Convert Unreal Engine Blueprint screenshots or whole-asset JSON dumps into a compact, LLM-friendly text format you can paste into any chat. Single chain (one image), multi chain (a sequence of images), and a Dump mode that connects to a running editor over Python Remote Execution and exports an entire Blueprint asset — variables, components, every graph, every node, every wire — in a slim, single-line-per-node format that's roughly 1/7th the size of UE's default JSON output.
Pasting a Blueprint screenshot into an LLM works for ~5 nodes. Past that, the model misreads pin types, hallucinates connections, and misses comment regions. Pasting an entire 70k-line UE JSON dump blows past everyone's rate limits. Node2Text sits in between: it gives you OCR-quality text for small graphs (image mode) and a slimmed-but-faithful representation of huge graphs (dump mode), in a format that's already organized the way an LLM wants to read it.
Node2Text/
├── server.js # Express: /api/health, /api/convert, /api/ue/*
├── server/ueRemote.js # UE Python Remote Execution client (UDP discover + TCP commands)
├── src/ # React UI (App.jsx is the whole app)
├── vite.config.js # Dev server on :5173, proxies /api -> :8787
├── .env.example # Copy to .env, fill ANTHROPIC_API_KEY
├── package.json
└── ue-plugin/Node2TextDumper/ # Drop-in UE plugin (source-only)
├── Node2TextDumper.uplugin
└── Source/Node2TextDumper/
├── Node2TextDumper.Build.cs
├── Node2TextDumperModule.cpp
├── Public/BlueprintIntrospectionBFL.h
└── Private/BlueprintIntrospectionBFL.cpp
The web app is the front door. The UE plugin is optional — only needed if you want Dump mode (full Blueprint export). Image mode and Multi Chain mode work without it.
- Image mode — drop or paste a Blueprint screenshot, get back a structured text export plus a human-readable summary. Powered by Claude vision.
- Multi Chain — sequence of related screenshots; one request, one combined output with cross-step connections called out.
- Dump mode — connects to your running Unreal editor over Python Remote Execution (multicast UDP), runs a Python script that calls a packaged BFL function (
UBlueprintIntrospectionBFL.DumpBlueprintJSONByPath), reads the JSON, and slims it on the server before showing it to you. - Slim format — pin types collapsed to strings (
Object<Engine.Actor>,Map<Name, real>), node IDs shortened (n1,n2), links rendered as tuples (["n4.then", "n5.execute"]), each node on a single line. Engine-only/Script/...external refs are dropped so only your project's assets surface. - Copy / Send — the Output panel has a Copy button (clipboard) and a Send button (clipboard + opens
claude.ai/newin a new tab so you can paste with Ctrl+V).
| What | Version | Why |
|---|---|---|
| Node.js | 18+ | Runs the Express server + Vite client |
| Anthropic API key | any active key | Image / Multi Chain modes call claude-opus-4-7 |
| Unreal Engine (optional, Dump mode only) | 5.3+ | Source of Blueprint data |
git clone <this-repo> Node2Text
cd Node2Text
npm install
copy .env.example .env
# edit .env and paste your key after ANTHROPIC_API_KEY=
npm run devTwo processes start under concurrently:
- server →
http://localhost:8787(Express, talks to Claude + UE) - client →
http://localhost:5173(Vite, proxies/apito the server)
Open http://localhost:5173. The header pill should read "API key configured" (green dot). If not, check your .env and restart npm run dev — server-side env is read once at boot.
This is only needed if you want to use Dump mode. Image and Multi Chain modes work without any UE setup.
Copy the ue-plugin/Node2TextDumper/ folder into your UE project's Plugins/ directory, e.g.:
MyProject/
├── MyProject.uproject
├── Source/
└── Plugins/
└── Node2TextDumper/ <-- copy here
├── Node2TextDumper.uplugin
└── Source/...
(If your project doesn't already have a Plugins/ folder, create it.) Then either right-click your .uproject and choose Generate Visual Studio project files, or open the project — UE will prompt you to compile the new module.
In the editor, Edit → Plugins:
- Python Editor Script Plugin — required (the BFL is called from Python).
- Editor Scripting Utilities — required.
Restart the editor when prompted.
Edit → Project Settings → Plugins → Python, tick Enable Remote Execution. Leave the multicast group at 239.0.0.1 and port 6766. Restart the editor once more so the multicast socket binds at startup.
Open the editor's Python console (Window → Developer Tools → Output Log, switch input to "Python") and run:
import unreal
print(hasattr(unreal, "BlueprintIntrospectionBFL")) # -> True
print(hasattr(unreal.BlueprintIntrospectionBFL, "dump_blueprint_json_by_path")) # -> TrueIf both are True, the plugin compiled and Python sees it. If either is False, check the editor's Output Log for compile errors and confirm the plugin appears in Edit → Plugins → Editor.
- In the Node2Text UI, switch the source dropdown from Image to Dump.
- Click Connect — the server multicasts a
ping; your editor replies within ~1.5 s. The detected editor shows up as a chip with project name + engine version. - Type a Blueprint package path, e.g.
/Game/Characters/BP_Hero.BP_Hero(always include the.AssetNamesuffix), or paste a Windows filesystem path (C:\...\Content\...\BP_Hero.uasset) — the server normalizes it. - Click Dump. The server pipes the bundled Python script into UE, captures stdout, slims the JSON, and shows it in the Output pane. Hit Copy to put it on your clipboard, or Send to open
claude.ai/newin a new tab (with the dump pre-copied so you can paste once you're there).
UE's default JSON pretty-printer is verbose: each pin type spans 7 lines, each link spans 7 lines, and /Script/Engine.* refs flood the externalReferences list. The server-side slimmer:
- Extracts the JSON object from UE's stdout (skips surrounding log lines).
- Drops empty strings, empty arrays,
subCategory: "None",container: "single",isReference: false,isConst: false. - Collapses pin types to compact strings:
bool,real(double),Object<Engine.Actor>,Array<Struct<FVector>>,Map<Name, real>. - Replaces full node GUIDs with short IDs (
n1,n2, …) and rewrites all link references to use them. - Replaces pin GUIDs in links with pin names (which are unique within a node), so a link reads
["n4.then", "n5.execute"]instead of{"from":{"node":"GUID","pin":"GUID"},"to":{"node":"GUID","pin":"GUID"}}. - Strips the
K2Node_prefix from node classes (CallFunctioninstead ofK2Node_CallFunction). - Filters
externalReferencesto/Game/...only (drops/Script/Engine.*,/Script/CoreUObject.*, etc.). - Re-serializes with a custom pretty-printer that puts each node, pin, link, and variable on a single line — but keeps graphs and the top-level structure indented.
A typical reduction is ~7× (e.g. 70k lines → 10k lines on a complex character BP).
| Symptom | Likely cause | Fix |
|---|---|---|
| "API key missing" banner | .env not present or key blank |
Copy .env.example to .env, fill in the key, restart npm run dev (env is read at server boot) |
| Connect returns no instances | Remote Execution not enabled, or multicast blocked by Windows Firewall / Hyper-V virtual adapters | Enable in Project Settings → Python, restart editor; allow node.exe on Private networks; ensure both processes are on the same machine (default TTL is 0) |
| "UE did not connect — is Python Remote Execution enabled?" | Editor saw the multicast but didn't open the TCP back-channel within 5 s | Toggle Remote Execution off/on in Project Settings; check Output Log for LogPython errors |
| AttributeError: module 'unreal' has no attribute 'BlueprintIntrospectionBFL' | Plugin not compiled, or compiled but not loaded | Check Edit → Plugins → Editor — Node2Text Dumper must be enabled. Rebuild via your IDE or by deleting Binaries//Intermediate/ and reopening the project |
| AttributeError: type object 'BlueprintIntrospectionBFL' has no attribute 'dump_blueprint_json_by_path' | Likely a stale Python reflection cache after Live Coding | Full editor restart picks up new UFUNCTIONs |
Dump returned no output |
The Python template didn't print(...) to stdout |
Use the bundled default template, or make sure your custom script prints the JSON |
| SyntaxError: 'unicodeescape' codec can't decode | A Windows path got injected into a Python string with raw backslashes | Already handled — the server now escapes backslashes when substituting {{path}}. Update if you see this on an old build |
| 429 rate_limit_error from Anthropic | Trying to send a huge dump through the API | Use Copy or Send for dumps — they bypass the API. The API is only used for image modes |
Image mode: Dump mode:
Browser Browser
↓ multipart upload ↓ JSON { remoteNodeId, blueprintPath, pythonTemplate }
Express /api/convert Express /api/ue/dump-and-convert
↓ Anthropic SDK ↓ ueRemote.runCommand()
Claude (vision) ↓ multicast UDP open_connection
↓ text ↓ TCP back-channel command
Browser displays Unreal Editor (Python)
↓ unreal.BlueprintIntrospectionBFL.dump_blueprint_json_by_path()
↓ writes Saved/BlueprintDumps/<Name>.json
↓ reads file, prints to stdout
Express captures stdout → slimDump() → response
↓
Browser displays
MIT. See LICENSE.
The UE plugin's UBlueprintIntrospectionBFL was extracted from a larger editor-tooling module into a standalone, editor-only plugin for this release.