
Implicit Cad
Generate browser-rendered implicit CAD models as `.implicit.js` files using GLSL signed-distance primitives and snapshot exports for quick physical or visual prototypes.
Overview
Implicit CAD is an agent skill for the Validate phase that writes shader-native implicit CAD `.implicit.js` files with GLSL SDF primitives and browser snapshots.
Install
npx skills add https://github.com/earthtojake/text-to-cad --skill implicit-cadWhat is this skill?
- Shader-native implicit CAD authoring in `.implicit.js` files
- GLSL SDF primitives for composable solid modeling in the browser
- Default prompt hook for agents to create implicit CAD with snapshots
- Node-based tooling path for running generation scripts locally
- MIT-licensed workflow suitable for indie hardware-adjacent experiments
Adoption & trust: 3 installs on skills.sh; 5.8k GitHub stars.
What problem does it solve?
You want to preview and iterate 3D parts quickly but traditional CAD tools are slow to install and awkward for agent-driven workflows.
Who is it for?
Solo makers prototyping enclosures, brackets, or stylized 3D visuals with agent help and minimal CAD overhead.
Skip if: Production mechanical engineering needing PMI, assemblies, or STEP exchange without additional tooling beyond implicit shaders.
When should I use this skill?
Use when you need browser-rendered implicit CAD `.implicit.js` files with GLSL SDF primitives and snapshot output.
What do I get? / Deliverables
You get runnable implicit CAD source and visual snapshots you can review in the browser or attach to specs before harder manufacturing steps.
- .implicit.js implicit CAD source files
- Rendered snapshot images for review
Recommended Skills
Journey fit
Validate is the canonical shelf because shader-native CAD supports fast shape iteration before committing to mesh pipelines or manufacturing. Prototype subphase matches exploratory geometry and visual proof without a full CAD toolchain install.
How it compares
Browser-first implicit SDF authoring—not a full parametric CAD suite or mesh sculpting app.
Common Questions / FAQ
Who is implicit-cad for?
Indie builders and agent users who want fast implicit solid modeling in JavaScript/GLSL for prototypes and visual checks.
When should I use implicit-cad?
During Validate prototyping when exploring shapes, generating snapshot previews, or drafting `.implicit.js` assets before build-out of manufacturing pipelines.
Is implicit-cad safe to install?
Check the Security Audits panel on this Prism page; skills that run Node scripts may touch the filesystem—review repo scripts before executing locally.
SKILL.md
READMESKILL.md - Implicit Cad
interface: display_name: "Implicit CAD" short_description: "Write shader-native implicit CAD files." default_prompt: "Use $implicit-cad to create browser-rendered implicit CAD `.implicit.js` files with GLSL SDF primitives and snapshots." MIT License Copyright (c) 2026 earthtojake and Gradient Control Laboratories Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #!/usr/bin/env node import { spawnSync } from "node:child_process"; import fs from "node:fs"; import path from "node:path"; import { fileURLToPath } from "node:url"; const scriptsDir = path.dirname(fileURLToPath(import.meta.url)); const packageCli = path.join(scriptsDir, "packages", "implicitjs", "scripts", "export.mjs"); if (!fs.existsSync(packageCli)) { process.stderr.write( `Missing implicitjs export CLI at ${packageCli}. Restore the development symlink layout or rebuild the production skill bundle.\n` ); process.exit(1); } const completed = spawnSync(process.execPath, [packageCli, ...process.argv.slice(2)], { cwd: process.cwd(), stdio: "inherit", }); process.exitCode = completed.status ?? 1; import { IMPLICIT_CAD_SCHEMA } from "../packages/implicitjs/src/lib/implicitCad/schema.js"; export const SCHEMA = IMPLICIT_CAD_SCHEMA; export const PI = Math.PI; export const TWO_PI = Math.PI * 2; export const SQRT2 = Math.sqrt(2); export const SQRT3 = Math.sqrt(3); function numberLiteral(value) { const numeric = Number(value); if (!Number.isFinite(numeric)) { throw new Error(`Expected finite number, got ${value}`); } if (Object.is(numeric, -0)) { return "0.0"; } return Number.isInteger(numeric) ? `${numeric}.0` : String(numeric); } function componentList(value, dimension) { if (typeof value === "number") { return Array.from({ length: dimension }, () => numberLiteral(value)); } if (!Array.isArray(value) && !ArrayBuffer.isView(value)) { throw new Error(`Expected vec${dimension} array or scalar`); } return Array.from({ length: dimension }, (_, index) => numberLiteral(value[index] ?? 0)); } export function vec2(value, y = null) { const components = y === null ? componentList(value, 2) : [numberLiteral(value), numberLiteral(y)]; return `vec2(${components.join(", ")})`; } export function vec3(value, y = null, z = null) { const components = y === null && z === null ? componentList(value, 3) : [numberLiteral(value), numberLiteral(y), numberLiteral(z)]; return `vec3(${components.join(", ")})`; } export function expr(value) { if (value && typeof value === "object" && typeof value.expr === "string") { return value.expr; } if (typeof value === "number") { return numberLiteral(value); } return String(value); } export function glsl(strings, ...values) { return strings.reduce((result, part, index) => ( `${result}${part}${index < values.length ? expr(values[index]) : ""}` ), ""); } function reduceCall(values, callName, radius = null) { const parts = values.map(expr); if (parts.length === 0) { throw new Error(`${c