bim sketchup ships as a pinned driver (sketchup-cli v0.1.0). It uses
the same TCP bridge pattern as bim revit: a Ruby extension (bim_bridge.rb)
listens on port 15700 inside the SketchUp process; the Go CLI speaks JSON-RPC
to it over loopback.
Targets SketchUp Make 2017 by default (free, no account needed). Pro/2026
is supported with --year or --url override but requires a Trimble subscription.
Verbs: launch, close, exec, open, export, status, doctor,
install, setup.
setup downloads Make 2017 from archive.org (~148 MB) and guides the user
through the one required UAC step.install writes bim_bridge.rb into %APPDATA%\SketchUp\SketchUp 2017\SketchUp\Plugins\.launch detects the install via the Windows Uninstall registry (works for
non-default paths), prefers Make over Pro, passes the saved default template
on the command line to skip the welcome chooser. Cold start ~13s.close quits gracefully via Sketchup.quit, falls back to process kill.exec evaluates Ruby against the live model: bim sketchup exec --code "Sketchup.version".bim oauthr and the oauthr-backed cloud drivers (e.g. bim linear) could never
find the oauthr binary on a normal install: the only install path was a runtime
download in internal/oauthr/firstrun.go that was broken three ways -- empty
sha256ByPlatform pins (hard-fail), PinnedVersion v0.1.0 (actual 0.2.0), and a
downloadBase (oauthr.com/releases) that 404s -- and it installed to a
different directory than the bim oauthr passthrough searched.
oauthr now ships like every other driver: pinned in driver-pins.json
(bim-oauthr -> HelloHowAreYouHaveANiceDay/oauthr), fetched from the oauthr
repo's GitHub Release at bim-cli build time, and vendored into drivers/ as
bim-oauthr.exe.
<drivers>/bim-oauthr.exe (the
bim oauthr passthrough, bim doctor's checkOauthr, the bim-linear doctor
probe, and the first-run intercept), with PATH and a co-install next to
bim.exe as fallbacks. The passthrough honours BIM_HOME.bim-oauthr is excluded from format-driver enumeration (listDrivers): it is
a kind: bridge reached via the bim oauthr passthrough, not a JSON-RPC
driver, so bim describe/bim doctor no longer probe it over the wrong
protocol. Its health is reported by checkOauthr.firstrun.go
(Download/Installed/ExePath/sha256ByPlatform/PinnedVersion/
downloadBase); the first-run flow now only drives consent + bim oauthr connect since the binary is always vendored.bim-code was a pure-CLI driver, but the dispatcher interrogates drivers via
JSON-RPC over stdin (protocol_version "2.0"). So bim code <verb> printed usage
and bim doctor reported FAIL code. Re-pinned to code-cli v0.2.1, which
rewrites the driver to rpc.Serve like every other driver. Verified through the
dispatcher: bim code doctor -> ok:true; check/rules/jurisdictions return data.
End-to-end testing against the live oauthr + Linear API surfaced two bugs that
made every bim linear call fail. Both fixed and verified (list, get,
exec return real data):
GET /v1/token?service=linear,
which does not exist on the oauthr control plane (404) -- so the direct
control-plane path never authenticated and always fell through to
auth-required. Now calls POST /v1/internal/token with the principal/service
in the body and reads access_token, matching the oauthr contract.list state filter: emitted Linear's state.type filter as bareword enums
({ type: { in: [unstarted, started] } }). Linear's type filter is a
StringComparator, so this returned HTTP 400 (String cannot represent a non string value). Now emits quoted strings.scripts/release-local.ps1 -- cut a release entirely from a local Windows box
(stage drivers -> build -> zip -> R2 upload -> flip latest.txt -> verify),
mirroring release.yml. For use when GitHub Actions is unavailable (e.g. an
Actions spending-limit block) or for out-of-band hotfixes.Linear project management integration using oauthr for credential brokering (no tokens stored locally -- DESIGN.md SS15).
bim linear list [--team <key>] [--limit N] [--state <type>] -- list open issues; defaults to unstarted + startedbim linear get <identifier> -- fetch a single issue by identifier (e.g. DIM-120)bim linear create --title <str> [--team <key>] [--description <md>] -- create an issuebim linear comment <identifier> --body <md> -- add a comment to an issuebim linear status <identifier> --state <name> -- update workflow state (resolves state by name)bim linear exec --gql '<query>' [--variables <json>] -- arbitrary GraphQL passthrough for power userskind: "auth-required" with hint: "oauthr connect linear"bim doctor surfaces oauthr availability and Linear session status via the driver's doctor checksoauthr:linear, network:api.linear.appExpanded NYC Building Code 2022 coverage -- 5 new room-level rules beyond the original light/air pair.
nyc-2022-1208.1 -- minimum ceiling height (7 ft habitable rooms, 7 ft 6 in bathrooms, 7 ft corridors)nyc-2022-1208.2 -- minimum room area (70 SF for first room; 50 SF additional habitable rooms; 35 SF kitchen; 30 SF bath)nyc-2022-1208.4 -- minimum room dimension (7 ft least dimension for habitable rooms)nyc-2022-1010.1.1 -- egress door minimum clear width (32 in clear, 36 in nominal)nyc-2022-1005.1 -- egress width capacity factor (0.2 in/occupant; occupant load from area + occupancy type)ibc-2021 (natural light SS1205.2 + natural ventilation SS1203.4)bim code jurisdictions now returns ["ibc-2021", "nyc-2022"]describe output updated to enumerate the full rule coverageBuilding-code compliance checker. Stdin-first, no Revit dependency.
bim code check [--jurisdiction <id>] [--input <file>] [--rules <id,...>] -- pass rooms with area_sf and glazing_sf; returns pass/fail per room with delta and fix guidance; missing facts produce missing_data severity rather than a guessbim code rules --jurisdiction <id> -- list rules and required facts for a jurisdictionbim code jurisdictions -- list available jurisdictionsnyc-2022 (NYC 2022 BC SS1205.2 natural light + SS1203.5 ventilation), ibc-2021 (IBC 2021 SS1205.2 natural light + SS1203.4 natural ventilation)bim revit alias list -- list all builtin and user-tier alias scripts; user scripts shadow builtins by name.bim revit alias show --name <alias> -- print script body and metadata (wraps, description, language).bim revit alias rank [--top N] -- rank Revit API symbols by frequency across logs/exec-api.jsonl; surfaces the most-exec'd patterns as promotion candidates.sheet-list, warnings-export, linked-models, param-dump, export-sheets (convenience wrappers that were previously hand-written exec snippets).describe --json aliases[] now reflects the full on-disk set (system + user tier).exec call appends an entry to %LOCALAPPDATA%\bim-cli\logs\exec-api.jsonl containing only PascalCase API identifier tokens -- no string literals, numeric literals, file paths, or parameter values. Feeds alias rank for desire-path analysis.sheets read --grid -- lossless 2D output: one JSON array per row, header row included, column order preserved. Use for clean grids, the raw header, irregular/blank headers, or a single-row range (which the default header-keyed mode reports as rows:0). Mirrors write --grid (#210).bim google sheets tabs list, bim google sheets write (and similar) previously errored method not found; they now dispatch correctly (#29).bim revit ui / bim bluebeam ui alias to ui-cli (#135).sheets format -- number/text format, bold, fg/bg color, alignment, freeze rows/cols, merge, column width.sheets conditional-format -- boolean rules (NUMBER_LESS / NUMBER_GREATER / TEXT_CONTAINS / BLANK / etc.) to background/text color.drive list --parent + drive.metadata.readonly scope to browse pre-existing files; BYO client ID via bim google login --client-id-file.bim pdf table -- table extraction verb.bim revit model health -- aggregate model quality report.GET /stats aggregate read endpoint.Energy modeling and Passive House compliance checking via NREL OpenStudio CLI.
bim energy run --in model.gbxml — EnergyPlus simulation; returns EUI, annual kWh, peak kW, end-use breakdownbim energy phius.check --in model.gbxml — PHIUS CORE 2024 performance path compliance; returns pass/fail per criterionbim energy install — download and silently install NREL OpenStudio CLI 3.11.0bim energy doctor — verify OpenStudio CLI and EnergyPlus versionsDesire-path feedback can now be uploaded directly from the CLI: bim feedback --upload scrubs all argument values and POSTs to the telemetry worker. Use --dry-run to preview the payload first.
fix(dispatch): -- end-of-flags terminator now correctly passes negative values (e.g. PDF crop coordinates like -785,-123,-348,195) through to drivers without misinterpreting them as flag names/revit-api-reference consolidated Revit API namespace reference pageAnonymous verb-usage telemetry, disabled unless BIM_TELEMETRY=1 is set.
When enabled, one ping is sent per top-level command containing: verb shape,
version, OS family, success flag, error kind, and latency bucket. No IP
addresses, identifiers, arguments, file paths, or sub-day timestamps are
ever collected. DO_NOT_TRACK=true always overrides. See
bimcli.com/privacy for the full schema.
bim site hurricane-zone now returns zones 1–6 for Nassau County addresses (was not_applicable). Source: Nassau County OEM ArcGIS FeatureServer.bim site zoning now covers the Town of Southold (zone codes R-40, HB, LB, LI, etc. with eCode360 links). Suffolk County zoning now covers 9 towns.-ldflags; bim google doctor client-configured check now passes on installed builds.parseFloodZoneFeatures and parseAirportElements — testable
without HTTP.adapters.PostForm deduplicates 5 identical POST-form patterns across nfhl/nces; nces
now inherits rate-limit handling uniformly.nfhl.New / nces.New accept *http.Client (injectable in tests); all command entry
points use DefaultClient (with ThrottledTransport).FuzzParseFloodZoneFeatures, FuzzParseCoord, FuzzClassifyZone.Makefile with cover/fuzz/vuln targets,
internal/covcheck ratchet gate, CI baseline 12.9%.All non-streaming verb responses are now flat JSON objects. The {"jsonrpc":"2.0","id":1,"result":{…}} wrapper is stripped by the dispatcher before printing — agents receive the inner result directly.
Error responses now use the canonical flat envelope ({"ok":false,"error":{"kind":"…","message":"…","hint":"…"}}) instead of the raw JSON-RPC error object. Streaming verbs (output: ndjson / binary) pass through untouched.
New arg types available in driver manifests:
csv-float / csv-int — comma-separated values coerced to []float64 / []int64. Non-numeric values error explicitly (were silently 0 before). --bbox "50,60,550,380" instead of --bboxes "[[50,60,550,380]]".csv-float/csv-int/array/json flag passed more than once accumulates into [[…],[…]]. --bbox a --bbox b replaces the old JSON-string approach.stdin type — flag value is read from stdin (pipe). bim revit exec --code - reads a Python script from the pipe.bim blender quit — new lifecycle verb (kill remains a permanent alias). Terminates the Blender bridge and deregisters the session.--pid is now optional when exactly one instance is running. Zero instances → no-instance error; two or more → ambiguous-instance listing PIDs.bim blender launch --reuse — attaches to a running managed instance instead of spawning a new one.bim revit quit — canonical lifecycle verb; kill kept as permanent alias.no-instance / ambiguous-instance error kinds.status response re-includes the instances array (was accidentally dropped).bim rhino quit / bim rhino kill — new lifecycle verbs; canonical no-instance / ambiguous-instance error kinds on all session verbs.driver-pins.json and fetches binaries from each driver repo's GitHub Releases at build time. Driver updates no longer require committing binaries to bim-cli.bim-google release zip was missing gws.exe; bim google verbs failed on fresh installs.bim rhino doctor returned empty output (JSON-RPC framing bug).New driver: bim blender — connects to a running Blender instance via the Python bridge addon (JSON-RPC 2.0 over TCP). Supports launch, instances, exec, convert, kill, doctor.
New driver: bim google — Docs, Sheets, Drive, and OAuth session management via gws.exe.
flood map / flood vector accept string lat/lon (was float-only, caused parse errors from assess JSON output piped directly).--address without requiring explicit --lat/--lon flags.CreateProcessW path, discovery timing).--pid accepted as string or int; DETACHED_PROCESS flag on RDP sessions.New driver: bim pdfv — a native PDF viewer (Rust + PDFium + egui) that exposes an agent-driven control surface via JSON-RPC 2.0 named pipes. First session-kind driver in bim-cli.
bim pdfv open --file drawings.pdf --layout left # open viewer, returns pid + pipe name
bim pdfv open --file code.pdf --layout right # side-by-side
bim pdfv search --pid <N> --pattern "28-302" # search + auto-navigate + highlight
bim pdfv navigate --pid <N> --page 96 # go to page (0-indexed)
bim pdfv highlight --pid <N> --page 96 --bboxes "[[72,425,542,438]]"
bim pdfv fit --pid <N> # fit page width to window
bim pdfv render --pid <N> --out frame.png # snapshot current view to PNG
bim pdfv state --pid <N> # current page, scale, highlights
bim pdfv instances # list all running viewers with PIDs
Key properties:
bim pdfv open call detaches the GUI and returns immediately; bim-cli does not block\\.\pipe\pdfv-{pid} provides persistent IPC between viewer and agent%LOCALAPPDATA%\bim-cli\instances\pdfv-{pid}.json — bim pdfv instances scans and prunes dead PIDs automatically--layout left|right|top|bottom|full positions the window on launch; no external window-management script needed--pidbim pdfv render bakes active highlights and annotations into the PNG — what you see in the window is what the agent seesRuntime dependency: pdfium.dll (7 MB) ships alongside bim-pdfv.exe in the drivers/ directory.
7 new NYC verbs (all no-key, all wired into assess): e-designation, stormwater-flood, building-history, brownfield, coastal, special-district, subway. NYC assess now returns 23 layers.
satellite.map — new first-class global imagery verb. Works for any coordinate worldwide with no parcel registry required. Supports Esri Wayback dated imagery (193 snapshots 2014→2026, monthly), live World_Imagery, and optional parcel outline overlay where registry coverage exists.
parcel.map improvements: --satellite flag and --wayback-date YYYY-MM-DD for dated Esri Wayback imagery.
airport.lookup fix: Overpass query now searches (node; way; relation) with out center; — previously only found node-type airports, missing JFK, LGA, EWR and all other polygon airports.
Rate-limit propagation: assess response gains throttle_hint with affected_layers, retry_after_secs, and exact retry commands when any layer is rate-limited. Individual verbs surface retry_after_secs and throttle_source in error.data. Agents can check structured fields rather than parsing error strings.
pkg/rpc — Data struct additionsrpc.Data gains two new optional fields:
retry_after_secs int — seconds to wait before retrying a rate-limited callthrottle_source string — hostname of the service that issued the rate limitThese fields are omitempty — no change to existing response shapes.
bim pdf package now produces conformant PDF-BIM v2 files.
Every packaged PDF gets:
/AF array on the document catalog, pointing to each embedded BIM filespec/AFRelationship /Data + /Subtype application/json on each filespec — standard PDF attachment-discovery path; any PDF/A-3 reader finds the data without guessing filenamespdfbim:version=2 + pdfbim:generator in the XMP metadata stream — sniffable in <2KB without extracting attachmentsNew verb: bim pdf bim validate <file> — checks all three spec layers and reports conformance:
bim pdf bim validate drawings.pdf
{"ok":true,"result":{"profile":"v2","checks":{"af_present":true,"pdfbim_xmp":true,"elements_attachment":true,"marks_attachment":true,"elements_schema":true,"marks_schema":true,"join_resolves":true}}}
Reports profile: "v2" (conformant), "legacy-v1" (old packages without /AF), or "unknown".
Marks bounds are now CTM-correct. The walker tracks q/Q/cm operators; element bounding boxes are device-space coordinates. Fixes latent misplacement on PDFs that apply viewport transforms (rotated/scaled detail callouts).
Backward compatible. Old packages (no /AF, no XMP marker) continue to open in the viewer and are reported as legacy-v1 by the validator.
Scenario tests pdf-archive-pdfa3 and pdf-shrink-batch were checking for result.outputFile — corrected to result.path (field was renamed in v0.2.1).
bim site assess now supports Taiwan addresses with automatic country detection — no flag or config change needed. Any address containing Chinese characters or Taiwan city/county keywords routes through the Taiwan layer stack; all US functionality is unchanged.
Geocoding: Nominatim OSM is the default — no API keys. Set BIM_SITE_TGOS_APPID + BIM_SITE_TGOS_APIKEY for house-number precision via TGOS (free registration at api.tgos.tw).
Taiwan layer stack: elevation (Open-Meteo SRTM), faults (GSMMA), seismic (Taiwan Building Code static zone), school (OSM Overpass 1 km), parcel (NLSC Open API + Nominatim reverse), zoning (luz.tcd.gov.tw cache-backed PIP), flood (NCDR registry-routed), airport/historic/transit (OSM/Transitland, global).
luz.tcd.gov.tw zoning: On first call per county, downloads all zone polygons from the National Development Council (Taiwan), caches locally (30-day TTL), answers subsequent queries via point-in-polygon. Geo-IP accessible from Taiwan. No API key required.
New optional env vars: BIM_SITE_TGOS_APPID, BIM_SITE_TGOS_APIKEY, BIM_SITE_CACHE_DIR.
Example:
bim site assess --address "台中市西屯區市政路200號"
All US verbs unchanged. Global layer (airport/historic/transit) jurisdiction tag changed from "federal" to "global" in JSON output (cosmetic).
bim info path was double-prefixing driver name (bim-bim-pdf.exe); fixed"path" (was "outputFile"); output defaults to %TEMP%\bim-cli\out\--address geocodes automatically on all verbs; map/vector verbs return "path" keyresize --width N without --height scales proportionally (was 0×0 crash); file verbs return "path"sheets/info row counts exclude headerstatus exits 0 when Revit not running"bim-rhino"; status exits 0 when Rhino not runningparcel map subverb; SF parcel bbox+centroid strategya841-dotweb01.nyc.gov). Previously only Manhattan (36061) was registered, with a stub adapter that had no Go implementation. All five borough FIPS codes (36005, 36047, 36061, 36081, 36085) now use arcgis_feature with corrected field names (ZoneDist1, Landmark, HistDist, BldgArea).bim site hurricane-zone: NYC hurricane evacuation zone (1–6, 1=highest risk). Source: NYC DCP/NYCEM FeatureServer. Returns not_applicable outside NYC. Added to assess orchestrator under NY gate.bim site landmark: NYC LPC landmark status — individual designation and historic district membership. Parallel query: MapPLUTO + LPC Historic Districts FeatureServer. Added to assess orchestrator under NY gate.bim site parcel now accepts --address --geocode (previously lat/lon only).bim pdf report: new verb that generates a graphical multi-page PDF site assessment from bim site assess JSON output. Accepts --data <path> or stdin. Fetches basemap images (Esri satellite, street, USGS topo, USGS imagery+topo) automatically from lat/lon in the assess data. Accepts --flood-map and --school-map from bim site flood map / bim site school map. Renders: cover, 14-row data layers table with colour-coded status, maps section, NYC regulatory panel (when state=NY), unknowns table.bim site assess --address "4720 Center Blvd, Long Island City, NY 11109" > assess.json
bim site flood map --lat 40.7461 --lon -73.9570 --out flood.png
bim site school map --lat 40.7461 --lon -73.9570 --out school.png
bim pdf report --data assess.json --flood-map flood.png --school-map school.png --out report.pdf