This release adds a Shift+DD summarize-with-LLM shortcut to the browser extension, captures article content on save for future search, and ships an in-process HTML cache with a pre-gzipped anonymous home path. The favicon was redesigned as a circular brand mark with light/dark theme variants. Metadata extraction was moved off the main event loop into a Bun worker thread to prevent reads from stalling under concurrent saves. Secrets management was migrated to 1Password Environments, dependencies were bumped to TypeScript 6, and several smaller UX fixes landed alongside internal tooling and documentation updates.
New
- Summarize any page with your preferred LLM via Shift+DDThe browser extension now extracts article text via Readability and Turndown, opens your chosen LLM (Claude, ChatGPT, or Perplexity), and auto-pastes and submits the content. A new options page lets you pick your preferred LLM, and a context-menu pair lets you save or summarize any page directly. Falls back to URL-only when content can't be extracted.
da98fd48851b5b - Article content is now captured on save and summarizeWhen you save or summarize a link, the extension extracts the article body and posts it to the server alongside the URL and title. A new POST /api/link/seen endpoint upserts content and marks the link read on summarize. Content is captured for all users; search will be gated separately.
6b2b824 - In-process HTML cache cuts render overhead for list pagesThe rendered list HTML for / and /:username is now cached in-process and invalidated on writes, skipping link.all() and JSX render on cache hits. The anonymous home page also gets a pre-gzipped full-page cache that bypasses JSX render and the compress middleware entirely on repeated hits. Cache entries are busted in lockstep with SSE notifications.
76f68e1edebac5
Improved
- Metadata extraction moved to a Bun worker threadCheerio HTML parsing previously ran on the main event loop, causing an 83% read RPS collapse and 76× p50 latency degradation under concurrent saves. Metadata extraction now runs in a dedicated worker thread via a new jobs dispatch layer, keeping reads unblocked while saves are in flight.
b8ff334 - Favicon redesigned as a circular brand mark with light and dark variantsThe favicon is now a round dark plate with the brand R inside, shared between the site and the extension. Two SVG variants (light and dark) are swapped via matchMedia to avoid Safari's dark-mode plate adornment. Legacy .ico and apple-touch-icon are kept as fallbacks for crawlers and iOS.
ad0b4540273f9937558a07b60d3b - Celebration stats show weekly reads, top weekday, and clean-sweep daysThe personal stats panel replaces the always-100% read ratio with three new lines: reads in the last 7 days, the user's most frequent reading weekday, and a count of days where the queue hit zero.
b336b5f - Secrets managed via 1Password EnvironmentsLocal dev and Kamal deploys now both read secrets from a FIFO managed by 1Password Environments. A preload script drains the FIFO into process.env, and .kamal/secrets is symlinked to .env so Kamal sees the same values. Stripe keys are selected by NODE_ENV; the ephemeral test webhook secret is exported from the Stripe CLI at dev startup.
16bab8c
Fixed
- Tab restore no longer clobbers selection stateThe visibilitychange listener previously called refresh() unconditionally on every tab return, overwriting chevron selection state and racing with SSE deletes. It now only refreshes when an SSE disconnect was detected, restoring the original guarded behavior.
6e1967be7e9a7b