🎨 Removed the discontinued Tenor GIF provider#29194
Conversation
|
Bugbot is not enabled for this team, so this pull request was not reviewed. Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs. |
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (1)
📒 Files selected for processing (25)
💤 Files with no reviewable changes (9)
✅ Files skipped from review due to trivial changes (1)
🚧 Files skipped from review as they are similar to previous changes (15)
WalkthroughThis pull request removes Tenor GIF provider support and switches the related configuration, editor wiring, demos, and tests to Klipy. Server and shared config defaults, config serialization, public-config output, and config validation were updated to drop Suggested reviewers: 🚥 Pre-merge checks | ✅ 4✅ Passed checks (4 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Warning Tools execution failed with the following error: Failed to run tools: 13 INTERNAL: Received RST_STREAM with code 2 (Internal server error) Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
| Command | Status | Duration | Result |
|---|---|---|---|
nx run @tryghost/admin-x-settings:test:acceptance |
✅ Succeeded | 10m 36s | View ↗ |
nx run ghost:test:ci:integration |
✅ Succeeded | 2m 38s | View ↗ |
nx run-many --target=build --projects=tag:publi... |
✅ Succeeded | <1s | View ↗ |
nx run-many -t test:unit -p @tryghost/kg-markdo... |
✅ Succeeded | 27s | View ↗ |
nx run ghost:test:integration |
✅ Succeeded | 3m 3s | View ↗ |
nx run ghost:test:legacy |
✅ Succeeded | 3m 2s | View ↗ |
nx run @tryghost/admin:build |
✅ Succeeded | 2m 56s | View ↗ |
nx run ghost:test:e2e |
✅ Succeeded | 2m 37s | View ↗ |
Additional runs (9) |
✅ Succeeded | ... | View ↗ |
💡 Verify your cache is correct by running tasks in a sandbox. Read docs ↗
☁️ Nx Cloud last updated this comment at 2026-07-09 11:09:54 UTC
ref https://linear.app/ghost/issue/PT-10/remove-tenor-entirely-from-koenig - Google shut down the Tenor API on 2026-06-30, so the Tenor fallback in the GIF card has been calling a dead endpoint since; Klipy is now the sole provider - removes the Tenor branch from provider resolution, the provider-switching placeholder/prop plumbing, the Tenor error shapes, demo config, and all Tenor-specific tests and fixtures - the provider-agnostic naming introduced during the Klipy migration makes this a pure deletion with no behaviour change for Klipy-configured deployments
ref https://linear.app/ghost/issue/PT-11/remove-tenor-config-from-ghost - with Tenor gone from the Koenig GIF card, the tenor config key has no consumer left; removing it keeps the public /config/ API surface honest and stops self-hosters setting a key that does nothing - drops the key from config defaults, the public-config service, the config output serializer, the admin Config type and both editors' card configs, plus the related tests, fixtures and API snapshot
…or API ref https://linear.app/ghost/issue/PT-11/remove-tenor-config-from-ghost - the automations email editor was copied from the welcome-email editor (#28117) while the Klipy migration was still in review, so it only ever got Tenor wiring and never picked up the Klipy config added in #28109 - behind the automations labs flag: with a tenor key configured the GIF card searched the shut-down API and errored; with only a klipy key it was hidden - wires klipy through the card config exactly like member-email-editor.tsx
ref https://linear.app/ghost/issue/PT-10/remove-tenor-entirely-from-koenig - the gh-tenor-* styles belonged to the pre-Lexical Ember GIF selector whose service was already removed in #28109; nothing references them - the koenig demo deploy no longer needs the TENOR_API_KEY secret; removing the env line so the workflow stops depending on a secret slated for deletion
|
Bugbot is not enabled for this team, so this pull request was not reviewed. Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs. |
| triggerFileDialog: false | ||
| }, | ||
| matches: ['gif', 'giphy', 'tenor', 'klipy'], | ||
| matches: ['gif', 'giphy', 'klipy'], |
There was a problem hiding this comment.
Nit: It might be worth keeping tenor here so we don't break anyone's muscle-memory? Although I doubt anyone is actually typing /tenor to insert a gif card
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #29194 +/- ##
==========================================
- Coverage 74.41% 74.40% -0.01%
==========================================
Files 1569 1569
Lines 136004 136001 -3
Branches 16528 16526 -2
==========================================
- Hits 101201 101195 -6
- Misses 33769 33772 +3
Partials 1034 1034
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|

Describe the problem you are solving
This PR removes Tenor entirely from the editor's GIF card and from Ghost's config surface. Google shut down the Tenor API for app developers on 2026-06-30, so the Tenor fallback added during the Klipy migration (TryGhost/Koenig#1932, #28109) now points at a dead endpoint. Klipy is the sole GIF provider going forward.
This is the final code phase of the Tenor → Klipy migration (Linear: PT-10, PT-11). Docs were already updated (PT-13); infra key removal (PT-12) happens separately.
Changelog for devs
koenig-lexical(getGifProviderConfignow resolves Klipy or null), along with the provider-switching prop plumbing, Tenor error shapes, Tenor demo config, and all Tenor-specific tests and fixturestenorconfig key from Ghost: config defaults, public-config service, config output serializer, the admin-xConfigtype, both editors' card configs, and the related tests, fixtures and API snapshotapps/posts): it was copied from the welcome-email editor before Klipy support landed and only ever had Tenor wiring, so its GIF card pointed at the dead API (behind theautomationslabs flag)gh-tenor-*CSS in Ghost Admin (leftover from the pre-Lexical GIF selector removed in ✨ Added Klipy as a GIF provider alongside Tenor #28109) and theVITE_TENOR_API_KEYenv line from the koenig demo deploy workflowklipyconfig resolves to no providerChangelog for customers
klipy.apiKeyin config) is now the only GIF providerNotes
tenorkey: the key is silently ignored (nconf drops unknown keys, all readers are gone). The GIF card is hidden unless a Klipy key is configured — the intended outcome, since the Tenor API no longer answers. Klipy-configured deployments (incl. Ghost(Pro)) see no behaviour change./config/endpoint no longer returns atenorobject. Any external integration readingconfig.tenorgetsundefined; justified by the upstream shutdown, and old cached admin bundles degrade safely via optional chaining.gif.tsabout Klipy exposing a "Tenor-compatible v2 API" is kept intentionally — it explains why the client speaks v2 paths and Tenor-style request params.media.tenor.comURLs in a kg-converters mobiledoc fixture and the "Tenor Sans" font references are unrelated to the GIF API and intentionally untouched. Google confirmed existingmedia.tenor.comasset URLs keep serving (PT-2), so historic embedded GIFs in published content are unaffected.secretlint-disable-next-linecomments were added for the scanner'sapiKey:false positive (established repo pattern); the flagged values are identifiers, not secrets.Technical debt
ImageNode.isHiddenchecks!config?.klipywhilegetGifProviderConfigrequiresklipy.apiKey— a host passingklipy: {apiKey: null}straight through would show the card with no provider. Pre-existing mismatch (same held for tenor), no current host triggers it; follow-up to tighten to!config?.klipy?.apiKey+ a null guard inmakeRequest.apps/postshas no acceptance harness for automations yet. Follow-up: mirror the two welcome-emails GIF tests (shown with Klipy / hidden without), which would have caught the original miss.checkStatusingif.tsstill readsresponse.headers.map['content-type'](whatwg-fetch polyfill internal). Pre-existing, documented in the feat: Add Klipy as a GIF provider alongside Tenor Koenig#1932 PR body; unchanged here.PR Scope (mark all that apply)
Checklist before requesting a review (mark all that apply)