for engineers & technical reviewers

Technical Case Studies

Three production systems in full detail: the problem, the solution shape, the architecture, and why every service earned its place. The plain-language versions live on the main page.

Medallion lakehouse for audit-grade enterprise reporting

An enterprise data platform on Databricks, delivered through Systems Ltd. I worked within and extended the transformation and orchestration layers: PySpark and Spark SQL across Bronze → Silver → Gold, plus the validation and troubleshooting that keeps a regulated reporting layer trustworthy.

Batch · lakehouse

The problem

Core transactional extracts arrive as raw files — no schema stability, no deduplication, no conformance across source systems. Analysts can't query raw extracts safely: no ACID guarantees, no reliable "current state" of an entity. Full reprocessing on every run doesn't scale. And in a regulated enterprise, the reporting layer carries audit weight — silent data corruption between layers is the primary risk to design against.

The solution

A Delta Lake medallion architecture: Bronze lands raw extracts append-only with ingestion metadata; Silver cleanses, deduplicates, and conforms entities via incremental MERGE INTO upserts — no full reloads; Gold builds business-ready aggregates for reporting. Databricks Workflows drives the job graph as a control plane, and validation checkpoints sit between every layer so corruption is caught at the boundary, not in a report.

Transactional systemsbatch extract files
Landing zoneobject storage
Bronzeraw · append-only · metadata
SilverMERGE INTO · dedup · conform
Goldbusiness aggregates
BI & reportinganalytics consumers
Control plane Databricks Workflows — dependencies · retries · schedules · incremental runs
Quality gates Schema verification & record-integrity checks at every layer boundary

Why each piece earned its place

ServiceRole in this systemWhy it, and not the obvious alternative
Delta LakeTable format for all three layersACID transactions and time travel over plain Parquet — an audit trail can't sit on files that can half-write.
Medallion layersBronze / Silver / Gold separationEach layer has one job, so failures isolate to a boundary. One monolithic transform makes corruption untraceable.
Delta MERGE INTOIncremental Silver upsertsMaintains a reliable current state without full reloads — append-plus-reprocess doesn't scale on daily extracts.
PySpark / Spark SQLAll transformation logicExtracts are distributed-scale; partitioned Spark jobs with tuned file layout beat any single-node process.
Databricks WorkflowsJob orchestrationDependencies, retries, and scheduling live next to the compute — no extra orchestration hop to operate.

Engineering challenges

  • Schema drift in upstream extracts — caught at the Bronze→Silver validation gate instead of surfacing in reports.
  • Partitioning and Delta/Parquet file layout tuned so Gold-layer queries stay fast as data accumulates.
  • Failed-run investigation and partition-level reprocessing after upstream corrections, without breaking incremental state.

Services in this system

DatabricksPySparkSpark SQLDelta Lake Databricks WorkflowsParquetObject storageGit

Airflow-orchestrated Spark platform at enterprise scale

A shared, multi-domain AWS platform delivered through Systems Ltd — research data alongside commercial and operational data, serving several business domains at once. My role was weighted toward reliability: diagnosing production failures, optimizing S3 flows and DAG performance, and promoting workflows dev → prod inside a controlled enterprise access model.

Batch · multi-domain

The problem

Heterogeneous workloads across multiple business domains can't share one execution shape — some need Python-scale glue, some need distributed Spark. Cluster spin-up latency is unacceptable when a large DAG estate fires continuously. Memory-skewed jobs choke on uniform hardware. And at this DAG count, failures are continuous background noise: the platform's real problem is diagnosability, not happy-path execution.

The solution

MWAA (managed Airflow) as the control plane, with both scheduled DAGs and event-based DAGs triggered by S3 file arrivals. Each DAG routes tasks by type: pure Python runs on the Airflow worker layer, PySpark is submitted as steps to a pool of ~six persistent EMR clusters — one provisioned with very large memory for heavy workloads. Curated output lands back in S3 and serves analytics through Redshift, with CloudWatch as the investigation surface and IAM boundaries shaping every change.

Source domainsresearch · commercial data
S3 raw zonesfile arrival → event trigger
MWAA / Airflowscheduled + S3-event DAGs
Python tasksAirflow workers
EMR cluster pool~6 persistent · 1 large-mem
S3 curatedoptimized read/write paths
RedshiftSQL validation · marts
Domain analyticsresearch + business teams
Observability plane CloudWatch logs + Airflow workflow history — the primary incident-investigation surface
Access boundary IAM least-privilege + controlled dev → prod promotion — every change goes through the gate

Why each piece earned its place

ServiceRole in this systemWhy it, and not the obvious alternative
Persistent EMR clustersStanding Spark compute poolTransient clusters mean spin-up latency on every run — unacceptable with a DAG estate firing continuously. The trade-off (standing cost, cluster hygiene) was accepted deliberately.
Large-memory clusterDedicated home for heavy jobsMemory-skewed workloads shouldn't force every cluster onto expensive uniform hardware — isolate the skew instead.
MWAAManaged Airflow control planeA big mixed DAG estate needs mature scheduling, sensors, and history — without the team also operating Airflow itself.
Python / Spark task splitRouting by workload shapeGlue-code tasks don't deserve a Spark cluster; distributed joins can't run on a worker. Route each to its right engine.
RedshiftAnalytical serving layerDomain analysts need warehouse SQL they can validate — and validation queries were part of the reliability loop.

