Skip to main content

lvkit

Read, render, document, and diff LabVIEW VI files — no LabVIEW license required.

lvkit parses .vi, .ctl, .lvclass, .lvlib, and .lvproj files directly into queryable dependency and dataflow graphs. From that graph it renders block diagrams, describes what a VI does, generates documentation, and diffs two versions — from a terminal, in CI, or through an AI agent. It can also generate a Python transliteration of a VI, though that path is experimental and how far it gets varies from VI to VI.

Reads, never writes. lvkit only ever reads a VI — it never modifies, re-saves, or edits one. Every capability, including convert, parses the source and writes to a separate output file; your .vi files are never touched, and LabVIEW stays the only thing that authors them.

Independent, clean-room project — not affiliated with NI. Built from public NI documentation, the open-source pylabview parser, and observation of VI files — with no LabVIEW install and no NI source or non-public specifications. Details in Cleanroom approach; see also NOTICE and PROVENANCE.md.

Contents

Quick Start

pip install lvkit
lvkit setup

For a global install: pipx install lvkit or uv tool install lvkit.

lvkit setup creates a .lvkit/ resolution store and installs AI agent skills:

  • Auto-detects Claude Code (CLAUDE.md / .claude/), Copilot (.github/copilot-instructions.md / .github/instructions/ / .github/agents.md), and Codex (AGENTS.md / AGENTS.override.md / .agents/ / .codex/)
  • Pass claude, copilot, codex, or all to be explicit
  • Use --no-skills to create the .lvkit/ store without installing any skills
Command Description
lvkit describe Human-readable VI summary: signature, operations, dataflow, structures
lvkit render Render a VI's block diagram to a faithful SVG (or interactive HTML)
lvkit diff Compare two VI versions — operations, structures, wiring, constants
lvkit docs Generate cross-referenced HTML documentation
lvkit visualize Interactive dataflow or dependency graph (HTML)
lvkit generate Generate Python from a VI, library, or class (experimental — see Cleanroom approach)
lvkit index / lvkit query Index a whole repo, then ask project-wide questions in read-only SQL (docs)
lvkit callers / callees / blast-radius Call graph & change impact: who calls a VI, and what breaks if you change it (docs)
lvkit structure Inspect .lvproj, .lvlib, or .lvclass structure
lvkit detect Detect a locally installed LabVIEW and its vi.lib / user.lib
lvkit setup Install AI agent skills; create the .lvkit/ resolution store
lvkit mcp Start the MCP server for IDE integration

describe, render, diff, docs, and visualize work from the graph alone and need no semantic mappings. Only generate requires primitive/vi.lib mappings. lvkit visualize needs the pyvis extra: pip install lvkit[visualize].

What you can do with it

Describe what a VI does

A human-readable signature, inputs/outputs, operations, and control flow — without opening LabVIEW.

lvkit describe <path-to.vi> [--search-path <libraries/>] [--verbose]

--verbose adds a full netlist — a text projection of the block diagram.

Render the block diagram

Render a VI's block diagram to a faithful, self-contained SVG — nodes, wires, structures, and SubVI icons, all drawn from the parsed graph. No LabVIEW, no screenshots.

lvkit render <path-to.vi> [--format {svg,html}] [--theme {light,dark,auto}] [--search-path <libraries/>]

--format html writes an interactive single-VI viewer with zoom/pan and a light/dark diagram-theme toggle; hover a node to see its connector pane and documentation. The same renderer powers diff --format html and the VS Code extension.

Diff two versions of a VI

See what changed between two .vi files — added/removed operations and structures, rewired connections, changed constants. Useful in code review and CI.

lvkit diff <vi-a> <vi-b> [--format {text,json,html}] [--open]

Text (the default) is a concise, logical change summary for stdout or CI. --format json emits a UID-correlated change map for scripts or an AI agent. --format html (or --open) writes an interactive diff viewer — synced before/after panes, click a change to spotlight it, deep-linkable.

Generate documentation

Cross-referenced HTML docs for a .vi, .lvlib, or .lvclass — inputs, outputs, operations, wiring diagrams.

lvkit docs <input-path> <output-dir> [--search-path <libraries/>]

Generate Python (experimental)

