{"id":14225472,"url":"https://github.com/ianthehenry/bauble","last_synced_at":"2026-01-25T04:07:36.174Z","repository":{"id":50556851,"uuid":"519430918","full_name":"ianthehenry/bauble","owner":"ianthehenry","description":"a playground for making 3D art with lisp and math","archived":false,"fork":false,"pushed_at":"2025-10-25T05:19:40.000Z","size":8387,"stargazers_count":518,"open_issues_count":2,"forks_count":13,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-11-05T18:02:55.279Z","etag":null,"topics":["3d","3d-graphics","art","glsl","graphics","janet","janet-lang","lisp","playground","procedural-generation","sdf","sdfs","shaders","signed-distance-field","signed-distance-functions","wasm","webassembly","webgl"],"latest_commit_sha":null,"homepage":"https://bauble.studio","language":"Janet","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/ianthehenry.png","metadata":{"files":{"readme":"README.md","changelog":null,"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":"2022-07-30T05:49:10.000Z","updated_at":"2025-10-25T05:19:43.000Z","dependencies_parsed_at":"2024-08-16T06:30:16.965Z","dependency_job_id":"cac6abde-23a9-4b4a-a3d5-9e78df1003da","html_url":"https://github.com/ianthehenry/bauble","commit_stats":null,"previous_names":["ianthehenry/bauble"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ianthehenry/bauble","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ianthehenry%2Fbauble","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ianthehenry%2Fbauble/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ianthehenry%2Fbauble/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ianthehenry%2Fbauble/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ianthehenry","download_url":"https://codeload.github.com/ianthehenry/bauble/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ianthehenry%2Fbauble/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28742983,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-25T02:46:29.005Z","status":"ssl_error","status_checked_at":"2026-01-25T02:44:29.968Z","response_time":113,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: 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":["3d","3d-graphics","art","glsl","graphics","janet","janet-lang","lisp","playground","procedural-generation","sdf","sdfs","shaders","signed-distance-field","signed-distance-functions","wasm","webassembly","webgl"],"created_at":"2024-08-20T01:00:58.676Z","updated_at":"2026-01-25T04:07:36.159Z","avatar_url":"https://github.com/ianthehenry.png","language":"Janet","funding_links":[],"categories":["Janet"],"sub_categories":[],"readme":"# [Bauble](https://bauble.studio)\n\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://bauble.studio/\"\u003e\u003cimg width=\"256\" height=\"256\" src=\"/logo-1024x1024.png\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\nBauble is a toy for composing signed distance functions in a high-level language ([Janet](https://janet-lang.org/)), compiling them to [GLSL](https://www.khronos.org/opengl/wiki/OpenGL_Shading_Language), and rendering them via WebGL.\n\nTry it out at \u003chttps://bauble.studio/\u003e, or watch this video introduction where I model an infinite number of hot air balloons:\n\n[![Livecoding a hot air balloon (1/3)](https://img.youtube.com/vi/0-OtdjiR7dc/maxresdefault.jpg)](https://www.youtube.com/watch?v=0-OtdjiR7dc\u0026list=PLjT5GDnW_UMBS6ih0kG7jWB0n1SnotnEu)\n\nNote that Bauble has changed (for the better!) quite a bit since that video, so it doesn't translate one to one. But it should be able to give you a good idea of the gist.\n\nFor more examples, I sometimes tweet videos of Bauble's development, which you can find here:\n\nhttps://twitter.com/ianthehenry\n\n# Dependencies\n\n- For the CLI\n    - [`janet`](https://janet-lang.org/)\n- For the web UI\n    - [`emscripten`](https://emscripten.org/)\n    - [`redo`](https://github.com/apenwarr/redo)\n    - [`yarn`](https://yarnpkg.com/)\n- For tests\n    - [`pngcrush`](https://pmt.sourceforge.io/pngcrush/) (tests only)\n\nBauble requires at least Janet 1.36.0 (the first release with integer literal syntax). It may work with newer versions of Janet, assuming that the image format is compatible, but it's better to [update the version of Janet that Bauble includes](build/janet/janet-version) to match your local version if you want to upgrade.\n\nTo build the CLI, install Janet dependencies like this:\n\n```\n$ (cd src \u0026\u0026 jpm -l deps)\n```\n\nTo build the web UI, install JavaScript dependencies as well:\n\n```\n$ yarn\n$ (cd studio \u0026\u0026 yarn)\n```\n\nBauble depends on [`codemirror-lang-janet`](https://github.com/ianthehenry/codemirror-lang-janet). If you want to make changes to the grammar, clone that repo and run [`yalc publish`](https://github.com/wclr/yalc) from the root of it. Then run `yalc link codemirror-lang-janet` in this repository, and you'll be able to see your changes locally.\n\n# Development\n\nTo build the CLI:\n\n```\n$ (cd src \u0026\u0026 jpm -l build)\n```\n\nTo run the CLI:\n\n```\n$ src/build/bauble help\n```\n\nTo build the web UI:\n\n```\n$ redo\n```\n\nTo create a minified, optimized build, use:\n\n```\n$ BUILD_MODE=prod redo\n```\n\nLint the JS with:\n\n```\n(cd studio \u0026\u0026 yarn eslint .)\n```\n\nAnd you can serve a local Bauble like this:\n\n```\n$ node_modules/.bin/alive-server public\n```\n\n# Testing\n\nThere are two types of tests. Regular [Judge](https://github.com/ianthehenry/judge) unit tests:\n\n```\n$ (cd src \u0026\u0026 judge)\n```\n\nAnd snapshot tests, which require installing separate dependencies:\n\n```\n# you only have to do this once\n$ (cd tests \u0026\u0026 jpm -l deps)\n```\n\nAfter installing dependencies, run tests like this:\n\n```\n$ (cd tests \u0026\u0026 jpm -l janet suite.janet)\n```\n\nSnapshot tests will write a file called `tests/summary.html`. It's not a very good file.\n\nBefore you commit snapshot changes, run:\n\n```\n$ (cd tests \u0026\u0026 jpm -l janet gc.janet)\n```\n\nWhich will delete old snapshots and compress new ones. This depends on `pngcrush`.\n\n# CLI\n\nTo run the Bauble CLI:\n\n```\n$ cd src\n$ jpm -l deps\n$ jpm -l build\n$ build/bauble\n```\n\nOr, after installing dependencies, you can just invoke it with the interpreter:\n\n```\n$ cd src\n$ jpm -l janet cli/init.janet\n```\n\nCurrently the CLI is the only way to export high-resolution images, render images with non-square aspect ratios, view raw GLSL shader source, and export 3D meshes.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fianthehenry%2Fbauble","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fianthehenry%2Fbauble","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fianthehenry%2Fbauble/lists"}