This release adds passkey-based discoverable login, a keyboard shortcuts menu, favicon storage and display, flash messages for auth events, client-side list sorting and shuffle, and a full observability stack (ending with Surrge for embedded logging and tracing). It also improves mobile layout, self-hosts CDN dependencies, adds health and backup monitoring endpoints, and sets up web analytics.
New
- Log in without typing your username using passkey discoveryA new discoverable login flow lets the browser show all saved passkeys for the site. Users pick their account from the picker and authenticate without entering a username first. New API endpoints
/api/user/discoverand/api/user/discover/verifyback this flow, and a/~/notfoundroute handles failed lookups.5b16f2e - Keyboard shortcuts menu replaces the old navigation linksPress
hto open a help/shortcuts modal from anywhere in the app. The menu shows context-aware actions — Register (r), Login (l), or Logout (l) depending on auth state — and works with keyboard navigation and on mobile. Modifier-key combinations are ignored so browser shortcuts still work.7de7d862c23aca31d89884f907ca3963f61bf01ef22bf23701ac6b366e5551eec226f4 - Flash messages confirm registration, login, and logoutAfter authenticating or logging out, a brief dismissing alert appears at the top of the page with a friendly message. The alert auto-dismisses after 5 seconds and hides the page subtitle while visible.
4350453 - Favicons are fetched, stored, and displayed next to linksWhen a link is saved its favicon is fetched and stored in the database. Favicons are served via
/favicon/{domain}, cached in an LRU cache (500 entries), and given a 30-day browser cache. High-resolution icons (≥32 px) are preferred over low-resolution ICO files to satisfy Lighthouse. Favicons are resized to 32×32 using Sharp for consistent display.91dae7ea30800f64cd91898ca5a3fe33eed - Sort or shuffle your reading list with keyboard shortcutsNew client-side shortcuts let you sort the list by date or shuffle it randomly without a page reload.
b130b3b - Help page documents joining, saving, reading, and API keysA new one-page help document covers the main workflows and explains the username and token keys used for the API.
f9f930f4580a4a1a72dcc - Premium page and contact email addedA premium page with content and a contact email address in the help page are now available.
69b4337 - Health and backup monitoring endpoints addedA
/healthendpoint is available for uptime monitoring. A separate backup health endpoint checks R2 replication status, backed by a daily Litestream snapshot. R2 environment variables are wired into the deployment config.d3e84c14ec35735a4c4bfd456a70
Improved
- CDN dependencies are now self-hosted with long-term cachingAlpine.js, HTMX, and other previously CDN-loaded assets are now bundled and served directly, removing the external dependency and enabling aggressive browser caching.
0d69e3721a03f1
Fixed
- Page reloads automatically on SSE reconnectionIf the server-sent events connection drops and reconnects, the page reloads so the list stays current.
74909e9 - Mobile and tablet layout fixesTablet padding is corrected for iPad Mini-sized viewports (576–850 px) where PicoCSS was removing horizontal padding and content was hitting the edges. Hover effects on touch devices are disabled to prevent sticky states in the shortcuts modal.
a67d38f31d8988 - Fixed-width metadata column with username truncationThe metadata column in the link list now has a fixed width and long usernames are truncated, keeping the layout stable regardless of username length.
a8a09e9b446a4a - Human-readable passkey error messagesCommon passkey failures (timeout, abort, etc.) now show plain-language messages instead of raw error codes.
64d7af2