Blog
Writing on AI, machine learning, software engineering, and the engineering behind real-world ML systems.
202614 posts
Ask, or It Will Guess: Question-Asking Is the Core Skill of Agentic Work
Models almost never ask you what you meant: across ambiguous questions, answer rates run above 95% and clarification barely registers. Repairing that in conversation makes it worse: underspecified multi-turn runs measure a 39% average performance drop, driven by a 112% jump in unreliability, and the effect shows up from two turns onward. The leverage is no longer in writing better prompts. It is in forcing the questions out before the first answer attempt, and in asking the questions afterward that prove you understood what you shipped.
NoteMake Your CI Actually Launch Your Linux Desktop App
A Flatpak build that passed every structural check and still died one line into launch. Why green CI proved nothing about the GUI, and how to install the real artifact and start it under Xvfb instead.
I gave my website tools for AI agents with WebMCP, and thought hard about the attack surface
WebMCP lets a web page hand callable tools to browser AI agents instead of making them scrape the DOM. I wired three read-only tools into this site. The interesting part was not the API. It was deciding what an agent, or a prompt injection riding one, is allowed to do.
The Bottleneck Moved to Review: My SDLC After AI Writes Most of the Code
When a machine writes most of your diff, the constraint stops being how fast you type and becomes how well you review. Here is the SDLC I actually run (the provenance audit, the sandbox, the CI backstops, and the three questions I ask every AI-authored change) plus the parts of review that don't compress and never will.
Plan Once, Then Act: When the ReAct Loop Is the Wrong Harness for Small Local Models
On small local models, the standard ReAct loop has a failure mode nobody warns you about: the model calls one tool, declares victory, and stops. What we measured across 12 GGUF models in EdgeVox, why we added a plan-once dispatcher, and how to decide which loop your task actually needs.
Building EdgeVox: Chaining STT → Local LLM → TTS Without Touching the Cloud
A first-hand build narrative of EdgeVox, a fully offline voice agent that chains speech-to-text, a local LLM, and text-to-speech on one device. The architecture in plain language, ROS2 integration, the latency budget, and the failure modes nobody warns you about.
I put an AI version of myself online, then tried to break it
Building a represent-me chatbot is a weekend project. Treating it like a production security surface is the part nobody writes about. Here is the architecture, the prompt leak I found by attacking my own bot, and the reusable suite that keeps it honest.
Vietnam's Sovereign AI Conversation Is Stuck One Layer Too High 🇻🇳
Vietnam already has the chips, three meaningful Vietnamese model attempts in flight, and the most binding AI law in Southeast Asia. The conversation about sovereign AI keeps demanding a 70B foundation model. The actual gap is one layer down: open evaluation, license-clean data, compliance-aware specialized models, and on-device runtimes that operationalize Law 134/2025 from March 2026.
AI Is Making Us Faster Learners and Worse Thinkers at the Same Time
A 2025 RCT found students who studied with ChatGPT scored 11 points lower on a retention test six weeks later, even though their work during the sessions was higher quality. Better results, worse thinking. Here is what the cognitive science says, and how it changed my own AI habits.
NVIDIA OpenShell: Policy-Enforced Sandboxes for Autonomous Coding Agents
NVIDIA just open-sourced OpenShell, a policy-enforced sandbox for autonomous AI agents. Four security layers, a privacy router that decides which LLM sees which data, and hot-reloadable YAML policies. How it works and what it solves that nothing else does.
Securing Vibe-Coded Apps: A Practical Guide to Not Getting Hacked
Vibe coding is shipping apps faster than ever, but also shipping vulnerabilities at alarming rates. This guide covers real disasters, practical security measures from secret scanning to endpoint hardening, and SOTA AI-powered review methods to keep your vibe-coded apps from becoming the next breach headline.
Coding is not fun anymore?
Coding isn't what it used to be. AI implements faster than we can type, and agents are automating our tasks. But there's a bright side: we're evolving from implementors into architects and reviewers. Here's how to survive the shift.
Agent Sandboxes: A Practical Guide to Running AI-Generated Code Safely
AI agents don't just talk. They execute code, which makes isolation the whole problem. The sandbox technologies that matter (microVMs, gVisor, WebAssembly) and the platforms built on them (E2B, Modal, Northflank).
OpenClaw: Security is the Final Boss
OpenClaw, formerly Clawdbot, runs a personal AI agent locally and wires it straight into your messaging apps. Its gateway architecture, the security failures that followed, and what building a safe autonomous ecosystem would actually take.
20253 posts
NoteSetup Different Fractional Scaling for Different Screens in Ubuntu
Ubuntu 24.04 cannot run different fractional scaling on a 4K laptop panel and a 2K external monitor. Upgrading to 24.10 and moving NVIDIA to Wayland fixes it.
NoteHow to Install Kazam 2 on Ubuntu 24.04: The Best Easy Screen Recorder
Ubuntu 24.04 ships the original Kazam, not Kazam 2. How to build and install Kazam 2 from source, with the dependencies, PulseAudio support, and the optional OCR components.
NoteFreeing NVIDIA GPU Memory for AI Training: A Practical Guide
Xorg, your desktop environment, and the browser can hold several GB of VRAM before training starts. How to find what is sitting on the GPU and hand that memory back.
20243 posts
Fine-tuning Llama 3.2 (1B, 3B) and Using It Locally with Llama Assistant 🌟
Fine-tuning Llama 3.2 at 1B and 3B, then running the result locally in Llama Assistant. From the pre-trained models through tuning on your own data to on-device deployment.
NoteNavigating Git History: A Tale of Commit Message Redemption
Amending one commit message is easy; a run of them is not. How to rewrite several past messages at once with interactive rebase, after a batch of commits shipped without their story numbers.
Privacy in AI: Why I Created Llama Assistant
Privacy in AI is a hot topic. I created Llama Assistant to provide a privacy-focused alternative to popular AI assistants like ChatGPT or Claude AI. In this blog post, I'll share my motivation behind creating Llama Assistant and how it differs from other AI assistants.
20238 posts
NoteSharing: 15 Productivity Tips from Dr. Milan
Fifteen productivity tips from Dr. Milan Milanovic, covering single-tasking, the 3:3:3 plan, daily deep-work blocks, and the Feynman technique for learning something new.
Performant Django - How to optimize your Django application?
Where a Django app actually slows down as traffic grows. Benchmark first, then fix the database queries, add the right caching layer, and scale instances with Docker and Kubernetes.
Note♪♪♪ Highly Motivating Performance from Vinh Khuat
A short note on Vinh Khuat's multi-instrument performance and what it shares with software: love the craft first, practice the tools, then build something whole.
NoteLesson note: Teaching is an essential skill for software engineers
Notes from Minh Vu's session on teaching as a core engineering skill: explaining something is how you consolidate it, which is why leads, founders, and engineers all end up teaching.
NoteSwitched from Vercel to Cloudflare Pages
A 2023 record of moving this blog to Cloudflare Pages for free bandwidth on a static export, kept for history. The site runs on Vercel Pro again, because API routes, Postgres, the RAG chatbot, and cron jobs all need the compute.
Review YOLO-NAS - Search for a better YOLO
A short review of advancements in YOLO-NAS - a new YOLO architecture born from Neural Architecture Search.
AnyLabeling - Smart image labeling with Segment Anything and YOLO
How I built AnyLabeling on top of Labelme: why the tool needed to exist, how Segment Anything and YOLO inference is wired into the labeling loop, and how text OCR labeling works.
NoteDatabase connection in Django
Django opens a fresh database connection on every request. Set CONN_MAX_AGE for persistent connections, and add pooling when the database does not share a server with the backend.
20222 posts
Airflow, MLflow or Kubeflow for MLOps?
Comparing Airflow, MLflow, and Kubeflow for MLOps: what each does, how Airflow plus MLflow stacks up against Kubeflow, and which to pick by scale.
With Daisykit – Everyone can build AI projects!
Daisykit, a graph-based C++ and Python toolkit for deploying AI pipelines, from face detection to pose estimation and barcodes, in a few lines of code.
202121 posts
Install OpenCV 4 on macOS using Homebrew
How to install OpenCV 4 on macOS with Homebrew for C++, plus the pip and conda routes for Python, tested on an Apple M1 Macbook Air.
My development environment on macOS - Macbook Air M1
My macOS setup note for a Macbook Air M1: Homebrew, daily apps, coding IDEs, and a ZSH plus iTerm2 terminal for a full development environment.
Install ROS 2 on Raspberry Pi 4 (SD card image available)
Two ways to get ROS 2 Foxy running on a Raspberry Pi 4: flash my prebuilt Ubuntu image, or set up Ubuntu, the desktop, and ROS 2 from scratch.
Paper review: "YOLOX: Exceeding YOLO Series in 2021" and application in traffic sign detection - VIA Autonomous
A review of YOLOX, the anchor-free YOLO with a decoupled head and SimOTA, plus a hands-on traffic-sign detection experiment on the VIA dataset.
Paper review: CenterTrack - CenterPoint - CenterPoint++
Reading notes on three papers: CenterTrack for 2D tracking, CenterPoint for 3D detection and tracking, and CenterPoint++ for the Waymo real-time challenge.
NotePaper review: CenterTrack - CenterPoint - CenterPoint++
Review of three papers in one line of work: CenterTrack for 2D tracking, CenterPoint for 3D detection and tracking, and CenterPoint++, the Waymo Real-time 3D Detection Challenge submission.
Paper review: SECOND - Sparsely Embedded Convolutional Detection
A paper review of SECOND, the sparse-convolution 3D LiDAR detector: its GPU rule generation, angle loss, and point-cloud data augmentation.
NoteESP32-CAM Video Streaming over HTTP and Face Detection
Streaming 800x600 video over HTTP from a five-dollar ESP32-CAM board, running a face detection test on the stream, and what the board is realistically good for.
NoteInstall Fira Code Font for Ubuntu
Installing the Fira Code font on Ubuntu, with the commands for 16.04 and for 17.04 through 24.04. A programming font with ligatures, and the one I use everywhere.
NoteHow do I install Ubuntu on a new machine?
My setup notes for a fresh Ubuntu machine, tested on 20.04 through 24.04: a script that installs most of the packages in one pass, plus the manual steps for everything it does not cover.
NoteInstall Zsh and Auto suggestion plugin for Ubuntu
Replacing bash with Zsh on Ubuntu: install the shell, add Oh My Zsh, and wire up the zsh-autosuggestions plugin. Three steps, and the shell setup I keep coming back to.
Build a Pushup counter app with OpenCV and Deep learning
Building a desktop pushup counter that combines human keypoint detection with signal processing to count reps from a webcam, no sensors needed.
Note[MOOC] Autoware Course - Lecture 1 - Setup the environment
Lecture 1 notes from the Apex.AI Autoware course: getting the development environment up with Docker, ROS 2, Terminator, and Autoware.Auto, the errors I hit along the way, and how I fixed them.
Note[MOOC] Apollo Lessons on Self-Driving Cars
Course notes from Udacity's Self-Driving Fundamentals, featuring Apollo. What the seven lessons cover, from HD maps and localization through perception, prediction, planning, and control. Every diagram in the series is redrawn.
Note[MOOC] Apollo Lesson 7: Control
Lesson 7: steering, throttle, and brake that follow the planned trajectory while keeping passengers comfortable. PID, LQR, and model predictive control, with the tradeoffs of each.
Note[MOOC] Apollo Lesson 6: Planning
Lesson 6: turning a map, a position, and a set of predictions into a trajectory. Routing the world as a graph, Frenet coordinates, path-velocity decoupled planning, and reading an ST graph.
Note[MOOC] Apollo Lesson 5: Prediction
Lesson 5: predicting what everything else on the road will do next. Model-based against data-driven approaches, lane-sequence prediction, and using an RNN to produce a trajectory for each tracked object.
Note[MOOC] Apollo Lesson 4: Perception
Lesson 4: turning camera, LiDAR, and radar data into objects. Classification, detection, and segmentation, what each sensor is good and bad at, and why Apollo fuses them rather than trusting one.
Note[MOOC] Apollo Lesson 3: Localization
Lesson 3: how the vehicle places itself to single-digit-centimetre accuracy. Inertial navigation, GNSS and IMU, RTK, LiDAR and visual localization, and the multi-sensor fusion Apollo settles on.
Note[MOOC] Apollo Lesson 2: HD Maps
Lesson 2: why a self-driving car needs an HD map rather than the one on your phone. Centimetre precision, lane markings and a 3D road network, how localization rides on top of the map, and how the maps get built.
Note[MOOC] Apollo Lesson 1: SDC Fundamentals
Lesson 1: what actually makes up a self-driving car. The six levels of autonomy, how a machine driver differs from a human one, and the three layers of the Apollo platform: hardware, the open software stack, and the cloud services.
20205 posts
Advanced driver-assistance system on Jetson Nano Part 3 - Deep neural networks
The three deep networks behind my Jetson Nano ADAS: CenterNet detection, a ResNet-18 sign classifier, U-Net lane segmentation, plus TensorRT tuning.
Advanced driver-assistance system on Jetson Nano Part 2 - Software design
Software design of an ADAS on Jetson Nano: forward collision warning, lane departure detection, and speed-limit sign over-speed alerts.
Advanced driver-assistance system on Jetson Nano Part 1 - Intro & Hardware design
Building an ADAS prototype on a Jetson Nano: the motivation, feature scope, and hardware design for collision, lane-departure, and speed-limit warnings.
Configure integrated GPU for rendering and NVIDIA GPU for CUDA works in Ubuntu 18.04
Set an Intel integrated GPU as the display renderer on Ubuntu 18.04 so your NVIDIA GPU's full VRAM stays free for CUDA and model training.
Note[Concepts] Classification metrics
Accuracy alone hides a bad classifier. A walkthrough of the confusion matrix and what is built from it: precision, recall, specificity, F-score, and the AUC-ROC curve, with when each one is the metric that matters.
20192 posts
Locked myself out of SSH port Ubuntu AWS server using ufw
How to regain SSH access to an AWS EC2 Ubuntu instance after ufw locks you out, by disabling the firewall via a user-data script.
ReactJS lifecycle method inside a functional Component
How to attach lifecycle methods like componentDidMount to a React functional component using the react-pure-lifecycle package.
20172 posts
Install mysql2 gem on macOS using MAMP as mySQL server
Fix the mysql2 gem compile error on macOS when using MAMP by pointing gem install at the right mysql_config path.
Minify multiple Javascript files in a folder with UglifyJS
Minify every JavaScript file in a folder with a short UglifyJS plus Bash loop, no Grunt setup required.
20161 post
A very simple guide to GNU Emacs
A beginner guide to GNU Emacs: why use it for coding, how to install it on Ubuntu, and the essential file, edit and cursor shortcuts