This is lvkit's least mature capability, and the one most likely to need hand-finishing. It walks the graph to emit a Python transliteration of a .vi, .lvlib, or .lvclass. The transliteration is deterministic (same VI in, same Python out, no LLM), but coverage is incremental: a VI only converts cleanly when every primitive and vi.lib VI it uses is already mapped, so how far it gets varies widely. Expect to resolve unknowns and clean up the output — see Cleanroom approach.

lvkit generate <input-path> -o <output-dir> [--search-path <libraries>] [--placeholder-on-unresolved]

--placeholder-on-unresolved lets the build succeed when mappings are missing — unresolved calls become inline raise PrimitiveResolutionNeeded(...) in the output so you can track them down at runtime.

How it works

lvkit reads VI binaries directly — no LabVIEW installation required. The pipeline has three stages:

  1. Parse — the VI binary is extracted to XML (via pylabview), then parsed into a typed representation of the block diagram: nodes, wires, constants, types, and front panel terminals.

  2. Graph — all loaded VIs are linked into a graph that captures two things: the dependency tree (which VIs call which) and the dataflow within each VI (how data moves between operations). This is what describe, render, diff, docs, and visualize query — no semantic mappings needed.

  3. Generate — the graph is walked deterministically to produce Python source, HTML documentation, or diagrams. Code generation is pure AST construction: same VI in, same output every run, no LLM.

See the command reference for full, flag-level docs on every command.

Editor and AI integration

The CLI works standalone from any terminal or CI script. For deeper integration, lvkit ships three optional layers.

VS Code extension — LVKit on the Marketplace. Opening a .vi renders its block diagram inline instead of the "binary file" placeholder, and clicking a SubVI opens it. Open Visual Diff — right-click a changed .vi in Source Control, the Explorer, or the editor tab — shows a before/after block-diagram diff for code review. It ships a bundled lvkit, so it works with no separate install; point the lvkit.path setting at a project venv or a PATH install to use your own instead. .vi files only today.

AI agent skills — install lvkit's built-in workflows into Claude Code, GitHub Copilot, or OpenAI Codex so your AI agent can describe VIs, convert them, and resolve unknowns without you writing prompts. All five workflows call the CLI under the hood — no MCP server required.

lvkit setup           # auto-detect from project layout
lvkit setup claude    # installs .claude/skills/lvkit-*
lvkit setup copilot   # installs .github/prompts/ + router instruction
lvkit setup codex     # installs .agents/skills/lvkit-*
lvkit setup all       # Claude Code, Copilot, and Codex

Five workflows ship: lvkit-describe, lvkit-convert, lvkit-resolve-primitive, lvkit-resolve-vilib, lvkit-idiomatic.

MCP server — for interactive IDE sessions where your AI agent needs to load a graph, walk wires, and ask follow-up questions across multiple VIs:

{
  "mcpServers": {
    "lvkit": { "command": "uvx", "args": ["--from", "lvkit", "lvkit-mcp"] }
  }
}
Tool Description
load Load a VI into the in-memory graph
list_loaded List loaded VIs
clear Clear the in-memory graph
get_context Full VI context: inputs, outputs, operations, wires
describe Human-readable VI description
get_operations List operations in a VI
get_dataflow Show wire connections
get_structure Inspect a structure node (loop, case, sequence)
get_constants List constant values
generate_ast_code Generate Python from a loaded VI
generate_documents Generate HTML docs for VIs/libraries (stateless)
generate_python Generate Python from a VI (stateless)

Cleanroom approach

lvkit has no access to LabVIEW source code or runtime. LabVIEW's built-in primitives and standard library VIs are semantically replaced: each operation is mapped to an equivalent Python implementation in open, inspectable JSON data files (src/lvkit/data/primitives.json, src/lvkit/data/vilib/).

These mappings are lvkit's own definitions, derived purely by inference from two public inputs and nothing else:

  1. Public NI documentation — pages published openly on ni.com, accessed with no login, partner portal, or NDA gate.
  2. The VI XML produced by pylabview — the open-source parser that extracts the VI binary to XML. That XML is lvkit's only window into the format; lvkit has no other view of it.

