-
Physarum v2.3.0 Stable
released this
2026-06-22 07:38:58 +00:00 | 7 commits to main since this releaseAccessibility + error-handling, App Store submission readiness (iOS + tvOS), a tvOS Top Shelf hero, and one consistent app icon across every device.
Added
- Accessibility & error-handling pass (native apps) — VoiceOver labels on every control, Dynamic Type scaling, and clear alerts (with recovery actions) for previously-silent failures.
- App Store submission readiness (iOS + tvOS) — privacy manifest, an encryption-compliance declaration, an
app-storeexport/archive script, and submission docs underdocs/appstore/. - tvOS Top Shelf hero — a cinematic loop through the 7 curated presets on the Apple TV home screen (static poster live; the autoplay preview video is parked as a nice-to-have).
Changed
- Built-in library is now the 7 curated factory presets — older hand-built classics retired; existing
builtin:<classic>embed/share links no longer resolve. - One consistent atom app icon across iOS, iPadOS, tvOS and macOS.
macOS: download the notarised universal
Physarum.dmgbelow (macOS 14+, opens without a Gatekeeper warning). iPhone, iPad & Apple TV are heading to the App Store.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
released this
2026-06-20 12:04:51 +00:00 | 59 commits to main since this releaseA native "copy embed code" export, the curated presets brought onto the web, and two fixes for the embeddable player.
Added
- Web embed export (native apps). A new "Embed" option in the share sheet (alongside Photo & Video) copies a paste-ready
<physarum-player>snippet for the current preset — a self-contained, live web player you can drop into any page or<iframe>. Visual-only. - The curated factory presets are now web built-ins. Terminal Haze, Neon Waves, Solar Veil and Dancing Ink join the web library (now 29 built-ins), each embeddable as
builtin:<id>.
Changed
- Aurora, Mandala and Mystic now ship the curated (device-tuned) parameters on the web, matching the native factory slots.
Fixed
- Embeddable player ran too fast on high-refresh displays (120 Hz / ProMotion ran the sim ~twice as fast). It now advances at a fixed 60 Hz regardless of refresh rate.
- Fullscreen control in embeds is offered only where fullscreen is available (self-hides in an
<iframe>not grantedallow="fullscreen"); the documented iframe snippets now include that grant.
macOS download —
Physarum.dmgmacOS 14 (Sonoma)+ · native Metal · universal (Apple Silicon + Intel). Developer ID-signed and Apple-notarised — opens straight away. Drag Physarum onto Applications and double-click.
If macOS ever blocks an unsigned build
Official releases are notarised. If you have an unsigned build and macOS says "Apple could not verify…": click Done (not Move to Trash), then System Settings ▸ Privacy & Security ▸ Open Anyway. Or:
xattr -dr com.apple.quarantine /Applications/Physarum.app
The web app runs in any WebGPU browser: https://jkaindl.codeberg.page/physarum/
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Web embed export (native apps). A new "Embed" option in the share sheet (alongside Photo & Video) copies a paste-ready
-
released this
2026-06-19 19:32:18 +00:00 | 65 commits to main since this releaseNative apps (macOS / iPad / iPhone / Apple TV) gain a slot-based preset system with iCloud sync, and the Apple TV ambient display now reacts to audio streamed from an iPhone or iPad. The web PWA (Codeberg Pages) is unchanged — these are native-app features.
Added
- Preset slots — a 24-slot "save-game" model. Presets are now 24 fixed, equally-editable slots (no more built-in/custom split): some ship factory-filled, all are editable. Saving means picking a slot. "Reset all" restores the factory set; "Keep only pinned" compacts the store to your pinned presets.
- iCloud sync (iPhone / iPad / Apple TV). Slots sync across your devices via iCloud key-value storage; pinned slots form the curated Apple TV lean-back rotation. (macOS stores slots locally for now.)
- Apple TV audio reactivity from your phone. With the iPhone/iPad editor connected to the Apple TV, the phone's microphone now drives the TV's visuals — the phone computes the audio reactivity and streams it over the local network, so the (mic-less) Apple TV reacts to the music in the room.
- A fresh, curated factory preset set for the slot grid.
Changed
- Content-addressed thumbnails. Slot previews are keyed by a hash of the preset's parameters, so a preview always tracks the current look — whether edited locally or changed via sync — and identical looks de-duplicate.
Fixed
- iCloud-KVS initial-sync race (data-loss class). Cross-device sync could clobber pinned slots on launch before iCloud finished downloading. Seeding is now gated on the authoritative load, and pending changes are flushed to iCloud on backgrounding.
macOS download —
Physarum.dmgmacOS 14 (Sonoma) or newer · native Metal rendering (no WebGPU/browser) · universal (Apple Silicon + Intel). The app is Developer ID-signed and Apple-notarised, so it opens straight away — no Gatekeeper detour. Drag Physarum onto Applications and double-click.
If macOS ever blocks an unsigned build
Official releases are notarised and open without a warning. If you have an unsigned build and macOS says "Apple could not verify…", do it once:
- Click Done (not "Move to Trash").
- Apple menu ▸ System Settings ▸ Privacy & Security.
- Scroll to the bottom ▸ Open Anyway ▸ confirm.
Or in Terminal:
xattr -dr com.apple.quarantine /Applications/Physarum.app
The web app runs in any WebGPU browser: https://jkaindl.codeberg.page/physarum/
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Physarum 2.0.0 Stable
released this
2026-06-15 20:29:36 +00:00 | 126 commits to main since this releasePhysarum 2.0.0 — the macOS app is now native.
The macOS DMG now ships the native SwiftUI/Metal app — the same engine as the iPad/iPhone build — replacing the previous WKWebView wrapper. Full desktop feature set: the authoring editor (interaction matrix, locks, randomize, preset morph, undo/redo), native audio-reactivity, capture/export (high-res PNG, video, Live Photo), adaptive sim format, and fullscreen.
Highlights
- macOS 14 (Sonoma) or newer — down from macOS 26 — with no WebGPU/browser dependency (native Metal rendering).
- Universal binary (Apple Silicon + Intel), Developer ID-signed and Apple-notarised.
- Aspect-correct kaleidoscope fold (round mandalas on non-square windows).
The web PWA (https://jkaindl.codeberg.page/physarum/) is unchanged.
Install
- Open
Physarum.dmgand drag Physarum onto Applications. - Launch it from the Applications folder — the app is notarised and opens without a Gatekeeper warning.
If macOS ever blocks it (only happens with unsigned local builds): System Settings → Privacy & Security, scroll to the bottom, Open Anyway, confirm. Or in Terminal:
xattr -dr com.apple.quarantine /Applications/Physarum.appPhysarum is free software (AGPL-3.0-or-later).
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
released this
2026-06-02 07:25:50 +00:00 | 317 commits to main since this releasePhysarum 1.5.0 — 6 new presets
✨ New built-in presets (now 25)
- Neural Lattice — three species carve interwoven neon territories (multi-species interaction matrix).
- Ember Veil — a single warm species glows into molten, branching dendrites.
- Mandala Six — a rich tangle folded into 6-fold kaleidoscopic symmetry.
- Ink Veins — dark ink veining across light paper (paint blend mode).
- Aurora Drift — cooperative species flow into soft, drifting ribbons.
- Supernova — a center-spawn burst with a hot core and chaotic tendrils.
🔬 Under the hood (experimental groundwork)
- New
apple/subsystem: a platform-agnostic native Metal port of the engine that shares the WGSL shaders 1:1 via a build-time transpiler, plus a native macOS Ambiance Viewer. Foundation for planned native tvOS/iOS/macOS apps — the shipped app is unchanged.
📦 macOS
The
.dmgis Developer ID-signed and Apple-notarised — it opens with no Gatekeeper warning. Drag Physarum to Applications.SHA-256
0eec0db1cba2c957971550215f316125e23c4ec531c948b88457b72bc82c3d84Full changelog: https://codeberg.org/jkaindl/physarum/src/branch/main/CHANGELOG.md
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
v1.4.1 — Notarized macOS app Stable
released this
2026-06-01 15:04:30 +00:00 | 331 commits to main since this releaseNotarized macOS app
The release app and
.dmgare now Developer ID-signed and Apple-notarised — Physarum opens by double-click with no Gatekeeper warning, online or offline. The old "Open Anyway" /xattrworkaround is no longer needed.macOS
build-macos-app.shruns the full sign → notarise → staple chain whenPHYSARUM_SIGN_IDENTITY/PHYSARUM_NOTARY_PROFILEare set; without them it ad-hoc signs as before (unchanged for contributors).- README,
docs/MACOS-APP.md,INSTALL.txtandSECURITY.mdupdated for macOS 15 / 26 Gatekeeper.
Requires macOS Tahoe 26+ (WebGPU). The web app runs in any WebGPU browser.
SHA-256 (
Physarum.dmg):23212ede15fb6ccb7dee737a170e14a6b301299748d59b658344176b829003e2Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
released this
2026-05-28 12:22:15 +00:00 | 334 commits to main since this releaseEmbeddable web component player
Physarum simulations can now be embedded on any website as a self-contained
web component — purely visual playback (no audio), no dependency on the editor app.<script type="module" src="https://jkaindl.codeberg.page/physarum/physarum-player.js"></script> <physarum-player preset="builtin:aurora"></physarum-player>- Four preset sources —
builtin:<id>,token:<share>(the editor's share
token),url:<href>, orjson:<inline>. - Playlists that auto-cycle on an
interval, withloop. - Minimal controls (
auto/always/none): play/pause, prev/next, fullscreen. - Off-screen pause (IntersectionObserver) and a poster fallback when
WebGPU is unavailable (built-ins use their thumbnail). - JS API —
.play() .pause() .next() .prev() .load(source)plus
physarum:ready/physarum:presetchange/physarum:errorevents. - Editor: Copy embed code action builds a ready-to-paste snippet.
- Also embeddable via iframe:
player.html?preset=builtin:aurora.
Try it: https://jkaindl.codeberg.page/physarum/player.html?preset=builtin:aurora
Full changelog: see
CHANGELOG.md.
Installing on macOS
The macOS build is not Apple-notarised (this is a hobby project).
First launch shows "Apple could not verify this app." Two-minute fix:- Click Done on the warning (NOT "Move to Trash"!).
- Apple menu -> System Settings -> Privacy & Security.
- Scroll to the bottom -> Open Anyway next to the Physarum notice
-> confirm with password / Touch ID. - Final dialog: Open Anyway once more.
The second launch is silent. If the "Open Anyway" button is missing
(newer macOS versions), in Terminal:xattr -dr com.apple.quarantine /Applications/Physarum.appBackground and walkthrough:
docs/MACOS-APP.md.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Four preset sources —
-
Physarum 1.3.0 Stable
released this
2026-05-25 15:23:50 +00:00 | 351 commits to main since this release[1.3.0] — 2026-05-25
Editor
- ParamSlider Shift / Alt modifiers + wheel + keyboard. Power-user
controls land on every slider in the editor:- Wheel over the track nudges by step. Shift = ×0.1 fine,
Alt = ×10 coarse. - Arrow keys (and Home / End) operate the slider when the track
has keyboard focus — same modifier scaling as wheel. - Drag with Shift switches to relative-incremental mode at 0.1×
the normal rate so you can dial in tenths without overshooting;
drag with Alt runs at 4× the normal rate for sweeping across
the full range from a small motion. The modifier state is captured
at pointerdown so releasing the key mid-drag doesn't snap the
value to the pointer's absolute position.
- Wheel over the track nudges by step. Shift = ×0.1 fine,
- Track is now keyboard-reachable (
tabIndex=0,role="slider",
aria-value*) for screen-reader and keyboard-only navigation.
Library
- Reorder custom presets. Each card in "My Presets" now shows up
and down arrow buttons that move it earlier or later in the library.
The arrows disable at the list boundaries and operate on the
unfiltered list (so tag and search filters don't re-target the
wrong neighbour). Order is persisted to localStorage and survives
a reload. - Re-saving an existing preset preserves its position. Before,
saveOverwrite filtered the preset out and pushed it back to the
end of "My Presets" — a small UX papercut on every iteration.
Performance
- Desktop tier agent cap raised from 200k → 500k, matching the
schema and slider caps. The engine was silently clamping past 200k
before, so values shown in the editor didn't match what the engine
rendered. On M3 the engine sustains 120 fps (p50 120.5, p95 131.6)
at 500k on both single-species (aurora-veil) and three-species
(fireworks) presets. Older M1 / M1 Air variants haven't been
verified — if framerate drops on a lower-spec Apple-Silicon machine,
drag the slider back; the FPS readout in the topbar surfaces it. npm run bench:headroomscript for reproducible frame-cadence
measurement. Headed Chromium (same WebGPU-on-headless caveat as
bake-thumbnails), readsrequestAnimationFramedirectly so it
works without enabling the FPS-display toggle. Override the preset
and agent count via env vars; seescripts/bench-headroom.ts.
Tests
- New unit tests for the slider input math (26) and custom-preset
reorder (7). Total vitest count: 92 → 125, all passing. - Fixed a long-silently-broken E2E test that was matching the old
cinema-mode hint text from before the v1.2 "Esc or click to exit"
rewording.
Installing on macOS
The macOS build is not Apple-notarised (this is a hobby project).
First launch shows "Apple could not verify this app." Two-minute fix:- Click Done on the warning (NOT "Move to Trash"!).
- Apple menu → System Settings → Privacy & Security.
- Scroll to the bottom → Open Anyway next to the Physarum notice
→ confirm with password / Touch ID. - Final dialog: Open Anyway once more.
The second launch is silent. If the "Open Anyway" button is missing
(newer macOS versions), in Terminal:xattr -dr com.apple.quarantine /Applications/Physarum.appBackground and walkthrough:
docs/MACOS-APP.md.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- ParamSlider Shift / Alt modifiers + wheel + keyboard. Power-user
-
released this
2026-05-25 11:11:15 +00:00 | 359 commits to main since this releaseEngine
- Free audio routing → 10 modulation targets. Pre-1.2 only knew
moveSpeed,turnSpeed,depositAmount. AddssensorDistance,
rhythmAmplitude,chaosStrengthon the agent side andexposure,
bloomIntensity,saturation,contraston the post side, so audio
pulses can drive visually-loud parameters and not just motion. - Blend modes. New
blendModepreset param picks how agents
compose over the background.additive(default) keeps the
historical glow-y look;paintalpha-composites agents over the bg
in display space so dark inks on a bright paper look right
(additivesaturates everything to white at high bg brightness). - Long-exposure agent-head highlight. New
headIntensityslider
(0..3) overlays a bright stamp at each agent's current position on
top of the persistent pheromone trail. Combined with highdecayRate
this gives a comet-head / long-exposure photography feel that the
trail-only renderer couldn't produce. Backed by a dedicated heads
buffer cleared every tick. - Kaleidoscope mode. New
kaleidoscopeslider (0 off, 1-6 mirror
axes) folds the composite output into N-fold rotational symmetry. - Sim-speed multiplier. New
simSpeedpreset param (1-8×) runs
multiple physics steps per rendered frame for faster pattern
evolution without dropping render rate. Trade-off: ~N× GPU load.
Editor & library
- Collapsible sections in the editor with per-section reset
buttons, so you can experiment in one area without losing edits
elsewhere. All sections except Global start collapsed. - Per-parameter help tooltips (?) on every slider / colour / select.
Renders via Portal so it's not clipped by section card boundaries. - Spawn-pattern respawn button next to the dropdown — re-seeds
agents on demand without the R hotkey. - Last-selected preset persists across page reloads (localStorage).
- Pre-baked thumbnails ship for every built-in preset
(public/preset-thumbs/<id>.png). Re-generate via
npm run bake:thumbnails. Custom presets still use the runtime
per-session snapshot. - All 19 built-in presets re-characterised — each now owns a
distinct post-processing fingerprint (bloom, feedback, vignette,
saturation, contrast). Two new paint-mode presets demonstrate the
ink-on-paper aesthetic; two new presets demo the head-highlight and
kaleidoscope features (Comet Trail, Mandala).
Bug fixes
- Slider edits no longer trigger spurious resets. The seed-respawn
effect was firing on any species-array replacement because
on([…])-form deps don't dedup at the primitive level. Wrapped each
increateMemo. Also stops the preset switch from respawning twice
(immediate + 250 ms debounced). - Background color no longer saturates the agents. Was added in
the scene shader, where the feedback loop amplified it by
1/(1-feedbackAmount)×20 at default settings. Moved to the
composite pass — bg is now applied once per frame, not accumulated. - Bloom threshold slider actually does something across its whole
range (was dead past ~0.2 because it operated on un-exposure-scaled
HDR values). Now exposure-scaled in the bright pass. - Paint blend mode visible for dark inks. Was using max-channel
brightness as alpha, so charcoal-coloured agents on white bg stayed
invisible. Now uses a colour-agnostic density channel. - Tooltip popovers no longer clipped by the editor section card's
overflow:hidden. Rendered via Portal with position:fixed. - Preset card names readable. They were inheriting the browser's
ButtonTextsystem colour on dark surfaces. - Population-share slider hidden in the All tab. Setting the same
share on all three species just normalises to 1/3 / 1/3 / 1/3
regardless of value — was effectively a "reset to equal" button.
Refactor
- Drop legacy global
attractionStrength+repulsionStrength.
Their effect is folded into the per-pair interaction matrix at
preset-load time (schema preprocess) and at source-literal level
(mk() helper) — exactly matches old behaviour, removes a redundant
knob that overlapped the matrix. - Single-source respawn coordinator (
src/ui/respawnCoordinator.ts)
funnels nonce / preset-switch / debounced-seed-edit through one
performRespawn callback, replacing three competing effects.
Tooling
npm run bake:thumbnailsruns the Playwright-based renderer that
captures preset thumbnails. Requires headed Chromium (macOS headless
Chrome doesn't expose WebGPU).?preset=<id>and?bare=1URL params for direct preset selection +
UI-overlay-free screenshot bakes.- vitest now resolves solid-js to the client (reactive) build via
resolve.conditions, so reactivity is actually testable inenv: node.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Free audio routing → 10 modulation targets. Pre-1.2 only knew
-
Physarum 1.1.0 Stable
released this
2026-05-24 20:59:42 +00:00 | 381 commits to main since this releaseCapture & sharing, audio routing overhaul, and full mobile/iOS polish.
Highlights
Capture & sharing
- PNG export, WebM/MP4 video recording, shareable preset URLs (msgpack + base64url).
Audio reactivity
- Live mic + tab-audio capture, free routing (any of 3 bands → any of 3 targets), auto-gain + manual trim, level meter in topbar and editor.
Editor & library
- Auto-respawn for seed-time params, in-place save for custom presets, editable name / signal colour / tags, real preset search, delete with confirm.
- Reset now matches preset-switch semantics (full revert + respawn).
Mobile / iOS
- iOS PWA meta tags, safe-area-insets, 100dvh, position: fixed wrapper (no more black bottom strip), tap-target tuning.
- Topbar collapses on narrow viewports; secondary actions move into a settings-menu actions section.
Bug fixes
- Sliders work from the first frame (engine now binds the live edited proxy).
- Save preset no longer chokes on the Solid store proxy (unwrap before clone).
See CHANGELOG.md for the full list.
Downloads
- macOS app — Physarum.dmg below (universal binary, ad-hoc signed)
- Web / PWA — https://jkaindl.codeberg.page/physarum/
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads