| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Name | Name | Last commit date | ||
|---|---|---|---|---|
Process gigabyte-scale files without freezing the UI, exhausting memory, or blocking user interaction.
Built for resumable imports, async validation pipelines, real-time editing, and fully modular orchestration.
⚠️ Disclaimer — under active development
ETL CoreStream is currently under heavy development and is not stable yet. Until version 1.0.0, APIs, behaviors, and internal architecture may change without notice.
Expect breaking changes while the project evolves toward a stable v1 release.
Traditional browser ETL solutions usually:
ETL CoreStream solves this with a reactive stream-first architecture designed for modern large-scale data workflows.
Users can:
npm install @etl-corestream/coreETL CoreStream ships with a browser-oriented preset architecture that provides a ready-to-use ETL pipeline using:
import { ETLBrowserOrchestrator } from "@etl-corestream/core/examples";
import { LayoutExample } from "@etl-corestream/core/examples";
// Minimal quickstart
const orchestrator = ETLBrowserOrchestrator();
orchestrator.selectLayout(LayoutExample);
await orchestrator.selectFile(file);
await orchestrator.export("Export Just Name and Email", "File");This quick example shows the minimal flow to get started. See "Advanced Browser Configuration" for tuning.
import { ETLBrowserOrchestrator } from "@etl-corestream/core/examples";
import { LayoutExample } from "@etl-corestream/core/examples";
// Create orchestrator with advanced options
const orchestrator = ETLBrowserOrchestrator({
importer: {
worker: true,
importerChunkSize: 1024 * 1024 * 5,
},
persistence: {
chunkSizeQtd: 50,
},
recover: {
checkRecoveryPoint: true,
},
});
// Select layout
orchestrator.selectLayout(LayoutExample);
// Observe reactive state
orchestrator.state$.subscribe(console.log);
orchestrator.progress$.subscribe(console.log);
// Start processing
await orchestrator.selectFile(file);
// Edit rows while processing continues
orchestrator.editRow(rowId, "email", "new@email.com");
// Export anytime
await orchestrator.export("Export Just Name and Email", "File");The entire pipeline remains reactive and non-blocking during processing.
ETL CoreStream uses layouts to define how files should be interpreted and processed.
Layouts define:
export const LayoutExample: LayoutBase = {
id: "contact-management-layout-v1",
name: "Contact Management Layout",
description: "Example layout for processing contact information",
allowUndefinedColumns: false,
headers: [
{
key: "name",
label: "Full Name",
alternativeKeys: ["fullname", "nombre"],
required: true,
},
{
key: "email",
label: "Email Address",
alternativeKeys: ["correo", "contact_email"],
required: true,
},
],
localSteps: [
{
id: "email-processing",
name: "Email Processing",
order: ["transforms", "validators"],
transforms: [trim("email"), toLowerCase("email")],
validators: [required("email"), email("email")],
},
],
globalSteps: [
{
name: "Global Validation",
order: ["validators"],
validators: [AsyncValidateDataExample()],
},
],
exports: [
{
name: "Export Just Name and Email",
fn: (row) => ({
name: row?.value?.name,
email: row?.value?.email,
}),
},
],
};This keeps ETL workflows declarative, reusable, and independent from parsing logic.
Common use cases where ETL CoreStream excels:
Local transforms run at row level and are ideal for normalization and lightweight transformations.
export const toLowerCase = (headerKey: string): LocalStepTransform => ({
headerKey,
name: "toLowerCase",
fn: (value: string) => value.toLowerCase(),
});
export const trim = (headerKey: string): LocalStepTransform => ({
headerKey,
name: "trim",
fn: (value: string) => value.trim(),
});Perfect for:
Local validators run synchronously for immediate row-level feedback.
export const minValue = (headerKey: string, min: number): LocalStepValidator => ({
headerKey,
name: "Min Value",
args: [min],
fn: (value: string, row: any, minVal: number) => {
const numValue = parseFloat(value);
const isValid = numValue >= minVal;
return {
isValid,
validationCode: "MIN_VALUE",
message: !isValid ? `Value must be at least ${minVal}` : undefined,
value,
step: "local",
};
},
});Ideal for:
Global validators can run asynchronously and integrate directly with APIs or backend services.
export const AsyncValidateDataExample = (): GlobalStepValidator => ({
name: "AsyncValidateDataExample",
fn: async (rows: RowObject[]) => {
const validationResults = await validateDataExample(
rows.map((row) => ({
id: row.__rowId,
value: row.value["headerKey"],
}))
);
return {
validationErrors: validationResults
.filter((result) => !result.isValid)
.map((result) => ({
__rowId: result.id,
headerKey: "headerKey",
validationCode: result.validationCode,
message: result.message,
step: "AsyncValidateDataExample",
})),
removedValidationErrors: [],
};
},
});This enables:
Global transforms allow asynchronous dataset-wide transformations.
export const AsyncTransformDataExample = (): GlobalStepTransform => ({
name: "AsyncTransformDataExample",
fn: async (rows: RowObject[]) => {
const transformedItems = await transformDataExample(
rows.map((row) => ({
id: row.__rowId,
value: row.value["headerKey"],
}))
);
const rowMap = new Map(rows.map((r) => [r.__rowId, r]));
transformedItems.forEach((item) => {
const row = rowMap.get(item.id);
if (row) {
row.value["headerKey"] = item.value;
}
});
},
});Perfect for:
ETL CoreStream supports persistent ETL sessions.
Imports can continue after:
Users can edit imported rows while processing continues in the background.
const orchestrator = ETLBrowserOrchestrator({
recover: {
checkRecoveryPoint: true,
},
persistence: {
chunkSizeQtd: 50,
},
});Long-running imports become safe, recoverable, and interactive.
ETL CoreStream exporters can export directly to:
The exporter system can also expose a ReadableStream directly, allowing you to consume transformed data without implementing a custom exporter.
await orchestrator.export("Export Just Name and Email", "Stream");This makes it possible to:
Typical processing flow inside ETL CoreStream:
File ↓ Importer ↓ Mapper ↓ Local Steps Engine (row-level transforms & validators) ↓ Persistence (chunked storage / indexedDB) ↓ Global Steps Engine (dataset-level transforms & validators) ↓ Exporter / Viewer
This diagram highlights the runtime flow from raw file input to export/view output and clarifies where modules can be swapped.
┌────────────────────┐
│ Provider │
│ Dependency Injector│
└─────────┬──────────┘
│
Injects replaceable modules
│
┌───────────────────────────────────────────────────────────────┐
│ │
│ Orchestrator │
│ (replaceable module) │
│ │
└───────────────┬───────────────────────────────────────────────┘
│
┌──────────┼──────────┬──────────┬──────────┬──────────┐
↓ ↓ ↓ ↓ ↓ ↓
┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐
│Importer│ │ Mapper │ │Persist │ │Recover │ │ Viewer │ │ Logger │
│replace │ │replace │ │replace │ │replace │ │replace │ │replace │
└────┬───┘ └────┬───┘ └────┬───┘ └────┬───┘ └────┬───┘ └────────┘
│ │ │ │ │
└───────────┼──────────┼──────────┼──────────┘
│
↓
┌───────────────────────────────────────────────┐
│ Local Steps Engine │
│ Validators + Transforms (row-level) │
└─────────────────┬─────────────────────────────┘
↓
┌───────────────────────────────────────────────┐
│ Global Steps Engine │
│ Validators + Transforms (dataset-level) │
└─────────────────┬─────────────────────────────┘
↓
┌──────────────┐
│ Exporter │
│ replace │
└──────┬───────┘
↓
File / Stream / API / Cloud
Every internal module can be replaced.
Including:
As long as interfaces are respected, any module can be replaced with a custom implementation.
const provider = new ProviderModule({
importer: {
module: CustomCSVImporter,
},
persistence: {
module: PostgresPersistence,
},
exporter: {
module: S3Exporter,
},
});
const orchestrator = new CustomOrchestratorModule();
orchestrator.initialize(provider);This allows developers to build entirely custom ETL ecosystems while preserving compatibility with the CoreStream pipeline architecture.
ETL CoreStream exposes reactive state through:
Compatible with:
orchestrator.state$.subscribe(console.log);
orchestrator.progress$.subscribe(console.log);
orchestrator.metrics$.subscribe(console.log);
const state = orchestrator.state;
const metrics = orchestrator.metrics;ETL CoreStream is designed for massive datasets and constrained environments.
While many browser ETL tools crash or freeze processing large datasets, ETL CoreStream keeps processing incrementally while maintaining responsive interaction.
Users can:
Even while background processing is still running.
| Rows | File Size | Memory Usage | UI Freeze |
|---|---|---|---|
| 1,000,000 | 1GB | ~constant | No |
| Capability | ETL CoreStream | Traditional Browser ETL |
|---|---|---|
| Stream processing | ✅ | ❌ |
| Constant memory usage | ✅ | ❌ |
| Resumable imports | ✅ | ❌ |
| Editable datasets | ✅ | ❌ |
| Async backend validation | ✅ | ⚠️ |
| Reactive state | ✅ | ❌ |
| Modular architecture | ✅ | ⚠️ |
| Replaceable orchestrator | ✅ | ❌ |
| Real-time revalidation | ✅ | ❌ |
| Persistent sessions | ✅ | ❌ |
| Stream exports | ✅ | ❌ |
ETL CoreStream is environment-agnostic.
Build adapters for:
One orchestration engine, multiple environments.
Detailed guides and examples are available in /docs.
Topics include:
Additional adapters and ecosystem integrations are maintained in separate repositories.
You can also find the full set of "how-to" guides in the repository docs folder on GitHub: ETLCoreStream-Core/docs
The first official adapter is the React adapter:
@etl-corestream/react — React integration (viewer components and helpers)
Install:
npm install @etl-corestream/reactETL CoreStream is fully open source.
You are free to:
Community contributions are welcome.
ETL CoreStream follows a small set of guiding principles:
These principles shape API decisions and architecture trade-offs across the project.
ETL CoreStream is evolving rapidly toward a stable v1 release.
Current priorities include:
| Back | FazBrowse Home | New Git URL |