Run structured design reviews in Speckle using saved views, federation, sketches, and issues.
Use this guide when you need a repeatable way to run design reviews in Speckle. It ties together saved views, federation, sketches, and issues into one end‑to‑end workflow, for teams that already view and share models in Speckle.
Before you start: You need a Speckle project, at least one model, and access to the 3D viewer.
If you are new to Speckle, complete the Quickstart first.
When to use: Before a formal review meeting or an asynchronous review round.
1
Create a review project and models
Create or open a Speckle project for your review. Organise separate models per discipline (e.g. Architecture, Structure, MEP) and ensure each author is publishing to the correct model.
2
Federate models if you have multiple disciplines
In the 3D viewer, load the primary model, then select Add model to scene (+) in the Models panel and add the other disciplines (e.g. structural, MEP). See
Federation for options and limits.
3
Set up saved views for key topics
Navigate to an important viewpoint (e.g. lobby, core, facade area) and set section planes, filters, and visibility. In the Views panel, select Save view and give each viewpoint a clear name such as
“Level 02 Lobby – Fire Strategy” or “Facade – North Elevation”. Group related views by discipline or review round. See Saved Views for details.
4
Decide what will be reviewed in each session
For each review session, pick a small set of saved views and topics (e.g. “Stair core clearances”, “Envelope coordination”, “Plant room layout”). Note which disciplines and team members must attend.
5
Share access and links ahead of time
Invite reviewers to the project and confirm they can open the relevant models. Use Copy link on each saved view and paste the links into the calendar invite or meeting agenda so everyone lands in the same context.
Outcome: A federated model with named saved views and clear scope for the review session.
When to use: Live reviews on a call or in a room where one person drives the model.
1
Start from the agreed saved view
Open the project and models in the 3D viewer, then select the first saved view from the review agenda. Confirm that everyone sees the same context before you start.
2
Keep the geometry readable
Use Section, Filters, and Isolate to keep the area under discussion clear while you talk through the design. Avoid making large camera movements while others are commenting. See
Exploration for the tools.
3
Capture visual feedback with sketches
As people raise comments, draw on the model with Sketch (pen, arrows, revision clouds, text). Save one view per topic and name it to match the agenda item or issue it relates to. See
Sketch on your model for tools.
4
Convert important points into issues
For each decision or required change, select the relevant object(s), then create an Issue from the Issues panel. Set title, description, assignee, priority, and due date while the conversation is fresh. Use labels to tag discipline or
review round (e.g. “DR01”, “Structure”). See Issues for full field behaviour.
5
Capture open questions as issues or comments
When there is an open question or debate that will continue after the meeting, either create a separate Issue for it or add a clear comment on an existing issue. Mention the relevant people, summarise options, and link to any supporting files.
6
Bookmark the review state
Once the meeting ends, save a view that captures the final camera, filters, and sketches. Use this as the entry point for asynchronous follow‑up work.
Outcome: Key decisions and change requests are captured as issues and comments, with sketches and saved views tying them back to the 3D model.
When to use: Reviewers are in different time zones or cannot attend the same meeting.
1
Send links to review views and issues
Share links to the saved views and specific issues created during the session. Encourage
reviewers to reply in‑place instead of sending screenshots or emails.
2
Group related feedback on issues
For topics that affect multiple areas or models (e.g. fire strategy, circulation), keep the
conversation in one or a small number of Issues. Encourage people to reply on those issues
so context stays in one place instead of spreading across channels.
3
Assign clear owners
Ensure every actionable comment is attached to an Issue with an assignee. Use @mentions in
issue comments to bring in additional stakeholders where needed.
4
Resolve issues when agreed
When a topic is agreed or a question is answered, select Resolve issue so they no longer
clutter the active list. You can always create follow‑up issues later if required.
Outcome: Feedback from people who were not in the original meeting is captured directly against the model and grouped by issue.
When to use: Multi‑disciplinary models or multiple design rounds.
1
Use federation for cross-discipline context
Keep models from different tools and disciplines loaded together so reviewers see clashes and
coordination issues in context. Use Isolate model or Hide model in Models to focus
on one discipline at a time.
2
Ask what changed between rounds
When a new version is published, ask Speckle Intelligence what changed since the previous round,
and have it filter and colour the changed elements. Focus on areas with many issues to confirm
that fixes have been applied. See Assess model changes with Speckle
Intelligence.
3
Tie issues to specific versions when needed
For changes that must be tracked precisely, record or pin the model version in your issue
descriptions so reviewers know which drop a comment relates to. Opening an issue loads the
version it was raised on, so you can revisit the original context when validating fixes.
4
Use labels to group issues by review round
Agree label conventions such as “DR01”, “DR02”, or “Coordination‑MEP” and apply them
consistently. This makes it easy to filter issues per round or per coordination topic in both
the viewer and dashboards.
Outcome: Discipline teams can see how designs evolve between rounds and confirm that coordination issues are being resolved.
When to use: After a review round, when changes are being implemented and verified.
1
Review open issues by priority and due date
Open the Issues panel in the 3D viewer or the project’s Issues page. Filter by status, priority, assignee, labels, or overdue. Confirm that high‑priority items from the latest round are clearly assigned and understood.
2
Implement changes in authoring tools
Designers and engineers resolve issues in their native tools, using connectors to see associated issues where available. Keep the Speckle model updated by publishing new versions once fixes
are applied.
3
Verify fixes in the viewer
After publishing, load the updated versions and re‑visit the saved views and issues. Confirm that each issue is addressed visually and in the data (e.g. correct geometry, properties, and clearances).
4
Update issue status and resolutions
For each verified fix, move the issue to Ready for Review or Resolved according to your team’s convention. Add a short reply describing what was changed so the history is clear.
5
Prepare for the next round if needed
If further review is required, create new saved views and issues for the next round, and label them accordingly. Delete views that are no longer in use to keep the Views panel tidy.
Outcome: Design review rounds are closed cleanly, with a clear record of what was requested, what was changed, and when it was verified.
How many saved views should we create for a review?
Start with a small number that cover the key questions for the session, typically 5–10 views.
You can add more later, but too many views make it harder for reviewers to know where to focus.
Should we use one issue or many for feedback?
Use one issue when several comments all relate to the same location and decision, and separate
issues when there are clearly different problems or owners. Each issue should represent a
reviewable piece of work with a clear outcome.
How do we keep track of which comments belong to which review round?
Use labels on issues (e.g. DR01, DR02) and include the round in saved view names. You can then
filter issues by label in the viewer or dashboards to see everything from a specific round.
Can external stakeholders review the model without editing anything?
Yes. Give them the Reviewer project role and share links to saved views. Reviewers can open
issues and reply to them, but cannot save views.
What if we forget to create issues during the meeting?
You can create issues after the fact from sketches and meeting notes by revisiting the saved
views and translating important comments into issues. The earlier you do this, the less context
you lose.
How do we avoid duplicate issues for the same problem?
Before creating a new issue, quickly search existing issues by keywords, labels, or affected
area. If one already exists, add a reply or update its properties instead of creating a new one.
Can we report on review progress on a dashboard?
Use dashboard Issues widgets to track issue counts by status, label, and assignee. See Common
workflows for dashboard patterns.
How do we handle issues that span multiple models or disciplines?
Create a single coordination issue that references all relevant models and clearly describes the
cross‑discipline impact. Use labels to tag each discipline and link to any related
per‑discipline issues.
What happens to issues when a model changes significantly?
Issues stay attached to the objects and versions they were created on. If objects are deleted or
heavily modified, you can still load the original version to see the original context, then
decide whether to close or recreate issues on the new design.
Can we export a summary of review issues?
Not directly from the Issues list. Build a dashboard with the Issues list or Issues
Overview widget and share it instead. See
Issues.
Why use Speckle for design review instead of Miro or similar?
Speckle keeps feedback, issues, and sketches tied directly to models and versions, with
structured fields (status, assignee, labels) and version awareness. Tools like Miro are
excellent for presentation boards, but treat the model as just another frame; you have to manage
ownership, status, and version context manually. A common pattern is to run the actual review
and tracking in Speckle, then embed Speckle views into Miro or similar tools when you need a
storyboard or client presentation.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Speckle Docs","colors":{"primary":"#2563EB","light":"#3B82F6","dark":"#2563EB"},"logo":{"light":"https://mintcdn.com/speckle/8FGkkbZZbcuHzOBq/logo/light.svg?fit=max\u0026auto=format\u0026n=8FGkkbZZbcuHzOBq\u0026q=85\u0026s=9fc87cac252fa8cc443a9828ecbace70","dark":"https://mintcdn.com/speckle/8FGkkbZZbcuHzOBq/logo/dark.svg?fit=max\u0026auto=format\u0026n=8FGkkbZZbcuHzOBq\u0026q=85\u0026s=560ffcf355d3abfde56e5f8e514a64b7"},"favicon":"https://mintcdn.com/speckle/EShMFmfm7tGBxVKq/favicon-smaller.svg?fit=max\u0026auto=format\u0026n=EShMFmfm7tGBxVKq\u0026q=85\u0026s=805ae0301be5e103926e84e99871779c","navbar":{"links":[{"href":"https://speckle.systems/","label":"Speckle"},{"href":"https://speckle.community/","label":"Support"}],"primary":{"type":"button","label":"Sign up","href":"https://app.speckle.systems/?utm_source=Docs\u0026utm_medium=SignUp\u0026utm_campaign=Docs"}},"footer":{"socials":{"linkedin":"https://www.linkedin.com/company/specklesystems","youtube":"https://www.youtube.com/@SpeckleSystems","github":"https://github.com/specklesystems","instagram":"https://www.instagram.com/specklesystems"}},"icons":{"library":"fontawesome"},"integrations":{"ga4":{"measurementId":"G-05WEYFZ28C"},"intercom":{"appId":"hoiaq4wn"},"mixpanel":{"projectToken":"acd87c5a50b56df91a795e999812a3a4"}},"contextual":{"options":["copy","chatgpt","claude"],"display":"header"},"metadata":{"timestamp":true},"markdown":{"instructions":["These docs describe Speckle as it works today, including everything released in 2026.9. Treat page content as current unless the page or section says it applies only to versions published before 2026.9.","Content scoped to versions published before 2026.9 (the object graph and root object, Proxies, Receive2, operations.receive, object.children) applies only to model versions in that earlier data format. For versions published in 2026.9, answer from the Object model pages and the SDK migration guides.","The What's new pages summarise what changed in 2026.9 and link to the page that documents each change. Answer from the linked page rather than from the summary. Legacy (v2) connectors are retired; send questions about them to the community help forum.","Match guidance to the customer's deployment, model data format, connector, plan and permissions. Self-hosted servers on a release before 2026.9 and compatibility-mode workflows follow the Compatibility mode page. If an unknown version or data format changes the answer, ask one focused question; do not infer the deployment version from the date alone."]},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"speckle","hasAudioNarration":false,"actualSubdomain":"speckle","customDomains":["docs.speckle.systems"],"gitSource":{"type":"github","owner":"specklesystems","repo":"speckle-docs-new","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae306ba36199f9bca5446ac","collectionId":"c0a27784-b9bd-4a60-804a-0f7ae4af7863","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae306ba36199f9bca5446ac"},"feedback":{"issues":true},"entitlements":{},"buildId":"6ae306ba36199f9bca5446ac","clientVersion":"0.0.4021","searchFilterCounts":[{"language":"default","tag":"Developers","count":200},{"language":"default","tag":"User Guides","count":95},{"language":"default","tag":"SDKs","count":65},{"language":"default","tag":"API Reference","count":54},{"language":"default","tag":"Viewer","count":50},{"language":"default","tag":"Connectors","count":39},{"language":"default","tag":"Publishing \u0026 Loading","count":37},{"language":"default","tag":"C# .NET","count":33},{"language":"default","tag":"Python","count":30},{"language":"default","tag":"Guides","count":23}]},"assistantConfig":{},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"#footer div:first-child>div:first-child>div:first-child{display:none}.header-link+p{margin-top:.6rem}li .frame{margin-top:1rem;margin-bottom:1.5rem}div:has(>.frame)+div:has(>.frame){margin-top:.75rem}"}],"page":{"pagePath":"workflows/design-review-workflow","slug":"/workflows/design-review-workflow","pageMetadata":{"title":"Design review workflow","sidebarTitle":"Design Review","description":"Run structured design reviews in Speckle using saved views, federation, sketches, and issues.","href":"/workflows/design-review-workflow"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Run structured design reviews in Speckle using saved views, federation, sketches, and issues.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,li:`li`,p:`p`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{Accordion,AccordionGroup,Heading,Note,Step,Steps}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!AccordionGroup)_missingMdxReference(`AccordionGroup`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Use this guide when you need a repeatable way to run design reviews in Speckle. It ties together saved views, federation, sketches, and issues into one end‑to‑end workflow, for teams that already view and share models in Speckle.`}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Before you start:`}),` You need a Speckle project, at least one model, and access to the 3D viewer.\nIf you are new to Speckle, complete the `,_jsx(_components.a,{href:`/quickstart/quickstart`,children:`Quickstart`}),` first.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`prepare-the-model-for-review`,children:`Prepare the model for review`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`When to use:`}),` Before a formal review meeting or an asynchronous review round.`]}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Create a review project and models`,children:_jsx(_components.p,{children:`Create or open a Speckle project for your review. Organise separate models per discipline (e.g. Architecture, Structure, MEP) and ensure each author is publishing to the correct model.`})}),_jsx(Step,{title:`Federate models if you have multiple disciplines`,children:_jsxs(_components.p,{children:[`In the 3D viewer, load the primary model, then select `,_jsx(_components.strong,{children:`Add model to scene`}),` (`,_jsx(_components.strong,{children:`+`}),`) in the `,_jsx(_components.strong,{children:`Models`}),` panel and add the other disciplines (e.g. structural, MEP). See\n`,_jsx(_components.a,{href:`/3d-viewer/federation`,children:`Federation`}),` for options and limits.`]})}),_jsx(Step,{title:`Set up saved views for key topics`,children:_jsxs(_components.p,{children:[`Navigate to an important viewpoint (e.g. lobby, core, facade area) and set section planes, filters, and visibility. In the `,_jsx(_components.strong,{children:`Views`}),` panel, select `,_jsx(_components.strong,{children:`Save view`}),` and give each viewpoint a clear name such as\n“Level 02 Lobby – Fire Strategy” or “Facade – North Elevation”. Group related views by discipline or review round. See `,_jsx(_components.a,{href:`/3d-viewer/saved-views`,children:`Saved Views`}),` for details.`]})}),_jsx(Step,{title:`Decide what will be reviewed in each session`,children:_jsx(_components.p,{children:`For each review session, pick a small set of saved views and topics (e.g. “Stair core clearances”, “Envelope coordination”, “Plant room layout”). Note which disciplines and team members must attend.`})}),_jsx(Step,{title:`Share access and links ahead of time`,children:_jsxs(_components.p,{children:[`Invite reviewers to the project and confirm they can open the relevant models. Use `,_jsx(_components.strong,{children:`Copy link`}),` on each saved view and paste the links into the calendar invite or meeting agenda so everyone lands in the same context.`]})})]}),`\n`,_jsx(_components.p,{children:`Outcome: A federated model with named saved views and clear scope for the review session.`}),`\n`,_jsx(Heading,{level:`2`,id:`run-a-formal-design-review-session`,children:`Run a formal design review session`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`When to use:`}),` Live reviews on a call or in a room where one person drives the model.`]}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Start from the agreed saved view`,children:_jsx(_components.p,{children:`Open the project and models in the 3D viewer, then select the first saved view from the review agenda. Confirm that everyone sees the same context before you start.`})}),_jsx(Step,{title:`Keep the geometry readable`,children:_jsxs(_components.p,{children:[`Use `,_jsx(_components.strong,{children:`Section`}),`, `,_jsx(_components.strong,{children:`Filters`}),`, and `,_jsx(_components.strong,{children:`Isolate`}),` to keep the area under discussion clear while you talk through the design. Avoid making large camera movements while others are commenting. See\n`,_jsx(_components.a,{href:`/3d-viewer/exploration`,children:`Exploration`}),` for the tools.`]})}),_jsx(Step,{title:`Capture visual feedback with sketches`,children:_jsxs(_components.p,{children:[`As people raise comments, draw on the model with `,_jsx(_components.strong,{children:`Sketch`}),` (pen, arrows, revision clouds, text). Save one view per topic and name it to match the agenda item or issue it relates to. See\n`,_jsx(_components.a,{href:`/3d-viewer/markups`,children:`Sketch on your model`}),` for tools.`]})}),_jsx(Step,{title:`Convert important points into issues`,children:_jsxs(_components.p,{children:[`For each decision or required change, select the relevant object(s), then create an `,_jsx(_components.strong,{children:`Issue`}),` from the `,_jsx(_components.strong,{children:`Issues`}),` panel. Set title, description, assignee, priority, and due date while the conversation is fresh. Use labels to tag discipline or\nreview round (e.g. “DR01”, “Structure”). See `,_jsx(_components.a,{href:`/3d-viewer/issues`,children:`Issues`}),` for full field behaviour.`]})}),_jsx(Step,{title:`Capture open questions as issues or comments`,children:_jsxs(_components.p,{children:[`When there is an open question or debate that will continue after the meeting, either create a separate `,_jsx(_components.strong,{children:`Issue`}),` for it or add a clear comment on an existing issue. Mention the relevant people, summarise options, and link to any supporting files.`]})}),_jsx(Step,{title:`Bookmark the review state`,children:_jsx(_components.p,{children:`Once the meeting ends, save a view that captures the final camera, filters, and sketches. Use this as the entry point for asynchronous follow‑up work.`})})]}),`\n`,_jsx(_components.p,{children:`Outcome: Key decisions and change requests are captured as issues and comments, with sketches and saved views tying them back to the 3D model.`}),`\n`,_jsx(Heading,{level:`2`,id:`collect-asynchronous-feedback`,children:`Collect asynchronous feedback`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`When to use:`}),` Reviewers are in different time zones or cannot attend the same meeting.`]}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Send links to review views and issues`,children:_jsx(_components.p,{children:`Share links to the saved views and specific issues created during the session. Encourage\nreviewers to reply in‑place instead of sending screenshots or emails.`})}),_jsx(Step,{title:`Group related feedback on issues`,children:_jsxs(_components.p,{children:[`For topics that affect multiple areas or models (e.g. fire strategy, circulation), keep the\nconversation in one or a small number of `,_jsx(_components.strong,{children:`Issues`}),`. Encourage people to reply on those issues\nso context stays in one place instead of spreading across channels.`]})}),_jsx(Step,{title:`Assign clear owners`,children:_jsxs(_components.p,{children:[`Ensure every actionable comment is attached to an `,_jsx(_components.strong,{children:`Issue`}),` with an assignee. Use @mentions in\nissue comments to bring in additional stakeholders where needed.`]})}),_jsx(Step,{title:`Resolve issues when agreed`,children:_jsxs(_components.p,{children:[`When a topic is agreed or a question is answered, select `,_jsx(_components.strong,{children:`Resolve issue`}),` so they no longer\nclutter the active list. You can always create follow‑up issues later if required.`]})})]}),`\n`,_jsx(_components.p,{children:`Outcome: Feedback from people who were not in the original meeting is captured directly against the model and grouped by issue.`}),`\n`,_jsx(Heading,{level:`2`,id:`coordinate-across-disciplines-and-versions`,children:`Coordinate across disciplines and versions`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`When to use:`}),` Multi‑disciplinary models or multiple design rounds.`]}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Use federation for cross-discipline context`,children:_jsxs(_components.p,{children:[`Keep models from different tools and disciplines loaded together so reviewers see clashes and\ncoordination issues in context. Use `,_jsx(_components.strong,{children:`Isolate model`}),` or `,_jsx(_components.strong,{children:`Hide model`}),` in `,_jsx(_components.strong,{children:`Models`}),` to focus\non one discipline at a time.`]})}),_jsx(Step,{title:`Ask what changed between rounds`,children:_jsxs(_components.p,{children:[`When a new version is published, ask Speckle Intelligence what changed since the previous round,\nand have it filter and colour the changed elements. Focus on areas with many issues to confirm\nthat fixes have been applied. See `,_jsx(_components.a,{href:`/workflows/assess-model-changes`,children:`Assess model changes with Speckle\nIntelligence`}),`.`]})}),_jsx(Step,{title:`Tie issues to specific versions when needed`,children:_jsx(_components.p,{children:`For changes that must be tracked precisely, record or pin the model version in your issue\ndescriptions so reviewers know which drop a comment relates to. Opening an issue loads the\nversion it was raised on, so you can revisit the original context when validating fixes.`})}),_jsx(Step,{title:`Use labels to group issues by review round`,children:_jsx(_components.p,{children:`Agree label conventions such as “DR01”, “DR02”, or “Coordination‑MEP” and apply them\nconsistently. This makes it easy to filter issues per round or per coordination topic in both\nthe viewer and dashboards.`})})]}),`\n`,_jsx(_components.p,{children:`Outcome: Discipline teams can see how designs evolve between rounds and confirm that coordination issues are being resolved.`}),`\n`,_jsx(Heading,{level:`2`,id:`follow-up-and-close-the-review`,children:`Follow up and close the review`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`When to use:`}),` After a review round, when changes are being implemented and verified.`]}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Review open issues by priority and due date`,children:_jsxs(_components.p,{children:[`Open the `,_jsx(_components.strong,{children:`Issues`}),` panel in the 3D viewer or the project’s `,_jsx(_components.strong,{children:`Issues`}),` page. Filter by status, priority, assignee, labels, or overdue. Confirm that high‑priority items from the latest round are clearly assigned and understood.`]})}),_jsx(Step,{title:`Implement changes in authoring tools`,children:_jsx(_components.p,{children:`Designers and engineers resolve issues in their native tools, using connectors to see associated issues where available. Keep the Speckle model updated by publishing new versions once fixes\nare applied.`})}),_jsx(Step,{title:`Verify fixes in the viewer`,children:_jsx(_components.p,{children:`After publishing, load the updated versions and re‑visit the saved views and issues. Confirm that each issue is addressed visually and in the data (e.g. correct geometry, properties, and clearances).`})}),_jsx(Step,{title:`Update issue status and resolutions`,children:_jsxs(_components.p,{children:[`For each verified fix, move the issue to `,_jsx(_components.strong,{children:`Ready for Review`}),` or `,_jsx(_components.strong,{children:`Resolved`}),` according to your team’s convention. Add a short reply describing what was changed so the history is clear.`]})}),_jsx(Step,{title:`Prepare for the next round if needed`,children:_jsxs(_components.p,{children:[`If further review is required, create new saved views and issues for the next round, and label them accordingly. Delete views that are no longer in use to keep the `,_jsx(_components.strong,{children:`Views`}),` panel tidy.`]})})]}),`\n`,_jsx(_components.p,{children:`Outcome: Design review rounds are closed cleanly, with a clear record of what was requested, what was changed, and when it was verified.`}),`\n`,_jsx(Heading,{level:`2`,id:`best-practices`,children:`Best practices`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Keep scopes small`}),`: Limit each review session to a manageable set of views and topics so issues stay focused.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Name consistently`}),`: Use consistent naming for saved views, issues, and labels so people can find related items quickly.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Decide on status conventions`}),`: Agree what `,_jsx(_components.strong,{children:`Open`}),`, `,_jsx(_components.strong,{children:`Ready for Review`}),`, and `,_jsx(_components.strong,{children:`Resolved`}),` mean for your team before you start.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Use labels for reporting`}),`: Plan labels so dashboards and reports can slice issues by discipline, review round, or risk category.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Avoid duplicate channels`}),`: Encourage feedback in issues (and their comments) instead of email and chat so history stays with the model.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`faq`,children:`FAQ`}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`How many saved views should we create for a review?`,id:`how-many-saved-views-should-we-create-for-a-review`,children:_jsx(_components.p,{children:`Start with a small number that cover the key questions for the session, typically 5–10 views.\nYou can add more later, but too many views make it harder for reviewers to know where to focus.`})}),_jsx(Accordion,{title:`Should we use one issue or many for feedback?`,id:`should-we-use-one-issue-or-many-for-feedback`,children:_jsx(_components.p,{children:`Use one issue when several comments all relate to the same location and decision, and separate\nissues when there are clearly different problems or owners. Each issue should represent a\nreviewable piece of work with a clear outcome.`})}),_jsx(Accordion,{title:`How do we keep track of which comments belong to which review round?`,id:`how-do-we-keep-track-of-which-comments-belong-to-which-review-round`,children:_jsx(_components.p,{children:`Use labels on issues (e.g. DR01, DR02) and include the round in saved view names. You can then\nfilter issues by label in the viewer or dashboards to see everything from a specific round.`})}),_jsx(Accordion,{title:`Can external stakeholders review the model without editing anything?`,id:`can-external-stakeholders-review-the-model-without-editing-anything`,children:_jsxs(_components.p,{children:[`Yes. Give them the `,_jsx(_components.strong,{children:`Reviewer`}),` project role and share links to saved views. Reviewers can open\nissues and reply to them, but cannot save views.`]})}),_jsx(Accordion,{title:`What if we forget to create issues during the meeting?`,id:`what-if-we-forget-to-create-issues-during-the-meeting`,children:_jsx(_components.p,{children:`You can create issues after the fact from sketches and meeting notes by revisiting the saved\nviews and translating important comments into issues. The earlier you do this, the less context\nyou lose.`})}),_jsx(Accordion,{title:`How do we avoid duplicate issues for the same problem?`,id:`how-do-we-avoid-duplicate-issues-for-the-same-problem`,children:_jsx(_components.p,{children:`Before creating a new issue, quickly search existing issues by keywords, labels, or affected\narea. If one already exists, add a reply or update its properties instead of creating a new one.`})}),_jsx(Accordion,{title:`Can we report on review progress on a dashboard?`,id:`can-we-report-on-review-progress-on-a-dashboard`,children:_jsxs(_components.p,{children:[`Use dashboard Issues widgets to track issue counts by status, label, and assignee. See `,_jsx(_components.a,{href:`/analytics/dashboards/common-workflows`,children:`Common\nworkflows`}),` for dashboard patterns.`]})}),_jsx(Accordion,{title:`How do we handle issues that span multiple models or disciplines?`,id:`how-do-we-handle-issues-that-span-multiple-models-or-disciplines`,children:_jsx(_components.p,{children:`Create a single coordination issue that references all relevant models and clearly describes the\ncross‑discipline impact. Use labels to tag each discipline and link to any related\nper‑discipline issues.`})}),_jsx(Accordion,{title:`What happens to issues when a model changes significantly?`,id:`what-happens-to-issues-when-a-model-changes-significantly`,children:_jsx(_components.p,{children:`Issues stay attached to the objects and versions they were created on. If objects are deleted or\nheavily modified, you can still load the original version to see the original context, then\ndecide whether to close or recreate issues on the new design.`})}),_jsx(Accordion,{title:`Can we export a summary of review issues?`,id:`can-we-export-a-summary-of-review-issues`,children:_jsxs(_components.p,{children:[`Not directly from the Issues list. Build a dashboard with the `,_jsx(_components.strong,{children:`Issues list`}),` or `,_jsx(_components.strong,{children:`Issues\nOverview`}),` widget and share it instead. See\n`,_jsx(_components.a,{href:`/3d-viewer/issues#issues-in-speckle-intelligence`,children:`Issues`}),`.`]})}),_jsx(Accordion,{title:`Why use Speckle for design review instead of Miro or similar?`,id:`why-use-speckle-for-design-review-instead-of-miro-or-similar`,children:_jsx(_components.p,{children:`Speckle keeps feedback, issues, and sketches tied directly to models and versions, with\nstructured fields (status, assignee, labels) and version awareness. Tools like Miro are\nexcellent for presentation boards, but treat the model as just another frame; you have to manage\nownership, status, and version context manually. A common pattern is to run the actual review\nand tracking in Speckle, then embed Speckle views into Miro or similar tools when you need a\nstoryboard or client presentation.`})})]}),`\n`,_jsx(Heading,{level:`2`,id:`see-also`,children:`See also`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/3d-viewer/saved-views`,children:`Saved Views`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/3d-viewer/federation`,children:`Federation`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/3d-viewer/markups`,children:`Sketch on your model`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/3d-viewer/issues`,children:`Issues`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/workflows/assess-model-changes`,children:`Assess model changes with Speckle Intelligence`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/analytics/dashboards/common-workflows`,children:`Common workflows`})}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Design review workflow","sidebarTitle":"Design Review","description":"Run structured design reviews in Speckle using saved views, federation, sketches, and issues.","href":"/workflows/design-review-workflow"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Prepare the model for review","slug":"prepare-the-model-for-review","depth":2,"children":[]},{"title":"Run a formal design review session","slug":"run-a-formal-design-review-session","depth":2,"children":[]},{"title":"Collect asynchronous feedback","slug":"collect-asynchronous-feedback","depth":2,"children":[]},{"title":"Coordinate across disciplines and versions","slug":"coordinate-across-disciplines-and-versions","depth":2,"children":[]},{"title":"Follow up and close the review","slug":"follow-up-and-close-the-review","depth":2,"children":[]},{"title":"Best practices","slug":"best-practices","depth":2,"children":[]},{"title":"FAQ","slug":"faq","depth":2,"children":[]},{"title":"See also","slug":"see-also","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/speckle/338e4d421a1293df/.omp/extensions/atlas-sync.js"],"subdomain":"speckle","siteName":"Speckle Docs","title":"Design review workflow - Speckle Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-19T09:16:26.540Z","gitLastModified":"2026-10-19T08:27:13.000Z","originalFileLocation":"workflows/design-review-workflow.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Run structured design reviews in Speckle using saved views, federation, sketches, and issues.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Speckle Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/speckle/1IrIIntzKgAhEEgb/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/speckle/1IrIIntzKgAhEEgb/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/speckle/1IrIIntzKgAhEEgb/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/speckle/1IrIIntzKgAhEEgb/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/speckle/1IrIIntzKgAhEEgb/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/speckle/1IrIIntzKgAhEEgb/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/speckle/1IrIIntzKgAhEEgb/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/speckle/1IrIIntzKgAhEEgb/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/speckle/1IrIIntzKgAhEEgb/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Design review workflow - Speckle Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Run structured design reviews in Speckle using saved views, federation, sketches, and issues.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Speckle Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.speckle.systems/workflows/design-review-workflow\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://speckle.mintlify.app/_mintlify/api/og/v2?division=Workflows\u0026amp;title=Design+review+workflow\u0026amp;description=Run+structured+design+reviews+in+Speckle+using+saved+views%2C+federation%2C+sketches%2C+and+issues.\u0026amp;theme=0f587db618e29aef1bad566c\u0026amp;signature=01f288d7dcbfe20db279447df19ef4fbb77a2f608396706a1293a1c5dc36ca7f\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Design review workflow - Speckle Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Run structured design reviews in Speckle using saved views, federation, sketches, and issues.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://speckle.mintlify.app/_mintlify/api/og/v2?division=Workflows\u0026amp;title=Design+review+workflow\u0026amp;description=Run+structured+design+reviews+in+Speckle+using+saved+views%2C+federation%2C+sketches%2C+and+issues.\u0026amp;theme=0f587db618e29aef1bad566c\u0026amp;signature=01f288d7dcbfe20db279447df19ef4fbb77a2f608396706a1293a1c5dc36ca7f\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/speckle/1IrIIntzKgAhEEgb/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Speckle Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#2563EB\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.speckle.systems/workflows/design-review-workflow\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/workflows/design-review-workflow.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.speckle.systems/#organization\",\"name\":\"Speckle Docs\",\"url\":\"https://docs.speckle.systems\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/speckle/8FGkkbZZbcuHzOBq/logo/light.svg?fit=max\u0026auto=format\u0026n=8FGkkbZZbcuHzOBq\u0026q=85\u0026s=9fc87cac252fa8cc443a9828ecbace70\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.speckle.systems#website\",\"name\":\"Speckle Docs\",\"url\":\"https://docs.speckle.systems\",\"publisher\":{\"@id\":\"https://docs.speckle.systems/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.speckle.systems/workflows/design-review-workflow#webpage\",\"url\":\"https://docs.speckle.systems/workflows/design-review-workflow\",\"name\":\"Design review workflow\",\"description\":\"Run structured design reviews in Speckle using saved views, federation, sketches, and issues.\",\"dateModified\":\"2026-10-19T08:27:13.000Z\",\"isPartOf\":{\"@id\":\"https://docs.speckle.systems#website\"},\"breadcrumb\":{\"@id\":\"https://docs.speckle.systems/workflows/design-review-workflow#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.speckle.systems/workflows/design-review-workflow#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Workflows\",\"item\":\"https://docs.speckle.systems/workflows/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Design review workflow\",\"item\":\"https://docs.speckle.systems/workflows/design-review-workflow\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.speckle.systems/workflows/design-review-workflow#article\",\"headline\":\"Design review workflow\",\"name\":\"Design review workflow\",\"description\":\"Run structured design reviews in Speckle using saved views, federation, sketches, and issues.\",\"url\":\"https://docs.speckle.systems/workflows/design-review-workflow\",\"mainEntityOfPage\":{\"@id\":\"https://docs.speckle.systems/workflows/design-review-workflow#webpage\"},\"dateModified\":\"2026-10-19T08:27:13.000Z\",\"publisher\":{\"@id\":\"https://docs.speckle.systems/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.speckle.systems#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Speckle Docs\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Speckle Docs","nav":{"global":null,"dropdowns":[{"dropdown":"User Guides","icon":"book-open","groups":[{"group":"Quick Reference","pages":[{"title":"Welcome to Speckle","sidebarTitle":"Welcome","href":"/quickstart/welcome"},{"title":"Speckle's new data model: what has changed for you","sidebarTitle":"Data model migration","href":"/workspaces/data-model-migration"},{"title":"Quickstart Guide","href":"/quickstart/quickstart"},{"title":"Frequently Asked Questions","href":"/quickstart/faq"},{"title":"What's new in 2026.9 for workspace users","sidebarTitle":"What's new","href":"/whats-new/users"}]},{"group":"Your Speckle Workspace","pages":[{"title":"Organize teams and projects","sidebarTitle":"Overview","href":"/workspaces/introduction"},{"group":"Projects, Models, and Versions","pages":[{"title":"Projects","href":"/workspaces/projects"},{"title":"Models","href":"/workspaces/models"},{"title":"Version Control","href":"/workspaces/versions"}]},{"group":"Access and Identity","pages":[{"title":"Roles and permissions","href":"/workspaces/roles-and-seats"},{"title":"Invite to Workspace","href":"/workspaces/inviting"},{"title":"Workspace Discoverability","href":"/workspaces/workspace-discoverability"},{"title":"Domain Protection","href":"/workspaces/domain-protection"},{"title":"Single Sign-On (SSO)","tag":"Enterprise","href":"/workspaces/sso"},{"title":"User provisioning (SCIM)","sidebarTitle":"Provisioning (SCIM)","tag":"Enterprise","href":"/workspaces/scim"}]},{"group":"Plans and Governance","pages":[{"title":"Plans and Governance","sidebarTitle":"Overview","href":"/workspaces/plans-and-governance"},{"title":"Billing","href":"/workspaces/billing"},{"title":"Data Residency","tag":"Enterprise","href":"/workspaces/data-residency"}]},{"group":"Configuration","pages":[{"title":"Configuration","href":"/workspaces/configuration"},{"title":"Check workspace activity, plan limits, and AI spend","sidebarTitle":"Usage","href":"/workspaces/usage"},{"title":"Project metadata","tag":"Enterprise","href":"/workspaces/configuration/project-metadata"}]}]},{"group":"Viewing \u0026 Sharing","pages":[{"title":"Open and explore models in the 3D viewer","sidebarTitle":"Overview","href":"/3d-viewer/introduction"},{"title":"Interface and navigation","href":"/3d-viewer/interface-nav"},{"group":"Inspect and Compare","pages":[{"title":"Filter, browse, and measure your model","sidebarTitle":"Exploration","href":"/3d-viewer/exploration"},{"title":"Compare versions","href":"/3d-viewer/compare-versions"},{"title":"Combine models in one scene","sidebarTitle":"Model federation","href":"/3d-viewer/federation"}]},{"group":"Feedback and Tracking","pages":[{"title":"Issues","href":"/3d-viewer/issues"},{"title":"Sketch on your model","sidebarTitle":"Sketch","href":"/3d-viewer/markups"},{"title":"Saved views","href":"/3d-viewer/saved-views"}]},{"group":"Present and Share","pages":[{"title":"Present a model with saved views","sidebarTitle":"Presentation","href":"/3d-viewer/presentation"},{"title":"Share your models","href":"/3d-viewer/sharing"}]}]},{"group":"Publishing \u0026 Loading","pages":[{"title":"Connectors, cloud integrations, and file uploads","sidebarTitle":"Overview","href":"/connectors/overview"},{"group":"Connectors","pages":[{"title":"Installing Connectors","href":"/connectors/installation"},{"title":"Connector Assets \u0026 Templates","sidebarTitle":"Assets \u0026 Templates","href":"/connectors/assets"},{"group":"Revit","pages":[{"title":"How to use Speckle for Revit","sidebarTitle":"Quickstart","href":"/connectors/revit/revit"},{"title":"Loading blocks as families in Revit","sidebarTitle":"Blocks as Families","href":"/connectors/revit/blocks-to-families"}]},{"group":"Rhino","pages":[{"title":"How to use Speckle for Rhino","sidebarTitle":"Quickstart","href":"/connectors/rhino/rhino"},{"title":"Revit Categorization","href":"/connectors/rhino/rhino-revit"},{"title":"RhinoInside","sidebarTitle":"RhinoInside","href":"/connectors/grasshopper/grasshopper-integrations"}]},{"group":"Grasshopper","pages":[{"title":"How to use Speckle for Grasshopper","sidebarTitle":"Quickstart","href":"/connectors/grasshopper/grasshopper"},{"title":"Explore what an object is connected to","sidebarTitle":"Explore","href":"/connectors/grasshopper/explore"},{"title":"Models","href":"/connectors/grasshopper/grasshopper-models"},{"title":"Collections","href":"/connectors/grasshopper/grasshopper-collections"},{"title":"Objects","href":"/connectors/grasshopper/grasshopper-objects"},{"title":"Properties","href":"/connectors/grasshopper/grasshopper-properties"},{"title":"Developer Nodes","href":"/connectors/grasshopper/grasshopper-developer"},{"title":"Recommendations","href":"/connectors/grasshopper/grasshopper-recommendations"},{"title":"Karamba3D","sidebarTitle":"Karamba3D","tag":"Third-Party","href":"/connectors/third-party/karamba3d"},{"title":"ShapeDiver","sidebarTitle":"ShapeDiver","tag":"Third-Party","href":"/connectors/third-party/shapediver"}]},{"title":"How to use Speckle for SketchUp","sidebarTitle":"SketchUp","href":"/connectors/sketchup"},{"group":"Power BI","pages":[{"title":"How to use Speckle for Power BI","sidebarTitle":"Quickstart","href":"/connectors/power-bi/power-bi"},{"title":"Power BI Data Gateway","sidebarTitle":"Data Gateway","href":"/connectors/power-bi/gateway"}]},{"title":"How to use Speckle for Archicad","sidebarTitle":"Archicad","href":"/connectors/archicad"},{"title":"Publish Navisworks models to Speckle","sidebarTitle":"Navisworks","href":"/connectors/navisworks"},{"title":"How to use Speckle for Blender","sidebarTitle":"Blender","href":"/connectors/blender"},{"title":"How to use Speckle for Civil 3D","sidebarTitle":"Civil 3D","href":"/connectors/civil3d"},{"title":"How to use Speckle for Plant 3D","sidebarTitle":"Plant 3D","href":"/connectors/plant3d"},{"title":"How to use Speckle for AutoCAD","sidebarTitle":"AutoCAD","href":"/connectors/autocad"},{"title":"How to use Speckle for ETABS","sidebarTitle":"ETABS","href":"/connectors/etabs"},{"title":"How to use Speckle for Tekla Structures","sidebarTitle":"Tekla Structures","href":"/connectors/teklastructures"},{"title":"How to use Speckle for Vectorworks","sidebarTitle":"Vectorworks","tag":"Third-Party","href":"/connectors/third-party/vectorworks"}]},{"group":"Cloud Integrations","pages":[{"title":"Autodesk Forma Data Management","sidebarTitle":"Forma Data Management (ACC)","tag":"Enterprise","href":"/connectors/cloud-integrations/acc"},{"title":"Sync models from Trimble Connect","sidebarTitle":"Trimble Connect","tag":"Enterprise","href":"/connectors/cloud-integrations/trimble-connect"},{"title":"Sync models from SharePoint","sidebarTitle":"SharePoint","href":"/connectors/cloud-integrations/sharepoint"},{"title":"Bentley ProjectWise","sidebarTitle":"Bentley ProjectWise","tag":"Enterprise","href":"/connectors/cloud-integrations/projectwise"},{"title":"Databricks","sidebarTitle":"Databricks","href":"/connectors/cloud-integrations/databricks"},{"title":"Snowflake","sidebarTitle":"Snowflake","href":"/connectors/cloud-integrations/snowflake"}]},{"title":"Direct uploads","href":"/connectors/direct-uploads/introduction"}]},{"group":"Analytics \u0026 Intelligence","pages":[{"group":"Intelligence","pages":[{"title":"Ask questions about your models with Speckle Intelligence","sidebarTitle":"Speckle Intelligence","href":"/analytics/intelligence"},{"title":"Reuse organisation playbooks with Intelligence skills","sidebarTitle":"Skills","href":"/analytics/intelligence-skills"},{"title":"Set standing AI Rules for the workspace","sidebarTitle":"AI Rules","href":"/analytics/intelligence-rules"},{"title":"Create and share Intelligence Reports","sidebarTitle":"Reports","href":"/analytics/reports"}]},{"group":"Dashboards","pages":[{"title":"Intelligence Dashboards","sidebarTitle":"Overview","href":"/analytics/intelligence-dashboards"},{"title":"Retired and replaced dashboard widgets","sidebarTitle":"Widget availability","href":"/analytics/dashboards-widget-availability"},{"title":"Layout","sidebarTitle":"Layout","href":"/analytics/dashboards/layout"},{"title":"Sharing","sidebarTitle":"Sharing","href":"/analytics/dashboards/sharing"},{"title":"Filters","sidebarTitle":"Filters","href":"/analytics/dashboards/filters"},{"title":"Lookup tables","sidebarTitle":"Lookup tables","href":"/analytics/dashboards/lookup-tables"},{"title":"Calculated fields","sidebarTitle":"Calculated fields","href":"/analytics/dashboards/calculated-fields"},{"title":"Common workflows","sidebarTitle":"Common workflows","href":"/analytics/dashboards/common-workflows"}]},{"group":"Data Validation","pages":[{"title":"Data Validation","sidebarTitle":"Overview","href":"/analytics/data-validation/overview"},{"title":"Checks","sidebarTitle":"Checks","href":"/analytics/data-validation/checks"},{"title":"Project standards","sidebarTitle":"Standards","href":"/analytics/data-validation/standards"},{"title":"Viewing Results","sidebarTitle":"Viewing Results","href":"/analytics/data-validation/viewing-results"},{"title":"Validation Widgets in Dashboards","sidebarTitle":"Validation Widgets","href":"/analytics/dashboards/validation-widgets"}]},{"group":"Data Conditioning","pages":[{"title":"Update parameters from the model viewer","sidebarTitle":"Parameter Updater","href":"/beta/parameter-updater"}]}]},{"group":"Workflows","pages":[{"title":"Combine capabilities into outcomes","sidebarTitle":"Overview","href":"/workflows/overview"},{"title":"Assess model changes with Speckle Intelligence","sidebarTitle":"Compare versions with Intelligence","href":"/workflows/assess-model-changes"},{"title":"Take off quantities and cost with Speckle Intelligence","sidebarTitle":"Quantity \u0026 cost takeoff","href":"/workflows/take-off-quantities"},{"title":"Benchmark a project against your portfolio with Speckle Intelligence","sidebarTitle":"Portfolio benchmarking","href":"/workflows/benchmark-against-your-portfolio"},{"title":"Validate incoming models automatically","sidebarTitle":"Automatic model validation","description":"Author a check once and set it to run on every new version, so a consultant, subcontractor, or federated model is validated against your standard at each submission without anyone remembering to run it.","href":"/workflows/validate-incoming-models-automatically"},{"title":"Design review workflow","sidebarTitle":"Design Review","href":"/workflows/design-review-workflow"},{"title":"Componentised Grasshopper workflow","sidebarTitle":"Grasshopper","description":"Break large Grasshopper definitions into modules that hand off data via Speckle models.","href":"/workflows/grasshopper-componentised-workflow"},{"title":"Compare parametric design options from Grasshopper","sidebarTitle":"Design Explorer","href":"/workflows/grasshopper-design-explorer"},{"title":"Extract Revit room data with SpecklePy","sidebarTitle":"Revit room data extraction","href":"/workflows/revit-room-data-extraction-specklepy"},{"title":"Analyse model data with SpecklePy and DuckDB","sidebarTitle":"SpecklePy analytics","href":"/workflows/specklepy-model-data-analytics"}]}],"global":{"anchors":[]}},{"dropdown":"Developers","icon":"code","tabs":[{"tab":"Build with Speckle","groups":[{"group":"Overview","pages":[{"title":"Developer documentation","sidebarTitle":"Introduction","href":"/developers/introduction"},{"title":"What's new in 2026.9 for developers","sidebarTitle":"What's new","href":"/whats-new/developers"}]},{"group":"Getting Started","pages":[{"title":"Your learning path","sidebarTitle":"Your Learning Path","href":"/developers/getting-started"},{"group":"Authentication","pages":[{"title":"Authenticating with Speckle","sidebarTitle":"Introduction","href":"/developers/authentication/introduction"},{"title":"Building with PATs","sidebarTitle":"PATs","href":"/developers/authentication/pats"},{"title":"Building with OAuth2","sidebarTitle":"OAuth2 and PKCE","href":"/developers/authentication/oauth2"},{"title":"Single Sign-On (SSO) Authentication","sidebarTitle":"SSO Authentication","href":"/developers/authentication/sso"}]},{"title":"Key Concepts","sidebarTitle":"Key Concepts","href":"/developers/key-concepts"}]},{"group":"Building Custom Apps","pages":[{"title":"Building Custom Applications","sidebarTitle":"Building Custom Apps","href":"/developers/building-apps"}]},{"group":"Building Integrations","pages":[{"title":"Add Speckle connectivity to your authoring applications","sidebarTitle":"Overview","href":"/developers/building-integrations"},{"title":"Build integrations on the bundle format","sidebarTitle":"Bundles","href":"/developers/building-integrations/bundles"},{"title":"Publish a bundle from your own code","sidebarTitle":"Publish","href":"/developers/building-integrations/publish"},{"title":"Load a bundle in your own code","sidebarTitle":"Load","href":"/developers/building-integrations/load"},{"title":"Publish, load, and integration depth","sidebarTitle":"Publish \u0026 Load","href":"/developers/connectivity/integration-depth"},{"title":"Desktop host connectivity","sidebarTitle":"Desktop Host","href":"/developers/connectivity/desktop-host"},{"title":"Cloud and automation connectivity","sidebarTitle":"Cloud \u0026 Automation","href":"/developers/connectivity/cloud-automation"},{"title":"Middleware and orchestration","sidebarTitle":"Middleware","href":"/developers/connectivity/middleware"},{"title":"Hybrid connectivity","sidebarTitle":"Hybrid","href":"/developers/connectivity/hybrid"},{"title":"Data model and build order","sidebarTitle":"Data \u0026 Build Order","href":"/developers/connectivity/data-and-build"},{"title":"Connectivity resources","sidebarTitle":"Resources","href":"/developers/connectivity/resources"}]},{"group":"Migration notices","hidden":true,"pages":[{"title":"Speckle's new data model: what has changed for developers","sidebarTitle":"Data model migration","href":"/developers/migration/data-model-migration"},{"title":"Publish through model ingestions, not legacy send","sidebarTitle":"Publish via ingestions","href":"/developers/migration/publish-through-ingestions"}]}]},{"tab":"Data Schema","groups":[{"group":"Object model","pages":[{"title":"Object model","sidebarTitle":"Overview","href":"/developers/object-model/overview"},{"title":"Relations","sidebarTitle":"Relations","href":"/developers/object-model/relations"},{"title":"Where version metadata lives","sidebarTitle":"Version metadata","href":"/developers/object-model/version-metadata"},{"title":"Geometry encoding","sidebarTitle":"Geometry encoding","href":"/developers/object-model/geometry-encoding"}]},{"group":"Object graph (before 2026.9)","pages":[{"title":"Data schema","href":"/developers/data-schema/overview"},{"title":"Core Concepts","href":"/developers/data-schema/concepts"},{"title":"Versions and the root object","href":"/developers/data-schema/version-root-object"},{"title":"Object Schema","href":"/developers/data-schema/object-schema"},{"title":"Traversal Recipes","href":"/developers/data-schema/traversal-recipes"},{"title":"Geometry Schema","href":"/developers/data-schema/geometry-schema"},{"title":"Proxy Schemas","href":"/developers/data-schema/proxy-schema"}]},{"group":"Connectors","pages":[{"title":"Object Types by Connector","sidebarTitle":"Object Types","href":"/developers/data-schema/connector-index"},{"group":"Schemas by Data Source","pages":[{"title":"ArchiCAD Schema","href":"/developers/data-schema/connectors/archicad-schema"},{"title":"IFC Schema","href":"/developers/data-schema/connectors/ifc-schema"},{"title":"Navisworks Schema","href":"/developers/data-schema/connectors/navisworks-schema"},{"title":"Revit Schema","href":"/developers/data-schema/connectors/revit-schema"},{"title":"Tekla Schema","href":"/developers/data-schema/connectors/tekla-schema"},{"title":"AutoCAD Schema","href":"/developers/data-schema/connectors/autocad-schema"},{"title":"Civil 3D Schema","href":"/developers/data-schema/connectors/civil3d-schema"},{"title":"ETABS Schema","href":"/developers/data-schema/connectors/etabs-schema"},{"title":"Rhino Schema","href":"/developers/data-schema/connectors/rhino-schema"}]}]}]},{"tab":"Interfaces","groups":[{"group":"GraphQL","pages":[{"title":"API reference","href":"/developers/api/graphql"},{"title":"Subscriptions","href":"/developers/api/subscriptions"},{"title":"GraphQL Endpoint","deprecated":null,"version":null,"openapi":"/developers/api/graphql-openapi.json post /graphql","href":"/api-reference/graphql/graphql-endpoint"}]},{"group":"REST","pages":[{"title":"API reference","href":"/developers/api/rest"},{"title":"Preview Service","href":"/developers/api/previews/preview-service"},{"title":"Download a Single Object","deprecated":null,"version":null,"openapi":"/developers/api/rest-openapi.json get /objects/{projectId}/{objectId}/single","href":"/api-reference/objects/download-a-single-object"},{"title":"Download an Object and All its Children","deprecated":null,"version":null,"openapi":"/developers/api/rest-openapi.json get /objects/{projectId}/{objectId}","href":"/api-reference/objects/download-an-object-and-all-its-children"}]},{"group":"Webhooks","pages":[{"title":"Broadcast and Subscribe to Speckle Events with Webhooks","sidebarTitle":"Webhooks Overview","href":"/developers/api/webhooks"},{"title":"Events and Payloads","href":"/developers/api/webhooks/events"},{"title":"Creating and Managing Webhooks","href":"/developers/api/webhooks/management"},{"title":"Webhook Security","href":"/developers/api/webhooks/security"}]},{"group":"Guides","pages":[{"title":"Upload IFC and other files to Speckle","sidebarTitle":"Upload files","href":"/developers/api/guides/file-uploads"},{"title":"Read and Write Project Metadata via GraphQL","sidebarTitle":"Project metadata","tag":"Enterprise","href":"/developers/api/guides/project-metadata"},{"title":"Updating Cloud Integration Syncs via GraphQL","sidebarTitle":"Updating Syncs","href":"/developers/api/guides/updating-syncs"},{"title":"Get Data Validation Results with GraphQL","sidebarTitle":"Validation Results","href":"/developers/api/guides/data-validation-results"},{"title":"Send Slack Notifications from Speckle Webhooks","sidebarTitle":"Slack Notifications","href":"/developers/api/guides/slack-notifications"}]}]},{"tab":"SDKs","groups":[{"group":"Speckle SDKs","pages":[{"title":"Introduction","sidebarTitle":"Introduction","href":"/developers/sdks/introduction"}]},{"group":"Python","icon":"python","pages":[{"title":"specklepy","href":"/developers/sdks/python/introduction"},{"title":"Migrate a specklepy script to 2026.9","sidebarTitle":"Migrate to 2026.9","href":"/developers/sdks/python/migrate-to-2026-9"},{"group":"Getting Started","pages":[{"title":"Installation","href":"/developers/sdks/python/getting-started/installation"},{"title":"Authentication","href":"/developers/sdks/python/getting-started/authentication"},{"title":"Quickstart","href":"/developers/sdks/python/getting-started/quickstart"}]},{"group":"Core Concepts","pages":[{"title":"Python SDK concepts","href":"/developers/sdks/python/concepts/overview"},{"title":"Data Types in Speckle","href":"/developers/sdks/python/concepts/data-types"},{"title":"Objects \u0026 Base Class","href":"/developers/sdks/python/concepts/objects"},{"title":"Data Traversal","href":"/developers/sdks/python/concepts/data-traversal"},{"title":"Display Values","href":"/developers/sdks/python/concepts/display-values"},{"title":"Proxification","href":"/developers/sdks/python/concepts/proxification"}]},{"group":"API Reference","pages":[{"title":"SpeckleClient","href":"/developers/sdks/python/api-reference/client"},{"title":"Operations","href":"/developers/sdks/python/api-reference/operations"},{"group":"Resources","pages":[{"title":"ProjectResource","href":"/developers/sdks/python/api-reference/resources/project"},{"title":"ModelResource","href":"/developers/sdks/python/api-reference/resources/model"},{"title":"VersionResource","href":"/developers/sdks/python/api-reference/resources/version"},{"title":"ActiveUserResource","href":"/developers/sdks/python/api-reference/resources/active-user"},{"title":"OtherUserResource","href":"/developers/sdks/python/api-reference/resources/other-user"},{"title":"WorkspaceResource","href":"/developers/sdks/python/api-reference/resources/workspace"},{"title":"ServerResource","href":"/developers/sdks/python/api-reference/resources/server"}]},{"title":"Transports","href":"/developers/sdks/python/api-reference/transports"},{"title":"Exceptions","href":"/developers/sdks/python/api-reference/exceptions"}]},{"group":"Guides","pages":[{"title":"Working with Speckle Objects","href":"/developers/sdks/python/guides/how-to-work-with-objects"},{"title":"Finding and Extracting Data","href":"/developers/sdks/python/guides/how-to-find-and-extract-data"},{"title":"Performance and Complex Patterns","href":"/developers/sdks/python/guides/how-to-optimize-and-handle-complexity"},{"title":"Simple Data Patterns","href":"/developers/sdks/python/guides/simple-data-patterns"},{"title":"BIM Data Patterns","href":"/developers/sdks/python/guides/bim-data-patterns"},{"title":"Extracting Display Values and Transform Instances","href":"/developers/sdks/python/guides/working-with-proxies"},{"title":"Understanding Speckle Mesh","href":"/developers/sdks/python/guides/understanding-speckle-mesh"},{"title":"Working with Geometry","href":"/developers/sdks/python/guides/working-with-geometry"}]}]},{"group":"C# .NET","icon":"microsoft","pages":[{"title":"speckle-sharp","sidebarTitle":"speckle-sharp","href":"/developers/sdks/dotnet/introduction"},{"title":"Migrate a Speckle.Sdk script to 2026.9","sidebarTitle":"Migrate to 2026.9","href":"/developers/sdks/dotnet/migrate-to-2026-9"},{"group":"Getting Started","pages":[{"title":"Installation","sidebarTitle":"Installation","href":"/developers/sdks/dotnet/getting-started/installation"},{"title":"Build your first model analysis tool","sidebarTitle":"First analysis tool","href":"/developers/sdks/dotnet/guides/build-your-first-model-analysis-tool"},{"title":"Automate with scripts and notebooks","sidebarTitle":"Scripts","href":"/developers/sdks/dotnet/getting-started/scripts-and-notebooks"},{"title":"Authentication","sidebarTitle":"Authentication","href":"/developers/sdks/dotnet/getting-started/authentication"},{"title":"Publish and load a model from C#","sidebarTitle":"Quickstart","href":"/developers/sdks/dotnet/getting-started/quickstart"}]},{"group":"Guides","pages":[{"title":"Use SpeckleSharp in a Grasshopper C# node","sidebarTitle":"Grasshopper C#","href":"/developers/sdks/dotnet/guides/use-speckle-sdk-in-grasshopper-csharp"},{"title":"Find objects by property","sidebarTitle":"Find \u0026 extract","href":"/developers/sdks/dotnet/guides/finding-and-extracting-data"},{"title":"Export model data to CSV","sidebarTitle":"Export to CSV","href":"/developers/sdks/dotnet/guides/export-model-data-to-csv"},{"title":"Send analysis results back to Speckle","sidebarTitle":"Send results back","href":"/developers/sdks/dotnet/guides/send-analysis-results-back"},{"title":"BIM data patterns","sidebarTitle":"BIM patterns","href":"/developers/sdks/dotnet/guides/bim-data-patterns"},{"title":"Compare two model versions","sidebarTitle":"Compare versions","href":"/developers/sdks/dotnet/guides/compare-two-model-versions"},{"title":"Resolve groups and instances","sidebarTitle":"Proxies","href":"/developers/sdks/dotnet/guides/working-with-proxies"},{"title":"Read and create geometry","sidebarTitle":"Geometry","href":"/developers/sdks/dotnet/guides/working-with-geometry"},{"title":"Handling server capabilities","href":"/developers/sdks/dotnet/guides/handling-server-capabilities"},{"title":"Publish large models (connectors)","sidebarTitle":"Connector sends","href":"/developers/sdks/dotnet/guides/building-connector-scale-sends"}]},{"group":"Concepts","pages":[{"title":"How your code talks to Speckle Server","sidebarTitle":"Core concepts","href":"/developers/sdks/dotnet/concepts/overview"},{"title":"Work with model objects","sidebarTitle":"Objects","href":"/developers/sdks/dotnet/concepts/objects-and-traversal"},{"title":"Load and publish model data","sidebarTitle":"Send \u0026 receive","href":"/developers/sdks/dotnet/concepts/send-and-receive-paths"},{"title":"Dependency injection (connectors)","sidebarTitle":"DI (advanced)","href":"/developers/sdks/dotnet/concepts/dependency-injection"}]},{"group":"API Reference","pages":[{"title":"Client","sidebarTitle":"Client","href":"/developers/sdks/dotnet/api-reference/client"},{"title":"Service registration","sidebarTitle":"Registration","href":"/developers/sdks/dotnet/api-reference/service-registration"},{"title":"Operations","sidebarTitle":"Operations","href":"/developers/sdks/dotnet/api-reference/operations"},{"group":"Resources","pages":[{"title":"Project","sidebarTitle":"Project","href":"/developers/sdks/dotnet/api-reference/resources/project"},{"title":"Model","sidebarTitle":"Model","href":"/developers/sdks/dotnet/api-reference/resources/model"},{"title":"Version","sidebarTitle":"Version","href":"/developers/sdks/dotnet/api-reference/resources/version"},{"title":"Users","sidebarTitle":"Users","href":"/developers/sdks/dotnet/api-reference/resources/users"},{"title":"Workspace","sidebarTitle":"Workspace","href":"/developers/sdks/dotnet/api-reference/resources/workspace"},{"title":"Server","sidebarTitle":"Server","href":"/developers/sdks/dotnet/api-reference/resources/server"},{"title":"Model ingestion","sidebarTitle":"Ingestion","href":"/developers/sdks/dotnet/api-reference/resources/ingestion"}]},{"title":"Transports","sidebarTitle":"Transports","href":"/developers/sdks/dotnet/api-reference/transports"},{"title":"Exceptions","sidebarTitle":"Exceptions","href":"/developers/sdks/dotnet/api-reference/exceptions"}]}]},{"group":"JS/TS","icon":"javascript","pages":[{"title":"speckle.js","href":"/developers/sdks/typescript/introduction"}]}]},{"tab":"Viewer","groups":[{"group":"Speckle Viewer","pages":[{"title":"Developers Guide","sidebarTitle":"Getting Started","href":"/developers/viewer/introduction"},{"title":"Load a bundle in your Viewer app","sidebarTitle":"Loading bundles","href":"/developers/viewer/loading-bundles"},{"title":"Installation","href":"/developers/viewer/installation"},{"title":"Basic Setup","href":"/developers/viewer/basic-setup"},{"title":"Advanced Setup","href":"/developers/viewer/advanced-setup"}]},{"group":"Core Concepts","pages":[{"title":"3D Viewer","href":"/developers/viewer/overview"},{"title":"Data Tree","href":"/developers/viewer/viewer-data"},{"title":"Rendering","href":"/developers/viewer/viewer-rendering"},{"title":"Loaders","href":"/developers/viewer/loaders"}]},{"group":"API Reference","pages":[{"group":"Viewer Core","pages":[{"title":"AccelerationStructure","href":"/developers/viewer/acceleration-structure-api"},{"title":"Batch","href":"/developers/viewer/batch-api"},{"title":"BatchObject","href":"/developers/viewer/batch-object-api"},{"title":"GeometryConverter","href":"/developers/viewer/geometry-converter-api"},{"title":"Input","href":"/developers/viewer/input-api"},{"title":"Intersections","href":"/developers/viewer/intersections-api"},{"title":"Loader","href":"/developers/viewer/loader-api"},{"title":"Queries","href":"/developers/viewer/queries-api"},{"title":"NodeRenderView","href":"/developers/viewer/render-view-api"},{"title":"RenderTree","href":"/developers/viewer/render-tree-api"},{"group":"Rendering Pipelines","pages":[{"title":"Pipeline","href":"/developers/viewer/rendering-pipeline-api/pipeline-api"},{"title":"ProgressivePipeline","href":"/developers/viewer/rendering-pipeline-api/progressive-pipeline-api"},{"title":"GPass","href":"/developers/viewer/rendering-pipeline-api/g-pass-api"},{"title":"BaseGPass","href":"/developers/viewer/rendering-pipeline-api/base-g-pass-api"},{"title":"ProgressiveGPass","href":"/developers/viewer/rendering-pipeline-api/progressive-g-pass-api"}]},{"title":"SpeckleMaterial","href":"/developers/viewer/speckle-material-api"},{"title":"SpeckleRenderer","href":"/developers/viewer/speckle-renderer-api"},{"title":"TopLevelAccelerationStructure","href":"/developers/viewer/top-level-acceleration-structure-api"},{"title":"Viewer","href":"/developers/viewer/viewer-api"},{"title":"WorldTree","href":"/developers/viewer/world-tree-api"}]},{"group":"Extensions","pages":[{"title":"Extension","href":"/developers/viewer/extensions/extension-api"},{"title":"CameraController","href":"/developers/viewer/extensions/camera-controller-api"},{"title":"DifExtension","href":"/developers/viewer/extensions/diff-extension-api"},{"title":"FilteringExtension","href":"/developers/viewer/extensions/filtering-extension-api"},{"title":"MeasurementsTool","href":"/developers/viewer/extensions/measurements-tool-api"},{"title":"SelectionExtension","href":"/developers/viewer/extensions/selection-extension-api"},{"title":"SectionTool","href":"/developers/viewer/extensions/section-tool-api"},{"title":"SectionToolOutlines","href":"/developers/viewer/extensions/section-tool-outlines-api"},{"title":"SpeckleControls","href":"/developers/viewer/extensions/speckle-controls-api"},{"title":"SmoothOrbitControls","href":"/developers/viewer/extensions/smooth-orbit-controls-api"},{"title":"ViewModes","href":"/developers/viewer/extensions/view-modes-api"}]}]},{"group":"Examples","pages":[{"title":"Basic Example","href":"/developers/viewer/examples/basic-example"},{"title":"More Extensions","href":"/developers/viewer/examples/more-extensions-example"},{"title":"Filtering","href":"/developers/viewer/examples/filtering-example"},{"title":"Loading Data","href":"/developers/viewer/examples/loading-example"},{"title":"Object Manipulation","href":"/developers/viewer/examples/object-manipulation-example"},{"title":"Box Selection","href":"/developers/viewer/examples/box-selection-example"},{"title":"Animation \u0026 Custom Text","href":"/developers/viewer/examples/categorize-example"}]},{"group":"Reference","pages":[{"title":"Migration Guide","href":"/developers/viewer/migration-guide"},{"title":"Backwards Compatibility","href":"/developers/viewer/migration-guide-compatibility"},{"title":"API 1.0 Full Migration","href":"/developers/viewer/migration-guide-v1"}]}]},{"tab":"Server","groups":[{"group":"Speckle Server","pages":[{"title":"Hosting Your Own Speckle Server","sidebarTitle":"Overview","href":"/developers/server/introduction"},{"title":"Choosing a Speckle Deployment","sidebarTitle":"Choosing a Deployment","href":"/developers/server/self-hosted-vs-cloud-hosted-speckle"},{"title":"Docker Compose Quickstart","sidebarTitle":"Getting Started","href":"/developers/server/getting-started"},{"title":"Server Architecture","href":"/developers/server/architecture"},{"title":"Self-Hosted Deployment Options","href":"/developers/server/deployment-options"}]},{"group":"Deployment","pages":[{"title":"Deploy to Kubernetes","href":"/developers/server/deployment/kubernetes-with-helm"},{"title":"Server Maintenance","href":"/developers/server/deployment/backup-upgrade-restore"},{"title":"Deploying a Speckle Enterprise licensed server","sidebarTitle":"Enterprise Servers","tag":"Enterprise","href":"/developers/server/deployment/enterprise-license"},{"title":"Deploying a Speckle Enterprise licensed Automate server","sidebarTitle":"Enterprise Automate","tag":"Enterprise","href":"/developers/server/deployment/enterprise-license-automate"},{"title":"Deploying a Speckle Enterprise licensed Intelligence server","sidebarTitle":"Enterprise Intelligence","tag":"Enterprise","href":"/developers/server/deployment/enterprise-license-intelligence"},{"title":"Deploying a Speckle Enterprise licensed Desktop UI server","sidebarTitle":"Enterprise licensed Desktop UI","tag":"Enterprise","href":"/developers/server/deployment/enterprise-license-desktop-ui"}]},{"group":"Local Development","pages":[{"title":"Environment Setup","href":"/developers/server/development/setup"}]}]},{"tab":"Automate","groups":[{"group":"Speckle Automate","pages":[{"title":"Powering Your Automation Workflows","sidebarTitle":"Overview","tag":"Enterprise","href":"/developers/automate/introduction"},{"title":"Quickstart Guide","href":"/developers/automate/quickstart"},{"title":"API Reference","href":"/developers/automate/api-reference"},{"title":"Frequently Asked Questions","href":"/developers/automate/faq"}]},{"group":"Automate Functions","pages":[{"title":"Create an Automate function","sidebarTitle":"Creating Functions","href":"/developers/automate/create-function"},{"title":"Making Your Function","href":"/developers/automate/making-your-function"},{"title":"Function Inputs","href":"/developers/automate/function-inputs"},{"title":"Releasing a New Version","href":"/developers/automate/release-function-version"},{"title":"Publishing Automate Functions without the GitHub App","sidebarTitle":"Publish without GitHub","href":"/developers/automate/publishing-without-github"}]},{"group":"Working with Data","pages":[{"title":"Handling Data in Functions","href":"/developers/automate/function-data"},{"title":"AutomationContext","href":"/developers/automate/function-context"},{"title":"Annotating Function Results","href":"/developers/automate/function-results"},{"title":"Reporting Success","href":"/developers/automate/function-success"},{"title":"Function Artefacts","href":"/developers/automate/function-artefacts"}]},{"group":"Creating Automations","pages":[{"title":"Creating Automations","href":"/developers/automate/create-automation"},{"title":"Viewing Automation Results","href":"/developers/automate/viewing-results"},{"title":"Update an Automation","href":"/developers/automate/update-automation"}]},{"group":"Testing \u0026 Development","pages":[{"title":"Testing Your Functions","href":"/developers/automate/function-testing"},{"title":"Troubleshooting Automations","href":"/developers/automate/troubleshooting"}]},{"group":"Reference","pages":[{"title":"Considerations \u0026 Limitations","href":"/developers/automate/important-considerations"},{"title":"Function Specification","href":"/developers/automate/function-specification"}]}]}],"global":{"anchors":[]}},{"dropdown":"IT Administrators","icon":"wrench","groups":[{"group":"Deployment \u0026 Maintenance","pages":[{"title":"IT setup guide","href":"/it-admin/setup"},{"title":"Keep connectors current across your estate","sidebarTitle":"Connector updates","href":"/it-admin/connector-updates"},{"title":"Compatibility mode for ACC sync and uploads","sidebarTitle":"Compatibility mode","href":"/it-admin/compatibility-mode"},{"title":"Security","href":"/it-admin/security"},{"group":"Cloud Integrations","pages":[{"title":"Cloud Integrations: Access and Governance","sidebarTitle":"Introduction","href":"/it-admin/integrations/introduction"},{"title":"Enable Autodesk Forma Data Management integration","sidebarTitle":"Forma Data Management (ACC)","tag":"Enterprise","href":"/it-admin/integrations/acc"},{"title":"Configure Bentley ProjectWise Integration","sidebarTitle":"Bentley ProjectWise","tag":"Enterprise","href":"/it-admin/integrations/projectwise"},{"title":"Approve Speckle for SharePoint","sidebarTitle":"SharePoint","href":"/it-admin/integrations/sharepoint"},{"title":"Enable Databricks Integration","sidebarTitle":"Databricks","href":"/it-admin/integrations/databricks"},{"title":"Enable Snowflake Integration","sidebarTitle":"Snowflake","href":"/it-admin/integrations/snowflake"}]},{"title":"Admin Support Mode","href":"/it-admin/support-mode"},{"title":"Archive and unarchive projects","sidebarTitle":"Project Archival","tag":"Enterprise","href":"/it-admin/archived-projects"},{"title":"What's new in 2026.9 for IT admins","sidebarTitle":"What's new","href":"/whats-new/it-admins"}]},{"group":"Manual Connector Installation","pages":[{"title":"Manual installation","sidebarTitle":"Overview","href":"/connectors/manual-installation/introduction"},{"title":"Desktop Services","sidebarTitle":"Desktop Services (deprecated)","href":"/connectors/manual-installation/desktop-services"},{"title":"Archicad","href":"/connectors/manual-installation/archicad"},{"title":"AutoCAD","href":"/connectors/manual-installation/autocad"},{"title":"Blender","href":"/connectors/manual-installation/blender"},{"title":"Civil 3D","href":"/connectors/manual-installation/civil3d"},{"title":"ETABS","href":"/connectors/manual-installation/etabs"},{"title":"Navisworks","href":"/connectors/manual-installation/navisworks"},{"title":"Power BI","href":"/connectors/manual-installation/powerbi"},{"title":"Revit","href":"/connectors/manual-installation/revit"},{"title":"Rhino \u0026 Grasshopper","href":"/connectors/manual-installation/rhino-grasshopper"},{"title":"SketchUp","href":"/connectors/manual-installation/sketchup"},{"title":"Tekla Structures","href":"/connectors/manual-installation/teklastructures"}]}],"global":{"anchors":[]}},{"dropdown":"Get Involved","icon":"users","groups":[{"group":"Ways to get involved","pages":[{"title":"User testing and feedback","sidebarTitle":"User Testing","href":"/get-involved/user-testing"},{"title":"Join the Speckle Community","sidebarTitle":"Community","href":"/get-involved/community"},{"title":"Open source at Speckle","sidebarTitle":"Open source","href":"/get-involved/open-source"}]}],"global":{"anchors":[]}},{"dropdown":"Changelog","icon":"history","pages":[{"title":"Changelog — October 2026","sidebarTitle":"October 2026","href":"/technical-changelog/2026-10"},{"title":"Changelog — September 2026","sidebarTitle":"September 2026","href":"/technical-changelog/2026-09"}],"global":{"anchors":[]}}]},"title":"Design review workflow - Speckle Docs","buildId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","deploymentId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","dynamics":[],"chunks":[]}