Nodes are the fundamental processing unit in kitengi. Each node has a kind, an ID, optional ports, and optionally a title and value.
Double-click anywhere on the canvas to open the node picker. Type the kind of node you want — for example value, add, print — and press Enter or click the result. The node appears at the position you clicked.
Every node has an ID — a unique programmatic identifier within its scope. IDs are lowercase, and may contain letters, digits, hyphens, and underscores. No spaces or other characters are allowed.
The app auto-generates IDs using the node kind with a number suffix for duplicates: value, value_2, value_3, and so on.
To change a node's ID, select it and edit the ID field in the right panel. IDs must be unique within the same scope (within the root program or within a single pattern).
A node may have a free-text title — a display name shown on the canvas in place of the ID. Titles can contain any characters and do not need to be unique.
To set a title, select the node and type in the Title field in the right panel.
.kti source. The title is only cosmetic — it makes the canvas easier to read. Use IDs when you need to reference a node; use titles to describe what a node is doing.
value nodes store a single value that they emit when triggered. Select a value node and type in the Value field in the right panel. The value can be a number (e.g. 42) or text (e.g. Hello).
constant nodes reference a named global constant by key. Set the key in the Value field. Global constants are declared in the .kti source using global:.
Click and drag any node to reposition it on the canvas. Nodes can be moved while threads remain connected.
Select one or more nodes and press Backspace or Delete. This also removes any threads connected to the deleted nodes.
| Kind | Inputs | Outputs | Description |
|---|---|---|---|
| start | — | trigger[null] | Fires once when the program begins. |
| value | trigger[null] | value[any] | Emits a stored value when triggered. |
| constant | trigger[null] | value[any] | Emits a global constant by key. |
| add | a[number], b[number] | result[number] | Emits the sum of a and b. |
| compare | a[any], b[any] | result[boolean] | Emits true if a equals b. |
| branch | condition[boolean], value[any] | true[any], false[any] | Routes value to true or false output. |
| merge | …[any] | out[any] | Forwards any arriving message immediately. |
| value[any] | — | Prints value to the console. | |
| sleep | value[any], ms[number] | value[any] | Delays the message by ms milliseconds. |
| loop | initial[any], next[any] | step[any] | Iteration building block. |
| map-get | map[any], key[text] | value[any] | Reads a value from a map. |
| map-set | map[any], key[text], value[any] | map[any] | Sets a key in a map. |
| split | list[any] | item[any] | Emits each item in a list individually. |
| join | item[any], count[number] | list[any] | Collects items into a list. |
| pattern | varies | varies | A reusable subgraph. Defined with { } blocks. |