Tinybird Local container¶
You can run your own Tinybird instance locally using the tinybird-local
container. This is useful for testing and development. For example, you can test Data Sources and Pipes in your data project before deploying them to production.
Tinybird Local doesn't include the following features:
- Tinybird UI
- Connectors (except Kafka)
- Scheduled operations
- Batch operations
Prerequisites¶
To get started, you need a container runtime, like Orbstack or Docker Desktop.
Run Tinybird Classic locally¶
To run Tinybird Classic locally, you need to run the following command:
docker run --platform linux/amd64 -p 7181:7181 --name tinybird-classic-local -e COMPATIBILITY_MODE=1 -d tinybirdco/tinybird-local:latest
By default, Tinybird Local runs on port 7181, although you can expose it locally using any other port.
The command sets the environment variable COMPATIBILITY_MODE=1
to let the image know it runs Tinybird Classic.
Local authentication¶
To authenticate with Tinybird Local, run the following command to retrieve the Workspace admin token and pass it through the CLI:
TOKEN=$(curl -s http://localhost:7181/tokens | jq -r ".workspace_admin_token") tb auth --host http://localhost:7181 --token $TOKEN
After you've authenticated, you can get the default Workspace with the tb workspace ls
CLI command. For example:
tb workspace ls ** Workspaces: -------------------------------------------------------------------------------------------- | name | id | role | plan | current | -------------------------------------------------------------------------------------------- | Tinybird_Local_Testing | 7afc6330-3aae-4df5-8712-eaad216c5d7d | admin | Custom | True | --------------------------------------------------------------------------------------------
Development flow¶
Once the container is running, you can just work normally with your Classic CLI and to tb push
, tb datasource append
..., and use the API. E.g.:
curl \ -H "Authorization: Bearer $TOKEN" \ -d $'{"date": "2025-04-05", "city": "Chicago"}\n{"date": "2025-04-05", "city": "Madrid"}\n' \ 'http://localhost:7181/v0/datasources?name=data_source_test&mode=create'
Kafka data sources¶
The Tinybird Local container supports Kafka connections and data sources.
You can create connections with the CLI:
tb connection create kafka \ --connection-name <CONN_NAME> \ --bootstrap-servers <SERVER:PORT> \ --security-protocol <PROTOCOL> \ --key <KEY> \ --secret <SECRET>
And then push your project that depends on the connections normally.
Connect to a local Kafka with Docker Compose¶
If you're running Kafka in Docker, the recommended approach is to use Docker Compose. This allows you to define both services and a shared network to ensure connectivity between Tinybird and Kafka.
Follow these steps to connect Tinybird Local with a local Kafka instance:
Set up Kafka and Tinybird Local with Docker Compose¶
Create a docker-compose.yml
file with the following content:
networks: kafka_network: driver: bridge volumes: kafka-data: services: kafka: image: apache/kafka:latest hostname: broker container_name: broker ports: - 9092:9092 environment: KAFKA_BROKER_ID: 1 KAFKA_PROCESS_ROLES: "broker,controller" KAFKA_CONTROLLER_QUORUM_VOTERS: "1@broker:29093" KAFKA_CONTROLLER_LISTENER_NAMES: "CONTROLLER" KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT,CONTROLLER:PLAINTEXT KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092 KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:29092,PLAINTEXT_HOST://0.0.0.0:9092,CONTROLLER://0.0.0.0:29093 KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true" volumes: - kafka-data:/var/lib/kafka/data networks: - kafka_network tinybird-local-classic: image: tinybirdco/tinybird-local:latest container_name: tinybird-local-classic platform: linux/amd64 ports: - "7181:7181" networks: - kafka_network environment: - COMPATIBILITY_MODE=1 tinybird-cli: image: tinybirdco/tinybird-cli-docker:latest container_name: tinybird-cli networks: - kafka_network environment: - TINYBIRD_HOST=http://tinybird-local-classic:7181 volumes: - ./tinybird:/mnt/data working_dir: /mnt/data stdin_open: true tty: true
This docker-compose.yml
file defines three services (containers):
- Kafka: This service runs an Apache Kafka instance, which is a distributed streaming platform. The configuration includes setting up a Kafka broker with a specific ID, roles, and listeners for communication. It also mounts a volume for data persistence.
- Tinybird Local Classic: This service runs the Tinybird Local Classic image, which is a self-contained environment for developing and testing data pipelines. It exposes port 7181 for API access and sets an environment variable for compatibility mode.
- Tinybird CLI: This service runs the Tinybird Classic CLI Docker image, which provides a command-line interface for interacting with Tinybird. It sets an environment variable for the Tinybird host and mounts a volume for data access. This volume allows the CLI to access the datafiles inside your ./tinybird folder.
These three services are connected through a bridge network named kafka_network
, allowing them to communicate with each other.
Create the resources from Docker containers¶
Here you can see an example of creating a topic, a connection, pushing a data source, and reading events from the topic:
## Create topic » docker exec -it broker /opt/kafka/bin/kafka-topics.sh --create --topic sample-topic --bootstrap-server localhost:9092 Created topic sample-topic. ## Auth » TOKEN=$(curl -s http://localhost:7181/tokens | jq -r ".workspace_admin_token") » docker exec -it tinybird-cli tb auth --host http://tinybird-local-classic:7181 --token $TOKEN ** Auth successful! ** Configuration written to .tinyb file, consider adding it to .gitignore ** Remember to use http://tinybird-local-classic:7181 in all your API calls. ## Create Kafka Connection » docker exec -it tinybird-cli tb connection create kafka \ --connection-name kafka_local \ --bootstrap-servers kafka:29092 \ --security-protocol PLAINTEXT \ --key key \ --secret secret ** Connection 4f48741a-07e5-4f16-ba15-da375c21aca1 created successfully! ## Check data source » cat tinybird/datasources/kafka_ds.datasource SCHEMA > `data` String `json:$` ENGINE "MergeTree" ENGINE_PARTITION_KEY "" ENGINE_SORTING_KEY "tuple()" KAFKA_CONNECTION_NAME kafka_local KAFKA_TOPIC sample-topic KAFKA_GROUP_ID my_group_id ## Push data source » docker exec -it tinybird-cli tb push datasources/kafka_ds.datasource ** Processing datasources/kafka_ds.datasource ** Using connection 'kafka_local' ** Building dependencies ** Running 'kafka_ds' ** 'kafka_ds' created ** Not pushing fixtures ## Send data to topic: » echo '{"data": "test"}' | docker exec -i broker /opt/kafka/bin/kafka-console-producer.sh --topic sample-topic --bootstrap-server localhost:9092 # Query data source » docker exec -it tinybird-cli tb sql "select * from kafka_ds" ---------------------------------------------------------------------------------------------------- | __value | __topic | __partition | __offset | __timestamp | __key | data | ---------------------------------------------------------------------------------------------------- | | sample-topic | 0 | 1 | 2025-06-20 11:01:33 | | {"data": "test"} | ----------------------------------------------------------------------------------------------------
Next steps¶
- Learn about datafiles and their format. See Datafiles.
- Learn how advanced templates can help you. See Advanced templates.
- Browse the full CLI reference. See Command reference.