Skip to content

Architecture Overview

Cyntex Runtime Architecture

Cyntex is organized into four cooperating layers: Engine (data movement), Store (persistence), Serve (data access), and Manager (control plane). Each layer has a clear responsibility boundary and communicates through well-defined interfaces.


Cyntex Manager

The top-most layer provides the control plane and observability surface. It is accessible via the Web Console and CLI, and exposes all operational capabilities through the MCP server so AI agents can operate Cyntex programmatically.

CapabilityDescription
MCPIn-process MCP server; AI agents (Claude, GPT-4o, …) connect and issue CRUD + lifecycle commands
ObservabilityTask status, throughput, lag, error rates — real-time and historical
Lineage & Data TraceField-level lineage tracking from source to materialized view or API output
ValidationThree-layer DSL validation: structural → reference closure → connector capability matrix
SecurityAuth, token management, RBAC (enterprise plugin, post-GA)

The Manager issues control signals to the Engine via a downward interface — it does not sit in the data path.


Cyntex Engine

The Engine is the data-movement core. All data captured from source systems flows through this layer before reaching storage or consumers.

CDC Capture

The entry point for all source data. Cyntex reads the database transaction log (binlog for MySQL, WAL for PostgreSQL, oplog for MongoDB) directly — no polling, no triggers. This gives sub-second latency and zero impact on the source database’s query workload.

Supported capture modes:

ModeMechanismWhen to use
cdcContinuous log tailingReal-time sync; any transactional database
batchFull snapshot scanOne-time initial load; databases without log access
apiPolling / webhookSaaS sources (Salesforce, HubSpot, etc.)
fileFile scanningS3, SFTP, local directory

Change Log Buffer

The central in-memory buffer for all captured change events. Built on Hazelcast Ringbuffer, it:

  • Decouples capture throughput from downstream processing speed
  • Fans out to multiple consumers (Transform, Materialize) without re-reading the source
  • Persists the change log to Change Log Store for durability and replay
  • Syncs a replica to Source Replica Store for join lookups

The buffer is the single coordination point that allows Transform and Materialize to operate independently at their own pace.

Lookup Cache

An in-memory cache populated from the Source Replica Store. When a pipeline needs to join or enrich a change event with data from another table (e.g., enrich an orders event with the matching customer record), the engine performs a join lookup against this cache rather than querying the source database.

This design is critical for CDC performance: source databases are never queried during steady-state processing.

Transform

A stateless processing stage that applies row-level operations to the change stream:

  • filter — CEL predicate; rows not matching are discarded
  • rename — field renaming map
  • js — GraalVM JavaScript for arbitrary row transformation
  • typeFilter — retain only INSERT / UPDATE / DELETE events
  • unwind — array field flattening (one row → N rows)

Transform nodes execute in declaration order, as defined in the pipeline’s transforms: block.

Materialize

The stateful aggregation stage. Where Transform works row-by-row, Materialize maintains an updated view of the data across multiple source tables:

  • Applies upsert / delete semantics to the Materialized View Store
  • Handles DDL changes (schema drift) according to the pipeline’s ddl: policy
  • Supports the MERGE family operators (Beta phase) for master-detail embedding

Cyntex Store

The persistence layer sits below the Engine and provides three purpose-built stores plus a unified backup surface.

Change Log Store

Durable log of all captured change events in the order they were received. Used for:

  • Offset persistence — pipelines can resume from any point without re-scanning the source
  • Replay — re-process a historical time window without touching the source database
  • Audit — compliance record of every change

Source Replica Store

A queryable replica of the source tables, kept up-to-date by the Change Log Buffer. Serves the Lookup Cache for join operations. Allows inspecting source data at any point in time without accessing the source database.

Materialized View Store

The output of the Materialize stage — pre-joined, pre-filtered, always-current views of your data. This is what downstream applications and AI agents typically read.

Queryable Backup Store

A unified, queryable backup spanning all three stores. Backed by MongoDB (single source of truth for offsets, task definitions, and metadata). In the GA phase, Paimon integration adds an external incremental data lake layer for finance-grade historical audit and analytics.


Cyntex Serve

The data-access layer exposes processed data to consumers. There are two server roles:

Push Context Server

Actively pushes change events to event-driven consumers:

TargetProtocol
KafkaStandard Kafka producer; topic name and message format configurable via DSL
LakeHouseWrites to external data lakes (e.g., Apache Iceberg, Delta Lake)
WebhookHTTP push to any endpoint; payload format as CEL projection

Push is configured via the push: block in a pipeline definition. Output format defaults to the Cyntex TapEvent envelope; custom formats use a CEL expression.

Query Context Server

Serves data to pull-based consumers:

Access methodConsumer
MCPAI agents (Claude, GPT-4o, Gemini …) — read schema, query materialized views, inspect pipeline status
RESTApplications, dashboards, microservices
GraphQLFlexible query interface for frontend clients (GA phase)

The Query Context Server is backed directly by the Materialized View Store — queries never touch the source database.


Code-Level Module Layout

At the source code level, Cyntex uses a ports-and-adapters architecture with strictly unidirectional dependencies across six rings:

core ← Domain model, DSL pipeline, lifecycle contracts (zero frameworks)
└─ spi ← Extension point interfaces (PDK / connector SPI)
└─ adapters ← Connector implementations, DuckDB adapter
└─ runtime ← Task execution engine (Hz Ringbuffer, scheduler)
└─ control ← CRUD, lifecycle management, status reads
└─ surface ← CLI / REST API / MCP server / Web UI

Enforced by ArchUnit + Maven enforcer on every CI run — no accidental coupling allowed.


Technology Stack

ComponentTechnology
LanguageJava 21
Native binaryGraalVM native-image (Oracle GraalVM 21.0.11)
BuildMaven mono-repo + enforcer + ${revision} flatten
In-memory bufferHazelcast 5.7.0 (custom fork, pure Apache 2.0)
Source of truth DBMongoDB (replica set)
DSL expressionsCEL (dev.cel 0.10.1)
JavaScript runtimeGraalVM JS (in-process, no subprocess)
CLI frameworkpicocli 4.7.7 + JLine 3.26.3
External data lakeApache Paimon (GA phase)
TestingJUnit 5 + AssertJ + ArchUnit