<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Jupyter Blog - JupyterCAD</title><link href="https://blog.jupyter.org/" rel="alternate"/><link href="https://blog.jupyter.org/feeds/tag-jupytercad.atom.xml" rel="self"/><id>https://blog.jupyter.org/</id><updated>2026-09-02T18:22:00+00:00</updated><subtitle>JupyterCAD, collaborative 3D computer-aided design in JupyterLab.</subtitle><entry><title>A Robotics Workbench for JupyterCAD</title><link href="https://blog.jupyter.org/posts/2026/a-robotics-workbench-for-jupytercad/" rel="alternate"/><published>2026-09-02T18:22:00+00:00</published><updated>2026-09-02T18:22:00+00:00</updated><author><name>Yahia Heni</name></author><id>tag:blog.jupyter.org,2026-09-02:/posts/2026/a-robotics-workbench-for-jupytercad/</id><summary type="html">&lt;p&gt;A unified in-browser workflow from CAD to URDF kinematics&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Robotics education often hits a wall before the fun even begins. Students and engineers must first navigate a labyrinth of installations: ROS, environment configurations, dependency management, and a patchwork of software, just to visualize a simple robot. It doesn’t have to be this way.&lt;/p&gt;
&lt;p&gt;Thanks to Jupyter and its extensions, the entire process, from designing a robot to simulating its kinematics, can now happen entirely in the browser, in a single workspace with zero local installation.&lt;/p&gt;
&lt;h2 id="the-problem-the-fragmented-robotics-pipeline"&gt;The Problem: The Fragmented Robotics Pipeline&lt;/h2&gt;
&lt;p&gt;Traditionally, creating a robot model involves dealing with three distinct, often incompatible worlds:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Parametric Design:&lt;/strong&gt; Creating the shapes in dedicated CAD software (FreeCAD, SolidWorks, and the like).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mesh Generation:&lt;/strong&gt; Exporting those solid bodies into triangular meshes (STL) while manually managing the coordinates and file paths.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kinematic Description:&lt;/strong&gt; Writing URDF (Unified Robot Description Format) XML that ties the meshes together using joints and other parameters.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Getting this pipeline working locally typically requires a complete ROS installation, a source of friction for students and educators.&lt;/p&gt;
&lt;h2 id="the-solution-a-unified-browser-workflow"&gt;The Solution: A Unified Browser Workflow&lt;/h2&gt;
&lt;p&gt;By leveraging the JupyterCAD and JupyterLite, this entire toolchain is delivered as an instant, zero-install workspace in the browser. It is made available on the &lt;a href="https://notebook.link/"&gt;&lt;strong&gt;notebook.link&lt;/strong&gt;&lt;/a&gt; service.&lt;/p&gt;
&lt;h3 id="1-jupytercad-the-design-hub"&gt;1. JupyterCAD: The Design Hub&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/jupytercad/JupyterCAD"&gt;&lt;strong&gt;JupyterCAD&lt;/strong&gt;&lt;/a&gt; is a JupyterLab extension for collaborative 3D modeling. It also supports FreeCAD files and offers a full set of tools for creating, transforming, and combining 3D shapes.&lt;/p&gt;
&lt;p&gt;It can also export to various formats:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;STL/BREP:&lt;/strong&gt; Users can simply right-click any shape and generate meshes directly in their browser.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2026/a-robotics-workbench-for-jupytercad/images/001-1_pZAalrX9FpY6Bbv0aSJAWg.mp4" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;FreeCAD:&lt;/strong&gt; Through the &lt;a href="https://github.com/jupytercad/JupyterCAD-FreeCAD"&gt;&lt;strong&gt;JupyterCAD-FreeCAD&lt;/strong&gt;&lt;/a&gt; plugin, designs can move freely between the browser and desktop CAD (FreeCAD) without losing the feature tree, exporting back and forth between the .jcad and .FCStd formats.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-jupytercad-urdf-the-urdf-workbench-for-jupytercad"&gt;2. JupyterCAD-URDF: The URDF Workbench for JupyterCAD&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/jupytercad/JupyterCAD-urdf"&gt;&lt;strong&gt;JupyterCAD-URDF&lt;/strong&gt;&lt;/a&gt; is a JupyterCAD plugin for exporting CAD designs to the URDF format.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It generates STL meshes automatically for complex shapes. For simple primitives (boxes, spheres, and cylinders), it emits XML tags instead of producing external mesh files.&lt;/li&gt;
&lt;li&gt;It produces a &lt;strong&gt;URDF XML&lt;/strong&gt; document that references those meshes while preserving hierarchies, names, colors and placements.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2026/a-robotics-workbench-for-jupytercad/images/002-1_eWCCAx2Uyw7pf3DXCmbVyQ.mp4" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;h3 id="3-jupyterlab-urdf-interactive-kinematics"&gt;3. JupyterLab-URDF: Interactive Kinematics&lt;/h3&gt;
&lt;p&gt;Once the model is exported, the &lt;strong&gt;JupyterLab-URDF&lt;/strong&gt; extension, which can be used in JupyterLab independently of JupyterCAD, allows for inspection of the XML content as well as interactive 3D visualization:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Real-Time Kinematic Articulation&lt;/strong&gt;: Drag joint sliders to test degrees of freedom, joint limits, and coordinate hierarchies in real time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;3D Scene Controls&lt;/strong&gt;: The control panel has several settings to customize the scene, such as coordinate frame helpers, lighting controls, mesh visibility, and other options.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Joints Editor:&lt;/strong&gt; An interface to define kinematic relationships (joints) between parts by selecting them directly in the 3D scene. This allows for creating new joints or editing existing ones.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2026/a-robotics-workbench-for-jupytercad/images/003-1_hG86LjJfW9V_AVmjbAd_Pw.mp4" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;h2 id="walkthrough-zero-to-robot-workflow"&gt;Walkthrough: Zero-to-Robot Workflow&lt;/h2&gt;
&lt;p&gt;This new pipeline allows a student to go from a blank page to a moving robot:&lt;/p&gt;
&lt;h3 id="phase-1-cad-modeling-export-jupytercad-jupytercad-urdf"&gt;Phase 1: CAD Modeling &amp;amp; Export (JupyterCAD + JupyterCAD-URDF)&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Design&lt;/strong&gt; parametric parts in JupyterCAD.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Export&lt;/strong&gt; to URDF using JupyterCAD-URDF.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="phase-2-assembly-simulation-jupyterlab-urdf"&gt;Phase 2: Assembly &amp;amp; Simulation (jupyterlab-urdf)&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Assemble&lt;/strong&gt; the generated URDF in jupyterlab-urdf and use the &lt;strong&gt;Joints Editor&lt;/strong&gt; to connect links.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simulate&lt;/strong&gt; the robot movement using the joint sliders.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You can try it right now without any local installation thanks to the deployment on notebook.link, by following the link below.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;a href="https://notebook.link/@Yahiewi/urdf-demo"&gt;&lt;img src="https://blog.jupyter.org/posts/2026/a-robotics-workbench-for-jupytercad/images/004-0_Zir-X_cL1PYlmmnW.svg" alt="" loading="lazy" data-body-image=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="repos"&gt;Repos&lt;/h2&gt;
&lt;p&gt;All tools in this pipeline are free, open source, and available on GitHub, PyPI, npm, and Conda-forge:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/jupytercad/JupyterCAD"&gt;&lt;strong&gt;JupyterCAD&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jupytercad/JupyterCAD-urdf"&gt;&lt;strong&gt;JupyterCAD-URDF&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyter-robotics/jupyterlab-urdf"&gt;&lt;strong&gt;JupyterLab-URDF&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;This work was conducted at &lt;strong&gt;QuantStack&lt;/strong&gt; as part of an effort to make 3D modeling and robotics accessible directly in web-native environments.&lt;/p&gt;
&lt;p&gt;Special thanks go to everyone in the open-source community who made this possible, to &lt;a href="https://github.com/IsabelParedes"&gt;Isabel Paredes&lt;/a&gt;, the creator and maintainer of the jupyterlab-urdf extension, to &lt;a href="https://github.com/trungleduc"&gt;Le Duc Trung&lt;/a&gt; and &lt;a href="https://github.com/martinRenou"&gt;Martin Renou&lt;/a&gt;, the main contributors to JupyterCAD, and to everyone else at QuantStack who helped with this project.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="about-the-author"&gt;About the Author&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/Yahiewi"&gt;&lt;strong&gt;Yahia Heni&lt;/strong&gt;&lt;/a&gt; is a software engineer at QuantStack, focusing on the Jupyter Ecosystem, by contributing to Jupyter and several of its extensions, as well as notebook.link and other related open-source projects.&lt;/p&gt;
</content><category term="JupyterCAD"/><category term="robotics"/></entry><entry><title>Announcing JupyterCAD 3.0</title><link href="https://blog.jupyter.org/posts/2025/announcing-jupytercad-3-0/" rel="alternate"/><published>2025-02-17T09:38:00+00:00</published><updated>2025-02-17T09:38:00+00:00</updated><author><name>Arjun Verma</name></author><id>tag:blog.jupyter.org,2025-02-17:/posts/2025/announcing-jupytercad-3-0/</id><summary type="html">&lt;p&gt;The latest iteration of the web-based collaborative CAD editor&lt;/p&gt;
</summary><content type="html">&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2025/announcing-jupytercad-3-0/images/001-1_m9xr-RYt-bA0tfE6YwjNMQ.webp" alt="Screenshot of JupyterCAD, showing a model of gear, with an anotation editor opened." loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;We are thrilled to introduce JupyterCAD 3.0, the newest version of the collaborative CAD modeler designed for JupyterLab.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href="https://github.com/jupytercad/jupytercad"&gt;JupyterCAD&lt;/a&gt; is an unofficial JupyterLab extension for 3D geometry modeling with collaborative editing support. It is designed to allow multiple people to work on the same file at the same time, and to facilitate discussion and collaboration around the 3D shapes being created.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;JupyterCAD 3.0 represents a significant leap forward in usability and user experience compared to the previous release.&lt;/p&gt;
&lt;h2 id="whats-new-in-jupytercad-30"&gt;What’s new in JupyterCAD 3.0?&lt;/h2&gt;
&lt;h3 id="color-customization"&gt;Color customization&lt;/h3&gt;
&lt;iframe src="https://www.youtube-nocookie.com/embed/kTePlIUbgik" title="JupyterCAD color customization" width="560" height="315" style="aspect-ratio: 560 / 315" loading="lazy" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;JupyterCAD 3.0 allows you to customize object colors directly within the application, while we were limited to gray models in earlier versions. Adjust colors easily to suit your design needs or preferences.&lt;/p&gt;
&lt;h3 id="embedded-python-console"&gt;Embedded Python console&lt;/h3&gt;
&lt;iframe src="https://www.youtube-nocookie.com/embed/eyZmY9jt6GY" title="JupyterCAD embedded console" width="560" height="315" style="aspect-ratio: 560 / 315" loading="lazy" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;The new embedded Python console offers advanced users direct access to JupyterCAD’s Python API, enabling on-the-fly scripting and automation for power users.&lt;/p&gt;
&lt;h3 id="ux-improvements"&gt;UX improvements&lt;/h3&gt;
&lt;iframe src="https://www.youtube-nocookie.com/embed/j5ypepW8QxU" title="JupyterCAD Axes Helper" width="560" height="315" style="aspect-ratio: 560 / 315" loading="lazy" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;The new &lt;strong&gt;AxesHelper&lt;/strong&gt; provides a clear visual reference for coordinate axes, making it easier to navigate and align models in 3D space.&lt;/p&gt;
&lt;iframe src="https://www.youtube-nocookie.com/embed/lxYKdLS62Zw" title="JupyterCAD copy-paste functionality" width="560" height="315" style="aspect-ratio: 560 / 315" loading="lazy" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;We have also added &lt;strong&gt;copy-paste functionality&lt;/strong&gt; using &lt;strong&gt;Ctrl+C&lt;/strong&gt; and &lt;strong&gt;Ctrl+V&lt;/strong&gt; shortcuts, making it faster and easier to duplicate objects within your models.&lt;/p&gt;
&lt;iframe src="https://www.youtube-nocookie.com/embed/Dx13O7adpj8" title="JupyterCAD 3.0 improved toolbar" width="560" height="315" style="aspect-ratio: 560 / 315" loading="lazy" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;An &lt;strong&gt;improved toolbar&lt;/strong&gt; now includes options to &lt;strong&gt;toggle wireframe&lt;/strong&gt;, &lt;strong&gt;toggle transform controls&lt;/strong&gt;, &lt;strong&gt;toggle clip plane&lt;/strong&gt; and a &lt;strong&gt;toggleable console&lt;/strong&gt;, giving users quick access to essential tools.&lt;/p&gt;
&lt;iframe src="https://www.youtube-nocookie.com/embed/790f6Wc4_Wk" title="JupyterCAD smooth camera tracking" width="560" height="315" style="aspect-ratio: 560 / 315" loading="lazy" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;JupyterCAD 3.0 also introduces &lt;strong&gt;smooth camera tracking&lt;/strong&gt;, where selecting an object from the object tree triggers a smooth transition of the camera to focus on the selected object, enhancing navigation and model exploration.&lt;/p&gt;
&lt;h3 id="mouse-based-3d-controls"&gt;Mouse-based 3D controls&lt;/h3&gt;
&lt;iframe src="https://www.youtube-nocookie.com/embed/xMCvxiIglZk" title="JupyterCAD Mouse-based 3D transform controls" width="560" height="315" style="aspect-ratio: 560 / 315" loading="lazy" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;Move or rotate your 3D models effortlessly with &lt;strong&gt;mouse-based controls&lt;/strong&gt; that bring fluidity and precision to model editing and interaction.&lt;/p&gt;
&lt;h3 id="suggestions-support"&gt;Suggestions support&lt;/h3&gt;
&lt;iframe src="https://www.youtube-nocookie.com/embed/Zu0AT6IRA98" title="JupyterCAD suggestions" width="560" height="315" style="aspect-ratio: 560 / 315" loading="lazy" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;With JupyterCAD 3.0, collaboration becomes even more seamless with suggestions. Collaborators can propose changes to a model, which can be reviewed and applied collaboratively, fostering a dynamic and efficient workflow.&lt;/p&gt;
&lt;h2 id="try-it"&gt;Try it!&lt;/h2&gt;
&lt;figure&gt;
&lt;img alt="Screenshot of the JupyterCAD GitHub repository." src="https://blog.jupyter.org/posts/2025/announcing-jupytercad-3-0/images/002-1_DmBkGvfYG37OR0UueGpdag.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Screenshot of &lt;a href="https://github.com/jupytercad/JupyterCAD"&gt;JupyterCAD GitHub repository&lt;/a&gt;, with a link to try JupyterCAD (circled in red) with JupyterLite. This is simply deployed as a static website on “GitHub Pages”.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Explore JupyterCAD 3.0 in action with our &lt;strong&gt;JupyterLite deployment&lt;/strong&gt; — no installation required. Visit us at &lt;a href="https://jupytercad.github.io/JupyterCAD"&gt;jupytercad.github.io/JupyterCAD&lt;/a&gt; and start modeling directly in your browser.&lt;/p&gt;
&lt;h2 id="installing-jupytercad"&gt;Installing JupyterCAD&lt;/h2&gt;
&lt;p&gt;You can easily install JupyterCAD with pip or mamba:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;jupytercad&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;or:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;mamba&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="n"&gt;conda&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;forge&lt;/span&gt; &lt;span class="n"&gt;jupytercad&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Additionally, you can install FreeCAD along with the JupyterCAD-FreeCAD plugin to enable support for FCstd files:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;mamba&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="n"&gt;conda&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;forge&lt;/span&gt; &lt;span class="n"&gt;freecad&lt;/span&gt; &lt;span class="n"&gt;jupytercad&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;freecad&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="whats-next"&gt;What’s next?&lt;/h2&gt;
&lt;p&gt;JupyterCAD is evolving rapidly, with some exciting updates just around the corner and others in active development:&lt;/p&gt;
&lt;h3 id="upcoming-features"&gt;Upcoming Features&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Enhanced User Experience&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Smoother exploded view&lt;/li&gt;
&lt;li&gt;Support for renaming objects directly from object tree&lt;/li&gt;
&lt;li&gt;Incremental rotation controls for precise adjustments&lt;/li&gt;
&lt;li&gt;Enhanced 3D view settings for better customization.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nested &amp;amp; Refined Side Panel&lt;/strong&gt;: Navigate and organize objects more easily with a refined and nested side panel experience.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Support for more File Formats&lt;/strong&gt;: Broaden compatibility with support for more file formats.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="features-in-development"&gt;Features in Development&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;New CAD Operations&lt;/strong&gt;: New tools for operations like &lt;strong&gt;linear&lt;/strong&gt; and &lt;strong&gt;radial patterns&lt;/strong&gt; to expand modeling capabilities.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Support for measuring distances&lt;/strong&gt;: Tools to measure distances and dimensions directly in the viewport.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Improved 2D Sketcher&lt;/strong&gt;: Enhanced features to make 2D sketching more intuitive and robust.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;The development of the JupyterCAD open-source project by &lt;a href="https://quantstack.net/"&gt;QuantStack&lt;/a&gt; was funded by a grant from &lt;a href="https://ecologie.gouv.fr/direction-generale-laviation-civile-dgac"&gt;DGAC&lt;/a&gt; in the framework of the French “Plan de Relance” (refinanced by &lt;a href="https://next-generation-eu.europa.eu/index_en"&gt;Next generation EU&lt;/a&gt;) as part of a collaboration between &lt;a href="https://www.safran-group.com/companies/safran-aircraft-engines"&gt;Safran Aircraft Engines&lt;/a&gt;, &lt;a href="https://www.inria.fr/en"&gt;INRIA&lt;/a&gt;, and &lt;a href="https://www.akkodis.com/"&gt;Akkodis&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We also extend our gratitude to the &lt;a href="https://github.com/jupytercad/JupyterCAD/graphs/contributors"&gt;external contributors&lt;/a&gt; whose efforts and feedback have been instrumental in shaping this release. Your support and collaboration drive the ongoing success of JupyterCAD.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2025/announcing-jupytercad-3-0/images/003-1_4LK5G7er7fRNtT4gbUoWWw.webp" alt="Logo of Safran Aircraft Engines" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;This work was built upon the strong foundation laid by open-source software projects such as &lt;a href="https://threejs.org/"&gt;&lt;strong&gt;Three.js&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://dev.opencascade.org/"&gt;&lt;strong&gt;OpenCascade&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://ocjs.org/"&gt;&lt;strong&gt;OpenCascade.js&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://www.freecad.org/"&gt;&lt;strong&gt;FreeCAD&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://github.com/jupyterlab/jupyterlab"&gt;&lt;strong&gt;JupyterLab&lt;/strong&gt;&lt;/a&gt; and &lt;a href="https://github.com/jupyterlite/jupyterlite"&gt;&lt;strong&gt;JupyterLite&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="about-the-authors"&gt;About the authors&lt;/h2&gt;
&lt;p&gt;JupyterCAD is an open-source project resulting from &lt;a href="https://github.com/jupytercad/JupyterCAD/graphs/contributors"&gt;contributors&lt;/a&gt;’ collective efforts. Below, we highlight the primary contributors for this release:&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2025/announcing-jupytercad-3-0/images/004-0_lIAP4xLgMI8KptQn.jpg" alt="Portrait of Trung Le" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/trungleduc"&gt;Le Duc Trung&lt;/a&gt; is a Scientific Software Developer at QuantStack. He works on several projects within the Jupyter ecosystem, from the main projects like &lt;a href="https://github.com/jupyterlab/jupyterlab"&gt;JupyterLab&lt;/a&gt;, &lt;a href="https://github.com/voila-dashboards/voila/"&gt;Voilà&lt;/a&gt;, and &lt;a href="https://github.com/jupyter-widgets/ipywidgets"&gt;ipywidgets&lt;/a&gt; to various JupyterLab extensions and widgets.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2025/announcing-jupytercad-3-0/images/005-0_RPV4uLZ7SYZ0_KwH.jpg" alt="Portrait of Martin Renou" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/martinRenou"&gt;Martin Renou&lt;/a&gt; is a Technical Director at &lt;a href="https://quantstack.net/"&gt;QuantStack&lt;/a&gt; and a maintainer of &lt;a href="https://jupyter.org/"&gt;Project Jupyter&lt;/a&gt;. Among other projects Martin is a core team member of the ipywidgets project and maintains many Jupyter widget packages such as &lt;a href="https://github.com/jupyter-widgets/ipyleaflet"&gt;ipyleaflet&lt;/a&gt;, &lt;a href="https://github.com/bloomberg/ipydatagrid"&gt;ipydatagrid&lt;/a&gt;, &lt;a href="https://github.com/QuantStack/ipygany"&gt;ipygany&lt;/a&gt;, &lt;a href="https://github.com/martinRenou/ipycanvas"&gt;ipycanvas&lt;/a&gt;, and &lt;a href="https://github.com/bqplot/bqplot"&gt;bqplot&lt;/a&gt;. He is a co-creator of the &lt;a href="https://github.com/voila-dashboards/voila/"&gt;Voilà&lt;/a&gt; dashboarding system, and the &lt;a href="https://github.com/jupyter-xeus/xeus-python"&gt;xeus-python&lt;/a&gt; kernel.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2025/announcing-jupytercad-3-0/images/006-1_ne6lm0Wifp81ZLEIB6fxiQ.webp" alt="Portrait of Arjun Verma" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/arjxn-py"&gt;Arjun Verma&lt;/a&gt; is a Scientific Software Development Intern at &lt;a href="https://quantstack.net/"&gt;QuantStack&lt;/a&gt;. He is also a final year undergraduate student at Cluster Innovation Centre, University of Delhi. He loves 3D &amp;amp; GIS and also contributes to &lt;a href="https://github.com/geojupyter/jupytergis"&gt;JupyterGIS&lt;/a&gt; and is one of the maintainers of &lt;a href="https://pybamm.org/"&gt;PyBaMM&lt;/a&gt; where he has also been &lt;a href="https://summerofcode.withgoogle.com/"&gt;GSoC&lt;/a&gt; contributor and mentor.&lt;/p&gt;
</content><category term="collaboration"/><category term="JupyterCAD"/><category term="releases"/></entry><entry><title>Exploring a Document’s Timeline in JupyterLab</title><link href="https://blog.jupyter.org/posts/2024/exploring-a-documents-timeline-in-jupyterlab/" rel="alternate"/><published>2024-09-13T19:15:00+00:00</published><updated>2024-09-13T19:15:00+00:00</updated><author><name>Meriem Ben Ismail</name></author><id>tag:blog.jupyter.org,2024-09-13:/posts/2024/exploring-a-documents-timeline-in-jupyterlab/</id><summary type="html">&lt;p&gt;Introducing a document timeline component for JupyterLab&lt;/p&gt;
</summary><content type="html">&lt;p&gt;In collaborative environments, keeping track of changes and understanding the evolution of a document is crucial. This is especially true in fields like scientific computing and data science, where multiple contributors work together on complex projects. To address this need, we’re excited to introduce a document timeline component, a new feature that ships with the &lt;a href="https://jupyterlab-realtime-collaboration.readthedocs.io/en/latest/"&gt;Jupyter Collaboration&lt;/a&gt; extension and enhances how teams interact with shared documents.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;timeline component&lt;/strong&gt; is designed to give users control over a document’s history. Positioned as a slider in the JupyterLab status bar, it allows users to navigate through the timeline of a document. You can explore past versions, compare changes over time without altering the original document, and even restore specific versions. This feature is compatible with all types of shared documents within Jupyter, including notebooks, text files, and even third-party document types like &lt;a href="https://github.com/jupytercad/JupyterCAD"&gt;&lt;strong&gt;JupyterCAD&lt;/strong&gt;&lt;/a&gt; models.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Exploring the history of a Jupyter Notebook with the timeline component." src="https://blog.jupyter.org/posts/2024/exploring-a-documents-timeline-in-jupyterlab/images/001-1_iGMClCbnpOvUlZ5xoiAASA.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Exploring the history of a Jupyter Notebook with the timeline component&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="how-does-it-work"&gt;How Does it Work ?&lt;/h2&gt;
&lt;p&gt;Co-editing of notebooks and other documents was introduced in JupyterLab 3.1 and has been improved and consolidated in subsequent releases. The feature can be enabled by installing the &lt;a href="https://jupyterlab-realtime-collaboration.readthedocs.io/en/latest/"&gt;Jupyter Collaboration&lt;/a&gt; extension, which is built upon the &lt;a href="https://github.com/yjs/yjs"&gt;&lt;strong&gt;Yjs&lt;/strong&gt;&lt;/a&gt; framework, an implementation of CRDTs (Conflict-free Replicated Data Types). An important byproduct enabling real-time collaboration was the introduction of a journal of updates capturing all changes made by collaborators, which we leveraged to implement document timeline navigation.&lt;/p&gt;
&lt;p&gt;Two key changes to Jupyter collaboration underlie the timeline component:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The ability to &lt;em&gt;fork&lt;/em&gt; the document history, which is required to visualize the past state of the document without altering it.&lt;/li&gt;
&lt;li&gt;The support of Undo/Redo operations in the Python implementation of &lt;strong&gt;Yjs&lt;/strong&gt;, &lt;a href="https://jupyter-server.github.io/pycrdt/"&gt;&lt;strong&gt;PyCRDT&lt;/strong&gt;&lt;/a&gt;, through the implementation of an &lt;a href="https://github.com/jupyter-server/pycrdt/blob/main/python/pycrdt/_undo.py"&gt;undo manager&lt;/a&gt;. While this was already available in &lt;strong&gt;Yjs&lt;/strong&gt;, it was missing in &lt;strong&gt;PyCRDT&lt;/strong&gt; until now.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As you move the slider to go back in time, the first operation that takes place is &lt;strong&gt;forking&lt;/strong&gt; the document. Forking creates a new branch of the document at the selected point in history. This approach ensures that the most recent version of the document remains unaltered while you explore earlier versions. The forked version essentially acts as a sandbox where you can navigate through the document’s history, test out changes, and decide on the best course of action without modifying the main document.&lt;/p&gt;
&lt;p&gt;When you navigate through the document’s timeline using the slider, the undo manager allows you to reverse or reapply any series of changes, stepping back through the document’s history &lt;strong&gt;without&lt;/strong&gt; losing any information. If you decide to move forward again, the undo manager reapplies those changes in the exact order they were originally made, preserving the document’s integrity.&lt;/p&gt;
&lt;p&gt;After reviewing the timeline, you can choose to restore a particular version at a selected timestamp. This restored version becomes the new active state of the document, effectively merging the changes from the forked branch back into the main document.&lt;/p&gt;
&lt;p&gt;The document timeline component in the status bar offers an intuitive, flexible way to manage document history. Users can confidently experiment with different versions of their work, knowing that every action is reversible and that no progress will be lost. Whether you’re refining a piece of code, iterating on a design, or reviewing past contributions, the timeline equips you to iterate efficiently and effectively.&lt;/p&gt;
&lt;h2 id="seamless-integration-with-jupytercad"&gt;Seamless Integration with JupyterCAD&lt;/h2&gt;
&lt;p&gt;The document timeline is not just limited to text-based documents or notebooks. It was designed in a document-agnostic way, allowing its usage for any collaborative document. Consequently, it integrates seamlessly with &lt;a href="https://github.com/jupytercad/JupyterCAD"&gt;&lt;strong&gt;JupyterCAD&lt;/strong&gt;&lt;/a&gt;, JupyterLab’s extension for creating and manipulating 3D models. For engineers and designers, this integration is a game-changer.&lt;/p&gt;
&lt;p&gt;In complex engineering projects, design iterations are common, and the ability to track the evolution of a 3D model is crucial. With the document timeline, users can effortlessly navigate through different stages of their design process. If a recent change in the 3D model doesn’t yield the desired results, the document timeline allows you to slide back to a previous version and pick up your work from there.&lt;/p&gt;
&lt;p&gt;By combining the power of &lt;strong&gt;JupyterCAD&lt;/strong&gt; with the document timeline’s history management, a team can achieve a more dynamic and flexible design process, ensuring that every idea is captured and every change is reversible. This integration exemplifies how the Jupyter Collaboration extension is enhancing not just collaborative editing but also specialized workflows in engineering and design.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Exploring the history of a JupyterCAD document with the timeline component." src="https://blog.jupyter.org/posts/2024/exploring-a-documents-timeline-in-jupyterlab/images/002-1_0hhaIizZhuUGbSRCcsuZLA.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Exploring the history of a JupyterCAD document with the timeline component&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="a-new-era-of-collaboration-in-jupyter"&gt;A New Era of Collaboration in Jupyter&lt;/h2&gt;
&lt;p&gt;The document timeline is a significant step forward in our ongoing work to make Jupyter a user-friendly platform for collaborative technical computing. By leveraging the advanced capabilities of the &lt;strong&gt;PyCRDT&lt;/strong&gt; &lt;a href="https://github.com/jupyter-server/pycrdt/blob/main/python/pycrdt/_undo.py"&gt;undo manager&lt;/a&gt;, we’ve created a tool that simplifies document history management and enhances the overall collaborative experience.&lt;/p&gt;
&lt;p&gt;As we continue to innovate and expand the Jupyter Collaboration extension, we invite the community to try out the new document timeline feature and share their feedback. Together, we can further refine these tools and ensure that Jupyter remains at the forefront of collaborative computing, empowering users across all disciplines to achieve more.&lt;/p&gt;
&lt;hr&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
&lt;h2 id="acknowledgments"&gt;Acknowledgments&lt;/h2&gt;
&lt;p&gt;The development of the document timeline and its integration into the Jupyter Collaboration extension has been a true team effort, made possible by the dedication and expertise of many individuals. Special thanks are extended to the following team members for their invaluable contributions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;David Brochart :&lt;/strong&gt; For their innovative approach to integrating the &lt;a href="https://github.com/jupyter-server/pycrdt/blob/main/python/pycrdt/_undo.py"&gt;undo manager&lt;/a&gt; within &lt;strong&gt;PyCRDT&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Afshin T. Darian :&lt;/strong&gt; For their supervision and feedback, which have been crucial in refining the functionality of the timeline component.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Duc Trung Le :&lt;/strong&gt; For their expertise in &lt;a href="https://github.com/jupytercad/JupyterCAD"&gt;&lt;strong&gt;JupyterCAD&lt;/strong&gt;&lt;/a&gt; and for ensuring that the timeline component seamlessly integrates with 3D model workflows.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="about-the-author"&gt;About the Author&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.linkedin.com/in/meriem-ben-ismail-163042230/"&gt;Meriem Ben Ismail&lt;/a&gt; just completed her Software Engineering degree at &lt;a href="https://insat.rnu.tn"&gt;INSAT&lt;/a&gt; (National Institute of Applied Sciences and Technology in Tunisia) and her six-month internship as an open-source scientific software engineer at QuantStack.&lt;/p&gt;
</content><category term="collaboration"/><category term="JupyterCAD"/><category term="JupyterLab"/></entry><entry><title>Collaborative CAD in JupyterLab</title><link href="https://blog.jupyter.org/posts/2023/collaborative-cad-in-jupyterlab/" rel="alternate"/><published>2023-06-02T15:15:00+00:00</published><updated>2023-06-16T14:55:00+00:00</updated><author><name>Duc Trung Le</name></author><id>tag:blog.jupyter.org,2023-06-02:/posts/2023/collaborative-cad-in-jupyterlab/</id><summary type="html">&lt;p&gt;We are thrilled to introduce JupyterCAD, a tool that integrates Computer-Aided Design (CAD) capabilities into JupyterLab.&lt;/p&gt;</summary><content type="html">&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2023/collaborative-cad-in-jupyterlab/images/001-1_9r3Xz-v5wyuz8aAKY2WV-A.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;We are thrilled to introduce &lt;a href="https://jupytercad.readthedocs.io/"&gt;JupyterCAD&lt;/a&gt;, a tool that integrates &lt;strong&gt;Computer-Aided Design&lt;/strong&gt; (CAD) capabilities into JupyterLab. With its &lt;strong&gt;JupyterLab extension&lt;/strong&gt;, dedicated &lt;strong&gt;JupyterCAD application&lt;/strong&gt;, and &lt;strong&gt;Python API for CAD operations&lt;/strong&gt;, JupyterCAD allows users to effortlessly create, edit and share 3D designs without leaving the Jupyter ecosystem.&lt;/p&gt;
&lt;p&gt;This blog post provides an overview of JupyterCAD’s features and highlights its &lt;strong&gt;collaborative editing capabilities&lt;/strong&gt; which enable teamwork in the realm of CAD.&lt;/p&gt;
&lt;p&gt;Everything that is shown below can be tested by installing JupyterCAD from PyPI:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# From PyPI&lt;/span&gt;
pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;jupytercad
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="one-extension-three-interfaces"&gt;One extension, three interfaces&lt;/h2&gt;
&lt;p&gt;Built using the latest JupyterLab 4 release, JupyterCAD combines CAD functionalities with the &lt;a href="https://blog.jupyter.org/posts/2022/accelerating-jupyterlab/"&gt;enhanced performance&lt;/a&gt; and &lt;a href="https://blog.jupyter.org/posts/2023/improving-the-accessibility-of-jupyter/"&gt;accessibility improvements&lt;/a&gt; introduced in JupyterLab 4. The flexibility of JupyterLab allows us to create the extension once but deploy it in multiple ways to target three groups of audiences: users who prefer working in the JupyterLab environment, users who favor dedicated applications, and those advanced users who do everything programmatically.&lt;/p&gt;
&lt;h3 id="jupyterlab-extension"&gt;JupyterLab Extension&lt;/h3&gt;
&lt;p&gt;Experience CAD features directly within JupyterLab with the JupyterCAD extension. Open and edit &lt;a href="https://www.freecad.org/"&gt;FreeCAD&lt;/a&gt; files, perform CAD operations, including creating 3D primitives, applying boolean operators, and exploding the view. JupyterCAD’s extension integrates seamlessly into JupyterLab, providing an intuitive environment for CAD enthusiasts and data scientists alike.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The integrated interface of JupyterCAD inside JupyterLab" src="https://blog.jupyter.org/posts/2023/collaborative-cad-in-jupyterlab/images/002-1_gnukYLJE43zcmuaEAwCuOA.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;JupyterCAD extension inside JupyterLab&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id="jupytercad-application"&gt;JupyterCAD Application&lt;/h3&gt;
&lt;p&gt;For a streamlined CAD experience, JupyterCAD offers a dedicated application that eliminates distractions and emphasizes CAD features.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="An interface of the standalone JupyterCAD application" src="https://blog.jupyter.org/posts/2023/collaborative-cad-in-jupyterlab/images/003-1_AcyuVpviiNtSal9Wi4CDYQ.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The standalone JupyterCAD Application.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Starting the dedicated JupyterCAD application is as simple as starting JupyterLab or Jupyter Notebook:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;jupyter&lt;span class="w"&gt; &lt;/span&gt;cad
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This dedicated application has been built in a similar way to the coming &lt;a href="https://jupyter.org/enhancement-proposals/79-notebook-v7/notebook-v7.html"&gt;Jupyter Notebook 7&lt;/a&gt;. It’s a JupyterLab “remix” built from the ground up using JupyterLab core components and custom extensions. Much like JupyterLab, it offers theming and localization support, and more planned features on the horizon.&lt;/p&gt;
&lt;h3 id="python-api-for-cad-operations"&gt;Python API for CAD Operations&lt;/h3&gt;
&lt;p&gt;Advanced users can unlock the full potential of CAD operations with JupyterCAD’s Python API. JupyterCAD allows users to programmatically visualize, create, and manipulate the shapes from a Jupyter Notebook. For example, one can open a FreeCAD file and start modifying it from the notebook with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;jupytercad&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;CadDocument&lt;/span&gt;
&lt;span class="n"&gt;doc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CadDocument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;example.FCStd&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Create a cone, a sphere then cut the cone with the sphere.&lt;/span&gt;
&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_cone&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_sphere&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;radius&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cut&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;figure&gt;
&lt;img alt="An animation of using JupyterCAD python API in notebook" src="https://blog.jupyter.org/posts/2023/collaborative-cad-in-jupyterlab/images/004-1_I_XVE0J8vjYne5wnsZ9WuA.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Adding object to FreeCAD file from Jupyter Notebook.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;JupyterCAD API also integrates nicely with the &lt;a href="https://github.com/tpaviot/pythonocc-core"&gt;OpenCascade Python API&lt;/a&gt;, providing expanded capabilities for working with shapes.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;jupytercad&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;CadDocument&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="c1"&gt;# Create a prism shape with OpenCascade&lt;/span&gt;
&lt;span class="n"&gt;prism&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BRepPrimAPI_MakePrism&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vec&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Shape&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;doc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CadDocument&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_occ_shape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prism&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;figure&gt;
&lt;img alt="Visualize OpenCascade shape object with JupyterCAD." src="https://blog.jupyter.org/posts/2023/collaborative-cad-in-jupyterlab/images/005-1_4qvN9PdUYf5-jq5rjYUAEQ.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Visualize OpenCascade shape object with JupyterCAD.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="unlocking-teamwork-with-real-time-collaboration"&gt;Unlocking teamwork with real-time collaboration&lt;/h2&gt;
&lt;h3 id="collaborative-editing"&gt;Collaborative Editing&lt;/h3&gt;
&lt;p&gt;One of the standout features of JupyterCAD is its shared editing functionality, which seamlessly &lt;strong&gt;connects users across different interfaces within the JupyterCAD ecosystem&lt;/strong&gt;. Whether collaborators are using the dedicated JupyterCAD application, the JupyterLab extension, or working with the Python API in a Notebook, any changes made to a shared document are instantly reflected for all users.&lt;/p&gt;
&lt;p&gt;Real-time collaboration allows individuals working in the Python API to make modifications to the CAD document, while simultaneously providing a synchronized view for collaborators using the JupyterLab extension or the JupyterCAD application. This ensures that all participants have access to the most up-to-date version of the design, fostering efficient communication and &lt;strong&gt;eliminating the need for manual synchronization or file exchange&lt;/strong&gt;.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Real-time collaborative editing in JupyterCAD" src="https://blog.jupyter.org/posts/2023/collaborative-cad-in-jupyterlab/images/006-1_4lDSgoYLrUqX7SQul_yXxw.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Real-time collaborative editing in JupyterCAD.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id="follow-mode"&gt;Follow Mode&lt;/h3&gt;
&lt;p&gt;With JupyterCAD’s follow-mode feature, collaboration becomes even more fluid. You can follow another user’s camera movements and view adjustments in real-time. This mode allows you to gain insights into the design process, and enhance communication among team members.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Follow Mode in action." src="https://blog.jupyter.org/posts/2023/collaborative-cad-in-jupyterlab/images/007-1_DgAD-S5mvLOEK6RtDM8GZA.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Follow Mode in action.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id="annotations-system"&gt;Annotations System&lt;/h3&gt;
&lt;p&gt;The annotations system in JupyterCAD adds an interactive layer to 3D designs. Now you can add annotations to specific shapes within a CAD file, give context, provide feedback, or write instructions.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Adding annotation at precise positions" src="https://blog.jupyter.org/posts/2023/collaborative-cad-in-jupyterlab/images/008-1_QD98Lrlr7_CJfgVbxHhf6w.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Adding annotation at precise positions&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;hr&gt;
&lt;h2 id="what-goes-on-under-the-hood"&gt;What goes on under the hood?&lt;/h2&gt;
&lt;p&gt;All the above features are made possible thanks to two major open-source components: &lt;a href="https://ocjs.org/"&gt;&lt;strong&gt;OpenCascade.js&lt;/strong&gt;&lt;/a&gt;, the WebAssembly build of OpenCascade, and &lt;a href="https://github.com/jupyterlab/jupyter_collaboration"&gt;&lt;strong&gt;jupyter_collaboration&lt;/strong&gt;&lt;/a&gt;, the real-time collaboration framework of JupyterLab.&lt;/p&gt;
&lt;h3 id="in-browser-geometric-modeling-kernel"&gt;In-browser geometric modeling kernel&lt;/h3&gt;
&lt;p&gt;To execute all geometric operations, JupyterCAD uses a custom build of &lt;strong&gt;OpenCascade.js,&lt;/strong&gt; which is a port of the OpenCascade library to JavaScript and WebAssembly via Emscripten. Running on a separate thread, the CAD Kernel of JupyterCAD allows users to perform complex operations at near-native speed. It also helps to lower the load of the server while serving JupyterCAD to many users.&lt;/p&gt;
&lt;h3 id="jupyterlab-real-time-collaboration-framework"&gt;JupyterLab Real-Time Collaboration framework&lt;/h3&gt;
&lt;p&gt;In JupyterLab 4, Real-Time Collaboration (RTC) is not only about editing notebooks but it has become a framework for building collaborative applications. Using the components of &lt;strong&gt;jupyter_collaboration&lt;/strong&gt; helps us accelerate the development of the RTC features in JupyterCAD. Collaborative Editing is built upon a shared data model where &lt;strong&gt;jupyter_collaboration&lt;/strong&gt; handles all the transportation and conflict resolution, while Follow Mode makes use of Awareness, a lightweight notification system provided by the library.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="future-work"&gt;Future work&lt;/h2&gt;
&lt;p&gt;The current state of JupyterCAD illustrates the capabilities of JupyterLab as a foundation to build complex applications, not just for scientific computing but also for more general technical computing applications.&lt;/p&gt;
&lt;p&gt;We will continue to improve JupyterCAD on two axes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enhancing the 3D viewer with features to help users interact with the objects&lt;/li&gt;
&lt;li&gt;Enriching the Python API to improve interoperability with other CAD libraries&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We plan on upstreaming some of the features of JupyterCAD, like the annotations system and the Follow Mode, to jupyter_collaboration to enable it in other file contexts in JupyterLab (Notebooks, text files, etc).&lt;/p&gt;
&lt;p&gt;User feedback from the community also plays a big role in the project roadmap. Try JupyterCAD and share your feedback with us using the project’s &lt;a href="https://github.com/QuantStack/jupytercad/issues"&gt;GitHub issues&lt;/a&gt;!&lt;/p&gt;
&lt;div class="main-content-end" aria-hidden="true"&gt;&lt;/div&gt;
&lt;h2 id="about-the-authors"&gt;About the Authors&lt;/h2&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2023/collaborative-cad-in-jupyterlab/images/009-0_3Y8y-PCaP2B9a6de.jpg" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/trungleduc"&gt;Le Duc Trung&lt;/a&gt; is a Scientific Software Developer at QuantStack. He works on several projects within the Jupyter ecosystem, from the main projects like JupyterLab, Voilà, and ipywidgets to various JupyterLab extensions and widgets.&lt;/p&gt;
&lt;p class="standalone-image"&gt;&lt;img src="https://blog.jupyter.org/posts/2023/collaborative-cad-in-jupyterlab/images/010-0_A1jOuQ60SPZ_NTVv.jpg" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/martinRenou"&gt;Martin Renou&lt;/a&gt; is a Technical Director at &lt;a href="https://quantstack.net/"&gt;&lt;strong&gt;QuantStack&lt;/strong&gt;&lt;/a&gt; and a maintainer of &lt;a href="https://jupyter.org/"&gt;&lt;strong&gt;Project Jupyter&lt;/strong&gt;&lt;/a&gt;. Among other projects Martin is a core team member of the ipywidgets project and maintains many Jupyter widget packages such as &lt;a href="https://github.com/jupyter-widgets/ipyleaflet"&gt;ipyleaflet&lt;/a&gt;, &lt;a href="https://github.com/bloomberg/ipydatagrid"&gt;ipydatagrid&lt;/a&gt;, &lt;a href="https://github.com/QuantStack/ipygany"&gt;ipygany&lt;/a&gt;, &lt;a href="https://github.com/martinRenou/ipycanvas"&gt;ipycanvas&lt;/a&gt;, and &lt;a href="https://github.com/bqplot/bqplot"&gt;bqplot&lt;/a&gt;. He is a co-creator of the &lt;a href="https://github.com/voila-dashboards/voila/"&gt;Voilà&lt;/a&gt; dashboarding system, and the &lt;a href="https://github.com/jupyter-xeus/xeus-python"&gt;xeus-python&lt;/a&gt; kernel.&lt;/p&gt;
</content><category term="collaboration"/><category term="JupyterCAD"/><category term="JupyterLab"/></entry></feed>