Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
caefa51
Fixed the portal date picker tests failing once the real month moved on
rob-ghost Sep 1, 2026
833f194
Removed stale dependents from allow_self_signup (#30379)
sagzy Sep 1, 2026
0160c7c
Fixed dev container stops skipping Ghost's shutdown
rob-ghost Aug 27, 2026
59ffc26
Added a dev mode that receives Stripe webhooks at Ghost's pinned API …
rob-ghost Aug 27, 2026
6e2244f
Added an error log for Stripe webhooks rendered at an unexpected API …
rob-ghost Aug 27, 2026
b2b7afc
Changed custom field filtering to derive a field's operators from its…
rob-ghost Aug 31, 2026
96c886a
Fixed a bound custom field addressing claiming other fields' clauses
rob-ghost Aug 31, 2026
cf5f7af
Changed member filter sources to load custom field definitions up front
rob-ghost Aug 31, 2026
b147f4c
Added declared types to a composite field's parts
rob-ghost Sep 1, 2026
b8ddc79
Changed custom field filtering to derive from declared types
rob-ghost Sep 1, 2026
13d2f8a
Changed local Stripe development to a single dev:stripe command
rob-ghost Sep 1, 2026
51adc5b
Fixed gift form state across Stripe checkout (#30279)
jonatansberg Sep 1, 2026
de37ed0
Changed the color scale to one gray spelling (#30341)
9larsons Sep 1, 2026
d65d61c
Fixed a flaky member detail E2E test failing during teardown (#30420)
acburdine Sep 1, 2026
2478bf7
Fixed the delivery date picker opening on the current month (#30413)
sagzy Sep 1, 2026
4201aff
Trimmed cached c8 coverage artifacts (#30422)
acburdine Sep 1, 2026
0b8af54
Updated pnpm to v12 (#30419)
acburdine Sep 1, 2026
46e8711
Added a shared identity vocabulary for member metafields
rob-ghost Aug 31, 2026
75c1204
Changed member custom field definitions to namespaced metafield routes
rob-ghost Aug 31, 2026
b965f4f
Changed member custom field values to a namespaced metafields payload
rob-ghost Aug 31, 2026
bb70f8b
Changed member custom field filters to leaf-address metafield grammar
rob-ghost Aug 31, 2026
f61652a
Changed member custom field CSV columns to the metafield address
rob-ghost Aug 31, 2026
c1742a9
Changed metafield namespaces to flow as data above the storage layer
rob-ghost Aug 31, 2026
5058b01
Changed the filter picker to build field ids from the definition's na…
rob-ghost Sep 1, 2026
fdc7620
Changed metafields code to carry what its comments explained
rob-ghost Sep 1, 2026
0dd1655
Removed the legacy custom_fields CSV column fallback
rob-ghost Sep 1, 2026
733862a
🐛 Fixed unsubscribe links affecting the wrong member when logged in (…
sagzy Sep 1, 2026
e660aa1
🎨 Updated Casper to v5.12.3
github-actions[bot] Sep 1, 2026
fa9ff5a
🎨 Updated Source to v1.7.3
github-actions[bot] Sep 1, 2026
b88c3e1
v6.62.0
github-actions[bot] Sep 1, 2026
5cf4d45
Bumped version to 6.62.1-rc.0
github-actions[bot] Sep 1, 2026
0d3a99e
Changed member and comment filters to match post lists (#30424)
peterzimon Sep 1, 2026
fc8d311
Ignore changeset ledger in oxfmt (#30431)
acburdine Sep 1, 2026
e87001d
Fixed a flaky members import E2E test opening a member detail (#30429)
acburdine Sep 1, 2026
6bfeba5
Fixed PR checks blaming the branch for the base branch's own drift
rob-ghost Sep 1, 2026
33ae1b4
Removed @9larsons from Tinybird codeowners (#30432)
EvanHahn Sep 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .changeset/changelogs/@tryghost!admin@0.0.0.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
## 0.0.0

### Patch Changes

- Updated dependencies:
- @tryghost/kg-unsplash-selector@0.4.5
- @tryghost/koenig-lexical@1.9.4
5 changes: 5 additions & 0 deletions .changeset/changelogs/@tryghost!kg-default-nodes@2.2.1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
## 2.2.1

### Patch Changes

- Updated Ghost docs links to new URLs
7 changes: 7 additions & 0 deletions .changeset/changelogs/@tryghost!kg-unsplash-selector@0.4.5.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
## 0.4.5

### Patch Changes

- Changed Tailwind color classes from the grey spelling to gray, matching the palette used by consuming apps; koenig-lexical aliases gray to the same scale so those utilities are generated in its own bundle

- Fixed the Unsplash selector not following dark mode
9 changes: 9 additions & 0 deletions .changeset/changelogs/@tryghost!koenig-lexical@1.9.4.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
## 1.9.4

### Patch Changes

- Changed Tailwind color classes from the grey spelling to gray, matching the palette used by consuming apps; koenig-lexical aliases gray to the same scale so those utilities are generated in its own bundle

- Updated Ghost docs links to new URLs

- Fixed the Unsplash selector not following dark mode
6 changes: 6 additions & 0 deletions .changeset/gray-scale-spelling.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@tryghost/kg-unsplash-selector": patch
"@tryghost/koenig-lexical": patch
---

Changed Tailwind color classes from the grey spelling to gray, matching the palette used by consuming apps; koenig-lexical aliases gray to the same scale so those utilities are generated in its own bundle
71 changes: 43 additions & 28 deletions .changeset/ledger.yaml
Original file line number Diff line number Diff line change
@@ -1,124 +1,133 @@
'@tryghost/adapter-base-cache@0.2.0':
"@tryghost/adapter-base-cache@0.2.0":
dir: packages/adapters/cache-base
intents:
- major-areas-fail
- upset-dogs-sort
'@tryghost/adapter-base-scheduling@0.1.1':
"@tryghost/adapter-base-scheduling@0.1.1":
dir: packages/adapters/scheduling-base
intents:
- major-areas-fail
- plain-singers-cheat
'@tryghost/adapter-base-scheduling@0.2.0':
"@tryghost/adapter-base-scheduling@0.2.0":
dir: packages/adapters/scheduling-base
intents:
- fifty-maps-sing
'@tryghost/adapter-base-scheduling@0.2.1':
"@tryghost/adapter-base-scheduling@0.2.1":
dir: packages/adapters/scheduling-base
intents:
- typed-logging-args
'@tryghost/adapter-base-scheduling@0.2.2':
"@tryghost/adapter-base-scheduling@0.2.2":
dir: packages/adapters/scheduling-base
intents:
- open-shirts-arrive
- young-spiders-request
'@tryghost/adapter-base-scheduling@0.2.3':
"@tryghost/adapter-base-scheduling@0.2.3":
dir: packages/adapters/scheduling-base
intents:
- brown-rules-cut
'@tryghost/adapter-base-sso@0.1.1':
"@tryghost/adapter-base-sso@0.1.1":
dir: packages/adapters/sso-base
intents:
- major-areas-fail
- plain-singers-cheat
'@tryghost/adapter-base-sso@0.1.2':
"@tryghost/adapter-base-sso@0.1.2":
dir: packages/adapters/sso-base
intents:
- open-shirts-arrive
'@tryghost/adapter-base-sso@0.1.3':
"@tryghost/adapter-base-sso@0.1.3":
dir: packages/adapters/sso-base
intents:
- brown-rules-cut
'@tryghost/kg-card-factory@5.2.4':
"@tryghost/kg-card-factory@5.2.4":
dir: koenig/kg-card-factory
intents:
- common-squids-argue
'@tryghost/kg-clean-basic-html@4.3.4':
"@tryghost/kg-clean-basic-html@4.3.4":
dir: koenig/kg-clean-basic-html
intents:
- common-squids-argue
- six-parents-shout
'@tryghost/kg-converters@1.2.4':
"@tryghost/kg-converters@1.2.4":
dir: koenig/kg-converters
intents:
- tidy-types-check
'@tryghost/kg-converters@1.2.5':
"@tryghost/kg-converters@1.2.5":
dir: koenig/kg-converters
intents:
- common-squids-argue
'@tryghost/kg-default-cards@10.3.4':
"@tryghost/kg-default-cards@10.3.4":
dir: koenig/kg-default-cards
intents:
- spacy-poodles-hunt
'@tryghost/kg-default-cards@10.3.5':
"@tryghost/kg-default-cards@10.3.5":
dir: koenig/kg-default-cards
intents:
- common-squids-argue
- six-parents-shout
'@tryghost/kg-default-nodes@2.1.4':
"@tryghost/kg-default-nodes@2.1.4":
dir: koenig/kg-default-nodes
intents:
- floppy-bobcats-spend
'@tryghost/kg-default-nodes@2.1.5':
"@tryghost/kg-default-nodes@2.1.5":
dir: koenig/kg-default-nodes
intents:
- spacy-poodles-hunt
- warm-hotels-make
'@tryghost/kg-default-nodes@2.2.0':
"@tryghost/kg-default-nodes@2.2.0":
dir: koenig/kg-default-nodes
intents:
- clean-flags-retire
- common-squids-argue
- six-parents-shout
'@tryghost/kg-default-transforms@1.3.4':
"@tryghost/kg-default-nodes@2.2.1":
dir: koenig/kg-default-nodes
intents:
- khaki-poets-clap
"@tryghost/kg-default-transforms@1.3.4":
dir: koenig/kg-default-transforms
intents:
- common-squids-argue
'@tryghost/kg-html-to-lexical@1.4.0':
"@tryghost/kg-html-to-lexical@1.4.0":
dir: koenig/kg-html-to-lexical
intents:
- common-squids-argue
- six-parents-shout
'@tryghost/kg-lexical-html-renderer@1.5.0':
"@tryghost/kg-lexical-html-renderer@1.5.0":
dir: koenig/kg-lexical-html-renderer
intents:
- common-squids-argue
- six-parents-shout
'@tryghost/kg-markdown-html-renderer@7.2.4':
"@tryghost/kg-markdown-html-renderer@7.2.4":
dir: koenig/kg-markdown-html-renderer
intents:
- common-squids-argue
- four-rings-relate
'@tryghost/kg-unsplash-selector@0.4.4':
"@tryghost/kg-unsplash-selector@0.4.4":
dir: koenig/kg-unsplash-selector
intents:
- common-squids-argue
- petite-schools-accept
- six-parents-shout
- swift-guests-grin
'@tryghost/kg-utils@1.1.4':
"@tryghost/kg-unsplash-selector@0.4.5":
dir: koenig/kg-unsplash-selector
intents:
- gray-scale-spelling
- tidy-mangos-repeat
"@tryghost/kg-utils@1.1.4":
dir: koenig/kg-utils
intents:
- common-squids-argue
- four-rings-relate
'@tryghost/koenig-lexical@1.9.0':
"@tryghost/koenig-lexical@1.9.0":
dir: koenig/koenig-lexical
intents:
- bright-walls-preview
'@tryghost/koenig-lexical@1.9.1':
"@tryghost/koenig-lexical@1.9.1":
dir: koenig/koenig-lexical
intents:
- warm-hotels-make
'@tryghost/koenig-lexical@1.9.2':
"@tryghost/koenig-lexical@1.9.2":
dir: koenig/koenig-lexical
intents:
- funky-bikes-chew
Expand All @@ -128,10 +137,16 @@
- petite-forks-lick
- petite-schools-accept
- six-parents-shout
'@tryghost/koenig-lexical@1.9.3':
"@tryghost/koenig-lexical@1.9.3":
dir: koenig/koenig-lexical
intents:
- plenty-moons-smile
"@tryghost/koenig-lexical@1.9.4":
dir: koenig/koenig-lexical
intents:
- gray-scale-spelling
- khaki-poets-clap
- tidy-mangos-repeat
ghost-storage-base@3.0.0:
dir: packages/adapters/storage-base
intents:
Expand Down
2 changes: 1 addition & 1 deletion .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

# Tinybird Analytics
# Tinybird data pipelines and services require review from designated owners
**/tinybird/ @9larsons @cmraible @evanhahn @troyciesco
**/tinybird/ @cmraible @evanhahn @troyciesco

# @tryghost/parse-email-address
/packages/parse-email-address/ @EvanHahn
Expand Down
31 changes: 22 additions & 9 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -253,31 +253,31 @@ jobs:
AFFECTED_ARG=""
fi

AFFECTED_PROJECTS=$(pnpm -s nx show projects ${AFFECTED_ARG} --json)
AFFECTED_PROJECTS=$(pnpm nx show projects ${AFFECTED_ARG} --json)
echo "affected_projects=$AFFECTED_PROJECTS" >> "$GITHUB_OUTPUT"
# string list for use in run-many commands
AFFECTED_PROJECTS_STR=$(pnpm -s nx show projects ${AFFECTED_ARG} --sep=, | tr -d '\n')
AFFECTED_PROJECTS_STR=$(pnpm nx show projects ${AFFECTED_ARG} --sep=, | tr -d '\n')
echo "affected_projects_str=$AFFECTED_PROJECTS_STR" >> "$GITHUB_OUTPUT"

UNIT_TEST_AFFECTED_ARG="$AFFECTED_ARG"
if [[ "${{ steps.changed.outputs.unit-test-globals }}" == 'true' ]]; then
UNIT_TEST_AFFECTED_ARG=""
fi
UNIT_TEST_PROJECTS_STR=$(pnpm -s nx show projects ${UNIT_TEST_AFFECTED_ARG} --withTarget test:unit --sep=, | tr -d '\n')
UNIT_TEST_PROJECTS_STR=$(pnpm nx show projects ${UNIT_TEST_AFFECTED_ARG} --withTarget test:unit --sep=, | tr -d '\n')
if [[ "${{ steps.changed.outputs.core-unit-test-globals }}" == 'true' ]]; then
UNIT_TEST_PROJECTS_STR=$(printf '%s\n%s\n' "$UNIT_TEST_PROJECTS_STR" "ghost" | awk 'NF && !seen[$0]++' | paste -sd, -)
fi
echo "unit_test_projects_str=$UNIT_TEST_PROJECTS_STR" >> "$GITHUB_OUTPUT"

# "i18n" tag = packages whose source is scanned by @tryghost/i18n's
# translate:* scripts (not packages that merely import @tryghost/i18n).
I18N_PROJECTS=$(pnpm -s nx show projects ${AFFECTED_ARG} --projects 'tag:i18n' --sep=, | tr -d '\n')
I18N_PROJECTS=$(pnpm nx show projects ${AFFECTED_ARG} --projects 'tag:i18n' --sep=, | tr -d '\n')
echo "affected_i18n_projects=${I18N_PROJECTS}" >> "$GITHUB_OUTPUT"

# "playwright" tag = projects whose test:acceptance suite runs in
# job_apps_acceptance-tests. Tag-based rather than directory-based so
# the matrix isn't coupled to the workspace layout (apps/*, koenig/*, ...).
PLAYWRIGHT_PROJECTS=$(pnpm -s nx show projects ${AFFECTED_ARG} \
PLAYWRIGHT_PROJECTS=$(pnpm nx show projects ${AFFECTED_ARG} \
--withTarget test:acceptance \
--projects 'tag:playwright' \
--json)
Expand Down Expand Up @@ -335,8 +335,13 @@ jobs:
ref: ${{ github.event.pull_request.head.sha }}
fetch-depth: 0

- name: Fetch main branch
run: git fetch --no-tags origin main
- name: Fetch PR base branch
# Through env, never interpolated into the script: a branch name can
# carry shell metacharacters, and template expansion happens before the
# shell parses the command.
env:
PR_BASE_REF: ${{ github.event.pull_request.base.ref }}
run: git fetch --no-tags origin "+refs/heads/${PR_BASE_REF}:refs/remotes/origin/${PR_BASE_REF}"

- uses: ./.github/actions/setup-node-pnpm
with:
Expand All @@ -349,6 +354,7 @@ jobs:
- name: Check app version bump
env:
PR_BASE_SHA: ${{ github.event.pull_request.base.sha }}
PR_BASE_REF: ${{ github.event.pull_request.base.ref }}
PR_COMPARE_SHA: ${{ github.event.pull_request.head.sha }}
run: node scripts/check-app-version-bump.js

Expand All @@ -358,6 +364,7 @@ jobs:
- name: Check for missing changesets
env:
PR_BASE_SHA: ${{ github.event.pull_request.base.sha }}
PR_BASE_REF: ${{ github.event.pull_request.base.ref }}
PR_COMPARE_SHA: ${{ github.event.pull_request.head.sha }}
run: node scripts/change-check.js

Expand All @@ -374,11 +381,17 @@ jobs:
fetch-depth: 0

- name: Fetch PR base branch
run: git fetch --no-tags origin "${{ github.event.pull_request.base.ref }}"
# Through env, never interpolated into the script: a branch name can
# carry shell metacharacters, and template expansion happens before the
# shell parses the command.
env:
PR_BASE_REF: ${{ github.event.pull_request.base.ref }}
run: git fetch --no-tags origin "+refs/heads/${PR_BASE_REF}:refs/remotes/origin/${PR_BASE_REF}"

- name: Check migration integrity
env:
PR_BASE_SHA: ${{ github.event.pull_request.base.sha }}
PR_BASE_REF: ${{ github.event.pull_request.base.ref }}
PR_COMPARE_SHA: ${{ github.event.pull_request.head.sha }}
run: node scripts/check-migration-integrity.cjs

Expand Down Expand Up @@ -996,7 +1009,7 @@ jobs:
# resolve the project root since apps live in apps/* and koenig/*
run: |
APP_NAME="${{ matrix.app }}"
APP_ROOT=$(pnpm -s nx show project ${{ matrix.app }} --json | jq -r .root)
APP_ROOT=$(pnpm nx show project ${{ matrix.app }} --json | jq -r .root)
{
echo "name=${APP_NAME#@tryghost/}"
echo "root=$APP_ROOT"
Expand Down
3 changes: 2 additions & 1 deletion .oxfmtrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
"koenig/kg-lexical-html-renderer/**",
"koenig/kg-simplemde/debug/**",
"koenig/koenig-lexical/**",
"packages/i18n/locales/**"
"packages/i18n/locales/**",
".changeset/ledger.yaml"
]
}
2 changes: 1 addition & 1 deletion apps/activitypub/src/components/feed/table-of-contents.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ const TableOfContentsView: React.FC<TableOfContentsViewProps> = ({
{items.map((item) => (
<button
key={item.id}
className={`line-clamp-2 block w-full cursor-pointer rounded py-1 text-left text-sm leading-tight ${activeHeading === item.id ? 'text-black dark:text-white' : 'text-gray-700 dark:text-gray-600'} hover:bg-gray-100 hover:text-gray-900 dark:hover:bg-grey-950 dark:hover:text-white ${getHeadingPadding(item.level)}`}
className={`line-clamp-2 block w-full cursor-pointer rounded py-1 text-left text-sm leading-tight ${activeHeading === item.id ? 'text-black dark:text-white' : 'text-gray-700 dark:text-gray-600'} hover:bg-gray-100 hover:text-gray-900 dark:hover:bg-gray-950 dark:hover:text-white ${getHeadingPadding(item.level)}`}
type="button"
onClick={() => onItemClick(item.id)}
>
Expand Down
Loading
Loading