Fixed
- CI badge showed failing on default branch — The CI workflow only triggered on
pull_request, so no runs ever executed onmain. Shields.io checks the default branch, causing the README badge to always show "failing". Addedpush: branches: [main]to the workflow triggers. - Theme import card didn't state the expected file format (#44) — The import/export card description was ambiguous about which file type to use. The system is and has always been JSON-only. The card description and helper text now explicitly say
.json. - Type error in manifest test —
manifest.test.tscalled.startsWith()onstart_urltyped asunknown. Added the sameas stringcast already used forshort_name. - Image background overlay rendered as a dark gradient —
resolveBackground()for image backgrounds built the overlay as a gradient with alpha only on the first stop. Fixed to a uniform translucent layer, and opacity 0 now skips the overlay entirely. modecolumn comment claimedautowas supported — Comment documenteddark, light, autobut onlydarkandlightare valid. Comment aligned to reality.- Click-inflation attack on
/go/:id(security) — The JS-free click redirect endpoint had no rate limit. Now applies the same 60 req/min/IP throttle as the JS tracking endpoint. - "Zero client JavaScript" claim was inaccurate — Inline
onclickhandlers for mailto/tel links are technically client-side JS. Claims softened to "zero client-side JS bundles" across docs.
Added
- Theme system regression matrix (69 tests) — Locks the contract between DB schema defaults, Zod validator, token resolver, and the 9 preset definitions. Prevents the drift bugs seen in v1.1.2 and v1.1.3.
- Image overlay regression test (4 tests) — Pins the fixed overlay render behavior.
- PWA manifest upgrade (closes #18) — Added
start_url,scope,orientation, maskable icons, and screenshots to the manifest for proper install prompt support. - Manifest contract test (6 tests) — Parses
public/site.webmanifestand asserts install-critical fields.
Changed
- Extracted theme presets and Zod schema into modules — Enables the regression matrix tests without importing server-only code.
- Dependency bumps — Merged minor-and-patch group and vitest 3→4. Closed typescript 7, eslint 10, and node 26 as blocked.
- Disabled theme font preloading (perf) — 483KB → ~20KB on public pages. ~60% transfer reduction. The browser only downloads the active theme's font.
Full changelog: https://github.com/Manak-hash/LinkBreeze/blob/main/CHANGELOG.md#114---2026-07-22