What's Changed
- fix: restore snippet edit + optimistic wave vote updates by @feruzm in #1016
- Block exchange-like and uid-numeric usernames at signup by @feruzm in #1017
- fix(sentry): drop synthetic DOM Event captures in beforeSend by @feruzm in #1018
- feat(api): add /api/speak-audio transcode endpoint for Liketu Speak voice posts by @feruzm in #1019
- Recognize snapie.io and hivesuite.app post links by @feruzm in #1021
- fix(vote): open vote slider without blocking on the previous-vote fetch by @feruzm in #1022
- fix(sentry): broaden Firefox contentWindow null error filter by @sentry[bot] in #1020
- fix(profile): paint profile card above the fold without a hydration-gated fade by @feruzm in #1023
- perf(ssr): strip active_votes from anonymous feed + profile SSR payloads by @feruzm in #1024
- fix(vote-strip): strip the profile feed's initialFeed prop (RSC props channel) by @feruzm in #1025
- perf(feed): defer per-card ProfilePopover machinery + content-visibility below the fold by @feruzm in #1026
- fix(sentry): prevent unhandled rejection from key-input error re-throw by @sentry[bot] in #1027
- feat(mobile): smaller waves publish, header notification actions, wavy-dash Waves icon by @feruzm in #1028
- feat(waves): show tip count + already-tipped state in the waves feed by @feruzm in #1031
- chore(waves): remove the dead masonry feed view by @feruzm in #1032
- feat(waves): pinnable custom-feed tag tabs with a scrollable tab bar by @feruzm in #1034
- feat(waves): source (container) custom feeds + 50/50 base tabs by @feruzm in #1035
- fix(waves): show the feed tip count even when 0 (mobile parity) by @feruzm in #1036
- fix(sentry): prevent unhandled rejection from empty post body error by @sentry[bot] in #1033
- fix: prevent unhandled rejections from missing account and failed post-link lookups by @feruzm in #1038
- feat(waves): Shorts (reels) tab + SDK shorts feed query by @feruzm in #1039
- fix(waves): bare 3Speak player in reels + clean caption by @feruzm in #1040
- fix(waves): cap quoted-wave embed depth at one level by @feruzm in #1041
- Recover stale tabs from deploy skew without a service worker by @feruzm in #1042
- Remove Hive account and Hive post chip labels from rendered content by @feruzm in #1043
- fix(waves): keep shorts reel engagement controls legible by @feruzm in #1044
- feat(waves): native HLS reels player (fill, aspect-aware) by @feruzm in #1045
- fix(sentry): reclassify Safari iframe teardown error by @sentry[bot] in #1046
- fix(waves): shorts reel crash (React #130) — curated mute icon by @feruzm in #1047
- fix(waves): align reel engagement rail + show vote & tip counts by @feruzm in #1048
- fix(waves): reel like = tap-to-upvote heart (drop chevron + slider) by @feruzm in #1049
- Show Ecency source badge across feeds, comments and search by @feruzm in #1051
- feat(entry): durable on-post internal links + visible breadcrumb by @feruzm in #1050
- fix(routing): resolve bare community URL /hive-NNNNN (404) by @feruzm in #1052
- refactor(entry): compact 3-column related footer by @feruzm in #1053
- feat(profile): crawlable numbered archive pages for author sections by @feruzm in #1054
- feat(feed,community): cursor-token archive pagination for tag + community feeds by @feruzm in #1055
- feat(sdk): REST-node runtime config, escalating 429 backoff, and getAccountFull round-trip reduction by @feruzm in #1056
- feat(seo): consistent brand title + social-card metadata by @feruzm in #1057
- test: drop hapi.ecency.com from web read-node pool (hapi-decommission canary) by @feruzm in #1058
- Attribute and reclassify stackless script-parse errors in Sentry by @feruzm in #1059
- feat(seo): snippet quality, hub breadcrumbs, archive-gate pin fix by @feruzm in #1060
- fix(sdk): keep every pinned entry in ranked community feeds by @feruzm in #1061
- chore(packages): link ecency.com from package homepages and READMEs by @feruzm in #1062
- Remove SPK Network support by @feruzm in #1063
- fix(sdk): drop hapi from restNodes default (+ techcoderx; add syncad) by @feruzm in #1064
- feat(seo): State of the Hive Creator Economy report page by @feruzm in #1065
- fix(creator-economy): layout wrapper, svg titles, chart a11y by @feruzm in #1066
- feat(creator-economy): internal links + footer discovery link by @feruzm in #1067
- feat(sdk): adaptive read timeouts + budgeted hedged reads for tail latency by @feruzm in #1069
- fix(creator-economy): six quarters, authors-ranked communities, curation section by @feruzm in #1068
- fix: integer adaptive timeout delay (sdk) + stuck notifications sidebar (ui) by @feruzm in #1070
- refactor: replace framer-motion with a CSS animation system by @feruzm in #1072
- feat(ui): micro-interaction animation polish by @feruzm in #1073
- feat(creator-economy): full history since the Hive fork (25 quarters) by @feruzm in #1074
- feat(creator-economy): hover values on trend lines by @feruzm in #1075
- Surface Translate CTA when reader and post languages differ by @feruzm in #1076
- chore: drop Chainstack/Chainz env plumbing by @feruzm in #1078
- Add compose-side translation to publish editor by @feruzm in #1080
- Points top-up CTA at insufficient-balance moments by @feruzm in #1077
- Streak Freeze: buy UI + SDK by @feruzm in #1081
- Add post templates to publish flow by @feruzm in #1079
- ci: drop decommissioned SG origin from prod deploy by @feruzm in #1082
- Fix publish menu crash: missing icon in local unicons by @feruzm in #1083
- Surface save-as-template in the publish action menu by @feruzm in #1084
- Blog hosting launch — pricing, x402, card via ePoints (hosting-api) by @feruzm in #1085
- Surface daily quest and streak in composers by @feruzm in #1086
- Require GFM adjacency for translate table detection by @feruzm in #1088
- Add scheduled post published notification type by @feruzm in #1089
- Blog hosting signup page (card + HBD) by @feruzm in #1090
- Add scheduled posts to the notifications filter menu by @feruzm in #1091
- Stub SVGAnimatedString for browsers with SVG interfaces disabled by @feruzm in #1092
- Hosting: default to live API + lazy-load Stripe by @feruzm in #1093
- Hosting: allow api.blogs.ecency.com in CSP connect-src by @feruzm in #1094
- feat(pro): purchasable Ecency Pro membership and profile badge by @feruzm in #1095
- fix(sdk): skip vote cache update when entry already reflects the vote by @feruzm in #1096
- Perks: tidy the Pro/AI/spin row + card graphics by @feruzm in #1097
- Pro: unlock any creator's Insights for Pro members by @feruzm in #1098
- Gate profile insights behind a server-verified viewer by @feruzm in #1099
- Hosting: honor plan on internal activate (Pro tier) by @feruzm in #1100
- Hosting: idempotent Pro upgrade on activate + echo actual plan by @feruzm in #1101
- feat(hosting): Custom domain add-on and Ecency Pro free-blog bundling by @feruzm in #1102
- Hosting: apply signup config overrides (title/theme/style) to new tenants by @feruzm in #1103
- self-hosted: owner-based gating and community authoring by @feruzm in #1104
- Add Community option to hosting signup by @feruzm in #1105
- hosting: community-instance hosting (decouple owner from showcased account) by @feruzm in #1106
- Hosting card checkout: optional target tenant by @feruzm in #1107
- feat(hosting): add /hosting entry points on perks and home by @feruzm in #1108
- Hosting: enable card payment for community instances by @feruzm in #1109
- Hosting: internal activate refuses a payer that does not own the tenant by @feruzm in #1110
- Support Ecency: beneficiary preference and curation holdback settings by @feruzm in #1111
- Fiat gift rail: buy Points for another user by card by @feruzm in #1112
- DecentMemes merge: match existing beneficiary accounts case-insensitively by @feruzm in #1113
- Perks: Support Ecency discovery card by @feruzm in #1114
- fix(sdk): cross-validate account metadata and never shrink profile merge base by @feruzm in #1115
- feat(waves): onboarding checklist card for new users + empty-feed state by @feruzm in #1116
- chore(sdk,web): remove decommissioned hapi.ecency.com references by @feruzm in #1119
- ci: pin npm to 11 for package publish (npm 12.0.0 sigstore regression) by @feruzm in #1120
- docs(sdk): correct module list in README by @feruzm in #1121
- fix(sdk): handle RPCError: missing required posting authority in Transaction.broadcast by @sentry[bot] in #1118
- fix(waves): onboarding checklist review fixes by @feruzm in #1117
- feat(feed): nudge empty personal feed toward Waves + getting-started guide by @feruzm in #1125
- fix(rss): validate sort parameter for community RSS feeds by @sentry[bot] in #1123
- fix(post-renderer): prevent TypeError on detached iframe contentWindow by @sentry[bot] in #1124
- fix(chat): keep unread DMs visible so the badge stays clearable by @feruzm in #1122
- fix(chat): keep realtime unread badge in lockstep with the route's eligibility by @feruzm in #1126
- fix(rss): suppress crawler-induced upstream errors on feed routes by @feruzm in #1127
- fix(points): handle non-JSON claim response and stop unhandled claim rejections by @feruzm in #1129
- Add translate.ecency.com to report-only CSP connect-src by @feruzm in #1133
- Bound vapi container logs in the vision stack files by @feruzm in #1134
- fix(sdk): handle null RPC response in get-account-full-query-options by @sentry[bot] in #1131
- fix(accounts): prevent TypeError when RPC returns null for get_accounts by @sentry[bot] in #1132
- Document deployment topology in CLAUDE.md by @feruzm in #1135
- fix(ui): comment delete silently failing (confirm popover unmounted by dropdown click-away) by @feruzm in #1136
- feat(sdk): send X-Ecency-Client header on search API requests by @feruzm in #1137
- perf(cwv): community-page LCP cover + modal-open CLS by @feruzm in #1139
- fix(sentry): suppress minified webkit.messageHandlers TypeErrors by @sentry[bot] in #1138
- Show post thumbnails in the notification list by @feruzm in #1140
- Fix the dead deck flag on notification rows by @feruzm in #1141
- Show thumbnails on bookmark and favorite notifications by @feruzm in #1142
- Add the missing notification image fields and payouts type to the sdk by @feruzm in #1143
- Show a thumbnail on payout notifications by @feruzm in #1144
- Fix import from URL fetching by @feruzm in #1145
- Reclassify unhandled cancellation AbortErrors and stop market refetch churn by @feruzm in #1146
- fix(sentry): suppress 'Account does not exist' errors for RSS by @sentry[bot] in #1147
- fix(follow-controls): handle null API response for relationships by @sentry[bot] in #1148
- fix(chat): failure-aware backoff and rate-limit pause for chat polling by @feruzm in #1149
- Fall back to body summary for title-less post titles by @feruzm in #1151
- fix(tiptap-editor): ensure blockquotes have valid content by @sentry[bot] in #1150
- fix(sdk): prevent unhandled error on mark-notifications-read without auth by @sentry[bot] in #1152
- Hosting: working config saves, onboarding steps, custom domains for communities by @feruzm in #1153
- Hosting: verify login challenge against every posting key by @feruzm in #1154
- Self-hosted: sign with any Hive extension, picker when multiple installed by @feruzm in #1155
- Self-hosted: land on the first configured post filter by @feruzm in #1156
- Hosting: close free-blog hole, fix x402 settlement, harden payment listener, tenant meta tags by @feruzm in #1157
- Hosting web: restore login on /hosting, guard renewal, fix card-decline dead-end by @feruzm in #1158
- fix(signup): prevent RPCError from invalid usernames in debounced check by @sentry[bot] in #1159
- Fix hosting payment races and activation retries by @feruzm in #1160
- Hosting API: per-IP rate limiting + stop stranding paid transfers on transient errors by @feruzm in #1161
- Self-hosted: fix search-crash, comment refetch, and publish redirect by @feruzm in #1162
- UI: fix unreadable danger Alert (low-contrast red-on-red) by @feruzm in #1165
- fix(sentry): suppress Firefox 'e[t] is undefined' deploy-skew errors by @sentry[bot] in #1163
- Hosting: auto-delete abandoned unpaid tenants after a grace window by @feruzm in #1164
- Hosting: one-click HBD pay + surface custom domains to standard plans by @feruzm in #1166
- Hosting: one-step HBD custom domain (parity with card, +1 HBD/mo) by @feruzm in #1167
- Hosting: community-aware configure copy + finalize a pending reservation by @feruzm in #1168
- Hosting: prorated custom-domain upgrade for active standard tenants by @feruzm in #1169
- fix(hosting): atomic prorated custom-domain upgrade + re-confirm changed quote by @feruzm in #1170
- fix(hosting): guide custom-domain users to disable the DNS proxy by @feruzm in #1171
- feat(hosting): claim landing for unclaimed *.blogs.ecency.com subdomains by @feruzm in #1172
- feat(ai-image): recover delivery-pending generations via reused idempotency key by @feruzm in #1173
- feat(publish): AI-usage disclosure via interoperable ai_tools metadata by @feruzm in #1174
- fix: address code-review findings (security, correctness, deps) by @feruzm in #1175
- fix(render-helper): make markdown-link image scan linear (no ReDoS) by @feruzm in #1176
- ci: add workspace lint gate (pnpm -r lint) + clear last lint errors by @feruzm in #1177
- fix(render-helper): preserve first-image URLs containing a literal [ by @feruzm in https://github.com//pull/1178
- chore(deps): clear remaining audit advisories (6 → 0) by @feruzm in #1179
- fix(types): make render-helper + wallets typecheck-clean by @feruzm in #1180
- fix(types): annotate implicit-any params in web (TS7006, chunk 1) by @feruzm in #1181
- fix(types): type infinite queries as InfiniteData in SDK factories by @feruzm in #1183
- fix(types): declarations, dead code and unsafe casts in web (chunk 3) by @feruzm in #1185
- fix(hosting): dotted Hive account names + Buffer crash in image proxy by @feruzm in #1184
- fix(render-helper): close embed host spoofing and link policy bypasses by @feruzm in #1186
- fix(keys): derive the posting key for posting-authority signing by @feruzm in #1187
- fix(icons): drop unicons alias, patch the package to be tree-shakeable by @feruzm in #1188
- fix(types): correct SDK declarations that understate their payloads by @feruzm in #1189
- fix(docker): copy patches before pnpm install by @feruzm in #1190
- fix(types): preserve the entry generic and strip null in the entries cache by @feruzm in #1191
- chore(icons): drop dead exports and source duplicated glyphs from the package by @feruzm in #1193
- ci: cancel superseded CI runs, serialise deploys and publishes by @feruzm in #1192
- fix(types): align react-query v5 helper signatures and call sites by @feruzm in #1194
- fix(types): remove unreachable operators and stale declarations by @feruzm in #1195
- ci(self-hosted): drop the duplicate main deploy by @feruzm in #1196
- chore(hosting): track the origin nginx and certificate automation by @feruzm in #1199
- refactor(icons): collapse 144 cross-file name collisions to one definition each by @feruzm in #1197
- docs: record hosting deploy behaviour and the Node-globals constraint by @feruzm in #1200
- fix(types): clear the remaining web type errors and gate typecheck in CI by @feruzm in #1198
- refactor(types): fix the declarations that were forcing casts by @feruzm in #1202
- fix(icons): size the entry-votes icon for the package glyph by @feruzm in #1203
- fix(types): satisfy Next's route and layout contracts by @feruzm in #1204
- refactor(types): remove the last draft and market-asset casts by @feruzm in #1205
- Rename AI Summarize label to Recap by @feruzm in #1207
- Show Ecency Pro checkmark wherever a username renders; mute the source badge by @feruzm in #1206
- chore(deps): bump the npm_and_yarn group across 2 directories with 1 update by @dependabot[bot] in #1208
- fix(self-hosted): render YouTube and 3Speak video embeds by @feruzm in #1209
- feat(icons): sizing convention bundle 1 - zero-visual foundations by @feruzm in #1211
- fix(submit): prevent TypeError when draftsQuery.data is undefined by @sentry[bot] in #1210
- feat(icons): sizing convention bundle 2 - rule retirement at identical pixels by @feruzm in #1212
- Note that a private-api 401 is often not the user's token by @feruzm in #1213
- fix(chat): hide Mattermost default channels from channel search by @feruzm in #1215
- feat(icons): sizing convention bundle 3 - deliberate visual deltas by @feruzm in #1216
- fix(decks): balance column values and a pass over column rendering issues by @feruzm in #1214
- Upload a single picked image right away, accept AVIF by @feruzm in #1217
- fix(sdk): price engine tokens by held symbol instead of scanning a capped page by @feruzm in #1218
- feat(icons): sizing convention bundle 4 - votes cluster and mixin dismantle by @feruzm in #1219
- feat(icons): sizing convention bundle 5 - lock enforcement by @feruzm in #1224
- Validate the chat channel id instead of asserting it by @feruzm in #1223
- Read the curation hp field instead of the vests alias by @feruzm in #1225
- chore(deps): bump @hono/node-server from 1.19.14 to 2.0.11 in /apps/self-hosted/hosting/api in the npm_and_yarn group across 1 directory by @dependabot[bot] in #1220
- test(sentry): guard hydration filters against quote/property over-match by @feruzm in #1226
- chore(deps): bump dompurify from 3.4.11 to 3.4.12 in the npm_and_yarn group across 1 directory by @dependabot[bot] in #1227
- fix(seo): prune posts-1.xml from retired sitemap shards by @feruzm in #1228
- fix(publish): use # glyph instead of £ icon in tag suggestions by @feruzm in #1230
- feat(notifications): sync filter tabs and push toggles across all types by @feruzm in #1229
- fix(publish): commit the clicked tag suggestion, not the typed prefix by @feruzm in #1231
- fix(decks): stop rendering raw "Query: {{query}}" in search column labels by @feruzm in #1232
- fix(bridge-requests): validate API response as array before resolving posts by @sentry[bot] in #1233
- chore(deps): bump the npm_and_yarn group across 2 directories with 1 update by @dependabot[bot] in #1234
- test(bridge-requests): cover non-array API response handling by @feruzm in #1235
- fix(submit): handle missing title in local drafts by @sentry[bot] in #1236
- fix(publish): deliver overflowing waves and deck threads to the composer by @feruzm in #1237
- fix(cache): make the category->canonical post redirect edge-cacheable by @feruzm in #1240
- fix(entry): prevent TypeError when scrolling to comment box by @sentry[bot] in #1238
- fix(wallet): map set_withdraw_vesting_route to the withdraw routes operation by @feruzm in #1241
- fix(sdk): resolve query client per request instead of per process by @feruzm in #1242
- fix(web): shorten server-side query gcTime to bound the retained set by @feruzm in #1245
- fix(observer): default to the ecency observer whenever nobody is logged in by @feruzm in #1244
- chore(deps-dev): bump postcss from 8.5.15 to 8.5.18 in the npm_and_yarn group across 1 directory by @dependabot[bot] in #1243
- fix(speech): filter undefined voices from getVoicesAsync by @sentry[bot] in #1239
- fix(sdk): bound query gcTime during SSR at the source by @feruzm in #1246
- fix(mutes): page the full mute list instead of taking the first 100 by @feruzm in #1247
- chore: apply changeset versioning for PR #1247 by @feruzm in #1248
- Fix auto thumbnail seek position and submit editor passthrough by @feruzm in #1249
- fix(renderer): embed Odysee watch links and revive dead video placeholders by @feruzm in #1250
- Use the shared 3Speak beneficiary constants at every call site by @feruzm in #1251
- fix: say low reputation, not new account, in low-trust post warnings by @feruzm in #1252
- Move the 3Speak beneficiary rule into @ecency/sdk by @feruzm in #1253
- fix(web): make the feed's LCP thumbnail discoverable early by @feruzm in #1254
- fix: audit-log the internal hosting endpoints, space the Pro badge from following text by @feruzm in #1255
- fix(render-helper): proxy legacy hive/steemit images through /p/ by @feruzm in #1256
- docs: document htmlLimitedBots dimension in the SSR cache key by @feruzm in #1258
- fix: stop shipping active_votes to anonymous visitors on post, community and wave pages by @feruzm in #1260
- refactor: derive the dehydration filter key from the SDK QueryKeys builder by @feruzm in #1263
- fix: move the dark class to documentElement and drop the dead embed header read by @feruzm in #1264
- fix(chat): keep a live ban from reactivating a deactivated account by @feruzm in #1267
- feat(chat): rate-gate DM fan-out at send time by @feruzm in #1268
- fix: keep vertical videos vertical on hosted blogs and ecency.com by @feruzm in #1270
- feat(sdk): read post tips over GET and align pro-members freshness by @feruzm in #1273
- fix(self-hosted): size mention and tag chips, and stop them linking nowhere by @feruzm in #1276
- feat(render-helper): render author and tag chips inert on self-hosted blogs by @feruzm in #1277
- fix(editor): draft saving and cross-route draft leaks in both composers by @feruzm in #1278
- fix(self-hosted): stop linking commenter names to a route that does not exist by @feruzm in #1282
- fix(publish): drop the draft binding when the composer is cleared by @feruzm in #1283
- test(self-hosted): scope link exemptions per file and tighten identifier resolution by @feruzm in #1284
- feat(sdk): transcription hooks and a label for burned points by @feruzm in #1285
- feat(publish): dictate posts from the editor toolbar by @feruzm in #1286
- fix(chat): count first DMs and drop phantom unreads by @feruzm in #1288
- fix(web): allow the microphone for our own origin, move dictate next to video by @feruzm in #1289
- fix(publish): show the dictation rate, not the cost of a minimum clip by @feruzm in #1291
- chore(web): bump version to 4.4.1 by @feruzm in #1294
- fix(sdk): page community subscribers and stop swallowing activity errors by @feruzm in #1293
- feat(publish): transcribe on stop, matching mobile by @feruzm in #1295
- fix(community): gate avatar and cover edit on the active user by @feruzm in #1296
- fix(self-hosted): key dark: utilities off the instance theme, not the OS by @feruzm in #1307
- fix(self-hosted): stop config values from blanking the whole blog by @feruzm in #1305
- fix(self-hosted): stop the edit flow from rewriting post bodies by @feruzm in #1304
- fix(self-hosted): tighten tenant creation and config publication by @feruzm in #1309
- fix(self-hosted): custom domain ownership, verification races and squatting by @feruzm in #1310
- fix(self-hosted): mount the tenant config volume in the payment listener by @feruzm in #1306
- fix(self-hosted): rate limit /v1/internal and require a strong shared secret by @feruzm in #1314
- fix(self-hosted): make Hivesigner login possible, and sign HiveAuth ops with the right authority by @feruzm in #1317
- fix(sdk): stop ranked-posts pagination at the end of the feed by @feruzm in #1324
- fix(hosting-api): reject config saves the server cannot apply, stop leaking driver errors by @feruzm in #1321
- fix(hosting-api): tie custom domain capabilities to subscription standing, release unverified claims by @feruzm in #1323
- self-hosted: single config to DOM contract, fix save and instance type by @feruzm in #1320
- fix(self-hosted): reader-facing UI and content-filtering defects by @feruzm in #1322
- feat(self-hosted): use the built-in composer on personal blogs by @feruzm in #1326
- fix(self-hosted): speak the HAS protocol for HiveAuth login by @feruzm in #1319
- fix(self-hosted): stop the assert polyfill blanking every instance by @feruzm in #1331
- ci(self-hosted): run tests and the app build on pull requests by @feruzm in #1332
- refactor(sdk): drop the dead hasNextPage page param and stabilise the display select by @feruzm in #1327
- feat(hosting): reconcile Hivesigner redirect URIs against live tenants by @feruzm in #1329
- fix(hosting): restrict /v1/internal to the callers that use it by @feruzm in #1330
- docs(hosting): correct the vhost path and the loopback guidance by @feruzm in #1334
- chore(deps-dev): bump postcss from 8.5.18 to 8.5.23 in the npm_and_yarn group across 1 directory by @dependabot[bot] in #1333
- chore: align the workspace-root eslint with the packages' flat configs by @feruzm in #1336
- chore(deps): bump undici from 6.27.0 to 6.28.0 in the npm_and_yarn group across 1 directory by @dependabot[bot] in #1338
- Self-hosted hosting: make custom-domain attach atomic by @feruzm in #1337
- self-hosted: make Hivesigner setup reachable and explained by @feruzm in #1339
- feat(self-hosted): reader-facing Hive layer by @feruzm in #1340
- feat(self-hosted): expose the Hive layer in the configuration editor by @feruzm in #1341
- self-hosted: cascade layers and theme token registration by @feruzm in #1342
- Fix advanced search query building, validation and error reporting by @feruzm in #1345
- fix(self-hosted): repair a config value stored with the wrong type by @feruzm in #1346
- fix(self-hosted): stop reporting a failed request as an empty one by @feruzm in #1347
- Give every search query the same error and retry handling by @feruzm in #1348
- Reject a successful search body that is not the expected shape by @feruzm in #1351
- self-hosted: derive the appearance from one accent and one font pairing by @feruzm in #1352
- feat(self-hosted): tell an owner their site is configurable by @feruzm in #1350
- Move the search query builder into the SDK by @feruzm in #1353
- feat(self-hosted): composer reward controls by @feruzm in #1349
- self-hosted: let the accent reach the things that look interactive by @feruzm in #1355
- Self-hosted: register each instance's Hivesigner redirect URI and enable the method by @feruzm in #1354
- Self-hosted: say the Hivesigner client id is filled in for hosted blogs by @feruzm in #1357
- Self-hosted: let an owner actually set the accent and the fonts by @feruzm in #1358
- Self-hosted: name the extension that was actually asked to sign by @feruzm in #1360
- chore: rename repository to vision-web by @feruzm in #1363
- Self-hosted: stop naming Keychain on the three remaining signing surfaces by @feruzm in #1362
- Self-hosted: give the accent a colour control and tell the owner when it is wrong by @feruzm in #1364
- Self-hosted: let a HiveAuth session save configuration by @feruzm in #1365
- Self-hosted: have the signer report which wallet actually signed by @feruzm in #1366
- Self-hosted: inline validation for string fields, borrowed from the resolvers by @feruzm in #1367
- Self-hosted: close the two gaps where the panel and the site disagree by @feruzm in #1369
- Self-hosted: remove the config-version control, which could blank a whole site by @feruzm in #1370
- Self-hosted: gate hover styling on devices that can hover by @feruzm in #1371
- Self-hosted: make the configuration panel translatable by @feruzm in #1372
- Translate: run server /detect escalation only for logged-in readers by @feruzm in #1374
- Self-hosted: send "View this post on Hive" to Ecency, not hivehub.dev by @feruzm in #1375
- Fix two tests from the #1375 review that passed without testing anything by @feruzm in #1377
- SDK: update useAccountUpdateRecovery to use AuthContextV2 adapter by @sentry[bot] in #1376
- Add reported image URLs to DMCA blacklist by @feruzm in #1379
- Chat: remove the in-app admin tools panel by @feruzm in #1387
- SDK: auth.broadcast is not deprecated, and a guard so it is not misread again by @feruzm in #1378
- Chat: tell a banned user what happened and when it lifts by @feruzm in #1390
- Chat ban notice: reject non-finite expiry, move ref write into an effect by @feruzm in #1395
- quests: refresh after the backend credits an action, and warn on short replies by @feruzm in #1394
- Bump dompurify from 3.4.12 to 3.4.13 in the npm_and_yarn group across 1 directory by @dependabot[bot] in #1388
- fix(sdk): correct account-history pagination and stop dropping requested ops by @feruzm in #1396
- fix(wallet): drop RPC nodes that serve accounts without metadata by @feruzm in #1397
- waves: warn that a wave too short to earn points will not count by @feruzm in #1400
- fix(sdk): reach the head of account history and keep the savings fill on its own asset by @feruzm in #1404
- fix(sdk): stop sending account names the node refuses to parse by @feruzm in #1407
- fix(wallets): saving chain addresses no longer deletes engine tokens by @feruzm in #1408
- chore(web): delete dead api/operations module by @feruzm in #1411
- fix(sdk): full-size first page for hafah transactions, no initialData seed on notifications by @feruzm in #1427
- fix(web): let wallet token history load older pages by @feruzm in #1429
- Self-hosted: route editor preview through the config store by @feruzm in #1436
- fix(web): sentry triage for editor drag crash, ui store fan-out and ciphers noise by @feruzm in #1435
- Hosting: single source of truth for the style template roster by @feruzm in #1437
- Self-hosted: theme manifests so a template can own its layout by @feruzm in #1442
- Self-hosted: per-theme option visibility in the Configuration Editor by @feruzm in #1443
- Hosting signup: customize step before payment by @feruzm in #1438
- Hosting: state the reservation grace window where it matters by @feruzm in #1439
- Hosting: land the new owner signed in with the settings panel open by @feruzm in #1441
- Self-hosted: live preview on unclaimed subdomains by @feruzm in #1440
- Tests: stabilize two merged-develop CI failures by @feruzm in #1444
- Match web Pro badge to mobile checkmark style by @feruzm in #1445
- Self-hosted: Journal, the first layout-level theme by @feruzm in #1446
- Self-hosted: side thumbnails on Journal entries by @feruzm in #1447
- Hosting: auto-login on the new instance via carried session by @feruzm in #1448
- Self-hosted: Reader theme with a split archive view by @feruzm in #1450
- Hosting: Pro blog claim passes through the customize step by @feruzm in #1456
- Hosting: manage panel becomes a remote settings surface by @feruzm in #1457
- Self-hosted: About page, read time, link unfurls and a guided Configuration Editor by @feruzm in #1458
- Hosting: one-time exchange code for the signup session handoff by @feruzm in #1459
- Self-hosted: coherent versioning across images, configs and templates by @feruzm in #1460
- Self-hosted: static SEO files, canonical policy and responsive media by @feruzm in #1463
- Page the per-tenant SEO feed at the bridge's own limit by @feruzm in #1464
- Independent deployment: compose-config endpoint and deployment docs by @feruzm in #1465
- Hosting signup: free self-host branch with a downloadable deployment bundle by @feruzm in #1466
- Self-hosted: add a Gallery layout for image-led blogs by @feruzm in #1470
- Self-hosted: give Magazine a hero-plus-rows archive by @feruzm in #1472
- Self-hosted: add a Terminal layout, the Developer aesthetic as a console by @feruzm in #1473
- Self-hosted: retire the two layout options nobody chose by @feruzm in #1475
- perks: compare buy-with-hive amount to balance numerically by @feruzm in #1476
- docs: correct the repo docs against what the code actually does by @feruzm in #1478
Full Changelog: 4.4.0...4.4.1