• v2.3.0 c03434af04

    jkaindl released this 2026-06-22 07:38:58 +00:00 | 7 commits to main since this release

    Accessibility + 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-store export/archive script, and submission docs under docs/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.dmg below (macOS 14+, opens without a Gatekeeper warning). iPhone, iPad & Apple TV are heading to the App Store.

    Downloads
  • v2.2.0 bf70584c78

    jkaindl released this 2026-06-20 12:04:51 +00:00 | 59 commits to main since this release

    A 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 granted allow="fullscreen"); the documented iframe snippets now include that grant.

    macOS download — Physarum.dmg

    macOS 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
  • v2.1.0 454df800a7

    jkaindl released this 2026-06-19 19:32:18 +00:00 | 65 commits to main since this release

    Native 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.dmg

    macOS 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:

    1. Click Done (not "Move to Trash").
    2. Apple menu ▸ System Settings ▸ Privacy & Security.
    3. 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
  • v2.0.0 06be051d68

    jkaindl released this 2026-06-15 20:29:36 +00:00 | 126 commits to main since this release

    Physarum 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

    1. Open Physarum.dmg and drag Physarum onto Applications.
    2. 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.app
    

    Physarum is free software (AGPL-3.0-or-later).

    Downloads
  • v1.5.0 3a666f5425

    jkaindl released this 2026-06-02 07:25:50 +00:00 | 317 commits to main since this release

    Physarum 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 .dmg is Developer ID-signed and Apple-notarised — it opens with no Gatekeeper warning. Drag Physarum to Applications.

    SHA-256 0eec0db1cba2c957971550215f316125e23c4ec531c948b88457b72bc82c3d84

    Full changelog: https://codeberg.org/jkaindl/physarum/src/branch/main/CHANGELOG.md

    Downloads
  • v1.4.1 f791ca0376

    jkaindl released this 2026-06-01 15:04:30 +00:00 | 331 commits to main since this release

    Notarized macOS app

    The release app and .dmg are now Developer ID-signed and Apple-notarised — Physarum opens by double-click with no Gatekeeper warning, online or offline. The old "Open Anyway" / xattr workaround is no longer needed.

    macOS

    • build-macos-app.sh runs the full sign → notarise → staple chain when PHYSARUM_SIGN_IDENTITY / PHYSARUM_NOTARY_PROFILE are set; without them it ad-hoc signs as before (unchanged for contributors).
    • README, docs/MACOS-APP.md, INSTALL.txt and SECURITY.md updated for macOS 15 / 26 Gatekeeper.

    Requires macOS Tahoe 26+ (WebGPU). The web app runs in any WebGPU browser.


    SHA-256 (Physarum.dmg): 23212ede15fb6ccb7dee737a170e14a6b301299748d59b658344176b829003e2

    Downloads
  • v1.4.0 291ed9c57e

    jkaindl released this 2026-05-28 12:22:15 +00:00 | 334 commits to main since this release

    Embeddable 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 sourcesbuiltin:<id>, token:<share> (the editor's share
      token), url:<href>, or json:<inline>.
    • Playlists that auto-cycle on an interval, with loop.
    • 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:error events.
    • 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:

    1. Click Done on the warning (NOT "Move to Trash"!).
    2. Apple menu -> System Settings -> Privacy & Security.
    3. Scroll to the bottom -> Open Anyway next to the Physarum notice
      -> confirm with password / Touch ID.
    4. 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.app
    

    Background and walkthrough: docs/MACOS-APP.md.

    Downloads
  • v1.3.0 067de506d0

    jkaindl 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.
    • 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:headroom script for reproducible frame-cadence
      measurement. Headed Chromium (same WebGPU-on-headless caveat as
      bake-thumbnails), reads requestAnimationFrame directly so it
      works without enabling the FPS-display toggle. Override the preset
      and agent count via env vars; see scripts/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:

    1. Click Done on the warning (NOT "Move to Trash"!).
    2. Apple menu → System SettingsPrivacy & Security.
    3. Scroll to the bottom → Open Anyway next to the Physarum notice
      → confirm with password / Touch ID.
    4. 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.app
    

    Background and walkthrough: docs/MACOS-APP.md.

    Downloads
  • v1.2.0 299fc592bb

    jkaindl released this 2026-05-25 11:11:15 +00:00 | 359 commits to main since this release

    Engine

    • Free audio routing → 10 modulation targets. Pre-1.2 only knew
      moveSpeed, turnSpeed, depositAmount. Adds sensorDistance,
      rhythmAmplitude, chaosStrength on the agent side and exposure,
      bloomIntensity, saturation, contrast on the post side, so audio
      pulses can drive visually-loud parameters and not just motion.
    • Blend modes. New blendMode preset param picks how agents
      compose over the background. additive (default) keeps the
      historical glow-y look; paint alpha-composites agents over the bg
      in display space so dark inks on a bright paper look right
      (additive saturates everything to white at high bg brightness).
    • Long-exposure agent-head highlight. New headIntensity slider
      (0..3) overlays a bright stamp at each agent's current position on
      top of the persistent pheromone trail. Combined with high decayRate
      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 kaleidoscope slider (0 off, 1-6 mirror
      axes) folds the composite output into N-fold rotational symmetry.
    • Sim-speed multiplier. New simSpeed preset 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
      in createMemo. 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
      ButtonText system 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:thumbnails runs the Playwright-based renderer that
      captures preset thumbnails. Requires headed Chromium (macOS headless
      Chrome doesn't expose WebGPU).
    • ?preset=<id> and ?bare=1 URL 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 in env: node.
    Downloads
  • v1.1.0 dae5239759

    jkaindl released this 2026-05-24 20:59:42 +00:00 | 381 commits to main since this release

    Capture & 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

    Downloads