{"id":13557375,"url":"https://github.com/bernhard-42/jupyter-cadquery","last_synced_at":"2025-05-15T03:04:36.821Z","repository":{"id":38356013,"uuid":"180015957","full_name":"bernhard-42/jupyter-cadquery","owner":"bernhard-42","description":"An extension to render cadquery objects in JupyterLab via pythreejs","archived":false,"fork":false,"pushed_at":"2025-03-20T07:47:40.000Z","size":103463,"stargazers_count":340,"open_issues_count":23,"forks_count":48,"subscribers_count":14,"default_branch":"master","last_synced_at":"2025-04-07T18:02:28.596Z","etag":null,"topics":["cad","cadquery","ipywidgets","jupyterlab","python","pythonocc"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bernhard-42.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-04-07T19:52:57.000Z","updated_at":"2025-04-02T09:01:43.000Z","dependencies_parsed_at":"2024-10-10T19:10:03.071Z","dependency_job_id":"8dd70a6b-e845-46e4-b59f-49032983e05e","html_url":"https://github.com/bernhard-42/jupyter-cadquery","commit_stats":{"total_commits":880,"total_committers":8,"mean_commits":110.0,"dds":0.5681818181818181,"last_synced_commit":"578b430af6e03ba05187e4fa22f64624b58a9cf5"},"previous_names":[],"tags_count":45,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bernhard-42%2Fjupyter-cadquery","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bernhard-42%2Fjupyter-cadquery/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bernhard-42%2Fjupyter-cadquery/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bernhard-42%2Fjupyter-cadquery/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bernhard-42","download_url":"https://codeload.github.com/bernhard-42/jupyter-cadquery/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248597622,"owners_count":21130909,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cad","cadquery","ipywidgets","jupyterlab","python","pythonocc"],"created_at":"2024-08-01T12:04:18.689Z","updated_at":"2025-05-15T03:04:36.813Z","avatar_url":"https://github.com/bernhard-42.png","language":"Python","funding_links":[],"categories":["Python","Editors and IDEs","python"],"sub_categories":[],"readme":"# Jupyter for CadQuery / build123d\n\nThe Python package provides a Jupyterlab extension and a JupyterServer extension to view [CadQuery](https://github.com/cadquery/cadquery), [build123d](https://github.com/gumyr/build123d), and [OCP](https://github.com/cadquery/OCP) objects in JupyterLab\n\nCurrent version: **v4.0.2** (2025-04-17)\n\n![Overview](screenshots/jupyter-cadquery.png)\n\n\nClick on the \"launch binder\" icon to start _Jupyter-CadQuery_ on binder:\n\n[![Binder: Latest development version](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/bernhard-42/jupyter-cadquery/master?urlpath=lab) (**Due to security restrictions, the measurement feature does not work on binder**)\n\n## Table of contents\n\n- [Overview](#overview)\n- [Key Features](#key-features)\n- [Examples](#examples)\n- [Installation](#installation)\n- [Standalone version](#standalone-version)\n- [Create and use the docker image](#create-and-use-the-docker-image)\n- [Demo Notebooks](#demo-notebooks)\n- [Usage](#usage)\n- [Release v4](release-v4)\n- [Migration from 3.x](#migration-from-3x)\n- [Known issues](#known-issues)\n\n\n## Overview\n\n_Jupyter-CadQuery_  release 4 is a complete rewrite of _Jupyter-CadQuery_ 3: \n\nIt is now based on:\n\n- the show logic provided by [ocp_vscode](https://github.com/bernhard-42/vscode-ocp-cad-viewer) (_OCP CAD Viewer for VS Code_),\n- the viewer is [three-cad-viewer](https://github.com/bernhard-42/three-cad-viewer)\n- the tessellation logic provided by [ocp-tessellate](https://github.com/bernhard-42/ocp-tessellate),\n- the communication between Python and Javascript provided by [cad-viewer-widget](https://github.com/bernhard-42/cad-viewer-widget), a custom [ipywidget](https://github.com/jupyter-widgets/ipywidgets),\n- and the new (!) measurement feature provided again by [ocp_vscode](https://github.com/bernhard-42/vscode-ocp-cad-viewer)\n\n**Note:** For changes see the migration section at the end of this page.\n\n## Key Features\n\n- Code CAD support\n  - _CadQuery \u003e= 2.5_ including _master_ (as of 2025-04)\n  - _build123d_ \u003e=0.9 including _master_ (as of 2025-04)\n  - _OCP_ == 7.8.X (as of 2025-04)\n\n- Viewing options:\n  - Directly in the JupyterLab output cell\n  - In a central Jupyterlab sidecar\n  - In separate windows in Jupyter lab\n  - For sidecar and windows based viewers, the viewers resize with the size of the container window. You can have a fixed aspect ratio (height to width ratio) or fill the complete container window.\n  - Auto display of _CadQuery_ and _build123d_ shapes\n  - Replay mode for CadQuery objects\n\n- Animations (see examples below)\n  - Support [animated CadQuery assemblies](https://github.com/bernhard-42/cadquery-massembly)\n  - Support [animated build123d assemblies](https://github.com/bernhard-42/bd_animation)\n  - Animated explode mode for _CadQuery_ and _build123d_ assemblies\n\n- Viewer features\n  - Clipping with max 3 clipping planes (of free orientation) with cap faces being properly shown\n  - Toggle visibility of shapes and edges\n  - Orthographic and perspective view\n  - Simple material editor (light intensity, metalness and roughness)\n  - Transparency mode\n  - Double click on shapes shows bounding box info\n  - Click on tree labels shows bounding box info and optionally hides or isolates the elements (use the modifier keys described in online help)\n\n\n## Examples\n\n### The viewer\n\nIt allows to view CAD objects with or without grid, using orthographic or perspective camera and many more viewing features.\n\n![Hexapod](screenshots/hexapod.png)\n\n### Measurement mode\n\nI allows to measure distance of objects, angle beween edges and faces and show propertis like center, are volume for objects selected\n\n![Exploded Quadruped](screenshots/measure.gif)\n\n### Animation System - explode assemblies\n\nThe animation system allows to explode CadQuery and build123d assemblies or group of CAD objects. The epxplosion center is (0,0,0).\n\n![Exploded Quadruped](screenshots/explode.gif)\n\n### Animation System - Self defined animation\n\nThe animation system also allows to create custom defined animations like this animated hexapod.\n\n  ![Animated Hexapod](screenshots/hexapod-crawling.gif)\n\n\n## Installation\n\n### Install Juypter-CadQuery\n\n- **CadQuery**\n\n  1. Create and activate a virtual conda environment\n\n      ```bash\n      mamba create -n jcq4 python=3.12.9\n      mamba activate jcq4\n      ```\n\n  2. Install latest cadquery master\n\n      ```bash\n      mamba install -c conda-forge -c cadquery cadquery=master\n      ```\n\n  3. Install Jupyter CadQuery\n\n      ```bash\n      pip install jupyter-cadquery\n      ```\n\n  4. Run Jupyter CadQuery\n  \n      ```bash\n      jupyter lab\n      ```\n\n- **build123d**\n\n  1. Create and activate a virtual environment (conda, pyenv-virtualenv, ...)\n\n  2. Install build123d\n\n      ```bash\n      pip install build123d\n      ```\n\n  3. Install Jupyter CadQuery\n\n      ```bash\n      pip install jupyter-cadquery\n      ```\n\n  4. Run Jupyter CadQuery\n\n      ```bash\n      jupyter lab\n      ```\n\n### Verfiy the installation\n\n**Note**: On a Mac the first run of the below commands can take minutes until the native libraries OCP and vtk are initialized. Afterwards it takes seconds only.\n\n1. Check the Jupyter lab extension, the viewer frontend: `jupyter lab extension list`\n\n    ```bash\n    Config dir: /Users/\u003cusername\u003e/.jupyter\n\n    Config dir: /Users/\u003cusername\u003e/.pyenv/versions/3.12.9/envs/jcq4/etc/jupyter\n        jupyter_lsp enabled\n        - Validating jupyter_lsp...\n        jupyter_lsp 2.2.5 OK\n        jupyter_cadquery enabled\n\n        - Validating jupyter_cadquery...\n        jupyter_cadquery 4.0.2 OK\n\n        jupyter_server_terminals enabled\n        - Validating jupyter_server_terminals...\n        jupyter_server_terminals 0.5.3 OK\n        jupyterlab enabled\n        - Validating jupyterlab...\n        jupyterlab 4.4.0 OK\n        notebook_shim enabled\n        - Validating notebook_shim...\n        notebook_shim  OK\n\n    Config dir: /usr/local/etc/jupyter\n    ```\n\n    You should again see `jupyter_cadquery 4.0.2 OK`. This ensures that the **viewer frontend** is properly installed\n\n2. Check the Jupyter server extension, the measurement backend: `jupyter server extension list`\n\n    ```bash\n    Config dir: /Users/\u003cusername\u003e/.jupyter\n\n    Config dir: /Users/\u003cusername\u003e/.pyenv/versions/3.12.9/envs/jcq4/etc/jupyter\n        jupyter_lsp enabled\n        - Validating jupyter_lsp...\n        jupyter_lsp 2.2.5 OK\n        jupyter_cadquery enabled\n\n        - Validating jupyter_cadquery...\n    Extension package jupyter_cadquery took 1.6050s to import\n        jupyter_cadquery 4.0.2 OK\n\n        jupyter_server_terminals enabled\n        - Validating jupyter_server_terminals...\n        jupyter_server_terminals 0.5.3 OK\n        jupyterlab enabled\n        - Validating jupyterlab...\n        jupyterlab 4.4.0 OK\n        notebook_shim enabled\n        - Validating notebook_shim...\n        notebook_shim  OK\n\n    Config dir: /usr/local/etc/jupyter\n    ```\n\n    You should see `jupyter_cadquery 4.0.2 OK`. This ensures that the **measurement backend** is properly installed.\n\n    If you see \"Extension package jupyter_cadquery took ...\", this is basically OCP and VTK loading time (this test import OCP and with that VTK).\n\n## Standalone version\n\nThe *standalone version* of _Jupyter CadQuery_ is now replaced with the one of _OCP CAD Viewer for VS Code_. To start it:\n\n1. Activate your python environment\n2. Execute `python -m ocp_vscode [--port \u003cport number\u003e]`\n\n3939 is the standard port that will be used automatically by the `show` commands.\n\n## Create and use the docker image\n\nThe docker image is not uploaded to docker hub any more. To build it, clone the repo and call `make docker`\n\nThe resulting image is called `bwalter42/jupyter_cadquery:4.0.2` and can be started with \n\n```bash\nWORKDIR=./jupyter-cadquery\ndocker run -it --rm -v $WORKDIR:/home/workdir -p 8888:8888 bwalter42/jupyter_cadquery:4.0.2\n```\n\nEverything stored in `/home/workdir` in the container will be actually stored on the local machine in `$WORKDIR`. The examples are copied into the container in a read-only folder `/home/examples-read-only`\n\n## Demo Notebooks\n\nStandard examples\n\n- [A run through of many features](./examples/1-cadquery.ipynb)\n- [Standard CadQuery examples in Jupyter CadQuery](./examples/2-cadquery-examples.ipynb)\n- [An OCP example (the OCC bottle)](./examples/3-occ.ipynb)\n- [CadQuery Sketch support](./examples/4-sketches.ipynb)\n- [build123d examples](./examples/5-build123d.ipynb)\n\nAnimated examples (requires `pip install cadquery-massembly matplotlib`):\n\n- [Rotating disk arm](./examples/assemblies/1-disk-arm.ipynb)\n- [Hexapod](./examples/assemblies/2-hexapod.ipynb)\n- [Jansen Linkage](./examples/assemblies/3-jansen-linkage.ipynb)\n- [CadQuery's door assembly example](./examples/assemblies/5-door.ipynb)\n- [A nested Assembly](./examples/assemblies/6-nested-assemblies.ipynb)\n\n\n## Usage\n\n### a) Viewer locations\n\n- Have the viewer in a Jupyter Sidcar, i.e. it can be shown/hidden easily\n\n  ```python\n  t = Text(\"SideCar\", 20)\n  cv_s = show(t, viewer=\"SideCar\", anchor=\"right\")\n  ```\n\n- Have the viewer in a separate Jupyter lab window placed at the right or left\n\n  ```python\n  t = Text(\"Right\", 20)\n  cv_r = show(t, viewer=\"Right\", anchor=\"split-right\")\n\n  t = Text(\"Left\", 20)\n  cv_l = show(t, viewer=\"Left\", anchor=\"split-left\")\n  ```\n\n- Have the viewer in a separate Jupyter lab window placed at the top or bottom, this time using `open_viewer`\n\n  ```python\n  t = Text(\"Top\", 20)\n  cv_t = open_viewer(\"Top\", anchor=\"split-top\", aspect_ratio=0)\n  show(t)\n\n  t = Text(\"Bottom\", 20)\n  cv_b = open_viewer(\"Bottom\", anchor=\"split-bottom\", aspect_ratio=0)\n  show(t)\n  ```\n\n  **Notes:**\n\n  - With `aspect_ratio = 0` the viewer will occupy the complete window. Otherwise it uses the `aspect_ratio` to size the viewer to be visible in the window. It currently only works with `open_viewer`, not with `show`\n  - Both `show(obj, viewer=\"\u003cViewer name\u003e\", anchor=\"\u003clocation\u003e\")` and `open_viewer(\"\u003cViewer name\u003e\", anchor=\"\u003clocation\u003e\"); show(obj)` achieve the same.\n\n  ![Viewer locations](./screenshots/viewer-locations.png)\n\n### b) Show objects\n\n- **Command**\n\n  ```python\n  show(cad_objs, **kwargs)\n  ```\n\n- **Parameters:**\n\n    ```text\n    cad_objs:                All cad objects that should be shown as positional parameters\n    ```\n\n- **Valid keywords for the CAD object attributes:**\n\n  ```text\n  names:                     List of names for the cad_objs. Needs to have the same length as cad_objs\n  colors:                    List of colors for the cad_objs. Needs to have the same length as cad_objs\n  alphas:                    List of alpha values for the cad_objs. Needs to have the same length as cad_objs\n  ```\n\n- **Valid keywords for the viewer location:**\n\n  ```text\n  viewer                     The name of the viewer. If None or \"\", then the viewer will be opened in the cell output\n  anchor:                    The location where to open the viewer\n                             (sidecar: \"right\", split windows: \"split-right\", \"split-left\", \"split-top\", \"split-bottom\")\n  cad_width:                 The width of the viewer canvas for cell based viewers (viewer is None or \"\") (default=800)\n  height:                    The height of the viewer canvas for cell based viewers (viewer is None or \"\") (default=600)\n  ```\n\n- **Valid keywords to configure the viewer:**\n\n  ```text\n  - UI\n    glass:                   Use glass mode where tree is an overlay over the cad object (default=False)\n    tools:                   Show tools (default=True)\n    tree_width:              Width of the object tree (default=240)\n    theme:                   The theme of the viewer (\"light\" or \"dark\")\n    pinning:                 Whether cell based viewers (viewer is None or \"\") can be pinned as png\n\n  - Viewer\n    axes:                    Show axes (default=False)\n    axes0:                   Show axes at (0,0,0) (default=False)\n    grid:                    Show grid (default=False)\n    ortho:                   Use orthographic projections (default=True)\n    transparent:             Show objects transparent (default=False)\n    default_opacity:         Opacity value for transparent objects (default=0.5)\n    black_edges:             Show edges in black color (default=False)\n    orbit_control:           Mouse control use \"orbit\" control instead of \"trackball\" control (default=False)\n    collapse:                Collapse.LEAVES: collapse all single leaf nodes,\n                             Collapse.ROOT: expand root only,\n                             Collapse.ALL: collapse all nodes,\n                             Collapse.NONE: expand all nodes\n                             (default=Collapse.ROOT)\n    ticks:                   Hint for the number of ticks in both directions (default=10)\n    center_grid:             Center the grid at the origin or center of mass (default=False)\n    up:                      Use z-axis ('Z') or y-axis ('Y') as up direction for the camera (default=\"Z\")\n    explode:                 Turn on explode mode (default=False)\n\n    zoom:                    Zoom factor of view (default=1.0)\n    position:                Camera position\n    quaternion:              Camera orientation as quaternion\n    target:                  Camera look at target\n    reset_camera:            Camera.RESET: Reset camera position, rotation, zoom and target\n                             Camera.CENTER: Keep camera position, rotation, zoom, but look at center\n                             Camera.KEEP: Keep camera position, rotation, zoom, and target\n                             (default=Camera.RESET)\n\n    clip_slider_0:           Setting of clipping slider 0 (default=None)\n    clip_slider_1:           Setting of clipping slider 1 (default=None)\n    clip_slider_2:           Setting of clipping slider 2 (default=None)\n    clip_normal_0:           Setting of clipping normal 0 (default=None)\n    clip_normal_1:           Setting of clipping normal 1 (default=None)\n    clip_normal_2:           Setting of clipping normal 2 (default=None)\n    clip_intersection:       Use clipping intersection mode (default=False)\n    clip_planes:             Show clipping plane helpers (default=False)\n    clip_object_colors:      Use object color for clipping caps (default=False)\n\n    pan_speed:               Speed of mouse panning (default=1)\n    rotate_speed:            Speed of mouse rotate (default=1)\n    zoom_speed:              Speed of mouse zoom (default=1)\n\n  - Renderer\n    deviation:               Shapes: Deviation from linear deflection value (default=0.1)\n    angular_tolerance:       Shapes: Angular deflection in radians for tessellation (default=0.2)\n    edge_accuracy:           Edges: Precision of edge discretization (default: mesh quality / 100)\n\n    default_color:           Default mesh color (default=(232, 176, 36))\n    default_edgecolor:       Default color of the edges of a mesh (default=#707070)\n    default_facecolor:       Default color of the edges of a mesh (default=#ee82ee)\n    default_thickedgecolor:  Default color of the edges of a mesh (default=#ba55d3)\n    default_vertexcolor:     Default color of the edges of a mesh (default=#ba55d3)\n    ambient_intensity:       Intensity of ambient light (default=1.00)\n    direct_intensity:        Intensity of direct light (default=1.10)\n    metalness:               Metalness property of the default material (default=0.30)\n    roughness:               Roughness property of the default material (default=0.65)\n\n    render_edges:            Render edges  (default=True)\n    render_normals:          Render normals (default=False)\n    render_mates:            Render mates for MAssemblies (default=False)\n    render_joints:           Render build123d joints (default=False)\n    show_parent:             Render parent of faces, edges or vertices as wireframe (default=False)\n    show_sketch_local:       In build123d show local sketch in addition to relocate sketch (default=True)\n    helper_scale:            Scale of rendered helpers (locations, axis, mates for MAssemblies) (default=1)\n    progress:                Show progress of tessellation with None is no progress indicator. (default=\"-+*c\")\n                             for object: \"-\": is reference,\n                                         \"+\": gets tessellated with Python code,\n                                         \"*\": gets tessellated with native code,\n                                         \"c\": from cache\n\n  - Debug\n    debug:                   Show debug statements to the VS Code browser console (default=False)\n    timeit:                  Show timing information from level 0-3 (default=False)\n  ```\n\n### c) Manage default values\n\n- **`set_defaults(**kwargs)`:** allows to globally set the defaults value so they do not need to be provided with every `show` call\n\n    kwargs:\n\n  - see `show`\n\n- **`get_default(value)`:** Get the global default for a single `value`\n- **`get_defaults()`:** Get all global defaults\n- **`reset_defaults()`**: Reset all defaults back to its initial value\n\n### d) Replay objects\n\nNote, this is not supported in the standalone viewer for the time being.\n\n- **`replay(args)`**\n\n    _Argument `args`:_\n\n  - `cad_obj`: cadquery object\n  - `index` (`default=0`): Element in the fluent API stack to show\n  - `debug` (`default=False`): Trace building the replay stack\n  - `cad_width` (`default=600`): Width of the CAD view\n  - `height` (`default=600`): Height of the CAD view\n\n### e) Exports\n\n- **Export as PNG:**\n\n    Display your object via\n\n    ```python\n    cv = show(a1)\n    ```\n\n    and adapt the cad view as wanted (camera location, axis, transparency, ...).\n\n    Then call\n\n    ```python\n    cv.export_png(\"example.png\")\n    ```\n\n- **Export as HTML:**\n\n    Display your object without using a sidecar (set `viewer` to `None`) via\n\n    ```python\n    cv = show(a1, viewer=None)\n    ```\n\n    and adapt the cad view as wanted (camera location, axis, transparency, ...).\n\n    Then call\n\n    ```python\n    cv.export_html()\n    ```\n\n    Note: This does not work with viewers in sidecars!\n\n\n## Release v4\n\nCurrent version: **v4.0.2** (2025-04-17)\n\n### Changes\n\nv4 is now based on _OCP CAD Viewer for VS Code_, but keeps the behavior very similar to v3.\nFor the introduced changes, see Migration below\n\n### Fixes\n\nNot tracked for v3 =\u003e v4 due to using a new base (_OCP CAD Viewer for VS Code_)\n\n\n## Migration from 3.x\n\n**Changed behavior:**\n\n- In order to align Jupyter CadQuery with OCP Viewer for VS Code, the following changes have been implemented:\n  - After `openviewer(...)` the default viewer location is set. Force to a cell based viewer by using the keyword parameter `viewer=\"\"` instead of `viewer=None`\n  - `show` keyword changes\n    - `mate_scale` is replaced by `helper_scale`\n    - `control = \"orbit\"` and `control = \"Trackball\"` are replaced by `orbit_control = True` or `orbit_control = False`\n    - `reset_camera` does not take boolean any more. Use the enum `Camera` (`from jupyter_cadquery import Camera`)\n    - `collapse` does not take strings any more. Use the enum `Collapse` (`from jupyter_cadquery import Collapse`)\n    - `default_edge_color` needs to be changed to `default_edgecolor`.\n    - `PartGroup`, `Part`, `Faces`, `Edges`, `Vertices` classes do not exist any more. Use CadQuery or build123d assemblies instead.\n    - `optimal_bb` does not exist any more. The system now determines the right bounding box itself.\n    - `js_debug` does not exist any more. Use `debug`instead.\n\n- Change functions and methods\n  - The function `webcol_to_cq` does not exist any more. Use web color strings (`#80ff80`) or CadQuery / build123d Color classes.\n  - The method `select_clipping` is replaced by `viewer.tab = \"clip\"` (other alternatives are \"tree\" and \"material\")\n  - The method `select_tree` is replaced by `viewer.tab = \"tree\"` (other alternatives are \"clip\" and \"material\")\n\n- Removed functionality\n  - The `voila` base standalone viewer is removed. Use `python -m ocp_vscode` now, using the same `show` commands\n  - The docker support is reduced to providing a Docker file\n  - Export as HTML file is not supported any more\n\n## Known issues\n\n- [z-fighting](https://en.wikipedia.org/wiki/Z-fighting) happens some times, especially when using multiple clip planes (cannot be solved in general)\n- Measurement feature does not work on binder at the moment (XSRF cookie issue)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbernhard-42%2Fjupyter-cadquery","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbernhard-42%2Fjupyter-cadquery","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbernhard-42%2Fjupyter-cadquery/lists"}