{"slug": "show-hn-rsync-ai-self-hosted-cdc-and-etl-elt-source-available-elv2", "title": "Show HN: Rsync.ai – self-hosted CDC and ETL/ELT, source-available (ELv2)", "summary": "Rsync.ai launched as a self-hosted, source-available data platform under the Elastic License 2.0, offering batch and change-data-capture pipelines, scheduled SQL models, and table-level lineage with 21 connectors. The tool lets users describe a pipeline in plain English, which an agent converts into a staged plan that pauses for approval before executing on Temporal, and it is unrelated to the rsync(1) file-synchronization utility. The Elastic License 2.0 permits free internal use and modification but prohibits reselling it as a hosted service.", "body_md": "**Self-hosted, source-available AI data platform for batch pipelines, CDC, scheduled\nmodels, and lineage.** Describe a pipeline in plain English, approve the plan, and see\nexactly what ran, failed, or became stale.\n\n*You describe the pipeline in plain English. It resolves the plan, then stops for your\napproval — batch, CDC, or changes-only — before a single row moves.*\n\nrsync.ai moves data between databases, warehouses, object stores and APIs. You describe the job in a sentence; an agent turns it into an explicit, staged plan, pauses for you when something is ambiguous, and executes it on Temporal so a long sync survives restarts. Batch and change-data-capture are both first-class. Twenty-one connectors ship in the box.\n\nIt is unrelated to [`rsync(1)`](https://rsync.samba.org/), the file-synchronisation\ntool — this moves rows between systems, not files between hosts.\n\nIt is **source-available** under the [Elastic License 2.0](https://github.com/rsync-ai/rsync/blob/main/LICENSE): run it, modify it,\nand use it internally for free — you just cannot resell it as a hosted service. The\n[full summary is below](#license).\n\n- **Batch and CDC pipelines.** Batch loads between the connectors below, plus\nDebezium-backed change data capture from PostgreSQL, MySQL, SQL Server, Oracle and\nMongoDB. A run pauses for your decision where the request is ambiguous, and each stage\nreports what it did.\n→[PostgreSQL CDC](https://github.com/rsync-ai/rsync/blob/main/docs/solutions/self-hosted-postgresql-cdc-pipeline.md) ·[PostgreSQL to MySQL](https://github.com/rsync-ai/rsync/blob/main/docs/solutions/postgresql-to-mysql-data-sync.md) ·[Shopify to PostgreSQL](https://github.com/rsync-ai/rsync/blob/main/docs/solutions/shopify-to-postgresql-data-pipeline.md)\n- **Scheduled, dependency-aware SQL models.** Save a query as a model and rebuild it on a\ncron, an interval, or after the pipeline or model it reads from finishes; edits to\nscheduled SQL need an admin's approval, and a freshness deadline flags a table that\nstopped moving.\n→[Scheduled SQL models](https://github.com/rsync-ai/rsync/blob/main/docs/solutions/scheduled-sql-models-with-dependency-triggers.md)\n- **Data Explorer and lineage.** Query what you connected in English or SQL, and see which\npipelines write which tables and which models read them. Lineage is table-level, and the\nlineage view is recent — its page states how far it has been verified.\n→[Data Explorer](https://github.com/rsync-ai/rsync/blob/main/docs/explorer/README.md) ·[Lineage and observability](https://github.com/rsync-ai/rsync/blob/main/docs/solutions/data-lineage-and-pipeline-observability.md)\n- **Versioned MCP connectors.** Each of the 21 connectors runs as its own versioned\ncontainer, so you can upgrade or pin one without touching the rest.\n→[Connector reference](https://github.com/rsync-ai/rsync/blob/main/docs/connectors/reference.md)\n\nMore guides: [all solutions](https://github.com/rsync-ai/rsync/blob/main/docs/solutions/README.md).\n\n*Ask in plain English, review the SQL it wrote, run it against a connected source. Here: how\nmany swipes went left versus right.*\n\n*A finished run, stage by stage: what each one did, the rows it moved, and how stale the\ndestination has become since. Nothing here was typed in by hand.*\n\n*Every pipeline in a workspace on one screen: batch or CDC, source to destination, and\nwhether it is running right now.*\n\n*Lineage across pipelines and scheduled SQL models: which table a model writes, which model\nreads it, and which one runs after which.*\n\nManaged ELT tools move data well but hand off at the warehouse door. Orchestrators and\nautomation tools are general-purpose and leave the data semantics to you. rsync.ai aims at\nthe middle: get the data moving *and* keep it modelled, on hardware you control.\n\n| Instead of | What it does well | What rsync.ai does differently | \n|---|---|---|\n| **Fivetran** | Managed and reliable, hundreds of connectors, someone else is on call | Runs on your infrastructure with your keys. A connector you need is a container you can write, not a support ticket. | \n| **Airbyte** | Large connector ecosystem, self-hostable, mature ELT | You describe the pipeline in a sentence and approve a plan instead of configuring each sync by hand, and batch and CDC are the same product rather than separate paths. | \n| **dbt** | The standard for SQL transformation, with deep testing and a large package ecosystem | Scheduled, dependency-aware SQL models are built in, so moving and modelling data is one tool instead of two. dbt's testing and packages are considerably deeper. | \n| **Debezium on its own** | Best-in-class change data capture | rsync.ai runs Debezium and adds the provisioning, sinks, retries and UI around it, so you are not assembling Kafka Connect by hand. | \n| **Airflow / n8n** | General orchestration and automation, enormously flexible | A pipeline is a first-class object with row counts, lineage and CDC built in, rather than something you assemble from operators or nodes. | \n\n**Where it is honestly weaker.** There is no managed option — every install is yours to run.\nThe catalogue is 21 connectors, not hundreds. Data-quality assertions are not built yet. And\nthe Kubernetes path is younger than the Docker one (see [Project status](#project-status)). If\nyou want someone else carrying the pager, use a managed tool.\n\n1. **Install** with one command —[Install](#install) below. Docker is the only requirement.\n2. Open `http://localhost:3000` and click**Start with sample data** . The stack bundles a`sample-data` source and a throwaway`demo-warehouse` PostgreSQL, so this needs no\ncredential of your own.\n3. In `/chat` , ask for*\"sync customers and orders from sample data to the demo warehouse\"* ,\npick the tables, and confirm.\n\nThat path is a batch pipeline. CDC, Shopify and your own databases need a source of your\nown — see the [quickstart](https://github.com/rsync-ai/rsync/blob/main/docs/getting-started/quickstart.md#try-it-in-5-minutes-with-no-credentials)\nand the [self-hosting guide](https://github.com/rsync-ai/rsync/blob/main/docs/deployment/self-hosting.md).\n\n``` php\nflowchart LR\n    U[\"You, in plain English\"] --> FE[\"Frontend<br/>Next.js\"]\n    FE --> GW[\"API Gateway<br/>Go\"]\n    GW --> ORCH[\"Orchestrator<br/>Go workers\"]\n    ORCH --> TMP[\"Temporal<br/>durable workflows\"]\n    TMP --> CON[\"MCP connectors<br/>versioned containers\"]\n    CON --> DATA[(\"Your sources and<br/>destinations\")]\n```\n\nFor CDC, Debezium on Kafka Connect and a sink worker carry the change stream; they start\nwith the rest of the default install. [ARCHITECTURE.md](https://github.com/rsync-ai/rsync/blob/main/ARCHITECTURE.md) explains why each\npiece was chosen, and [docs/architecture/overview.md](https://github.com/rsync-ai/rsync/blob/main/docs/architecture/overview.md) has the\ncomponent and data-flow diagrams.\n\n```\ncurl -sSL https://raw.githubusercontent.com/rsync-ai/rsync/main/install.sh | bash\n```\n\nRequires Docker and nothing else. The installer asks which LLM you want — your own\nOpenAI key, the Ollama it bundles, or none for now — generates every other secret itself,\nand starts the full stack. Choose Ollama and there is no key to find and no model to pull\nby hand: the stack ships an Ollama container and a one-shot job that downloads the model\nbefore anything that would ask for one starts. Choose none and pipelines, raw SQL and the\nshipped connectors still work; the LLM features say `Set up an LLM first` until you add one\n([which LLM is used](https://github.com/rsync-ai/rsync/blob/main/docs/deployment/self-hosting.md#which-llm-is-used)). Open\n`http://localhost:3000` when it finishes. If\nthe stack does not come up, the installer says so and exits non-zero — it does not print a\nsuccess banner over a dead stack.\n\n**Which code you get.** `v0.1.7`, the current release. Both halves of the install come\nfrom that one tag: the compose file is fetched from `RSYNC_REF` and the images are\npulled at a tag derived from it, so the file and the containers it starts are the same\ncommit. Every image the default compose starts is published at that tag and pullable\nanonymously — a test pins that, so a release cannot ship half-built.\n\n**What it starts.** Everything needed for both sync modes, change data capture\nincluded — Kafka Connect, Debezium and the sink worker come up with the rest. They\nare not an add-on: pick a streaming sync without them and the run fails a pre-flight\ntwo minutes in rather than falling back to batch. On a machine that will only ever\nrun batch syncs, `curl -sSL … | RSYNC_PROFILES= bash` leaves the JVM out and drops\nthe memory floor back to 6 GB.\n\n**Settings go on the `bash` side of the pipe.** A `VAR=x` written before `curl` sets\nit for `curl`, which never reads it, and the installer runs with the default — no\nerror, just the setting silently ignored. That is true of every variable here.\n\nPass `RSYNC_REF=main` (as `curl -sSL … | RSYNC_REF=main bash`) to track the branch\ninstead. That install is not reproducible: the compose file comes from the branch tip\nand changes with every commit, while `main` images track the last publish rather than\nthe newest commit, so the two halves move at different rates.\n\n**A mirror, or your own build.** `RSYNC_IMAGE_REGISTRY=registry.example.com/rsync-ai`\npulls every first-party image from there instead of `ghcr.io/rsync-ai` — the same\nvariable `install-k8s.sh` reads — and is kept in `.env`, so a re-run keeps it. To\ninstall a checkout instead of a release (a fork, or a commit no tag carries yet), run\n`RSYNC_COMPOSE_DIR=<checkout> RSYNC_VERSION=<tag> bash <checkout>/install.sh`, where\n`<tag>` is the tag you pushed the checkout's images under. The compose files are copied\nfrom the checkout instead of downloaded. It refuses to run without `RSYNC_VERSION`,\nbecause the default would pair the checkout's compose file with the last release's\nimages.\n\nPoint `kubectl` at any cluster and run:\n\n```\ncurl -sSL https://raw.githubusercontent.com/rsync-ai/rsync/main/install-k8s.sh | bash\n```\n\nThat is the whole install. It generates every secret, installs the platform, the demo\nwarehouse and a working set of connectors, waits for the release, and prints (or, on a\nterminal, opens) the two port-forwards that put the UI at `http://localhost:3000`. Edit\n`~/rsync-ai-k8s/.env` and run it again to change anything — that is also the upgrade path.\nBack that file up: it holds `ENCRYPTION_KEY`. The default install asks for about **8.8 GiB\nof memory and 3.7 CPU** in requests, and it measures what the cluster has left before it\nstarts: on a smaller cluster it trims to a set that fits — first the connectors and demo\nyou did not choose, then the spare api-gateway and frontend replicas — instead of leaving\npods `Pending`. CPU is what runs out first: **a single 4-vCPU node is not enough for the\ndefault** (GKE's own DaemonSets leave ~3.4 of it), and what fits there is the trimmed set\nat ~3.0 CPU. Everything it accepts is listed in the\n[Kubernetes guide](https://github.com/rsync-ai/rsync/blob/main/docs/deployment/kubernetes.md#one-command-recommended).\n\nPrefer to run `helm` yourself? A bare `helm install` also needs `connectors.fleet` set, or no\nconnector pod starts and no pipeline can reach a source\n([why](https://github.com/rsync-ai/rsync/blob/main/docs/deployment/kubernetes.md#connectors-are-pods-you-choose)):\n\n```\ngit clone https://github.com/rsync-ai/rsync.git && cd rsync\nhelm install rsync ./deploy/helm/rsync-ai \\\n  --namespace rsync --create-namespace \\\n  --set secrets.jwtSecret=\"$(openssl rand -base64 32)\" \\\n  --set secrets.encryptionKey=\"$(openssl rand -base64 32)\" \\\n  --set secrets.internalServiceSecret=\"$(openssl rand -hex 24)\" \\\n  --set secrets.postgresPassword=\"$(openssl rand -hex 24)\" \\\n  --set secrets.minioAccessKey=\"$(openssl rand -hex 16)\" \\\n  --set secrets.minioSecretKey=\"$(openssl rand -base64 32)\" \\\n  --set frontend.publicUrl=https://app.example.com \\\n  --set frontend.apiUrl=https://api.example.com \\\n  -f my-values.yaml   # at least connectors.fleet\n```\n\nThat is the **evaluation** footprint — in-chart Postgres, Redis, Kafka, MinIO and\nTemporal, one replica each, no backups. The chart runs the same images as the compose\nstack and can point at managed Postgres, Redis, Kafka and object storage instead;\nper-provider value files ship for EKS, GKE and AKS. See the\n[Kubernetes guide](https://github.com/rsync-ai/rsync/blob/main/docs/deployment/kubernetes.md) for a production install.\n\nImportant\n\n**Save `secrets.encryptionKey`.** It encrypts every stored connection credential. Read\nit back with\n`kubectl -n rsync get secret rsync-secrets -o jsonpath='{.data.ENCRYPTION_KEY}' | base64 -d`\nand keep it somewhere you will still have it after the cluster is gone — reinstalling\nwith a different key makes every saved connection permanently undecryptable.\n\nTip\n\nThe chart is also published to the registry, so you can install without cloning:\n\n```\nhelm install rsync oci://ghcr.io/rsync-ai/charts/rsync-ai --version 0.1.7 \\\n  --namespace rsync --create-namespace \\\n  --set secrets.jwtSecret=\"$(openssl rand -base64 32)\" \\\n  --set secrets.encryptionKey=\"$(openssl rand -base64 32)\" \\\n  --set secrets.internalServiceSecret=\"$(openssl rand -hex 24)\" \\\n  --set secrets.postgresPassword=\"$(openssl rand -hex 24)\" \\\n  --set secrets.minioAccessKey=\"$(openssl rand -hex 16)\" \\\n  --set secrets.minioSecretKey=\"$(openssl rand -base64 32)\" \\\n  --set frontend.publicUrl=https://app.example.com \\\n  --set frontend.apiUrl=https://api.example.com\n```\n\nThe two `frontend.*` flags are not optional on either path — the chart refuses to\nrender without them, because the browser calls the API directly and NextAuth\nbuilds its callback URLs from `publicUrl`. Point them at the hostnames your\ningress will serve. MinIO withdrew anonymous pulls from `docker.io/minio/*` and then\nfrom `quay.io/minio/*`. Chart **0.1.6** onward and a checkout's `values.yaml` name\nChainguard's build instead, so neither path needs a MinIO override. Chart **0.1.5**\nand older still name the withdrawn images; to install one of those, add\n`--set objectStorage.minio.image=cgr.dev/chainguard/minio@sha256:bd014394a80898e68c149f2311fdf8d5a2c2f3bb2c33b9327ae6d02b4b065ae1`\nand the same value for `objectStorage.minio.mcImage`. Both paths pull rsync's own\nimages at `.Chart.AppVersion` (**0.1.7**), and every `ghcr.io/rsync-ai` image the\nchart names is published at that tag for both `amd64` and `arm64` (0.1.2 and older\nare `amd64` only, so they will not start on Apple Silicon, Graviton, Axion or Ampere\nnodes).\n\n| **Pipelines from a sentence** | Type *\"sync MySQL orders to S3 every hour\"* . An agent resolves it into named stages you can read before anything runs. | \n| **Batch and CDC, both first-class** | Batch loads for anything, plus Debezium-backed change data capture on five databases — PostgreSQL, MySQL, SQL Server, Oracle and MongoDB. | \n| **It asks instead of guessing** | When the source is ambiguous — which tables, which schema, which key — the run pauses on a human-in-the-loop gate rather than picking for you. | \n| **Durable execution** | Stages run as Temporal workflows, so a multi-hour sync survives a restart, a redeploy, or a crashed worker. | \n| **You can answer \"why did it do that?\"** | Every run emits domain events carrying stage state, row counts and a trace id, and the UI shows them stage by stage. | \n| **A SQL and NL query surface** | The [Data Explorer](#the-data-explorer) queries the systems you connected — no second BI tool to stand up first. | \n| **Your infrastructure, your keys** | One Docker command or one Helm chart. Credentials are encrypted at rest with a key you hold; point the LLM at OpenAI or at the [Ollama](https://github.com/rsync-ai/rsync/blob/main/docs/deployment/ollama.md) the installer bundles, or run without one. | \n\n**21 connectors ship in the box** — every one is a source, 17 are also destinations, and\nfive support change data capture. Each runs as its own versioned container, so you can\nupgrade or pin one without touching the rest.\n\n| Category | Connectors | CDC | \n|---|---|---|\n| **Relational** | PostgreSQL, MySQL, SQL Server, Oracle, ClickHouse, Amazon Redshift | PostgreSQL, MySQL, SQL Server, Oracle | \n| **Data warehouse** | Snowflake, Google BigQuery, Databricks | — | \n| **Document** | MongoDB | MongoDB | \n| **Object storage** | AWS S3, Google Cloud Storage, Azure Blob Storage | — | \n| **APIs** | Stripe, Shopify, GitHub, Notion, Google Sheets | — | \n| **Demo and reference** | Sample Data (credential-free demo source), Petstore (OpenAPI example), Widgets-GraphQL (GraphQL example) | — | \n\nThe [connector reference](https://github.com/rsync-ai/rsync/blob/main/docs/connectors/reference.md) is generated from the connector\ntree itself and lists exact ids, versions and per-connector source/destination support —\nCI fails if it drifts, and a second guard fails if the table above stops matching it. To\nadd your own, start with the\n[connector developer guide](https://github.com/rsync-ai/rsync/blob/main/docs/connectors/developer-guide.md).\n\nOnce data has landed somewhere, you can query it without leaving rsync. Ask a question in\nEnglish and get SQL back, or write the SQL yourself; browse the schema; then keep the\nuseful ones — as a saved query with versions and diffs, or as a **model**: a table that\nrebuilds itself on a cron, an interval, or after a given pipeline finishes. Results export\nto CSV, TSV and JSON. See the [Data Explorer guide](https://github.com/rsync-ai/rsync/blob/main/docs/explorer/README.md) and the deep\ndive on [saved queries, models and schedules](https://github.com/rsync-ai/rsync/blob/main/docs/explorer/saved-queries-and-models.md).\n\n1. **Describe.** You type*\"sync MySQL orders table to S3 every hour\"* into`/chat` . An\nagent reads it and drafts a staged plan.\n2. **Decide.** Where the request is under-specified — which tables, which schema, which\nprimary key, which credentials — the plan stops at a human-in-the-loop gate and asks.\nNothing runs until you answer. This is the single most common reason a run is waiting\nrather than broken.\n3. **Provision.** Connections are validated and stored encrypted; for CDC the publication\nand replication slot are created in the required order before Debezium is told to\nstream.\n4. **Run.** Each stage is a Temporal activity, so progress is checkpointed and a restart\nresumes rather than starts over.\n5. **Watch.** Row counts, stage state and a trace id are emitted as domain events and\nrendered stage by stage in the UI.\n\n- Docker 24+ and Docker Compose v2 — or, for the Helm path, Kubernetes 1.25+ and Helm 3.8+\n- 8 GB RAM minimum, 16 GB recommended — 12 GB if you let the installer bundle an LLM, which it checks and warns about before starting anything\n- No API key required, and no LLM required. Bring an OpenAI key if you have one (it is\npreferred when present), choose the bundled [Ollama](https://github.com/rsync-ai/rsync/blob/main/docs/deployment/ollama.md) and the\ninstaller downloads a model for you, or choose none and add one later — the features that\nneed a model say`Set up an LLM first` until then\n([which LLM is used](https://github.com/rsync-ai/rsync/blob/main/docs/deployment/self-hosting.md#which-llm-is-used) )\n\n| [Quick start](https://github.com/rsync-ai/rsync/blob/main/docs/getting-started/quickstart.md) | Local dev setup and first pipeline | \n| [Solutions](https://github.com/rsync-ai/rsync/blob/main/docs/solutions/README.md) | PostgreSQL CDC, PostgreSQL to MySQL, Shopify to PostgreSQL, scheduled SQL models, lineage | \n| [Self-hosting](https://github.com/rsync-ai/rsync/blob/main/docs/deployment/self-hosting.md) | Production deployment with TLS | \n| [Kubernetes](https://github.com/rsync-ai/rsync/blob/main/docs/deployment/kubernetes.md) | Helm chart install on EKS, GKE, AKS, or any cluster | \n| [Oracle Cloud (free)](https://github.com/rsync-ai/rsync/blob/main/docs/deployment/oracle-cloud.md) | Free 4 OCPU / 24 GB VM | \n| [Connector reference](https://github.com/rsync-ai/rsync/blob/main/docs/connectors/reference.md) | Every shipped source and destination | \n| [Connector developer guide](https://github.com/rsync-ai/rsync/blob/main/docs/connectors/developer-guide.md) | Build a new connector | \n| [Data Explorer](https://github.com/rsync-ai/rsync/blob/main/docs/explorer/README.md) | SQL, natural-language queries, saved models and schedules | \n| [Architecture](https://github.com/rsync-ai/rsync/blob/main/docs/architecture/overview.md) | System design and data flows | \n| [API reference](https://github.com/rsync-ai/rsync/blob/main/docs/api/README.md) | REST + WebSocket endpoints | \n| [Environment variables](https://github.com/rsync-ai/rsync/blob/main/docs/deployment/env-vars.md) | Full configuration reference | \n| [Errors](https://github.com/rsync-ai/rsync/blob/main/docs/errors/README.md) | What each error code means and what to do about it | \n| [All docs](https://github.com/rsync-ai/rsync/blob/main/docs/README.md) | Full documentation index | \n\n```\ngit clone https://github.com/rsync-ai/rsync.git\ncd rsync\ncp .env.example .env           # add your OPENAI_API_KEY, if you have one\ncp llm-service/.env.example llm-service/.env   # or set LLM_PROVIDER=none here\ndocker compose -p rsync-ai up -d\nopen http://localhost:3000\n```\n\nSee [CONTRIBUTING.md](https://github.com/rsync-ai/rsync/blob/main/CONTRIBUTING.md) for building individual services, running the test\nsuites, and the PR process.\n\nrsync.ai is young and self-hosted. It runs, it has been driven end to end, and the\nconnector and deployment claims on this page are checked by tests rather than asserted —\nbut you are early. The rough edge today is Kubernetes: a managed-cluster install\n(EKS, GKE or AKS against real RDS, MSK and S3) has not been run end to end, so the cloud\nvalue files are reviewed starting points rather than verified recipes — the\n[Kubernetes guide](https://github.com/rsync-ai/rsync/blob/main/docs/deployment/kubernetes.md) says so where you meet it. There is no\nhosted offering: every install is yours.\n\nWhat that means in practice: pin a tag rather than tracking `main` if you want\nreproducibility, keep `ENCRYPTION_KEY` somewhere durable before you store a credential,\nand read [CHANGELOG.md](https://github.com/rsync-ai/rsync/blob/main/CHANGELOG.md) before upgrading. Bugs and gaps are tracked as\n[GitHub issues](https://github.com/rsync-ai/rsync/issues) — that list is the register.\n\n- **Questions and help** —[SUPPORT.md](https://github.com/rsync-ai/rsync/blob/main/SUPPORT.md) points at the right place for each kind of question\n- **Bugs and feature requests** —[open an issue](https://github.com/rsync-ai/rsync/issues)\n- **Contributing** —[CONTRIBUTING.md](https://github.com/rsync-ai/rsync/blob/main/CONTRIBUTING.md) and the[Code of Conduct](https://github.com/rsync-ai/rsync/blob/main/CODE_OF_CONDUCT.md)\n- **Security** — report privately, never in a public issue:[SECURITY.md](https://github.com/rsync-ai/rsync/blob/main/SECURITY.md)\n- **Changes between versions** —[CHANGELOG.md](https://github.com/rsync-ai/rsync/blob/main/CHANGELOG.md)\n\nrsync.ai is **source-available** under the [Elastic License 2.0](https://github.com/rsync-ai/rsync/blob/main/LICENSE) (ELv2) — not an\nOSI \"open source\" license.\n\nThe `LICENSE` file is the binding text; the following is a plain-English summary (not\nlegal advice):\n\n**You can:**\n\n- Download, install, run, and modify rsync.ai on your own infrastructure\n- Use it for your own internal business data pipelines\n- Distribute it and your modifications under these same terms\n- Contribute back to the project (see [CONTRIBUTING.md](https://github.com/rsync-ai/rsync/blob/main/CONTRIBUTING.md) )\n\n**You cannot:**\n\n- Offer rsync.ai (or a modified version) to third parties as a hosted or managed service\n- Move, change, disable, or circumvent any license-key functionality\n- Remove or obscure the licensing, copyright, or other notices\n\nThe rsync.ai name and logo are trademarks — see [TRADEMARK.md](https://github.com/rsync-ai/rsync/blob/main/TRADEMARK.md). Licenses of\nbundled third-party dependencies are listed in\n[THIRD_PARTY_NOTICES.md](https://github.com/rsync-ai/rsync/blob/main/THIRD_PARTY_NOTICES.md).", "url": "https://wpnews.pro/news/show-hn-rsync-ai-self-hosted-cdc-and-etl-elt-source-available-elv2", "canonical_source": "https://github.com/rsync-ai/rsync", "published_at": "2026-09-29 08:07:06+00:00", "updated_at": "2026-09-29 08:47:53.021243+00:00", "lang": "en", "topics": ["ai-agents", "ai-tools", "developer-tools", "mlops", "ai-infrastructure"], "entities": ["rsync.ai", "Temporal", "Debezium", "PostgreSQL", "MySQL", "SQL Server", "Oracle", "MongoDB"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/show-hn-rsync-ai-self-hosted-cdc-and-etl-elt-source-available-elv2", "markdown": "https://wpnews.pro/news/show-hn-rsync-ai-self-hosted-cdc-and-etl-elt-source-available-elv2.md", "text": "https://wpnews.pro/news/show-hn-rsync-ai-self-hosted-cdc-and-etl-elt-source-available-elv2.txt", "jsonld": "https://wpnews.pro/news/show-hn-rsync-ai-self-hosted-cdc-and-etl-elt-source-available-elv2.jsonld"}}