{"id":48269434,"url":"https://github.com/ibois-epfl/script-sync","last_synced_at":"2026-04-04T22:07:09.354Z","repository":{"id":214337666,"uuid":"734053014","full_name":"ibois-epfl/script-sync","owner":"ibois-epfl","description":"Rhino/Grasshopper/VSCode plug-in to run C# and Python (IronPython or CPython) scripts directly from VSCode.","archived":false,"fork":false,"pushed_at":"2025-04-10T11:18:41.000Z","size":41669,"stargazers_count":71,"open_issues_count":11,"forks_count":5,"subscribers_count":4,"default_branch":"main","last_synced_at":"2026-01-29T05:46:26.992Z","etag":null,"topics":["cpython","csharp","ironpython","rhino3d","script","vscode-extension"],"latest_commit_sha":null,"homepage":"https://www.food4rhino.com/en/app/script-sync","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ibois-epfl.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.md","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":"2023-12-20T18:46:17.000Z","updated_at":"2026-01-11T18:10:48.000Z","dependencies_parsed_at":null,"dependency_job_id":"f7b3e287-3fd5-4f4c-99d2-e9425cca1a75","html_url":"https://github.com/ibois-epfl/script-sync","commit_stats":null,"previous_names":["ibois-epfl/script-sync"],"tags_count":36,"template":false,"template_full_name":null,"purl":"pkg:github/ibois-epfl/script-sync","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ibois-epfl%2Fscript-sync","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ibois-epfl%2Fscript-sync/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ibois-epfl%2Fscript-sync/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ibois-epfl%2Fscript-sync/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ibois-epfl","download_url":"https://codeload.github.com/ibois-epfl/script-sync/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ibois-epfl%2Fscript-sync/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31416517,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T20:09:54.854Z","status":"ssl_error","status_checked_at":"2026-04-04T20:09:44.350Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["cpython","csharp","ironpython","rhino3d","script","vscode-extension"],"created_at":"2026-04-04T22:07:08.797Z","updated_at":"2026-04-04T22:07:09.339Z","avatar_url":"https://github.com/ibois-epfl.png","language":"Python","readme":"\u003cp align=\"center\"\u003e\n    \u003cimg src=\"VSCode\\scriptsync\\logo\\scriptsync_480.png\" width=\"140\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"https://github.com/ibois-epfl/script-sync/actions/workflows/rhinoplugin.yml/badge.svg\"\u003e\n    \u003cimg src=\"https://github.com/ibois-epfl/script-sync/actions/workflows/ghuserbuild.yml/badge.svg\"\u003e\n    \u003cimg src=\"https://github.com/ibois-epfl/script-sync/actions/workflows/yakbuild.yml/badge.svg\"\u003e\n    \u003cimg src=\"https://github.com/ibois-epfl/script-sync/actions/workflows/vscodeext.yml/badge.svg\"\u003e\n    \u003cimg alt=\"Dynamic JSON Badge\" src=\"https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fyak.rhino3d.com%2Fpackages%2Fscript-sync\u0026query=%24.version\u0026logo=rhinoceros\u0026label=Yak\u0026color=%23a3d6ff\"\u003e\n\u003c/p\u003e\n\n# script-sync\n\n**What is it?** Script-sync plug-in to run C# and Python (IronPython or CPython) scripts directly from VSCode into Rhino and Grasshopper. This project is a research utility from the [IBOIS lab](https://www.epfl.ch/labs/ibois/) at EPFL. It was developed and currently maintained by [Andrea Settimi](https://github.com/9and3).\n\n**Why Script-sync?** Although Rhino8 has a wonderful IDE, we often miss the nice extensions and functions of a full-fledged IDE like VSCode. Script-sync allows you to run your scripts directly from VSCode, while keeping the Rhino/Grasshopper environment open. This is particularly useful if you have *AI-assisted* (e.g. GithubCoPilot) code completion.\n\nAlso, if Rhino crashes, your code is still safe and editable.\n\nYou can execute the folloing languages from VSCode with script-sync:\n\n|               | CPython | IronPython  | C# |\n| ------------- | ------  | ----------- | -- |\n| Rhino         | ✅      | ✅          | ✅|\n| Grasshopper   | ✅      | ❌           | ❌  |\n\n\n\n\u003cbr\u003e\n\n\u003cp float=\"left\"\u003e\n  \u003cfigure\u003e\n    \u003cimg src=\"https://github.com/ibois-epfl/script-sync/assets/50238678/7ccb2aa5-e646-45cd-9657-95776d24a48a\" width=\"100%\" /\u003e\n    \u003cfigcaption\u003e\u003ci\u003eScript-sync in Rhino\u003c/i\u003e\u003c/figcaption\u003e\n  \u003c/figure\u003e\n\n  \u003cfigure\u003e\n    \u003cimg src=\"https://github.com/ibois-epfl/script-sync/blob/main/GH/PyGH/assets/vid/scriptsync_gh.gif?raw=true\" width=\"100%\" /\u003e\n    \u003cfigcaption\u003e\u003ci\u003eScript-sync in Grasshopper\u003c/i\u003e\u003c/figcaption\u003e\n  \u003c/figure\u003e\n\u003c/p\u003e\n\n\n## Installation\n🦏/🦗 **`Rhino/Grasshopper`**: Install script-sync rhino from food4rhino or the packageManager in Rhino (name: \"script-sync\"). For Grasshopper you might want to get rid of the old version of the plugin before installing the new one. Just right-click on the old icon and click *delete*.\n\n👩‍💻 **`VScode`**: Install script-syncVSCode extension from the VSCode extension marketplace (name: \"script-sync\")\n\n## How to use\n🦏 **`Rhino`**: To start `script-sync` in RhinoV8, run the command `ScriptSyncStart` in RhinoV8. This will start a server that listens to commands from VSCode.\nTo close `script-sync` in RhinoV8, run the command `ScriptSyncStop` in RhinoV8.\n\n🦗 **`Grasshopper`**: To start `script-sync` in Grasshopper, add the component script-sync: \n- \u003ccode\u003eselect_file\u003c/code\u003e: click to open a file explorer and connect a script,\n- \u003ccode\u003epackage_2_reload\u003c/code\u003e: this can be empty in 90% of the cases, but if you develop a custom pypi package, (installed with editable pip mode) you can add the name of the package you are developing here to track the changes in its modules. Otherwise leave it empty.\n- \u003ccode\u003ex\u003c/code\u003e: classical input parameter, you can add more, \n- \u003ccode\u003estdout\u003c/code\u003e: all errors and print() is deviated here, \n- \u003ccode\u003ea\u003c/code\u003e: classical output parameter, you can add more.\n\n\u003cp  align=\"center\"\u003e\n    \u003cimg src=\"GH\\PyGH\\assets\\img\\gh_snap2.png\" width=\"550\"\u003e\n\u003c/p\u003e\n\n\u003e [!TIP]\n\u003e `script-sync` automatically converts lists and nested lists to Grasshopper data trees. Just return the python list as value. It also supports the `ghpythonlib.treehelpers` module. Example:\n\u003e ```python\n\u003e   # option 1\n\u003e   py_nlist = [\n\u003e       [[1, 2], [3, 4]],\n\u003e       [[5, 6], [7, 8]]\n\u003e   ]\n\u003e\n\u003e   # options 2\n\u003e   import ghpythonlib.treehelpers as th\n\u003e   gh_tree = th.list_to_tree(py_nlist)\n\u003e\n\u003e   o_as_nlist = py_nlist\n\u003e   o_as_tree = gh_tree\n\u003e ```\n\u003e \u003cp  align=\"center\"\u003e\n\u003e    \u003cimg src=\"GH/PyGH/assets/img/listtreeauto.png\" width=\"550\"\u003e\n\u003e \u003c/p\u003e\n\n\n👩‍💻 **`VScode`**: Open a script in VSCode and run it in RhinoV8 by pressing `F4` to run in Rhino or `shift+F4` for Grasshopper.\nFor Python files, add a `shebang` to the first line of the file to specify the interpreter to use, e.g.:\n* `#! python3` to interpret it with CPython\n* ⚠️ `#! python2` to interpret it with IronPython (only in Rhino)\n\n\u003e [!TIP]\n\u003e If you want your script-sync VSCode extension to automatically update, you should thick the autoinstall box in the vscode extension page.\n\n\u003e [!CAUTION]\n\u003e If you use modules like `pickle` to (de)serialize objects script-sync might causes problems because we reload all the modules at every file save. This can interfere with `pickle` thinking that a class is instanciated multiple times.\n\n## Requirements\nThe plug-in needs to be installed on RhinoV8, Grasshopper and VSCode\n\n## Issues\nFor bugs open an issue on the [GitHub repo](https://github.com/ibois-epfl/script-sync/issues).\n\n## Contribution\nAll contributions are welcome. Have a look at the [contribution guidelines](CONTRIBUTING.md).\n\n## References\nThere are a lot of plug-ins that allow to run Python in Rhino. Among them, [CodeListener](https://github.com/ccc159/CodeListener) was working until RhinoV8 and it was a source of inspiration for this project.\n\n# For code maintainers\nPackages are published (`.yak` and `.vsix`)  automatically when a GitHub release is created.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fibois-epfl%2Fscript-sync","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fibois-epfl%2Fscript-sync","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fibois-epfl%2Fscript-sync/lists"}