Snowflake Openflow alternative — Snowflake Openflow vs Skippr
Snowflake Openflow is managed Apache NiFi inside a Snowflake account. A deployment is the data-plane container. A runtime is one NiFi instance. A connector is a versioned NiFi flow template Snowflake wrote. Snowflake Deployment (GA 4 Nov 2025) runs the plane on Snowpark Container Services across AWS, Azure, and GCP. BYOC runs the plane in your AWS account; the UI and catalog stay on Snowflake. Postgres CDC (11 through 18) does schema introspect, a COPY snapshot, then pgoutput on a replication slot. Deletes are soft: _SNOWFLAKE_DELETED. The dest is a Snowflake table, or Snowflake-managed Iceberg v2 or v3 when you set Table Storage Format to ICEBERG. BYOC compute is 0.0225 Platform Credits a vCPU-hour, per second, 60-second minimum. Snowflake Deployment uses first-generation SPCS rates (CPU_X64_S at 0.11 credits an hour, CPU_X64_SL at 0.41, CPU_X64_L at 0.83), per second, five-minute minimum. An always-on management pool on CPU_X64_S stays up even with no runtime. Snowpipe or Snowpipe Streaming apply is a second line. Oracle CDC adds a licensed-core fee (70 USD a core a month on the 36-month term). This is not a Streamhouse. There is no Iceberg ∪ WAL.
Skippr is an open Streamhouse you run as one Rust binary. Write skippr.yml (or the same thing in Python), discover, sync. You query live state over Iceberg ∪ WAL, and the history is ordinary Iceberg in your bucket. No NiFi canvas. No Platform Credit for a management pool. ELT into a warehouse is one path, not the product.
| Feature | Skippr | Snowflake Openflow |
|---|---|---|
| Deploy | Single Rust binary, your VPC or on-prem | NiFi runtime on SPCS or BYOC AWS. Control plane is Snowflake |
| Schema | In-stream evolution, sibling columns | Connector mapping. Soft-delete columns. PK change needs a resnapshot |
| Storage | Open Iceberg on Parquet you own | Snowflake tables, or Snowflake-managed Iceberg v2/v3 |
| CDC | Log-based; fails closed if the dest cannot honour | Snapshot then logical replication. Soft delete. Single-node Postgres runtime |
| Query | skipprd query on Iceberg ∪ WAL; history in any Iceberg engine | Snowflake after apply. Iceberg dest is Snowflake catalog |
| Pricing | Free self-hosted engine | BYOC 0.0225 credits/vCPU-hr. SPCS instance rates. Always-on management pool. |
What Snowflake Openflow is good at
A Postgres or MySQL log that already needs to land in the same Snowflake account as the warehouse, without you running Debezium. That is the product. The canvas is still NiFi if a curated connector is not enough. Iceberg dest on the CDC connectors is real when the catalog is Snowflake. If the job is "this database into this account," that is a real product.
Where the job is wider
Openflow is a managed flow runtime. It is not a Streamhouse. There is no Iceberg ∪ WAL. There is no skipprd query on in-flight rows. Iceberg here is a Snowflake table type. The files may sit on your volume; the catalog and apply stay in Snowflake.
Credit math is the ops. The management pool on CPU_X64_S does not scale to zero. Postgres CDC needs Medium or larger and min_nodes = 1, max_nodes = 1. A slot that sits unread fills the source WAL. Column rename is drop plus add. Replica identity DEFAULT or USING INDEX is required, or updates and deletes do not apply.
Skippr will not give you the NiFi canvas, the Snowflake Managed Token, or Oracle CDC with that licensed-core add-on. Skippr also will not replace an Openflow runtime that already merges into Snowflake.
If the job is "Snowflake-managed NiFi we already staff," Openflow is the narrower tool. If the job is live SQL on Iceberg you run, Openflow was never that. Bare NiFi is a separate page.
Getting started
Install skipprd from the install guide, or pip install skippr. The three tabs write the same skippr.yml. Then discover, sync, and query.
skippr:
workspace: analytics
skipprd_el_storage_mode: local
pipelines:
orders:
data_source: data_sources.app_db
data_sink: data_sinks.lake
data_sources:
app_db:
Postgres:
host: db.internal
user: skippr_reader
password: ${APP_DB_PASSWORD}
database: app
tables: [orders, customers]
cdc_mode: snapshot_then_cdc
data_sinks:
lake:
AthenaIceberg:
warehouse: s3://my-iceberg-warehouse/
glue_database_name: analytics
athena_workgroup_name: primary
athena_results_s3_bucket: my-athena-results
region: us-east-1
schema_sink: schema_sinks.lake_schema
schema_sinks:
lake_schema:
AthenaIceberg:
warehouse: s3://my-iceberg-warehouse/
glue_database_name: analytics
athena_workgroup_name: primary
athena_results_s3_bucket: my-athena-results
region: us-east-1skipprd --workspace analytics --storage-mode local connect data-source postgres \
--pipeline orders \
--name app_db \
--host db.internal \
--user skippr_reader \
--password '${APP_DB_PASSWORD}' \
--database app \
--tables orders \
--tables customers \
--cdc-mode snapshot_then_cdc
skipprd connect data-sink athenaiceberg \
--pipeline orders \
--name lake \
--warehouse s3://my-iceberg-warehouse/ \
--glue-database-name analytics \
--athena-workgroup-name primary \
--athena-results-s3-bucket my-athena-results \
--region us-east-1
skipprd connect schema-sink athenaiceberg \
--pipeline orders \
--name lake_schemafrom skippr import (
Config,
DataSinkAthenaIceberg,
DataSourcePostgres,
DataSourcePostgresSourceCdcMode,
EnvRef,
LocalStorage,
Pipeline,
)
cfg = Config().workspace("analytics").storage(LocalStorage())
app_db = cfg.data_source(
"app_db",
DataSourcePostgres(
host="db.internal",
user="skippr_reader",
password=EnvRef("APP_DB_PASSWORD"),
database="app",
tables=["orders", "customers"],
cdc_mode=DataSourcePostgresSourceCdcMode.SNAPSHOTTHENCDC,
),
)
lake = cfg.data_sink(
"lake",
DataSinkAthenaIceberg(
warehouse="s3://my-iceberg-warehouse/",
glue_database_name="analytics",
athena_workgroup_name="primary",
athena_results_s3_bucket="my-athena-results",
region="us-east-1",
),
schema_sink="lake_schema",
)
cfg.pipeline("orders", Pipeline(data_source=app_db, data_sink=lake))
cfg.save("skippr.yml")export APP_DB_PASSWORD='your-postgres-password'
skipprd discover --pipeline orders
skipprd sync --pipeline orders --once
skipprd query "SELECT count(*) FROM analytics.orders"Which to choose
Choose Snowflake Openflow if you want managed NiFi CDC into Snowflake, and the warehouse after apply is enough.
Choose Skippr if you want one binary, live SQL, and Iceberg files that stay yours. Skippr will not run an Openflow runtime.
Install from Install. Connector and query reference live in Developer Docs. For optional onboarding in your VPC, Enterprise Jumpstart or Contact.
