Everything shipped under “extension”, across every version, newest first.
Added
The extension now marks posts in your X timeline with performance badges and opens a Worth replying to panel with posts worth answering. It only points you to them; it never replies for you.
Added
MIT-E: a new "Article from link" import source (clipboard icon in the Import Hub) takes any web article URL, strips it to its article body with @mozilla/readability, converts to clean markdown via turndown, and lands the result as a repurposable Library piece with the canonical URL as provenance. Uses the same SSRF guard the webhook paths use — a user-supplied link can never reach internal metadata endpoints. Idempotent: re-importing the same URL returns the existing piece.
Fixed
mac-ssr-landing split page.tsx into a Server Component but shipped a duplicate sectionFromUrl() there that could never run (Server Components have no window at render time). Deleted the dead function and its unused section-nav import; the live copy in app-workspace.tsx is now the sole seam.
Fixed
Lens/Warpcast DOM extraction no longer titles captured posts with the author name; Mastodon engagement fields now map correctly on insert; Twitch capture handles authorHandle null and host-check edge cases.
Added
Open your channel Shorts tab (https://www.youtube.com/@<your-channel>/shorts) and scroll — every Short you scroll past flows into your Library for voice-matching, using the same scroll-capture relay pattern as TikTok/Instagram/Pinterest. Shorts are keyed off their canonical /shorts/{videoId} permalink so the same Short is never duplicated, and re-capturing just refreshes engagement. Feeds POST /api/import/youtube-shorts with UPSERT semantics.
Added
Open your Kick videos page (kick.com/{username}/videos) or Twitch videos page (twitch.tv/{username}/videos) and scroll — every VOD you scroll past flows into your Library, using the same scroll-capture relay pattern as TikTok/YouTube Shorts. Kick VODs are keyed off their 36-char uuid permalink; Twitch VODs off their numeric video id. Engagement maps to captured views (primary) + likes (secondary). Feeds POST /api/import/kick and /api/import/twitch with UPSERT semantics — re-capturing refreshes engagement rather than duplicating.
Added
Open your own Blogger blog (https://yourblog.blogspot.com/) and scroll — every post you scroll past flows into your Library for voice-matching, using the same scroll-capture relay pattern as the other blog captures (Substack/WordPress/Ghost/Hashnode/Tumblr). Posts are keyed off their canonical /p/{slug} permalink so the same post is never duplicated, and re-capturing just refreshes engagement. Feeds POST /api/import/blogger with UPSERT semantics.
Added
Open your own Whop profile (https://whop.com/{your-handle}) and scroll — every post you scroll past flows into your Library for voice-matching, using the same scroll-capture relay pattern as the other profile-timeline captures. Posts are keyed off their canonical permalink so the same post is never duplicated, and re-capturing just refreshes engagement. Feeds POST /api/import/whop with UPSERT semantics.
Added
Open your own Dribbble profile (https://dribbble.com/{your-handle}) and scroll — every shot you scroll past flows into your Library for voice-matching, using the same scroll-capture relay pattern as the other profile-timeline captures. Shots are keyed off their canonical permalink so the same shot is never duplicated, and re-capturing just refreshes engagement. Feeds POST /api/import/dribbble with UPSERT semantics.
Added
Open your own Warpcast profile (https://warpcast.com/{handle}) and scroll — every cast you scroll past flows into your Library for voice-matching, using the same scroll-capture relay pattern as the other profile-timeline captures. Casts are keyed off their Farcaster hash (0x + hex) so the same cast is never duplicated, and re-capturing just refreshes engagement. Feeds POST /api/import/warpcast with UPSERT semantics.
Added
Open your Lens profile page on hey.xyz (https://hey.xyz/u/{your-handle}) or lenster.xyz (https://lenster.xyz/{your-handle}) and scroll — every publication you scroll past flows into your Library for voice-matching, using the same scroll-capture relay pattern as the other profile-timeline captures. Publications are keyed off their permalink slug (the path segment after /posts/) so the same publication is never duplicated, and re-capturing just refreshes engagement. Feeds POST /api/import/lens with UPSERT semantics.
Added
Open your WordPress author archive page (https://your-domain/author/your-username/) and scroll — every post you scroll past flows into your Library for voice-matching, using the same scroll-capture relay pattern as the other blog captures (Substack/Mastodon/Bluesky/Ghost/Hashnode/Tumblr/Reddit/Dev.to). WordPress self-hosted has arbitrary domains, so the manifest match is broad (https://*/*) with a strict path guard that only activates on /author/{username}/ pages — visiting your admin, posts, or any other WordPress page is never captured. Posts are keyed off their permalink slug so the same post is never duplicated, and re-capturing just refreshes engagement (Jetpack likes / comment-count widgets). Feeds POST /api/import/wordpress-posts with UPSERT semantics.
Added
Open your Dev.to profile page (https://dev.to/@{your-handle}) and scroll — every article you scroll past flows into your Library for voice-matching, using the same scroll-capture relay pattern as the other profile-timeline captures. Articles are keyed off their permalink slug so the same article is never duplicated, and re-capturing just refreshes engagement. Feeds POST /api/import/devto with UPSERT semantics.
Added
Open your VK profile page (https://vk.com/{your-id}) and scroll — every post you scroll past flows into your Library for voice-matching, using the same scroll-capture relay pattern as the other profile-timeline captures. Posts are keyed off their canonical permalink so the same post is never duplicated, and re-capturing just refreshes engagement. Feeds POST /api/import/vk with UPSERT semantics.
Added
Scroll your own profile timeline on any Mastodon instance (e.g. mastodon.social) and every post you scroll past is captured into your Library — text, engagement counts, author handle/name, and media attachments. The extension reads the rendered DOM and sends posts via POST /api/import/mastodon using the same x-app-session auth as the other import paths. Captured posts feed the Telegram agent's voice sample and appear under the Library Imported origin chip.
Added
Open your publication archive (https://yourpub.substack.com/archive) and scroll — every post you scroll past flows into your Library for voice-matching, using the same scroll-capture relay pattern as Mastodon/Bluesky. Posts are keyed off their canonical /p/{slug} permalink so the same post is never duplicated, and re-capturing just refreshes engagement. Feeds POST /api/import/substack-posts with UPSERT semantics.
Added
Open your Ghost publication homepage (e.g. https://yourblog.ghost.io) and scroll — every post you scroll past flows into your Library for voice-matching, using the same scroll-capture relay pattern as Substack/Mastodon/Bluesky. Posts are keyed off their permalink slug so the same post is never duplicated, and re-capturing just refreshes engagement. Feeds POST /api/import/ghost with UPSERT semantics.
Added
Open your Hashnode profile page (https://hashnode.com/@{your-handle}) and scroll — every post you scroll past flows into your Library for voice-matching, using the same scroll-capture relay pattern as Substack/Mastodon/Bluesky/Ghost. Posts are keyed off their permalink slug so the same post is never duplicated, and re-capturing just refreshes engagement. Feeds POST /api/import/hashnode with UPSERT semantics.
Added
Open your Tumblr blog posts page (https://yourblog.tumblr.com/blog/{name}/posts) and scroll — every post you scroll past flows into your Library for voice-matching, using the same scroll-capture relay pattern as Substack/Mastodon/Bluesky/Ghost/Hashnode. Posts are keyed off their numeric post id so the same post is never duplicated, and re-capturing just refreshes engagement. Feeds POST /api/import/tumblr with UPSERT semantics.
Added
Open your Reddit profile page (https://www.reddit.com/user/{your-username}) and scroll — every post you scroll past flows into your Library for voice-matching, using the same scroll-capture relay pattern as Substack/Mastodon/Bluesky/Ghost/Hashnode/Tumblr. Posts are keyed off their canonical permalink (/r/{sub}/comments/{id}/{slug}) so the same post is never duplicated, and re-capturing just refreshes engagement. Feeds POST /api/import/reddit with UPSERT semantics.
Added
Open your VK profile wall (https://vk.com/{your-domain-or-id}) and scroll — every post you scroll past flows into your Library for voice-matching, using the same scroll-capture relay pattern as Substack/Mastodon/Bluesky/Ghost/Hashnode/Tumblr/Reddit. Posts are keyed off their wall permalink (wall{ownerId}_{postId}) so the same post is never duplicated, and re-capturing just refreshes engagement. Feeds POST /api/import/vk with UPSERT semantics.
Added
Save-to-NoteSurge on an X permalink now brings its images and video into your Library alongside the text — multimodal capture, stage one.
Added
The "Choose a source" grid only showed four tiles, so three real ingestion paths were invisible: X bookmarks and both LinkedIn captures existed through the browser extension but had no way in from the app. The grid now lists all seven sources. The three extension ones open a plain explainer instead of pretending to be forms — what gets captured, the exact page to browse so capture runs, and a direct link where one is guaranteed to land (X Bookmarks and LinkedIn's saved posts; LinkedIn posts keeps instructions only, since the app can't know your profile address).
Changed
Open the extension before this shipped and you got exactly one thing: a form asking you to connect a Substack. Useful once, dead weight every time after.
Now, once you’re connected, opening the popup shows what’s actually going on: how many notes are scheduled, how many posted, how many failed, how many are sitting as drafts, plus a warning if something’s overdue. It’s pulling from the same data the app itself shows, so there’s no separate "extension truth" that can drift out of sync. There’s also a real "Connect a different Substack" button now instead of just resubmitting the same blank form, and one click drops you straight into your queue.
Added
Visit your own LinkedIn "Recent activity" and NoteSurge quietly captures your posts, along with their reactions, comments, and reposts, for voice-matching and a new LinkedIn analytics card. Visit "My items → Saved posts" and anything you’ve saved from other people lands in your Library as an idea.
Added
A floating "Save to NoteSurge" button shows up on any tweet’s own page now and drops it straight into your Library. Open your X bookmarks page and scroll through it like normal, and NoteSurge captures your whole bookmarks list the same way, with a live counter so you can see what it’s picking up as you go.