LinkBreeze v1.1.2
Security
- Forgeable admin sessions when
SECRET_KEYunset (HIGH) —getSecret()now throws in production ifSECRET_KEYis not configured, instead of falling back to a public default. Dev mode still uses a dev-only secret. - XFF-spoofing brute-force bypass (HIGH) — Added a global login rate limit (15/min) on top of the existing per-IP limit (5/min). Closes the vector where rotating
X-Forwarded-Forbypasses per-IP throttling. - Subscriber email DoS (HIGH) —
subscribers.emailnow has a UNIQUE constraint. Migration 0005 dedupes existing rows before creating the index. Per-IP rate limit (10/min) added to the subscribe endpoint. - Stored XSS via backup restore (MEDIUM) —
restoreBackup()now filtersjavascript:URLs throughisAllowedLinkUrl(). Malicious links are silently dropped. - Host-header injection for QR/OG/canonical URLs (MEDIUM) — Optional
BASE_URLenv var takes priority over all forwarded headers when generating absolute URLs.
Fixed
- Themes not seeding on fresh deploy — only Aurora appears (#35) —
getActiveTheme()had an inline fallback that seeded a single Aurora theme when the DB was empty. Because the public page calls it before the admin page is visited, the other 8 presets never got seeded. Fixed:getActiveTheme()now delegates toseedThemesIfEmpty(). - Theme changes silently not saved (#35) —
densitycolumn defaulted to"comfortable"but the Zod validator only acceptscompact/normal/relaxed. The entire save payload was rejected bysafeParseand the error was swallowed client-side. Fixed: schema default, migration 0006, and errors now surfaced in the UI. - Floating promise —
clearSubscribers()now properly awaited. - CSV export lint — Added
downloadattribute. - Stale eslint-disable — Removed from OG image route.
- CI — Added
npm run lintstep to CI pipeline.
Added
- Unique visitor count — Dashboard now shows distinct visitor count alongside total views.
/go/:idredirect endpoint — Server-side click tracking via 302 redirect. Works without JavaScript. http(s) links now use this path automatically.- vCard + File link types — Exposed in the link type dropdown (backend already supported them).
npm run seed— Seeds demo data for local development.- Skip-to-content link — Accessibility improvement on public pages.
prefers-reduced-motion— CSS-based hover effects now respect this media query.
Changed
- Dependency updates — recharts 3.9.2, shadcn/ui 4.13, @types/node 26, @types/bcryptjs 3.0.
- next.config —
poweredByHeader: false,optimizePackageImportsfor lucide-react/recharts/@dnd-kit. .env.example—SECRET_KEYmarked REQUIRED,BASE_URLdocumented.
Full Changelog: v1.1.1...v1.1.2