nodekindby Elk Solutions

For authors who know the content

Your words.
The right structure.

01WRITEeditor4 Maintenance1Switch off the unit.2Open the service hatch.3Remove the filter cover.5 StorageKeep a spare filter in a dry place.4Check the filter every 500 hours.ALLOWED HEREStepNoteParagraphnot allowed herePosition: procedure › after step 3Position: procedure › step 401 Write+ step02SCHEMAXSDExample schema · content model of <procedure><xs:element name="procedure"><xs:complexType><xs:sequence><xs:element ref="title"/><xs:element ref="step" maxOccurs="unbounded"/><xs:element ref="note" minOccurs="0"/>step ✓ allowednote ✓ allowedpara ✕ not hereof 9 elements fit here987654302 Schema+ step03XMLnk:trail<procedure nk:id="p4"><title>Maintenance</title></procedure><step>…</step><step>…</step><step>…</step><step nk:id="s4"nk:author="m.vos"nk:timestamp="14:05">Check the filter every 500 hours.</step>valid · 0 errors03 XML+ step04OUTPUTyour pipeline4 Maintenance1Switch off the unit.2Open the service hatch.3Remove the filter cover.4Check the filter every 500 hours.authorTrail: m.vos · 14:05PDF · HTML · from your pipeline04 Output+ stepCheck the filter every 500 hours.Check the filter every 500 hours.Check the filter every 500 hours.

Your pipeline publishes the same step as is: valid, numbered and traceable.

Product illustration · not a live process

Write naturally. Nodekind reads your XML schema and offers what belongs at that exact position. The structure takes care of itself.

For authors who know the content and don't know XML

Any XML schema.
One editor.

nodekind reads your schema and offers exactly what is allowed here, and nothing else. Nothing to configure per element. No XML on screen. Switch documents on the right and watch what changes.

In the browser, or inside your own application. One price per organisation, never per seat. DITA, DocBook, JATS, TEI or your own XSD. Apache-2.0 core.

Why a schema is not enough, and still everything

An XSD says what is allowed: which elements, in which order, how often. It does not say what anything is called for the person who works with it. One 123-element schema we use daily carries seven lines of documentation in total.

nodekind keeps two things apart. Behaviour comes from the content model: what fits here, what does not, and why. Words come from a dictionary per vocabulary. Where a word is missing you see the schema name, never something invented.

The roles, what counts as a paragraph, a heading, a number, something you can move, the editor derives from the shape of the schema. That is why the same core edits four standards without a line of code per element, and why a new schema version breaks nothing.

STOP 1.3.0 and 1.4.1
94%
OEP, an XSD converted from a DTD
92%
FHIR narrative
100%

Of the roles, derived from the schema. The rest is named by hand and stays visible on screen. Measure your own XSD in your browser.

Three things to do in the demo

See what the schema knows, and what it does not

If you compare versions: one move is one change

Many schemas give identity to structural elements only. The paragraph, where the text lives, has none. Move it and a comparison of two versions sees a deletion plus an insertion.

nodekind assigns every node an identity when it is created and carries it along, in its own namespace next to the attributes of your standard. The same move then counts as one change instead of four. That saves work in every diff, every review and every publication.

1⁄4changes a comparison sees: with identity, and without. Replay it in the demo; ⌘D opens the comparison view.

Who changed what, and when

Switch it on and every change carries the author's name and the time: moving, inserting, splitting, typing, renumbering. The way Word tracks it, but in the XML itself and on the paragraph.

<p nk:id="nk-31" nk:author="N. de Vries" nk:timestamp="2026-09-07T14:02:00Z">
  The distance is not …
</p>

In nodekind's own namespace, so outside your standard. Your pipeline does not see it; your editorial team does: in the margin, and behind every row of the comparison view. The name comes from your application; nodekind has no user accounts.

Off by default. Not there yet: accept or reject per change. We build that as soon as an editorial team asks for it.

