Repository navigation
Releases: mnsky-tyan/mnpaper
Release list
v2.7.28
Linux (Wayland) port.
A full codebase audit of linux/ (2026-10-28), fixed:
- Documentation now matches the code: the scale-invariance test is
described as it really is (six scales including the fractional ones,
sampled at shared logical points, 1-level alpha tolerance), the
PAPER_MAG_SCALE history distinguishes the old 2.9 from the current 2.3f,
a nonexistent IPC command was removed from the protocol list, the tray
icon section describes the generated six-size icon_tables.h instead of
the retired 24x24 table, and the cleanup recipe no longer checks for a
/dev/shm object that is unlinked at open. - The tray wire tests now reach every row they used to skip: the Warmth
submenu is drilled and clicked (first and last rows, checkmark push
asserted moving both ways), Start at login, Edit settings file... and
Quit are clicked with counting callbacks, and Scroll is driven end to
end (preset stepping, clamping at both ends without re-firing, and a
custom value snapping into the ladder). A wiring regression in any of
those used to pass the whole suite silently. - The config round-trip test is total: write, parse, re-write, byte
comparison, plus a scan that every one of the 15 keys is present and
seeded away from its default. - CompositeOver existed in three copies (Linux daemon, Windows daemon,
tests); the Linux side now shares one copy in paper_core.h and the
Windows twin keeps a byte-identical copy with a keep-identical note.
No behaviour change: the daemon binary is identical in behaviour to
2.7.27; this release lands the audit's documentation and test hardening.
Asset sha256: 54b9d50deda263e04eebe029ab5254167c0da22e7cf927f54d01e32ed8c1b205
v2.7.27
Linux (Wayland) port.
- A settings change always lands on the first try. When a bake finished
while the surface was briefly showing something else (a resize or a
toggle whose commit was skipped for a buffer still owned by the
compositor), the generation was stamped but the new pixels were never
committed - and the stamp is exactly what tells the queue "this paper is
ready", so every following change was a silent no-op until you cycled
Show paper off and on. The commit now always follows the stamp. This is
the second symptom you reported: "the effect needs untick and tick
before the config change actually lands". - The boot race survives slow compositors. The autostart wait was 20 s and
a real boot on 2026-10-24 outlived it: the autostart instance gave up
with "cannot connect to a Wayland compositor", so the paper you had left
ticked appeared off after reboot, and only Plasma's session-restore
second start brought anything up. The wait is now 60 s and logs its
progress every 10 s. - The log can now answer questions like these: every line carries a
wall-clock timestamp, every Show-paper transition logs the direction and
its source (tray menu,--toggle,--on,--off), every IPC command is
recorded, and every texture regeneration logs the five values it baked.
Asset sha256: b4dcfd300f4aff99ab873a419f4bf811201cabc8e5441cb128b383786b3af6d3
v2.7.26
Linux (Wayland) port.
- The fibre and blotch sliders no longer repaint the paper's pattern. They
used to re-weight the mix that decides which patches are warm highlights
and which are shadows, so adjacent steps moved under 2% of pixels while
the top of the dial re-decided a tenth of the screen across the
highlight/shadow line (22% with both sliders swept end to end). The
result was a control that sometimes did nothing and sometimes produced a
different paper, which read as "same settings, different output". - The pattern now belongs to the grain field alone. Fibre lays in paper
strands and blotch in uneven patches as pure alpha overlays, warmth only
tints. Every ten-step of fibre is now linear and even - 37-58% of pixels
per step at default strength - and no step flips a single pixel between
the highlight and shadow families. fibre=0 is a strand-free paper with no
ghost structure left behind. - PAPER_MAG_SCALE refit 2.9 -> 2.3 for the single-field distribution
(measured mean 0.216, sd 0.152, max 0.895; scale = 1/(3 sigma)), which
preserves the calibration the user accepted in 2.7.23: median veil alpha
38 at intensity 30, p99 68. - Tests:
TestStrengthSlidersDoNotRepaintPatternpins the guarantee in
both suites - the un-premultiplied colour of every pixel is identical at
fibre/blotch 0 and 100. Verified to fail against the old engine: 10.3%
of pixels flipped. The Windows warmth floor drops 8 -> 6 with the
measurement recorded, because the swing now measures warm -11 / cool +7
and the old floor was set with zero margin on the number it measured.
The render itself was never nondeterministic: the real state machine
converges to byte-identical pixels from any settings history, and the same
settings keep rendering the same paper.
Asset sha256: acc5f0f028957dabb5c18499bf52b68605b7cd2f0f644f2ce10063732a1699e1
v2.7.25
Linux (Wayland) port.
- The tray icon is crisp now. It was served as a single 24x24 pixmap, and
this display runs at compositor scale 2, so the panel smoothed it into
48 device pixels every frame.IconPixmapis an array precisely so the
shell can pick a size at its own scale: the tray now serves 16, 24, 32,
48, 64 and 128, so a scale-2 panel gets a native 48. - The icon is the brand card, not the full square board: cropped to the
card's outer stroke, square-fitted with transparent padding, and clipped
to the shared corner radius r = 43/277 of the icon edge (~15.5%) with a
4x4 supersampled alpha mask. Only alpha outside the card changes; no
pixel inside it is altered. mnPaper.icocomes from the same generator, so every size the two share
is the same pixels; each .ico entry is verified byte-identical to its
per-size render.- The radius is written down once for all mn projects in
mnbrand/docs/icon-corner-radius.md, and each app's switch instructions
point at it, so future icon work in any of them uses the same corner. - Tests:
tests/test_tray.cnow drives the real property on the wire and
pins six square entries with wh4 bytes, transparent corners and solid
centres - verified to fail against the old single-size icon.
Asset sha256: 3f980138d8c6d3769f7a29d9b56772b82bb92ed752b4652560957caf53485801
v2.7.24
Linux (Wayland) port.
- The paper texture is now a property of the screen, not of the pixel
buffer. The port had dropped the Windows build's coordinate scale, so
PaperPixelsampled raw device pixels while the noise lattice periods
were derived from the device-pixel buffer width.BufferGeometrypicks
that width from whichever scale the compositor last reported, so the
same 1800-logical panel was a 2880px buffer under fractional 1.6 and a
3600px buffer at integer 2 - the same screen, completely different
paper. Measured over the same logical surface: 96.14% of alphas differed
by more than one level, max drift 111. - The settings path itself was never order dependent: four different
orders of the same five settings already produced byte-identical pixels,
so what looked like "the same config behaves differently depending on
the order I set it" was the buffer width varying between bakes. - Restored the
fscontract in both engine copies.PaperParamstakes
the sampling width and the scale,PaperPixeldivides the coordinate by
it, andBuildPaperFulltakes it explicitly so a caller that forgets it
cannot silently get the old behaviour. A bake is now also only accepted
when the scale it was built at still matches the output's. - Test:
TestTextureIsScaleInvariantrenders one logical surface at 1.0,
2.0, 3.0, 1.25, 1.5 and 1.6 and requires pixel-identical output, sampled
at the logical points both grids hold exactly. Verified to fail against
the pre-fix engine (56277 pixels moved at 2.0x). - After the fix the same logical surface is pixel-identical at every
scale: 0 of 810000 pixels differ.
Asset sha256: 10f9093e9d4b742399b66a2d9395234963e32242b3cbfb3af634f942273512da
v2.7.23
Linux (Wayland) port.
- App icon switched to the mn-brand mnPaper artwork.
mnPaper.icois
regenerated from the 2048x2048 vector render, keeping the same seven
sizes (16, 24, 32, 48, 64, 128, 256). The Linux tray icon is the same
artwork downscaled to 24x24 and baked intotray.cas a pixel table, so
it still ships no binary asset; it is byte-identical to the 24x24 entry
of the .ico. - Texture settings now visibly change the screen. The paper's modulation
was a folded deviation of a normalised average of three fbm fields
(measured mean 0.158, so only ~4.7 of a nominal 30 alpha levels were
delivered), a flat colourless veil carried 56% of the median alpha, and
every colour was premultiplied down to a ~7% pixel change. The engine
now normalises that deviation, lets texture rather than bias carry the
veil, moves highlights below a white page, and computes the fibre and
blotch gains in float. At the default intensity the median alpha goes
from 7% to 15% and the peak from 18% to 29%; warmth now moves 35.6% of
pixels by two or more levels instead of 0.9%. - Tests assert the composite, not the plumbing: each control must move at
least 15% of pixels by two levels on a light, mid and dark background,
measured through the real bakers. - The engine generator is duplicated on purpose (
linux/paper_core.hand
mnPaper.c); both copies carry the identical change.
The artwork is a source-derived candidate, not a pixel-identical copy of
the originally supplied brand board, and mnpaper's stronger green wash is
kept as requested.
Asset sha256: 9b087ba48c63b89a7fc7f8f65959f7474f8ffea4458c6b259e66089a7b047ffe
v2.7.22 - the paper reaches the screen edge
Linux (Wayland) port.
- The paper now covers the bottom of the screen by default:
panelgapdefault 96 -> 0. 96 logical pixels was reserved for a floating panel, but an auto-hiding panel reserves no space and is usually not on screen, so the default painted an uncovered band ~8.5% tall. Existing configs migrate once (cfgver=2): a pre-v2 file holding exactly the old default 96 becomes 0, and any other value is treated as a deliberate choice and kept. - The tray menu now carries Grain, Fibre and Blotch as ten-step submenus, so every texture parameter is reachable without editing the config file.
shareis documented as a real gap rather than a switch that does nothing: KWin's capture exclusion is a PlasmaWindowInterface property and a layer surface is not a Plasma window.- Tests: the migration's four branches, each new submenu end to end over a private bus (including GetLayout drill-down), and that each texture setting produces a different image.
Asset sha256: 0b1aab2fe9f019ce8edaa9e14dc8cf069befe70e2034e1b9d65f86b531361798
2.7.21: keep autostart working across an upgrade
Installing a new build over the running daemon could silently switch autostart off.
Linux reports the running executable as /path/to/binary (deleted) once that file has been replaced. The port read that string straight from /proc/self/exe and wrote it into both Exec= and X-Mnpaper-Exe= of ~/.config/autostart/mnpaper.desktop. The entry then named a file that does not exist, so the next login would have started nothing - and because the ownership check compares that same path, autostart also flipped back to 0 by itself.
The path is now resolved once at startup, the suffix stripped, and the result required to exist. A path that is genuinely gone yields no path at all, and the port keeps its existing fail-soft: it leaves the entry untouched instead of writing a broken one. A plain rename no longer repoints the entry either, since the path is pinned to the one the process started from.
Verified: make clean under -Wall -Wextra, both suites green, and the behaviour exercised directly - a process whose binary is replaced reports the real install path, while one whose file is removed reports no path and the entry is left alone.
Windows: the update feed (version.txt) stays at 2.7.19; this release ships no new Windows exe.
2.7.20: Linux Wayland port - black-frame fix and true device-pixel render
The paper overlay now reaches all four screen edges cleanly, and it renders at the panel's real device pixels.
Black frame gone. The paper came back framed by a one pixel black border after every show/hide toggle, and a re-bake did not clear it. The cause was not the texture: KWin maps a layer surface's scope to a window type and defaults an unrecognized scope to a normal window, so the ShapeCorners effect stroked its inactive-window outline around the overlay. The surface now asks for the on-screen-display scope, because a persistent screen overlay is not a user window. Verified on KWin 6.6.6: the old scope framed every toggle, four consecutive toggles with the fix stay clean.
True device pixels. A 160% panel was given an integer scale-2 buffer (3600x2058 for a 2880x1800 screen), 1.25x more pixels than the panel has, which the compositor then resampled down. The port now uses wp_fractional_scale_v1 plus wp_viewport: the buffer is exactly the device pixels and the viewport maps it to the surface size. Sharper paper, and a full bake drops from ~1.7 s to ~1.0 s (shm 62 MB -> 36 MiB, steady RAM ~95 MB -> ~40 MB).
This release also ships the Linux port itself (merged via PR #27): the Wayland overlay, a system tray icon (StatusNotifierItem + DBusMenu, no toolkit - left-click toggles, scroll steps strength, menu carries strength/warmth/autostart/quit), panel-aware tbmode with a panelgap setting so a floating panel and its tray stay visible, and the CLI (--on/--off/--toggle, --set k=v, --status, --dump-tex). Wayland only, no X11; e-ink mode, the settings GUI, global hotkeys and self-update are not ported.
Windows: the update feed (version.txt) stays at 2.7.19 on purpose. This release contains no new Windows exe - the change is Linux-only - and a 2.7.20 feed would offer clients an exe that does not exist. The Linux binary here is a plain shared-library-dependent build (libwayland-client, libsystemd); cd linux && make && sudo make install is still the recommended path if your distro differs.
mnPaper 2.7.19
The taskbar buttons now do exactly what they say.
- Cover genuinely covers the taskbar: the paper texture stays over a revealed taskbar, which keeps working underneath through the click-through strips.
- Not cover shows the taskbar cleanly by lifting it above the paper. The old transparent hole is gone, so the white frame around the bar's rounded corners can no longer appear.
- Both modes are pure window z-order now; the texture is never cut open. The hole machinery was deleted entirely.
- Switching to Cover from the settings window no longer lets the paper flash over the dialog.
- Restored the help note: if the taskbar ever seems stuck under the texture, pick Not cover.