Engineering challenges

  • Root-causing DAG failures through CloudWatch and workflow history when IAM boundaries blocked direct access to the failing component.
  • Optimizing S3 read/write paths feeding EMR steps without disturbing a shared, always-running platform.
  • Promoting workflow changes dev → prod through a controlled path — and documenting every fix so the next failure resolves faster.
  • Working around AWS service-level constraints and permission boundaries as a design input, not an excuse.

Services in this system

MWAA / AirflowEMRS3RedshiftPySpark PythonSQLCloudWatchIAM

Serverless listing-feed ingestion (MLS/RETS) at Kavtech Solutions

Listing-data ingestion built fully serverless and event-driven. This is where I owned the most design surface: I designed and deployed these pipelines, onboarded new data feeds, mentored teammates on the AWS patterns, and documented each solution end to end — including rollback.

Serverless · event-driven

The problem

MLS/RETS feeds are numerous, independently owned, and inconsistent — every new data provider means another feed with its own schema quirks, credentials, and refresh cadence. Volume is bursty and scheduled, so standing compute would idle most of the time. Each feed carries its own credentials — a secrets-handling problem before it's a data problem. And a feed that silently changes schema poisons everything downstream. The real business metric is how cheap it is to onboard the next feed.

The solution

No standing compute at all. EventBridge rules — scheduled and event-based — trigger a Step Functions state machine per ingestion workflow, with the error/retry path modeled explicitly in the state machine rather than buried in code. Lambda stages fetch, parse, normalize, and validate each feed into a unified listing schema, landing raw and processed data in S3 and relational serving data in RDS. Downstream apps consume through API Gateway behind Cognito; Secrets Manager feeds per-feed credentials into Lambda. CloudFormation/SAM makes each new feed a repeatable deployment, not a project.

MLS / RETS feeds+ REST API sources
EventBridgescheduled + event rules
Step Functionsstate machine · explicit retry path ↺
Lambda stagesfetch · parse · normalize · validate
S3 zonesraw + processed
RDSunified listing schema
API GatewayCognito-guarded serving
Consumer appsdownstream platform
Secrets plane Secrets Manager → per-feed credentials injected into Lambda — rotation without redeploys
Monitoring plane CloudWatch across every state machine — execution monitoring and failure resolution

Why each piece earned its place

ServiceRole in this systemWhy it, and not the obvious alternative
Serverless (Lambda)All computeFeed volume is bursty and scheduled — standing servers would idle most of the day. Serverless is the correct fit here, not a fashionable one.
Step FunctionsWorkflow orchestrationSequencing, error handling, and retries live in the state machine where they're visible and testable — not buried inside function code.
EventBridgeTriggering surfaceOne place for both cron schedules and event rules — each feed's cadence is configuration, not code.
Unified listing schemaNormalization targetDownstream consumers see one listing model no matter which MLS quirk produced it — the alternative is every consumer handling every feed's shape.
Secrets ManagerPer-feed credentialsDozens of independently-owned feed credentials can't live in config files — rotation had to work without touching code.
CloudFormation / SAMDeploymentNew-feed onboarding is the recurring workload — templated infrastructure makes the marginal feed cheap to add.

Engineering challenges

  • Schema validation at the ingestion boundary — a feed that drifts silently must fail loudly there, not poison RDS.
  • Retry and error semantics for flaky feed providers, modeled explicitly in Step Functions.
  • Per-feed authentication against independently-owned MLS systems, with credentials rotated through Secrets Manager.
  • Keeping new-feed onboarding repeatable: templated deploys, documented runbooks with rollback, and mentoring teammates on the patterns.

Services in this system

LambdaStep FunctionsEventBridgeAPI Gateway S3RDSCognitoSecrets Manager CloudWatchCloudFormationSAM CLIPythonSQL

Python Engineer — automation & scraping systems

Where the foundation was built: turning repetitive client work into repeatable systems. Selenium scrapers pulled business data from the web, Python pipelines cleaned it, MongoDB stored it, GPT APIs enriched it, and Flask/Streamlit apps delivered it back as reports and demos — saving clients 30+ hours of manual work per month.

Automation · scraping
Web targetsGoogle Maps · Zillow
Selenium botsPython scrapers
Clean & shapePython pipelines
MongoDB / CSVstructured store
GPT enrichmentAPI integrations
Flask / Streamlitreports · ML demos

What I actually did

  • Saved clients 30+ hours/month with file conversion and transformation scripts.
  • Extracted business data from Google Maps and Zillow with resilient Selenium flows.
  • Built Flask and Streamlit prototypes for analytics and ML demos.

Services in this system

PythonSeleniumMongoDBGPT APIs FlaskStreamlitCSV analytics