Repository navigation
v1.2.10 — Zero-Admin Onboarding, Annotations Survive Replacements
·
138 commits
to development
since this release
Changed — installing for people who are not programmers (no admin, no terminal)
Feedback from a colleague who installed it: the add-in landed, but "Node.js to connect Claude" was
nowhere to be found. Installing developer tools is not something modellers do, and office laptops
have no administrator rights.
- Connect to Claude, inside Revit. An unconnected chat shows a wizard instead of npm commands:
paste an API key (checked against the API at once, free:GET /v1/models/{model}; a wrong key is
never stored), or install Claude Code with Anthropic's per-user installer in a visible window, log
in, and switch to it — no restart. Every control has an AutomationId. - An API key wins.
autonow prefers a configured key (managed.json,ANTHROPIC_API_KEY, or the
user's own), then Claude Code, then a local model. Default modelclaude-sonnet-5-5. - The user's own key is never plain text on disk: DPAPI-encrypted for the Windows user
(AnthropicApiKeyProtected); an old plain-text key is encrypted on first read and removed. (A key
IT puts inmanaged.jsonis plain text there by design — protect that file with an ACL.) - IT can manage it: read-only
managed.json(%ProgramData%\VibeModel\then%APPDATA%\VibeModel\)
withPreferredBackend,Model,ApiBaseUrl,AnthropicApiKey,DisableClaudeCode,ClaudeCliPath,
Language; managed fields are locked in Settings ("beheerd door IT").ApiBaseUrllets a gateway
that speaks the Messages API stand in for api.anthropic.com. See docs/deployment.md. - Office networks: every API call (chat, quick replies, distiller, key test) goes through the
Windows proxy, authenticating to the proxy with the user's Windows credentials, with TLS 1.2 or
newer (Revit's process-wide TLS setting is only touched when it pins older versions) and the
Windows certificate store. Claude Code gets the Windows proxy asHTTPS_PROXYwhen none is set,
plusNO_PROXYfor 127.0.0.1/localhost so its calls to Revit never go through the proxy. - Claude Code found where the native installer puts it (
%USERPROFILE%\.local\bin) and on a PATH
read fresh from the registry;ClaudeCliPath/VIBEMODEL_CLAUDE_CLIset it (none= off).
Without Git for Windows the CLI shells out through PowerShell: it is now allowed, and the prompt
says to callcurl.exethere. - Diagnose (chat header +
diagnosecommand): versions, signature, backend, key source (masked),
where Claude Code was looked for, proxy, DNS/HTTPS to api.anthropic.com and claude.ai with the
certificate issuer, recent warnings/errors, settings with secrets masked; Copy / Save. - Cost line under each answer:
31.0k tokens · ≈ €0,12(API: list prices inModelPricing;
Claude Code: its owntotal_cost_usd). Never stored with the chat. - Settings → Anthropic API: model and endpoint fields; Validate uses the same free key check as the
wizard, against the endpoint typed in the box (a network failure names that host), and tests IT's /
the environment's key when the box is empty. Such a key is shown masked and never copied into settings.json. The Claude Code tab finds the
CLI the way the backend does (off the UI thread) and no longer mentions npm. - Warnings and errors are always logged now (INFO stays behind
VIBEMODEL_DEBUG=1), so support has a log. - Header: "Niet verbonden" in the pane's language; the buttons stay visible in the default narrow pane.
Fixed — the API backend on models that think by default
- Sonnet 5.5 (the new default) thinks by default. Its thinking blocks are now kept and sent back with
the turn (they were dropped, which breaks a tool loop), the system prompt is frozen for a whole turn,
screenshots and attachments are trimmed only between turns — the newest screenshot stays an image
for follow-up questions — and then stale thinking is removed; a 400 about thinking blocks is
answered once by removing them and retrying (only when there are any). A refusal and a cut-off
answer are explained instead of returning nothing.max_tokens32000.
Installer and release zip
install.cmdasks nothing but "close Revit" (no API-key prompt any more), is idempotent ("already up
to date"), logs to%LOCALAPPDATA%\VibeModel\logs\install.log, reports the signature, and has
-Quiet(IT: no questions; exit 2 when Revit runs, 3 when the build's Revit is missing) and
-InstallClaudeCode(Anthropic's installer in its own PowerShell).- Only the Revit the build is for. The zip carries
revit-year.txt; the installer installs into that
Revit year only and names the others it leaves alone. The old script copied the Revit 2023 build into
every Revit it found, so a laptop with Revit 2025 as well got an add-in 2025 cannot load. scripts/sign.ps1(Set-AuthenticodeSignature + timestamp) andpackage-release.ps1 -Sign -Thumbprint.
Measured in Revit 2023: unsigned → one "Always Load" prompt per new version; a trusted signature
→ no prompt at all; a self-signed (untrusted) signature → "Security - Invalid Signature … may have
been tampered with" on every start, with only Load / Do Not Load. So packaging refuses to sign
without a real certificate (-AllowSelfSignedfor tests only), and the installer does not offer to
trust a certificate (Windows itself warns that adding a root is a security risk).
Added — annotations survive replacements
- Seen during the demo recordings: the chat put spot elevations on a capstone and a pile tip, then in
a later turn replaced those elements — the spots silently vanished or broke. Measured in Revit 2023:
most host changes through the API raise no failure. Deleting a floor deletes its spot and a 3-reference
dimension; a wall+floor dimension survives with only the wall references (0 segments); a pile's
parameter change can leave its tip spot with a stale value; shape-editing a floor invalidates its spot. - Around
delete,exec,set,join,unjoinandphase(and any batch with one of them) the
spot elevations, dimensions and tags on the elements involved are recorded (a type id covers its
instances) and afterwards re-hosted: refreshed on the same element when it moved or went stale, else
moved to a replacement — an element of the same category that the command added or VibeModel created
earlier this session, never an unrelated neighbour (spots: a face/edge at the same height ±1 mm within
50 mm; dimensions: a face on the old reference plane ±1 mm; tags: the replacement covering the old
element's middle). An annotation the command deleted itself stays deleted. Whatever cannot be
re-hosted is deleted, never left invalid. One line says what happened:-- annotations: re-hosted …; removed …(JSONannotations),(Revit)when Revit's failure policy deleted it. Same undo step,
exceptexec(its own step). Verified live: piles 320→350 replaced byplaceid+delete(both
pile spots and the floor-pile dimension re-hosted, values unchanged), the floor recreated byexec
(spot + both dimensions re-created with all references), a pile moved (the spot followed it, no
line), the floor raised byset(spot follows, no line), the floor shape-edited byexec(warning
dismissed, spot re-hosted), a spot anexecdeleted on purpose (stays deleted, no line), and in a
section showing levels a floor recreated byexec(its face+level dimension and its tag re-hosted). spot <x> <y> | spot <id> top|bottom [--leader x y] [--fixed] [--type name]— a spot elevation
(peilmaat). It snaps to a face the section cuts, else the edge the view shows, and always to an edge
of a family instance (Revit refuses instance faces and faces behind the cut). The response says what
it is attached to and warns when that element is likely to be replaced;--fixedhangs it on a
detail line that never moves.whatdepends <ids|selected>(read-only) — the annotations (per view and sheet), hosted and joined
elements that depend on elements, with a verdict, before you replace them.dimensionprefers a level, grid or reference plane at the face's position (±1 mm; the faces
themselves when Revit refuses that), listsAttached to:per reference and notes when a reference is
likely to be replaced; JSON references getstableandvibeModelCreated.tagsays what it tags;text --leadersays its leader is a free
point.
Fixed — dimensions and spots on family instances hung on the family symbol
- Faces and edges of a family instance's geometry carry references to the family symbol.
dimension
used them as they were, so a dimension to a pile was attached to the symbol: it outlived the pile and
no scan for the pile found it. Bothdimensionandspotnow use the instance's own reference to
the same face/edge.