omar.io

Posts

Staging Bulk Uploads With Amazon S3 Tables

Aug 17, 2026

Building a bulk upload or download API for structured data usually means picking a file format, writing parsers and serializers on both sides, coercing strings back into real types, chunking large transfers, and cleaning up half-loaded data after failures.

Direct-to-S3 uploads point at a better shape: vend a scoped credential and let the client write bytes straight to storage, no API in the middle. This works great for blob uploads, but for structured data, clients typically still send a CSV or JSON batch (e.g. Stripe’s batch jobs API).

With S3 Tables and Apache Iceberg, we can apply the same idea to structured data: vend access to a staging table instead of a blob location, and let the client write rows to it directly. No parsers, serializers, or large payloads to juggle; the Iceberg ecosystem handles that for us.

(continue reading)

AI Coding Habits

Mar 10, 2026

After coding with agents, I’ve settled into two habits that have meaningfully improved the experience: keeping a self-documenting AGENTS.md in every repo and doubling down on making everything runnable locally.

(continue reading)

Stop playing pong with your build server

Apr 14, 2025

Special thanks to Tim Cardwell for reviewing a draft of this post.

“Build Server Pong” is what you inadvertently play when you treat your build server and source control as a REPL (read-edit-print-loop). You make a code change, commit it, push it, kick off a build, grab a coffee, then wait for the results. Rinse and repeat until you’ve got a successful build.

Build Server Pong

However, even if you eventually score a point by getting a successful build, you’ve lost time in the rally to get it. It’s an easy trap to fall into because most build systems require you to run the workflow on their hosted runners to see the results of your changes.

(continue reading)

The Types of Software Engineers

Jan 10, 2017

A plethora of books, articles, and research papers have been written about software engineering quality measurement. Over the course of the last half-century, different methods of measurement have been developed, adopted, abused, and discarded for newer methods that aim to solve the problems of the previous methods.

(continue reading)

What does it mean to 'mine' Bitcoins?

Jul 17, 2016

Bitcoins are in vogue. Distributed ledgers, fiat currency, and the dramatic impact cryptocurrencies will have on financial systems are topics of discussion on trains, in board meetings, and at the dinner table. As of writing, the exchange rate is 1 BTC = 679.99 USD.

(continue reading)

Why .NET?

Dec 10, 2015

Originally posted on the Pangea Money Transfer Engineering blog.

We get asked “Why .NET?” a lot. It’s rare to find .NET startups these days and for good reason. Historically speaking, the .NET ecosystem was unattractive due to the high licensing cost of Windows and Visual Studio. In addition, .NET had poor interoperability with non-Microsoft products, which meant additional licensing costs for compatible products (like SQL Server). Lastly, Microsoft’s aggressive anti-competitive stance towards its competitors and open source software created a rift between their products and developers.

(continue reading)

ByteSize

Nov 15, 2013

ByteSize is a utility class that makes byte size representation in code easier by removing ambiguity of the value being represented.

(continue reading)