Plain SQL as output
ETL processes generated automatically from metadata. The generated code is the contract - versioned, diffable, with no extra abstraction layer.
A product of my own, self-built from spec through UX to production deploy. This page shows not only what DI² is - but also how it is built.
Vision, output format, method lineage and data quality philosophy - compressed into four paragraphs.
DI² generates maintainable, readable and auditable ETL processes from the metadata of your source system - automatically, in plain SQL. The output currently runs on PostgreSQL and SQL Server.
The starting point is tables, columns, types and relationships - they become the model, enriched with domain knowledge such as allowed values, business keys and historization rules. From this model, extraction and SCD2 historization are generated automatically; the transformation into DWH or OLTP deliberately remains handcraft - DI² delivers the scaffolding, you write the business logic.
Data quality is the product, not a feature. Business rules as WHERE clauses in the metadata; faulty records land in an error table instead of silently in the DWH. Three logging levels - process, step, stack trace - queryable with a SELECT.
Not a reinvention: The method has existed since 2015 in constant iteration - initially as a VBA/Excel-based code generator, today as a PostgreSQL-native engine with a Next.js web layer. DI² is the re-implementation of an approach proven over more than 10 years, on a modern stack.
Every tool makes assumptions about what matters. These are ours - explicit, so they stay open to debate.
ETL processes generated automatically from metadata. The generated code is the contract - versioned, diffable, with no extra abstraction layer.
The process is derived directly from tables, columns, types, relationships - data-model-driven instead of click-driven.
Versioned SQL runs on PostgreSQL and SQL Server today. Porting to other dialects (Snowflake, BigQuery, Oracle, DuckDB) is manageable because the output stays plain SQL.
Every code change visible as a Git diff. Plain SQL without a DSL - engineers and analysts understand it without ramp-up.
Three logging levels - process, step, stack trace - all queryable with a SELECT. Not felt, but measured.
Allowed values, value ranges, business and alternate keys, historization rules live in the model - not as comments in the code.
Extraction and SCD2 historization are generated automatically; the DWH/OLTP transformation remains handcraft - deliberately.
Business rules as WHERE clauses. Faulty records land in an error table - not silently in the DWH.
Self-hosted on Hetzner (EU data center, Germany) - no Vercel, no Supabase, no US managed service for sensitive layers. Data, auth and mail stack entirely within the EU, GDPR-compliant. Docker Compose with a multi-app layout, Nginx as reverse proxy, Let's Encrypt for SSL.
AI-driven development does not mean "Claude writes code on its own". It means: specialized skills per workflow step, clear checkpoints, and at every phase the system waits for a decision.
Feature spec with user stories, acceptance criteria, edge cases.
Technical architecture, PM-friendly, without code.
UX critique + mockups (HTML / React + shadcn) as the template.
API routes, DB schema, stored procedures, RLS policies.
UI with shadcn/ui - against real APIs, no mocks.
Acceptance + edge cases + feature-scoped security checks.
Diff against spec & conventions; approve / request changes.
GitHub Actions: dev → int → test → prod, every stage gated.
Mandatory gate before prod: OWASP, auth, headers, dependencies.
/bug - docs/bugs/bug-NNNN-<slug>.md
Can be triggered at any time - documentation, targeted fix, QA re-test, close. Bugs are never reopened; a regression gets a new ID.
/check-updates · npm · Docker · Actions · VPS
Periodic maintenance: dev dependencies and VPS components - read-only findings, no auto-apply.