For the person who integrates it

One message in, one message out. That is the whole integration.

const editor = document.getElementById('editor');
let seq = 0;

function send(kind, extra = {}) {
  const request = { nodekind: 1, id: ++seq, kind, ...extra };
  editor.contentWindow.postMessage(request, location.origin);
}

window.addEventListener('message', (e) => {
  if (e.source !== editor.contentWindow) return;
  const { kind, state, xml } = e.data;
  if (kind === 'ready') {
    send('configure', { settings:
      { language: 'en', author: user.name, authorTrail: true } });
    send('schemaVersion', { version: schema.id });
    send('load', { xml: document.xml });
  }
  if (kind === 'changed') showSave(state);
  if (kind === 'xml')     store(xml);
});
Your application asks
load · getXml · validate · schemaVersion · vocabulary · state · configure · focusStructure · goTo · comments
The editor reports
ready · xml · changed · findings · state · follow · selection · comment · error
Your application sets
dictionary · showIdentity · showNotOffered · author · authorTrail · language · profilePack
From npm
npm i nodekind — connect(iframe) gives a typed client with a promise per request; nodekind/react has <NodekindEditor>. Dutch hosts keep the old names; the editor answers in the dialect it was asked in.
Same messages in
an iframe (window.parent) and a WebView2 control (window.chrome.webview)
A new schema
XSD files in a folder, one line in vocabulaires.json, optionally a dictionary. No build.
Runtime dependencies
@xmldom/xmldom, xpath. Nothing else. Apache-2.0.
We embed it ourselvesin three of our own products: two editorial consoles for Dutch legislation and one for electronic package leaflets. What works there works for you.
Your storage stays your storagenodekind is not a CMS. It receives XML, returns XML, and leaves versions, permissions and workflow to your system.
Your standard stays your standardwhat nodekind records for itself lives in its own namespace. Your schema stays valid; your pipeline stays in charge.

Pricing

The core is open. You pay per organisation, never per seat.

Free

€ 0self-hosted, Apache-2.0
  • the full editor, on your own server
  • all built-in schemas and dictionaries
  • iframe and WebView2 integration
  • community support
Get the source

Team

€ 99per month, hosted by us
  • unlimited authors
  • upload your own XSD
  • email support
  • card, cancel monthly
Start with Team

Embed

€ 499per month, inside your own application or on your own server
  • we finish the profile and dictionary for your schema, and keep it working across schema versions
  • business rules (Schematron) configured
  • response within one business day
  • 8 hours of help per month
  • invoice, yearly
Talk about Embed

Migration

€ 1,500one-off, from XMLmind
  • DITA or DocBook
  • your files measured: what the editor derives, what is missing
  • your schema, dictionary and rules set up
  • done before 3 April 2027
Plan the migration

Oxygen Web Author: about € 670 / month for 5 concurrent users. Fonto, Xeditor: quote only. XMLmind ends all products on 3 April 2027.

No seats. nodekind has no user accounts; your application says who the author is. The price does not grow with the number of authors.

Rule of thumb. Your own schema or your own application: Embed. A standard schema in our interface: Team.

What stops when you stop paying

Team: your account goes off.

Embed: your signed profile pack (dictionary, business rules) expires; 30 days of grace with a notice in the margin. The open core keeps working, with schema names only.

No phone-home, no licence check in the core.

About Nodekind

Freedom for authors. Care for structure.

Nodekind was born from the conviction that authors should be able to focus on their content. Technology should assist them in doing so, while preserving the structure and meaning of their documents.

A product of Elk Solutions, the technology company of Siebe Jongebloed. He develops the software independently, using AI agents and, where necessary, additional expertise from his network.

More about how Elk Solutions works

Contact

One email, and you know whether it works on your schema.

Attach an XSD and a document. We measure what the editor derives and send you the numbers.

Email Siebe JongebloedElk Solutions, the company behind nodekind