Skip to content

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.

FeatureSkipprSnowflake Openflow
DeploySingle Rust binary, your VPC or on-premNiFi runtime on SPCS or BYOC AWS. Control plane is Snowflake
SchemaIn-stream evolution, sibling columnsConnector mapping. Soft-delete columns. PK change needs a resnapshot
StorageOpen Iceberg on Parquet you ownSnowflake tables, or Snowflake-managed Iceberg v2/v3
CDCLog-based; fails closed if the dest cannot honourSnapshot then logical replication. Soft delete. Single-node Postgres runtime
Queryskipprd query on Iceberg ∪ WAL; history in any Iceberg engineSnowflake after apply. Iceberg dest is Snowflake catalog
PricingFree self-hosted engineBYOC 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.

yaml
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-1
bash
skipprd --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_schema
python
from 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")
bash
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.