You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
scenes: Electric Bloom rebuilt as a three-layer glowing garden (D277) (510aa24)
scenes: rebuild Chromatic Rise as a feedback-advected, posterised marbling (D276) (59fc280)
add scoped desktop-to-desktop remote control (20fc9ef)
corpus: --show-window renders in a shown tiny window, for AMD's native WGL (2f2093e)
add Chromatic Rise psychedelic marbling scene (a56f864)
app: --output-monitor N and --fullscreen put the output on the projector at launch (b731fde)
ui: side panel status strip and icon tabs, help bar, panel at 31%, banners that cannot overflow (41b425b)
ui: Synesthesia-style shell: rail-switched main view, library grid, persistent side panel (5b61c8b)
app: Synesthesia's scenes join the library where it is installed, and its own are never written (D271) (49f3714)
scene: one place finds Synesthesia's install and scene folders, and #include uses it (D271) (ee1f47f)
Fixed
keep a relative trust-file path as the whole path it named (89780dc)
move a remote whose system-chosen address went away to the new one (0a70ffe)
withdraw a remote command answered busy instead of running it later (1df81af)
a refused command line exits 2, not the 1 of a fault (D454) (32a28be)
a render-scale change keeps the warming and outgoing scenes' pictures (D440) (c206984)
a playlist that does not load at launch leaves a scene playing (D452) (5f858e2)
an --output-monitor that is not connected at launch is waited for (D451) (de65374)
a fullscreen launch puts no crash or stop box over its show (D450) (91a3072)
an atomic write syncs its temporary file before the rename (D438) (f65ea18)
an anchored show waiting for its time follows the wall clock (D437) (e7caa66)
Hold is refused until a cue is playing (D436) (78bdc8d)
a save that changes nothing the show plays is not a reload (D435) (80d4f71)
a hold survives a reload or an edit of the playlist (D433) (bce7306)
an edit above the live cue no longer moves the show to another cue (D432) (f6a7202)
a held cue is not moved on by an audio event (D431) (bf56e9a)
an anchored show is placed in the run nearest now across midnight (D430) (c77ad3b)
a GL driver message repeated every frame is summarised once a minute (D422) (0a82f75)
a MIDI fader flood keeps its latest value and cannot crowd out a note (D421) (10f669c)
an audio stream that stops calling back without an error is noticed and reopened (D420) (c17c6e7)
say why the lexical callback lookup throws its exception away (D267, D414) (64f838f)
a code-paired desktop takes back its own lease from a dead connection (25e3999)
a Shadertoy re-import never replaces a folder that is not an import of the same shader (D418) (92d577b)
a desktop capture over the JPEG limit is sent smaller, not dropped (eb241d5)
a Shadertoy texture's file name never collides with a generated file or another URL (D417) (8e2bf60)
a Shadertoy export saved as UTF-16 with a byte-order mark imports (D416) (b39cb71)
a Shadertoy global initialised from iChannelTime or iChannelResolution sees its value (D415) (ef8028e)
a remote Ctrl+click leaves no Ctrl held in the host's UI (80d916b)
event callbacks declared with let or const fire, and a function may be passed itself (D414) (de57140)
a desktop viewer squeezed to no width sends no NaN to the host (3044cb2)
a script's unhandled promise rejection is a console error, once per reason (D413) (2cfb5e4)
the palette's highlight stays on its entry when the list is rebuilt (576acd3)
a dropdown with mismatched lists and an untyped vec3 control keep their scene (D412) (40234ce)
a crowded frame never drops a macro key's release (3ebab54)
only the samplers a pass reads take texture units (D411) (9f0af44)
a control window that loses focus lets go of its held macro keys (5d9234e)
a pass past the texture limit is refused by name, and a relative one is clamped (D410) (0862236)
the output's monitor is followed by what it is, not its place in the list (57f2add)
a playlist's show time counts in f64, so its synthetic beat keeps pace (e3eccdc)
the scene clock counts in f64, so TIME keeps real time hours in (1cfd28c)
format a context value before taking the facts lock (a326870)
speed and traveler controls integrate in f64, so they keep their pace hours in (55040f8)
report once when the crash monitor dies during a show (604ae7a)
prune session logs by modification time, not by file name (95a940a)
keep only the newest twenty crash reports and minidumps (991de58)
give the crash monitor's system probe a ten-second budget (b3ef10d)
a macro counter at u32::MAX no longer overflows on add (D376) (2654061)
an OSC double beyond the f32 range is clamped, not infinite (D375) (dc7b880)
the OSC listener binds again after a socket error (D374) (8d0a789)
strobe-io builds clean with the midi feature off, and CI checks it (50c6ef8)
a non-Unicode argument no longer kills the app before logging starts (da6a65f)
cargo xtask symbolicate finds a dump given relative to where it was run (22ec132)
a failure that keeps coming back no longer pushes the others out (D381) (59141af)
a session log stops growing at 64 MiB (D380) (6b16957)
an unattended run's crash monitor raises no message box (f3a5b11)
the crash monitor lets the crashed app die before its notice (f76de82)
the synthetic track's clocks glide instead of jumping on every beat, hours into a show (D330) (3e88c07)
a fader whose range cannot reach its control picks it up at the nearest end instead of never (D373) (a7d4505)
a MIDI device that is unplugged or switched off lets go of the pads it was holding (D372) (faf8b7f)
/strobe/fav/0 and a mapping to fav slot or cue 0 no longer recall slot 1 or cue 1 (cbd2560)
a fader moved while its control was missing from the scene no longer jumps the control when it returns (53dbcf5)
unplugging one of two identical MIDI controllers no longer silences the other (af2d75f)
a program change or OSC trigger mapped to a command fires every time, not only the first (D371) (87acc56)
OSC datagrams with deeply nested arrays are refused instead of overflowing the listener's stack (D370) (61ec6ad)
a browser-listener import no longer ends the Import panel's own import early or leaves a Replace prompt in the app (31e852b)
a fav slot with no preset recalled on the playing scene restores its starting look and clears the active preset (dac49c8)
STROBE_REDUCED_MOTION no longer saves reduced motion into ui.toml as the operator's own choice (522bc17)
an unreadable ui.toml is kept as ui.toml.bak instead of being written over with the defaults (D352) (53a3cef)
saving ui.toml or show-control.json never renames another Strobe's half-written temporary file (4aef115)
an input chosen while capture is still opening is no longer ignored (8ee2f52)
--audio ambient's clocks glide instead of jumping on every beat (fbe8c80)
a Shadertoy global initialised from iResolution or iTime sees its value (D361) (8376fe9)
keys pressed over the output window keep their modifiers, so Shift+Right skips the section and Ctrl+B does not black out (D351) (412f1c9)
a key capture whose field is closed gives the keyboard back instead of leaving every shortcut dead (D350) (3346eb6)
a macro key let go while a text field or the palette has focus lets its macro go (41fe3a4)
a rewritten import token file is made owner-only on Unix (167308a)
a Shadertoy helper named like an SSF library function compiles (D360) (44b64aa)
a very long shader id no longer makes a folder name too long to write (76834e7)
a shader titled like a Windows device gets a folder Windows can make (edb67a3)
a device reopened at another sample rate keeps the clocks and tapped tempo (11ddc14)
an API key file saved by Notepad with a byte-order mark is read (d0d40e3)
a Shadertoy export saved with a byte-order mark imports (4c19d30)
a shader's title, author or tab name cannot break its generated comment lines (c041a33)
the spectrum and waveform fall silent when the input stalls (a313277)
a microphone's DC offset no longer reads as bass that never stops (31e395a)
copying the live audio frame no longer allocates on every render frame (2cc9d74)
a script's throw undefined is reported as what it threw, not as out of memory (c18a9e3)
setup and update declared with a top-level let or const run instead of being silently ignored (D326) (6198199)
a script fault that keeps coming back is logged and reported once, not thirty times a second (D325) (40ff39e)
setControl and setUniform read at most one component past what they take from an array (7af762c)
a script's load-time frame runs under the load budget, so a slow first update still declares its uniforms (D324) (288e932)
a scene cued again starts its script over, not from its last cue's state (D323) (1b601c6)
a script number past f32::MAX reaches the shader as zero, not infinity (80ad935)
a script's promise callbacks run at the end of the frame that queued them (D322) (c6dbae5)
a script's runaway recursion throws instead of overflowing a 1 MiB thread (D321) (a44afd9)
a stall does not step a settled scale; put-off verdicts and lock expiry are logged (D320) (031d5d0)
a settled scale steps again only when recent misses average 1.5 times the drop line (D319) (f8ea5cd)
the late lock expires with backoff, and a verdict on disturbed windows is put off (D318) (3cba150)
after a late step pays, the load line no longer gates the next one (D317) (b5fb2cf)
a late step pays when it cuts the missed refreshes by a fifth and by 5 points (D316) (b403e2e)
a late drop that does not cut the missed refreshes is undone, and the covered control window runs only its chores (D315) (d5378a8)
a minimised control window draws nothing but still loads, acts and compiles (D314) (83a4d1b)
a scene file that is not UTF-8 loads instead of failing the scene (2c48e0b)
a rebuilt GL context keeps the operator's meta settings (323555d)
refuse a control named after a GLSL keyword or an SSF library name (4d2a198)
one value that is not a number no longer loses a whole preset (7570e62)
a byte-order mark no longer fails a scene, shader, include or preset (8502269)
scenes: acid mirror keeps its noise in the feedback pass (D310) (f1dbff6)
scenes: electric bloom draws every layer at full size again (D310) (12831be)
gfx: prime every GL context with one 16x16 draw, so AMD WGL stops dropping large draws (D311) (94cf8e6)
app: the desktop viewer redraws for a new image or input, not at 30 Hz (6fb033a)
app: a covered host window streams at 5 Hz, not every 400 ms (6f8a95c)
app: a fast mouse no longer ends a desktop remote session (3799cc0)
remote: a session ends once its client is no longer paired (ec438a2)
remote: pointer moves no longer fill the host's input queue (4297f51)
remote: stopping never waits on a wake-up connection (7b183e5)
spell out pow on GLSL ES so a negative base is NaN as on native GL (D301) (1fde3b8)
show: a slow scene no longer stretches its cue past real time (D299) (97b2d20)
show: an unpainted control window alone does not make an output close quit (9965bf2)
app: the reconnect card states the real wait and attempt (7fcfb17)
app: a pure controller does not log a missing library as an error (7fb6939)
audio: log the forced audio source once, where the choice is final (992372b)
show: a dropdown override past its options is refused, not clamped (87e52a7)
show: a show that ends a second time clears its resume point again (b976057)
playlist: an anchored show that crosses midnight picks up after midnight (f3c119a)
show: saving the playlist no longer restarts the live scene (15476bd)
show: the cue log names the loop pass as such (26e3dce)
show: a render size that failed to allocate is retried every 5 s, reported once (3cfc797)
show: a pinned scene in a playlist gets the mouse in its own pixels (9fadaf3)
show: closing the output quits when the control window is out of reach (D298) (fca485e)
show: a jump into a warming scene gets its own cue's settings (a5b6d89)
show: a scene cued again starts with its passes cleared (D297) (6055d35)
gfx: an offscreen window reports the size it was given, not the size asked (20edd15)
bench: --probe reads a float target through an RGBA8 copy on GLES (9e4e1a5)
a trust file that cannot be read brings up the form instead of failing silently (5b1dac6)
a trusted controller restarts its backoff only after a frame, not on pairing (102f796)
gfx: upload texture rows tightly packed, not at GL's 4-byte alignment (971b694)
scene: run global initializers in main on desktop too, so sprinkles is not black (0037fcf)
app: keep the output's swap wait while the loop drives the control window (c812236)
app: run the control frame from the event loop when Windows withholds its paints (e96573b)
app: do not print a laptop command that does not exist yet (92f4965)
remote: bind a trust proof to the address the connection reached (dd8c2f5)
app: compile the playlist from output frames when the control window stops painting (fca44a5)
app: compile the playlist from output frames when the control window stops painting (4460897)
gfx: restart a kept pass that a restarted pass reads (96aeeeb)
gfx: keep the passes a resize does not change (a5cd1fd)
ui: scroll the connect form's address field into view in small windows (9b75aa0)
app: close the desktop viewer's socket when its worker ends (5ae8fcf)
ui: make the desktop viewer keep its image, time out, and be findable (7e2125a)
remote: count only authenticated clients as connected (610a9ca)
scenes: Neon Ribbon Flow is more saturated and has no reversed smoothstep (D278) (0339fe1)
scenes: Electric Bloom's petal tips lose their black dots, and the scene is 9% cheaper (D277) (dbf43b2)
scenes: Chromatic Rise loses its row artifact and gains long drags, an acid palette and a clock (D276) (db06bec)
app: keep remote desktop input from widening access or stalling the show (b7b311a)
remote: end a full desktop grant with its switch, and show who holds the controls (48f8b39)
update rustls for current security advisories (0f28d44)
gfx: adaptive resolution judges a drop on settled frames and locks only after two strikes, for a while (D280) (9af6f34)
scene: pin the final pass only when the shader texel-fetches a root-sized pass (D280) (698b3d8)
app: the load log names the size a pinned scene really draws at (D280) (f6c554e)
gfx: a scene with root-sized literal passes renders its final pass at that size, and adaptive resolution stops cutting what costs nothing (D280) (a5338b5)
ui: fav slots in reach from every tab, and a short drawer gives the preview up before the controls (e0125aa)
ui: the side panel follows the window by a flag, not a 440 sentinel, and a version-1 ui.toml drops the old inspector width (8eb0c3c)
bench: a run whose every frame is black fails instead of reporting timings (dd371ee)
app: no error box nobody can see: unattended runs and service sessions only log (81e7fbf)
app: a screenshot run ends when the control window never draws (e033f71)
Performance
show the paired list without waiting for a save to reach the disk (95f11da)
a warm-up the show no longer needs is parked at once (D434) (11a9105)
the LAN address shown to the operator is cached and refreshed every 10 seconds (D341) (7447859)
a script frame allocates nothing of its own, and uniforms are bound once at the seal (D340) (4f263af)
scenes: acid mirror evaluates its broad noise at reduced size (2ae8956)
scenes: electric bloom draws its soft back and front layers at half size (b452e56)
scenes: chromatic rise evaluates its broad noise at a quarter size (4580a46)
scenes: bloom orbs draws its lights at half size (7b9ba9c)
scenes: domain warp evaluates its inner warp fields at a third of the size (9eeb9bf)
scenes: voronoi glass rejects cells by distance before hashing them (9c31b06)
ui: library cards borrow their name, folder and byline instead of copying them each frame (30f10f9)
Changed
rustfmt the start-up sweep's app changes (D451-D453) (e604eed)
say why the session log cap's closing writes are discarded (D267) (5e03e9a)
Documentation
bring the docs up to date with the UI rework, approve-only pairing and ANGLE's backends (f0cedde)
record the native file pickers as checked on Windows (5240789)
show the reworked Library view in the README (c889e81)
record the remote and venue-mode bug sweep in the roadmap and audit (ef06297)