Skip to main content
This page documents every node available in Streemlined. Nodes are the building blocks of a pipeline and fall into four categories.

Sources

Source nodes ingest data into your pipeline from external systems. Every source has a single output port.

Kafka Consumer

Consumes records from one or more partitions of a Kafka topic. Output: One record per Kafka message, with its schema inferred or fetched from Schema Registry.
When using Schema Registry, Streemlined automatically fetches and displays the schema in the editor so downstream nodes can offer auto-complete.

CSV Source

Reads records from a local CSV file — useful for development, testing, and seeding reference data. Output: One record per CSV row, with field names taken from the header (or positional indices if skipHeader is false).
CSV Source is primarily intended for local development and testing. For production ingestion, prefer Kafka Consumer or a dedicated connector.

JDBC Source

Polls rows from a relational database table and ingests them into the pipeline using the JDBC Source Connector. Output: One record per row returned by the connector, with schema fetched from the table or configured in the editor.
Use the Fetch Schema button in the editor to auto-populate the output schema from the selected table.

Generic Connect Source

Uses any Kafka Connect source connector to ingest data from external systems. Output: One record per message emitted by the connector, with schema inferred or configured in the editor. The Generic Connect Source lets you use any Kafka Connect source connector. Place the connector JAR in the libs/ directory and configure it here.
Use Fetch Schema in the editor to contact the connector with the current settings and infer an output schema. See Connector Plugins for details on installing connectors.

Processors

Processor nodes transform, route, filter, or enrich data as it flows through the pipeline. Each processor has at least one input and one output port.

Transform

Transforms records using JSONata expressions. Input: Any record Output: Transformed record based on the JSONata expression The Transform node is the workhorse of most pipelines. Use it to:
  • Map between schemas
  • Reshape data structures
  • Compute derived fields
  • Filter out unwanted fields
  • Combine multiple fields
See Transformations to learn JSONata syntax and best practices.
Rename fields:
Flatten nested objects:
Conditional logic:
Aggregate arrays:

Branch

Routes records to different outputs based on conditions. Each branch contains:
  • id — Unique identifier
  • label — Display name
  • condition — JSONata expression that returns true or false
Input: Any record Output: Multiple outputs — one per branch, plus a default output Records are evaluated against each condition in order. The first matching condition routes the record to that branch’s output. Records that match no condition go to default.
Conditions are evaluated in order. Place more specific conditions before general ones to avoid unexpected routing.

Merge

Combines multiple parallel input streams into a single output stream (fan-in). Inputs: Multiple inputs — input-0 through input-(n-1) Output: One merged stream on output Input 0 defines the schema for all inputs and the output. Connect the primary stream to input 0; additional inputs must match that schema.
Use Merge after a Branch node to reunite split streams, or to combine records from independent sources that share the same schema.

Explode

Expands an array field into individual records (a flatMap operation). Input: Record containing an array field Output: One record per array element, with the array replaced by its individual items Use Explode when you need to process array elements individually. For example, if an order contains multiple line items, Explode creates a separate record for each item.
Before — one record:
After — two records:

Lookup

Enriches records by joining with cached reference data (stream-table join). Inputs:
  • input (left) — Main data stream
  • reference (top) — Reference data, cached in memory
Outputs:
  • output — Enriched records
  • reject — Records with no match (only when behavior is REJECT)
The reference data is loaded into an in-memory cache keyed by cacheKey. For each incoming record, lookupKey is evaluated and matched against the cache.
Choose CONTINUE if missing reference data is acceptable — the lookup field will be null. Choose REJECT to route unmatched records to a separate output for error handling or dead-letter queues.

JDBC Request-Reply

Enriches each record by executing a parameterized SQL query against a relational database. Input: Any record Outputs:
  • output — Record enriched with the query result in fieldName
  • reject — Records where the query returned no rows (only when behavior is REJECT)
Unlike Lookup, which joins against a pre-cached dataset, JDBC Request-Reply executes a live query per record (or per batch). This is ideal when reference data is too large to cache or changes frequently.
Enable batchSupport when enriching high-throughput streams — queries are grouped into batches, significantly reducing round-trips to the database.

Peek

Observes records without modifying them — useful for debugging and monitoring. Input: Any record Output: Same record, unmodified Use Peek to:
  • Debug pipeline behavior during development
  • Log records at specific points in the pipeline
  • Inspect data shapes between processing steps
Peek output appears in the console panel in the editor. Use it liberally during development, then reduce log levels or remove Peek nodes before deploying to production.

Data Masking

Masks sensitive fields in each record’s value — redaction, nulling, numeric jitter, or synthetic replacement via Datafaker expressions. Input: Any record with a JSON object value Output: Same record shape with masked fields applied; if there are no rules, or the value is missing, the record passes through unchanged. Field paths use dot notation for nested structs. Append [] to a segment to apply the rule to every element of an array at that path (for example, items[].email masks email inside each item). mask values are matched case-insensitively at runtime.
Unknown mask values are logged and the field is left unchanged. VARIANCE on non-numeric fields is skipped with a warning.
Configure rules in the node editor from the incoming schema. The editor derives the output schema for downstream nodes (for example, REDACT / FAKER may widen types to string; NULL may mark fields optional).

Transform SMT

Applies a Kafka Connect Single Message Transform (SMT) to reshape records in flight. Input: Any record Output: Record transformed by the configured SMT Use Transform SMT when you need standard Kafka Connect transforms — such as ExtractField, ReplaceField, or Cast — without writing custom code. Configure both input and output schemas in the editor so downstream nodes can validate the result.
Press Ctrl+Space in the properties editor for autocomplete suggestions based on the selected SMT class.

Code Transform

Transforms records using Python or JavaScript code. Input: Any record Output: Transformed record based on the code Each record is passed to your code as input (the record value). The last expression or assigned output variable becomes the transformed value. Use the built-in code editor to write, test, and debug transforms with sample data.
Open the Code Editor from the node properties panel for syntax highlighting, sample input, live execution, and an AI assistant.
Configure input and output schemas in the editor. The output schema defines the shape downstream nodes expect.

Sinks

Sink nodes write data from your pipeline to external systems. Every sink has a single input port and no outputs (terminal nodes).

Kafka Producer

Produces records to a Kafka topic. Input: Any record Output: None (terminal node)

JDBC Sink

Writes records to a relational database table. Input: Any record (fields must match table columns) Output: None (terminal node) The JDBC Sink maps record fields to table columns by name. Ensure your upstream transformation produces a schema compatible with the target table.
Column names are case-sensitive. Ensure your field names exactly match your database column names.

Generic Connect Sink

Uses any Kafka Connect sink connector for output. Input: Any record Output: None (terminal node) The Generic Connect Sink lets you use any Kafka Connect sink connector. Place the connector JAR in the libs/ directory and configure it here.
Check the connector documentation for available configuration options. Streemlined passes configuration directly to the connector. See Connector Plugins for details on installing connectors.

Utility

Utility nodes help organize and document your pipeline but do not affect data processing.

Comment

Adds a text annotation to the pipeline canvas. Comment nodes are visual-only — they have no ports and are ignored at runtime. Use them to:
  • Document the purpose of a pipeline section
  • Leave notes for teammates
  • Mark areas that need future work
Comments are saved as part of the pipeline definition but have no effect on execution.

Next Steps

Transformations

Learn JSONata syntax and best practices

Configuration

Configure Kafka clusters, databases, and more

Interactive Testing

Test your pipeline with stubbed sources and sinks

Core Concepts

Understand schemas, ports, and data flow