Release 1.3.0
Date: 2026-08-16
Tag: v1.3.0 (backend/pom.xml)
Previous release: v1.2.0
Highlights
Migrated to the Latent Design System
The UI has been reworked onto the shared Latent Design System token layer
(frontend/src/assets/css/latent/), replacing the old hand-rolled "Deep Neon" theme:
- Colors, spacing, and typography now come from DS tokens instead of the five
themes/*.cssfiles, which have been deleted along with the now-fully-superseded
layout.cssandbuttons.cssglobal stylesheets (100% dead — no class token from
either was ever present in the live DOM). - Status colors (
--status-success,--status-warning,--status-danger) now resolve
to design-system tokens instead of off-palette Tailwind hexes. - Icons standardized on
lucide-vue-next, matching the sister apps. - Splash screen, titlebar window-control hover colors, and Ctrl+Scroll UI zoom now match
Latent Tools; dev-credit logo sizing matches Latent Library. npm run lint:dswas added and now runs as part of the release build
(.github/workflows/build.yml), catching undefined CSS variables and flagging raw hex
colors outside the token layer before a release ships.
New ds/ component layer
LMO previously had no shared design-system component primitives at all. This release adds:
StatusPill— shows live backend connection state in the titlebar, backed by a new
useBackendStatuspolling composable.LBadge— replaces hand-rolled badge markup.LSwitch— replaces hand-rolled toggle markup, fixing keyboard reachability that the
old markup didn't have.
Each ships with a Vitest spec. LButton and LCard are not yet ported — tracked as open
work in handover.md.
Classification fix: Illustrious / NoobAI / Pony LoRAs
Fixed a misclassification bug where SDXL fine-tune LoRAs (Illustrious, NoobAI, Pony) sorted
into the generic SDXL 1.0 bucket instead of their specific architecture. Root cause:
kohya_ss writes ss_base_model_version: "sdxl_base_v1-0" into the safetensors header
regardless of which specific checkpoint was fine-tuned from — it records the base family,
not the fine-tune. A narrow override (isGenericSdxlBucket() / isSpecificSdxlVariant())
now lets the filename win only in that specific case, without weakening the header's
priority everywhere else. Only affects files that were never fetched from Civitai (a
.civitai.info sidecar still short-circuits to ground truth).
/api/version fixed — no more "vdev" in Settings
Two independent bugs combined to make the Settings dialog always show vdev and the
StatusPill report Offline against a healthy backend:
VersionHandlerdidn't answer the CORSOPTIONSpreflight, so the endpoint returned 405
and was unreachable from the renderer entirely — while working fine over curl, which sends
no preflight. Fixed by answering preflight like every other handler.- The version lookup read
META-INF/maven/<groupId>/<artifactId>/pom.properties, which had
the wrong coordinates (mixed the Java package with the jar'sfinalName), so it always
fell through to a"dev"fallback. Replaced with a filteredversion.propertiesresource
that has no coordinates to get wrong.
Undo manifest no longer sorts itself
When source and target directories coincide (organizing in place), a prior run's
undo-manifest.json sat inside the directory being scanned and got classified and moved
like any other file — silently corrupting the undo trail on every in-place sort after the
first. The candidate-file filter now excludes the undo manifest explicitly.
Other changes
- Packaging metadata and docs aligned with Latent Library conventions.
- Latent mark logo added to the README; interface screenshots updated to match the
redesigned UI, plus a Fetch-before-Sort disclaimer. handover.mdrewritten as a current-state document rather than a change narrative.
Known open issues (unchanged by this release)
Carried forward from handover.md, none introduced or worsened by 1.3.0:
LButtonandLCardare not yet in theds/layer.- Input borders fail WCAG 1.4.11 non-text contrast (1.31:1 measured vs. 3:1 required) —
inherent to the current DS border tokens; needs an LMO-local override or an upstream
token change. - 7 raw hex colors remain outside the token layer, flagged as
lint:dswarnings (one is
the Ko-fi brand color and is a legitimate exemption). lint:dsonly runs at release (tag-triggered) time, not on every push/PR, so a
regression stays invisible until the next release.- The backend port is handed to the renderer once at startup; if the backend restarts on a
new ephemeral port, the StatusPill correctly showsOfflineuntil the app itself is
restarted.
Verification
- Backend: 92/92 JUnit tests pass (
mvn test). - Frontend:
npm run lint:dspasses with 0 errors (7 pre-existing hex warnings, unchanged).