Slack GIF Creator
anthropics/skills
Provides Slack size and frame limits, Python animation helpers and validators for building animated GIFs sized for emoji and messages.
Generates, regenerates and validates 2D DXF drawings from Python build123d sources for profiles, gaskets, panels and cut layouts, and reviews them in CAD Viewer.
$ npx skills add earthtojake/text-to-cad --skill dxf -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install earthtojake/text-to-cad dxf --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/earthtojake/text-to-cad.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/dxf .claude/skills/dxf && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "dxf" agent skill from https://github.com/earthtojake/text-to-cad/tree/main/skills/dxf into .claude/skills/dxf/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dxf", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/earthtojake/text-to-cad/tree/main/skills/dxfType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add earthtojake/text-to-cad --skill dxf -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install earthtojake/text-to-cad dxf --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/earthtojake/text-to-cad.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/dxf .agents/skills/dxf && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "dxf" agent skill from https://github.com/earthtojake/text-to-cad/tree/main/skills/dxf into .agents/skills/dxf/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dxf", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add earthtojake/text-to-cad --skill dxf -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install earthtojake/text-to-cad dxf --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/earthtojake/text-to-cad.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/dxf .cursor/skills/dxf && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "dxf" agent skill from https://github.com/earthtojake/text-to-cad/tree/main/skills/dxf into .cursor/skills/dxf/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dxf", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/earthtojake/text-to-cad.git --path skills/dxf--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add earthtojake/text-to-cad --skill dxf -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install earthtojake/text-to-cad dxf --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/earthtojake/text-to-cad.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/dxf .gemini/skills/dxf && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "dxf" agent skill from https://github.com/earthtojake/text-to-cad/tree/main/skills/dxf into .gemini/skills/dxf/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dxf", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install earthtojake/text-to-cad dxfInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add earthtojake/text-to-cad --skill dxf -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/earthtojake/text-to-cad.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/dxf .github/skills/dxf && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "dxf" agent skill from https://github.com/earthtojake/text-to-cad/tree/main/skills/dxf into .github/skills/dxf/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dxf", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add earthtojake/text-to-cad --skill dxf -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install earthtojake/text-to-cad dxf --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/earthtojake/text-to-cad.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/dxf .opencode/skills/dxf && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "dxf" agent skill from https://github.com/earthtojake/text-to-cad/tree/main/skills/dxf into .opencode/skills/dxf/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dxf", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
dxfGenerates, regenerates and validates 2D DXF drawings from Python build123d sources for profiles, gaskets, panels and cut layouts, and reviews them in CAD Viewer.
A drawing is a model. Its source is a Python file defining one parameterless `@dxf` function that returns build123d 2D geometry, and the engine writes the `.dxf`, so the agent never builds a document, names a file or places entities by hand. Each run writes the sibling `.dxf`, an unchanged source is a no-op, and a drawing that calls a part model goes stale only when that part's geometry changes. `cadgen store why` explains the verdict and `--force` rebuilds anyway. The viewer, the snapshot and a cutting service all read the same `.dxf` file.
Commands run `cadgen` through `uv` with a pinned version so they share one installation and warm build daemon with the CAD app's server, and `cadgen doctor` checks the installation and CAD kernel. `cadgen dxf snapshot` needs no Node: it flattens the drawing with `ezdxf` and renders it in a bundled headless browser. Use cases include outlines, templates, gaskets, panels, flat patterns and laser, plasma or waterjet cut layouts, plus 2D exports of existing CAD geometry.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 523ae21. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
pythonuvxFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
docs.astral.shFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
DXF Drawing Generation loads about 4.3k tokens when it runs, and up to ~5.8k if it reads all its reference files. Until then it costs about 85 tokens; SKILL.md has 2,284 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from earthtojake/text-to-cad at commit 523ae21, republished under its MIT licence (© earthtojake). 2,284 words, ~4,295 tokens.
.claude/skills/dxf/SKILL.md (or your agent's skills folder). This skill also uses 3 other files; get the full folder from GitHub.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.
Run cadgen through uv, so this skill's commands share one installation, and its warm build daemon, with the CAD app's server:
cadgen below means uvx --no-config --managed-python --python 3.13 --from cadgen==0.7.19 cadgenpython below means uvx --no-config --managed-python --python 3.13 --from cadgen==0.7.19 pythonThe first run downloads that installation and the first snapshot its headless browser; later runs reuse both.
cadgen doctor <skill-dir> reports the installation in use and checks that it is
the one this skill pins, and that the CAD kernel loads; use it for installation or
kernel load errors.
Drawings are build123d geometry, so a drawing build loads the CAD kernel like a
STEP build does (~2.5s cold; the warm daemon absorbs it on re-runs).
cadgen dxf snapshot needs no Node at all: it flattens the drawing with ezdxf
(which arrives with cadgen) and paints it in the bundled headless browser.
Create or modify 2D DXF drawings from natural-language requirements or from CAD
geometry, generate validated drawing artifacts, and return checked outputs. A
DXF drawing's source of truth is a Python file named <name>.py defining one
parameterless @dxf model function.
A drawing is a model. It has the same wrapper, record, freshness gate and
build job a @step part has; its one output is the .dxf file; it has no
geometry tree (nothing links to a drawing). Every run writes the sibling
<name>.dxf (or the out= the decorator names); an unchanged source is a
no-op; a drawing that calls a part model — bracket() inside its body — is
stale whenever that part's GEOMETRY changes and current when it does not;
cadgen store why <drawing>.py explains the verdict; --force rebuilds it
anyway. The CAD Viewer and dxf snapshot read the .dxf file itself, so the
file you hand a cutting service, the file the viewer draws and the file a
snapshot renders are one and the same.
A @dxf function takes no parameters and returns build123d 2D geometry. The
engine writes the DXF. You never construct a document, name a file, or place
an entity — the same division of labor @step has.
from cadgen import build123d as bd
from cadgen import dxf
HOLE_D = 4.5
@dxf
def gasket():
with bd.BuildSketch() as cut:
bd.Rectangle(60, 40)
bd.Circle(HOLE_D / 2, mode=bd.Mode.SUBTRACT)
return cut.sketch # bare shape -> the CUT layer
if __name__ == "__main__":
gasket()CUT layer. That is the whole contract for most drawings.{layer: shape} → named layers, when the drawing genuinely has more than
one CAM operation (CUT / ENGRAVE / SCORE). A Compound whose children
are all labelled means the same thing.HOLE_D = 4.5) or
constants imported from the part the drawing derives from; a different
drawing is a different file.bd.Text(...) engraved OUTLINES on a marking layer, never a DXF
TEXT entity: cut and marking toolchains consume geometry, and font rendering
inside CAM is unreliable.flatten.flatten_face(face), or
bd.Location((0, 0, -z)) * face). The engine REFUSES off-plane geometry rather
than silently writing its XY shadow.Copy the full template for the applicable workflow from
references/generator-templates.md when creating a new drawing.
Drafted from scratch (gaskets, panels, templates, cut layouts with no 3D
model behind them): a <name>.py that builds sketches and returns them.
Flat pattern of a generated STEP part: a drawing script beside the model
it derives from, with its OWN stem (one model per file — bracket_drawing.py
beside bracket.py). Import the model and call it, exactly as an assembly
composes a child: importing never builds, and inside the drawing's build the
call returns the part's geometry (building the part first if it is stale).
from cadgen import dxf, flatten
from bracket import bracket # a child: tracked by its RESULT
KERF = 0.15
@dxf
def bracket_drawing():
return flatten.flat_pattern(bracket(), coordinate=3.0, kerf=KERF)
if __name__ == "__main__":
bracket_drawing()The drawing's record pins the part's tree, so a part edit that changes its
geometry makes the drawing stale, and one that does not (a comment, a
refactor, a colour) leaves it current. Constants imported from the part
(from bracket import THICKNESS) are tracked by value the same way.
Flat pattern of an imported STEP (a .step/.stp with no Python source):
read it with cadgen.read_step (warm from the store, the same geometry as
build123d.import_step). Like every file a build reads, it is an input:
replacing the vendor STEP makes the drawing stale on its own, with no --force.
from pathlib import Path
from cadgen import dxf, flatten, read_step
_HERE = Path(__file__).resolve().parent
KERF = 0.15
@dxf
def panel_flat():
panel = read_step(_HERE / "imported" / "vendor_panel.step") # recorded input
return flatten.flat_pattern(panel, coordinate=3.0, kerf=KERF)
if __name__ == "__main__":
panel_flat()Never read a STEP this project generates. Reading the .step a @step
model writes is not a loop, it is a drawing whose input changes on every run of
the model: the freshness gate can never say "current", every build is a full
rebuild, and the flat pattern depends on what the last run left on disk. Keep
source STEPs in an imported/ directory beside the drawing, committed like any
other input — input path and output path being different files is the whole
rule. For a STEP this project DOES generate, use workflow 2 instead: import the
model script and call it, which is tracked by result and never touches an
artifact.
One model per file is the recommendation, and a drawing gets its own script:
a file MAY declare several models — two @dxf drawings, or a @dxf beside a
@step — and each is its own record, output and job (a sole model writes
<file>.dxf; models sharing a file write <function>.dxf), but they share the
file's closure, so editing one rebuilds them all. A drawing composes models,
never the reverse: calling a @dxf function from a @step body is just its 2D
geometry and links nothing. The viewer catalog is artifacts-only: scripts never
list; the .dxf the run writes is the entry the viewer renders.
Use this skill when the user asks for DXF files, 2D drawings, profiles, outlines, templates, gaskets, panels, flat patterns, or cut layouts for laser, plasma, waterjet, or CNC routing.
Use $cad for the 3D part or assembly a DXF derives from. Use $sendcutsend for
SendCutSend-specific upload preflight.
Use these defaults unless the user specifies otherwise:
cadgen.flatten rather than redrawing them: planar_faces selects,
flatten_face lays a face into XY exactly, union_faces fuses, and
flat_pattern does all of it in one call. Hand-drawn parametric outlines only
when there is no reliable 3D topology.flatten.offset_profile(shape, amount) or
flat_pattern(..., kerf=...); never hand-offset coordinates.ARC and a hole as a CIRCLE, kerf included. A
profile that comes out as hundreds of short LINEs means something fell back
to the sampled path — investigate rather than accept it.python <drawing>.py [flags] # its __main__ calls the @dxf model, which writes the .dxf
cadgen dxf snapshot <drawing.dxf> <file.png> # render it
cadgen store why <drawing>.py # why the drawing is stale or currentRunning the script (its __main__ call) is the only door. There is no
cadgen dxf build: a .dxf has no derived state a command must materialize —
the file IS the product, and both the CAD Viewer and dxf snapshot draw it
straight from its own bytes. The drawing's gate makes a rebuild cheap: an unchanged
source whose .dxf still verifies and whose part children are unchanged is a
no-op, and --force rebuilds anyway. The bytes are a function of the
drawing's GEOMETRY, so a cold run and a warm daemon worker write the same
file. Builds never wait on or cancel one another; a drawing that calls parts
builds them in parallel like any parent.
An imported .dxf needs nothing at all — hand it straight to snapshot or the
Viewer.
Use the active project Python interpreter; treat python as an interpreter
placeholder, and use --help for the full interface. Target paths resolve from
the command's current working directory; run from the workspace that owns the
artifacts with cwd-relative target paths. Keep a drawing script in the same
directory as the geometry it derives from, named <name>.py.
Flags (a model script runs itself; there is no generation CLI):
--force — regenerate even when the recorded output is current.--verbose, --json.A run answers on stdout exactly as a STEP model's does — built DXF/plate_drawing.dxf
or current DXF/plate_drawing.dxf — with progress on stderr; --json makes the
result one JSON line (outcome, document, and tree, which is null for a
drawing) and the progress one JSON line per transition.
One script, one drawing: run each script you want built. Do not put output paths
in the @dxf function's return value; out= on the decorator is the only
place a drawing names its destination (relative to the script).
cadgen dxf snapshot draws a drawing flat, to a PNG still — the same picture
the CAD Viewer shows, from the same flattening, through the same drawing code:
cadgen dxf snapshot path/to/imported.dxf review.png
cadgen dxf snapshot path/to/drawing.dxf review.png --appearance darkIt takes the .dxf document only — a model script is refused by name (run
python <drawing>.py, then snapshot the drawing it wrote). The whole drawing is
fitted to the image and painted head on, in the pens the file declares; an
entity with no pen of its own (ACI 7) takes the appearance's foreground on its
background. The command flattens the drawing with ezdxf and renders it through
the shared snapshot CLI (cadgen.snapshot_cli) and the same headless browser
runtime every rendering skill uses.
OUT — the second positional — is written exactly as given, with a relative path resolved against the
current working directory. The target is deleted before the render starts and the
finished image is written atomically, so: reuse one name while iterating (every read
is provably the render you just ran), name the iterations when you genuinely need to
compare two. Invalid request combinations fail before touching OUT; after a request is
accepted, OUT is cleared first so a later failure leaves a missing file instead of
a stale image. A directory (tmp/ as OUT) is the
don't-care case and gets a generated timestamped name inside it, printed on the
saved snapshot: line.
Grammar: cadgen dxf snapshot TARGET [OUT] [flags]. Flags: --appearance light|dark, --size-profile, --width/--height, --job, --debug,
--json. That is the whole surface: a drawing is not a scene, so there is no
camera to pose, no display settings to configure, no render mode, no parts to
list, no section to cut and no view to label — --camera, --display,
--mode and --view-labels are not flags this command has. A --job file that
carries any of them (or scale, an output label/viewLabel, or
output.padding/viewLabels/tightFrame) is refused by name before anything
is rendered; a job's output.renderScale and output.transparent still apply.
No CLI inspects an existing .dxf. For entity/layer checks read it with ezdxf
directly (it arrives with build123d), and validate_dxf_file for the drawing checks;
review geometry visually (see Show the model).
$cad first), or flat pattern of an imported STEP.<name>.py source with meaningful dimensions as named constants, reusing the model's geometry helpers instead of duplicating formulas.python <drawing>.py); do not sweep directories.python path/to/source.py
python path/to/source.py --forceShow the user each file you create or change, and any they ask to see. Snapshots and validation don't replace this.
If your tools include cad_show (your host may prefix it), use it with the file's
absolute path, and follow its description for when to call it again. cad_view reads
what the user selected; cad_screenshot shows you what they see. Neither is a review
of your own work.
Otherwise run the CAD Viewer, from any folder:
cadgen viewer --host 127.0.0.1 --json --detach--detach returns once the viewer answers requests and leaves it running in the
background: always pass it, since a foreground viewer never exits (and piping its
output through tail can hide the URL for good). It starts this machine's one viewer,
or reuses it. Read url from its one JSON line (never guess the port), and for each
file return url?file=<its URL-encoded absolute path>. If it fails to launch, say so.
The viewer renders saved DXF files as read-only 2D drawings; it never runs generation scripts. Drag to pan, wheel/pinch to zoom, double-click to fit.
Validation happens IN generation, not after: every @dxf build runs the drawing
checks on the document the engine just serialized, before anything is written, and
a build with error findings fails. The checks: cut-layer profiles must close
(polylines, circles, or chained line/arc loops), zero-length/degenerate entities are
rejected, exact duplicate geometry (double-cut risk) is rejected, explicitly unitless
documents are rejected, and an empty modelspace is rejected. Open geometry is allowed
only on bend/engrave/reference-intent layers (matched by name).
The same checks run post-hoc on any existing .dxf file — including one that
never came from a generator — through cadgen.drawing_checks:
from cadgen.drawing_checks import validate_dxf_file
for finding in validate_dxf_file("path/to/file.dxf"):
print(finding.render())Beyond the built-in checks, verify requested dimensions with targeted ezdxf reads
(entity counts by layer, drawing extents, every dimension the user specified) against
the generated sibling .dxf (or the out= path when one is declared), and
review geometry visually in the CAD Viewer:
import ezdxf
doc = ezdxf.readfile("path/to/source.dxf")
msp = doc.modelspace()
cut = msp.query('*[layer=="CUT"]')
holes = msp.query('CIRCLE[layer=="CUT"]')Report only checks that actually ran.
Show every drawing you created or changed (Show the model). Report any failure explicitly.
Final responses should include generated files, returned viewer links, validation actually run, and assumptions.
© earthtojake, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 3 other files (references) in skills/dxf of earthtojake/text-to-cad.
Open the folder on GitHubat commit 523ae21
We found 1 copy of this SKILL.md (exact, near-identical or edited) in other folders, from 1 other GitHub owner. This page covers the copy in earthtojake/text-to-cad, which our catalogue first saw on October 7, 2026.
DXF Drawing Generation next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| DXF Drawing Generation this skillearthtojake/text-to-cad | 19k | 1 repos | ~4.3k | Automated safety check: Pass | MIT | |
| Slack GIF Creatoranthropics/skills | 180k | 29 repos | ~2k | Automated safety check: Pass | Apache-2.0 | |
| Structured Image Generationbytedance/deer-flow | 84k | 4 repos | ~2.9k | Automated safety check: Pass | MIT | |
| Video Generationbytedance/deer-flow | 84k | 3 repos | ~1.4k | Automated safety check: Pass | MIT | |
| Mobile Demo Film Editorsuperset-sh/superset | 15k | — | ~1.8k | Automated safety check: Pass | Custom licence | |
| Capcut Editrenezander030/capcut-cli | 847 | — | ~1.4k | Automated safety check: Pass | MIT |
anthropics/skills
Provides Slack size and frame limits, Python animation helpers and validators for building animated GIFs sized for emoji and messages.
bytedance/deer-flow
Turns an image request into a structured JSON prompt and runs a bundled Python script to generate the picture, optionally guided by reference images.
bytedance/deer-flow
Generates short videos from a structured JSON prompt, optionally guided by a reference image used as the first or last frame.
superset-sh/superset
Edits real mobile screen recordings into a configurable demo video with phone framing, title cards, cutaways and an end card, using a bundled renderer.
renezander030/capcut-cli
Edit CapCut / JianYing video projects — read and write subtitles, timing, speed, volume, templates, animations (fade/ken-burns), and cut long-form to shorts.
AI-Builder-Club/skills
Create animated flow diagrams from articles, workflow notes, architecture sketches, or process descriptions using a JSON specification and a local Python/Pillow renderer.
earthtojake/text-to-cad
Measures STL, OBJ, PLY or 3MF mesh files against additive manufacturing design limits and reports printability findings for each print process.
earthtojake/text-to-cad
Find, evaluate, and download common purchasable CAD parts from step.parts, including named off-the-shelf actuators, servos, motors, electronics boards, connectors, screws, bolts, nuts, washers…
earthtojake/text-to-cad
Guided DFM review of a part for sheet metal, CNC machining or injection molding, covering bends, tool access, draft and undercuts, with evidence-first measurement rules.
earthtojake/text-to-cad
Slices STL, 3MF or OBJ models into printer-ready G-code with OrcaSlicer, either headless from the command line or by opening the model in the app.
earthtojake/text-to-cad
Guides writing, editing and validating URDF robot description files, with a design ledger, exact frame semantics and computed inertials checked by a validator.
earthtojake/text-to-cad
Authors, validates and reviews SDFormat XML for simulator models and worlds, with explicit frames, SI units and a design ledger.
Works with
Categories
Generates, regenerates and validates 2D DXF drawings from Python build123d sources for profiles, gaskets, panels and cut layouts, and reviews them in CAD Viewer. A drawing is a model.dxf`, so the agent never builds a document, names a file or places entities by hand.
DXF Drawing Generation fits situations like: creating a 2D DXF outline or panel for laser, plasma or waterjet cutting; regenerating a DXF after changing the Python drawing source; exporting a 2D drawing of existing CAD geometry; visually reviewing an existing DXF file.
Run `npx skills add earthtojake/text-to-cad --skill dxf -a claude-code`. Or copy the skill folder (skills/dxf in earthtojake/text-to-cad) into .claude/skills/dxf in your project. Claude Code loads it when a task matches its description.
Run `npx skills add earthtojake/text-to-cad --skill dxf -a codex`. Or copy the skill folder (skills/dxf in earthtojake/text-to-cad) into .agents/skills/dxf in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add earthtojake/text-to-cad --skill dxf -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/dxf, .gemini/skills/dxf, .github/skills/dxf and .opencode/skills/dxf in your project.
Going by SKILL.md and its folder, DXF Drawing Generation needs the command-line tools its instructions call (python and uvx). Our summary lists: `uv`, which runs the pinned `cadgen` tool and its Python; Network access on the first run to download the installation and headless browser.
SKILL.md names 1 domain. As links in the text: docs.astral.sh. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
DXF Drawing Generation is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.3k tokens (SKILL.md is roughly 17k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 1.6k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with DXF Drawing Generation: Slack GIF Creator (anthropics/skills, 180k stars), Structured Image Generation (bytedance/deer-flow, 84k stars), Video Generation (bytedance/deer-flow, 84k stars) and Mobile Demo Film Editor (superset-sh/superset, 15k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
earthtojake (a GitHub user) maintains it in earthtojake/text-to-cad, which has 18,560 GitHub stars. The repository holds 12 skills in this directory. The repository was last updated on October 9, 2026.
Source: earthtojake/text-to-cad on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.