Project Info
Inspiration
Claude can write, reason, and code — but it has no hardware branch. It lives entirely in software; it can describe a phone stand, but it can't hand you one. We wanted to change that: to give Claude a way to reach out of the screen and put a real, physical object in your hands. At the opening ceremony, the call was to go for big swings — the biggest swing at a meaningful problem. So we picked one. 3D printers are now cheap and everywhere, but adoption is still stuck, and the reason isn't the hardware. It's that the average person needs roughly 600 hours to become competent in CAD software like Blender or Fusion 360 — and most still can't produce something that prints without failing. Professional modeling costs $50–$500 per part, CAD licenses run ~$2,000/year, and even then you have to learn orientation, supports, wall thickness, tolerances, and splitting on your own. The barrier to 3D printing was never the printer. It was design expertise. So we built the thing that supplies it — and gave Claude its hardware branch in the process. We called it Claudeware. What It Does You describe any object in plain English — "a gear with 24 teeth," "a threaded M10 bolt," "a chubby sitting dragon" — and Claude designs it, makes it printable, shows it forming live in a 3D viewport you can orbit and drag, inspects its own render and fixes its own mistakes, and exports a print-ready file for the printer you already own. The flow is six steps, and Claude drives all of them: Describe — type, speak, or pick a prompt. Clarify — Claude asks prompt-specific questions first. A dragon gets asked about wings, scales, and pose; a bolt gets asked about thread pitch and length. No generic templates. Design — the model builds step-by-step, live, in a react-three-fiber viewport you can orbit, zoom, and drag while it's still forming. Open the native CAD app alongside (OpenSCAD, Blender, or Fusion) and the same build appears there too — dual view, web and desktop. Validate — four automatic printability checks run on the finished mesh (watertight geometry, single body, overhangs, wall thickness) and produce a 0–100 readiness score. Prepare — Claude auto-orients the model for the best print and exports real files: STL, OBJ, 3MF for a Bambu A1, and actual G-code sliced by PrusaSlicer, with real supports, real layer counts, and real filament estimates — not guesses. Print — send to the printer with one click. Too big for the bed? Claude splits it into parts joined by push-fit connectors — 5.4 mm pegs into 5.6 mm sockets, a 0.2 mm engineered clearance that snaps together without glue. The core idea is that no single engine is right for every object, so Claudeware isn't one tool — it's five engines behind one brain, with an Auto mode that classifies the prompt and routes it: OpenSCAD + BOSL2 for mechanical parts (real involute gears, real threads) Blender (bpy) for organic shapes you watch sculpt live Fusion 360 (adsk) for precision multi-part assemblies NVIDIA NIM (TRELLIS) for full-color textured characters Auto so the user never has to know the difference between parametric and organic modeling And unlike every other text-to-3D tool that hands you a mesh and wishes you luck, Claudeware checks its own work — it renders the result, scores it for likeness with computer vision, and regenerates if it falls short, with no human in the loop. How We Built It The frontend is Next.js + TypeScript + Tailwind with a react-three-fiber / drei viewport. UI and backend talk through exactly one contract — a typed AgentEvent stream over Server-Sent Events — so the UI is pure (events in, JSX out) and never imports backend logic. At the center is a single orchestrator, /api/generate, that runs the loop classify → clarify → resolve engine → generate → finish. Auto routing classifies the prompt and dispatches to one of four engines, each running as a subprocess with a timeout: OpenSCAD — Claude writes staged parametric SCAD with the vendored BOSL2 library Blender — Claude writes staged bpy Python, driven live over the BlenderMCP socket straight from Node (no MCP client needed), with a headless fallback Fusion 360 — Claude writes adsk scripts POSTed to Fusion's own HTTP MCP NVIDIA NIM — TRELLIS text-to-3D → textured GLB + STL Crucially, Claude writes a recipe — the actual SCAD/bpy/adsk script — not a frozen mesh. That's what makes "edit it by prompt" real: each prompt patches the script and re-runs into a new, diff-able version. The finish tail is the part nobody else builds: a Print Brain computes dimensions, supports, and split decisions from the mesh, and a Print-Readiness pipeline runs four real checks (manifold via open-edge count, floaters via connected-component analysis, overhang fraction via face normals, thin-feature heuristics), auto-orients by scoring the six axis-aligned poses, and exports 3MF/OBJ/G-code through a forked PrusaSlicer CLI. A self-inspect step renders the result and asks Claude vision to score likeness, triggering one bounded auto-fix retry. Every external service — Deepgram, Redis, Browserbase, The Token Company, Arize, Sentry, InsForge — sits behind a key-gated interface with a working fallback, so the whole app boots with zero keys. We TDD'd the pure logic throughout: 216 tests across 40 files, a clean production build, and cached fixtures as a wifi-death safety net. Challenges We Ran Into The LLM is a subprocess that can time out. Complex prompts made Claude reason past the claude -p time limit mid-write, so a threaded jar or an L-bracket would silently fall back to a generic block. We root-caused it with systematic debugging (the failed build's clock landed exactly on the timeout) and fixed it by pinning the script writers to Sonnet, which writes good CAD roughly twice as fast and finishes under the limit. A hidden concurrency starve. The bug's tell was "it always fails when starting a new session, then works after." The cause: classify, clarify, and generate each fire their own claude -p at once and starve the shared CLI — tipping an already-slow call over the edge. Non-obvious, and only findable by tracing the timing. BOSL2 dropping geometry silently. A bolt rendered as just its hex head because BOSL2's part libraries (threads, gears, bearings) are separate files from the core — so threaded_rod() was an unknown module that OpenSCAD drops with a warning, not an error. We had to re-prepend the full library set on every stage and start treating render warnings as signal. NVIDIA's endpoints fighting back. The hosted TRELLIS text-to-3D endpoint intermittently 500s and sometimes returns an empty/queued artifact under load; we built retry-with-polling to lift the success rate from ~1-in-3 to ~90%. The image-to-3D endpoint 500s server-side even with the correct upload flow, so we pivoted: Claude vision describes the reference image in text and we feed that into the working text-to-3D path. Driving real CAD apps live. Blender's MCP is a Claude Desktop extension, not a Claude Code server, so we drove the addon's localhost socket directly from the backend; Fusion we drove over its own HTTP MCP. Both had sharp edges (scope-poisoning imports, units in cm vs mm) to file down. Keeping a frozen design intact. A hard rule of the project was not to touch the frozen UI, so the entire print-readiness and assembly backend had to be built additively behind the AgentEvent contract until a deliberate "change the design" go-ahead. Accomplishments That We're Proud Of We gave Claude a hardware branch. It can now turn a sentence into a physical object you can hold. Five engines, one brain — a genuine multi-engine system with Auto routing, not a one-trick demo. Mechanical parts, organic figures, precision assemblies, and textured characters all from one prompt box. AI that checks its own work — the render → vision-score → auto-fix loop is the differentiator, and it runs with no human in the loop. A real manufacturing pipeline, not a toy. Actual G-code from PrusaSlicer, real BOSL2 involute threads, and engineered 0.2 mm push-fit tolerances that snap together without glue. Zero-key boot. The entire app runs and demos with no API keys at all — every integration degrades gracefully instead of breaking. Production-grade under hackathon time — 216 tests across 40 files, a clean build, and 8 sponsor integrations each doing real work behind a fallback. What We Learned The biggest model isn't always the right one. Under a latency budget, faster mid-size models (Sonnet, Haiku for classification) beat the largest model that reasons past the timeout. Right-sizing the model to the task is an engineering decision, not a default. Treat the LLM like any other subprocess — bound it with timeouts and retries, and assume it can fail or hang. One bad generation must never hang the loop. Generation isn't the hard part; printability is. Every other text-to-3D tool stops at the mesh. The real value — and the real engineering — lives in the orientation, checks, splitting, and slicing that turn a shape into something that actually prints. Honest fallbacks beat silent ones. Surfacing the real failure reason ("Claude ran past the limit → generic shape," "Blender isn't connected") makes the product trustworthy; a silently faked result destroys trust the moment it's caught. The "recipe, not a mesh" abstraction is what makes edit-by-prompt real — and it's worth designing for up front rather than retrofitting. What's Next for Claudeware True likeness via image-to-3D — a self-hosted TRELLIS or an image-accepting provider (Rodin/Tripo/Meshy) so a reference photo reproduces an accurate model, not just a loose guide. Staged complex builds — stage the Fusion and OpenSCAD builds the way Blender already is, to beat the single-shot ceiling on multi-feature parts and assemblies. Serialize the generate route so classify/clarify/generate stop share-starving the shared model at session start. Real auto-repair transforms — auto-thicken thin legs, and decompose complex models into separate printable parts nested on a single plate with library connectors. Close the loop to the printer — OrcaSlicer G-code and a real one-click send to a Bambu over LAN, plus a printer cam to watch it print. A fuller voice agent (Deepgram end-to-end) and broader model-repo search with authenticated downloads.
Claude Hardware
Describe it. We make it printable.
Claude Hardware is an AI-powered 3D printing design studio. Describe any object in plain language — a phone stand, a dragon figurine, a threaded bolt — and Claude designs it, makes it printable, shows it forming live in a 3D viewport you can orbit and drag, inspects its own render, fixes its own mistakes, and exports a print-ready file for your printer.
The barrier to 3D printing isn't the printer — it's design expertise. We supply it.
Built with Claude Code during CAL AI HACKATHON 2026. Track: Lab.
What it does
- Describe — type, speak, or pick a prompt ("a gear with 24 teeth", "a chubby sitting dragon")
- Clarify — Claude asks smart, prompt-specific questions (style? size? pose?) before building
- Design — watch the model build step-by-step in a live 3D viewport (and optionally in a real CAD app)
- Validate — automatic printability checks (watertight, wall thickness, overhangs, single body)
- Prepare — auto-orient, export STL/OBJ/3MF/G-code, real slicing with PrusaSlicer
- Print — send to your Bambu A1 (or any printer) with one click
5 engines, 1 brain
| Engine | Best for | How it works |
|---|---|---|
| OpenSCAD | Mechanical parts, gears, bolts, brackets | Claude writes parametric SCAD scripts with BOSL2 — real threads, real gears |
| Blender | Organic shapes, figurines, artistic models | Claude writes staged bpy Python — live build in Blender or headless |
| Fusion 360 | Precise CAD, assemblies, multi-part prints | Claude writes adsk scripts via Fusion's HTTP MCP — watchable in Fusion |
| NVIDIA NIM | Textured figurines, characters, creatures | TRELLIS text-to-3D — textured GLB preview + printable STL |
| Auto | Everything (default) | Claude classifies your prompt and picks the right engine |
Plus Clean in Blender (post-step) and Model Search (find existing models before generating).
Sponsor integrations
| Sponsor | What it powers |
|---|---|
| Anthropic (Claude) | The brain — designs, classifies, clarifies, self-inspects, fixes |
| Arize AX | LLM observability — traces every Claude call, generation pipeline spans, LLM-as-judge evaluator |
| Deepgram | Voice input — speak your idea instead of typing |
| NVIDIA NIM | TRELLIS text-to-3D for textured organic models |
| Redis | Semantic generation cache + vector search + agent memory |
| Browserbase | Live web search of free model repos (Printables) — reuse before regenerate |
| The Token Company | Prompt compression — cuts Claude token costs via bear-2 |
| InsForge | Auth (Google OAuth) + database (per-user projects) + file storage |
Every integration is key-gated with a working fallback — the app boots and demos with zero keys.
Quick start
# Clone
git clone https://github.com/vraj00222/Claudware.git
cd Claudware
# Install dependencies
npm install
# Set up environment
cp .env.example .env.local
# Fill in your API keys (see "Environment variables" below)
# Install system tools (Ubuntu/Debian)
sudo apt-get install -y openscad blender prusa-slicer
# Clone BOSL2 for OpenSCAD mechanical parts
git clone https://github.com/BelfrySCAD/BOSL2.git tools/openscad-libs/BOSL2
# Build + run
npm run build
npm run dev
# → http://localhost:3000
Routes
| Route | What |
|---|---|
/ | Animated landing page |
/app | Studio (behind Google sign-in; "continue without signing in" for dev) |
/projects | Your saved projects gallery |
/profile | Account + sign out |
Environment variables
Copy .env.example to .env.local and fill in:
| Variable | Required? | What |
|---|---|---|
ANTHROPIC_API_KEY | Yes for real generation | Claude API key — the brain |
NVIDIA_NIM | For textured figurines | NVIDIA NIM key (nvapi-...) from build.nvidia.com |
DEEPGRAM_API_KEY | For voice input | Deepgram STT key |
REDIS_URL | For semantic cache | redis://localhost:6379 or Redis Cloud URL |
BROWSERBASE_API_KEY | For live model search | Browserbase API key |
BROWSERBASE_PROJECT_ID | For model search | Browserbase project ID |
TTC_API_KEY | For token savings | The Token Company API key |
ARIZE_SPACE_ID | For LLM tracing | Arize AX Space ID (from app.arize.com settings) |
ARIZE_API_KEY | For LLM tracing | Arize AX API Key |
NEXT_PUBLIC_INSFORGE_URL | For auth + persistence | InsForge project URL (browser) |
NEXT_PUBLIC_INSFORGE_ANON_KEY | For auth + persistence | InsForge anon key (browser) |
INSFORGE_URL | For server storage | InsForge URL (server-only) |
INSFORGE_API_KEY | For server storage | InsForge admin key (server-only) |
Zero-key boot: the app works with NO keys — deterministic generation, localStorage persistence, Web Speech voice, in-memory cache. Real keys unlock real generation.
Optional: live CAD sync
- OpenSCAD: open
tools/_watch/model.scadwith Design → Automatic Reload — watch the same build in the native app - Blender: N-panel → BlenderMCP → Connect (socket 9876) — watch Claude build in your Blender window
- Fusion 360: HTTP MCP on
127.0.0.1:27182— watch parts build in Fusion
Architecture
┌─────────────────────────────────────────────────────────┐
│ Frontend (Next.js + Tailwind + react-three-fiber) │
│ "Hardware Paper" design system — warm light, terracotta│
│ Pure components: AgentEvent in → JSX out │
└───────────────────────┬─────────────────────────────────┘
│ SSE (AgentEvents)
┌───────────────────────▼─────────────────────────────────┐
│ /api/generate — the orchestrator │
│ classify → clarify → resolve engine → generate → finish│
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌────────────┐ │
│ │ OpenSCAD │ │ Blender │ │ Fusion │ │ NVIDIA NIM │ │
│ │ (BOSL2) │ │ (bpy) │ │ (adsk) │ │ (TRELLIS) │ │
│ └──────────┘ └──────────┘ └──────────┘ └────────────┘ │
│ + validate + estimate + printplan + storage upload │
└───────────────────────┬─────────────────────────────────┘
│
┌───────────────────────▼─────────────────────────────────┐
│ Integrations (all key-gated, all have fallbacks) │
│ Voice→Deepgram(Web Speech) · Cache→Redis(in-mem) │
│ Auth→InsForge(zero-key) · Search→Browserbase(curated) │
│ Compress→TTC(passthrough) · Telemetry→Sentry(no-op) │
└─────────────────────────────────────────────────────────┘
Key files
| Path | What |
|---|---|
src/app/api/generate/route.ts | The main generation endpoint — SSE orchestrator |
src/server/openscad.ts | OpenSCAD engine (Claude → SCAD + BOSL2 → render → STL) |
src/server/blender.ts | Blender engine (Claude → bpy → live/headless → STL) |
src/server/fusion.ts | Fusion engine (Claude → adsk → HTTP MCP → STL) |
src/server/meshgen/nim.ts | NVIDIA NIM TRELLIS (text → textured GLB + STL) |
src/server/engineRoute.ts | Auto-routing classifier (prompt → best engine) |
src/server/printPlan.ts | Print Brain — dims, supports, split decision |
src/server/printReady/ | Print Readiness v2 — diagnose, orient, export 3MF/OBJ/G-code |
src/server/claude.ts | Shared Claude API client (claudeText + claudeVision) |
src/server/genCache.ts | Redis semantic cache + vector search |
src/server/agentMemory.ts | Redis agent memory (cross-session learning) |
src/lib/agentStream.ts | Client-side SSE consumer → AgentEvents |
src/components/ | Pure UI components (frozen design) |
src/viewport/ | react-three-fiber 3D viewport |
frontend/ | Claude Design export — the design contract (read-only) |
The generation pipeline
User prompt
│
▼
┌─ Classify (Claude Haiku) ──────────────────────────┐
│ Is this mechanical? organic? a character? │
│ → route to the right engine │
└──────────────────────┬─────────────────────────────┘
│
┌──────────────────▼──────────────────┐
│ Clarify (prompt-specific) │
│ Dragon → style? wings? size? │
│ Bracket → dimensions? mounting? │
└──────────────────┬──────────────────┘
│
┌──────────────────▼──────────────────┐
│ Generate (engine-specific) │
│ Claude writes the recipe │
│ (SCAD / bpy / adsk / NIM call) │
│ Streams mesh stages → viewport │
└──────────────────┬──────────────────┘
│
┌──────────────────▼──────────────────┐
│ Finish │
│ Validate · Estimate · Print Plan │
│ Storage upload · Summary │
│ Optional: Clean in Blender │
└──────────────────┬──────────────────┘
│
┌──────────────────▼──────────────────┐
│ Prepare for print (on demand) │
│ 4 checks · Auto-orient · G-code │
│ STL / OBJ / 3MF / G-code export │
└─────────────────────────────────────┘
Testing
npm test # 216 tests across 40 files
npm run build # Production build (13 routes)
npm run lint # ESLint
Engine test prompts (what we verified)
| Engine | Prompt | Result |
|---|---|---|
| OpenSCAD | "a simple phone stand" | 6 stages, watertight, cable slot, gussets |
| OpenSCAD | "M10 hex bolt with threads" | Real BOSL2 threaded_rod, 3 stages, 17mm AF |
| Blender | "a tiny rocket ship" | 3 stages, nose cone + fins + nozzles, 68mm |
| NVIDIA | "a chubby sitting dragon" | Textured GLB + STL, 120mm, print plan |
| Auto | "a cute anime cat figurine" | Correctly routes → NVIDIA |
| Search | "benchy" | Curated 3DBenchy + live Printables results |
| Prepare | Any STL | Score/100, 4 checks, orient, STL/OBJ/3MF/G-code |
Design system — "Hardware Paper"
A warm, light system with one semantic accent (terracotta #cc785c).
- Sans: Bricolage Grotesque (bold, characterful)
- Mono: JetBrains Mono (machine output)
- Rule: if a human said it → sans; if the machine did it → mono
- Motif: layer lines (the brand — 3D prints build from stacked horizontal layers)
- Never: shadows, gradients, glassmorphism, spinners (use the PrinterLoader)
See DESIGN.md for the full design spec.
Project structure
Claudware/
├── src/
│ ├── app/ # Next.js app router (pages + API routes)
│ │ ├── api/ # generate, clarify, classify, search, import,
│ │ │ # prepare, transform, split, upload, print, redis
│ │ ├── app/ # Studio page
│ │ ├── projects/ # Projects gallery
│ │ └── profile/ # User profile
│ ├── components/ # Pure UI components (frozen design)
│ ├── design/ # Design tokens + Scaler
│ ├── lib/ # Client-side logic (streams, projects, hooks)
│ ├── server/ # Server-side engines + integrations
│ │ ├── meshgen/ # NVIDIA NIM + provider seam
│ │ ├── modelSearch/ # Browserbase + curated fallback
│ │ └── printReady/ # Print readiness pipeline v2
│ └── viewport/ # react-three-fiber 3D viewport
├── frontend/ # Claude Design export (read-only design contract)
├── public/ # Static assets (logo, fonts, generated models)
├── tools/ # Python scripts, BOSL2 libs, OpenSCAD watch
├── migrations/ # InsForge database migrations
├── docs/ # Specs, plans, setup, roadmap
└── demo-fixtures/ # Cached demo runs
Documentation
| Doc | What |
|---|---|
| ARCHITECTURE.md | System architecture, AgentEvent contract, engine patterns |
| DESIGN.md | UI design system — "Hardware Paper" |
| DEMO.md | Demo script + do-not-break paths |
| PROGRESS.md | Build log — what's done, what's next |
| DECISIONS.md | Technical decisions (append-only) |
| CLAUDE.md | Agent constitution — rules, phase map, engines |
| docs/ROADMAP.md | Future capabilities |
| docs/SETUP.md | Dev environment setup |
Tech stack
| Layer | Technology |
|---|---|
| Frontend | Next.js 16 + TypeScript + Tailwind v4 |
| 3D viewport | react-three-fiber + drei (OrbitControls + TransformControls) |
| AI brain | Anthropic Claude (Sonnet/Haiku via Messages API) |
| Parametric CAD | OpenSCAD + BOSL2 library |
| Organic modeling | Blender (bpy, headless or live via BlenderMCP socket) |
| Precision CAD | Fusion 360 (adsk scripts via HTTP MCP) |
| Text-to-3D | NVIDIA NIM TRELLIS |
| Voice | Deepgram STT (Web Speech fallback) |
| Caching | Redis (semantic vector search + agent memory) |
| Token savings | The Token Company (bear-2 compression) |
| Auth + DB + Storage | InsForge (Google OAuth, Postgres, S3-compatible) |
| Web search | Browserbase (Fetch API for model repos) |
| Slicing | PrusaSlicer (console mode → real G-code) |
| Testing | Vitest (216 tests, 40 files) |
License
MIT
Built with Claude Code by Vraj Patel
Analysis
View
Metric
- 84
- 41
- 7
Figures cover GitHub contributors during the hackathon window. A co-authored commit counts in full for each author, so per-member totals add up to more than the whole-team figures.
Technology
- AnthropicIn code
- CSSIn code
- HTMLIn code
- JavaScriptIn code
- Next.jsIn code
- ReactIn code
- RedisIn code
- SQLIn code
- Tailwind CSSIn code
- TypeScriptIn code
10 of 10 appear in the indexed code.
AI coding agents
- Claude CodeConfig · Commits
- CodexConfig
Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.
Codebase size
Source size
1.4 MB
Source files
179
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
vraj00222/Claudware
236 files · 34.3 MB · @ f1c55c9
Structure
Interface
28 files · 12%Screens, components and styles rendered to the user.
API & routing
57 files · 24%Request entry points: routes, handlers and controllers.
Application logic
18 files · 8%Domain rules, services and shared utilities.
Data & schema
1 file · 0%Schema definitions, migrations and data access.
Supporting
Layers are inferred from where files sit in the tree, not from reading the code. A project that names its directories unconventionally will read oddly here — open the file browser to check anything the diagram implies.
Languages
- TypeScript44%
- Markdown38%
- HTML10%
- JavaScript7%
- CSS0%
- SQL0%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
package.json
npm · 40- @anthropic-ai/sdk
- @arizeai/openinference-instrumentation-anthropic
- @arizeai/openinference-semantic-conventions
- @browserbasehq/sdk
- @fontsource/bricolage-grotesque
- @fontsource/jetbrains-mono
- @fontsource/space-grotesk
- @insforge/sdk
- @opentelemetry/api
- @opentelemetry/exporter-trace-otlp-proto
- @opentelemetry/resources
- @opentelemetry/sdk-trace-base
- @opentelemetry/sdk-trace-node
- @opentelemetry/semantic-conventions
- @react-three/drei
- @react-three/fiber
- @sentry/nextjs
- @sentry/profiling-node
- +22 more
Declared in the repository’s manifests at the indexed commit. A declared package is not proof it is used, and runtime dependencies are listed first.
This project’s features have not been analysed yet.
Export this project's context (description, README, evidence, key source files) to chat with an AI agent elsewhere.