cad-viewer
earthtojake/text-to-cad
Open CAD and robot-description files in a live web viewer with browsable catalog and compile status.
What is cad-viewer?
CAD Viewer launches a local web server to visually review CAD files (.step, .stp, .glb, .stl, .3mf, .dxf), robot descriptions (.urdf, .srdf, .sdf), and DXF drawings. Use it after generating or importing models to inspect geometry, check compilation status, and share review links.
- Launch a persistent local Viewer server serving a chosen workspace directory
- Generate live review links for any artifact in the served directory tree
- Display compilation status (not compiled, compiling, rendered, or failed) for STEP/STP files
- Browse and switch between all models in the workspace via an integrated file catalog
- Reuse existing Viewer instances for the same directory to avoid port collisions
- Support multiple file formats: STEP, STP, GLB, STL, 3MF, DXF, URDF, SRDF, SDF
How to install cad-viewer
npx skills add https://github.com/earthtojake/text-to-cad --skill cad-viewer- Python >= 3.11
- Install requirements.txt from the skill: python -m pip install -r requirements.txt
- cadgen command available on PATH (or use python -m cadgen.viewer)
How to use cad-viewer
- 1.Choose the workspace directory (typically models/ or the common parent of files to review)
- 2.Run: cd /path/to/workspace && cadgen viewer --host 127.0.0.1 --json
- 3.Extract the URL from the JSON output (reuse key is directory path × cadgen version)
- 4.For each file to review, construct the URL with ?file=relative/path/to/artifact
- 5.Open the URL in a browser; the Viewer scans the workspace recursively and shows all artifacts in the catalog
- 6.Switch between files using the file browser without restarting the server
Use cases
- Review a newly generated STEP model by launching the Viewer from the models/ directory and opening the file link
- Inspect robot kinematics by viewing URDF and SRDF files side-by-side in the same Viewer instance
- Check compilation progress of CAD documents and see detailed error messages if compilation fails
- Share a review link with team members pointing to a specific artifact in a shared workspace
- Switch between multiple imported and generated models without restarting the server
- CAD engineers and designers reviewing generated or imported models
- Roboticists inspecting URDF and robot-description files
- Teams collaborating on model review via shared Viewer links
- Agents in CAD generation pipelines that need to validate output before handoff
cad-viewer FAQ
Yes, but choose deliberately: the cwd becomes the served workspace root and the reuse key. Launching from a deep folder hides the rest of the project. Launch from the directory the user thinks of as their model workspace (usually models/) so the catalog shows all relevant artifacts.
The Viewer automatically rolls to the next free port starting from 3245 (0xCAD in hex). Never pick a port yourself; always read the URL from the JSON output.
For imported files, no. For generated STEP/STP files, the model script must be run first to create the artifact. The Viewer will show compilation status (not compiled, compiling, rendered, or failed) but does not run scripts itself.
All files must be under the same workspace root. If you need to review artifacts outside that root, launch a new Viewer instance from their common parent directory; reuse-or-start makes this cheap and idempotent.
No, unless the user explicitly asks. The Viewer persists for the session and reuses the same instance for the same directory, making subsequent reviews instant.
Full instructions (SKILL.md)
Source of truth, from earthtojake/text-to-cad.
name: cad-viewer
description: Start CAD Viewer and return review links for CAD and robot-description files. Use when visually reviewing .step, .stp, .glb, .stl, .3mf, .dxf, .urdf, .srdf, or .sdf files, especially when handed off from CAD, URDF, SRDF, or SDF generation skills.
CAD Viewer
Provenance: maintained in earthtojake/text-to-cad. Use the installed local skill files as the runtime source of truth; the repository link is only for provenance and release review. If the user asks to modify, debug, or iterate on CAD Viewer source itself, that is the repository's work, not this skill's — this skill runs the Viewer, it is not where you edit it.
Use this skill to open existing or newly generated CAD, robot-description, or DXF files in CAD Viewer and hand back live review links. The expected input is one or more explicit file paths.
Setup
The Viewer is part of cadgen: install this skill's requirements.txt into a
Python >= 3.11 and the cadgen command carries the server and the prebuilt
client. There is nothing else to install and no Node at run time.
python -m pip install -r requirements.txt
cadgen doctor <this skill's directory> confirms the installed cadgen matches
the version this skill was published against.
Start Viewer
Launching is unconditional: the command below always ends with the URL of a
live Viewer for the launch directory. If one is already running for that
directory with the same Viewer code on disk (the reuse key is
realpath(directory) x an identity token — the cadgen version plus a content
digest of its Python runtime and exact built client, so an upgraded Viewer or a
different --dist never hands back a stale instance), its URL is returned
("action": "reused");
otherwise a new server starts on the first free port from 3245 upward
("action": "started"). Never pick or reason about ports — read the URL the
command prints. Each instance serves ONE directory — the directory it is
launched from — fixed for the life of the process. There is no flag for it:
the cwd IS the served directory.
The base port
3245is0xCAD— "CAD" in hexadecimal.
cd /absolute/project/models && cadgen viewer --host 127.0.0.1 --json
(cadgen must be the one installed from this skill's requirements.txt. If it
is not on PATH, python -m cadgen.viewer with that interpreter is the same
launcher.)
Choose the launch directory deliberately — it is the whole ballgame. The
cwd decides what the catalog SCANS (a project root drags in node_modules,
.git and build output) and it is the instance REUSE key, so launching from
wherever you happen to be can hand back a Viewer serving somewhere else. cd
to the directory the user thinks of as their model workspace — usually the
project's models/ directory — and launch from there. Never launch from
inside this skill's directory: that serves the skill, not the models.
Flags: --json prints the machine-readable last stdout line
({"url", "port", "action": "started"|"reused"}) — always pass it and take the
URL from there. --new forces a fresh instance instead of reusing. An
explicit --port <n> is strict — "this port or fail" — and disables
both reuse and rolling. cadgen viewer --help lists the rest.
URL shape
The page is the bare origin, and file= selects one artifact inside the served root:
http://127.0.0.1:3245/?file=gripper/STEP/gear_rack_gripper.step
The file= value is relative to the served directory. Nothing about the
directory appears in the URL, so the same link means different files under
different instances — the root is the server's, not the link's.
The launch directory is the workspace, not the file's folder. The Viewer
scans it recursively, so the file browser lists every model beneath it and the
user can switch files without a new link. Launch from the directory the user
thinks of as their model workspace — typically the project's models/
directory, or the nearest common parent of the files you were asked to review —
and put the rest of the path in file=. Launching from the artifact's own deep
folder (cd .../models/gripper/STEP, ?file=gear_rack_gripper.step) opens
the same model but hides the rest of the project, which is almost never what
the user wants.
Port collisions are not your problem: the launcher rolls to a free port and the
URL it prints is the truth. In sandboxed agent environments, local binding
failures such as EPERM/EACCES can still occur; rerun with the needed
permission/escalation.
cadgen viewer list shows every running instance with the directory it
serves; cadgen viewer stop --port <n> ends one. (Both run from anywhere —
only launching cares about the cwd.)
To review a directory outside the current root, just cd there and launch
again — reuse-or-start makes the second launch cheap and correct.
Generation is the CAD skill's job; documents compile in the Viewer
The Viewer is a static visualization tool: it renders artifacts that already exist. Generated models must be built first by running their model script (see the CAD skill); the Viewer never runs a script and never learns whether a document has one.
A .step/.stp document's status in the Viewer is one of four, decided from
the file's bytes and the store alone: not compiled (the store has no tree
for these bytes — the Viewer offers to compile, and compiles on open),
compiling · <phase> n/total (a job in cadgen's build pool is producing a
tree whose outputs include this document — the Viewer's own compile, a
python model.py in a terminal, or a parent's child build alike),
rendered, or failed (the last job for it failed; the message is shown).
A compile is a job submitted to the same pool every cadgen door uses, so
progress and errors come back as data. There is no "stale vs source" state:
whether a document is behind its script is cadgen store why's question, not
the Viewer's. When an agent is doing the work there is nothing to run first:
just use the file and return the link.
Links
- Before returning any link, resolve
<directory>/<file>and confirm it exists. Pass the.step/.stpartifact itself — generated and imported alike. The catalog lists artifacts and names them exactly as they read on disk:moonwatch.stepismoonwatch.stepin the tab, the breadcrumb, the catalog row and the file picker, whether it was generated or imported. The Viewer never learns whether a document was generated: its status is artifact-side only (not compiled / compiling / rendered / failed), and the model script is not shown anywhere in the UI. A generated model's document must already exist (run the model script); a document the store has no tree for is compiled from its bytes on open. If the resolved path is missing, do not return the link; report the problem and point to the correct path. - Return one Viewer URL per requested file.
- Start the Viewer once and pick one workspace root for the session. Every link is
the same origin plus
?file=<path relative to that root>, so all of them share one browsable catalog. An artifact outside that root needs its own Viewer — launch again with that root (reuse-or-start makes this idempotent); a link alone cannot reach it. - For directory-only review links, return the origin without
?file=. - Do not stop an existing Viewer server unless the user asks.
- If Viewer startup fails, report the failure and continue with the owning skill's non-GUI validation or artifacts.
References
- Read
references/viewer-features.mdwhen you need supported file types, Viewer controls, or file-specific feature details.
Related skills
More from earthtojake/text-to-cad and the wider catalog.

dfam-check
Measure mesh files against Design for Additive Manufacturing rules and report printability per process.

dxf
Generate and validate 2D DXF drawings from Python build123d sources for laser/plasma/waterjet cutting.

gcode
Generate and validate FDM G-code from 3D meshes using local slicer CLIs.

implicit-cad
Create browser-native implicit CAD models using GLSL signed-distance fields and raymarching.

render
Render CAD and robot files in CAD Explorer with review links and snapshots.

sdf
Author, validate, and hand off SDFormat robot models and worlds to simulators.