diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b097f394..48b1e61d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -93,4 +93,4 @@ Please avoid submitting changes that are purely cosmetic (e.g., formatting, whit --- Thanks for helping make Bitbybit better! -— The Bit by bit developers team +- The Bit by bit developers team diff --git a/docs/api/examples.md b/docs/api/examples.md index 45181a88..1c06348e 100644 --- a/docs/api/examples.md +++ b/docs/api/examples.md @@ -2,13 +2,13 @@ sidebar_position: 2 title: Example Projects sidebar_label: Examples -description: "Run the Bitbybit CAD Cloud API example projects locally — React frontend with five interchangeable backend implementations (Node.js, Hono, .NET)." +description: "Run the Bitbybit CAD Cloud API example projects locally - React frontend with five interchangeable backend implementations (Node.js, Hono, .NET)." tags: [examples, quickstart, api, react, threejs] --- # Example Projects -The SDK ships with a complete set of working examples: a **shared React frontend** and **five interchangeable backend implementations**. They show how to integrate the Bitbybit CAD Cloud API into a real web application — from single CAD operations to multi-step pipelines with file uploads. +The SDK ships with a complete set of working examples: a **shared React frontend** and **five interchangeable backend implementations**. They show how to integrate the Bitbybit CAD Cloud API into a real web application - from single CAD operations to multi-step pipelines with file uploads. :::tip Source code All examples live in the [`examples/api/`](https://github.com/bitbybit-dev/bitbybit/tree/master/examples/api) folder of the repository. @@ -26,17 +26,17 @@ All examples live in the [`examples/api/`](https://github.com/bitbybit-dev/bitby └─────────────────────────────┘ ``` -The frontend never talks to the Bitbybit API directly — your **API key stays on the server**. Vite's development proxy forwards all `/api/*` requests to `localhost:3000`, so the same frontend works with any of the five backends. +The frontend never talks to the Bitbybit API directly - your **API key stays on the server**. Vite's development proxy forwards all `/api/*` requests to `localhost:3000`, so the same frontend works with any of the five backends. ## Backend Variants | Folder | Framework | API Style | Key Difference | |--------|-----------|-----------|----------------| -| **hono-rest** | [Hono](https://hono.dev) (Cloudflare Workers) | Raw REST | Direct `fetch` calls — no SDK dependency | +| **hono-rest** | [Hono](https://hono.dev) (Cloudflare Workers) | Raw REST | Direct `fetch` calls - no SDK dependency | | **hono-sdk** | [Hono](https://hono.dev) (Cloudflare Workers) | TypeScript SDK | Type-safe SDK with client-side validation | -| **nodejs-rest** | [Express 5](https://expressjs.com) (Node.js) | Raw REST | Direct `fetch` calls — no SDK dependency | +| **nodejs-rest** | [Express 5](https://expressjs.com) (Node.js) | Raw REST | Direct `fetch` calls - no SDK dependency | | **nodejs-sdk** | [Express 5](https://expressjs.com) (Node.js) | TypeScript SDK | Type-safe SDK with client-side validation | -| **dotnet-rest** | [ASP.NET Core](https://learn.microsoft.com/aspnet/core) (.NET 10) | Raw REST | Direct `HttpClient` calls — no SDK dependency | +| **dotnet-rest** | [ASP.NET Core](https://learn.microsoft.com/aspnet/core) (.NET 10) | Raw REST | Direct `HttpClient` calls - no SDK dependency | ### REST vs SDK @@ -51,7 +51,7 @@ The two approaches exist so you can choose the right level of abstraction: - **Node.js** ≥ 20 (for the frontend and Node.js/Hono backends) - **.NET** ≥ 10 (only for the `dotnet-rest` backend) -- A **Bitbybit API key** — get one from [bitbybit.dev](https://bitbybit.dev) +- A **Bitbybit API key** - get one from [bitbybit.dev](https://bitbybit.dev) ### 1. Configure your API key @@ -110,7 +110,7 @@ npm run dev # starts on port 5173 Navigate to **http://localhost:5173**. You should see a UI with buttons for each demo scenario. :::info Switching backends -Stop the current backend, `cd` into a different one, and run `npm run dev`. The frontend does not need to restart — the Vite proxy automatically picks up the new backend. +Stop the current backend, `cd` into a different one, and run `npm run dev`. The frontend does not need to restart - the Vite proxy automatically picks up the new backend. ::: ## What the Examples Cover @@ -160,9 +160,9 @@ All five backends expose the same routes so the frontend is fully interchangeabl The API uses a **3-step presigned URL flow** for file uploads: -1. `POST /api/v1/files/upload` — request an upload slot (returns `fileId` + presigned URL). +1. `POST /api/v1/files/upload` - request an upload slot (returns `fileId` + presigned URL). 2. `PUT` the raw bytes to the presigned URL. -3. `POST /api/v1/files/:id/confirm` — confirm the upload. +3. `POST /api/v1/files/:id/confirm` - confirm the upload. The SDK handles this automatically via `client.files.uploadBytes()`. The REST examples implement it manually in `bitbybit-client.ts` (TypeScript) or `BitbybitClient.cs` (C#). @@ -187,7 +187,7 @@ Never commit your API key to version control. `.env`, `.dev.vars`, and `appsetti ``` examples/api/ ├── frontend/ # React 19 + Vite + Three.js -│ ├── src/App.tsx # Main app — orchestrates panels +│ ├── src/App.tsx # Main app - orchestrates panels │ ├── src/panels/ # UI panels for each demo │ ├── src/components/ # Three.js viewer, shared UI │ └── vite.config.ts # Dev proxy: /api → localhost:3000 diff --git a/docs/api/intro.mdx b/docs/api/intro.mdx index 4474c72a..b68f76d1 100644 --- a/docs/api/intro.mdx +++ b/docs/api/intro.mdx @@ -1,13 +1,13 @@ --- sidebar_position: 0 title: Bitbybit CAD Cloud API -description: Bitbybit CAD Cloud API — generate parametric 3D CAD models, convert STEP files to glTF, run CAD pipelines, and download results via HTTP. TypeScript SDK available. Works with any language. +description: Bitbybit CAD Cloud API - generate parametric 3D CAD models, convert STEP files to glTF, run CAD pipelines, and download results via HTTP. TypeScript SDK available. Works with any language. slug: /cloud-api --- # Bitbybit CAD Cloud API -The Bitbybit CAD Cloud API lets you generate parametric 3D CAD models, convert STEP files to glTF, and run CAD kernel operations — all via HTTP from any backend, in any programming language. +The Bitbybit CAD Cloud API lets you generate parametric 3D CAD models, convert STEP files to glTF, and run CAD kernel operations - all via HTTP from any backend, in any programming language. Every request runs asynchronously on managed compute infrastructure. You submit a job, get a task ID, poll for completion, and download the result in the format you need (STEP, glTF/GLB, Decomposed Mesh, and more). @@ -21,12 +21,12 @@ Every request runs asynchronously on managed compute infrastructure. You submit ## What you can do -- **Generate parametric models** — submit parameters for registered models (e.g. Dragon Cup, Phone Nest) and get downloadable 3D files -- **Convert STEP → glTF** — upload a STEP/STP file and convert it with simple or advanced options (mesh precision, face merging, coordinate adjustment, texture embedding, and more) -- **Run CAD pipelines** — chain operations (primitives, booleans, transforms, fillets) in a single request where steps can reference each other's outputs -- **Execute single CAD operations** — run any supported operation by its fully-qualified identifier (e.g. `occt.shapes.solid.createSphere`) -- **Manage tasks** — poll status, cancel, retry, list, and download results in multiple formats -- **Upload files** — upload STEP files for conversion via pre-signed URLs +- **Generate parametric models** - submit parameters for registered models (e.g. Dragon Cup, Phone Nest) and get downloadable 3D files +- **Convert STEP → glTF** - upload a STEP/STP file and convert it with simple or advanced options (mesh precision, face merging, coordinate adjustment, texture embedding, and more) +- **Run CAD pipelines** - chain operations (primitives, booleans, transforms, fillets) in a single request where steps can reference each other's outputs +- **Execute single CAD operations** - run any supported operation by its fully-qualified identifier (e.g. `occt.shapes.solid.createSphere`) +- **Manage tasks** - poll status, cancel, retry, list, and download results in multiple formats +- **Upload files** - upload STEP files for conversion via pre-signed URLs ## Authentication @@ -37,15 +37,15 @@ curl https://api.bitbybit.dev/api/v1/models \ -H "x-api-key: YOUR_API_KEY" ``` -Keys are scoped — each key carries permissions for specific endpoint groups (`models`, `cad`, `convert`, `files`, `tasks`). +Keys are scoped - each key carries permissions for specific endpoint groups (`models`, `cad`, `convert`, `files`, `tasks`). ## Async task model Every operation that creates or transforms geometry is **asynchronous**: -1. **Submit** — `POST` your request → receive **202 Accepted** with a `taskId` -2. **Poll** — `GET /api/v1/tasks/{taskId}` until `status` is `completed` (or `failed`) -3. **Download** — `GET /api/v1/tasks/{taskId}/result/{format}` → pre-signed download URL +1. **Submit** - `POST` your request → receive **202 Accepted** with a `taskId` +2. **Poll** - `GET /api/v1/tasks/{taskId}` until `status` is `completed` (or `failed`) +3. **Download** - `GET /api/v1/tasks/{taskId}/result/{format}` → pre-signed download URL The SDK handles polling automatically via `models.run()`, `cad.executeAndPoll()`, etc. @@ -65,7 +65,7 @@ The SDK handles polling automatically via `models.run()`, `cad.executeAndPoll()` | `dragon-cup` | Parametric dragon-scale cup with configurable height, radius, thickness, cell pattern | | `phone-nest` | Parametric phone stand/nest with optional ornamental perforations | -All model parameters are optional — default values produce a valid model. See the [interactive API reference](/api/openapi-docs/bitbybit-cad-cloud-api) for full parameter documentation. +All model parameters are optional - default values produce a valid model. See the [interactive API reference](/api/openapi-docs/bitbybit-cad-cloud-api) for full parameter documentation. ## Key components @@ -75,7 +75,7 @@ The REST API at `https://api.bitbybit.dev`. All endpoints require an API key pas ### Studio -[Bitbybit Studio](https://studio.bitbybit.dev) is a browser-based dashboard where you can use all of the API's features through a visual interface — generate models, convert files, build pipelines, inspect tasks, and preview 3D results. Everything you do in Studio maps directly to an API call, so it's a great way to experiment before writing code. Read more in the [Studio introduction](/api/studio/intro). +[Bitbybit Studio](https://studio.bitbybit.dev) is a browser-based dashboard where you can use all of the API's features through a visual interface - generate models, convert files, build pipelines, inspect tasks, and preview 3D results. Everything you do in Studio maps directly to an API call, so it's a great way to experiment before writing code. Read more in the [Studio introduction](/api/studio/intro). ### TypeScript SDK @@ -88,8 +88,8 @@ npm install @bitbybit-dev/cad-cloud-sdk ## Getting an API key 1. **Create an account** at [bitbybit.dev/auth/sign-up](https://bitbybit.dev/auth/sign-up) -2. **Subscribe to an API key plan** in [Studio](https://studio.bitbybit.dev) — plans include a compute-minute allowance for running CAD operations -3. **Create a scoped API key** from your Studio dashboard — keys are scoped to specific capabilities (models, tasks, cad, convert, files) +2. **Subscribe to an API key plan** in [Studio](https://studio.bitbybit.dev) - plans include a compute-minute allowance for running CAD operations +3. **Create a scoped API key** from your Studio dashboard - keys are scoped to specific capabilities (models, tasks, cad, convert, files) ## Calling the API from any language @@ -152,7 +152,7 @@ console.log("Download:", downloadUrl); ### Run a CAD pipeline -Chain multiple CAD operations — each step can reference previous steps' outputs using `$ref:N`: +Chain multiple CAD operations - each step can reference previous steps' outputs using `$ref:N`: ```typescript const created = await client.cad.pipeline({ @@ -248,35 +248,35 @@ app.listen(3000); ## Endpoints overview ### Models -- `GET /api/v1/models` — list available models -- `GET /api/v1/models/{name}/params` — get parameter definitions -- `POST /api/v1/models/definitions` — batch-fetch model definitions -- `POST /api/v1/models/{name}` — generate a model (async) -- `POST /api/v1/models/{name}/batch` — generate multiple variations (async) +- `GET /api/v1/models` - list available models +- `GET /api/v1/models/{name}/params` - get parameter definitions +- `POST /api/v1/models/definitions` - batch-fetch model definitions +- `POST /api/v1/models/{name}` - generate a model (async) +- `POST /api/v1/models/{name}/batch` - generate multiple variations (async) ### CAD operations -- `POST /api/v1/cad/execute` — run a single CAD operation (async) -- `POST /api/v1/cad/pipeline` — run a chained pipeline (async) -- `POST /api/v1/cad/compound` — run parallel operations (async) +- `POST /api/v1/cad/execute` - run a single CAD operation (async) +- `POST /api/v1/cad/pipeline` - run a chained pipeline (async) +- `POST /api/v1/cad/compound` - run parallel operations (async) ### Conversion -- `POST /api/v1/convert/step-to-gltf` — simple STEP → glTF (async) -- `POST /api/v1/convert/step-to-gltf-advanced` — full-control conversion (async) +- `POST /api/v1/convert/step-to-gltf` - simple STEP → glTF (async) +- `POST /api/v1/convert/step-to-gltf-advanced` - full-control conversion (async) ### Files -- `POST /api/v1/files/upload` — get a pre-signed upload URL -- `POST /api/v1/files/{id}/confirm` — confirm upload -- `GET /api/v1/files` — list files -- `GET /api/v1/files/{id}` — get file details -- `DELETE /api/v1/files/{id}` — delete a file +- `POST /api/v1/files/upload` - get a pre-signed upload URL +- `POST /api/v1/files/{id}/confirm` - confirm upload +- `GET /api/v1/files` - list files +- `GET /api/v1/files/{id}` - get file details +- `DELETE /api/v1/files/{id}` - delete a file ### Tasks -- `GET /api/v1/tasks` — list tasks -- `GET /api/v1/tasks/{id}` — get task status -- `GET /api/v1/tasks/{id}/result` — download default result -- `GET /api/v1/tasks/{id}/result/{format}` — download specific format -- `DELETE /api/v1/tasks/{id}` — cancel a task -- `POST /api/v1/tasks/{id}/retry` — retry a failed task +- `GET /api/v1/tasks` - list tasks +- `GET /api/v1/tasks/{id}` - get task status +- `GET /api/v1/tasks/{id}/result` - download default result +- `GET /api/v1/tasks/{id}/result/{format}` - download specific format +- `DELETE /api/v1/tasks/{id}` - cancel a task +- `POST /api/v1/tasks/{id}/retry` - retry a failed task For full request/response schemas, see the [interactive API reference](/api/openapi-docs/bitbybit-cad-cloud-api). @@ -284,10 +284,10 @@ For full request/response schemas, see the [interactive API reference](/api/open Full working examples are available in the open-source GitHub repo: -- [**Node.js + SDK**](https://github.com/bitbybit-dev/bitbybit/tree/master/examples/api/nodejs-sdk) — Express server using `@bitbybit-dev/cad-cloud-sdk` -- [**Node.js + REST**](https://github.com/bitbybit-dev/bitbybit/tree/master/examples/api/nodejs-rest) — Express server using raw `fetch` calls -- [**Hono + SDK**](https://github.com/bitbybit-dev/bitbybit/tree/master/examples/api/hono-sdk) — Cloudflare Workers using the SDK -- [**Hono + REST**](https://github.com/bitbybit-dev/bitbybit/tree/master/examples/api/hono-rest) — Cloudflare Workers using raw `fetch` calls +- [**Node.js + SDK**](https://github.com/bitbybit-dev/bitbybit/tree/master/examples/api/nodejs-sdk) - Express server using `@bitbybit-dev/cad-cloud-sdk` +- [**Node.js + REST**](https://github.com/bitbybit-dev/bitbybit/tree/master/examples/api/nodejs-rest) - Express server using raw `fetch` calls +- [**Hono + SDK**](https://github.com/bitbybit-dev/bitbybit/tree/master/examples/api/hono-sdk) - Cloudflare Workers using the SDK +- [**Hono + REST**](https://github.com/bitbybit-dev/bitbybit/tree/master/examples/api/hono-rest) - Cloudflare Workers using raw `fetch` calls Each example includes a complete server with API routes and a browser frontend for testing. @@ -297,10 +297,10 @@ You can also scaffold any of these example architectures instantly using our CLI npx @bitbybit-dev/create-app my-cloud-project ``` -Select the **cloud** app type when prompted, then choose your preferred backend template (Hono + SDK, Hono + REST, Node.js + SDK, Node.js + REST, or .NET + REST). The CLI generates a ready-to-run project with a React + Three.js frontend, your chosen backend, and all configuration in place — just add your API key and start developing. +Select the **cloud** app type when prompted, then choose your preferred backend template (Hono + SDK, Hono + REST, Node.js + SDK, Node.js + REST, or .NET + REST). The CLI generates a ready-to-run project with a React + Three.js frontend, your chosen backend, and all configuration in place - just add your API key and start developing. ## Next steps -- [**Studio introduction**](/api/studio/intro) — explore the visual dashboard -- [**API Reference**](/api/openapi-docs/bitbybit-cad-cloud-api) — full endpoint documentation with schemas and examples -- [**TypeScript SDK on npm**](https://www.npmjs.com/package/@bitbybit-dev/cad-cloud-sdk) — package details and changelog +- [**Studio introduction**](/api/studio/intro) - explore the visual dashboard +- [**API Reference**](/api/openapi-docs/bitbybit-cad-cloud-api) - full endpoint documentation with schemas and examples +- [**TypeScript SDK on npm**](https://www.npmjs.com/package/@bitbybit-dev/cad-cloud-sdk) - package details and changelog diff --git a/docs/api/sdk/typescript/cad-operations.md b/docs/api/sdk/typescript/cad-operations.md index 71968ce3..d32d1451 100644 --- a/docs/api/sdk/typescript/cad-operations.md +++ b/docs/api/sdk/typescript/cad-operations.md @@ -8,7 +8,7 @@ tags: [sdk, typescript, cad] # CAD Operations -The `client.cad` endpoint lets you run raw CAD kernel operations — anything from creating primitives to boolean operations and transforms. Operations are identified by their fully-qualified name (e.g. `occt.shapes.solid.createSphere`). +The `client.cad` endpoint lets you run raw CAD kernel operations - anything from creating primitives to boolean operations and transforms. Operations are identified by their fully-qualified name (e.g. `occt.shapes.solid.createSphere`). ## Execute a single operation diff --git a/docs/api/sdk/typescript/conversion.md b/docs/api/sdk/typescript/conversion.md index 11182970..fdb297e2 100644 --- a/docs/api/sdk/typescript/conversion.md +++ b/docs/api/sdk/typescript/conversion.md @@ -2,7 +2,7 @@ sidebar_position: 4 title: Conversion sidebar_label: Conversion -description: "Convert STEP files to glTF with the Bitbybit SDK — simple and advanced modes with full control over tessellation and export options." +description: "Convert STEP files to glTF with the Bitbybit SDK - simple and advanced modes with full control over tessellation and export options." tags: [sdk, typescript, conversion] --- @@ -12,7 +12,7 @@ The `client.convert` endpoint converts STEP/STP files to glTF (.glb). Upload the ## Simple conversion -Default settings — just point it at a file: +Default settings - just point it at a file: ```ts import { readFile } from "node:fs/promises"; @@ -21,7 +21,7 @@ import { readFile } from "node:fs/promises"; const data = await readFile("model.step"); const confirmed = await client.files.uploadBytes("model.step", data); -// 2. Convert — polls automatically, returns all downloads +// 2. Convert - polls automatically, returns all downloads const { downloads } = await client.convert.stepToGltfAndPoll({ stepFileId: confirmed.fileId, meshPrecision: 0.1, @@ -95,7 +95,7 @@ const { downloads } = await client.convert.stepToGltfAdvancedAndPoll({ | `readMaterials` | `boolean` | Extract material definitions | | `readLayers` | `boolean` | Extract layer/group structure | | `readProps` | `boolean` | Extract custom properties (part numbers, metadata) | -| `meshDeflection` | `number` | Linear deflection `[0.005, 10]` — lower = finer | +| `meshDeflection` | `number` | Linear deflection `[0.005, 10]` - lower = finer | | `meshAngle` | `number` | Angular deflection in radians `[0.01, π]` | | `meshParallel` | `boolean` | Parallel tessellation | | `faceCountThreshold` | `integer` | Max triangles before LOD reduction (`-1` to disable) | diff --git a/docs/api/sdk/typescript/files.md b/docs/api/sdk/typescript/files.md index 89dc0e47..81f34dea 100644 --- a/docs/api/sdk/typescript/files.md +++ b/docs/api/sdk/typescript/files.md @@ -2,17 +2,17 @@ sidebar_position: 6 title: Files sidebar_label: Files -description: "Upload, confirm, list, and delete files with the Bitbybit SDK — includes a convenience method for end-to-end upload." +description: "Upload, confirm, list, and delete files with the Bitbybit SDK - includes a convenience method for end-to-end upload." tags: [sdk, typescript, files] --- # Files -The `client.files` endpoint manages file uploads. Files are required for STEP → glTF conversion — upload first, then convert. +The `client.files` endpoint manages file uploads. Files are required for STEP → glTF conversion - upload first, then convert. ## Upload a file (easy way) -`uploadBytes()` handles the entire upload flow — request a pre-signed URL, PUT the bytes, confirm: +`uploadBytes()` handles the entire upload flow - request a pre-signed URL, PUT the bytes, confirm: ```ts import { readFile } from "node:fs/promises"; @@ -36,7 +36,7 @@ const upload = await client.files.upload({ filename: "part.step", contentType: "application/octet-stream", bytes: data.byteLength, - sha256: "abc123...", // optional — enables deduplication + sha256: "abc123...", // optional - enables deduplication }); console.log(upload.fileId); // assigned file ID @@ -65,7 +65,7 @@ const list = await client.files.list({ }); for (const file of list.files) { - console.log(`${file.filename} — ${file.status} — ${file.bytes} bytes`); + console.log(`${file.filename} - ${file.status} - ${file.bytes} bytes`); } ``` diff --git a/docs/api/sdk/typescript/intro.md b/docs/api/sdk/typescript/intro.md index 3f6d7664..da312472 100644 --- a/docs/api/sdk/typescript/intro.md +++ b/docs/api/sdk/typescript/intro.md @@ -2,13 +2,13 @@ sidebar_position: 1 title: TypeScript SDK sidebar_label: Overview -description: "@bitbybit-dev/cad-cloud-sdk — type-safe TypeScript SDK for the Bitbybit CAD Cloud API. Install, initialize, and start generating 3D models in minutes." +description: "@bitbybit-dev/cad-cloud-sdk - type-safe TypeScript SDK for the Bitbybit CAD Cloud API. Install, initialize, and start generating 3D models in minutes." tags: [sdk, typescript, api] --- # TypeScript SDK -The [`@bitbybit-dev/cad-cloud-sdk`](https://www.npmjs.com/package/@bitbybit-dev/cad-cloud-sdk) package gives you a type-safe client for the Bitbybit CAD Cloud API. It works in Node.js, Deno, Bun, and Cloudflare Workers — anywhere that has native `fetch`. +The [`@bitbybit-dev/cad-cloud-sdk`](https://www.npmjs.com/package/@bitbybit-dev/cad-cloud-sdk) package gives you a type-safe client for the Bitbybit CAD Cloud API. It works in Node.js, Deno, Bun, and Cloudflare Workers - anywhere that has native `fetch`. :::warning Server-side only Never use this SDK in frontend code. Your API key must stay on the server. @@ -38,7 +38,7 @@ const client = new BitbybitClient({ ## Your first model -Generate a Dragon Cup and get download URLs — the SDK handles polling automatically: +Generate a Dragon Cup and get download URLs - the SDK handles polling automatically: ```ts const { taskId, downloads } = await client.models.run("dragon-cup", { @@ -129,7 +129,7 @@ import type { Full working examples live in the GitHub repo: -- [**Node.js + SDK**](https://github.com/bitbybit-dev/bitbybit/tree/master/examples/api/nodejs-sdk) — Express server -- [**Hono + SDK**](https://github.com/bitbybit-dev/bitbybit/tree/master/examples/api/hono-sdk) — Cloudflare Workers +- [**Node.js + SDK**](https://github.com/bitbybit-dev/bitbybit/tree/master/examples/api/nodejs-sdk) - Express server +- [**Hono + SDK**](https://github.com/bitbybit-dev/bitbybit/tree/master/examples/api/hono-sdk) - Cloudflare Workers Each example includes a server with API routes and a Three.js browser frontend for previewing generated models. diff --git a/docs/api/sdk/typescript/models.md b/docs/api/sdk/typescript/models.md index aad49f1d..6a0bd36a 100644 --- a/docs/api/sdk/typescript/models.md +++ b/docs/api/sdk/typescript/models.md @@ -2,7 +2,7 @@ sidebar_position: 2 title: Models sidebar_label: Models -description: "Generate parametric 3D models with the Bitbybit SDK — submit, poll, batch, and download results with full TypeScript intellisense." +description: "Generate parametric 3D models with the Bitbybit SDK - submit, poll, batch, and download results with full TypeScript intellisense." tags: [sdk, typescript, models] --- @@ -141,7 +141,7 @@ const task = await client.tasks.poll(compound.taskId); When you pass a known model name, TypeScript provides full intellisense for parameters: ```ts -// ✅ TypeScript knows DragonCupParams — autocomplete works +// ✅ TypeScript knows DragonCupParams - autocomplete works await client.models.run("dragon-cup", { params: { height: 8, radiusBottom: 4 }, outputs: { formats: ["gltf"] }, diff --git a/docs/api/sdk/typescript/pipelines.md b/docs/api/sdk/typescript/pipelines.md index 06eeb422..4058ea72 100644 --- a/docs/api/sdk/typescript/pipelines.md +++ b/docs/api/sdk/typescript/pipelines.md @@ -12,14 +12,14 @@ Pipelines let you chain multiple CAD operations in a single request. Each step c ## Studio Pipeline Builder -You don't need to write pipeline JSON by hand. The [Bitbybit Studio](https://studio.bitbybit.dev) includes a visual pipeline builder where you can add operations, configure parameters with form controls, and wire step references using dropdowns. The generated JSON is shown in a live preview panel — you can copy it for use with the SDK or REST API. +You don't need to write pipeline JSON by hand. The [Bitbybit Studio](https://studio.bitbybit.dev) includes a visual pipeline builder where you can add operations, configure parameters with form controls, and wire step references using dropdowns. The generated JSON is shown in a live preview panel - you can copy it for use with the SDK or REST API.
- Bitbybit Studio pipeline builder showing a three-step pipeline with createSphere, createBox, and boolean difference operations + Bitbybit Studio pipeline builder showing a three-step pipeline with createSphere, createBox, and boolean difference operations
:::info Compute minutes -Running a pipeline counts toward your plan's compute minutes — whether you trigger it from the SDK, REST API, or Studio. The time billed is the server-side execution time of the pipeline. +Running a pipeline counts toward your plan's compute minutes - whether you trigger it from the SDK, REST API, or Studio. The time billed is the server-side execution time of the pipeline. ::: ## Linear Pipelines @@ -50,13 +50,13 @@ const { downloads } = await client.cad.pipelineAndPoll({ }); ``` -Any step can reference any earlier step — not just the immediately preceding one. This gives you DAG-like data flow within a sequential execution model. +Any step can reference any earlier step - not just the immediately preceding one. This gives you DAG-like data flow within a sequential execution model. ### All Reference Types | Reference | Resolves to | |-----------|-------------| -| `$ref:N` | Entry N in the global results array (zero-based). Map inner steps also push results to this array — see the Map section for index counting. | +| `$ref:N` | Entry N in the global results array (zero-based). Map inner steps also push results to this array - see the Map section for index counting. | | `$file:N` | Input file N as UTF-8 text | | `$file:N:format` | Input file N in a specific format (`json`, `buffer`, `uint8`, `base64`) | | `$prev` | Result of the previous step in the current scope | @@ -65,7 +65,7 @@ Any step can reference any earlier step — not just the immediately preceding o | `$index` | Current iteration index (0-based) inside a map | | `$mapResult` | Collected iteration results inside a map's reduce sub-steps | -References are resolved recursively — they work inside objects, arrays, and nested structures anywhere in `params`. +References are resolved recursively - they work inside objects, arrays, and nested structures anywhere in `params`. ## File Inputs @@ -123,7 +123,7 @@ Use the `:json` format to skip a `json.parse` step: ```ts const { downloads } = await client.cad.pipelineAndPoll({ steps: [ - // $file:0:json parses the JSON file directly — no json.parse step needed + // $file:0:json parses the JSON file directly - no json.parse step needed // Assume the file contains: { "width": 10, "length": 20, "height": 5 } { operation: "occt.shapes.solid.createBox", params: "$file:0:json" }, ], @@ -135,7 +135,7 @@ const { downloads } = await client.cad.pipelineAndPoll({ ``` :::note -`$item` resolves to the entire element — there is no dot-path property access like `$item.x`. If you need to extract a nested property from each item, use a `json.query` step inside the map. +`$item` resolves to the entire element - there is no dot-path property access like `$item.x`. If you need to extract a nested property from each item, use a `json.query` step inside the map. ::: ### Limits @@ -145,7 +145,7 @@ const { downloads } = await client.cad.pipelineAndPoll({ ## Map (Iteration) -Map iterates over an array and runs sub-steps for each item. The result is an array of outputs — one per iteration. +Map iterates over an array and runs sub-steps for each item. The result is an array of outputs - one per iteration. :::warning $ref indexing with Map Map inner steps push their results into the global results array. This means `$ref:N` indices are offset by the number of inner step executions. For example, if a map runs 6 iterations with 1 inner step each, that consumes 6 indices before the map result itself. @@ -196,15 +196,15 @@ const { downloads } = await client.cad.pipelineAndPoll({ ``` Inside a map: -- `$item` — the current element from the `items` array -- `$index` — the current iteration index (0-based) -- `$ref:N` — still references top-level step results -- `$prev` — the result of the previous step within the current scope -- `$local:N` — the result of step N within the current scope (0-based, scope-local) +- `$item` - the current element from the `items` array +- `$index` - the current iteration index (0-based) +- `$ref:N` - still references top-level step results +- `$prev` - the result of the previous step within the current scope +- `$local:N` - the result of step N within the current scope (0-based, scope-local) ### Map with Reduce -Map supports an optional `reduce` field — a sub-pipeline that runs after all iterations and receives `$mapResult` (the collected array): +Map supports an optional `reduce` field - a sub-pipeline that runs after all iterations and receives `$mapResult` (the collected array): ```ts const { downloads } = await client.cad.pipelineAndPoll({ @@ -313,7 +313,7 @@ Use `json.query` steps to extract specific values from intermediate results usin ``` :::note -OCCT shapes are opaque in-memory objects — they don't have JSON properties. To get a volume, call `occt.shapes.solid.getSolidVolume` as a separate step. JSONPath queries work on **data structures** (JSON, arrays, parsed CSV), not geometry. +OCCT shapes are opaque in-memory objects - they don't have JSON properties. To get a volume, call `occt.shapes.solid.getSolidVolume` as a separate step. JSONPath queries work on **data structures** (JSON, arrays, parsed CSV), not geometry. ::: ## Constructing Data @@ -333,7 +333,7 @@ Combined with Map and `$item`/`$index`, this allows dynamic parameter constructi ## Marking Steps as Output -By default, pipelines produce a single result based on the **last step** — either a shape file (GLTF/STEP/STL) or a data file (JSON/CSV). But sometimes you want **both**: a shape file plus structured data (measurements, metadata, coordinates). +By default, pipelines produce a single result based on the **last step** - either a shape file (GLTF/STEP/STL) or a data file (JSON/CSV). But sometimes you want **both**: a shape file plus structured data (measurements, metadata, coordinates). Add `output: true` to any step to include its result in a separate `result.json` download alongside the shape outputs: @@ -355,7 +355,7 @@ const { downloads } = await client.cad.pipelineAndPoll({ params: { json: "$ref:4", property: "surfaceArea", value: "$ref:2" }, output: true, }, - // Step 6: Fillet the box — this is the last step, so it determines the shape output + // Step 6: Fillet the box - this is the last step, so it determines the shape output { operation: "occt.fillets.filletEdges", params: { shape: "$ref:0", radius: 1 } }, ], outputs: { formats: ["gltf", "step"] }, @@ -366,7 +366,7 @@ const { downloads } = await client.cad.pipelineAndPoll({ // - result.json ({"volume": 400, "surfaceArea": 340}) ``` -Multiple steps can have `output: true` — all their results are collected into a single `result.json` array. +Multiple steps can have `output: true` - all their results are collected into a single `result.json` array. :::tip This is useful for parametric workflows where you need to return computed dimensions, BOM data, or validation results alongside the CAD geometry. @@ -468,7 +468,7 @@ const { downloads } = await client.cad.pipelineAndPoll({ }); ``` -The `step()` function narrows the `params` type based on the operation path — your editor will show available parameters, their types, and JSDoc descriptions. +The `step()` function narrows the `params` type based on the operation path - your editor will show available parameters, their types, and JSDoc descriptions. ### Available exports diff --git a/docs/api/sdk/typescript/tasks.md b/docs/api/sdk/typescript/tasks.md index 061390fa..a79f5aaf 100644 --- a/docs/api/sdk/typescript/tasks.md +++ b/docs/api/sdk/typescript/tasks.md @@ -2,7 +2,7 @@ sidebar_position: 5 title: Tasks sidebar_label: Tasks -description: "Manage async CAD tasks — poll for status, list, cancel, retry, and download results with the Bitbybit SDK." +description: "Manage async CAD tasks - poll for status, list, cancel, retry, and download results with the Bitbybit SDK." tags: [sdk, typescript, tasks] --- @@ -93,7 +93,7 @@ Wait for a task to complete: const task = await client.tasks.poll(taskId, { intervalMs: 2000, maxAttempts: 120, - onProgress: (t) => console.log(`${t.status} — ${t.progress}%`), + onProgress: (t) => console.log(`${t.status} - ${t.progress}%`), signal: AbortSignal.timeout(120_000), }); ``` diff --git a/docs/api/sdk/typescript/validation.md b/docs/api/sdk/typescript/validation.md index 4071fed4..865cc655 100644 --- a/docs/api/sdk/typescript/validation.md +++ b/docs/api/sdk/typescript/validation.md @@ -2,13 +2,13 @@ sidebar_position: 2 title: Validation sidebar_label: Validation -description: "Client-side request validation in @bitbybit-dev/cad-cloud-sdk — catch parameter errors before they reach the API." +description: "Client-side request validation in @bitbybit-dev/cad-cloud-sdk - catch parameter errors before they reach the API." tags: [sdk, typescript, validation] --- # Client-side validation -The SDK validates every request body **before** it leaves your server. This catches parameter errors instantly with clear messages — no round-trip to the API required. +The SDK validates every request body **before** it leaves your server. This catches parameter errors instantly with clear messages - no round-trip to the API required. Validation is **enabled by default** and covers all `POST` requests (model submissions, CAD operations, file uploads, etc.). @@ -18,18 +18,18 @@ When you call any SDK method that sends a request body, the SDK: 1. Looks up the JSON Schema for the target endpoint 2. Validates your data against it using a lightweight, eval-free validator -3. Throws `BitbybitValidationError` immediately if invalid — the request never reaches the network +3. Throws `BitbybitValidationError` immediately if invalid - the request never reaches the network 4. Sends the request normally if valid This works in all runtimes: Node.js, Cloudflare Workers, Deno, Bun. ## Why it matters -Although the API server always validates incoming requests, **invalid requests that reach the server may still consume compute resources** — and those resources can count toward your usage. Client-side validation prevents bad requests from hitting the server at all, which means: +Although the API server always validates incoming requests, **invalid requests that reach the server may still consume compute resources** - and those resources can count toward your usage. Client-side validation prevents bad requests from hitting the server at all, which means: -- **Cost savings** — no compute time wasted on requests that would be rejected anyway -- **Faster feedback** — validation errors appear in microseconds, not after a network round-trip -- **Better developer experience** — error messages reference your local data (e.g. `#/params/height must be <= 50`) instead of a generic server response +- **Cost savings** - no compute time wasted on requests that would be rejected anyway +- **Faster feedback** - validation errors appear in microseconds, not after a network round-trip +- **Better developer experience** - error messages reference your local data (e.g. `#/params/height must be <= 50`) instead of a generic server response ## Catching validation errors @@ -90,10 +90,10 @@ Each registered model has its own schema with parameter-specific constraints. Fo ### Generic schemas Operations without model-specific schemas still validate against generic schemas: -- `ExecuteBody` — requires `operation` (string) -- `PipelineBody` — requires `steps` (non-empty array) -- `FileUploadBody` — requires `filename`, `contentType`, `bytes` -- `BatchModelSubmissionBody` — requires `items` (1–50) and `outputs` +- `ExecuteBody` - requires `operation` (string) +- `PipelineBody` - requires `steps` (non-empty array) +- `FileUploadBody` - requires `filename`, `contentType`, `bytes` +- `BatchModelSubmissionBody` - requires `items` (1–50) and `outputs` ## Disabling validation @@ -108,7 +108,7 @@ const client = new BitbybitClient({ This is useful when: - The API has added new endpoints/models that your SDK version doesn't have schemas for yet -- You want to skip the validation overhead in a hot path (the overhead is minimal — microseconds) +- You want to skip the validation overhead in a hot path (the overhead is minimal - microseconds) - You're proxying raw user input and prefer the server's error response format :::tip @@ -126,7 +126,7 @@ try { await client.cad.execute(body); } catch (err) { if (err instanceof BitbybitValidationError) { - // Request never sent — fix the input + // Request never sent - fix the input console.error("Invalid input:", err.message); } else if (err instanceof BitbybitApiError) { // Server returned an error diff --git a/docs/api/studio/intro.md b/docs/api/studio/intro.md deleted file mode 100644 index 1f2b4248..00000000 --- a/docs/api/studio/intro.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -sidebar_position: 1 -title: Bitbybit Studio -description: Bitbybit Studio — browser-based dashboard for the CAD Cloud API. Generate parametric 3D models, convert STEP files to glTF, build CAD pipelines, manage async tasks, preview results in 3D, and track API key usage. ---- - -# Bitbybit Studio - -Bitbybit Studio is your homepage and playground for the CAD Cloud API. It's a place to experiment with parametric models, STEP file conversions, and CAD pipelines — but it's also capable of serious work. Generate production-ready models, fine-tune conversion settings, chain multi-step operations, manage tasks, and preview results in 3D — all from your browser, without writing code or making raw API calls. - -## Features - -### Model Generator - -Browse the catalog of registered parametric models, fill in typed parameters via a form, and submit a generation task. Each model exposes its own set of parameters (dimensions, toggles, precision controls) with sensible defaults, so you can generate a valid model with a single click or fine-tune every detail. - -### File Converter - -Drag and drop a STEP/STP file and convert it to glTF. Two modes are available: - -- **Simple** — set a single mesh precision value and convert -- **Advanced** — full control over 19 options grouped into Reading, Meshing, Export, and Transform categories (layer extraction, mesh deflection and angle, face merging, texture embedding, coordinate adjustment, scale, and more) - -### CAD Playground - -A simple visual pipeline builder designed to illustrate how CAD pipelines work. It ships with a small set of basic operations — just enough to demonstrate the concept: - -- **Primitives** — Sphere, Box, Cylinder, Cone -- **Booleans** — Union, Difference, Intersection -- **Transforms** — Translate, Scale -- **Fillets** — Fillet Edges, Chamfer Edges - -Steps can reference each other's outputs, forming a DAG-style pipeline. The goal isn't to replace a full CAD tool — it's to show you how chained operations, output references, and format selection work so you can build real pipelines via the API or SDK with confidence. For a full guide on pipeline features (Map, Choice, file inputs, output formats), see [Pipelines](/api/sdk/typescript/pipelines). - -### Task Management - -All operations run asynchronously. The Tasks page gives you: - -- A paginated list of all your tasks, filterable by status and kind -- Live polling so you can watch tasks progress in real time -- A detailed view per task showing execution timeline, original request metadata, and sub-tasks for compound operations -- **Download** results in any available format (STEP, glTF, GLB, and more) -- **Preview in 3D** — open glTF/GLB results directly in the built-in viewer -- Cancel or retry tasks as needed - -### 3D Viewer - -A full-page 3D preview that loads directly from a completed task's output. Renders glTF/GLB models in an interactive scene so you can inspect results before downloading. - -### Dashboard & Account Management - -The dashboard gives you an overview of your compute usage (minutes used vs. plan allowance) and lets you manage the operational side of your account: - -- **API key usage** — track how each key is being used and monitor consumption against your plan limits -- **Key rotation** — create new API keys and revoke old ones to keep your integrations secure -- **Subscription management** — view your current plan, upgrade, or manage billing through the integrated Stripe portal - -## Studio & the Cloud API - -Studio is a visual frontend to the same Cloud API documented in the [API Reference](/api/openapi-docs/bitbybit-cad-cloud-api). Everything you do in Studio — generating a model, converting a file, running a pipeline — maps directly to an API endpoint. This means: - -- Workflows you prototype in Studio can be automated via HTTP calls or the [TypeScript SDK](https://www.npmjs.com/package/@bitbybit-dev/cad-cloud-sdk) -- The same OCCT kernel operations, parameters, and defaults apply in both -- Output formats (STEP, glTF, GLB, Decomposed Mesh) are shared between Studio and the API -- Tasks created via the API from your code are visible in Studio — you can inspect their status, view results, download outputs, and preview models in 3D, regardless of whether the task was submitted from Studio or programmatically - -## Getting started - -1. **Sign up** at [bitbybit.dev/auth/sign-up](https://bitbybit.dev/auth/sign-up) -2. **Open Studio** — generate a model or convert a file to see the workflow in action -3. **Get an API key** — create a scoped key from your dashboard -4. **Call the API** — use the [API Reference](/api/openapi-docs/bitbybit-cad-cloud-api) or the [TypeScript SDK](https://www.npmjs.com/package/@bitbybit-dev/cad-cloud-sdk) to automate the same workflows programmatically diff --git a/docs/api/studio/intro.mdx b/docs/api/studio/intro.mdx new file mode 100644 index 00000000..21556658 --- /dev/null +++ b/docs/api/studio/intro.mdx @@ -0,0 +1,107 @@ +--- +sidebar_position: 1 +title: Bitbybit Studio +description: Bitbybit Studio - browser-based dashboard for the CAD Cloud API. Generate parametric 3D models, convert STEP files to glTF, build CAD pipelines, manage async tasks, preview results in 3D, and track API key usage. +--- + +import ImageGallery from '@site/src/components/ImageGallery'; + +# Bitbybit Studio + +Bitbybit Studio is your homepage and playground for the CAD Cloud API. It's a place to experiment with parametric models, STEP file conversions, and CAD pipelines - but it's also capable of serious work. Generate production-ready models, fine-tune conversion settings, chain multi-step operations, manage tasks, and preview results in 3D - all from your browser, without writing code or making raw API calls. + +## Features + +### Model Generator + +Browse the catalog of registered parametric models, fill in typed parameters via a form, and submit a generation task. Each model exposes its own set of parameters (dimensions, toggles, precision controls) with sensible defaults, so you can generate a valid model with a single click or fine-tune every detail. + + + +### File Converter + +Drag and drop a STEP/STP file and convert it to glTF. Two modes are available: + +- **Simple** - set a single mesh precision value and convert +- **Advanced** - full control over 19 options grouped into Reading, Meshing, Export, and Transform categories (layer extraction, mesh deflection and angle, face merging, texture embedding, coordinate adjustment, scale, and more) + +### CAD Playground + +A simple visual pipeline builder designed to illustrate how CAD pipelines work. It ships with a small set of basic operations - just enough to demonstrate the concept: + +- **Primitives** - Sphere, Box, Cylinder, Cone +- **Booleans** - Union, Difference, Intersection +- **Transforms** - Translate, Scale +- **Fillets** - Fillet Edges, Chamfer Edges + + + +Steps can reference each other's outputs, forming a DAG-style pipeline. The goal isn't to replace a full CAD tool - it's to show you how chained operations, output references, and format selection work so you can build real pipelines via the API or SDK with confidence. For a full guide on pipeline features (Map, Choice, file inputs, output formats), see [Pipelines](/api/sdk/typescript/pipelines). + +### Task Management + +All operations run asynchronously. The Tasks page gives you: + + + +- A paginated list of all your tasks, filterable by status and kind +- Live polling so you can watch tasks progress in real time +- A detailed view per task showing execution timeline, original request metadata, and sub-tasks for compound operations +- **Download** results in any available format (STEP, glTF, GLB, and more) +- **Preview in 3D** - open glTF/GLB results directly in the built-in viewer +- Cancel or retry tasks as needed + +### 3D Viewer + +A full-page 3D preview that loads directly from a completed task's output. Renders glTF/GLB models in an interactive scene so you can inspect results before downloading. + + + +### Dashboard & Account Management + +The dashboard gives you an overview of your compute usage (minutes used vs. plan allowance) and lets you manage the operational side of your account: + +- **API key usage** - track how each key is being used and monitor consumption against your plan limits +- **Key rotation** - create new API keys and revoke old ones to keep your integrations secure +- **Subscription management** - view your current plan, upgrade, or manage billing through the integrated Stripe portal + +## Studio & the Cloud API + +Studio is a visual frontend to the same Cloud API documented in the [API Reference](/api/openapi-docs/bitbybit-cad-cloud-api). Everything you do in Studio - generating a model, converting a file, running a pipeline - maps directly to an API endpoint. This means: + +- Workflows you prototype in Studio can be automated via HTTP calls or the [TypeScript SDK](https://www.npmjs.com/package/@bitbybit-dev/cad-cloud-sdk) +- The same OCCT kernel operations, parameters, and defaults apply in both +- Output formats (STEP, glTF, GLB, Decomposed Mesh) are shared between Studio and the API +- Tasks created via the API from your code are visible in Studio - you can inspect their status, view results, download outputs, and preview models in 3D, regardless of whether the task was submitted from Studio or programmatically + +## Getting started + +1. **Sign up** at [bitbybit.dev/auth/sign-up](https://bitbybit.dev/auth/sign-up) +2. **Open Studio** - generate a model or convert a file to see the workflow in action +3. **Get an API key** - create a scoped key from your dashboard +4. **Call the API** - use the [API Reference](/api/openapi-docs/bitbybit-cad-cloud-api) or the [TypeScript SDK](https://www.npmjs.com/package/@bitbybit-dev/cad-cloud-sdk) to automate the same workflows programmatically diff --git a/docs/blog/2021-11-08-the-cloud-of-bitbybit-developers.md b/docs/blog/2021-11-08-the-cloud-of-bitbybit-developers.md index 13370cc9..ec0d402f 100644 --- a/docs/blog/2021-11-08-the-cloud-of-bitbybit-developers.md +++ b/docs/blog/2021-11-08-the-cloud-of-bitbybit-developers.md @@ -33,7 +33,7 @@ Public projects gallery ### Projects host Scripts and Asset files -We have made it simple to edit your Project details, create scripts, upload optimised pictures and various Asset files related to your Project. As before we support 2 types of coding on our Platform — visual (Blockly) and textual (TypeScript). You are free to choose whichever you prefer. +We have made it simple to edit your Project details, create scripts, upload optimised pictures and various Asset files related to your Project. As before we support 2 types of coding on our Platform - visual (Blockly) and textual (TypeScript). You are free to choose whichever you prefer. ![Image showing project editor screen](https://miro.medium.com/max/1400/1*ynLahx1xmiSNlSdvn16oiA.png) @@ -45,7 +45,7 @@ One of the main scenarios that will be allowed by our cloud infrastructure is im ### Three Plan Tiers -Our plans at this stage differ only in quota limits and access levels to community projects. There are currently no 3D CAD features that differ per tier, so when you opt in to try our platform for FREE you get a good indication of what it will feel like when you would switch to our paid SILVER and GOLD plans. In fact even the ‘old’ style use of our 3D CAD application is still allowed — you can still run and open Public scripts made by others without creating an account. In that case you do loose all the nice features that allow structuring your work into projects, scripts and assets. Importing various Asset files will only be possible for users who have accounts. Next we will briefly discuss different visibility levels that your Projects can have. +Our plans at this stage differ only in quota limits and access levels to community projects. There are currently no 3D CAD features that differ per tier, so when you opt in to try our platform for FREE you get a good indication of what it will feel like when you would switch to our paid SILVER and GOLD plans. In fact even the ‘old’ style use of our 3D CAD application is still allowed - you can still run and open Public scripts made by others without creating an account. In that case you do loose all the nice features that allow structuring your work into projects, scripts and assets. Importing various Asset files will only be possible for users who have accounts. Next we will briefly discuss different visibility levels that your Projects can have. #### Public Projects diff --git a/docs/blog/2023-02-17-mixed-reality-cad.md b/docs/blog/2023-02-17-mixed-reality-cad.md index e0cfaf8c..2ba71f65 100644 --- a/docs/blog/2023-02-17-mixed-reality-cad.md +++ b/docs/blog/2023-02-17-mixed-reality-cad.md @@ -20,15 +20,15 @@ Our approach to CAD modelling uses a constraint-driven system, with pre-programm To showcase our application's capabilities, we have produced a video that depicts a user interacting with a parametric 3D model in a mixed reality environment. The video can also be found on our YouTube channel. Hit subscribe if you enjoy it. -
+
diff --git a/docs/blog/2023-02-18-moos-modular-housing.mdx b/docs/blog/2023-02-18-moos-modular-housing.mdx index 84047af7..5b61ae17 100644 --- a/docs/blog/2023-02-18-moos-modular-housing.mdx +++ b/docs/blog/2023-02-18-moos-modular-housing.mdx @@ -16,7 +16,7 @@ We had the pleasure of collaborating with Leon Spikker to develop an easy-to-use Our team's primary objective from the outset was to enable users to generate customized housing projects at any location in the Netherlands while providing access to important urban contextual information. Through our collaboration, we developed a comprehensive solution that allowed users to easily add and configure different building types to their project, with the ability to explore countless configuration possibilities with ease.
-