Program Updates
DeskBox
Updated Oct 8, 2026
- Cloud backup to your own server.
- Settings → Maintenance gains a WebDAV cloud-backup page with per-domain toggles for todo, quick capture, and widget style.
- The page offers a configurable interval and retention period, credentials stored in Windows Credential Manager, a "Test connection" that validates what you just typed, on-demand backups, and a browsable remote snapshot list.
- Scoped, tombstone-safe restore.
- Pick which data domains come back and choose either merge (newer entries win, nothing on this device is deleted) or a full snapshot-faithful restore.
- Deletions leave tombstones, so a merged restore can never resurrect an item you removed locally.
- Restores stage, validate, and apply on the next launch with a pre-restore safety archive pinned.
- Drag-and-drop that works everywhere.
- File drags out of widgets carry the same native Shell data object Explorer uses, so Copy-only drop targets that used to reject DeskBox — VS Code, browsers and other Chromium/Electron apps, WM_DROPFILES-era programs, WinForms — now accept them.
- Same-volume drops default to move, cross-volume to copy, Ctrl/Shift/Alt behave as expected on Windows 11, and Windows 10 keeps single-move without prompting.
- Cross-volume transfers through the system engine.
- Cross-volume moves and copies now use IFileOperation with native progress, cancellation, and conflict handling — fixing the Native AOT cross-volume import that completed with "0 items".
- Aborted transfers clean up only the objects they created.
- Hotkeys that heal themselves.
- Windows can silently strip the low-level hooks behind the global hotkey, search hotkey, or desktop double-click activation, leaving them dead until restart.
- A two-stage health watchdog now detects and re-registers them automatically.
- Idle memory trimming.
- Widgets return memory to Windows after a few seconds of true quiet — no longer only when everything is hidden — guarded by working-set floors and ambient-animation awareness.
- Controlled by the new "Trim memory when idle" performance option.
- Fluent-grade snap feedback and capsule control.
- The looping breathing glow is replaced by a crisp accent edge band that settles once and dissolves around rounded corners.
- Compact widgets gain a per-widget expansion-direction override, capsule bars reorder by dragging across monitors, and new groups default to tab navigation.
- Sharper shortcut icons, honest fixes.
- Alt-dragged shortcuts keep the target's own icon; arrow overlays render through a high-resolution compositing channel instead of pre-scaled bitmaps.
- The settings window no longer freezes on the theme it had when closed, the cloud-backup page no longer crashes on Native AOT builds, leftover folders no longer block same-named widgets, and migration rollback failures explain themselves.
Orynivo
Updated Oct 8, 2026
- A preset's border colour channels are now truncated to a byte like Milkdrop's D3DCOLOR_RGBA_01 macro instead of being clamped to zero-to-one.
- A preset such as suksma - frust computes ib_a = 1 - mytime + bass, which reaches 1.5 and is drawn by Milkdrop at 126/255; clamping it to one made Orynivo's inner border roughly twice as opaque as the reference.
- In-range values keep their exact value.
- The visualizer could still show a deactivated preset at startup: the initial selection was made against the built-ins only, and a preset deactivated after the selection (or a user file that only appeared once the folder was discovered) was not skipped.
- It now re-resolves to the first enabled preset before every switch and once discovery finishes.
- Fixed a preset texture being bound to the wrong OpenGL sampler.
- VisualizerGlPipeline resolved a shader sampler before making its texture unit active, and a lazily uploaded preset texture (sampler sampler_seaweed; in suksma - frust) bound itself to the previously active unit.
- The unused samplers are skipped, so that unit was sampler_main's, and the comp shader read the image as if it were the previous frame — the preset rendered a full-frame image field instead of its feedback.
- The unit is now selected before the texture is resolved.
- Caught the visualizer's preset handling up to MilkDrop 2 in several reference areas that were missing or wrong.
- The default waveform now applies the reference's per-mode alpha rules (mode 1 *1.25, modes 2 and 5 the resolution factor, mode 3 the resolution factor then *1.3*treble², mode 4 *0.2) and the bModWaveAlphaByVolume/fModWaveAlphaStart/fModWaveAlphaEnd modulation, plus bMaximizeWaveColor (wave_brighten), which normalises the wave colour to full brightness.
- The legacy display filters bBrighten (sqrt), bDarken (square), bSolarize and bInvert are applied after the hue tint and gamma on both the CPU and OpenGL paths, matching GenCompPShaderText.
- The reference variable names gamma, wrap, and wave_usedots are registered, so per-frame code that writes the MilkDrop spelling (gamma = 1.5;, wave_usedots = 1;) now affects the display; the fGammaAdj, bTexWrap, and bWaveDots keys alias onto them.
- Motion vectors use the reference variables: bMotionVectors/bMotionVectorsOn alias onto mv_a (the arrow alpha), and the arrows take their colour from mv_r/mv_g/mv_b.
- The recorded-field model itself remains Orynivo's documented extension.
- The generated noise textures use MilkDrop's sizes: noise_lq, noise_mq, and noise_hq are 256×256 and noise_lq_lite is 32×32 (previously noise_lq was 32 and noise_hq 512), so texsize_noise_* and every shader that scales its sampling by them agree with the reference.
- Corrected the visualizer's default-waveform explosive-hash mode and smoothing.
- The wave_smoothing variable was never registered, so a preset's fWaveSmoothing (for example suksma - frust, which sets 0.9) was ignored and the hash stayed unsmoothed, and the mode-5 alpha was not reduced by the reference's resolution factor (milkdropfs.cpp multiples it by 0.07 at 256 through 0.13 at 2048), which made the wave roughly an order of magnitude too bright.
- DrawDefaultWave now reads the smoothing from the preset defaults and applies ExplosiveHashAlphaScale.
- The default wave also draws the reference's NUM_WAVEFORM_SAMPLES count of 480 vertices instead of 512, while its buffer still keeps 512 samples for the modes that peek i + 32 ahead.
- Bound the shader sampler-size uniforms.
- MilkDrop exposes each generated texture's size as texsize_noise_lq/texsize_noise_mq/texsize_noise_hq and the volume pair, but Orynivo declared the GLSL spellings as a single float4 the scalar-only GL uniform setter could never fill, and the interpreter and compiled shader paths never seeded them at all, so a shader that reads texsize_noise_lq.zw (Royal Mashup (188) uses it for a dither coordinate) saw zero and collapsed the coordinate to a constant.
- All three paths now declare and seed the same values.
- Fixed the CPU visualizer's warp shader reading a same-generation blur chain.
- MilkDrop's BlurPasses runs after the warp and blurs the feedback the warp just sampled, and the frame buffers then swap, so the next warp's sampler_main is deliberately one frame newer than its sampler_blur1-sampler_blur3 (milkdropfs.cpp: "when sampling the blurred textures in the warp shader, they are one frame old").
- The OpenGL path replicated that, but the CPU SampleBlur chain was rebuilt from the current feedback, so a preset such as GetBlur1(uv_orig) - GetPixel(uv_orig) settled on the CPU while the reference and the GPU oscillated.
- The CPU now builds the chain once after the warp and retains it for the next warp, and the Skia warp pass binds that retained chain instead of rebuilding it, so the CPU, GPU, and a Winamp capture of the reference agree (verified with PSVERSION_WARP=2, without which Winamp silently runs its default warp).
- Corrected the MilkDrop preset variables aspectx/aspecty: the reference binds them to the inverse aspect factors (var_pf_aspectx = m_fInvAspectX, so a landscape frame is (1, width/height)), while Orynivo bound the non-inverse pair.
- Per-pixel code that multiplies its position delta by aspecty (for example Royal Mashup (13)) therefore applied the aspect correction twice.
- The shader aspect float4 keeps the reference layout (aspectX, aspectY, 1/aspectX, 1/aspectY).
- Corrected MilkDrop bDarkenCenter: Winamp draws only a small, faint centre fan, while Orynivo previously darkened almost the entire frame.
- Royal Mashup (10)'s isolated wave brightness now closely matches the Winamp capture.
- Legacy hue shading also respects fShader, so a zero value leaves colours untinted.
- Custom MilkDrop wave lines now interpolate colour and opacity between vertices, and thick custom-wave dots cover the reference's 2×2 pixels at normal texture sizes.
- The GL comparison harness can also save the raw overlay with GLH_DUMP_OVERLAY=1 to separate waveform drawing from feedback and composite differences.
- Corrected MilkDrop's lum helper to the reference's include.fx weights, dot(x, float3(0.32, 0.49, 0.29)), instead of the conventional Rec. 601 luma the interpreter and both emitters used.
- A composite shader that derives its blur gradient through lum (for example Royal Mashup (13)) sampled the wrong value.
- Separated the MilkDrop per-frame and per-pixel variable storage.
- A preset's per-pixel block now writes to its own slot array, seeded from the per-frame state each frame, instead of the per-frame array, matching the reference's separate m_pf_eel/m_pv_eel variable universes.
- In Royal Mashup (13) the per-pixel vortex points x1/y1/x2/y2 previously overwrote the per-frame spring state, so the spring (q4/q5/q8) diverged from Winamp.
- Corrected the comp shader's rad/ang on the CPU interpreter path to MilkDrop's UvToMathSpace (aspect scaled, rad one at the screen corners, ang wrapped to 0..2π).
- The interpreter previously disagreed with the GPU emitter, so a comp shader such as Royal Mashup (13) that derives its picture from them rendered differently on the two paths.
- CompShaderPolarTests pins the interpreter convention.
- Preset expression variables now use double like ns-eel2's EEL_F, so long-running feedback keeps the reference's numeric precision instead of accumulating float rounding.
- Corrected MilkDrop's border bands.
- The outer and inner rings now use the preset's ob_size and ib_size (default 0.01) as clip-space Chebyshev rings, [1 - ob_size, 1] and [1 - ob_size - ib_size, 1 - ob_size], consistently on the CPU, Skia, and OpenGL paths.
- Both rings previously used fixed values (0.02 thick at insets 0 and 0.06) and ignored the preset keys, so a preset whose border feeds the feedback (for example Royal Mashup (13)) rendered too dark.
- Moved the custom MilkDrop waveforms onto the GPU.
- The CPU rasterized every line segment and thick offset per pixel, which cost roughly 250 ms per frame for a 512-sample wave at 1920x1080 — a few frames per second for a preset such as Royal Mashup (180).
- PresetRenderer now expands the smoothed polyline into triangles (WaveGeometry) instead of drawing it, and VisualizerGlPipeline draws those triangles with the same premultiplied "over"/additive blend the shape fills use.
- The CPU overlay for such a preset drops to a few milliseconds and no longer scales with the render resolution; a preset whose overlay program is unavailable still rasterizes on the CPU.
- Added MilkDrop's _qa.._qh q-variable banks and vol_att.
- include.fx packs q1..q32 into the float4 banks _qa.._qh; a shader that uses a bank as a vector (for example float2x2(_qb) in Royal Mashup (151)) rendered white because the unknown name became a zero scalar, so mus = 0.01/(sqrt(0) + 0.001) exploded.
- The banks now reach the GLSL, SkSL, and interpreter paths, and vol_att is bound as the attenuated overall level.
- A scan of a 10,353-preset collection found the banks used by about 600 presets and vol_att by 206.
- Fixed the visualizer's reported frame timing.
- A warp shader's cost was added to the shader stage even though it already runs inside the warp stage, so the sum of the stages could exceed the measured frame and RenderTimingDiagnosticTests failed.
- The shader stage now reports only the comp pass, matching its documented meaning.
- Fixed a GLSL compile failure for a preset that declares its own texture.
- A shader such as Royal Mashup (142), which writes sampler sampler_cells;, emitted uniform shader sampler_cells; on both back ends, but GLSL spells a sampler sampler2D and rejected the whole warp shader.
- The declaration now follows the dialect, so the shader compiles; the unknown texture falls back to the previous feedback it already did on the SkSL path.
- Corrected the vertical texture coordinate of MilkDrop's textured shapes.
- The reference (milkdropfs.cpp, marked "DON'T TOUCH!") uses 0.5 + 0.5 * sin(angle + tex_ang + pi/4), while Orynivo negated the sine and therefore sampled the captured frame mirrored; the frames are top-down like the reference's capture, so the OpenGL fragment stage's single bottom-up flip is the only one needed.
- PresetShapeTests.RenderFrame_TexturedShapeUsesTheReferenceTextureCoordinate pins the sign.
- Corrected the CPU blur chain's pass count.
- Each level is one long horizontal and one short vertical pass from its downscaled source; the reference advances the level only every second pass (fscale_now = fscale[i/2]), but Orynivo's interpreter ran N pairs for level N.
- Levels two and three were therefore over-blurred on the CPU while the OpenGL chain built the correct one pair, so a comp shader sampling GetBlur2/GetBlur3 rendered differently on the two paths.
- A preset whose per-pixel block writes the sample position now runs its warp on the GPU without also costing the CPU the full warp and comp passes.
- PrepareMeshForGpu refused to build a mesh for such a block, so the expressions-only renderer never took its early return and computed the complete frame while the presenter drew the GPU pipeline as well - the same work twice.
- It now builds the mesh for MeshForPixelWarp, whose fragment shader needs only the mesh's motion values, so the CPU stops at the overlay.
- Measured on $$$ Royal - Mashup (13): about 500 ms per frame before, with warpMs 310 and compShaderMs 159 on the CPU.
Stemdeck
Updated Oct 8, 2026
- StemDeck now has a built-in self-explanation feature — a fresh Guide button turns the studio into an interactive manual, the Trash is more visible and simpler to operate, and a song you remove while it separates now truly halts.
- All four fixes in this version came from @wastedbits, described thoroughly — thank you.
- Guide: a new button appears in the left rail under Trash — click it and every element it can describe briefly lights up so you know where to aim.
- Point at any control in the studio: a ring highlights it and a nearby box explains its purpose in simple language.
- Every button, lane control and setting is included, each value in the song facts row is described, and Settings breaks down all options tab by tab.
- Guide also works before a song is opened.
- While Guide is active, clicking explains rather than performs, so you can browse without launching an extraction or altering a song.
- Press Esc or click Guide again to return to normal behavior.
- Trash: the icon now displays a count of how many songs it holds, just like the Queue.
- Removed songs remain on disk until you empty the Trash, and the number serves as a reminder they are still there.
- Hold to restore: aim at a song in the Trash and its second line tells you how — hold the left mouse button for one second.
- A fill moves across the row to show the hold, and releasing too early does nothing.
- Multiple selection: click a song to select it, Ctrl+click to add or drop one, Shift+click to grab a range.
- Holding any selected song restores all of them.
- Clicking a song in the Trash now selects it instead of opening it in the studio.
- Deleting a song mid-extraction: it stops — moving a song to the Trash while it is being separated now halts the process and frees the queue for the next song.
- Previously it kept running, and after a restart it could resume on its own.
- Nothing is lost: the song waits in the Trash marked as Stopped, along with its files.
- Restore it and it returns to the library, still stopped, with an Extract button to run it again whenever you want.
- Its files are only removed when you empty the Trash.
- Two related edge cases are also fixed: a song cancelled in its final seconds no longer completes anyway, and on Windows a cancelled import no longer leaves its folder behind when a file is briefly locked.
Komicove
Updated Oct 8, 2026
- New "Use brightness from preferences" mode that applies the manually configured level in Komicove.
- New "Use system brightness" mode that respects the device's brightness configuration.
- The chosen mode and manual level are saved and restored when the app is opened.
- The manual control appears visually disabled when system brightness is selected.
- Switching the brightness mode does not affect the reader's other preferences.
- On Android, canceling the preview correctly restores the saved configuration.
- Interface available in Portuguese and English.
- The updater now recognizes versions with four numbers, such as 0.2.1.1.