Studio for Flink SQL. Write, Run, and Monitor pipelines. Build-in feature engineering & ML inference
10K+
A zero-dependency, modular browser SQL Studio for Flink SQL β built for engineers who want a real query interface without leaving their laptop.
Apache Flink is a trademark of the Apache Software Foundation. Str:::lab Studio is an independent open-source project that uses the Flink SQL Gateway REST API. It is not affiliated with or endorsed by the Apache Software Foundation.
If you find Str:::lab Studio useful, please consider:
Your support helps drive continued development and maintenance. Thank you! π
Str:::lab Studio is a self-hosted web IDE that connects to the Flink SQL Gateway and lets you:
Need a Flink cluster to test with? We provide a ready-to-use Docker Compose setup that includes:
git clone https://github.com/coded-streams/FLINK-CLUSTER.git
cd FLINK-CLUSTER
docker compose up -d
Note: This cluster setup uses Flink 1.19. You can easily update it to newer Flink versions by changing the image tags in
docker-compose.yml. The setup includes scripts to pre-download all connectors supported by Str:::lab Studio, making it the perfect companion for testing and development.
The only hard requirement is a running Flink SQL Gateway. The Studio talks to the Gateway REST API exclusively β it does not connect directly to Kafka, ZooKeeper, or any other infrastructure.
| What you have | What to do |
|---|---|
| Nothing yet | git clone + docker compose up -d β starts everything |
| Flink cluster, no SQL Gateway | Add flink-sql-gateway to your compose (snippet in Option 3β ) |
| Flink cluster + SQL Gateway | Add Studio only β Option 2β |
| Cloud Flink (Confluent, Ververica, AWS) | Option 5β β Direct Gateway or Remote mode with token |
| Kubernetes | Option 6β β Helm operator |
No CORS proxy required. The Studio image includes nginx which proxies all browser requests to the gateway and adds CORS headers itself. A separate CORS proxy (
flink-gateway-cors-proxy) is provided in the repo but is optional β you only need it if you want browsers to call the gateway directly on port 8084 without going through the Studio.
git clone https://github.com/coded-streams/strlabstudio
cd strlabstudio
docker compose up -d
open http://localhost:3030
Starts: JobManager, TaskManagers, SQL Gateway, Studio, and an optional CORS proxy. Select Via Studio on the connect screen β done.
Add Studio to your existing docker-compose.yml. Point it at your gateway and jobmanager.
No CORS proxy needed. Via Studio mode routes through the Studio nginx which handles CORS.
services:
flink-studio:
image: codedstreams/strlabstudio:latest
container_name: flink-studio
restart: unless-stopped
ports:
- "3030:80"
environment:
FLINK_GATEWAY_HOST: flink-sql-gateway # your gateway container name
FLINK_GATEWAY_PORT: "8083"
JOBMANAGER_HOST: your-jobmanager # your jobmanager container name
JOBMANAGER_PORT: "8081"
volumes:
- udf-jars:/var/www/udf-jars # required for UDF JAR upload
networks:
- your-network # same network as your cluster
volumes:
udf-jars:
networks:
your-network:
external: true # joins your existing network
For UDF JAR upload also add - udf-jars:/var/www/udf-jars to your flink-sql-gateway volumes.
See the UDF JAR Uploadβ section.
docker compose up -d flink-studio
open http://localhost:3030
The SQL Gateway is the API layer between the Studio and your Flink cluster. Add it alongside the Studio:
services:
flink-sql-gateway:
image: flink:1.19.1-scala_2.12-java11
container_name: flink-sql-gateway
depends_on:
your-jobmanager:
condition: service_healthy
command: >
/bin/bash -c "
cp /opt/flink/plugins/connectors/*.jar /opt/flink/lib/ 2>/dev/null || true &&
exec /opt/flink/bin/sql-gateway.sh start-foreground
"
environment:
FLINK_PROPERTIES: |
jobmanager.rpc.address: your-jobmanager
sql-gateway.endpoint.rest.address: 0.0.0.0
sql-gateway.endpoint.rest.port: 8083
volumes:
- ./connectors:/opt/flink/plugins/connectors
- udf-jars:/var/www/udf-jars
networks:
- your-network
healthcheck:
test: ["CMD-SHELL", "wget -qO- http://localhost:8083/v1/info || exit 1"]
interval: 15s
timeout: 10s
retries: 20
start_period: 45s
flink-studio:
image: codedstreams/strlabstudio:latest
container_name: flink-studio
depends_on:
flink-sql-gateway:
condition: service_healthy
ports:
- "3030:80"
environment:
FLINK_GATEWAY_HOST: flink-sql-gateway
FLINK_GATEWAY_PORT: "8083"
JOBMANAGER_HOST: your-jobmanager
JOBMANAGER_PORT: "8081"
volumes:
- udf-jars:/var/www/udf-jars
networks:
- your-network
volumes:
udf-jars:
Put your Kafka/Flink connector JARs in ./connectors/. They are copied to /opt/flink/lib/ at Gateway startup.
docker rundocker run -d -p 3030:80 \
--name flink-studio \
--network <your-flink-network> \
-e FLINK_GATEWAY_HOST=flink-sql-gateway \
-e FLINK_GATEWAY_PORT=8083 \
-e JOBMANAGER_HOST=your-jobmanager \
-e JOBMANAGER_PORT=8081 \
codedstreams/strlabstudio:latest
--network is required for Via Studio mode. Without it, nginx cannot resolve the gateway hostname by container name and returns HTTP 500. Use Direct Gateway mode if you cannot join the network.
UDF JAR upload requires a shared Docker named volume between Studio and the gateway. Use docker compose if you need that feature.
Run Studio anywhere and point it at your remote gateway:
docker run -d -p 3030:80 codedstreams/strlabstudio:latest
open http://localhost:3030
On the connect screen select Remote / Cloud, enter your gateway URL (e.g. https://your-gateway.example.com), and provide your Bearer token or Basic auth credentials.
Works with: Confluent Cloud, Ververica Platform, Amazon Managed Service for Apache Flink, or any self-hosted gateway with a public endpoint.
helm repo add strlabstudio https://coded-streams.github.io/strlabstudio-operator/charts
helm install strlabstudio-operator strlabstudio/strlabstudio-operator \
--namespace flinksql-system --create-namespace
Apply a StrlabStudio custom resource and the operator manages the Deployment, Service, and PVC:
apiVersion: codedstreams.io/v1alpha1
kind: StrlabStudio
metadata:
name: my-studio
namespace: flink
spec:
image: codedstreams/strlabstudio:latest
gateway:
host: flink-sql-gateway
port: 8083
jobmanager:
host: flink-jobmanager
port: 8081
service:
type: ClusterIP
port: 80
Browser (http://localhost:3030)
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β flink-studio (codedstreams/strlabstudio:latest) β
β β
β nginx serves the IDE at port 80 β
β docker-entrypoint.sh writes nginx.conf at container startup β
β β
β /flink-api/* β proxy β FLINK_GATEWAY_HOST:PORT β
β + CORS headers added by nginx β
β /jobmanager-api/* β proxy β JOBMANAGER_HOST:PORT β
β /udf-jars/ β WebDAV PUT β /var/www/udf-jars/ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
ββββ flink-sql-gateway:8083 SQL sessions, statements, results
β ββββ your-jobmanager:8081 job submission
β βββ taskmanager-1
β βββ taskmanager-2
β
ββββ [optional] flink-gateway-cors-proxy:8084
Only for Direct Gateway mode β not required for Via Studio
| Mode | When to use | How it works |
|---|---|---|
| Via Studio | Docker Compose or Kubernetes β Studio on same network as cluster | Browser β Studio nginx β SQL Gateway. Same-origin. No CORS issues. |
| Direct Gateway | Studio not on same network, or browser β gateway directly | Browser β flink-gateway-cors-proxy:8084. Needs CORS proxy. |
| Remote / Cloud | Confluent Cloud, Ververica, AWS, any remote cluster | Browser β your cloud gateway URL. Supports Bearer token + Basic auth. |
| π‘ Admin Session | Platform operators β full cluster visibility | Any of the above + admin passcode. |
| Variable | Default | Description |
|---|---|---|
FLINK_GATEWAY_HOST | localhost | Container name or hostname of the Flink SQL Gateway |
FLINK_GATEWAY_PORT | 8083 | SQL Gateway REST port |
JOBMANAGER_HOST | localhost | Container name or hostname of the Flink JobManager |
JOBMANAGER_PORT | 8081 | JobManager REST API port |
Substituted into nginx.conf at container startup by docker-entrypoint.sh.
You do NOT need it if you use Via Studio connection mode (the default). The Studio nginx proxies all requests to the gateway and adds CORS headers itself. This covers the vast majority of use cases.
You need it only if you want a browser tab to call the SQL Gateway directly on port 8084 without going through the Studio (Direct Gateway mode).
On Kubernetes β CORS is not relevant. In-cluster traffic is same-origin. The proxy is never deployed by the operator.
The Pipeline Manager is a visual Flink SQL pipeline builder built into the Studio. Open it with β Pipeline in the topbar.
What it does:
WITH (...) clauseCREATE TABLE + INSERT INTO SQL in one clickOperator groups:
| Group | Operators |
|---|---|
| Sources | Kafka, Datagen, JDBC, Filesystem, Pulsar, Kinesis |
| Transformations | Filter, Project, UDF Map, Enrich, Union, Split |
| Windows | Tumble, Hop, Session, Cumulate |
| Aggregations | Aggregate, Dedup, Top-N |
| Joins | Interval Join, Temporal Join, Regular Join |
| CEP | Match Recognize, CEP Alert |
| Sinks | Kafka, JDBC, Filesystem, Elasticsearch, Print, Blackhole, MongoDB |
| Output | Result Output, AI Model |
| My UDFs | UDF Node (any registered UDF) |
Key behaviours:
CREATE TABLE ... WITH (...) LIKE source (EXCLUDING ALL) β they inherit the exact schema from the upstream source automatically, avoiding column mismatch errorstable_name β they inject a WHERE clause and SELECT column list respectively into the generated INSERT INTOEXECUTE STATEMENT SET BEGIN ... END with one INSERT INTO per sinkThe Systems Manager centralises connector JAR management and external system integration. Open it with β Systems in the topbar.
Tabs:
/opt/flink/lib/ (requires shared volume)β Test Connectivity behaviour by system type:
| System | Test method |
|---|---|
| Elasticsearch, MinIO/S3, Schema Registry | Direct browser fetch() β shows version/status if reachable |
| Kafka, PostgreSQL, MySQL, Hive Metastore | Probes Flink cluster /v1/info; provides exact nc -zv host port command for container-side testing |
Saved integrations are stored in localStorage and appear as a prefill banner in Pipeline Manager JDBC Sink nodes β one click fills all connection fields.
The Catalog Manager registers persistent external catalogs in the active Flink SQL Gateway session. Open it with β Catalogs in the topbar.
Supported catalog types:
| Type | Backend | JAR required |
|---|---|---|
| Generic In-Memory | Flink built-in | No |
| PostgreSQL (JDBC) | PostgreSQL via JDBC | flink-connector-jdbc + postgresql driver |
| MySQL / MariaDB (JDBC) | MySQL via JDBC | flink-connector-jdbc + mysql-connector-j |
| Apache Hive | Hive Metastore | flink-connector-hive |
| Apache Iceberg (Hive) | Iceberg + Hive Metastore | iceberg-flink-runtime |
| Apache Iceberg (REST) | Nessie, Polaris, Tabular, Gravitino | iceberg-flink-runtime |
| AWS Glue (Iceberg) | AWS Glue Data Catalog | iceberg-flink-runtime + iceberg-aws-bundle |
| Delta Lake | Delta Lake storage | delta-flink + delta-standalone |
Tabs:
CREATE CATALOG SQL is previewed in real time as you type.After creation, the catalog appears in the Studio sidebar catalog tree. Tables and columns are live β click a column name to insert it at the cursor in the SQL editor.
You are not limited to what Flink SQL ships with. Upload your own Java, Python, or Scala functions directly from the browser.
How it works:
/var/www/udf-jars/ via WebDAV PUTADD JAR '/var/www/udf-jars/yourjar.jar' in the active Gateway sessionSupported UDF types: ScalarFunction Β· TableFunction Β· AggregateFunction
Requirement: the udf-jars named volume must be mounted on both flink-studio and flink-sql-gateway at the same path:
flink-studio:
volumes:
- udf-jars:/var/www/udf-jars
flink-sql-gateway:
volumes:
- udf-jars:/var/www/udf-jars
volumes:
udf-jars:
ADD JARruns inside the Gateway JVM and reads from the gateway container's own filesystem. The shared volume makes/var/www/udf-jars/identical on both containers.
| Environment | JAR path |
|---|---|
| Docker (Studio + Gateway compose) | /var/www/udf-jars/yourjar.jar |
| Kubernetes (operator-provisioned PVC) | /opt/flink/usrlib/yourjar.jar |
| Cloud / remote cluster | Upload to cluster node, use absolute path |
No JAR? No problem. Open β¨ UDFs β View Builder to create a TEMPORARY VIEW with computed columns, CASE WHEN expressions, and optional WHERE filters β entirely in SQL. The Studio generates and runs the DDL automatically.
Plot your streaming results without leaving the IDE.
A rules engine for your result table. Rows highlight in real time as they stream in β no code required.
== != > >= < <= contains starts with ends with regexRules are evaluated top-to-bottom. First match per row wins. A colour legend appears below the table. Toggle off at any time to clear all highlighting.
Open the Job Graph tab while a pipeline is running to see:
Double-click any operator node to open a drill-down modal:
The Performance tab tracks every query and pipeline submitted in your session:
Connect using the π‘ Admin button. Default passcode: admin1234 β change it immediately via the π‘ badge in the topbar after first login.
| Feature | Regular Session | Admin Session |
|---|---|---|
| Jobs visible | Own session only | All cluster jobs |
| Cancel job | Own jobs only | Any job |
| Session Inspector | β | Full cross-session breakdown |
| Audit trail | β | Timestamped log of admin actions |
| Report type | Standard session report | Technical or Business/Management PDF |
Generate a formatted PDF report from any result set directly from the results toolbar.
Options:
Reports are designed to be shared with both business stakeholders (Business/Management PDF) and technical reviewers (Technical PDF via Admin Session).
Str:::lab Studio is compatible with Flink 1.16 through 2.x β including the Flink 2.0.0 release (March 2025).
The Studio connects exclusively via the SQL Gateway REST API, which is preserved and enhanced in Flink 2.0. All session management, ADD JAR, CREATE FUNCTION, and streaming SQL features work identically.
Things to update when moving to Flink 2.0:
| Area | Change |
|---|---|
| Config file | flink-conf.yaml β config.yaml (strict YAML) |
| Connector JARs | Use 3.4.x-2.0 series β the 3.3.x-1.x series will not work |
| Java version | Java 8 dropped β use Java 11+ on your cluster |
| DataSet / Scala APIs | Removed β no impact on Studio (SQL only) |
| State compatibility | Not cross-version β take a savepoint before upgrading |
| ML_PREDICT (2.1+) | New built-in SQL function for ML inference β callable from any Studio tab |
Connector JARs must match your Flink version exactly. Wrong version β `NoClassDef
Content type
Image
Digest
sha256:849381978β¦
Size
21.4 MB
Last updated
3 months ago
docker pull codedstreams/strlabstudio