{"id":50911044,"url":"https://github.com/johannes-kaindl/physarum","last_synced_at":"2026-06-16T10:02:11.306Z","repository":{"id":361871321,"uuid":"1254611132","full_name":"johannes-kaindl/physarum","owner":"johannes-kaindl","description":"Generative slime-mold art in WebGPU. 19 presets, audio-reactive routing across 10 targets, kaleidoscope, paint/glow blend modes, long-exposure trails. PWA + standalone macOS app.","archived":false,"fork":false,"pushed_at":"2026-06-13T07:37:33.000Z","size":20523,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-13T09:22:47.017Z","etag":null,"topics":["creative-coding","generative-art","simulation","slime-mold","typescript","webgpu"],"latest_commit_sha":null,"homepage":"https://jkaindl.codeberg.page/physarum/","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/johannes-kaindl.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":"CLA.md"},"funding":{"liberapay":"jkaindl"}},"created_at":"2026-05-30T19:38:25.000Z","updated_at":"2026-06-13T07:37:40.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/johannes-kaindl/physarum","commit_stats":null,"previous_names":["johannes-kaindl/physarum"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/johannes-kaindl/physarum","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/johannes-kaindl%2Fphysarum","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/johannes-kaindl%2Fphysarum/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/johannes-kaindl%2Fphysarum/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/johannes-kaindl%2Fphysarum/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/johannes-kaindl","download_url":"https://codeload.github.com/johannes-kaindl/physarum/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/johannes-kaindl%2Fphysarum/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34400456,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-16T02:00:06.860Z","response_time":126,"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":["creative-coding","generative-art","simulation","slime-mold","typescript","webgpu"],"created_at":"2026-06-16T10:02:09.134Z","updated_at":"2026-06-16T10:02:11.299Z","avatar_url":"https://github.com/johannes-kaindl.png","language":"Swift","funding_links":["https://liberapay.com/jkaindl"],"categories":[],"sub_categories":[],"readme":"# Physarum\n\n\u003e Pure ambient generative art — a stigmergy simulation in WebGPU.\n\n[![License: AGPL-3.0](https://img.shields.io/badge/License-AGPL--3.0-8a4dff?style=flat-square)](LICENSE)\n[![Latest release](https://img.shields.io/badge/release-v1.5.0-39ff7a?style=flat-square)](https://codeberg.org/jkaindl/physarum/releases/latest)\n[![Built with WebGPU](https://img.shields.io/badge/WebGPU-Solid.js-16e0e0?style=flat-square)](https://codeberg.org/jkaindl/physarum)\n\nA progressive web app that simulates _Physarum polycephalum_ (slime mold).\nThousands of agents follow chemical trails, forming organic, ever-shifting\npath networks. Watch, tune, record, share.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/screenshot.png\" alt=\"Physarum — Aurora preset\" width=\"720\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://codeberg.org/jkaindl/physarum/releases/latest\"\u003e\n    \u003cimg alt=\"Download for macOS\" src=\"https://img.shields.io/badge/Download_for_macOS-39ff7a?style=for-the-badge\u0026logo=apple\u0026logoColor=060709\"\u003e\n  \u003c/a\u003e\n  \u0026nbsp;\u0026nbsp;\n  \u003ca href=\"https://jkaindl.codeberg.page/physarum/\"\u003e\n    \u003cimg alt=\"Launch the web app\" src=\"https://img.shields.io/badge/Launch_Web_App-16e0e0?style=for-the-badge\u0026logo=pwa\u0026logoColor=060709\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003csub\u003emacOS app requires macOS 14+ (native Metal, universal) · the web app runs in any WebGPU browser\u003c/sub\u003e\n\u003c/p\u003e\n\n\u003e **macOS:** the release app is **Developer ID-signed and Apple-notarised**,\n\u003e so it launches straight away — no Gatekeeper detour. Background and the\n\u003e build/signing details: [`docs/MACOS-APP.md`](docs/MACOS-APP.md).\n\n## Features\n\n- **3-species stigmergy** with a per-pair interaction matrix — each species\n  reads three pheromone channels and steers via a 3-sensor classical\n  Physarum (M1) model.\n- **25 curated built-in presets** spanning glow-y physarum classics\n  (Aurora, Lava, Synthwave), tightly-structured tech aesthetics\n  (Matrix, Circuits, Neural Lattice), kinetic motion (Murmuration, Comet\n  Trail, Supernova), paint-on-paper sumi-e (Ink Study, Ink Veins) and\n  meditative symmetry (Mandala, Mandala Six).\n- **Live editor** with collapsible sections, per-parameter help\n  tooltips, per-section reset, and a save-as-new flow with auto-baked\n  thumbnails.\n- **Audio-reactive** — microphone or tab-audio capture, free routing\n  from bass/mid/high to any of 10 modulation targets (move, turn,\n  deposit, sensor, rhythm, chaos, exposure, bloom, saturation,\n  contrast), with auto-gain.\n- **Capture** — PNG screenshot, WebM/MP4 video recording, msgpack-\n  packed `#p=…` share links.\n- **Post-processing stack** — HDR feedback echo, threshold bloom,\n  ACES tonemap, saturation/contrast/vignette grading.\n- **Two blend modes** — additive (glow) for dark backgrounds, paint\n  (ink) for bright ones.\n- **Kaleidoscope** (1-6 mirror axes) and **long-exposure head highlight**\n  for two distinct post-fx looks.\n- **Sim-speed multiplier** (1-8×) to evolve patterns faster than\n  real time.\n\n## Preset gallery\n\nA taste of the 25 built-ins — these six are new in **v1.5.0**:\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\" width=\"33%\"\u003e\u003cimg src=\"assets/presets/neural-lattice.png\" width=\"240\" alt=\"Neural Lattice\"\u003e\u003cbr\u003e\u003cb\u003eNeural Lattice\u003c/b\u003e\u003cbr\u003e\u003csub\u003emulti-species neon network\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd align=\"center\" width=\"33%\"\u003e\u003cimg src=\"assets/presets/ember-veil.png\" width=\"240\" alt=\"Ember Veil\"\u003e\u003cbr\u003e\u003cb\u003eEmber Veil\u003c/b\u003e\u003cbr\u003e\u003csub\u003ewarm dendrite glow\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd align=\"center\" width=\"33%\"\u003e\u003cimg src=\"assets/presets/mandala-six.png\" width=\"240\" alt=\"Mandala Six\"\u003e\u003cbr\u003e\u003cb\u003eMandala Six\u003c/b\u003e\u003cbr\u003e\u003csub\u003e6-fold kaleidoscope\u003c/sub\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\" width=\"33%\"\u003e\u003cimg src=\"assets/presets/ink-veins.png\" width=\"240\" alt=\"Ink Veins\"\u003e\u003cbr\u003e\u003cb\u003eInk Veins\u003c/b\u003e\u003cbr\u003e\u003csub\u003epaint-mode ink on paper\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd align=\"center\" width=\"33%\"\u003e\u003cimg src=\"assets/presets/aurora-drift.png\" width=\"240\" alt=\"Aurora Drift\"\u003e\u003cbr\u003e\u003cb\u003eAurora Drift\u003c/b\u003e\u003cbr\u003e\u003csub\u003ecooperative flowing ribbons\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd align=\"center\" width=\"33%\"\u003e\u003cimg src=\"assets/presets/supernova.png\" width=\"240\" alt=\"Supernova\"\u003e\u003cbr\u003e\u003cb\u003eSupernova\u003c/b\u003e\u003cbr\u003e\u003csub\u003ecenter-spawn chaos burst\u003c/sub\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## Embed\n\nDrop the player onto any page with the `\u003cphysarum-player\u003e` custom element:\n\n```html\n\u003cscript type=\"module\" src=\"https://jkaindl.codeberg.page/physarum/physarum-player.js\"\u003e\u003c/script\u003e\n\n\u003c!-- a built-in preset --\u003e\n\u003cphysarum-player preset=\"builtin:aurora\"\u003e\u003c/physarum-player\u003e\n\n\u003c!-- your own preset: in the app, open Settings -\u003e \"Copy embed code\" --\u003e\n\u003cphysarum-player preset=\"token:...\"\u003e\u003c/physarum-player\u003e\n\n\u003c!-- a cycling playlist --\u003e\n\u003cphysarum-player playlist=\"builtin:dreamy,builtin:aurora,builtin:nebula\" interval=\"20\"\u003e\u003c/physarum-player\u003e\n```\n\nAttributes: `preset`, `playlist`, `interval` (seconds), `controls`\n(`auto`/`always`/`none`), `poster`, `asset-base`, `autoplay`, `loop`.\nJS API: `.play()`, `.pause()`, `.next()`, `.prev()`, `.load(source)`.\nEvents: `physarum:ready`, `physarum:presetchange`, `physarum:error`.\n\nThe player is purely visual (no audio reactivity) and falls back to a poster\nimage when WebGPU is unavailable. Or embed via iframe using the hosted route:\n\n```html\n\u003ciframe src=\"https://jkaindl.codeberg.page/physarum/player.html?preset=builtin:aurora\"\n        style=\"border:0;width:100%;height:400px\"\u003e\u003c/iframe\u003e\n```\n\n## Requirements\n\n- Browser with WebGPU support (Chrome/Edge 113+, Safari 26+, Firefox stable)\n- For audio-reactive mode: microphone permission\n- Node 22+ for development\n\n## Development\n\n```bash\nnpm install\nnpm run dev\n```\n\nVisit `http://localhost:5173`.\n\n## Build\n\n```bash\nnpm run build\nnpm run preview\n```\n\n## Testing\n\n```bash\nnpm test          # unit tests\nnpm run test:e2e  # end-to-end (Playwright)\nnpm run lint\nnpm run typecheck\n```\n\n## Preset thumbnails\n\nBuilt-in preset cards ship with pre-rendered thumbnails in\n`public/preset-thumbs/`. After editing a preset's parameters, re-bake:\n\n```bash\nnpm run dev                # in one terminal\nnpm run bake:thumbnails    # in another — opens a headed Chromium\n```\n\nHeaded mode is required on macOS — Chrome's headless renderer doesn't\nexpose a working WebGPU device, so headless captures end up blank.\n\n## Distribution\n\n**Web (PWA)** — every push to `main` is built and published to Codeberg\nPages by `.forgejo/workflows/deploy.yml`:\n\u003chttps://jkaindl.codeberg.page/physarum/\u003e\n\n**macOS app** — the native SwiftUI/Metal app (full authoring editor, audio-reactive,\ncapture/export), Developer ID-signed + notarised, universal (Apple Silicon + Intel):\n\n```bash\n./scripts/build-macos-app.sh   # → dist-macos/Physarum.dmg\n```\n\nSee [`docs/MACOS-APP.md`](docs/MACOS-APP.md). App icons are generated from\n`assets/icon.svg` via `./scripts/gen-icons.sh`.\n\n## Contributing\n\nContributions are welcome — see [`CONTRIBUTING.md`](CONTRIBUTING.md).\nRelease history is in [`CHANGELOG.md`](CHANGELOG.md).\n\n## License\n\nPhysarum is **dual-licensed**:\n\n- **AGPL-3.0-or-later** for open-source use — see [`LICENSE`](LICENSE).\n- A **commercial license** is available for proprietary use that the AGPL\n  doesn't allow — e.g. embedding the `\u003cphysarum-player\u003e` component on a\n  closed-source website or in a SaaS — see [`LICENSING.md`](LICENSING.md) or\n  email `code@jkaindl.de`.\n\nContributions are accepted under the\n[Contributor License Agreement](CLA.md).\n\n## Support\n\nIf Physarum brightens a screen of yours, you can leave a tip on\n[Liberapay](https://liberapay.com/jkaindl). For commercial use, see\n[`LICENSING.md`](LICENSING.md).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjohannes-kaindl%2Fphysarum","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjohannes-kaindl%2Fphysarum","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjohannes-kaindl%2Fphysarum/lists"}