The definitions are open source and fully inspectable, and many carry a note recording how each was inferred (the public doc consulted, the observed terminal signature, a verified/guess_reason marker). They are best-effort inferences, not authoritative — they have been wrong and corrected over time. That imperfection is a direct consequence of working from only public documentation and the pylabview XML, with no access to any internal or authoritative NI specification.

Coverage is incremental. When lvkit generate encounters an unmapped primitive or vi.lib VI, it raises an error with diagnostic context so the mapping can be added. describe, render, diff, docs, and visualize are unaffected — they work from the graph, not the semantic mappings.

Provenance

lvkit was developed using only publicly available information and clean-room methods. It was built without installing or running LabVIEW or any NI software, and with no NI source code, internal or non-public specifications, or confidential or proprietary materials. Facts about LabVIEW's behavior are used as facts; no NI documentation prose or artwork is copied or redistributed — primitive glyphs are drawn procedurally, and the shipped data contains no NI text or images. See PROVENANCE.md.

Trademarks

LabVIEW, NI, and National Instruments are trademarks of National Instruments Corporation. lvkit is an independent project and is not affiliated with, authorized by, endorsed by, or sponsored by NI. Those names are used only to identify the file format and software lvkit interoperates with (nominative use).

Project-local resolution store (.lvkit/)

You can supplement the bundled mappings with a .lvkit/ directory in your project root. lvkit reads .lvkit/ first and falls back to its bundled data.

Run lvkit setup --no-skills to create the store with a README that documents the file layout and JSON formats for adding primitive and vi.lib mappings manually.

When lvkit generate hits an unknown, you have two options:

  1. Resolve up front — run lvkit setup to install the resolve skills and let your AI agent write the mapping into .lvkit/.
  2. Defer to runtime — pass --placeholder-on-unresolved. lvkit emits an inline raise PrimitiveResolutionNeeded(...) in the generated Python with full diagnostic context. The build succeeds; runtime fails at the unresolved call.

Development

uv sync
pytest
ruff check .
python -m pyright src/

See CLAUDE.md for contributor workflow, code style, and how to add primitive or vi.lib mappings.

License

Apache-2.0. See LICENSE.

Further reading

Metadata

Release files for lvkit 0.8.7

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for lvkit 0.8.7
File Size Uploaded
lvkit-0.8.7.tar.gz 6.1 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for lvkit 0.8.7
File Interpreter ABI Platform
lvkit-0.8.7-py3-none-any.whl Python 3 none any Details

Total release size: 8.1 MB

Release files / lvkit-0.8.7.tar.gz

Download URL lvkit-0.8.7.tar.gz
Size 6.1 MB
Tags Source
SHA-256 checksum
How to use checksums
a5bab84c6a3d014ebc8014d42610d29db66dc1bcfa94043ea0f199f04eb4f903
BLAKE2b-256 checksum
How to use checksums
56378179356f62633b65fe5f7f0878bbbf85fd68a4a3455a289537215e994fa2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 4, 2026.

Transparency log

Release files / lvkit-0.8.7-py3-none-any.whl

Download URL lvkit-0.8.7-py3-none-any.whl
Size 1.9 MB
Tags Python 3
SHA-256 checksum
How to use checksums
fc867fde4cab6790253192fd54ecd86a3ed974e11b2dcc829d90efa0539427da
BLAKE2b-256 checksum
How to use checksums
68b6630d9493dad5de37a579b4be515cab5b86f7ed5c6caec3ae7d370dab317b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 4, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.8.7 This release

2 release files

0.8.6

2 release files

0.8.5

2 release files

0.8.4

2 release files

0.8.3

2 release files

0.8.2

2 release files

0.8.1

2 release files

0.8.0

2 release files

0.7.6

2 release files

0.7.5

2 release files

0.7.4

2 release files

0.7.3

2 release files

0.7.2

2 release files

0.7.1

2 release files

0.7.0

2 release files

0.6.3

2 release files

0.6.2

2 release files

0.6.1

2 release files

0.6.0

2 release files

0.5.8

2 release files

0.5.7

2 release files

0.5.6

2 release files

0.5.5

2 release files

0.5.4

2 release files

0.5.3

2 release files

0.5.2

2 release files

0.5.1

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page