← All docs
Limitations
Read this before deciding whether DataEgress fits your use case — being explicit about what it doesn't do is more useful than a vague feature list.
By design (not on the roadmap without a reason to revisit)
- No CDC / logical replication / WAL reading. DataEgress does not, and is not planning to, watch your database for changes. See architecture.md for why.
- No direct database connection. Ever. Model A (customer callback) is the only supported integration pattern.
- No automatic change detection. DataEgress doesn't know a row changed
unless your
fetchPagetells it, by returning that row again. Incremental exports are supported by convention (pass a cursor likeupdatedAtand filter in your own query), not by DataEgress inferring anything. - No reverse ETL. DataEgress delivers datasets to storage destinations (S3, signed URL). It does not sync data into Salesforce, HubSpot, or any other SaaS.
Out of scope for now
- No GCS, Azure Blob, or SFTP destinations. Only
s3(AWS S3 or S3-compatible, e.g. R2) andsigned_urlexist today. - No warehouse-native destinations — Snowflake, BigQuery, Redshift, Databricks. Land the file in S3/R2 and load it yourself for now.
- No true CDC-free incremental delivery UI. The API accepts
cursorconceptually (yourfetchPagereceives one), but there's no dashboard affordance yet for "only export what changed since the last run" beyond what you implement in your own query. - No file retention policy. Generated files aren't automatically deleted.
- No RBAC beyond destination-level tenant scoping. There's no user accounts / permissions system.
- No billing or usage metering. Pricing in the business plan isn't wired into the product yet.
- No MCP server yet — the REST API is stable enough that adding one should be quick; see AGENTS.md for the planned tool shapes.
Real technical trade-offs worth knowing about
- Retries re-run from the start, not from where they failed. A retry
(automatic or manual) re-executes the full
generate-filestep — re-fetching every page from yourfetchUrl— rather than resuming from the row count where it stopped. Delivery is still safe (same destination key, so a retry overwrites rather than duplicates), but a retry after 800K of 1M rows re-fetches all 1M. - Parquet export accumulates encoded bytes in memory until the file is closed. Each page's rows are encoded into Parquet binary form immediately (never held as raw JS row objects beyond one page), but the encoded output itself grows in memory across the whole run rather than streaming to disk row-group by row-group. Verified fine through 1M rows; large enough datasets (likely tens of millions of rows) would need a truly streaming writer or a chunked multi-file output — not yet built.
- CSV export does truly stream to disk (near-constant memory regardless of row count) — this asymmetry with Parquet is a known gap, not a design goal.
- No enforced HTTPS on
fetchUrl. DataEgress will happily call anhttp://endpoint in dev; nothing currently blocks that in production configs either. - PGlite (local Postgres) doesn't like concurrent processes. Don't run
next buildandnext devagainst the same.data/dataegressdirectory at the same time — see architecture.md. - Single-region, single-process job execution locally. Fine for the volumes tested (1M rows in ~3-4s for CSV, ~5s for Parquet); not load-tested beyond that.
When NOT to use DataEgress
- You need real-time/streaming replication, not periodic exports — look at CDC tools instead.
- You need to sync data into Salesforce/HubSpot/etc. — that's reverse ETL, a different problem.
- You need warehouse-native delivery (Snowflake Data Sharing, BigQuery Data Transfer) today, not "land a file in S3 and load it yourself."
- Your compliance requirements need a vetted subprocessor with SOC 2 and a DPA today — see security.md.