AI-powered 3D modeling for 3D printing, built with signed distance fields.
Sinter is a web-based parametric 3D modeler that uses signed distance fields (SDF) instead of traditional BREP geometry. This means:
- Smooth booleans — union, subtract, intersect with adjustable fillet radius. No topology failures.
- Shell/hollow — one click to make any solid hollow with uniform wall thickness.
- AI-powered — describe what you want in natural language, the AI builds the model. Viewport renders are sent for visual context.
- Real-time preview — GPU ray marching renders every parameter change instantly.
- 3D print ready — export watertight STL/3MF, dimension overlays for verification.
git clone https://github.com/kmatzen/sinter.git
cd sinter
npm install
npm run devOpen http://localhost:5173 and click "Start Modeling" to launch the app.
To use AI chat, click the gear icon in the chat panel and enter your Anthropic or OpenAI API key (stored only in your browser).
- Primitives: Box, Sphere, Cylinder, Torus, Cone, Capsule, Ellipsoid
- Booleans: Union, Subtract, Intersect (with smooth/fillet parameter)
- Modifiers: Shell, Offset, Round, Mirror, Half-Space Cut (with flip)
- Patterns: Linear Pattern, Circular Pattern
- Transforms: Translate, Rotate, Scale
- Presets: Pre-built parts (enclosures, standoffs, brackets, gears, etc.)
- Drag & drop: Click or drag parts from the palette into the node tree
- GPU ray marching with screen-space outline post-process
- Tap-to-select — click/tap on a surface to select the contributing node
- Clipping plane (+X/-X/+Y/-Y/+Z/-Z) with cross-section fill
- X-ray mode
- Per-node dimension labels with wireframe bounding box
- Transform gizmo with snap-to-grid (1/5/10mm)
- Screenshot export (gizmo auto-hidden)
- Describe models in natural language
- Streaming responses — text appears token-by-token as the model generates
- Iterative refinement ("make it bigger", "add ventilation holes")
- Multi-view renders sent automatically (current view + front/right/top with rulers)
- Supports Anthropic Claude and OpenAI GPT (bring your own API key)
- Google Drive — sign in with Google to save/load projects
- GitHub Gists — sign in with GitHub to save/load projects
- Read-only share links for published projects
| Key | Action |
|---|---|
| W | Move tool |
| E | Rotate tool |
| R | Scale tool |
| Escape | Deselect gizmo |
| Ctrl+C | Copy node |
| Ctrl+V | Paste node |
| Ctrl+D | Duplicate node |
| Ctrl+Z | Undo |
| Ctrl+Shift+Z | Redo |
| Delete | Remove selected |
| Shift (hold) | Disable snap |
| ? | Show all shortcuts |
Sinter is a static site that deploys to Cloudflare Pages. The only server-side code is two small Pages Functions that hold the OAuth client secrets and exchange code for tokens. Everything else (project storage, sharing) is browser → provider direct.
See DEPLOY.md for the full deployment runbook, including how to migrate from a previous Fly.io deploy without losing data.
Quick version:
- Create OAuth apps (callback URL:
https://YOUR_DOMAIN/auth/callback):- Google: console.cloud.google.com — scope
drive.file - GitHub: github.com/settings/applications/new — scope
gist
- Google: console.cloud.google.com — scope
- Set GitHub Actions secrets:
CLOUDFLARE_API_TOKEN,CLOUDFLARE_ACCOUNT_ID,VITE_GOOGLE_CLIENT_ID,VITE_GITHUB_CLIENT_ID. - Set Cloudflare Pages environment variables:
GOOGLE_CLIENT_ID,GOOGLE_CLIENT_SECRET,GITHUB_CLIENT_ID,GITHUB_CLIENT_SECRET. - Push to
main.
Without OAuth configured, the app still works fully for local modeling and AI chat — cloud save/load just won't be available.
- Frontend: React, TypeScript, Vite, Tailwind CSS
- 3D Viewport: Three.js (pure, no R3F)
- Geometry: Custom SDF engine with GPU ray marching and marching cubes export
- Hosting: Cloudflare Pages (static) + Pages Functions (OAuth token exchange)
- Storage: User's own Google Drive or GitHub Gists, accessed directly from the browser
- State: Zustand
- Font: Outfit + JetBrains Mono
- Tests: Vitest (unit) + Playwright (E2E)
Non-commercial license. See LICENSE for details.
Copyright (c) 2026 Kevin Blackburn-Matzen.