Shang Gao

Writing

On BIM, AI agents and engineering practice.

Oct 19, 2026 · AI · Computer Vision · Engineering Drawings · Few-shot Learning

Given One Example, Can AI Find Every Symbol on a Drawing?

On a public dataset of fire-alarm system drawings, I chained detection, OCR, training-free classification and a little training into one pipeline, to see how far 1 or 5 examples per class can go.

Oct 12, 2026 · Emulation · Webulator · WebGL · Windows XP

Bypassing the Emulated CPU: D3D/OpenGL API Forwarding and an x87 Fast Path

Once browser XP had a virtual graphics card, the bottleneck became the graphics drivers running on the emulated CPU. I wrote two stand-in DLLs that hand Direct3D 9 and OpenGL calls straight to WebGL2 outside the emulator, and gave v86's x87 floating point a native f64 fast path.

Oct 11, 2026 · Emulation · Webulator · WebGL · Windows XP

Giving Windows XP a Graphics Card in the Browser: SVGA3D to WebGL2

v86 has no 3D hardware. I implemented a VMware SVGA II card and its SVGA3D protocol inside it, executed the XP driver's commands with WebGL2, and got Direct3D and OpenGL acceleration in browser XP, up to running OpenArena.

Oct 11, 2026 · Emulation · WebAssembly · Webulator

Turning a Screenshot into a Live Computer: Why I Built Webulator

Webulator puts v86, Mini vMac, Basilisk II and SheepShaver behind one browser API: the same input, the same snapshots, the same conformance tests. Four old computers wake from a snapshot with a first frame identical to the saved screen.

Oct 2, 2026 · Emulation · WebAssembly · Asyncify · Classic Mac

Save States for Classic Mac Emulators: Asyncify, a Virtual Clock, and "Disk Busy"

Mini vMac, Basilisk II and SheepShaver have no save state. For the save states themselves I changed only build flags: I used Asyncify to unwind the call stack at the input poll, so all three classic Macs can be saved and restored in a fresh page with a pixel-identical first frame. Plus why a virtual clock is required, and how to keep the guest running while the disk is slow.

Jul 31, 2026 · Networking · iOS · SSH · Tailscale

The SSH connection that only failed on 5G

A thirty-second SSH connect timeout from an iPhone over Tailscale, with no packets on the wire, turned out to be iOS synthesising a NAT64 address from an IPv4 literal.

May 22, 2026 · BIM · AI

BIM Components Are Functions, Not Data

A door, a steel beam, a duct fitting: each is a mapping from parameters to geometry. Make that mapping a first-class citizen and you get the family: three invariants, three tiers of components, Connectors, and a shared component library published by AI.

May 14, 2026 · Single Line Diagrams · Auto-Layout · Graph Algorithms

Auto-Layout for Single Line Diagrams: A Fun Little Problem

How the auto-layout in sldeditor, an open-source electrical single line diagram editor, encodes domain concepts like busbars, chains, electrical nodes and tiers so that machine-drawn diagrams look like an electrical engineer drew them.

Apr 10, 2026 · AI · BIM

How to Make AI Agents Truly Understand Buildings? Building an AI-Native BIM Data Structure

Exploring the pure technical details and design trade-offs behind the BimDown format, bringing AI back to resolving architectural scenarios using approaches it finds most familiar.

Apr 6, 2026 · AI · BIM · OpenClaw · Revit

I Built a Revit for OpenClaw

BimDown in practice: letting AI agents like OpenClaw read and write building models directly, five demo scenarios, and what's still missing compared with Revit.

Apr 6, 2026 · BIM · AI

BimDown Internals: Engineering the Path from CSV+SVG to a Geometric Reasoning Engine

A sequel to the BimDown format post, about implementation only: schema inheritance, merging CSV and SVG into DuckDB tables, deriving room boundaries with a DCEL, rebuilding MEP topology, and incremental round-trips with Revit.

Jun 8, 2025 · AI · Revit · BIM

The Missing Piece of Vibe Coding Revit Plugins: Running API Tests Without Launching Revit

How to run Revit API tests without launching Revit, letting AI close the feedback loop on its own and fully unleashing the iteration speed of Vibe Coding.