2.1.2
OSMD 2.1.2 brings huge performance improvements: ~40% median speedup, 47% median for large scores 🚀
See #1716
Thanks to @ishinomaru for the first 2 PRs with the biggest performance gains!
See the Changelog:
2.1.2 (2026-08-06)
- Playback: Fix wrong tuplet playback duration from export errors like musx2mxl. Read tuplet note length from time-modification when is un-reduced (5497e15)
- 40% median total performance improvement: Compared to OSMD 2.1.1, normal scores render median 40% faster now, 47% even for large scores, where this is the most useful. This aggregates improvements below. See Issue 1716 for more info and graphics. This is on top of the ~50% (2x) performance improvement in OSMD 2.0.0.
- Formatter: Dedupe the duration key computation in evaluate() (PR #1715, minor performance gain) (16b5020)
- Glyph: Cache outline bounding boxes. Median ~20% performance gain (PR #1704) (e9cb6b0)
- Glyph: Cache scaled glyph outline segments for drawing. Median 2.5% speedup, 9% for largest score (PR #1713) (926fc1d), closes 1704/#1712
- Glyph: Memoize glyph width lookups during formatting. Median 5% speedup (PR #1712) (27cff40), closes #1704 #1704
- NoteHead: Re-enable glyph outline caching for noteheads. Median 2% speedup (PR #1711) (b5fc7eb)
- SkyBottomLineCalculator: Remove per-render allocations in updateLines (2-3% speedup in dense scores, PR #1714) (6077f8f)
- VexFlowMeasure: Scope correctNotePositions to its own measure (PR #1703). Improves performance especially for long pieces by 7% to over 40%. (c663e0d)
- VexFlowMeasure: Scope correctNotePositions tab code branch to its own measure (#1703) (ba53f63)
- Visual Regression Tests: Speed up visual regression tests to single seconds (from minutes), make cross-platform (PR #1709, #676) (1a2f910), closes #ff0000
@quasar/app-vite-v3.5.0
- feat(app-vite): "quasar mode add" can now run non-interactively — new params:
--webserver/-w [hono|fastify|express|koa](SSR),--filename-based-routing(SSG),--app-id(Cordova & Capacitor) and--app-name(Capacitor). An explicitly supplied value wins (validated); CI/non-TTY runs fall back to validated defaults instead of aborting; interactive terminals keep their prompts. Thequasar dev/build -m <mode>auto-install inherits the same fallbacks, so e.g. building SSR in CI without a committed /src-ssr now works - feat(app-vite): Electron dev -> now prints the running banner like every other mode, including a new "Electron PID" line
- feat(app-vite): Electron -> the scaffolded /src-electron pnpm-workspace.yaml allowlists electron's postinstall script (pnpm blocks lifecycle scripts by default; a no-op for electron >= 43, required for older version pins)
- fix(app-vite): Electron dev on macOS -> possible deadlock (main process alive, no window, no error) when app code has circular imports (#18505)
- fix(app-vite): Electron dev on Windows -> UNRESOLVED_ENTRY on the virtual main entry (#18504)
- fix(app-vite): PWA -> navigateFallbackDenylist never matched the hashed workbox runtime chunk in production GenerateSW builds
- fix(app-vite): App Extensions -> "quasar describe" could not resolve an API file registered through api.registerDescribeApi() with a relative path
- fix(app-vite): App Extensions -> detecting a not-installed extension package could stall the CLI for ~20-45s (unbounded internal recursion); detection is now instant
- fix(app-vite): "quasar clean" -> removes the whole node_modules/.q-cache; per-mode/target dev caches used to survive it
- fix(app-vite): SSR/Electron -> workspace:-protocol dependencies are now pinned to the exact installed version in the generated package.json, so dist/ssr installs outside the app's own monorepo workspace
- fix(app-vite): build -> a symlinked dist folder now gets its resolved directory emptied with the link preserved (previously the link itself was replaced by a real dir on the next build)
- fix(app-vite): build summary -> unreadable files render "-" instead of "NaN KB"; the totals banner sizes itself on the real file count
- fix(app-vite): clear "The project dependencies are not installed." error instead of a TypeError crash when the quasar/vite packages are unresolvable
- fix(app-vite): logger -> a suppressed fatal() still exits the process instead of letting the run continue past fatal errors
- fix(app-vite): subprocesses terminated by a signal (e.g. an OOM-killed install) are reported with the signal name instead of "Command not found! Please install it globally."
- fix(app-vite): perf -> the package.json read cache never hit (re-parsed on every access); concurrent cache-module initialization no longer runs twice
- Massive automated-testing expansion: a colocated unit suite (~530 tests) plus a playground-driven e2e suite exercising every mode through the real CLI (builds, dev servers with real HTTP checks, the production SSR webserver, quasar.config hot-reload, vue-tsc typechecking and the full App Extension lifecycle). Both gate CI and npm publishing
- Docs: the new non-interactive "quasar mode add" params across the commands list and the SSR/SSG/Cordova/Capacitor preparation pages
Quasar Framework is an open-source MIT-licensed project made possible due to the generous contributions by sponsors and backers. If Quasar is useful in your workflow and you want to support ongoing maintenance, please consider the following:
plugin-legacy@8.2.3
Please refer to CHANGELOG.md for details.
v8.2.1
Please refer to CHANGELOG.md for details.
Release 2026-08-06 13:44
Release 2026-08-06 13:44
- react-router: prevent blank frame before initial pending UI (#7961) (697ebb6ddb) by @Sheraff
- router: preserve raw params for match identity (#7966) (07a3d10d8f) by @Sheraff
- compact private bundle boundaries missing changesets (#7985) (#7975) (9cac62a5c7) by @Sheraff
- compact private bundle boundaries (#7975) (94685306a9) by @Sheraff
- router-core: optimize route tree processing (#7984) (84db4a8423) by @Sheraff
- add changeset for #7966 (#7967) (6aefb33925) by @Sheraff
- @tanstack/history@1.162.1
- @tanstack/react-router@1.170.21
- @tanstack/react-start@1.168.38
- @tanstack/react-start-client@1.168.19
- @tanstack/react-start-rsc@0.1.37
- @tanstack/react-start-server@1.167.26
- @tanstack/router-cli@1.167.24
- @tanstack/router-core@1.171.18
- @tanstack/router-generator@1.167.24
- @tanstack/router-plugin@1.168.26
- @tanstack/router-vite-plugin@1.167.26
- @tanstack/solid-router@1.170.21
- @tanstack/solid-start@1.168.37
- @tanstack/solid-start-client@1.168.19
- @tanstack/solid-start-server@1.167.26
- @tanstack/start-client-core@1.170.17
- @tanstack/start-plugin-core@1.171.29
- @tanstack/start-server-core@1.169.21
- @tanstack/start-static-server-functions@1.167.22
- @tanstack/start-storage-context@1.167.20
- @tanstack/vue-router@1.170.20
- @tanstack/vue-start@1.168.36
- @tanstack/vue-start-client@1.167.22
- @tanstack/vue-start-server@1.167.26
@tanstack/vue-router@1.170.20
-
#7970
2435885- createFileRoute does not rely on FileRoute class -
#7985
9cac62a- perf: compact private bundle boundaries- #7975 -
#7971
86bf510- clean intersection observer options in link component -
#7967
6aefb33- Preserve path params in their raw string form while matching routes so structured values returned byparams.parseproduce stable match IDs and do not reuse stale loader data.RouterCore.getMatchedRoutes()now returns[matchedRoutes, rawParams, foundRoute]instead of an object. -
Updated dependencies [
84db4a8,9cac62a,6aefb33]:- @tanstack/router-core@1.171.18
- @tanstack/history@1.162.1