Local, folder-driven Dagster CSV transformation engine with hot-folder sensors, AI-assisted pipeline creation, and Tkinter configuration UI.
Project description
ETLai
A local, AI-assisted data transformation engine built on Dagster. Install it, scaffold a project, and let Claude Code create new pipelines — from CSV transformations to API ingestion.
Install
pip install ETLai
Requires Python 3.10+ and Tkinter (ships with most Python installations).
Quick start
etlai init ~/my-etl
cd ~/my-etl
etlai sync
etlai run
This starts a Dagster dev server at http://localhost:3000. Enable sensors in
the UI, then drop CSV files into pipelines/<name>/inbox/.
Commands
| Command | Purpose |
|---|---|
etlai init <dir> |
Scaffold a new project with example pipelines |
etlai sync |
Validate manifests, create folders, prompt for path: ask, check env files |
etlai run |
Start the Dagster dev server |
etlai list |
Show all registered pipelines |
How it works
Each pipeline is defined by a manifest (pipelines/<name>/manifest.yaml)
that wires together:
- Atom — a reusable, single-unit-of-work transformation
- Form — first-run Tkinter UI that collects config (or passthrough for no-UI)
- Trigger — what causes the pipeline to run (file sensor, cron schedule, or both)
Trigger fires → load files (if any) → configure (form/config.json) → execute atom
├→ processed/ + output/ (success)
└→ rejected/ + *.error.txt (failure)
Pipeline types
File-based (CSV transformation)
Drop files into inbox/. Sensor detects stable files and triggers the pipeline.
name: vlookup_rollnumber
atom: vlookup
form: vlookup_column_picker
min_files: 2
API-based (data ingestion)
Fetch data from REST APIs on a schedule. No inbox files needed.
name: fetch_hr_data
atom: hr_api_fetch
form: passthrough
min_files: 0
env_file: ~/.etlai/secrets.env
requires_env:
- HR_API_TOKEN
trigger:
rules:
- type: schedule
cron: "0 8 * * *"
Composite (multi-step chains)
Chain multiple atoms. Output of each step feeds into the next.
name: vlookup_then_groupby
min_files: 2
steps:
- atom: vlookup
form: vlookup_column_picker
- atom: groupby
form: groupby_picker
Shipped atoms
| Atom | Description |
|---|---|
vlookup |
Left join two CSVs on specified columns with dtype validation |
groupby |
Group by column with count, sorted descending |
mock_generate |
Generate synthetic data from file headers using Faker |
api_fetch |
Generic REST API fetcher (JSON/XML/CSV, field mapping, env-based auth) |
Shipped forms
| Form | Description |
|---|---|
vlookup_column_picker |
Join + output column multi-select with dtype validation |
groupby_picker |
Single column selection |
passthrough |
No UI — reads config.json and passes to atom |
Key concepts
Reference folder
reference/ holds permanent data used across runs (lookup tables, previous API
snapshots). The framework passes reference file paths to atoms automatically.
Custom data paths
path: ask in a manifest prompts the user (via folder picker) during etlai sync
to choose where data folders live. Each pipeline can have its own location.
Credentials
API credentials live in env files outside the project (e.g. ~/.etlai/secrets.env).
The framework loads them before atom execution. etlai sync validates required
vars are present without printing values.
Adding pipelines with Claude Code
Open your project in Claude Code. The scaffolded CLAUDE.md teaches it to:
- Create atoms (or reuse shipped ones)
- Create forms (or use passthrough with pre-written config.json)
- Write manifest.yaml
- Run
etlai sync
Resolution order
- Atoms:
./atoms/<name>.py→etlai.atoms.<name>(package) - Forms:
./forms/<name>.py→etlai.forms.<name>(package)
User files take precedence over shipped ones.
Development
git clone <repo>
pip install -e .
etlai init /tmp/test-project
cd /tmp/test-project
etlai run
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file etlai-0.4.3.tar.gz.
File metadata
- Download URL: etlai-0.4.3.tar.gz
- Upload date:
- Size: 63.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
486b57e3755d98f9ad27328774735aecf7e9d80a9874386e280fc9a9dcbf36e5
|
|
| MD5 |
4e933617f671f788f842fb997c7e899e
|
|
| BLAKE2b-256 |
b189fa518f5547679d80b8d3e73cee17832bda04afab772a2e18dc8c8387be2b
|
File details
Details for the file etlai-0.4.3-py3-none-any.whl.
File metadata
- Download URL: etlai-0.4.3-py3-none-any.whl
- Upload date:
- Size: 79.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1c4deda4cec58e93d3c7f671d5a31785f203f8d26fa7cbf4fb3994ebf5935711
|
|
| MD5 |
6de687c67a6d7536940abf243fa4ef48
|
|
| BLAKE2b-256 |
272e008af1a9ac1f0d02f1f71ff3b577825cad40c61646c62ffe4aeb17a199bb
|