A desktop query federation engine for visually joining and analyzing data across multiple heterogeneous databases.
Built with Tauri 2 + Svelte 5 + Polars (Rust). Designed and structured by me, with implementation assisted by AI tools.
Connect to multiple databases, design pipelines on a drag-and-drop canvas, join data across sources, and export the result as a Parquet file — all locally, no cloud required.
- Visual pipeline canvas — drag-and-drop nodes, connect edges
- Cross-database joins — join tables from different databases on different hosts
- Transform nodes — filter, select, rename, cast, derived columns, schema mapping
- Per-node progress — live status ring (idle → running → done) during execution
- Parquet output — with compression options (Snappy, Zstd, Gzip, Lz4)
- SQL query on output — query your parquet results using SQL (Polars engine)
- Pipeline save/load — persist pipelines as
.etl.jsonfiles - Schema preview — inspect column names and types before running
CrossQL has two components:
- Desktop App (Tauri + Svelte) for designing pipelines and submitting jobs
- Remote Engine (
crossql-engine) for queueing, running, and exposing run status/metrics
┌───────────────────────────────┐
│ CrossQL Desktop (Tauri/Svelte)│
│ - Pipeline editor │
│ - Remote execution tab │
└───────────────┬───────────────┘
│ HTTP (Bearer API key)
▼
┌───────────────────────────────┐
│ crossql-engine (Axum/Rust) │
│ - /pipeline/submit │
│ - /pipeline/:id/status │
│ - /runs, /status, /metrics │
│ - runs.json persistence │
└───────────────┬───────────────┘
│
▼
Output files + run history
# Install dependencies
make install
# Start test databases
make docker-up
# Run in development mode
make dev
# Run checks
make checkThe remote engine requires these environment variables:
CROSSQL_API_KEY(required): bearer token expected by every requestCROSSQL_OUTPUT_DIR(required): output root used for artifacts andruns.jsonCROSSQL_PORT(optional, default7070): HTTP listen port
Run engine in development:
export CROSSQL_API_KEY=test-key
export CROSSQL_OUTPUT_DIR=/tmp/crossql-output
export CROSSQL_PORT=7070
make engine-devBuild release binary:
make engine-build
./target/release/crossql-engineValidate engine-only checks:
make engine-check- Start
crossql-engineand keep it running. - Open CrossQL desktop app (
make dev). - Open Remote Execution tab.
- Enter engine URL and API key, then click Connect.
- Return to Pipeline Editor and click Send to Engine.
- Monitor active runs/history from Remote Execution.
A docker-compose.yaml is included for spinning up local test instances of PostgreSQL, MySQL, MongoDB, and Cassandra.
make docker-up # start all databases
make docker-down # stop all databasesCaution
This is a hobby/experimental project. All data is pulled into memory before joins are executed. Avoid SELECT * FROM large_table on production databases — always filter at the source with WHERE clauses and LIMIT to control memory usage. Using SELECT * is acceptable only against test/local databases.
crossql-engine exposes GET /metrics in Prometheus text format. Prometheus and Grafana are now included as optional services in the existing docker-compose.yaml under the observability profile.
How to run:
- Set engine API key in your shell so Prometheus can authenticate:
export CROSSQL_API_KEY=test-key
- Start engine + observability stack from the existing compose file:
docker compose --profile engine --profile observability up -d
- Open:
- Prometheus:
http://localhost:9090 - Grafana:
http://localhost:3000(default login:admin/admin)
- Prometheus:
- In Grafana, add Prometheus data source URL:
http://prometheus:9090
- Query metrics such as:
crossql_active_pipelinescrossql_chunks_processed_totalcrossql_pipeline_duration_seconds_sumcrossql_memory_bytes_used
MIT
