“Realtime pipeline” can describe two very different things. One team may need a continuously running application with event-time windows, state, pattern detection, and several input streams. Another may need operational changes delivered to a destination with a few mapped fields and a reference-table join.
Decodable is designed for the first class of problem. JoinLayer is designed for the second. The overlap is real, but the abstraction—and the work expected from the user—is different.
Decodable begins with stream processing
Decodable is a fully managed platform built on Apache Flink and Debezium. Its pipelines can be written in Flink SQL or implemented as custom Flink jobs using Java, Scala, or Python. That opens the door to stateful computation, time-based aggregation, multi-stream joins, pattern detection, and application-specific stream logic.
Its model is familiar to a streaming engineer: connections move data into streams, pipelines process those streams, and sink connections deliver the output. Teams can use SQL for declarative transformations or bring custom jobs when the processing logic needs a programming model.
If the pipeline is really a streaming application, a managed Flink platform gives the team the right language for the problem.
JoinLayer begins with a route and its output row
JoinLayer does not expose a general stream-processing runtime. It connects a supported source to a supported target and makes the record between them explicit.
The user selects fields, renames and derives values, applies filters, joins reference data, chooses how missing lookups behave, previews the final row, and validates the complete route before launch. PostgreSQL or MySQL changes can be paired with coordinated history on compatible targets; Kafka sources can consume JSON or Avro with Schema Registry discovery and durable partition checkpoints.
This is intentionally less expressive than Flink. It is also a smaller surface to design and operate when the outcome is a target table or topic rather than a stateful streaming application.
Its strength is making common operational movement and enrichment understandable as a pipeline contract rather than asking every team to build a stream-processing job.
Both can enrich streams, but the enrichment model is different
Decodable can express joins in SQL and supports the wider set of operations expected from a stream processor. When enrichment depends on event time, changing stream state, several continuously updating inputs, or custom application logic, that expressiveness matters.
JoinLayer treats lookup enrichment as a guided operation. A source key such as customer_id can retrieve selected fields from a related database table. Direct mode queries the source in execution batches; materialized mode builds a bounded DuckDB cache near the worker. The user sees the join keys, selected output fields, cache footprint, refresh behavior, and miss policy in the pipeline.
That model is narrower, but well matched to business reference data: customer attributes, product catalogs, account ownership, pricing tiers, or regional labels that should accompany each delivered row.
Processing guarantees must include the connectors
Decodable documents exactly-once processing within its pipelines through Flink's distributed checkpointing, while noting that an external connector may provide a weaker delivery guarantee. That distinction is important: application-state consistency and end-to-end destination behavior are not automatically the same promise.
JoinLayer states guarantees per route and target. Its invariant is write first, save the durable checkpoint second, then confirm source progress. PostgreSQL and MySQL targets use idempotent batch identities for retry safety. Kafka target delivery is at least once. BigQuery behavior depends on the selected Storage Write, insertAll, or batch-load mode.
A buyer should ask both products the same concrete question: after a worker crash at the worst possible moment, what can be repeated at this exact source and destination boundary?
The operating experience follows the abstraction
A Decodable user can inspect streams, SQL pipelines, connector state, Flink jobs, checkpoints, backpressure, and throughput. That is the right operational surface for engineers responsible for streaming applications and their state.
A JoinLayer user sees connections, pipeline readiness, worker capacity, queue reasons, row counters, lookup-cache state, heartbeats, checkpoints, and structured run diagnostics. The interface is organized around whether one route can start, what it is writing, and how to recover safely.
JoinLayer exposes that same bounded workflow through its hosted MCP server. Agents can inspect, prepare, preview, validate, request approval, monitor, and diagnose within explicit OAuth scopes; credentials are never collected in conversation.
When each platform is likely to fit
Choose Decodable for the evaluation shortlist when the workload needs event-time semantics, windows, aggregations, multi-stream processing, custom Flink code, or the flexibility of a general managed streaming platform.
Choose JoinLayer for the evaluation shortlist when the problem is a supported database or Kafka route, the target needs straightforward mapping and reference enrichment, and pipeline operators need preview, validation, capacity, approval, and recovery in one guided product.
The deciding factor is not whether the data moves continuously. It is whether the team is building a stream-processing application or operating a data-delivery contract.
Test the boundary, not the category label
For a useful evaluation, take the real source shape and the real destination contract. Include a lookup, a schema change, invalid input, a worker restart, and a period when the destination is unavailable. If event time matters, add late and out-of-order events. If history matters, test the handoff while new changes continue to arrive.
The result should show whether the team needs Flink's expressive runtime or a more constrained workflow that makes the ordinary route easier to understand. Both can be valuable; carrying the wrong abstraction is what creates unnecessary complexity.
Related reading
Product capabilities change. This comparison was reviewed against Decodable's official documentation for pipelines, Flink SQL, and custom Flink jobs on September 9, 2026.
