What's Changed
- self-hosted: render the following count, so its toggle finally does something by @feruzm in #1479
- self-hosted: make the sidebar toggles work on community instances by @feruzm in #1481
- fix(publish): surface resource credits in the editor and stop overstating them by @feruzm in #1483
- fix(editor): paste markdown tables that contain blank cells by @feruzm in #1484
- fix(publish): keep the out-of-RC failure on the page and offer a top-up by @feruzm in #1485
- feat(sdk): price a comment's RC cost the way the chain does by @feruzm in #1486
- perf(editor): stop serializing table markup that carries no information by @feruzm in #1487
- fix(publish): offer both RC top-up routes, and fix href button alignment by @feruzm in #1488
- feat: one RC calculation for every surface, priced from the real draft by @feruzm in #1489
- fix(sdk): stop recording content activity for edits by @feruzm in #1491
- Move the content moderation rules into the SDK by @feruzm in #1493
- Restore the profile entries list, and fix text-to-speech on older Safari by @feruzm in #1499
- Build packages before testing them, and report PR build on every PR by @feruzm in #1500
- Use a real i18n key for the comment collapse toggle by @feruzm in #1504
- Fix comment list emptying when a post has a hidden comment by @feruzm in #1503
- fix(web): show a translated message when extension signing is cancelled by @feruzm in #1515
- Newsletter: community and creator digest subscribe surfaces by @feruzm in #1516
- Landing page: subscribe through the newsletter service with double opt-in by @feruzm in #1520
- Ask for the notification-digest opt-in once, after the first publish by @feruzm in #1521
- Deploy wiring for the newsletter service by @feruzm in #1522
- Staging: pass the newsletter service settings to alpha by @feruzm in #1523
- seo: stop gating indexability on the spaminator blacklist by @feruzm in #1525
- fix(sentry): stop the spin claim and the voice list from throwing uncaught by @feruzm in #1526
- chore: drop the dead SEO_BLACKLIST_URL deploy wiring by @feruzm in #1527
- Newsletter: show a suspended digest to its sender by @feruzm in #1528
- fix(editor): bind Ctrl/Cmd+B and anchor the emoji picker by @feruzm in #1531
- seo: truncate the deployment id to 8 hex by @feruzm in #1534
- Newsletter: author sends from a post (gated cohort, preview, one issue per period) by @feruzm in #1535
- Newsletter: compose an email digest from several posts by @feruzm in #1540
- Newsletter: list building for creators (count, subscribe link, end-of-post prompt) by @feruzm in #1541
- Creator digests for every creator; the self-hosted subscribe embed by @feruzm in #1542
- Embed: proxy buffers for the subscribe response headers by @feruzm in #1548
- Slim feed entries so list pages stop shipping post bodies by @feruzm in #1545
- Put the community identity above its digest sender tools by @feruzm in #1550
- Newsletter: signup on the About page, and a way back from the confirmation by @feruzm in #1552
- Give the default shell the bottom room the other three already have by @feruzm in #1555
- Restore the card thumbnail slimming dropped, and stop a slim row blanking a body by @feruzm in #1557
- Remove the unreachable social-crawler rewrite and its page by @feruzm in #1554
- Only fetch community pin state for someone who can pin by @feruzm in #1561
- Stop the feed new-posts poll running in background tabs by @feruzm in #1563
- Guard the feed slimming, in behaviour and in shape by @feruzm in #1565
- render-helper: make the node build loadable by plain Node by @feruzm in #1566
- Drop the render-helper CJS workaround in the hosting API by @feruzm in #1567
- Let a named function or class expression bind its own name by @feruzm in #1569
- Keep the payout fields, not the whole entries, for the wallet total by @feruzm in #1571
- Fetch slim pages for the two server renders that never read a body by @feruzm in #1572
- Track the web origin nginx config, with the public-repo contract enforced by @feruzm in #1574
- Pin the thumbnail field order as a decision, not an accident by @feruzm in #1576
- Drop the voter records the two card-only renders never read by @feruzm in #1577
- Stop fabricating 200 for every HEAD at the origins by @feruzm in #1578
- Require a bot check on anonymous newsletter subscribes, and offer the post prompt to anonymous readers by @feruzm in #1579
- Give Googlebot blocking metadata so the canonical lands in head by @feruzm in #1581
- Start the production server with the config the build resolved by @feruzm in #1583
- Sitemap: gate on the row's author_reputation and give authors and tags a real lastmod by @feruzm in #1585
- SEO Redis client: wait for the connection instead of failing sitemap requests during a slow start by @feruzm in #1589
- Bring the docs in line with the tracked origin config by @feruzm in #1587
- Sitemap: operator-seeded shards, listed in the index while their blob exists by @feruzm in #1591
- Prefetch feed links on intent instead of on viewport entry by @feruzm in #1602
- Keep the document security headers off hashed build assets by @feruzm in #1603
- Homepage: eager first trending thumbnail, Turnstile only on intent by @feruzm in #1604
- Bundle only the Sentry exports the lazy facade calls by @feruzm in #1605
- render-helper: decode entities with entities instead of he by @feruzm in #1606
- Raise the stack Redis cap to 2gb by @feruzm in #1612
- render-helper: fast thumbnail lookup, thumbnails first, memoized nulls by @feruzm in #1611
- Cap in-flight page renders per process and raise the V8 semi-space by @feruzm in #1613
- SDK: route server-side reads through the vapi RPC cache, with fallback by @feruzm in #1614
- Load the FAQ articles on demand instead of in every route's locale bundle by @feruzm in #1616
- Detect a feed card's language on the server instead of in every browser by @feruzm in #1618
- Serve apple-touch-icon at the site root by @feruzm in #1620
- Carry the previous builds' static assets into each new image by @feruzm in #1622
- SSR RPC proxy: report rpcProxyStats from the web tier by @feruzm in #1623
- SSR RPC proxy: the shared secret is the switch by @feruzm in #1625
- SSR RPC cache: raise vapi's fill gate in the stack files by @feruzm in #1627
- SDK rpc proxy: a relayed node error does not trip the breaker by @feruzm in #1629
- SSR admission: cap 48 in-flight renders per process by @feruzm in #1631
- Give the US origin a fourth replica, bounded by its own heap cap by @feruzm in #1634
- Audit the deployment files for capacity too, not just infra/ by @feruzm in #1636
- Feed: prevent invalid tag RPCError by lowercasing URL tag by @sentry[bot] in #1633
- sitemap spec: stop asserting static.xml is stable across a UTC day rollover by @feruzm in #1637
- perf(css): fold shared component stylesheets into one entry (52 render-blocking sheets -> 7) by @feruzm in #1638
- Supply the audit's marker list from the repository secret by @feruzm in #1639
- perf(head): take the translate guard off beforeInteractive (removes the last parser-blocking script) by @feruzm in #1642
- Revert #1642: removing the parser gate starves render-blocking CSS (FCP 1200ms -> 3000ms on staging) by @feruzm in #1643
- docs(waves): correct what the observer param actually filters by @feruzm in #1644
- perf(waves): stop sending an observer on anonymous waves requests by @feruzm in #1648
- Open notifications on the account that authored the post by @feruzm in #1647
- Keep the HBD interest estimate visible and gate the claim on it by @feruzm in #1649
- Telemetry: improve image upload error reporting by @sentry[bot] in #1640
- fix(tiptap-editor): normalize empty list items to prevent RangeError by @sentry[bot] in #1650
- fix(tiptap-editor): chip mentions in text nodes so image URLs survive by @feruzm in #1654
- fix(tiptap-editor): repair empty lists and rowless tables on paste by @feruzm in #1655
- fix(tiptap-editor): stop inserting unrenderable content as literal markup by @feruzm in #1657
- Newsletter: rename "Sent issues" to "Sent digests" and show only the 3 latest by @feruzm in #1659
- Preload only Inter latin; drop Lora and cyrillic font preloads by @feruzm in #1661
- Server-render entry word count, read time and relative dates by @feruzm in #1663
- Paint the navbar complete at first frame: eager logo, server-rendered search shell by @feruzm in #1665
- Prefetch chrome links on intent instead of viewport entry by @feruzm in #1667
- Post-page performance batch: locale diet, chunk-wave diet, early stats fetch, content-visibility by @feruzm in #1669
- Restore the Lora latin preload; the late swap repainted text posts by @feruzm in #1671
- Tiered post-image loading: first three eager, high hint exclusive to the LCP image by @feruzm in #1673
- Detect mixed-build dpl skew and escalate a dead retry to a reload by @feruzm in #1675
- feat(sdk): shared newsletter client module for digest subscriptions and sender API by @feruzm in #1677
- fix(render-helper): strip scrobble.life footer byline in cleanReply by @feruzm in #1679
- refactor(newsletter): migrate the web client onto the SDK newsletter module by @feruzm in #1681
- fix(nav): use a valid autocomplete value on the navbar search input by @feruzm in #1683
- fix(master-password): use crypto.getRandomValues for UUID generation by @sentry[bot] in #1684
- fix(ai-image): keep the idempotency key on 409 in_progress and auto-poll for the finished image by @feruzm in #1686
- feat(ai-image): history tab so delivered images are findable after an error by @feruzm in #1688
- Stripe: defer PaymentIntent creation to the Pay click by @feruzm in #1690
- Add reported image URLs to DMCA blacklist by @feruzm in #1691
- signup: fetch the page's LCP images eagerly by @feruzm in #1694
- fix(tts): guard SpeechSynthesisUtterance addEventListener calls by @sentry[bot] in #1692
- chore(dmca): add 42 image entries to blocklist by @feruzm in #1695
- chore(dmca): add 623 image entries to blocklist by @feruzm in #1696
- chore(dmca): add 13 further image entries to blocklist by @feruzm in #1697
- fix(deploy-skew): prevent TypeError: matchAll is not a function on older Safari by @sentry[bot] in #1698
- fix(sentry): collapse browser-injected stack-overflow noise into one bucket by @feruzm in #1700
- chore(skills): correct the repo skills against the current code by @feruzm in #1703
- chore(skills): resolve self-contradictions, drop the fragile counts by @feruzm in #1705
- Improve mobile page hero screenshots by @feruzm in #1706
- fix(notifications): handle the whole follow family, not just follow by @feruzm in #1708
- fix(decks): hide self-only notification types when viewing another account by @feruzm in #1709
- @ecency/sdk: favorite tags query options and mutations by @feruzm in #1714
- Follow hashtags: chips, tag feed header, Topics pinning, Tags tab by @feruzm in #1715
- Notifications: the tags type for posts carrying a followed hashtag by @feruzm in #1716
- Tag chips: no page progress bar, loader on the chip, community title for community ids by @feruzm in #1718
- Offer a tag digest by email on tag pages and chips by @feruzm in #1720
- SDK: read received HP delegations from balance-api by @feruzm in #1724
- hivesigner-redirect-uris: leave json_metadata empty so the posting key suffices by @feruzm in #1726
- Honeyback pages: /honeyback-about and /honeyback-privacy by @feruzm in #1729
- Honeyback logo: Nunito embedded so the wordmark renders whole by @feruzm in #1730
- feat: curation desk (/curation) with on-chain recommendations by @feruzm in #1731
- Refresh homepage design while preserving performance and SEO by @feruzm in #1732
- fix: curation desk review follow-ups by @feruzm in #1733
- Recommender scorecard, trusted chip and the recommending-well guide chapter by @feruzm in #1734
- Enable the curation desk by default by @feruzm in #1735
- Carry DESK_INTERNAL_TOKEN into the vapi service from a repository secret by @feruzm in #1737
- Allow the deploy workflows to be started by hand by @feruzm in #1738
- Improve curation desk layout and simplify post links by @feruzm in #1740
- chore(deps): bump @tiptap/core to 2.27.3 (GHSA-cp6q-959q-f8rh) by @feruzm in #1739
- fix: Guard against null locale in navigation-locale-watcher by @sentry[bot] in #1741
- fix: Handle non-existent Hivemind tags on feed pages by @sentry[bot] in #1736
- fix(i18n): Prevent TypeError in setDayjsLocale when current-language is null by @sentry[bot] in #1722
- Fix curation guide typography and the doubled external-link icon by @feruzm in #1743
- Drop reputation and account age from curation desk rows by @feruzm in #1744
- Guide: soften the delegation figures by @feruzm in #1745
- Guide: soften the share of trail votes inside 24 h by @feruzm in #1746
- Move the Ecency source mark onto the thumbnail, and fix the blue chip in dark by @feruzm in #1747
- Replace the app label with a source glyph on the thumbnail by @feruzm in #1748
- fix(render-helper): strip the Lumen "Posted via" byline by @feruzm in #1728
- Curation desk: open My marks on every state, and remember the refine filters by @feruzm in #1751
- Stop re-sending beneficiaries when a wave is edited by @feruzm in #1752
- fix: date the sent digests card by the send, not the period start by @feruzm in #1750
- Curation desk: keep the curator's place when the queue head moves by @feruzm in #1753
- Curation desk: hand off per curator, and retire the shared team cursor by @feruzm in #1754
- fix(feed): cap and strip author-set description in list card summary by @feruzm in #1757
- Curation desk: reply and Points from the quick view, and a 12 h window by @feruzm in #1755
- fix: anchor the logged-out /my redirect, keep the chunk-reload guard out of the fragment by @feruzm in #1758
- Unify reading layouts and site navigation by @feruzm in #1759
- Unify page backgrounds and content surfaces by @feruzm in #1760
- Place the chat button after Write in the desktop navbar by @feruzm in #1761
- Show a small cover thumbnail on phone-width curation desk rows by @feruzm in #1762
- Curation desk: present j/k as down/up the list, not next/previous by @feruzm in #1763
- Curation desk: use the shared TimeLabel for the row clock by @feruzm in #1764
Full Changelog: 4.4.1...4.4.2