Notes from the workshop.
Writing on AI, data engineering and the infrastructure underneath it — from the founder building Certant. Practical, occasionally opinionated, always from the trenches.

Scaling Internal Knowledge Bases for Mid-Sized Firms
Scaling internal knowledge bases for mid-sized firms requires structure, not just software. Learn best practices, productivity gains, and software.
Read the post →
Running the whole RAG stack on a MacBook, one Colima VM per worktree
What really runs locally on Apple Silicon: a VM per git worktree, a pgvector SIGILL that never showed on OrbStack, and a PaddleOCR segfault we never fixed.
Read the post →
Missing tables, not the extraction model, explain the accuracy gap
Two knowledge bases, same corpus, different extraction models, the same 41.8% and zero disagreements. The failing questions all had their answers in tables.
Read the post →
A 0.6B model was starving on the CPU: moving citation highlighting to the GPU
Citation highlighting ate 50 s of a 71 s query on our DGX Spark. The encoder was tiny; the CPU was full. Moving it to the idle GPU: 3.6 s to 0.08 s per chunk.
Read the post →The Gemma-4 experiment: one model for chat, OCR and reranking
One Gemma-4 model runs chat, extraction and reranking on a DGX Spark. OCR stays a dedicated model: consolidated OCR runs 40x slower per page.
Read the post →
155 pages of OCR took 37 minutes. The bottleneck was one threading.Lock.
A lock around a single GPU model made OCR serial. Moving GLM-OCR to SGLang took a 155-page PDF to under five minutes. The RunPod and client-side details.
Read the post →
Four employees below their legal minimum: the Aruma scenario end to end
A screenshot-led walk through the Aruma pay-compliance run: bind a knowledgebase, ask in plain English, approve one correction, get four names back.
Read the post →
Five OCR engines and one enterprise agreement: what actually read the rate tables
MinerU, Docling, PaddleOCR, GLM-OCR and Baidu Unlimited-OCR on the same wage schedules. Rowspans, a silent under-extraction bug, and what we run now.
Read the post →Why Qwen3.6 with thinking off became our DGX Spark default
Swapping gpt-oss-120B for Qwen3.6-35B gave back 25 GiB on the GB10, and one per-call reasoning flag took a merge summary from 189 s to 4 s.
Read the post →
An agent with write access to your ontology
Our AI FDE can edit a live data model. The gate around it: a short-lived key scoped to you, three server-enforced tiers, and a signed exposure register.
Read the post →
Page 146: the number nobody was going to find
Two people paid below a legal minimum buried in a 147-page agreement, found and proved from the page, then fixed with a human signature.
Read the post →
The standard stack: gpt-oss-120B and a full RAG pipeline on one box
Four models in 121 GiB of unified memory, 1 to 7 GiB free, and the boot loop that took a 64 GB swapfile to fix. The DGX Spark reference build, warts included.
Read the post →
An engineer in a drawer: 274 seconds to a working ontology
Palantir sends a forward deployed engineer. We ship one in a drawer: 21 July 2026, it built a working ontology for 1.5 credits, failed three of five tasks.
Read the post →Building a data model from PDFs instead of designing one
Certant Strata turns the tables inside a PDF corpus into a versioned data model. How the pipeline works, and the four ways it broke at corpus scale.
Read the post →
Most people tuning local LLMs optimise the wrong half of the problem
A full 50-document ingest pinned the GPU at 96% for 38 minutes, on prefill, not decode, while the celebrated decode levers barely moved throughput.
Read the post →
\"128GB of VRAM\" is the most misread spec on the DGX Spark
The DGX Spark's 128GB is one pool shared by CPU and GPU, not VRAM: the memory budget, the OOM spike, and what to set.
Read the post →
What air-gapped actually means: every phone-home in the stack, audited
Ten outbound-call vectors in our own stack, the two that needed code, and the tcpdump proof that a locked-down box still answers.
Read the post →
Seven levers that took a DGX Spark from won't boot to 2,800 tokens a second
Seven config changes took my DGX Spark from OOM-killing itself on boot to 2,800 tokens a second, measured before and after.
Read the post →
Which LLM should you run on a DGX Spark? gpt-oss-120B vs Qwen3.6-35B vs Gemma-4 26B
Three model stacks, one DGX Spark, a month of benchmarks: why Qwen3.6-35B with thinking off beats Gemma-4 26B and gpt-oss-120B on this box.
Read the post →
Asking for JSON halved our extraction recall. JSON Lines fixed it.
A graph-extraction regression traced to output shape: a closed JSON object tells the model to stop early. Removing the enclosing array recovered 2.7x.
Read the post →
Stop chat-testing your DGX Spark
A single chat window is the one benchmark the DGX Spark is built to lose. The two hardware numbers behind that, and the 22-43x you get back from batching.
Read the post →
Getting vLLM v0.9.2 working on CUDA 12.4 on QNAP (Driver 550.76)
Getting vLLM v0.9.2 running on CUDA 12.4 with an older QNAP NAS and Nvidia driver 550.76 using a custom Docker build.
Read the post →
Moving from Ollama to vLLM: Finding Stability for High-Throughput LLM Serving
An engineer's journey from using Ollama to vLLM for running large language models locally, exploring the trade-offs between convenience and production-grade stability for high-throughput inference.
Read the post →
Overdue update: The launch of MindLattice
An overview of MindLattice, a platform addressing data engineering challenges in AI transformation and serving underserved industries.
Read the post →
GraphRAG Is the Logical Step From Rag — So Why the Sudden Hype?
GraphRAG builds on RAG by using graph structures to organize data relationships, providing LLMs with richer context while avoiding hallucinations.
Read the post →
Revolutionising Machine Learning: Achieving Top 4% in Kaggle with AutoGluon in Just 7 Lines of Code
Discover how AutoML and AutoGluon can achieve competitive Kaggle rankings with just seven lines of Python code, automating feature engineering and model selection.
Read the post →
Data Engineering: Fast Spatial Joins Across ~2 Billion Rows on a Single Old GPU
Explore GPU-accelerated spatial joins processing 2.3 billion rows on a consumer GTX 1060, comparing Parquet vs ORC performance for large-scale geospatial data.
Read the post →
GPU Data Engineering, CSV to Parquet & ORC using Dask & RAPIDS.ai
Converting large CSV files to Parquet and ORC formats using Dask and RAPIDS.ai on consumer GPU hardware, with performance benchmarks and optimization strategies.
Read the post →
What is dMRV and how does it relate to Carbon Accounting?
How digital measurement, reporting and verification (dMRV) is transforming carbon accounting through automation, blockchain tokenization, and accessible audit tools.
Read the post →
TYMLEZ Releases 2 Open-Source Guardian Policies in time for COP27
TYMLEZ releases two open-source Guardian policies for carbon emissions tracking and reduction on the Hedera network, enabling dMRV implementations ahead of COP27.
Read the post →
TYMLEZ releases AWS & GCP Terraform setup for the Hedera Guardian
TYMLEZ releases infrastructure-as-code for deploying Hedera Guardian on AWS and GCP using Terraform, with autoscaling and production-ready Kubernetes setup.
Read the post →These posts first appeared on Dan's Medium. They're republished here in full, with the originals credited as canonical.
