DATA ENGINEER

Nadhif Fathoni Hafiz

I’m a data engineer based in Jakarta, currently at Krom Bank. I work on data pipelines, CDC streaming, and the day-to-day reliability of our data platform.

Currently
Data Engineer · Krom BankOctober 2025 — present
Previously
DANA · TelkomselData engineering internships
Based in
Jakarta, Indonesia

01 Projects

CLOUD LAKEHOUSE & ICEBERG01
GTFS + Lambda 60s micro-batch
S3 Tables (Iceberg) Managed compaction
dbt-athena Adherence marts
Airflow 3 (Fargate) Asset scheduling
Apache Iceberg (S3 Tables)Airflow 3 on Fargate100% Terraform

PERSONAL PROJECT CLOUD LAKEHOUSE & ICEBERG

Transit Lakehouse

Scheduled micro-batch lakehouse capturing real-time transit telemetry into Apache Iceberg on Amazon S3 Tables. Orchestrated with Airflow 3 on AWS Fargate, transformed with dbt-athena, and provisioned with Terraform.

Apache IcebergAmazon S3 TablesAirflow 3AWS Fargatedbt-athenaTerraformPython
Deep dive & architecture

Open table format with Apache Iceberg: Stores transit telemetry in Amazon S3 Tables backed by the AWS Glue catalog. Demonstrates schema evolution across changing GTFS stop specifications, managed snapshot compaction, and metadata-driven partition pruning without maintenance decay.

Disciplined 60s micro-batching: Uses EventBridge and AWS Lambda to ingest raw protobuf GTFS-Realtime feeds every minute into immutable S3 partitions. A lightweight PyIceberg writer batches records directly into Iceberg tables, avoiding the operational bloat and cost of always-on streaming consumers.

Airflow 3 asset orchestration: Deploys Apache Airflow 3 on AWS Fargate using LocalExecutor, leveraging native asset-aware scheduling and blocking data freshness checks to trigger dbt-athena modeling runs only when new partitions land.

Targeting real feed pathologies: Profiles transit feed quirks before modeling: handling mid-trip vehicle signal dropouts, out-of-order telemetry coordinates, and real-time trips unlisted in static schedules.

Infrastructure as Code & cost invariants: Entire environment is provisioned via Terraform with a verified destroy path and zero hardcoded credentials (OIDC CI). Strict Athena workgroup byte-scan caps, S3 lifecycle expiration, and budget alarms act as asserted invariants to maintain a steady-state run cost under ~$13/month.

View on GitHub (opens in a new tab)
STREAMING CDC & LAKEHOUSE02
Postgres 17 WAL source
Debezium 3.6 Row changes
Kafka KRaft Event stream
DuckDB + dbt SCD2 marts
639,764 change events88 tests passing18s in CI

PERSONAL PROJECT STREAMING & SCD TYPE 2

CDC Lakehouse

Change data capture from an OLTP database into a dimensional warehouse with SCD Type 2 history. Replays verified e-commerce mutations with strict LSN monotonic ordering.

Postgres 17Debezium 3.6Kafka 4.3 (KRaft)dbtDuckDBDocker Compose
Deep dive & architecture

Real change history: Replays 295,272 status transitions and 259 customer address changes reconstructed from the Olist dataset rather than fabricated mutations, keeping history faithful to actual events.

SCD2 time & ordering: Solved temporal window collapse during replay by pairing Postgres LSN for strict monotonic ordering with updated_at for business validity. Validity windows are clamped non-decreasing with running maximums and flagged on 1,443 rows rather than silenced.

Restraint in modeling: Deliberately kept seller and product dimensions as SCD Type 1 after data profiling proved zero attribute drift. Built SCD Type 2 on customer_unique_id (the real individual) rather than per-order aliases, resolving 317 fact rows to historical addresses.

Resilient CDC testing: 88 data tests run on dbt build to enforce exactly one current version per key, seamless validity windows without gaps/overlaps, and non-fanning as-of joins. Upstream assertions verify Kafka offsets match Postgres rows and pin gross revenue to the cent.

