{"id":33120105,"url":"https://github.com/nir/jupylet","last_synced_at":"2025-11-16T16:01:55.381Z","repository":{"id":37638135,"uuid":"233240141","full_name":"nir/jupylet","owner":"nir","description":"Python game programming in Jupyter notebooks.","archived":false,"fork":false,"pushed_at":"2024-01-22T16:39:18.000Z","size":20887,"stargazers_count":243,"open_issues_count":10,"forks_count":25,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-09-25T06:58:54.784Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://jupylet.readthedocs.io","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nir.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","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":"2020-01-11T13:57:37.000Z","updated_at":"2025-09-19T23:47:34.000Z","dependencies_parsed_at":"2023-01-30T21:00:30.941Z","dependency_job_id":"e56cc472-cc42-4a4d-b8a6-16873cf1e437","html_url":"https://github.com/nir/jupylet","commit_stats":{"total_commits":355,"total_committers":5,"mean_commits":71.0,"dds":0.504225352112676,"last_synced_commit":"2b5335f90e932de818a86a83afb8a218c146d4fe"},"previous_names":[],"tags_count":21,"template":false,"template_full_name":null,"purl":"pkg:github/nir/jupylet","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nir%2Fjupylet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nir%2Fjupylet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nir%2Fjupylet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nir%2Fjupylet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nir","download_url":"https://codeload.github.com/nir/jupylet/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nir%2Fjupylet/sbom","scorecard":{"id":688727,"data":{"date":"2025-08-11","repo":{"name":"github.com/nir/jupylet","commit":"7e1fca6365380567106140fbade48687a378dc36"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.2,"checks":[{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: BSD 2-Clause \"Simplified\" License: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v0.9.2 not signed: https://api.github.com/repos/nir/jupylet/releases/137840072","Warn: release artifact v0.9.1 not signed: https://api.github.com/repos/nir/jupylet/releases/127094320","Warn: release artifact v0.9.0 not signed: https://api.github.com/repos/nir/jupylet/releases/99518243","Warn: release artifact v0.8.9 not signed: https://api.github.com/repos/nir/jupylet/releases/86371125","Warn: release artifact v0.9.2 does not have provenance: https://api.github.com/repos/nir/jupylet/releases/137840072","Warn: release artifact v0.9.1 does not have provenance: https://api.github.com/repos/nir/jupylet/releases/127094320","Warn: release artifact v0.9.0 does not have provenance: https://api.github.com/repos/nir/jupylet/releases/99518243","Warn: release artifact v0.8.9 does not have provenance: https://api.github.com/repos/nir/jupylet/releases/86371125"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":6,"reason":"4 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-cpwx-vrp4-4pq7","Warn: Project is vulnerable to: GHSA-gmj6-6f8f-6699","Warn: Project is vulnerable to: GHSA-h75v-3vvj-5mfj","Warn: Project is vulnerable to: GHSA-q2x7-8rv6-6q7h"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}}]},"last_synced_at":"2025-08-22T01:44:01.160Z","repository_id":37638135,"created_at":"2025-08-22T01:44:01.160Z","updated_at":"2025-08-22T01:44:01.160Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":284734138,"owners_count":27054622,"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","status":"online","status_checked_at":"2025-11-16T02:00:05.974Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":[],"created_at":"2025-11-15T04:00:41.507Z","updated_at":"2025-11-16T16:01:55.351Z","avatar_url":"https://github.com/nir.png","language":"Python","readme":"# Jupylet\n\n*Jupylet* is a Python library for programming 2D and 3D games, graphics, music \nand sound synthesizers, interactively in a Jupyter notebook. It is intended \nfor three types of audiences:\n\n* Computer scientists, researchers, and students of deep reinforcement learning.\n* Musicians interested in sound synthesis and live music coding.\n* Kids and their parents interested in learning to program.\n\n\u0026nbsp;\n\n\u003cp float=\"left\"\u003e\n    \u003cimg src=\"https://github.com/nir/jupylet/raw/master/docs/images/spaceship.gif\" width=\"256\" /\u003e\n    \u003cimg src=\"https://github.com/nir/jupylet/raw/master/docs/images/spaceship_3d.gif\" width=\"384\" /\u003e\n\u003c/p\u003e\n\n## Jupylet for Kids\n\nA Jupyter notebook is in essence a laboratory for programming. It is the ideal\nenvironment for playing around with code, experimenting, and exploring ideas.\nIt is used by professional machine learning scientists who come every day to\nplay at work, so why not by kids?\n\n*Jupylet* is wonderfully easy to use for creating simple 2D and 3D games and \nmusic interactively and experimentally. Change a variable or a function and \nsee how the game is affected immediately while running.\n\n## Jupylet for Deep Reinforcement Learning\n\n*Jupylet* makes it is super easy to create and modify environments in which to\nexperiment with deep reinforcement learning algorithms and it includes the API\nto programmatically control multiple simultaneous games and render thousands \nof frames per second.\n\nConsider for example the pong game included in this code base. With a few\nlines of code you can modify the colors of the game to experiment with transfer \nlearning, or turn the game into 4-way pong with agents on all four sides of the \ngame court to experiment with cooperation between multiple agents. And since you \ncan modify the game interactively in Jupyter this process is not only easy but \nalso fun.  \n\nCheck out the [*Programming Graphics*](https://jupylet.readthedocs.io/en/latest/programmers_reference_guide/graphics.html) \nand the [*Reinforcement Learning*](https://jupylet.readthedocs.io/en/latest/programmers_reference_guide/rl.html) \nchapters in the Jupylet Programmer's Reference Guide.\n\n## Jupylet for Musicians\n\n*Jupylet* imports ideas and methods from machine learning into the domain\nof sound synthesis to easily let you create sound synthesizers as wild as you\ncan dream up - it includes impulse response reverb effects, colored noise \ngenerators, resonant filters with cutoff frequency sweeping, oscillators with \nLFO modulation, multi sampled instruments, and much more... And all of it in \npure Python for you to modify and experiment with.\n\nIn addition *Jupylet* draws inspiration from the wonderful [*Sonic Pi*](https://sonic-pi.net/)\nand brings live loops and live music coding to Jupyter and Python. Hook up \nyour MIDI keyboard and take off.\n\nCheck out the [*Programming Sound and Music*](https://jupylet.readthedocs.io/en/latest/programmers_reference_guide/sound.html) \nand the [*Programming Synthesizers*](https://jupylet.readthedocs.io/en/latest/programmers_reference_guide/synthesis.html)\nchapters in the Jupylet Programmer's Reference Guide.\n\n## Requirements\n\n*Jupylet* should run on Python 3.9 and up on Windows, Mac, and Linux.\n\n## How to Install and Run Jupylet\n\nIf you are new to Python, I recommend that you install and use the\n[Miniconda Python](https://docs.conda.io/en/latest/miniconda.html)\ndistribution. \n\n**On Windows** \u0026ndash; download and run the 64-bit installer for Python 3.11. Once \nMiniconda is installed press the `⊞ Winkey` and then type *Miniconda* and \npress the `Enter` key. This should open a small window that programmers call \n*console* or *shell* in which you can enter commands and run programs.\n\n**On macOS with M1 processor** \u0026ndash; download and run \"Miniconda3 macOS Apple M1 64-bit pkg\" \nfor Python 3.11. Once installed click the Spotlight icon `🔍` and in the search \nfield type *terminal* and press the `Enter` key to open the console. Then you need \nto run the following command:\n\n    pip install --extra-index https://github.com/nir/jupylet/releases/download/v0.9.2/ moderngl glcontext\n\n**On macOS with Intel processor** \u0026ndash; download and run \"Miniconda3 macOS Intel x86 64-bit pkg\" \nfor Python 3.11. Once installed click the Spotlight icon `🔍` and in the search \nfield type *terminal* and press the `Enter` key to open the console.\n\n**On Linux** \u0026ndash; download \"Miniconda3 Linux 64-bit\". This should download the file\nMiniconda3-latest-Linux-x86_64.sh. Install it by running the following command \nin a bash shell (once installed start a new bash shell):\n\n    bash Miniconda3-latest-Linux-x86_64.sh\n\n---\n\nOnce Miniconda is installed it is time to install *jupylet* by typing the \nfollowing command in the console:\n\n    pip install jupylet\n\nNext, to run the example notebooks, download the *jupylet* source code. \nIf you have [Git](https://git-scm.com/) installed type the following command:\n\n    git clone https://github.com/nir/jupylet.git\n\nAlternatively, you can download the source code with the following command:\n\n    python -m jupylet download\n\nNext, enter the *jupylet/examples/* directory with the change directory\ncommand:\n\n    cd jupylet/examples/\n\nAnd start a jupyter notebook with:\n\n    jupyter notebook 11-spaceship.ipynb\n\nRun the notebook by following the instructions in the notebook and a game\ncanvas should appear with the spaceship example:\n\n\u003cimg src=\"https://github.com/nir/jupylet/raw/master/docs/images/spaceship.gif\" width=\"256\" height=\"256\" /\u003e\n\nAlternatively, you can run the same game as a Python script from the console \nwith:\n\n    python spaceship.py\n\n## Documentation\n\nTo get started with Jupylet head over to the *Jupylet Programmer's Reference \nGuide* which you can find at \n[jupylet.readthedocs.io](https://jupylet.readthedocs.io/).  \n\nTo complement the online guide check out the growing collection of \n[*example notebooks*](examples/) that you can download and run on your \ncomputer as explained above.\n\n## Contact\n\nFor questions and feedback send an email to [Nir Aides](mailto:nir.8bit@gmail.com) or [join the discussion](https://github.com/nir/jupylet/discussions).\n\n## Spread the Word\n\nJupylet is a new library and you can help it grow with a few clicks - \nif you like it let your friends know about it!\n\n## Acknowledgements\n\n* [Einar Forselv](https://github.com/einarf) - The programmer behind ModernGL \nfor his endless help in the trenches of OpenGL programming.\n* [Alban Fichet](https://afichet.github.io/) - For kindly licensing his \nsound visualizer Shadertoy as CC BY 4.0 license.\n\n## What's New in Version 0.9.1\n\n* Support for Python 3.10 and Python 3.11 with MIDI functionality.\n* Seamlessly track changes to audio devices on macOS.\n* Workaround PIL api change - thanks to [@misolietavec](https://github.com/misolietavec).\n* Bug fixes. \n\n## What's New in Version 0.8.9\n\n* Support for Python 3.10 and Python 3.11 - except for MIDI functionality.\n* Support for macOS M1.\n* Spectrum analyzer.\n* Bug fixes. \n\n\u003cimg src=\"https://user-images.githubusercontent.com/124126/208634912-6cf956ec-b1e3-43c2-87a1-3c437953b739.png\" width=50% height=50%\u003e\n\n## What's New in Version 0.8.8\n\n* Support for Python 3.9. \n\n## What's New in Version 0.8.7\n\n* Workaround auto-completion bug in Jupyter notebooks. \n\n## What's New in Version 0.8.6\n\n* Support for rendering Shadertoy OpenGL shaders. \n[Shadertoy](https://www.shadertoy.com/) is an awesome online platform for  \nprogramming and sharing OpenGL shaders online, and now you can \n[use and render shadertoy shaders in Jupylet!](https://jupylet.readthedocs.io/en/latest/programmers_reference_guide/graphics-3d.html#shadertoys)\n\n","funding_links":[],"categories":["Audio Related Packages","Domain-Specific Projects"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnir%2Fjupylet","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnir%2Fjupylet","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnir%2Fjupylet/lists"}