Conversation
…low (#26438) ref https://linear.app/ghost/issue/BER-3295 Members with expired offer discounts were blocked from seeing or claiming retention offers because the guards only checked for `offer_id` presence. The new `hasActiveOffer` utility checks `discount_start`/`discount_end`, active trials, and falls back to offer duration lookup for legacy data
ref https://ghost.slack.com/archives/C02G9E68C/p1771428472410089 - improved looping logic and resilience to errors - added dry run option
ref #26449 This PR was intended to bump Portal, however the CI job that ran to validate the Portal bump ran before the bump happened, leading to a false pass.
ref https://github.com/TryGhost/Ghost/actions/runs/22150423065/job/64040429159 The "Can browse reporters for a comment" and "Can browse comment likes" tests were flaky because they created multiple reports/likes without explicit timestamps. When both were created in the same millisecond, the `order: 'created_at desc'` query returned results in non-deterministic order, causing snapshot mismatches. Added explicit created_at timestamps using db.knex().update() to ensure deterministic ordering, matching the pattern already used in the "Orders reports/likes by created_at desc" tests.
This test-only change should have no user impact.
This test-only change should have no user impact.
no ref This test-only change should have no user impact.
closes https://linear.app/ghost/issue/BER-3350/ closes #26473 - Fixed the settings page not being scrollable at mobile sizes (below 860px) when the sidebar is hidden - The page wrapper only applied `fixed` positioning and `h-full` at the `tablet` breakpoint, so on smaller screens the content area had no height constraint and `overflow-y-scroll` had no effect - Applied `fixed left-0 top-0 flex h-full` at all sizes so the content scroller works on mobile too
This test-only change should have no user impact.
ref https://linear.app/ghost/issue/NY-1044/ ref TryGhost/Koenig#1736 - added additional plugins and nodes behind feature flag This change requires either yarn link'ing with the above PR or bumping Koenig in Ghost after merging the PR. We have a few rough edges with styles (bookmarks, callouts) and a few pieces that don't fully work (image + file cards require fileUpload hook), snippets (require cardConfig) that we can bite off sequentially.
no ref This test-only change should have no user impact.
no ref This test-only change should have no user impact.
no ref This test-only change should have no user impact.
no ref This test-only change should have no user impact.
no ref This test-only change should have no user impact.
no ref This test-only change should have no user impact.
ref 8b12475 This was supposed to contain the lock file.
…orrect results (#26458) ref https://linear.app/ghost/issue/ONC-1446/member-filtering-issue This commit updates @tryghost/nql to v0.12.10, which includes a [fix](TryGhost/NQL@9047935) for a bug in Ghost Admin's member filtering when more than one date based filter is applied. ## Summary When filtering members in Admin using the following filters, Ghost was returning members that should not have been included in the results: - Member status: paid - Stripe Subscription Status: active - Billing Period: Monthly - Next Billing Date: on or after Feb 1, 2026 - Next Billing Date: on or before Feb 28, 2026 The filtering was also order dependent - if you swapped the two filters on Billing Date, the results could be completely different. ## Root cause NQL would treat the above filters as two separate sub queries: 1. Member status: paid, subscription status: active, billing period: monthly, next billing date >= Feb 1, 2026 2. Next billing date <= Feb 28, 2026 The additional date-based filter was being split into its own subquery, such that any member with any subscription with a next billing date prior to Feb 28, 2026 would be included in the results - regardless of whether the matching subscription was active or billed monthly. The ordering was also important, because it's always the second condition that gets orphaned into its own subquery, and would return different results. ## Fix The fix for this bug was in NQL [here](TryGhost/NQL@9047935). Ultimately it ensures that range based filters, like our next billing date filter, are grouped into the same subquery, rather than split out into its own subquery. This prevents members with e.g. cancelled subscriptions with a next billing date in the past from being included in the example query above.
no ref With the update to the React-based Admin app, we've overhauled the dev setup to lean fully into Docker. This commit removes the old/legacy setup to prevent confusion on what's the intended way to develop with Ghost. The `dev.js` script has handled many tasks in the past. It appears to me as if the browser tests are the only necessary use case right now, so I've stripped away the unnecessary pieces and moved/renamed it to a dedicated script describing its purpose.
No ref. Our popovers had excessive top margin so I removed it. Also improved the ordering of the elements in the user details modal, made the delete action destructive and updated the delete modal phrasing to make sense. | Before | After | |--------|--------| | <img width="336" height="234" alt="Screenshot 2026-02-18 at 20 17 28" src="https://github.com/user-attachments/assets/e3a080b4-7d8c-475e-ac02-3043a22f0240" /> | <img width="369" height="236" alt="Screenshot 2026-02-18 at 20 17 06" src="https://github.com/user-attachments/assets/8038b5c2-296a-4bc1-adc3-6e5bf49b137d" /> |
**Changes:** Updated the Bulgarian translation of `comments.json` and `portal.json` to include recently added strings. Refined some existing translations for better clarity, conciseness, and improved UI consistency. <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Translation-only JSON string updates with no logic changes; risk is limited to minor UI text regressions or missing translations. > > **Overview** > **Updates Bulgarian (`bg`) UI translations** for comments and Portal by filling in previously empty strings and refining wording for consistency. > > This adds missing labels/messages (e.g., commenting restrictions, admin view link, billing/next payment, “open mail provider” actions, and billing-update failures) and tweaks several existing phrases from “актуализиран/актуализиране” to “обновен/обновяване” and similar copy edits. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 5f64dd7. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> --------- Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
no ref This test-only change should have no user impact.
no ref This test-only change should have no user impact. `git grep -F .should.` returns no results after this change.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
See Commits and Changes for more details.
Created by
pull[bot] (v2.0.0-alpha.4)
Can you help keep this open source service alive? 💖 Please sponsor : )