A data source is the foundational object in a Tinybird workspace. Everything else (pipes, materialized views, endpoints) reads from one. Each data source has an explicit schema, a sorting key chosen for the queries that hit it, and one or more connectors that feed it: HTTP ingestion, Kafka, S3, BigQuery, or another data source via a materialized view.
Because data sources are append-only by default, they behave well under streaming workloads: ingestion never blocks readers, and the storage layout matches the column-oriented engine underneath. ReplacingMergeTree-style data sources handle upserts when you need them.
Think of a data source as the physical table; pipes and endpoints are the logical layer on top.
