LinkBreeze v1.3.2
What's new
Spanish admin UI (es)
The admin speaks a third language. A complete Spanish dictionary (700 keys, tuteo register, terminology aligned with the Spanish README) ships alongside English and French with the same compile-time key parity and drift guards — a missing key fails the build, not your users. Español joins the language picker in Settings; the choice persists per user like en/fr.
Also fixed along the way: four keys that had drifted and rendered as raw key paths (setup wizard, integrations tab, password form, QR card), the raw Enabled/Disabled labels beside the email-capture switch, and two broken English source strings ("Choose a settings.", "You call it later."). 74 dead keys pruned from en/fr. New npm run i18n:audit parity tool for deep locale checks beyond the hash gate.
Set a default page and keep it first (#90, reported by @baptleduc)
Every page switcher row now has a star: click it on any page to make that page the default, confirmed by a toast. The default page always sorts to the top of the switcher, the links page, the theme page, settings, and the dashboard, so it stops wandering as you add pages.
Per-link icons: auto, picked, or uploaded (#91, reported by @gdyys96b56-web)
Links are no longer stuck with whatever favicon a site serves (or none, for email, phone, WhatsApp, and vCard links). The link dialog has a compact new Icon section:
- Auto keeps today's behavior: fetch and cache the site's favicon when the link is saved.
- Pick opens the categorized icon gallery and stores the choice as data, not an image: the public page renders it as an inline SVG that inherits the theme's text color, so it matches every theme and card style for free.
- Upload takes PNG/JPG/GIF/WebP/AVIF/ICO/SVG up to 512 KB. Files are validated by magic bytes, not by name, and SVGs pass through a sanitizer that strips scripts, event handlers, foreign objects, and external references before storage.
Fixed
- Upload failures were silent — a rejected icon upload looked like the button ignored you; errors now surface inline in the dialog.
- Uploads never reached the server — the icon file input carried no field name, so the file was dropped from the form data.
- Long dialogs stranded their Save/Cancel buttons off-screen; the shared dialog is now capped at 90% viewport height and scrolls its body.
- Uploaded files were served under the page CSP; uploads now always ship
default-src 'none'. - Settings → Integrations crashed with INVALID_MESSAGE — a literal
<script>bracket in a rich-text hint broke next-intl's parser; reworded.
Full changelog: https://github.com/Manak-hash/LinkBreeze/blob/main/CHANGELOG.md