Columnar performance: Arrow columnar batching and registered views reduced DuckDB event load time from 25 minutes down to 18 seconds in CI.

View on GitHub (opens in a new tab)
BATCH LAKEHOUSE03
NYC S3 / Parquet Monthly files
Dagster Quality gate
dbt Core Star schema
DuckDB Tested marts
4,008,943 trips39 data tests1:1 defect-flagged

PERSONAL PROJECT NYC BIKE-SHARE ANALYTICS

Citi Bike Lakehouse

Monthly-partitioned batch analytics over NYC bike-share data. Dagster orchestrates ingestion with blocking quality gates into DuckDB, while dbt builds a verified star schema.

DagsterdbtDuckDBPythonParquet
Deep dive & architecture

Flag defects, don't delete them: Corrupt and outlying rows (null coordinates, trips > 24h, off-month boundary records) carry explicit boolean flags rather than being silently filtered out, ensuring the fact table reconciles 1:1 with source records.

Blocking quality gate: Dagster asset checks validate partition non-emptiness and partition boundary conformance before dbt runs, halting the pipeline if an anomaly is detected.

Source-aligned scheduling: Scheduled at 06:00 on the 5th of each month to reflect Citi Bike's actual publishing cadence and prevent 404 ingest failures.

Tested invariants: 39 data tests guarantee fact counts equal landed source rows, daily aggregates sum cleanly to facts without join fan-out, and defect flags match their underlying conditions.

Engine portability: Decoupled Parquet landing zone and zero engine-specific DDL allow seamless re-targeting to Snowflake or BigQuery without downloading ~370 MB/month again.

View on GitHub (opens in a new tab)
PERSONAL PROJECT04
AZURE BATCH PIPELINEFormula 1
INGESTTRANSFORMANALYZE

FORMULA 1 AZURE DATA PIPELINE

Formula 1 data pipeline

For this personal project, I used Azure Data Factory, Databricks, and Spark to process Formula 1 data, with the results stored in Azure Data Lake Storage.

DatabricksSparkAzure Data FactoryADLS
View on GitHub (opens in a new tab)

02 Experience

Download CV

Krom Bank

Data Engineer

CURRENT

OCT 2025 — PRESENT / JAKARTA, INDONESIA

  • Modernized ETL and CDC ingestion through reusable, config-driven architectures.
  • Built a severity framework for 500+ Airflow DAGs with Sev1–Sev4 SLAs and alert routing, reducing critical incident triage time by ~45%.
  • Evaluated ClickHouse for fraud analytics and created GCP, Airflow, and dbt dashboards for platform performance, cost, and usage.

DANA

Data Engineer Intern

JUL 2024 — OCT 2025 / JAKARTA, INDONESIA

  • Developed and maintained 50+ production pipelines using Apache Airflow and Alibaba MaxCompute.
  • Built compute and cost monitoring that improved incident response by 60% and reduced unexpected compute costs by 15%.
  • Supported dimensional remodeling of data marts serving ~80% of business needs.

Telkomsel

Data Engineer Intern

FEB 2024 — JUN 2024 / JAKARTA, INDONESIA

  • Built an end-to-end MySQL-to-warehouse pipeline with Apache Airflow for the Radio Transport Power Engineering division.
  • Improved planning and tracking efficiency by 80% through automated delivery to Power BI dashboards, Telegram bots, and reporting tools.

03 About me

I started in data engineering through internships at Telkomsel and DANA, then joined Krom Bank in 2025.

A lot of my work is improving systems that already exist: untangling ETL scripts, tuning ingestion, and making it easier to spot problems when something breaks.

Bachelor of Computer ScienceBINUS University · 2021–2025GPA 3.66 / 4.00

Technical skills

Languages & foundations

PythonSQLBashGit

Data & orchestration

Apache AirflowdbtConfluentBigQueryClickHouseMaxComputePostgreSQL

Cloud & infrastructure

Google CloudAlibaba CloudDockerKubernetes

Project toolkit

Azure Data FactoryDatabricksApache SparkADLS

Contact

You can reach me by email or on LinkedIn.