Skip to content

v0.23.0

Choose a tag to compare

@SysAdminDoc SysAdminDoc released this 30 Jul 20:22
· 179 commits to main since this release

OpenShop v0.23.0

This release closes every remaining P2 item on the OpenShop roadmap. The theme is controls that told the truth about themselves — several visible options did nothing at all — plus two performance ceilings and a real right-to-left contract.

Controls that did nothing now do something

  • New Image background — the colour picker was read by nothing, so every new document came out transparent whatever you chose. The dialog now offers Transparent, White, or a custom colour, and the swatch is enabled only when it applies.
  • Recent files — the welcome screen's Recent list was permanently empty because nothing ever recorded an opened document. It now populates, and the rows are presented as the history record they are rather than as clickable shortcuts that did nothing.
  • Palette import — the file picker advertised .gpl and .ase, but the reader only ever ran JSON.parse, so picking either reported "Invalid palette file". Both formats now parse for real, including ASE's RGB, CMYK, Gray, and LAB colour models.
  • Preferences — "Preferences saved" meant the language only. Default canvas size, grid size, snap tolerance, history cap, and accent colour are all persisted now, and a corrupted store is clamped on the way in rather than being able to disable undo.
  • Smart Upscale — renamed to Enlarge (resample) and moved out of the AI menu. It is stepped canvas resampling with a sharpening pass; no model is involved and it should never have claimed otherwise.
  • AI backend — the README promised WebGPU with a WASM fallback while both pipelines pinned device: 'wasm'. OpenShop now probes for a usable adapter once and reports which backend it chose.

Performance

  • Levels and Color Balance stayed responsive only on small images. Each slider tick ran a full-resolution pixel pass, encoded the result to a PNG data URL, and decoded it again — hundreds of milliseconds per tick on a 12 MP photo. Previews now run on a downscaled proxy, swap the working canvas straight into the layer, and use a 256-entry lookup table instead of three Math.pow calls per pixel. Apply still commits at full resolution.
  • Undo history was capped by entry count only. Because each entry embeds full base64 image sources, 60 steps on a large photo could retain gigabytes. History now evicts against a 192 MB budget as well, always keeping at least one entry, and Image Information reports the retained size.

Localisation and right-to-left

  • Changing locale now sets the document's lang and dir, which assistive technology, hyphenation, and bidirectional text all depend on and which the locale switch never touched.
  • Canvas text carries an explicit direction, and the menu chrome uses logical properties, so a right-to-left locale no longer strands shortcuts and submenu arrows on the wrong edge.
  • A new pseudo-locale accents and brackets every translated string, making any interface text that skipped the localisation machinery obvious at a glance. The Chinese map is now gated at parity with English apart from format names and single-letter typographic controls.

Model cache

Each pinned model's cached size and load state are reported, and a single model's files can be cleared without wiping all site data.

Maintainability and coverage

  • The two competing mobile stylesheets are now one. The first block was almost entirely overridden — a 36px topbar against 44px, a flush-bottom toolbar against the floating one, a 200px tablet panel against 248px — so edits to it did nothing and any reordering would have flipped the mobile layout wholesale. The animation timeline also now clears the floating toolbar instead of sitting under it.
  • New tests cover history eviction and the baseline fallback, entry coalescing, the edit-commit guard, the byte budget, and the filter worker's crash path. Each was checked by reverting the branch it guards and confirming the test fails.
  • Test coverage: 56 unit, 59 Chromium end-to-end, 24 cross-engine on Firefox and WebKit, 3 offline-shell contract.

Known limitation

script-src still allows https://cdn.jsdelivr.net for three SRI-pinned script tags. The host allowance is broader than those tags and remains on the roadmap.

Install

Download openshop-v0.23.0.html and open it in a browser, or use the hosted build. Everything runs client-side.