# Update on the NLP Engine and VisualText

**URL:** <https://nlp.discourse.group/t/update-on-the-nlp-engine-and-visualtext/90>\
**Category:** General\
**Created:** [August 27, 2026, 10:02pm UTC](https://nlp.discourse.group/t/update-on-the-nlp-engine-and-visualtext/90 "2026-08-27T22:02:28Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![dehilster](https://yyz2.discourse-cdn.com/free1/user_avatar/nlp.discourse.group/dehilster/32/11_2.png) [@dehilster](https://nlp.discourse.group/u/dehilster)\
**Post date:** [August 27, 2026, 10:02pm UTC](https://nlp.discourse.group/t/update-on-the-nlp-engine-and-visualtext/90/1 "2026-08-27T22:02:28Z")

</div>

Since July 4 the VisualText org has seen **688 commits across 20 repositories** — 504 of them non-merge — and a lot of it lands in places you’ll notice. Here’s the whole sweep.

The headline numbers:

| Component | July 3 | Today | Releases |
| --- | --- | --- | --- |
| NLP Engine | 3.7.0 | **3.8.12** | 24 |
| VS Code extension | 3.2.12 | **3.12.16** | 55 |
| visualtext files | 2.7.0 | **3.13.15** | 32 |
| npm `nlp-engine` | 1.2.14 | **1.3.24** | 28 |
| PyPI `nlp-engine` | 2.1.5 | **2.2.24** | 28 |

* * *

## NLP Engine: 3.7.0 → 3.8.12

**The language got bigger.** NLP++ picked up a real standard library this summer:

- **Strings and arrays** (3.8.0) — string joining, substring search, array utilities
- **Files and regex** (3.8.0) — `readfile`, `readlines`, `dirlist`, and _real_ regular expressions
- **JSON** (3.8.2) — `jsonwrite` and `jsonparse` as builtins
- **Math** (3.7.13) — `floor`, `ceiling`, `round` and friends
- **Block comments** (3.7.14) — C-style `/* */` everywhere the engine takes comments, including the data formats
- **Line comments in `analyzer.seq`** (3.8.12) — `//` finally works in the sequence file, and comments and blank lines survive a save
- **User functions can shadow a builtin** of the same name (3.8.0)
- **Function names** can now contain digits and underscores (#698)
- **`$dev` and `$silent`** (3.8.4) expose the engine’s run mode to NLP++

**Dictionary and KB correctness.** A cluster of long-standing issues got closed: quoted numeric dict values stay strings (#385), punctuation survives in unquoted attribute values (#481), currency and symbol characters tokenize as punctuation instead of control characters (#500), numeric KBB attribute values read back as numbers (#439), `deaccent()` is UTF-8 aware instead of Latin-1 byte-based (#488), and every attribute on an inline KBB sense line is preserved. Over-long dictionary lines now recover instead of silently dropping the rest of the file, and the dict-line tokenizer no longer overflows past 30 tokens.

**Compiled analyzers** grew up: Python passes work in them (3.7.10), lazy `*full.dict` / `*full.kbb` open correctly (3.7.9), and per-run JSON/KBB data pairs load in compiled-KB analyzers (3.7.12). User-KB load is deferred until the first tokenizer pass so pre-tokenizer passes actually run first.

**Speed.** Codegen now emits one function per rule instead of one giant switch. Analyzer compiles use a unity build with `/MP`. The engine stopped flushing on every write and on every token while dumping the parse tree, caches match-table transcoding, added ASCII fast paths through the hot string functions, and stopped leaking an ICU collator per call. An O(n³) `struniquechars` is gone. Runs now end with a **ranking of the slowest passes** (3.8.3) so you can see where the time went.

**Housekeeping:** include guards added to 41 headers that lacked them, the unbuildable QDBM variant libraries and the `lite`/`hold` trees removed, and CI now caches vcpkg and builds in parallel.

* * *

## VS Code extension: 3.2.12 → 3.12.16

This is where the summer’s biggest visible change lives.

**NLP++ became a first-class language in the editor.** Over 3.5.0–3.9.1 the extension gained a full language-intelligence layer: context-aware IntelliSense completion, signature help for function calls, region and rule folding, semantic highlighting, quick fixes for misspelled calls, and hover that links straight to a built-in’s own help page. Plus a document and selection formatter (3.3.0) and a standard language configuration (3.12.3).

**The parse-tree graphic** (3.10.0 onward) — `.tree` files now render as a real linguistic tree: collapsible nodes, fit-to-window, drill in one node at a time, right-click _Graph Entire Tree_ or _Graph Selected Portion of Tree_, _Reveal Text_ on any node, and overlap-driven staggering so labels stop colliding at every level. Tree files open instantly; the graphic is strictly on demand.

**The updater got fixed properly.** It no longer deletes the whole `visualText` directory, no longer hangs unzipping (native `tar` now), checks the same engine directory it downloads to, self-heals, and has a Stop button that works.

**Analyzer deployment** — you can now deploy a stand-alone compiled analyzer to its own folder, Python pass scripts included, and cloud compile is the default mode with a hosted dispatcher URL.

**Smaller things you’ll feel:** Find results are prefixed with the pass number and mark inactive (I) and orphan (O) passes (#787), multi-select delete in the Text view (#755), a Helpful Links node in the Help view, Insert Python Library Pass from the `visualText/python` library, a `# MODIFIED` header stamped on pass save (#849), KB and sequence tooltips that show the file’s header comment, LLM prompts that copy to the clipboard, and opening files after an analyzer run is no longer delayed.

**Under the hood:** a VS Code integration test harness (which promptly found and fixed six broken commands), a pure-logic suite for the language engines, cross-pass definition/reference/rename tests, TypeScript 6, dependabot, a security policy, CI that runs the harnesses on every PR and publishes the vsix on a tag, four dead dependencies dropped, and the last npm advisories cleared. **Anonymous opt-out usage telemetry** landed in 3.4.0 and expanded in 3.12.0 to record which shipped analyzers and templates actually get used.

* * *

## Packages

`putJsonFile` / `putJsonObject` (Node and TypeScript) and `put_json_file` / `put_json_object` (Python) let you feed JSON straight into an analyzer’s KB — the same capability across all three bindings. The Python package also loads pre-compiled analyzers now, with ICU preload.

* * *

## Linguistic data and help

**English resources** added to visualtext-files: `en-lemmas.kbb` (inflected form → root), `en-roots.kbb` (lemma → inflection, for generation), `en-synonyms-full.kbb` (WordNet synonym table), plus nationality, academic-degree, and subject/field-of-study dictionaries with matching knowledge bases, and KBB lookup tables generated from value-bearing dicts.

**`json2kbb.py`** — a Python pass that scans `kb/user` for `.json` files and builds the missing `.kbb` files.

**Help got a Version 3 pass** : an announcement with a screenshot of the whole workbench, a parse-tree help page, and documentation for the new math functions, the 3.8.0 builtins, function shadowing, `jsonwrite`/`jsonparse`, block comments, and a Python & Node.js package usage page.

**“Prime Claude for NLP++”** — the old build-analyzer prompt has been repurposed into a prompt that hands an LLM the map of the NLP++ help files, tells it that `.dict` and `.kbb` are the KB source files, when a KB beats a dictionary, and never to edit `KBFuncs.nlp`. It’s first in the LLM Prompts list.

**Sequence tooltips** — every pass in the shipped analyzers now has a description, so hovering a pass in the sequence view tells you what it does. This went out across `analyzers`, `parse-en-us`, `nlp-tutorials` and `nlpfix-analyzers`.

* * *

## New repos

- **`nlpplus-tmbundle`** — the NLP++ TextMate grammars, extracted from the extension into their own repo and pulled back in as a submodule. Writing a Pygments lexer against them turned up three scoping bugs and a set of operator and bracket gaps, all fixed.
- **`nlp-studio`** — an online NLP++ analyzer editor modeled on the VS Code extension. Phase 1 is an openvscode-server stopgap, with a Linux server deployment guide.

Also: **`pt`** , the Brazilian Portuguese phrase parser, got its first tagged release and now recognizes contractions as preposition + determiner.

* * *

Everything above is public at [github.com/VisualText](https://github.com/VisualText). Questions and bug reports welcome — a good number of the fixes listed here came straight off the issue tracker.
