{"id":19489448,"url":"https://github.com/1j01/pbj-sandbox","last_synced_at":"2025-12-18T07:05:38.450Z","repository":{"id":25310480,"uuid":"28737138","full_name":"1j01/pbj-sandbox","owner":"1j01","description":"2D point-based physics sandbox 🥜🍇🏖","archived":false,"fork":false,"pushed_at":"2021-10-10T04:54:05.000Z","size":1663,"stargazers_count":15,"open_issues_count":0,"forks_count":4,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-05-20T21:44:44.115Z","etag":null,"topics":["javascript","jelly","physics","physics-2d","physics-engine","physics-simulation","playground","point-based","point-based-physics","sandbox","sandbox-game","simulation"],"latest_commit_sha":null,"homepage":"https://1j01.github.io/pbj-sandbox/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/1j01.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-01-03T06:44:08.000Z","updated_at":"2023-12-16T13:24:21.000Z","dependencies_parsed_at":"2022-07-24T05:15:04.895Z","dependency_job_id":null,"html_url":"https://github.com/1j01/pbj-sandbox","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/1j01%2Fpbj-sandbox","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/1j01%2Fpbj-sandbox/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/1j01%2Fpbj-sandbox/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/1j01%2Fpbj-sandbox/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/1j01","download_url":"https://codeload.github.com/1j01/pbj-sandbox/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224014299,"owners_count":17241281,"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":["javascript","jelly","physics","physics-2d","physics-engine","physics-simulation","playground","point-based","point-based-physics","sandbox","sandbox-game","simulation"],"created_at":"2024-11-10T21:08:36.597Z","updated_at":"2025-12-18T07:05:33.109Z","avatar_url":"https://github.com/1j01.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# \u003cimg src=\"pbj-sandbox-logo.svg\" height=\"32\"\u003e PBJ Sandbox\n\nA point-based jelly physics sandbox, with several tools to construct shapes and scenes.\n\nYou can [check it out here](https://1j01.github.io/pbj-sandbox).\n\n\u003ca href=\"https://1j01.github.io/pbj-sandbox\"\u003e\u003cimg src=\"icon-48x48.png\"\u003e\u003c/a\u003e\n\n## Features\n\n- Undo/redo\n- Selection, copy/paste/delete\n- **Dynamic audio** that responds to the physics (must be enabled first)\n- Collidable windows\n- Rope tool\n- Ball tool\n- Glue tool\n- Precise connector tool\n- Ghost trails, slow motion, gravity, and other settings\n- Keyboard shortcuts to switch tools (and to use some tools without switching)\n- Touch support\n\n\u003ca href=\"https://1j01.github.io/pbj-sandbox\"\u003e\u003cimg src=\"icon-47x47.png\"\u003e\u003c/a\u003e\n\n## Ways to Lose Data\n\nThis should be considered a toy.\nHowever, since this is a topic I care about, I like to think about ways users can lose data, and I've documented it here.\n\nThere's **no save/load**. And the clipboard is internal, so you can't use it as a workaround to save/load. Everything is lost if you close the tab.\n\nSome things are not in the undo state, even though they affect the world:\n- browser window size,\n- in-app window positions and sizes,\n- simulation options like gravity\n\nFurthermore, if the simulation is active, undo/redo is destructive,\nbecause the states will be replaced with ones further ahead in time,\nas you go back and forth.\nFor example, if you throw a point, and undo, the redo state is the state at which you undid the throw, so if you redo, it will be in midair.\nThen it lands, and you undo and redo, and it's already landed in the redo state.\n\nAnd some things don't create undo history, like dragging windows,\nso you can go for quite some time messing around without creating any undo states you can go back to.\n\nEventually I plan to create a system where none of these things are the case.\nI'm calling that system [Mopaint](https://mopaint.app/) for now, but it's very early, and not focused on physics at all — yet. 🙂\n\n## Help + TODO\n\nSee in-app Help and TODO windows accessible from the Options window.\n\n## License\n\n[WTFPL](https://en.wikipedia.org/wiki/WTFPL) or [CC0](https://creativecommons.org/publicdomain/zero/1.0/)\n\n## Contributing\n\nThis is just a toy, so I'm happy growing it as organically as the structures you can create with it.\n\nFeel free to send pull requests adding weird tools.\n\n## See Also\n\n* [Skele2D][], a newer project of mine, a point-based editor / game engine thing\n\n* [verlet-js][], a point based physics engine that can have more solid shapes (bodies) because it uses [Verlet integration][]\n\n* [os-gui.js][], the windowing library I use for this project\n\n[Skele2D]: https://github.com/1j01/skele2d\n[verlet-js]: https://github.com/subprotocol/verlet-js\n[Verlet integration]: https://en.wikipedia.org/wiki/Verlet_integration\n[os-gui.js]: https://github.com/1j01/os-gui\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F1j01%2Fpbj-sandbox","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F1j01%2Fpbj-sandbox","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F1j01%2Fpbj-sandbox/lists"}