<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Jacob&apos;s Blog</title><description>AI, Data, IoT and AWS</description><link>https://jacob.verhoeks.org/</link><item><title>Scaling Terraform Across many Teams: A Native Framework for Platform Engineering</title><link>https://jacob.verhoeks.org/blog/-scaling-terraform-across-many-teams-a-native-framework-for-platform-engineering-3n0b/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/-scaling-terraform-across-many-teams-a-native-framework-for-platform-engineering-3n0b/</guid><description>TL;DR:    A pure Terraform framework that lets 50+ teams self-service infrastructure by...</description><pubDate>Mon, 12 Jan 2026 16:34:01 GMT</pubDate><category>terraform</category><category>scaling</category><category>devops</category></item><item><title>How We Build Software with AI Assistants</title><link>https://jacob.verhoeks.org/blog/2026-03-22-how-we-build-with-ai-assistants/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-03-22-how-we-build-with-ai-assistants/</guid><description>From brainstorm to production in four phases — structured AI collaboration that produces better software than either alone.</description><pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate><category>ai</category><category>development-process</category><category>claude</category><category>productivity</category><author>Jacob Verhoeks</author></item><item><title>Making SQE Work Everywhere: Pluggable Auth and Catalogs</title><link>https://jacob.verhoeks.org/blog/2026-03-22-making-sqe-work-everywhere/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-03-22-making-sqe-work-everywhere/</guid><description>How we&apos;re turning a single-vendor query engine into something that runs against any identity provider, any catalog, and any cloud.</description><pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate><category>auth</category><category>oidc</category><category>polaris</category><category>architecture</category><author>Jacob Verhoeks</author></item><item><title>When Your SQL Engine Understands Meaning</title><link>https://jacob.verhoeks.org/blog/2026-03-22-when-your-sql-engine-understands-meaning/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-03-22-when-your-sql-engine-understands-meaning/</guid><description>SQL engines know table shapes. We&apos;re adding ontologies, property graphs, vector search, and AI-native interfaces.</description><pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate><category>ai</category><category>ontology</category><category>vector-search</category><category>future</category><author>Jacob Verhoeks</author></item><item><title>We Replaced Our Trino Fork with a Rust SQL Engine</title><link>https://jacob.verhoeks.org/blog/2026-03-22-why-we-replaced-trino-with-rust/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-03-22-why-we-replaced-trino-with-rust/</guid><description>How we went from maintaining a 2M-line Java fork to shipping a 50MB binary that runs every query as the authenticated user.</description><pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate><category>rust</category><category>datafusion</category><category>trino</category><category>architecture</category><author>Jacob Verhoeks</author></item><item><title>Building a Comprehensive SQL Benchmark Suite</title><link>https://jacob.verhoeks.org/blog/2026-03-24-benchmark-suite/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-03-24-benchmark-suite/</guid><description>Seven benchmark suites, 222 queries, and the infrastructure to measure performance honestly.</description><pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate><category>benchmarks</category><category>tpch</category><category>tpcds</category><category>performance</category><author>Jacob Verhoeks</author></item><item><title>Bringing dbt to the Data Platform: A Browser-Based IDE</title><link>https://jacob.verhoeks.org/blog/2026-03-27-bringing-dbt-to-the-data-platform/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-03-27-bringing-dbt-to-the-data-platform/</guid><description>Integrating dbt Core into Chameleon with a full workspace IDE, git operations, lineage visualization, and AI-assisted model development.</description><pubDate>Fri, 27 Mar 2026 00:00:00 GMT</pubDate><category>dbt</category><category>data-engineering</category><category>docker</category><category>react</category><author>Jacob Verhoeks</author></item><item><title>AI Flows: Langflow as the Platform&apos;s Intelligence Layer</title><link>https://jacob.verhoeks.org/blog/2026-04-05-ai-flows-langflow-integration/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-04-05-ai-flows-langflow-integration/</guid><description>Embedding Langflow as a managed AI service with auto-switching flows, MCP tool integration, and context-aware assistance.</description><pubDate>Sun, 05 Apr 2026 00:00:00 GMT</pubDate><category>ai</category><category>langflow</category><category>mcp</category><category>react</category><author>Jacob Verhoeks</author></item><item><title>A Visual Editor for Open Data Contracts</title><link>https://jacob.verhoeks.org/blog/2026-04-07-open-data-contracts-visual-editor/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-04-07-open-data-contracts-visual-editor/</guid><description>A full ODCS v3.1.0 contract editor with tabbed forms, live YAML preview, catalog import with AI-suggested quality checks, and dbt export.</description><pubDate>Tue, 07 Apr 2026 00:00:00 GMT</pubDate><category>data-contracts</category><category>odcs</category><category>react</category><category>data-quality</category><author>Jacob Verhoeks</author></item><item><title>Docker Dev Mode: Hot Reload for the Full Stack</title><link>https://jacob.verhoeks.org/blog/2026-04-08-docker-dev-mode-hot-reload/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-04-08-docker-dev-mode-hot-reload/</guid><description>A docker-compose.dev.yml overlay for instant feedback on frontend and backend changes without rebuilding containers.</description><pubDate>Wed, 08 Apr 2026 00:00:00 GMT</pubDate><category>docker</category><category>development</category><category>vite</category><category>hot-reload</category><author>Jacob Verhoeks</author></item><item><title>Databricks-Style Column Profiling in the Data Explorer</title><link>https://jacob.verhoeks.org/blog/2026-04-09-databricks-style-column-profiling/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-04-09-databricks-style-column-profiling/</guid><description>Inline column statistics with distribution sparklines computed from real SQL queries, not just Iceberg manifest metadata.</description><pubDate>Thu, 09 Apr 2026 00:00:00 GMT</pubDate><category>data-explorer</category><category>profiling</category><category>react</category><category>sql</category><author>Jacob Verhoeks</author></item><item><title>Dropping Radix UI: Going Fully Custom for React 19</title><link>https://jacob.verhoeks.org/blog/2026-04-09-dropping-radix-ui-for-react-19/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-04-09-dropping-radix-ui-for-react-19/</guid><description>How a React 19 infinite re-render loop led us to replace all third-party UI primitives with 660 lines of custom components.</description><pubDate>Thu, 09 Apr 2026 00:00:00 GMT</pubDate><category>react</category><category>radix-ui</category><category>accessibility</category><category>frontend</category><author>Jacob Verhoeks</author></item><item><title>From 63% to 95%: Building Trino SQL Compatibility in a Single Day</title><link>https://jacob.verhoeks.org/blog/2026-04-09-trino-compatibility-journey/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-04-09-trino-compatibility-journey/</guid><description>Implementing 70+ UDFs, Iceberg time travel, metadata TVFs, and engine-level SQL features for Trino drop-in replacement.</description><pubDate>Thu, 09 Apr 2026 00:00:00 GMT</pubDate><category>trino</category><category>compatibility</category><category>udfs</category><category>iceberg</category><author>Jacob Verhoeks</author></item><item><title>Streaming Writes, Sort Order Safety, and the IN (Subquery) Workaround</title><link>https://jacob.verhoeks.org/blog/2026-04-10-streaming-writes-and-correctness/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-04-10-streaming-writes-and-correctness/</guid><description>Fixing OOM in CTAS, safe Iceberg sort order for mixed writers, and working around DataFusion limitations.</description><pubDate>Fri, 10 Apr 2026 00:00:00 GMT</pubDate><category>performance</category><category>correctness</category><category>iceberg</category><category>streaming</category><author>Jacob Verhoeks</author></item><item><title>Five Layers of Caching and an 8.8x Speedup Over Trino</title><link>https://jacob.verhoeks.org/blog/2026-04-12-caching-and-the-8x-speedup/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-04-12-caching-and-the-8x-speedup/</guid><description>How multi-layer caching took SQE from slower than Trino to 2.5-8.8x faster across every benchmark suite.</description><pubDate>Sun, 12 Apr 2026 00:00:00 GMT</pubDate><category>performance</category><category>caching</category><category>trino</category><category>benchmarks</category><author>Jacob Verhoeks</author></item><item><title>How Agentic AI Helped Us Beat Trino</title><link>https://jacob.verhoeks.org/blog/2026-04-13-agentic-ai-and-the-performance-breakthrough/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-04-13-agentic-ai-and-the-performance-breakthrough/</guid><description>221 queries, 7 suites, one week — how an AI assistant running automated benchmarks drove a major performance breakthrough.</description><pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate><category>ai</category><category>performance</category><category>benchmarks</category><category>development-process</category><author>Jacob Verhoeks</author></item><item><title>Auditing a Data Platform with AI: Iterative Security Hardening</title><link>https://jacob.verhoeks.org/blog/2026-04-13-auditing-with-ai-iterative-security-hardening/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-04-13-auditing-with-ai-iterative-security-hardening/</guid><description>Four audit rounds with escalating AI personas found 42 security issues and removed 6,500 lines of dead code.</description><pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate><category>security</category><category>ai</category><category>audit</category><category>claude</category><author>Jacob Verhoeks</author></item><item><title>Benchmark Data Generation: TPC at the Click of a Button</title><link>https://jacob.verhoeks.org/blog/2026-04-13-benchmark-data-generation/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-04-13-benchmark-data-generation/</guid><description>An admin page that generates TPC benchmark datasets on-demand. Pick a benchmark, pick a scale, click Generate — sqe-bench does the heavy lifting in a Docker container while SQE loads the results into Iceberg tables under your identity.</description><pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate><category>benchmarks</category><category>tpc</category><category>docker</category><category>iceberg</category><category>sqe</category><author>Jacob Verhoeks</author></item><item><title>43 Findings, Zero Deferred: A Production Security Audit of a Rust SQL Engine</title><link>https://jacob.verhoeks.org/blog/2026-04-13-security-hardening-43-findings/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-04-13-security-hardening-43-findings/</guid><description>We ran a full production sign-off audit against SQE and found 43 issues across security, runtime safety, logic bugs, and code quality. Then we fixed all of them in one session.</description><pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate><category>security</category><category>rust</category><category>audit</category><category>production-readiness</category><author>Jacob Verhoeks</author></item><item><title>When the Ground Shifts Faster Than People Can Stand</title><link>https://jacob.verhoeks.org/blog/2026-04-13-when-the-ground-shifts-faster-than-people-can-stand/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-04-13-when-the-ground-shifts-faster-than-people-can-stand/</guid><description>A companion piece to The Human Side of the Machine Shift — exploring why AI disruption hits different minds differently, and how leadership can turn discomfort into team strength.</description><pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate><category>ai</category><category>leadership</category><category>teams</category><category>change-management</category><author>Jacob Verhoeks</author></item><item><title>DataFusion 53, a Vendored Fork, and 40% Faster Queries</title><link>https://jacob.verhoeks.org/blog/2026-04-14-datafusion-53-and-the-iceberg-fork/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-04-14-datafusion-53-and-the-iceberg-fork/</guid><description>We upgraded SQE from DataFusion 52 to 53 by forking and rebasing iceberg-rust ourselves. The result: 27-40% faster across every benchmark suite.</description><pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate><category>datafusion</category><category>iceberg</category><category>performance</category><category>rust</category><category>open-source</category><author>Jacob Verhoeks</author></item><item><title>Our Nemesis: TPC-DS Query 72 and the Limits of a Custom SQL Engine</title><link>https://jacob.verhoeks.org/blog/2026-04-16-our-nemesis-q72/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-04-16-our-nemesis-q72/</guid><description>One query. Ten tables. Twelve times slower than Trino. Everything we tried, what worked, what didn&apos;t, and where the ceiling is.</description><pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate><category>performance</category><category>tpc-ds</category><category>datafusion</category><category>trino</category><category>query-optimization</category><author>Jacob Verhoeks</author></item><item><title>The Iceberg Matrix and the Quiet Bug Hiding in V3</title><link>https://jacob.verhoeks.org/blog/2026-04-26-the-matrix-and-the-quiet-bug/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-04-26-the-matrix-and-the-quiet-bug/</guid><description>We thought the V3 path worked. The unit tests said it worked. The matrix called it &apos;partial&apos; and we agreed. Then we wrote eleven end-to-end tests and discovered Polaris had been silently rejecting every V3 column type for months.</description><pubDate>Sun, 26 Apr 2026 00:00:00 GMT</pubDate><category>iceberg</category><category>v3</category><category>polaris</category><category>testing</category><category>matrix</category><author>Jacob Verhoeks</author></item><item><title>SQE Talks to Five Catalogs Now: HMS, Nessie, Glue, JDBC, S3 Tables</title><link>https://jacob.verhoeks.org/blog/2026-04-29-five-catalogs-live/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-04-29-five-catalogs-live/</guid><description>We claimed the engine was catalog-agnostic. Time to prove it. One branch, five live integration tests, one small AWS SigV4 patch, and a matrix score that moved from 153 to 158.</description><pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate><category>iceberg</category><category>catalog</category><category>aws</category><category>s3-tables</category><category>hive-metastore</category><category>nessie</category><author>Jacob Verhoeks</author></item><item><title>Why a Public Iceberg Matrix Beats Vendor Spec Sheets</title><link>https://jacob.verhoeks.org/blog/2026-04-29-the-iceberg-matrix-as-a-scoreboard/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-04-29-the-iceberg-matrix-as-a-scoreboard/</guid><description>Sixty-three capabilities, three levels, no marketing. The Iceberg Matrix is what compatibility looks like when the rubric is public and the evidence has to land in code. Here is why it works, what we learned from sitting on it, and why every open standard needs one.</description><pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate><category>iceberg</category><category>matrix</category><category>open-source</category><category>compatibility</category><category>ecosystem</category><author>Jacob Verhoeks</author></item><item><title>How we accidentally created a DuckDB</title><link>https://jacob.verhoeks.org/blog/2026-05-07-accidentally-duckdb/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-05-07-accidentally-duckdb/</guid><description>SQE started as a distributed Iceberg query engine. Five MRs later it queries CSVs from disk, Parquet from S3, and Parquet from HuggingFace. We did not plan that.</description><pubDate>Thu, 07 May 2026 00:00:00 GMT</pubDate><category>duckdb</category><category>iceberg</category><category>datafusion</category><category>embedded</category><category>developer-experience</category><author>Jacob Verhoeks</author></item><item><title>One Binary, No Cluster: SQE Goes Embedded</title><link>https://jacob.verhoeks.org/blog/2026-05-07-one-binary-no-cluster/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-05-07-one-binary-no-cluster/</guid><description>We built SQE for distributed Iceberg, but most of the time you just want to look at a parquet file. Here&apos;s how we made the engine work both ways without forking the codebase.</description><pubDate>Thu, 07 May 2026 00:00:00 GMT</pubDate><category>cli</category><category>embedded</category><category>duckdb</category><category>datafusion</category><category>developer-experience</category><author>Jacob Verhoeks</author></item><item><title>Shipping OpenLineage: column-level lineage for an Iceberg engine</title><link>https://jacob.verhoeks.org/blog/2026-05-09-shipping-openlineage/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-05-09-shipping-openlineage/</guid><description>SQE now emits OL 2-0-2 events with column-level lineage on every write. Here is what they look like, why we walked the LogicalPlan to build them, and the disk spool we did not want to write.</description><pubDate>Sat, 09 May 2026 00:00:00 GMT</pubDate><category>openlineage</category><category>lineage</category><category>datafusion</category><category>iceberg</category><category>observability</category><author>Jacob Verhoeks</author></item><item><title>Mounting catalogs from SQL: ATTACH, DETACH, and the registry pattern</title><link>https://jacob.verhoeks.org/blog/2026-05-10-attach-catalog-and-secrets/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-05-10-attach-catalog-and-secrets/</guid><description>SQE now ships DuckDB-style ATTACH / DETACH and CREATE / DROP SECRET. The story of building it covers parser extension, credential hygiene, a lifecycle bug we found in the integration tests, and a state-store pattern that is starting to repeat.</description><pubDate>Sun, 10 May 2026 00:00:00 GMT</pubDate><category>iceberg</category><category>duckdb</category><category>datafusion</category><category>catalogs</category><category>developer-experience</category><author>Jacob Verhoeks</author></item><item><title>Nine PRs, two merge conflicts, and the value of themed branches</title><link>https://jacob.verhoeks.org/blog/2026-05-13-nine-prs-two-conflicts/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-05-13-nine-prs-two-conflicts/</guid><description>Sunday afternoon: an audit dropped eighteen issues into the tracker. Monday morning we had nine merge requests open. Two of them hit conflicts on rebase. Neither one mattered. Here is why that was deliberate, not lucky.</description><pubDate>Wed, 13 May 2026 00:00:00 GMT</pubDate><category>developer-experience</category><category>code-review</category><category>git</category><category>security</category><author>Jacob Verhoeks</author></item><item><title>read_parquet shouldn&apos;t read /etc/shadow</title><link>https://jacob.verhoeks.org/blog/2026-05-13-read-parquet-shouldnt-read-etc-shadow/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-05-13-read-parquet-shouldnt-read-etc-shadow/</guid><description>Modern object-store abstractions unify the filesystem and HTTP behind a single URL. That&apos;s a feature for ergonomics. It&apos;s a security trap when the URL comes from a user. SQE shipped that trap and then closed it. The IMDS pivot is the part worth telling.</description><pubDate>Wed, 13 May 2026 00:00:00 GMT</pubDate><category>security</category><category>ssrf</category><category>datafusion</category><category>rust</category><category>object-store</category><author>Jacob Verhoeks</author></item><item><title>npm install Shouldn&apos;t Run Your Code</title><link>https://jacob.verhoeks.org/blog/2026-05-14-npm-install-shouldnt-run-your-code/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-05-14-npm-install-shouldnt-run-your-code/</guid><description>Supply chain attacks on package registries are surging across every ecosystem. Two controls block the majority: a quarantine window and disabled install scripts. The exact config for npm, pip, Go, Maven, NuGet, Cargo, and more — plus a one-command proxy and shell tests you can run today.</description><pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate><category>security</category><category>supply-chain</category><category>npm</category><category>python</category><category>go</category><category>java</category><category>dotnet</category><category>rust</category><category>php</category><category>package-manager</category><category>devops</category><author>Jacob Verhoeks</author></item><item><title>Nineteen MRs, four waves, and the failure modes of agent batches at scale</title><link>https://jacob.verhoeks.org/blog/2026-05-15-nineteen-mrs-four-waves/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-05-15-nineteen-mrs-four-waves/</guid><description>Two days after the nine-PR audit pass, we ran a bigger one. 130 issues filed, 19 themed MRs merged across four waves. Same workflow, more failure modes. Watchdog stalls, a reboot mid-wave, a broken main, and config.rs as the conflict magnet. Here is what actually happened.</description><pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate><category>developer-experience</category><category>agentic-ai</category><category>code-review</category><category>git</category><category>security</category><author>Jacob Verhoeks</author></item><item><title>q72, our nemesis, and the Int32 that hid for a month</title><link>https://jacob.verhoeks.org/blog/2026-05-16-q72-the-nemesis/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-05-16-q72-the-nemesis/</guid><description>TPC-DS q72 sat at 10 seconds while every other query ran in under 1.4. Five days of investigation chased scan parallelism, range-based NDV, iceberg-rust upgrades, and the RisingWave fork. None of those were the bug. The bug was a silently-skipped Err arm in our dynamic-filter evaluator that swallowed every Int32 vs Int64 type clash. Fixing it: 15.5s to 0.77s. q72 now beats Trino.</description><pubDate>Sat, 16 May 2026 00:00:00 GMT</pubDate><category>performance</category><category>datafusion</category><category>iceberg</category><category>debugging</category><author>Jacob Verhoeks</author></item><item><title>The SSB regression that wasn&apos;t</title><link>https://jacob.verhoeks.org/blog/2026-05-17-the-ssb-regression-that-wasnt/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-05-17-the-ssb-regression-that-wasnt/</guid><description>MR #220 wired runtime filters into iceberg-rust&apos;s scan path and dropped TPC-DS 67%. SSB looked like it regressed 6%. Two failed heuristic attempts, one parquet-trace session, and ten warm passes later, the regression turned out to be measurement noise. The fix-the-fix that wasn&apos;t, and the data-clustering insight that explains why two suites with the same code path behave nothing alike.</description><pubDate>Sun, 17 May 2026 00:00:00 GMT</pubDate><category>performance</category><category>datafusion</category><category>iceberg</category><category>benchmarks</category><author>Jacob Verhoeks</author></item><item><title>Porting DuckDB&apos;s BinarySerializer to pure Rust</title><link>https://jacob.verhoeks.org/blog/2026-05-25-porting-the-binary-serializer/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-05-25-porting-the-binary-serializer/</guid><description>Ten sub-MRs in a day. The wire format, the fixture-driven debugging loop, and two bugs that the C++ reference encoder ships without telling you: WriteListWithDefault elision, and uninitialised bytes at NULL VARCHAR positions.</description><pubDate>Mon, 25 May 2026 00:00:00 GMT</pubDate><category>duckdb</category><category>quack</category><category>rust</category><category>wire-protocol</category><category>debugging</category><author>Jacob Verhoeks</author></item><item><title>The Last Mile Problem: Why 100% Supply Chain Coverage is Hard</title><link>https://jacob.verhoeks.org/blog/2026-05-25-supply-chain-interception-why-100-percent-is-hard/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-05-25-supply-chain-interception-why-100-percent-is-hard/</guid><description>Every time a developer runs npm install, they&apos;re implicitly trusting hundreds of strangers. Intercepting that trust is straightforward in theory — and surprisingly subtle in practice.</description><pubDate>Mon, 25 May 2026 00:00:00 GMT</pubDate><category>supply-chain</category><category>security</category><category>pf</category><category>macos</category><category>npm</category><category>proxy</category><category>devtools</category><author>Jacob Verhoeks</author></item><item><title>Speaking Quack: SQE as a DuckDB server, a DuckDB client, and a federation engine</title><link>https://jacob.verhoeks.org/blog/2026-05-26-speaking-quack/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-05-26-speaking-quack/</guid><description>DuckDB 1.5 ships a wire protocol called Quack. We re-implemented it in pure Rust, turned SQE into both server and client, and proved you can JOIN an Iceberg table with a remote DuckDB table in a single SELECT. Two waves of bugs, one federated query.</description><pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate><category>duckdb</category><category>quack</category><category>datafusion</category><category>iceberg</category><category>federation</category><author>Jacob Verhoeks</author></item><item><title>The type matrix as a roadmap: seven DuckDB types in two days</title><link>https://jacob.verhoeks.org/blog/2026-05-26-the-type-matrix-as-roadmap/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-05-26-the-type-matrix-as-roadmap/</guid><description>We started with a markdown table tracking which DuckDB types we could round-trip. The table became the roadmap. DECIMAL, LIST, STRUCT, MAP, ARRAY, ENUM, UNION each got their own MR. The surprises came from how DuckDB models the relationships: MAP is LIST&lt;STRUCT&gt;, UNION is STRUCT with a tag field, and DECIMAL packs four widths into one logical type.</description><pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate><category>duckdb</category><category>quack</category><category>datatypes</category><category>rust</category><category>process</category><author>Jacob Verhoeks</author></item><item><title>Renovate + Supply Chain: What It Actually Intercepts (and What It Doesn&apos;t)</title><link>https://jacob.verhoeks.org/blog/2026-05-27-renovate-supply-chain/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-05-27-renovate-supply-chain/</guid><description>We tested Renovate&apos;s registry behaviour for every ecosystem — npm, PyPI, Go, Cargo, Maven, NuGet, Composer — and found that minimumReleaseAge works for all of them, but how each datasource resolves its registry is surprisingly different. Here&apos;s what we found and how to build a complete defence.</description><pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate><category>renovate</category><category>supply-chain</category><category>cargo</category><category>rust</category><category>npm</category><category>python</category><category>go</category><category>security</category><category>escrow</category><author>Jacob Verhoeks</author></item><item><title>Supply Chain Attacks Hit Every Ecosystem. Here&apos;s How to Defend Yours.</title><link>https://jacob.verhoeks.org/blog/2026-05-27-supply-chain-defense-three-layers/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-05-27-supply-chain-defense-three-layers/</guid><description>A three-layer defense for developers and DevOps engineers: harden your dev machine in 5 minutes, lock down project configs for every ecosystem, and enforce policy org-wide with a proxy. Covers npm, pnpm, yarn, bun, pip, uv, Go, Maven, Gradle, NuGet, Cargo, and Composer — plus escrow, JFrog Curation, and Nexus.</description><pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate><category>security</category><category>supply-chain</category><category>npm</category><category>python</category><category>go</category><category>java</category><category>dotnet</category><category>rust</category><category>php</category><category>package-manager</category><category>devops</category><category>escrow</category><category>proxy</category><author>Jacob Verhoeks</author></item><item><title>Data Quality That Lives in a Contract</title><link>https://jacob.verhoeks.org/blog/2026-05-31-data-contracts-and-quality-with-open-data-contracts/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-05-31-data-contracts-and-quality-with-open-data-contracts/</guid><description>Data quality belongs in the table&apos;s contract, not scattered across dbt tests and cron jobs. We build on the Open Data Contract Standard, compile quality rules to portable SQL, and run them on the live engine under your identity — plus an honest accounting of what&apos;s wired and what isn&apos;t.</description><pubDate>Sun, 31 May 2026 00:00:00 GMT</pubDate><category>data-contracts</category><category>odcs</category><category>data-quality</category><category>governance</category><author>Jacob Verhoeks</author></item><item><title>dbt, Built Into the Platform</title><link>https://jacob.verhoeks.org/blog/2026-05-31-dbt-integration-deep-dive/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-05-31-dbt-integration-deep-dive/</guid><description>Not shelling out to the dbt CLI and calling it integration — a browser-native dbt IDE with git-backed projects, container runs, column-level lineage, and one-click quick-test. How a project becomes a workspace, and where the regex shortcuts bite.</description><pubDate>Sun, 31 May 2026 00:00:00 GMT</pubDate><category>dbt</category><category>data-engineering</category><category>lineage</category><category>docker</category><author>Jacob Verhoeks</author></item><item><title>An Ontology You Can Query: From a Blank Canvas to a Knowledge Graph</title><link>https://jacob.verhoeks.org/blog/2026-05-31-ontology-from-design-to-knowledge-graph/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-05-31-ontology-from-design-to-knowledge-graph/</guid><description>A semantic layer that doesn&apos;t end in a triple store. The schema lives in Postgres, the data stays in Iceberg, and one query translator compiles every façade — MCP, GraphQL, SQL views — down to the same SQL.</description><pubDate>Sun, 31 May 2026 00:00:00 GMT</pubDate><category>ontology</category><category>knowledge-graph</category><category>semantic-layer</category><category>mcp</category><author>Jacob Verhoeks</author></item><item><title>Setting It All Up With Terraform</title><link>https://jacob.verhoeks.org/blog/2026-05-31-setting-up-with-terraform/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-05-31-setting-up-with-terraform/</guid><description>A Terraform provider for the platform&apos;s own resources — warehouses, namespaces, grants, dbt projects, contracts, ontologies — managed in HCL, in a repo, in a pull request, with a plan you can read before you apply.</description><pubDate>Sun, 31 May 2026 00:00:00 GMT</pubDate><category>terraform</category><category>infrastructure-as-code</category><category>governance</category><category>data-platform</category><author>Jacob Verhoeks</author></item><item><title>A Data Platform You Actually Own</title><link>https://jacob.verhoeks.org/blog/2026-05-31-sovereign-data-platform/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-05-31-sovereign-data-platform/</guid><description>Every managed data platform asks you to put your data, identities, and queries in the vendor&apos;s plane. This one doesn&apos;t. Data, identity, catalog, compute, and policy — all five in infrastructure you control, by construction.</description><pubDate>Sun, 31 May 2026 00:00:00 GMT</pubDate><category>sovereignty</category><category>data-platform</category><category>open-source</category><category>compliance</category><author>Jacob Verhoeks</author></item><item><title>How It Compares: Databricks, Snowflake, iomete</title><link>https://jacob.verhoeks.org/blog/2026-05-31-vs-databricks-snowflake-iomete/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-05-31-vs-databricks-snowflake-iomete/</guid><description>An honest read of where this platform sits against Databricks, Snowflake, and iomete — on the one axis that decides the choice: how much control you keep versus how much operation you hand off. Including where we lose.</description><pubDate>Sun, 31 May 2026 00:00:00 GMT</pubDate><category>comparison</category><category>databricks</category><category>snowflake</category><category>iomete</category><category>data-platform</category><author>Jacob Verhoeks</author></item><item><title>What the Data Platform Actually Does</title><link>https://jacob.verhoeks.org/blog/2026-05-31-what-the-data-platform-does/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-05-31-what-the-data-platform-does/</guid><description>The map of the platform: an assembly of open-source parts behind a Backend-for-Frontend that holds your token and enforces your identity at every hop. What each surface does, how a request flows, and where the cliffs are.</description><pubDate>Sun, 31 May 2026 00:00:00 GMT</pubDate><category>data-platform</category><category>architecture</category><category>bff</category><category>open-source</category><author>Jacob Verhoeks</author></item><item><title>A dashboard for the engine</title><link>https://jacob.verhoeks.org/blog/2026-06-02-a-dashboard-for-the-engine/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-06-02-a-dashboard-for-the-engine/</guid><description>SQE already tracked every query and worker in memory, but there was no way to look at it without tailing logs or wiring Grafana. So we put a read-only dashboard on the health port: no login, no build step, no external assets. One HTML page over a small JSON API, with a tiny in-memory sampler so the charts move over time. Here is how it is built and why it stays deliberately small.</description><pubDate>Tue, 02 Jun 2026 00:00:00 GMT</pubDate><category>observability</category><category>frontend</category><category>operations</category><author>Jacob Verhoeks</author></item><item><title>Two Tenants in One Apply: Workspaces as Code</title><link>https://jacob.verhoeks.org/blog/2026-06-06-multi-tenant-workspaces-with-terraform/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-06-06-multi-tenant-workspaces-with-terraform/</guid><description>Multi-tenancy on a data platform is usually a ticket and a week of console clicking. We made it a Terraform apply: a workspace, its catalog, its groups, its grants, and its dbt project — isolated by construction, reviewed in a pull request.</description><pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate><category>terraform</category><category>multi-tenancy</category><category>infrastructure-as-code</category><category>governance</category><category>data-platform</category><author>Jacob Verhoeks</author></item><item><title>Lake Formation gates the catalog, not the rows</title><link>https://jacob.verhoeks.org/blog/2026-06-07-lake-formation-gates-the-catalog/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-06-07-lake-formation-gates-the-catalog/</guid><description>Our own README promised fine-grained Lake Formation in the SQE Glue quickstart. The engine does not do it. Here is what Lake Formation actually enforces when SQE reads S3 directly, and where SQE&apos;s real column and row masking lives.</description><pubDate>Sun, 07 Jun 2026 00:00:00 GMT</pubDate><category>lake-formation</category><category>glue</category><category>security</category><category>iceberg</category><category>aws</category><author>Jacob Verhoeks</author></item><item><title>Runnable docs, or how the quickstarts became a test suite</title><link>https://jacob.verhoeks.org/blog/2026-06-07-runnable-docs-test-suite/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-06-07-runnable-docs-test-suite/</guid><description>We turned every &apos;how to run SQE for X&apos; into a self-contained run.sh that goes from clean state to captured output. The point was documentation. The payoff was a test suite that caught a missing metric, an overclaimed capability, and a benchmark that would have polluted our baselines.</description><pubDate>Sun, 07 Jun 2026 00:00:00 GMT</pubDate><category>documentation</category><category>testing</category><category>quickstart</category><category>observability</category><category>benchmarks</category><author>Jacob Verhoeks</author></item><item><title>columns(2) must match fields(16)</title><link>https://jacob.verhoeks.org/blog/2026-06-10-columns-2-must-match-fields-16/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-06-10-columns-2-must-match-fields-16/</guid><description>Differential testing against Trino caught a distributed-scan bug the whole test suite missed: every projected query failed once a scan actually distributed. The first fix restored correctness by disabling projection pushdown. Then a Claude agent on the Fable model found the real bug, one line in the worker&apos;s streaming rewrite, and got the speed back: 3.1x overall, 10x on the worst query.</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><category>distributed</category><category>testing</category><category>performance</category><category>debugging</category><category>ai-agents</category><author>Jacob Verhoeks</author></item><item><title>The benchmark that lied, the oracle that didn&apos;t, and the day Trino was wrong</title><link>https://jacob.verhoeks.org/blog/2026-06-12-the-benchmark-that-lied/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-06-12-the-benchmark-that-lied/</guid><description>Our SF0.1 compare run looked great: zero mismatches across seven suites. Then we asked DuckDB to check the data and found that 16 &apos;passing&apos; TPC-DS queries had never selected a single row, TPC-C had zero warehouses, and the one real disagreement between SQE and Trino was Trino&apos;s fault. Plus: the dynamic filter that shipped 6 million rows because nobody carried it across a node swap.</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><category>benchmarks</category><category>testing</category><category>duckdb</category><category>performance</category><category>datafusion</category><author>Jacob Verhoeks</author></item><item><title>One file, one thread, and the 910ms that explained the SSB gap</title><link>https://jacob.verhoeks.org/blog/2026-06-13-one-file-one-thread/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-06-13-one-file-one-thread/</guid><description>On SSB at SF1 Trino ran scan-heavy queries about 2x faster than SQE, even though we pruned just as well. A new line in our query profile found it: a 151MB lineorder file decoded on a single thread, 94% of a 969ms query spent waiting on one scan. The obvious fix (more partitions) was a trap that regressed q72 from 17s to 100s once before. The safe fix parallelizes decode inside the scan without changing the plan the optimizer sees.</description><pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate><category>performance</category><category>datafusion</category><category>iceberg</category><category>benchmarks</category><author>Jacob Verhoeks</author></item><item><title>Six groups where the spec allows four</title><link>https://jacob.verhoeks.org/blog/2026-06-13-the-data-was-wrong-all-along/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-06-13-the-data-was-wrong-all-along/</guid><description>TPC-H q01 returned six (returnflag, linestatus) combinations on our generated data. The spec defines exactly four. Both SQE and Trino agreed on the wrong answer, because both read the same broken tables. The bug class behind it: fields the spec derives from other fields, drawn instead as independent uniform random. Five defects in TPC-H, one in SSB, all the same shape.</description><pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate><category>benchmarks</category><category>testing</category><category>duckdb</category><category>correctness</category><category>tpc-h</category><author>Jacob Verhoeks</author></item><item><title>The 14x gap that wasn&apos;t: q95, contention, and the number we almost fixed</title><link>https://jacob.verhoeks.org/blog/2026-06-14-the-14x-gap-that-wasnt/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-06-14-the-14x-gap-that-wasnt/</guid><description>TPC-DS q95 was our worst query: 18 seconds against Trino&apos;s 1.3, a 14x loss that justified building a whole optimizer feature. Before we wrote a line of it, we pulled the plan and the profile. The 12-million-row self-join the feature was meant to shrink did not exist, the engine ran the query in under half a second, and the 18 seconds lived only in a benchmark harness running both engines on one starved host. On a clean rig SQE runs q95 in 240ms and beats Trino 12x. A slow benchmark number is a hypothesis until you reproduce it in isolation.</description><pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate><category>benchmarks</category><category>performance</category><category>datafusion</category><category>testing</category><author>Jacob Verhoeks</author></item><item><title>The filter that rebuilt itself 14,600 times</title><link>https://jacob.verhoeks.org/blog/2026-06-15-the-filter-that-rebuilt-itself/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-06-15-the-filter-that-rebuilt-itself/</guid><description>A two-table TPC-H join that Trino ran in 2.2s took us 161s at SF10. We blamed partition layout, then single-node joins, then a subquery pattern. All three were wrong. A CPU profile and two timers found the truth: a runtime filter we pushed to the probe scan was getting re-snapshotted once per batch, and each snapshot rebuilt a 300,000-node expression tree. The fix snapshots it once. q12 went 161s to 2.7s, q17 176s to 7.1s, q10 from a 300s failure to 3.3s, with the result rows unchanged and no knob touched.</description><pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate><category>performance</category><category>datafusion</category><category>iceberg</category><category>benchmarks</category><author>Jacob Verhoeks</author></item><item><title>DataFusion 54: what it actually unblocked</title><link>https://jacob.verhoeks.org/blog/2026-06-18-datafusion-54-what-it-unblocked/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-06-18-datafusion-54-what-it-unblocked/</guid><description>DataFusion 54 landed and we bumped to it. The port was mostly mechanical, with one real behavioral change in the shuffle hasher. The interesting part is what the release notes implied and the engine did not deliver: LATERAL joins are logical-plan only, array lambdas still fail, and the one compatibility win we found was a documentation bug, not a DataFusion feature. We tested every claim before we wrote it down.</description><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate><category>datafusion</category><category>iceberg</category><category>benchmarks</category><category>sql</category><author>Jacob Verhoeks</author></item><item><title>When GRANT becomes a Ranger policy</title><link>https://jacob.verhoeks.org/blog/2026-06-19-grant-becomes-a-ranger-policy/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-06-19-grant-becomes-a-ranger-policy/</guid><description>SQE got a second access-control backend: write GRANT/REVOKE as Apache Ranger policy and let Polaris enforce it. The protocol took an afternoon. The identity model took the week, because Polaris federation does not work the way the token suggests.</description><pubDate>Fri, 19 Jun 2026 00:00:00 GMT</pubDate><category>ranger</category><category>polaris</category><category>security</category><category>iceberg</category><category>access-control</category><author>Jacob Verhoeks</author></item><item><title>One mask, and Spark and SQE agree to the byte</title><link>https://jacob.verhoeks.org/blog/2026-06-19-one-mask-spark-and-sqe-agree/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-06-19-one-mask-spark-and-sqe-agree/</guid><description>SQE&apos;s fine-grained Ranger backend does row filters, column masks, role-conditional masking, and tags. The kicker: the same Ranger policy on the same Polaris catalog produces byte-exact identical masked output in SQE and in standard Apache Spark. We proved it live, and the first run failed for a reason no amount of reading could have predicted.</description><pubDate>Fri, 19 Jun 2026 00:00:00 GMT</pubDate><category>ranger</category><category>spark</category><category>security</category><category>iceberg</category><category>data-masking</category><author>Jacob Verhoeks</author></item><item><title>Snowflake&apos;s governance model on open Iceberg</title><link>https://jacob.verhoeks.org/blog/2026-06-19-snowflake-governance-on-open-iceberg/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-06-19-snowflake-governance-on-open-iceberg/</guid><description>Snowflake gives you masking policies, row access policies, object tags, and a GRANT model. SQE gives you the same primitives on Apache Ranger and open Iceberg, enforced by plan rewrite and shared across engines. Here is the mapping, the one real edge SQE has, and the gaps we have not closed yet.</description><pubDate>Fri, 19 Jun 2026 00:00:00 GMT</pubDate><category>ranger</category><category>snowflake</category><category>security</category><category>iceberg</category><category>data-masking</category><author>Jacob Verhoeks</author></item><item><title>The log bucket that finally takes KMS</title><link>https://jacob.verhoeks.org/blog/2026-06-24-the-log-bucket-that-finally-takes-kms/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-06-24-the-log-bucket-that-finally-takes-kms/</guid><description>S3 server access logs could only land in an AES256 bucket for years, and AES256 is exactly what Security Hub flags. The escape was never a bucket setting. It was a KMS key policy that lets the logging service write with your key.</description><pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate><category>aws</category><category>s3</category><category>kms</category><category>security</category><category>terraform</category><author>Jacob Verhoeks</author></item><item><title>The fix that fixed nothing: SSB, dynamic filters, and a 4x bug</title><link>https://jacob.verhoeks.org/blog/2026-06-25-the-fix-that-fixed-nothing/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-06-25-the-fix-that-fixed-nothing/</guid><description>SSB is the one benchmark suite SQE loses to Trino, 2.5x at scale factor 10, while it wins everything else. The obvious cause was a single-threaded fact-table scan, so we built a planner rule to parallelize it. A correctness smoke caught the rule returning 240 million rows from a 60-million-row table, a latent 4x duplication bug we then fixed. Then the parallel scan turned out to change nothing: SSB did not move. The real cause is a dynamic filter that is a huge win on clustered fact tables and pure overhead on SSB&apos;s uniformly-distributed one. A slow number is a hypothesis, and the fix you are sure of can be perf-neutral.</description><pubDate>Thu, 25 Jun 2026 00:00:00 GMT</pubDate><category>benchmarks</category><category>performance</category><category>datafusion</category><category>testing</category><author>Jacob Verhoeks</author></item><item><title>A big write shouldn&apos;t take down the node</title><link>https://jacob.verhoeks.org/blog/2026-07-02-a-big-write-shouldnt-take-down-the-node/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-07-02-a-big-write-shouldnt-take-down-the-node/</guid><description>Reads on SQE spill to disk when they run out of memory. Writes did not. A large CTAS, a wide MERGE, or an oversized client upload could balloon a coordinator buffer past its memory limit and get the process OOM-killed, which takes every other query on that node with it. We gave the write path the same memory discipline the read path already had: pool-track the buffers that must exist so an oversized write fails as one typed error, and stream the ones that never needed to buffer at all.</description><pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate><category>write-path</category><category>iceberg</category><category>reliability</category><category>datafusion</category><author>Jacob Verhoeks</author></item><item><title>Metabase connected, then showed zero tables</title><link>https://jacob.verhoeks.org/blog/2026-07-02-metabase-connected-then-showed-zero-tables/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-07-02-metabase-connected-then-showed-zero-tables/</guid><description>A BI tool connecting to a query engine is not one query. It is a scripted handshake of a dozen metadata calls, and every one has to look exactly like Trino or the tool gives up without an error. We pointed a real Metabase at SQE&apos;s Trino endpoint and watched it fail six different ways: a PREPARE the parser rejected, a SHOW TABLES column that collapsed every table into one, catalogs it never enumerated, quoted identifiers that matched nothing, and a timestamp type signature the JDBC driver refused to parse. None of them threw. They just showed nothing.</description><pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate><category>trino-compatibility</category><category>metabase</category><category>superset</category><category>jdbc</category><author>Jacob Verhoeks</author></item><item><title>One Ranger policy, uniform access across SQE and Spark</title><link>https://jacob.verhoeks.org/blog/2026-07-03-one-ranger-policy-uniform-access/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-07-03-one-ranger-policy-uniform-access/</guid><description>A lakehouse rarely has one query engine. Spark writes the tables, SQE serves the interactive queries, and both touch the same Iceberg data. The usual failure is policy drift: each engine has its own access-control plugin, the same masking intent gets translated twice, and the two translations disagree. We avoided that by not translating twice. SQE and Spark read the same Apache Ranger hive service, so one policy written once enforces the same way in both. The SSN reads xxx-xx-1111 whichever engine ran the query.</description><pubDate>Fri, 03 Jul 2026 00:00:00 GMT</pubDate><category>security</category><category>ranger</category><category>spark</category><category>governance</category><author>Jacob Verhoeks</author></item><item><title>The tag travels with the table</title><link>https://jacob.verhoeks.org/blog/2026-07-05-the-tag-travels-with-the-table/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-07-05-the-tag-travels-with-the-table/</guid><description>Tag-based masking is two systems wearing one name: a rule that says what a tag means, and an association that says which columns carry it. We put the rule in Apache Ranger, where Spark can share it, and the association in the Iceberg table metadata, where it survives rename, replication, and federated catalogs that no policy store can see. Here is the split, the precedence contract, and the identity bug the tests now pin down.</description><pubDate>Sun, 05 Jul 2026 00:00:00 GMT</pubDate><category>security</category><category>ranger</category><category>iceberg</category><category>governance</category><author>Jacob Verhoeks</author></item><item><title>800 rows from a LIMIT 100</title><link>https://jacob.verhoeks.org/blog/2026-07-08-800-rows-from-a-limit-100/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-07-08-800-rows-from-a-limit-100/</guid><description>SSB at SF10 was the last benchmark where Trino beat us, and the gap was one serial scan feeding eight idle cores. Closing it took three fixes: parallelize the probe scan, assign byte-range splits instead of whole files, and stop trusting a flag that had never actually fired. Along the way the row counts started lying. Three TPC-DS queries returned exactly eight times their LIMIT, and the mechanism is a lesson in what parallelism does to a plan that was optimized while it was still serial.</description><pubDate>Wed, 08 Jul 2026 00:00:00 GMT</pubDate><category>performance</category><category>correctness</category><category>datafusion</category><category>benchmarks</category><author>Jacob Verhoeks</author></item><item><title>One dlt pipeline, three roads to Apache Polaris</title><link>https://jacob.verhoeks.org/blog/2026-07-13-dlt-three-roads-to-polaris/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-07-13-dlt-three-roads-to-polaris/</guid><description>A Python ingestion job should not have to choose between an open Iceberg catalog and a governed SQL engine forever. We connected dlt directly to Apache Polaris through Iceberg REST, then sent the same full, incremental, and SCD2 loads through SQE over Trino HTTP and Arrow Flight SQL. The result is one service-principal identity, one catalog, three front doors, and a test suite large enough to expose the bugs hiding at batch boundaries.</description><pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate><category>dlt</category><category>iceberg</category><category>polaris</category><category>trino</category><category>arrow-flight</category><author>Jacob Verhoeks</author></item><item><title>Autonomous compaction, without a service account</title><link>https://jacob.verhoeks.org/blog/2026-07-22-autonomous-compaction/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-07-22-autonomous-compaction/</guid><description>SQE&apos;s founding rule is no service account: every query runs as the authenticated user, tokens passed through to Polaris and S3. Background compaction has no user to be. Here is how we gave Iceberg tables a self-healing maintenance path while keeping that rule intact: a structurally isolated principal, deny-by-default grants, and a commit authority that never leaves the coordinator, even when the rewrite itself is distributed across the worker fleet.</description><pubDate>Wed, 22 Jul 2026 00:00:00 GMT</pubDate><category>iceberg</category><category>compaction</category><category>security</category><category>distributed-systems</category><author>Jacob Verhoeks</author></item><item><title>The mask that was never a mask</title><link>https://jacob.verhoeks.org/blog/2026-08-01-the-mask-that-was-never-a-mask/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-08-01-the-mask-that-was-never-a-mask/</guid><description>Access control was the last subsystem whose end-to-end behaviour we checked by grepping CLI output. The denial test matched the string &apos;not found&apos;, which is also what a typo&apos;d table name prints. We replaced that harness with twenty assertions on decoded Arrow values against a live Apache Ranger, and the exercise found a feature that had never once worked: every tag-based column mask had been restricting the column instead of masking it since the day we shipped it. Two of the new tests then passed for the wrong reason, and only mutation caught them. Here is what fine-grained access control in SQE actually does, and how we know.</description><pubDate>Sat, 01 Aug 2026 00:00:00 GMT</pubDate><category>security</category><category>ranger</category><category>iceberg</category><category>testing</category><author>Jacob Verhoeks</author></item><item><title>Two gates, and the one that answers first</title><link>https://jacob.verhoeks.org/blog/2026-08-06-two-gates-and-the-one-that-answers-first/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-08-06-two-gates-and-the-one-that-answers-first/</guid><description>Spark was connecting to our catalog as root, which meant every access-control policy we had written applied to exactly one engine. Fixing it took no engine code: Polaris already authorizes against the OIDC identity, so a per-user token was the whole change. Then we ran both enforcement tiers together for the first time and found they compose in an order nobody documents, with Spark&apos;s plugin answering before the catalog is asked. Along the way two of our own new tests passed for the wrong reason, the two engines turned out to disagree about which mask wins, and renaming a column silently removes its protection. Here is the full evaluation order, what we measured, and why Databricks and Snowflake do not have this class of problem.</description><pubDate>Thu, 06 Aug 2026 00:00:00 GMT</pubDate><category>security</category><category>ranger</category><category>spark</category><category>iceberg</category><category>governance</category><author>Jacob Verhoeks</author></item><item><title>One policy model, two engines: access control across SQE and Spark</title><link>https://jacob.verhoeks.org/blog/2026-08-10-one-policy-model-sqe-and-spark/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-08-10-one-policy-model-sqe-and-spark/</guid><description>A complete, executable account of how SQE and Spark query the same Iceberg table under the same Apache Ranger policies: Polaris object grants, row filters, column masks, tags, precedence, writes, views, and the differences that remain.</description><pubDate>Mon, 10 Aug 2026 00:00:00 GMT</pubDate><category>security</category><category>ranger</category><category>spark</category><category>polaris</category><category>iceberg</category><category>access-control</category><author>Jacob Verhoeks</author></item><item><title>Every ACL we can write, and which system enforces it</title><link>https://jacob.verhoeks.org/blog/2026-08-14-every-acl-we-can-write-and-who-enforces-it/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-08-14-every-acl-we-can-write-and-who-enforces-it/</guid><description>A working catalogue of the access control SQE and Spark share through Apache Ranger: object grants at the catalog, five column masks, row filters, tags that span tables, four personas built from the same primitives, and the two places the engines still render differently. Everything here is a line from a run that finished 43 of 43, on an EU bank fixture rather than a toy table. Includes the reason there are two enforcement points rather than one, and what changed when we moved every privilege write onto an authenticated endpoint.</description><pubDate>Fri, 14 Aug 2026 00:00:00 GMT</pubDate><category>security</category><category>ranger</category><category>polaris</category><category>spark</category><category>iceberg</category><category>access-control</category><author>Jacob Verhoeks</author></item><item><title>Local AI and the jungle of incomparable specs</title><link>https://jacob.verhoeks.org/blog/2026-08-17-local-ai-jungle-of-incomparable-specs/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-08-17-local-ai-jungle-of-incomparable-specs/</guid><description>AMD, Apple and NVIDIA all sell a 128 GB local-AI box. The TOPS numbers are not comparable. Bandwidth is. Netherlands prices, real decode speeds, what 70B at 512K actually costs in memory, and how Qwen3.8-27B changes the 4/8/16-bit trade-off.</description><pubDate>Mon, 17 Aug 2026 00:00:00 GMT</pubDate><category>ai</category><category>local-llm</category><category>hardware</category><category>nvidia</category><category>apple</category><category>amd</category><author>Jacob Verhoeks</author></item><item><title>Athena&apos;s DDL, your bucket, nobody&apos;s metastore</title><link>https://jacob.verhoeks.org/blog/2026-08-21-athenas-ddl-your-bucket-nobodys-metastore/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-08-21-athenas-ddl-your-bucket-nobodys-metastore/</guid><description>SQE now reads Hive-style external tables over CSV, line-delimited JSON, and partitioned Parquet on any S3-compatible store, using Athena&apos;s own CREATE EXTERNAL TABLE syntax. There is no Hive Metastore, no Glue API call, and no catalog service of any kind behind the table: the definition is a JSON manifest next to the data, shaped like a Glue TableInput. This post is what emulating Athena and Glue actually requires, which parts we copied deliberately, the four Athena behaviours we refused to copy, and the credential difference that is a real change from how SQE treats Iceberg.</description><pubDate>Fri, 21 Aug 2026 00:00:00 GMT</pubDate><category>hive</category><category>athena</category><category>glue</category><category>s3</category><category>external-tables</category><category>datafusion</category><author>Jacob Verhoeks</author></item><item><title>The partition list lives next to the data</title><link>https://jacob.verhoeks.org/blog/2026-08-23-the-partition-list-lives-next-to-the-data/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-08-23-the-partition-list-lives-next-to-the-data/</guid><description>Cycle 2 of SQE&apos;s Hive external tables replaces the per-query prefix LIST with a partition index persisted in the sidecar manifest, maintained by MSCK REPAIR TABLE and ALTER TABLE ADD/DROP PARTITION. Athena asks Glue for the partition list over an API. SQE reads one ETag-cached JSON object sitting beside the files. On a 449-partition slice of the public Bitcoin dataset a pinned query goes from 99 ms to 1.9 ms cold, and DuckDB on the same files stays at 44 ms because it re-globs every query. Partition projection is implemented too, and measurably slower than the index on the same pin.</description><pubDate>Sun, 23 Aug 2026 00:00:00 GMT</pubDate><category>hive</category><category>athena</category><category>glue</category><category>duckdb</category><category>partitions</category><category>benchmarks</category><author>Jacob Verhoeks</author></item><item><title>The MCP server that never holds a token</title><link>https://jacob.verhoeks.org/blog/2026-08-28-the-mcp-server-that-never-holds-a-token/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-08-28-the-mcp-server-that-never-holds-a-token/</guid><description>SQE now speaks Model Context Protocol over Streamable HTTP, and it does it as an OAuth resource server: no service account, no token minting, no credential proxy. The caller&apos;s bearer becomes an SQE session and travels to Polaris and S3 unchanged. Read tools are gated on one scope, the read-only SQL tool is enforced by SQE&apos;s own parser rather than a keyword regex, and the write tool needs three independent authorizations that do not substitute for one another. The runnable quickstart proves it with 14 checks against live Keycloak, Polaris and RustFS, including the one that matters most: a reader holding the OAuth write scope is still denied by the source.</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><category>mcp</category><category>oauth</category><category>security</category><category>identity</category><category>claude-code</category><category>codex</category><author>Jacob Verhoeks</author></item><item><title>MCP and OAuth with Okta: the browser is the only login</title><link>https://jacob.verhoeks.org/blog/2026-09-18-mcp-oauth-with-okta-the-browser-is-the-only-login/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-09-18-mcp-oauth-with-okta-the-browser-is-the-only-login/</guid><description>We pointed SQE&apos;s MCP endpoint at an Okta tenant and asked Claude Code to query a Glue Data Catalog as a real person. The result is the Atlassian-plugin experience for a lakehouse: no token to paste, no client secret, no service account. Okta issues the access token in the browser, SQE verifies it, and Apache Ranger decides which tables that person&apos;s groups may read. Three Okta settings decide whether it works at all, and two configuration slips look exactly like authorization failures without being one. This is what we set, what broke, and what the System Log told us.</description><pubDate>Fri, 18 Sep 2026 00:00:00 GMT</pubDate><category>mcp</category><category>oauth</category><category>okta</category><category>ranger</category><category>identity</category><category>claude-code</category><author>Jacob Verhoeks</author></item><item><title>A 421M classifier in front of the judge</title><link>https://jacob.verhoeks.org/blog/2026-09-25-a-classifier-in-front-of-the-judge/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/2026-09-25-a-classifier-in-front-of-the-judge/</guid><description>claudeinsights coaches me on my own Claude Code sessions by sending each rough one to a model. Every session used to cost a full claude -p call. Now a 421M-parameter encoder called Laya scores all of them locally first, and only the rough ones go to Opus 5.5 for quotes and advice. Go downloads and caches the checkpoint through go-huggingface, sharing Python&apos;s Hugging Face cache without a single extra byte, and its pure-Go tokenizer matches Hugging Face&apos;s Rust tokenizer id for id on Laya&apos;s vocabulary, except for one lstrip flag. The model itself still runs in PyTorch, and skipping one random-weight initialisation took its load from 46 seconds to 4.</description><pubDate>Fri, 25 Sep 2026 00:00:00 GMT</pubDate><category>ai</category><category>go</category><category>claude-code</category><category>local-llm</category><category>developer-experience</category><author>Jacob Verhoeks</author></item><item><title>AWS Community Builder</title><link>https://jacob.verhoeks.org/blog/aws-community-builder/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/aws-community-builder/</guid><description>Part of the AWS Community Builders Program</description><pubDate>Sun, 06 Mar 2022 00:00:00 GMT</pubDate><category>aws</category><category>eventbridge</category><category>lambda</category><category>serverless</category><author>Jacob Verhoeks</author></item><item><title>AWS Glue vulnerabilities in default packages</title><link>https://jacob.verhoeks.org/blog/aws-glue-vulnerabilities-in-default-packages-4cdk/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/aws-glue-vulnerabilities-in-default-packages-4cdk/</guid><description>Securing AWS Glue: A Guide to Identifying and Fixing Python Package Vulnerabilities        ...</description><pubDate>Mon, 06 Jan 2025 11:08:05 GMT</pubDate><category>glue</category><category>aws</category><category>vulnerabilities</category></item><item><title>AWS Tools / Resources Part 1</title><link>https://jacob.verhoeks.org/blog/aws-links-1/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/aws-links-1/</guid><description>Make your Jupyter Notebook/IPython full width</description><pubDate>Tue, 15 Feb 2022 00:00:00 GMT</pubDate><category>aws</category><category>eventbridge</category><category>serverless</category><author>Jacob Verhoeks</author></item><item><title>AWS Links 2 Eventbridge</title><link>https://jacob.verhoeks.org/blog/aws-links-2-copy/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/aws-links-2-copy/</guid><description>AWS Links 2 Eventbridge</description><pubDate>Fri, 04 Mar 2022 00:00:00 GMT</pubDate><category>aws</category><category>eventbridge</category><category>lambda</category><category>serverless</category><author>Jacob Verhoeks</author></item><item><title>Learning with AWS Workshops</title><link>https://jacob.verhoeks.org/blog/aws-workshops/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/aws-workshops/</guid><description>Overview AWS Workshops</description><pubDate>Thu, 03 Feb 2022 00:00:00 GMT</pubDate><category>aws</category><category>learning</category><category>workshops</category><author>Jacob Verhoeks</author></item><item><title>AWSUG.nl talk about EventBridge</title><link>https://jacob.verhoeks.org/blog/awsug-eventbridge-talk/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/awsug-eventbridge-talk/</guid><description>AWSUG.nl talk about EventBridge with the overview of the released features</description><pubDate>Tue, 24 May 2022 00:00:00 GMT</pubDate><category>aws</category><category>eventbridge</category><category>talk</category><author>Jacob Verhoeks</author></item><item><title>AWSUG.nl talk about Step Functions</title><link>https://jacob.verhoeks.org/blog/awsug-step-functions-talk/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/awsug-step-functions-talk/</guid><description>AWSUG.nl Communityday talk about Step Functions with the overview of the released features</description><pubDate>Mon, 03 Oct 2022 00:00:00 GMT</pubDate><category>aws</category><category>eventbridge</category><category>step-functions</category><category>talk</category><author>Jacob Verhoeks</author></item><item><title>Redesigning This Blog (While Writing About It)</title><link>https://jacob.verhoeks.org/blog/blog-redesign-2026/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/blog-redesign-2026/</guid><description>A meta-journey through redesigning a blog&apos;s layout - avoiding AI design clichés and building something with actual character</description><pubDate>Mon, 12 Jan 2026 00:00:00 GMT</pubDate><category>design</category><category>web-development</category><category>astro</category><category>meta</category><author>Jacob Verhoeks</author></item><item><title>Bridging Clouds: A Guide to Connecting AWS Glue Tables with Snowflake</title><link>https://jacob.verhoeks.org/blog/bridging-clouds-a-comprehensive-guide-to-connecting-aws-glue-tables-with-snowflake-43n2/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/bridging-clouds-a-comprehensive-guide-to-connecting-aws-glue-tables-with-snowflake-43n2/</guid><description>In today&apos;s data-driven world, organizations often find themselves working with multiple cloud...</description><pubDate>Wed, 25 Sep 2024 19:43:52 GMT</pubDate><category>snowflake</category><category>aws</category><category>iceberg</category></item><item><title>CDK Day 2022</title><link>https://jacob.verhoeks.org/blog/cdk-day/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/cdk-day/</guid><description>CDK Day 26 May 2022</description><pubDate>Sun, 27 Feb 2022 00:00:00 GMT</pubDate><category>aws</category><category>cdk</category><author>Jacob Verhoeks</author></item><item><title>Collibra Protect , Snowflake and Iceberg tables</title><link>https://jacob.verhoeks.org/blog/collibra-protect-snowflake-and-iceberg-tables-56a6/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/collibra-protect-snowflake-and-iceberg-tables-56a6/</guid><description>Iceberg is gaining traction, and Collibra is expanding its presence as a data governance tool,...</description><pubDate>Fri, 24 Jan 2025 10:34:11 GMT</pubDate><category>collibra</category><category>snowflake</category><category>iceberg</category><category>aws</category></item><item><title>Data Engineering and ChatGPT (Part2)</title><link>https://jacob.verhoeks.org/blog/data-engineering-and-chatgpt-part2-811/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/data-engineering-and-chatgpt-part2-811/</guid><description>In my previous post i must have hit some issue with ChatGPT. It&apos;s way more impressive then i...</description><pubDate>Tue, 06 Dec 2022 20:43:23 GMT</pubDate><category>webdev</category><category>career</category><category>community</category></item><item><title>Data Engineering and ChatGPT</title><link>https://jacob.verhoeks.org/blog/data-engineering-and-chatops-3h6a/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/data-engineering-and-chatops-3h6a/</guid><description>ChatGPT is out and everybody is trying it.  Blogs, songs are easy, but can it help with Data...</description><pubDate>Tue, 06 Dec 2022 14:02:57 GMT</pubDate><category>aws</category><category>datascience</category><category>chatgpt</category></item><item><title>Docker on Mac with Colima</title><link>https://jacob.verhoeks.org/blog/docker-with-colima/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/docker-with-colima/</guid><description>Use the free alternative Colima to run docker on mac</description><pubDate>Mon, 28 Mar 2022 00:00:00 GMT</pubDate><category>docker</category><category>mac</category><author>Jacob Verhoeks</author></item><item><title>Duckberg!</title><link>https://jacob.verhoeks.org/blog/duckberg-5dlp/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/duckberg-5dlp/</guid><description>I wrote a previous small blog about PyIceberg and Glue iceberg Rest Api  This week is saw the...</description><pubDate>Wed, 12 Mar 2025 17:25:47 GMT</pubDate><category>iceberg</category><category>duckdb</category><category>awsglue</category></item><item><title>DUCKDB, S3 Tables with iceberg using Iceberg Rest API</title><link>https://jacob.verhoeks.org/blog/duckdb-s3-tables-with-iceberg-using-iceberg-rest-api-1c1/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/duckdb-s3-tables-with-iceberg-using-iceberg-rest-api-1c1/</guid><description>I wrote my previous article about Duckberg, a combination of PyIceberg with Duckdb to access iceberg...</description><pubDate>Sat, 15 Mar 2025 16:02:47 GMT</pubDate><category>duckdb</category><category>s3tables</category><category>iceberg</category></item><item><title>Efficient Agentic AI Development Guide (begin 2026)</title><link>https://jacob.verhoeks.org/blog/efficient-agentic-ai-development-guide-begin-2026-2k4c/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/efficient-agentic-ai-development-guide-begin-2026-2k4c/</guid><description>A practical guide for working effectively with AI coding agents, especially Claude Code as of begin...</description><pubDate>Mon, 02 Feb 2026 16:32:41 GMT</pubDate><category>ai</category><category>claude</category></item><item><title>Python and modules for ETL jobs on AWS</title><link>https://jacob.verhoeks.org/blog/etl-in-python/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/etl-in-python/</guid><description>Python and modules for ETL jobs on AWS</description><pubDate>Sun, 23 Oct 2022 00:00:00 GMT</pubDate><category>aws</category><category>etl</category><category>glue</category><category>python</category><author>Jacob Verhoeks</author></item><item><title>From Dark Flow to Real Momentum: Why Claude Opus 4.6 Feels Like an Extension of Me</title><link>https://jacob.verhoeks.org/blog/from-dark-flow-to-real-momentum-why-claude-opus-46-feels-like-an-extension-of-me-23ao/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/from-dark-flow-to-real-momentum-why-claude-opus-46-feels-like-an-extension-of-me-23ao/</guid><description>The recent article from fast.ai, titled &quot;Breaking the Spell of Vibe Coding&quot; by Rachel Thomas...</description><pubDate>Mon, 16 Feb 2026 09:03:09 GMT</pubDate><category>claude</category><category>ai</category></item><item><title>From Extension to Orchestration: Who Wins (and Who Gets Left Behind) in the Claude 4.6 Era</title><link>https://jacob.verhoeks.org/blog/from-extension-to-orchestration-who-wins-and-who-gets-left-behind-in-the-claude-46-era-4h7j/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/from-extension-to-orchestration-who-wins-and-who-gets-left-behind-in-the-claude-46-era-4h7j/</guid><description>I published this morning &quot;From Dark Flow to Real Momentum: Why Claude Opus 4.6 Feels Like an...</description><pubDate>Mon, 16 Feb 2026 14:51:28 GMT</pubDate><category>claude</category><category>ai</category></item><item><title>Glue Iceberg Rest Api and PyIceberg</title><link>https://jacob.verhoeks.org/blog/glue-iceberg-rest-api-and-pyiceberg-364g/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/glue-iceberg-rest-api-and-pyiceberg-364g/</guid><description>Access Glue Iceberg tables via the Iceberg Rest Api   AWS Released silently Iceberg REST-API...</description><pubDate>Sun, 22 Dec 2024 14:28:14 GMT</pubDate><category>aws</category><category>glue</category><category>iceberg</category></item><item><title>Glue SBOM inspector</title><link>https://jacob.verhoeks.org/blog/glue-inspector/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/glue-inspector/</guid><description>Glue SBOM exporter and inspector</description><pubDate>Sun, 05 Jan 2025 00:00:00 GMT</pubDate><category>aws</category><category>data-engineering</category><category>glue</category><author>Jacob Verhoeks</author></item><item><title>AWS Glue with custom Python libraries</title><link>https://jacob.verhoeks.org/blog/glue-python-pip/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/glue-python-pip/</guid><description>Using external python modules in AWS Glue</description><pubDate>Mon, 31 Jan 2022 00:00:00 GMT</pubDate><category>aws</category><category>glue</category><category>python</category><author>Jacob Verhoeks</author></item><item><title>Glue SBOM exporter and vulnerabilities</title><link>https://jacob.verhoeks.org/blog/glue-sbom-vulnerabilities/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/glue-sbom-vulnerabilities/</guid><description>Glue SBOM exporter and vulnerabilities</description><pubDate>Wed, 27 Dec 2023 00:00:00 GMT</pubDate><category>aws</category><category>data-engineering</category><category>glue</category><author>Jacob Verhoeks</author></item><item><title>I Stopped Maintaining Terraform Examples and Tests Separately. Here&apos;s Why.</title><link>https://jacob.verhoeks.org/blog/i-stopped-maintaining-terraform-examples-and-tests-separately-heres-why-2lpj/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/i-stopped-maintaining-terraform-examples-and-tests-separately-heres-why-2lpj/</guid><description>TL;DR: Every time you update a Terraform example, you should also update its corresponding test. Stop...</description><pubDate>Tue, 20 Jan 2026 07:45:46 GMT</pubDate><category>terraform</category><category>aws</category><category>testing</category></item><item><title>Glue Iceberg Rest Api and PyIceberg</title><link>https://jacob.verhoeks.org/blog/iceberg-catalog-glue/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/iceberg-catalog-glue/</guid><description>Using the glue iceberg rest api with pyiceberg</description><pubDate>Sun, 22 Dec 2024 00:00:00 GMT</pubDate><category>aws</category><category>data-engineering</category><author>Jacob Verhoeks</author></item><item><title>Unity Iceberg Rest Api and PyIceberg</title><link>https://jacob.verhoeks.org/blog/iceberg-catalog-unity/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/iceberg-catalog-unity/</guid><description>Using the Unity iceberg rest api with pyiceberg</description><pubDate>Sun, 29 Dec 2024 00:00:00 GMT</pubDate><category>aws</category><category>data-engineering</category><author>Jacob Verhoeks</author></item><item><title>Make your Jupyter Notebook/IPython full width</title><link>https://jacob.verhoeks.org/blog/jupyter-notebook-width/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/jupyter-notebook-width/</guid><description>Make your Jupyter Notebook/IPython full width</description><pubDate>Mon, 14 Feb 2022 00:00:00 GMT</pubDate><category>jupyter</category><category>learning</category><category>python</category><author>Jacob Verhoeks</author></item><item><title>Maker&apos;s Schedule, Manager&apos;s Schedule</title><link>https://jacob.verhoeks.org/blog/makers-schedule-managers-schedule/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/makers-schedule-managers-schedule/</guid><description>Maker&apos;s Schedule, Manager&apos;s Schedule and why they don&apos;t combine.</description><pubDate>Wed, 02 Feb 2022 00:00:00 GMT</pubDate><category>management</category><author>Jacob Verhoeks</author></item><item><title>New EC2 Models re:invent 2022</title><link>https://jacob.verhoeks.org/blog/new-ec2-models-reinvent-2022-2a5g/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/new-ec2-models-reinvent-2022-2a5g/</guid><description>AWS Released 5 new EC2 models in Re:invent 2022. Hereby an...</description><pubDate>Mon, 05 Dec 2022 08:38:36 GMT</pubDate><category>ec2</category><category>aws</category></item><item><title>An ON-AIR sign with IoT</title><link>https://jacob.verhoeks.org/blog/on-air/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/on-air/</guid><description>Building an sign with iot to show when you are in a meeting&quot;</description><pubDate>Sat, 29 Jan 2022 00:00:00 GMT</pubDate><category>arduino</category><category>esp</category><category>esp32</category><category>iot</category><category>mqtt</category><author>Jacob Verhoeks</author></item><item><title>OpenClaw: The Open-Source Agent That Feels Too Alive</title><link>https://jacob.verhoeks.org/blog/openclaw-the-open-source-agent-that-feels-too-alive-52bm/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/openclaw-the-open-source-agent-that-feels-too-alive-52bm/</guid><description>It hits like the moment teenagers first logged onto BBS boards or IRC channels in the late &apos;80s and...</description><pubDate>Sun, 01 Feb 2026 11:46:49 GMT</pubDate><category>openclaw</category><category>agents</category></item><item><title>Overview of the features released for Step Functions</title><link>https://jacob.verhoeks.org/blog/overview-of-the-features-releases-for-step-functions-382i/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/overview-of-the-features-releases-for-step-functions-382i/</guid><description>At the Dutch AWS Community Day 2022, i held the following talk. An overview of all the features...</description><pubDate>Tue, 04 Oct 2022 12:49:52 GMT</pubDate><category>aws</category><category>stepfunctions</category><category>serverless</category><category>cloud</category></item><item><title>Purge a glue table from cli</title><link>https://jacob.verhoeks.org/blog/purge-a-glue-table-from-cli-3jhd/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/purge-a-glue-table-from-cli-3jhd/</guid><description>Sometimes you want to purge a glue table from s3 and delete all files and versions. Lately i had to...</description><pubDate>Tue, 31 Oct 2023 21:00:44 GMT</pubDate><category>aws</category><category>glue</category><category>dataops</category></item><item><title>Re:invent 2022 Releases sorted</title><link>https://jacob.verhoeks.org/blog/reinvent-2022-releases/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/reinvent-2022-releases/</guid><description>Re:invent 2022 Releases sorted</description><pubDate>Mon, 05 Dec 2022 00:00:00 GMT</pubDate><category>aws</category><category>data-engineering</category><author>Jacob Verhoeks</author></item><item><title>Re:invent 2022 Releases sorted</title><link>https://jacob.verhoeks.org/blog/reinvent-2022-releases-sorted-539c/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/reinvent-2022-releases-sorted-539c/</guid><description>An overview of all the releases sorted per group. This re:invent was very focused on Data &amp;amp;...</description><pubDate>Mon, 05 Dec 2022 09:15:34 GMT</pubDate><category>aws</category><category>community-builder</category><category>reinvent</category></item><item><title>Re:invent 2023 News</title><link>https://jacob.verhoeks.org/blog/reinvent23-news/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/reinvent23-news/</guid><description>reinvent 23 news</description><pubDate>Mon, 04 Dec 2023 00:00:00 GMT</pubDate><category>aws</category><category>data-engineering</category><category>reinvent</category><author>Jacob Verhoeks</author></item><item><title>The Database Evolution: Breaking Free from Monolithic Thinking</title><link>https://jacob.verhoeks.org/blog/reinvent24-database-evolution/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/reinvent24-database-evolution/</guid><description>A technical analysis of AWS&apos;s latest database innovations, from Aurora&apos;s Graviton4 support to OpenSearch Serverless improvements. Learn how these changes are reshaping data architecture patterns and enabling more efficient, distributed database systems with real-world implementation strategies.</description><pubDate>Wed, 18 Dec 2024 00:00:00 GMT</pubDate><category>aws</category><category>databases</category><category>architecture</category><category>data-engineering</category><author>Cloud Architect&apos;s Perspective</author></item><item><title>The Silent Revolution in Disaster Recovery: How AWS is Changing the Game</title><link>https://jacob.verhoeks.org/blog/reinvent24-dr-evolution/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/reinvent24-dr-evolution/</guid><description>Explore how AWS&apos;s new zonal shift capabilities and Security Incident Response features are transforming traditional disaster recovery. This technical deep-dive reveals how automatic failover, self-healing systems, and integrated security responses are making DR more reliable and cost-effective than ever before.</description><pubDate>Wed, 18 Dec 2024 00:00:00 GMT</pubDate><category>aws</category><category>disaster-recovery</category><category>security</category><category>cloud-architecture</category><author>Cloud Architect&apos;s Perspective</author></item><item><title>The Human Touch in Digital Transformation: Beyond Just Technology</title><link>https://jacob.verhoeks.org/blog/reinvent24-human-touch/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/reinvent24-human-touch/</guid><description>An architect&apos;s perspective on AWS&apos;s latest customer experience innovations, including Amazon Connect&apos;s AI capabilities and Polly&apos;s new synthetic voices. Discover how these technologies are making digital interactions more natural while improving efficiency and customer satisfaction.</description><pubDate>Wed, 18 Dec 2024 00:00:00 GMT</pubDate><category>aws</category><category>customer-experience</category><category>ai</category><category>digital-transformation</category><author>Cloud Architect&apos;s Perspective</author></item><item><title>Infrastructure Efficiency: The Hidden Environmental Impact of AWS&apos;s Latest Announcements</title><link>https://jacob.verhoeks.org/blog/reinvent24-infrastructure-efficiency/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/reinvent24-infrastructure-efficiency/</guid><description>Discover how AWS&apos;s latest infrastructure updates, particularly the expansion of Graviton4 processors and R8g instances, are quietly revolutionizing cloud computing sustainability. Learn about real-world performance improvements, cost reductions, and environmental benefits of these strategic changes.</description><pubDate>Wed, 18 Dec 2024 00:00:00 GMT</pubDate><category>aws</category><category>infrastructure</category><category>sustainability</category><category>cloud-computing</category><author>Cloud Architect&apos;s Perspective</author></item><item><title>Re:invent 2024 News</title><link>https://jacob.verhoeks.org/blog/reinvent24-news/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/reinvent24-news/</guid><description>reinvent 24 news</description><pubDate>Mon, 23 Dec 2024 00:00:00 GMT</pubDate><category>aws</category><category>data-engineering</category><category>reinvent</category><author>Jacob Verhoeks</author></item><item><title>AWS Sagemaker Canvas Remove</title><link>https://jacob.verhoeks.org/blog/sagemaker-canvas-remove/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/sagemaker-canvas-remove/</guid><description>How to remove AWS Sagemaker Canvas</description><pubDate>Mon, 04 Apr 2022 00:00:00 GMT</pubDate><category>aws</category><category>glue</category><category>python</category><author>Jacob Verhoeks</author></item><item><title>Secrets and AWS GLUE Custom Connectors</title><link>https://jacob.verhoeks.org/blog/secrets-and-aws-glue-custom-connectors-4je3/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/secrets-and-aws-glue-custom-connectors-4je3/</guid><description>For a project i had to retrieve data from Teradata using a Glue Job. A quick google gave me this:...</description><pubDate>Sun, 11 Sep 2022 12:10:01 GMT</pubDate><category>aws</category><category>glue</category><category>terraform</category></item><item><title>Setting Up IOMete: A Cloud-Independent Data Platform Based on Spark</title><link>https://jacob.verhoeks.org/blog/setting-up-iomete-a-cloud-independent-data-platform-based-on-spark-4b23/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/setting-up-iomete-a-cloud-independent-data-platform-based-on-spark-4b23/</guid><description>IOMete is a powerful, cloud-independent data platform built on Apache Spark, designed to enable...</description><pubDate>Tue, 10 Jun 2025 14:38:25 GMT</pubDate><category>iomete</category><category>spark</category><category>kubernetes</category></item><item><title>Sustainability on AWS</title><link>https://jacob.verhoeks.org/blog/sustainability-on-aws-3mml/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/sustainability-on-aws-3mml/</guid><description>Sustainability is the new topic on AWS. While it has a lot in common with FinOps, it adds emphasis to...</description><pubDate>Mon, 11 Dec 2023 21:20:10 GMT</pubDate><category>aws</category><category>finops</category><category>community-builder</category><category>sustainability</category></item><item><title>The AI Development Workflow: A Complete System for Working with AI Agents</title><link>https://jacob.verhoeks.org/blog/the-ai-development-workflow-a-complete-system-for-working-with-ai-agents-1ifh/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/the-ai-development-workflow-a-complete-system-for-working-with-ai-agents-1ifh/</guid><description>A continuous cycle of ideation, planning, execution, and refinement — all driven by issues, feedback...</description><pubDate>Fri, 27 Feb 2026 16:42:15 GMT</pubDate><category>ai</category><category>claudecode</category></item><item><title>The Art of Agents: Sun Tzu&apos;s Principles for Building Agentic AI Systems</title><link>https://jacob.verhoeks.org/blog/the-art-of-agents-sun-tzus-principles-for-building-agentic-ai-systems-4i2f/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/the-art-of-agents-sun-tzus-principles-for-building-agentic-ai-systems-4i2f/</guid><description>By Jacob Verhoeks, March 2026  The cost of building software has collapsed. Claude Code ships...</description><pubDate>Mon, 30 Mar 2026 14:42:59 GMT</pubDate><category>ai</category><category>history</category></item><item><title>The Hidden Dangers in Our Software Supply Chain: Why It&apos;s Bigger Than You Think</title><link>https://jacob.verhoeks.org/blog/the-hidden-dangers-in-our-software-supply-chain-why-its-bigger-than-you-think-4n8d/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/the-hidden-dangers-in-our-software-supply-chain-why-its-bigger-than-you-think-4n8d/</guid><description>In today&apos;s fast-paced digital world, software powers everything from the apps on our phones to the...</description><pubDate>Mon, 29 Sep 2025 12:31:02 GMT</pubDate><category>security</category><category>supply-chain</category><category>npm</category><category>pypi</category></item><item><title>The Psychology of AI-Assisted Programming</title><link>https://jacob.verhoeks.org/blog/the-psychology-of-ai-assisted-programming-2kmh/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/the-psychology-of-ai-assisted-programming-2kmh/</guid><description>Acceleration, its psychological costs, and the changed dynamics of building software. July...</description><pubDate>Thu, 30 Jul 2026 18:30:54 GMT</pubDate><category>ai</category><category>productivity</category><category>programming</category><category>software</category></item><item><title>The Review Bottleneck: Rethinking Software and Infrastructure Design for the Agent Era</title><link>https://jacob.verhoeks.org/blog/the-review-bottleneck-rethinking-software-and-infrastructure-design-for-the-agent-era-752/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/the-review-bottleneck-rethinking-software-and-infrastructure-design-for-the-agent-era-752/</guid><description>AI coding agents made code generation cheap. They did not make software delivery cheap. Teams...</description><pubDate>Wed, 10 Jun 2026 08:22:58 GMT</pubDate><category>softwaredevelopment</category><category>agents</category></item><item><title>Unity Catalog Iceberg Rest Api and PyIceberg</title><link>https://jacob.verhoeks.org/blog/unity-catalog-iceberg-rest-api-and-pyiceberg-2jno/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/unity-catalog-iceberg-rest-api-and-pyiceberg-2jno/</guid><description>Access Unity tables via the Iceberg Rest Api   After working with glue catalog in the...</description><pubDate>Sun, 29 Dec 2024 17:19:20 GMT</pubDate><category>aws</category><category>iceberg</category><category>unity-catalog</category><category>databricks</category></item><item><title>Votes and Views Part 1</title><link>https://jacob.verhoeks.org/blog/votes-and-views-1/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/votes-and-views-1/</guid><description>Votes and Views Part 1</description><pubDate>Fri, 25 Feb 2022 00:00:00 GMT</pubDate><category>aws</category><category>frontend</category><category>javascript</category><category>rest</category><author>Jacob Verhoeks</author></item><item><title>Autocomplete IAM in vscode</title><link>https://jacob.verhoeks.org/blog/vscode-iam-autocompletion/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/vscode-iam-autocompletion/</guid><description>Autocomplete IAM in vscode</description><pubDate>Tue, 01 Feb 2022 00:00:00 GMT</pubDate><category>aws</category><category>iam</category><category>serverless</category><category>terraform</category><category>vscode</category><author>Jacob Verhoeks</author></item><item><title>Why Debian packages are safer then NPM and PyPi</title><link>https://jacob.verhoeks.org/blog/why-debian-packages-are-saver-then-npm-and-pypi-4j21/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/why-debian-packages-are-saver-then-npm-and-pypi-4j21/</guid><description>In the world of software development, package repositories are critical for distributing libraries...</description><pubDate>Fri, 19 Sep 2025 09:36:46 GMT</pubDate><category>npm</category><category>debian</category><category>pypi</category><category>worm</category></item><item><title>Your Terraform Examples Are Broken (And You Don&apos;t Know It Yet)</title><link>https://jacob.verhoeks.org/blog/your-terraform-examples-are-broken-and-you-dont-know-it-yet-4ine/</link><guid isPermaLink="true">https://jacob.verhoeks.org/blog/your-terraform-examples-are-broken-and-you-dont-know-it-yet-4ine/</guid><description>TL;DR: Stop maintaining separate examples and tests. Test your examples directly. One source of...</description><pubDate>Tue, 20 Jan 2026 07:34:22 GMT</pubDate><category>terraform</category><category>aws</category><category>testing</category></item></channel></rss>