Skip to content
CAI
Software that uses CAICheck a score

TryGhost/Ghost

45.2

Weak · 25 September 2026

434k

lines of production code

TypeScript

with JavaScript

3

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is a content management platform undergoing a significant architectural migration from an Ember-based admin interface to a modern React ecosystem. It provides a comprehensive suite of administrative tools for managing publications, members, and analytics, while introducing new capabilities for social networking via ActivityPub and automated email workflows. The codebase establishes a unified framework for these features, enabling gradual feature adoption through feature flags and shared UI components.

How it got here

2013–2025 — React Admin migration and Shade design system

101 changes.

This period focused on establishing the Shade design system and migrating the Ghost Admin interface from Ember to React, introducing a new shell with an Ember bridge for gradual adoption. It also involved modernizing the entire monorepo tooling by standardizing on Vite, TypeScript, and ESLint 9 across all applications, while scaffolding new standalone apps for ActivityPub and Announcement Bar.

2026 — Admin React migration and Shade UI adoption

128 changes.

This period focused on migrating the Ghost Admin interface from Ember to React, introducing the new Shade design system and comprehensive component libraries. It also involved building complex new features such as the Automations editor, detailed Post Analytics, and a modernized Members management experience, while standardizing internal tooling and test infrastructure.

Features

ActivityPub API client and test suite added

The ActivityPub application now includes a dedicated API client (\activitypub.ts\) and a comprehensive test suite (\activitypub.test.ts\) for managing Social Web interactions. This client exposes methods to handle domain configuration (getting, updating, validating, and clearing), user preferences (specifically sensitive media display settings), and account data retrieval (including profiles, followers, following lists, and notifications). The tests verify the correct HTTP methods and request bodies for these operations, ensuring the API layer behaves as expected.

apps/activitypub/src/api · high confidence

ActivityPub app error handling UI

The ActivityPub app now displays user-friendly error pages for specific failure scenarios, including 404s, rate limits (429), configuration issues (403), account suspensions, and version mismatches (410), providing clear messaging and actionable links or refresh options instead of generic loading interruptions.

apps/activitypub/src/components/layout/error · high confidence

ActivityPub app layout shell and host context integration

The ActivityPub application now includes a dedicated layout structure that supports both standalone operation and embedding within an admin interface. A new \host-context\ module provides a React context allowing an external host to supply layout dimensions (content class and gutter), enabling the ActivityPub UI to adapt its spacing and styling when embedded. The main layout component manages the core shell, including a responsive sidebar, header, onboarding flow, and keyboard shortcut handling for the new note modal, ensuring consistent navigation and visual structure for users.

apps/activitypub/src/components/layout · high confidence

ActivityPub app routing and sensitive media controls

The ActivityPub app now supports flexible mounting paths via new routing hooks (useAppBasePath, useNavigateWithBasePath, useActiveRoute) that dynamically detect the base path from route matches, ensuring correct navigation regardless of the mount point. Additionally, users can now manage sensitive media visibility through a new useSensitiveMediaDisclosure hook that respects user preferences to hide or reveal sensitive content and content warnings by default.

apps/activitypub/src/hooks · high confidence

ActivityPub app scaffolded with Vite, TypeScript, and ESLint configuration

The \apps/activitypub\ directory has been initialized as a standalone React application using Vite as the build tool. This includes a new \index.html\ entry point, a \vite.config.mjs\ that integrates with the admin framework and validates the presence of Ghost card assets, and a \tsconfig.json\ enforcing strict TypeScript rules including erasable syntax. The app is configured with ESLint via a flat config file (\eslint.config.js\) extending the shared React app profile, and includes a \.gitignore\ for build artifacts. Additionally, Playwright testing is set up via \playwright.config.mjs\.

apps/activitypub · high confidence

ActivityPub onboarding flow introduced

A new multi-step onboarding experience has been added to the ActivityPub settings to guide users through connecting to the social web. The flow includes an introduction to the network, a demonstration of social interactions like likes and replies, and a preview of the inbox and feed interfaces. It also provides a way to copy the user's ActivityPub handle and tracks onboarding progress in the user's accessibility settings.

apps/activitypub/src/components/layout/onboarding · high confidence

Add and manage site recommendations in Growth settings

Admin users can now add, edit, and delete recommendations in the Growth settings. The new interface includes a two-step modal for adding recommendations (URL entry followed by metadata confirmation), an edit modal with delete capability, and lists for both outgoing and incoming recommendations. The outgoing list displays click or signup counts and provides a copyable link for sharing, while the incoming list shows signups driven and offers a 'Recommend back' action.

apps/admin/src/settings/growth/recommendations · high confidence

Added Inter Admin variable font support

The admin interface now includes a dedicated CSS font definition for 'Inter Admin', loading the Inter v4.1 variable font (weights 100–900) in both normal and italic styles. This ensures consistent typography rendering for admin-specific UI elements using the configured font family.

apps/admin/src/assets · high confidence

Added What's New banner and changelog dialog components

The admin interface now includes new React components to surface product updates: a dismissible banner that highlights the latest changelog entry, and a modal dialog listing all recent changelog entries with formatted dates and images. These components replace the previous implementation, ensuring consistent date formatting and providing users with easy access to update history and notification settings.

apps/admin/src/whats-new/components · high confidence

Added What's New hook logic and changelog fetching

The admin now includes hooks to fetch the public changelog and determine if there are new updates since the user's last visit. The \useChangelog\ hook retrieves and parses changelog entries from the external Ghost changelog feed, while \useWhatsNew\ compares the latest entry's date against the user's stored \lastSeenDate\ preference to report whether new content is available. A companion \useDismissWhatsNew\ hook allows users to update their preference, effectively dismissing the notification.

apps/admin/src/whats-new/hooks · high confidence

Added email sending status tracking and progress UI in post analytics

Post analytics now display real-time email sending status, including a progress banner with time estimates, preparation and sending phases, and failure handling with retry options. The analytics data is hidden while sending or after failure to prevent misleading metrics, and a context provider manages the polling and state for these updates.

apps/admin/src/posts/analytics/email-sending-status · high confidence

Added feature flag infrastructure to ActivityPub

The ActivityPub module now includes a feature flag system that allows toggling capabilities via URL parameters (e.g., \?flag=ON\) and persists these settings in local storage. This infrastructure supports the introduction of feature-gated functionality, such as the Global Feed and topic filtering in the Explore view, enabling controlled rollout and testing of new features without requiring code changes.

apps/activitypub/src/lib · high confidence

Added frontend admin toolbar

Introduced a new frontend admin toolbar for Ghost sites, built with Preact to maintain a small bundle size. The toolbar is served as a UMD script via CDN in production and is integrated into the development environment, allowing staff to access toolbar features directly from the frontend. This change includes the initial source code, build configuration using Vite, and testing setup with Vitest.

apps/admin-toolbar, apps/admin-toolbar/src · high confidence

Added internal package template for new workspace modules

A new template package (\packages/\_template\) has been introduced to standardize the creation of internal workspace packages within the monorepo. This template provides a pre-configured structure including TypeScript compilation via \tsconfig.json\ (extending \@internal/cfg-typescript/esm.json\), ESLint rules (using \@internal/cfg-eslint\), and Vitest testing (using \@internal/cfg-vitest\). It includes a basic source file (\src/index.ts\) with a greeting function, corresponding unit tests, and a README outlining development commands like \pnpm build\, \pnpm test\, and \pnpm lint\. This serves as a reference implementation for maintaining consistent architecture and maintenance rules for new internal packages.

_packages/\template · high confidence

Added layout and typography primitives to the Shade component library

The Shade application now includes a new set of layout and typography primitives in \apps/shade/src/components/primitives\. This adds \Box\ for framing with padding and radius, \Container\ for width-constrained regions (including \page\ and \prose\ sizes), \Grid\ for two-dimensional layouts, \Stack\ and \Inline\ for vertical and horizontal flex layouts respectively, and \Text\ for semantic typography controls. These components are exported via the primitives index and include Storybook stories for documentation.

apps/shade/src/components/primitives · high confidence

Added onboarding hook with checklist state management

Introduced the \useOnboarding\ hook in the admin app to manage the user onboarding flow. This hook tracks onboarding progress by maintaining a checklist of steps, allowing owners to start, dismiss, and mark steps as completed. It enforces a cutoff date (April 30, 2026) for the 'started' state to ensure valid onboarding sessions and automatically dismisses checklists for non-owner users or invalid states. The implementation includes corresponding unit tests to verify checklist visibility, step completion logic, and state transitions.

apps/admin/src/onboarding/hooks · high confidence

Added script to generate design system adoption data

A new CLI script (\extract-adoption.ts\) has been added to the Shade app to scan the monorepo and generate a JSON snapshot of how Admin React apps and public apps use the Shade design system versus the legacy admin-x-design system. This data is consumed by the Storybook adoption dashboard to visualize migration progress.

apps/shade/scripts · high confidence

Added testimonial submission modal for Ghost Explore

A new modal component has been added to the Growth \> Explore settings, allowing users to submit testimonials about their experience moving to Ghost. The form collects the user's previous platform (e.g., Substack, WordPress, Medium) and their testimonial content, then submits this data to the configured \exploreTestimonialsUrl\. Upon successful submission, users receive a confirmation toast and are redirected to the main Explore page.

apps/admin/src/settings/growth/explore · high confidence

Admin API validation now uses a centralized JSON Schema package

The \@tryghost/admin-api-schema\ package now serves as the single source of truth for validating requests to Ghost's Admin API endpoints. It bundles JSON Schema definitions for all resources (posts, pages, members, tags, etc.) and exposes a \validate\ function that enforces these rules before data reaches the API layer. This centralizes validation logic, ensuring consistent data shape enforcement across the platform.

packages/admin-api-schema · high confidence

Admin X Framework exposes shared utilities, hooks, and build configuration

The admin-x-framework package now provides a consolidated public API for the Admin interface, exporting shared React hooks (such as useForm, useLimiter, useFeatureFlag, and Tinybird query hooks), utility functions for currency, post metrics, recipient filtering, and source processing, and routing abstractions. It also includes a standardized Vite build configuration for library packaging and a Playwright test configuration for end-to-end testing, centralizing common logic previously scattered across apps.

apps/admin-x-framework/src · high confidence

Admin app now includes virtual list utilities and scroll restoration

The admin application has moved the filter engine and virtual list components from the admin-x-framework into the admin app itself. This change introduces a new shared virtual-list module in apps/admin/src/shared/virtual-list, providing React hooks and components for handling large datasets. Specifically, it adds \useInfiniteVirtualScroll\ for virtualizing lists with automatic pagination via react-query, \useVirtualListWindow\ for managing a paginated 'load more' window size that persists across navigation history entries, \useScrollRestoration\ to save and restore scroll positions when navigating back and forth, and a \LoadMoreButton\ presentational component. These utilities are now available for use within the admin app to improve performance and user experience when dealing with extensive lists.

apps/admin/src/shared/virtual-list · high confidence

Admin sidebar ported to React with new layout and navigation components

The admin sidebar has been ported from Ember to React, introducing a new component-based layout (\AppSidebar\) that includes a header with site branding and global search, a main content area with collapsible navigation groups for Posts, Pages, Members, Tags, Comments, and Automations, and a footer with user settings and the 'What's New' dialog. The new sidebar supports saved views for posts and members, displays member counts with thousands separators, and integrates configurable banners for theme errors and upgrade prompts. A mobile navigation bar has also been added to provide quick access to key sections on smaller screens.

apps/admin/src/layout/app-sidebar · high confidence

Announcement Bar app scaffolded with Vite and ESLint 9

The announcement-bar location now contains a fully configured Vite-based public app, replacing the previous setup. It uses a flat ESLint 9 configuration (eslint.config.js) based on shared React app rules, and a Vite config (vite.config.mjs) that builds a UMD bundle from src/index.jsx without source maps. A README documents development commands (pnpm dev, build, test, lint) and the release process via pnpm ship, indicating the app is now a standalone, watchable public app within the monorepo.

apps/announcement-bar · high confidence

Automated development environment setup for Ghost orbs

The .agents directory now includes executable scripts to streamline the local development environment for Ghost orbs. The setup script automatically installs the required Node.js version, configures pnpm, and installs Docker Compose if missing. A new resume script ensures that the amp-svc-docker and amp-svc-ghost systemd services are running before proceeding, while a docker wrapper script executes Docker commands with preserved environment variables.

.agents · high confidence

Centralized repository automation scripts in a new \`scripts/\` package

The repository has consolidated its automation tooling into a new \@internal/scripts\ workspace package. This change introduces a standardized structure for CI and local development scripts, including a new README that defines conventions for ESM usage, argument parsing, and testing. New scripts have been added to enforce specific checks: validating that public UMD apps maintain version consistency between \package.json\ and \defaults.json\, ensuring migration files are placed in correct version folders, checking that agent guidance files stay within line limits, and verifying that agent skill links are correctly symlinked. The package also includes utilities for generating changesets, computing next app versions based on npm state, and comparing production image sizes. Legacy \.cjs\ files are preserved but marked for eventual migration to ESM, and the \enforce-package-manager.js\ script ensures developers use pnpm.

scripts · high confidence

Configure what data Stripe collects during tier checkout

Admins can now control which shipping, phone, and tax details are collected during a paid tier's checkout. The new Tier Checkout Collection section in the tier settings allows you to enable or disable the collection of shipping address, recipient name, phone number, and tax number. When enabled, you can specify whether to collect from all countries supported by Stripe or restrict it to a specific list, and map each collected field to a custom member field for storage. This feature is gated by the Stripe integration and the \stripeCheckoutCollection\ feature flag.

apps/admin/src/settings/membership/tiers · high confidence

Custom fields can now be opened to members for viewing or editing

The custom field management modal now includes a switch that allows staff to control member visibility and edit permissions for custom fields. When enabled, members can either view the field data in their Portal settings (read-only) or view and update it themselves, depending on the selected access level. This change introduces a new user-facing capability for custom fields, moving them from staff-only visibility to optional member access.

apps/admin/src/settings/membership/custom-fields · high confidence

Enhanced migration tools with universal CSV import and selective data export

The Migration Tools section in Admin Settings now supports importing CSV files and ZIP archives containing media, with automatic field mapping for posts when the csvContentImporter feature flag is enabled. Additionally, a new 'Export data' option allows users to selectively export content, members, analytics, themes, routes, and media files, offering both immediate synchronous downloads and background asynchronous exports that are emailed to the site owner.

apps/admin/src/settings/advanced/migration-tools · high confidence

Expanded Shade design system with new UI components and Storybook documentation

The Shade design system in the admin interface has been significantly expanded with the addition of new, fully documented UI components. This update introduces Accordion, Action List, Alert Dialog, Animated Number, Avatar, Badge, Banner, Breadcrumb, and Button components, each accompanied by comprehensive Storybook stories that demonstrate usage, variants, and accessibility patterns. These components provide a consistent, accessible foundation for building admin features, replacing ad-hoc implementations with standardized, theme-aware primitives.

apps/shade/src/components/ui · high confidence

Gift subscription checkout and redemption flow

Portal now supports purchasing and redeeming gift memberships. Buyers can select a tier and duration, then choose to deliver the gift via email (with recipient details and a scheduled date) or by generating a shareable link. The flow includes a plan selection step, a delivery configuration step, and a live preview of the gift card or email. Logged-in members and anonymous visitors can both redeem gift links, with specific success and error states handled for each.

apps/portal/src · high confidence

Initial icon asset library for the Koenig-Lexical editor

The \koenig-lexical\ package now includes a comprehensive set of SVG icons in \src/assets/icons\, providing the visual assets for the new editor's card types (such as audio, bookmark, button, callout, collection, divider, email, file, gallery, GIF, header, HTML, image, markdown, NFT, product, signup, snippet, toggle, transistor, video, and various embeds), layout modes, and UI controls. These assets establish the visual foundation for the editor's interface and card selection menu.

koenig/koenig-lexical · high confidence

Initial release of the Koenig SimpleMDE editor component

This entry introduces the \koenig/kg-simplemde\ package, providing a Markdown editing experience built on CodeMirror 5. The component includes a customizable toolbar with support for bold, italic, headings, lists, code blocks, tables, and side-by-side preview modes. It features mobile-responsive styling, fullscreen editing capabilities, and keyboard shortcuts that adapt to the user's platform (Cmd on Mac, Ctrl on Windows/Linux). The implementation also adds spell-checking support, autosave functionality, and a status bar for character/word counts, establishing the foundational UI and behavior for Markdown content creation in the Koenig editor.

koenig/kg-simplemde · high confidence

Introduce ActivityPub Feed, Explore, and Reader views with customizable reading experience

This change adds the core UI views for the ActivityPub social web integration: a Feed for following updates, an Explore page to discover and follow new accounts, and a Reader view for consuming long-form posts. The Reader includes a new Customizer component that lets users adjust the background color (System, Sepia, Light, Dark), font style (Sans, Serif), and font size, with preferences persisted to local storage. The Feed and Inbox lists support infinite scrolling via IntersectionObserver, display suggested profiles for follow recommendations, and handle empty states with clear calls to action.

apps/activitypub/src/views/inbox · high confidence

Introduce Shade design system as the new UI foundation

The Shade application is now available as a comprehensive design system, providing a unified set of UI primitives, tokens, and layout patterns for the platform. This release introduces a structured export layer including semantic tokens, composition primitives, and feature-level patterns such as page headers, filter bars, and KPI cards. It also bundles a full suite of reusable UI components (e.g., buttons, dialogs, charts, tables) and page templates (detail, list, modal) to standardize the visual language across Admin and ActivityPub interfaces.

apps/shade/src · high confidence

Introduce the Automations feature behind a beta flag

The Automations domain is now available in the admin interface, gated by the \automations\ beta labs flag. This release adds the list view (\/automations\) and the editor screen, exposing the automation canvas, sidebar, and email content modal. The list view displays automation names, statuses, and run statistics (last run, total entries, in-progress), while hiding the paid member welcome flow when Stripe is not connected. The editor supports creating and editing automation workflows, including validation for email subject and body fields, and manages unsaved changes with a dedicated guard hook. The feature is wired into the admin shell via lazy-loaded routes and includes acceptance and unit tests to verify rendering, visibility logic, and editor interactions.

apps/admin/src/automations · high confidence

Introduces shared member metafield type catalog with address support and CSV mapping

The new @tryghost/metafield-types package provides a shared catalog for member metafield types, separating structural definitions (used by renderers like Portal for low bundle cost) from validation rules (built on Zod). It introduces an 'address' field type composed of sub-fields (line1, line2, city, state, postal\_code, country) alongside existing short and long text types. The package also defines how these fields map to CSV columns for import/export, ensuring round-tripping consistency, and establishes a unified identity format (namespace.key) for fields across the system.

packages/metafield-types · high confidence

The site navigation editor now allows administrators to upload custom icons for navigation items and restrict their visibility to specific audience segments (public visitors, free members, or paid members). This change introduces a new UI in the settings area where users can toggle visibility options per item, with the interface automatically handling the mapping between audience selections and the resulting navigation visibility state.

apps/admin/src/settings/site/navigation · high confidence

New AI agent skills for API, migration, and package management

Added new AI agent skills to guide developers through specific development tasks. The \add-admin-api-endpoint\ skill provides instructions and reference documentation for creating new Admin API endpoints, including permission patterns and validation rules. The \create-database-migration\ skill offers a checklist for modifying the database schema, covering idempotency, immutability, and testing. The \migrate-internal-package\ and \convert-internal-package-to-typescript\ skills guide the process of importing packages from other repositories while preserving Git history, and subsequently modernizing them to TypeScript and ESM. Additionally, new skills were added for managing private feature flags (\add-private-feature-flag\), formatting numbers in the UI (\format-number\), and adhering to commit message conventions (\commit\).

.agents/skills · high confidence

New AI agent skills for admin, Shade UI, and Tinybird

The \.claude/skills\ directory now includes a set of new symbolic links pointing to agent skills in \.agents/skills\, enabling AI assistants to perform specific tasks. These new capabilities include adding admin API endpoints and private feature flags, managing database migrations, and converting internal packages to TypeScript. Additionally, the update introduces a comprehensive suite of skills for the Shade UI system (covering component decisions, imports, surface contracts, page templates, and token usage) and provides guidelines for interacting with the Tinybird CLI.

.claude/skills · high confidence

New API framework package for Ghost

The \packages/api-framework\ package has been introduced to centralize the API request handling logic. It provides a \Frame\ object to encapsulate request data, an \http\ wrapper to bridge Express requests to the internal pipeline, and a \pipeline\ module that orchestrates validation, serialization, permissions, and query execution. The package also includes utilities for generating response headers (such as cache invalidation and content disposition) and shared validators/serializers for input and output processing.

packages/api-framework · high confidence

New Account Home page layout and styling

The Account Home page now uses a dedicated layout with a new CSS stylesheet, introducing a structured header with avatar, a main content area, and a footer menu. The design includes specific styles for billing information, cancellation banners, and responsive adjustments for smaller screens.

apps/portal/src/components/pages/AccountHomePage · high confidence

New ActivityPub feed components and styling

The ActivityPub feed now features a redesigned user interface with new components for displaying posts, including support for image galleries, video, and audio attachments. Users can interact with posts via a new menu system that allows copying links, following/unfollowing authors, and deleting posts (with distinct behavior for inbox vs. authored items). The feed includes interactive stats for likes, comments, and reposts, along with a topic filter for navigation. Additionally, article rendering is now supported with a dedicated table of contents and consistent styling variables for light and dark modes.

apps/activitypub/src/components/feed · high confidence

The ActivityPub app now includes a dedicated header component that provides a sticky navigation bar with a frosted-glass effect, adapting its layout for mobile devices by showing a hamburger menu button. The header intelligently manages back-navigation visibility based on the current route and navigation stack, and introduces a new search input component styled for the 'social web' context.

apps/activitypub/src/components/layout/header · high confidence

New ActivityPub profile view components

Added new React components for the ActivityPub profile interface, including a paginated actor list with follow/block actions, dedicated tabs for viewing posts and likes, and a profile menu with copy-handle and block/unblock capabilities for both individual users and entire domains.

apps/activitypub/src/views/profile/components · high confidence

New ActivityPub search and note composition modals

This change introduces new UI components for the ActivityPub feature, specifically adding a search modal that allows users to find accounts and topics with keyboard navigation support, and a new note modal that enables composing and posting notes or replies with image upload capabilities.

apps/activitypub/src/components/modals · high confidence

New ActivityPub sidebar layout with navigation, search, and recommendations

The ActivityPub app now includes a dedicated sidebar component that provides core navigation (Reader, Notes, Notifications, Profile, Preferences) and a search interface. It features a 'New note' action button, a 'Follow suggestions' section that recommends profiles to the user, and a feedback box for reporting issues. The sidebar also displays active feature flags for debugging purposes and handles notification count resets when viewing the notifications page.

apps/activitypub/src/components/layout/sidebar · high confidence

New ActivityPub utility library for content formatting, security, and UI helpers

This change introduces a new set of utility functions in the ActivityPub app to support content rendering and user interaction. It adds client-side HTML sanitization and DOM validation (using DOMPurify) to safely handle embedded iframes and scripts, ensuring only allowed cross-origin content is displayed. It also includes helpers for formatting article content, generating social web handles, calculating reading times, and managing accessibility settings, providing the foundational logic for the ActivityPub reader and profile views.

apps/activitypub/src/utils · high confidence

New AdminX API framework with session and query cache handling

The AdminX framework now includes a dedicated API layer (fetch-api, hooks, and query utilities) that standardizes how the admin interface communicates with the Ghost API. This layer introduces robust session management, automatically redirecting users to the sign-in page when their session expires, while allowing specific flows (like publishing) to opt out of this redirect to prevent data loss. It also provides React Query hooks for standard and infinite pagination, along with utilities to safely update the query cache (insert, update, delete) without mistaking standard paginated responses for infinite data structures.

apps/admin-x-framework/src/utils/api · high confidence

New CSV-based content import with field mapping and archive validation

The content import tool now supports importing posts directly from CSV files packaged in a ZIP archive, replacing the previous JSON-only legacy import path. Users can upload a ZIP containing a single CSV file (optionally inside one wrapper directory) along with associated media assets; the system validates the archive structure and rejects invalid formats. A new mapping step allows users to map CSV columns to Ghost fields such as title, HTML/Markdown content, authors, tags, and SEO metadata, with automatic detection for exact header matches. The import process includes deduplication logic and handles frontmatter removal, ensuring a cleaner migration experience.

apps/admin/src/settings/advanced/migration-tools/content-import · high confidence

New Docker Compose-based Dev Container configuration for Ghost

Developers can now launch the full Ghost development environment directly in VS Code or GitHub Codespaces using a new \.devcontainer\ setup. This configuration introduces a dedicated \compose.devcontainer.yaml\ that optimizes resource usage (e.g., reduced MySQL buffer pool) for Codespace limits, mounts the full repository for live editing, and uses a prebuilt \ghost-dev\ image. The setup includes a Caddy-based gateway to handle internal routing and external Codespaces port forwarding, automatically configuring the Ghost URL to prevent session CSRF errors in remote environments. It also streamlines the startup process by moving auto-start logic to \postAttachCommand\ and ensuring necessary workspace packages like \@tryghost/parse-email-address\ are built before the dev servers launch.

.devcontainer · high confidence

New Docker-based local development environment

The repository now includes a comprehensive set of Docker files to support local development, replacing or augmenting previous setup methods. This includes a Caddy-based dev gateway (\docker/dev-gateway\) that routes traffic to the Ghost backend, local frontend dev servers (Vite, Ember), and optional services like ActivityPub and Tinybird. A dedicated \ghost-dev\ image provides a minimal runtime for the Ghost core with hot-reload support via nodemon. Additional services include a Stripe webhook listener (\docker/stripe\), a fake Mailgun server for email testing (\docker/fake-mailgun\), and a Tinybird CLI service (\docker/tb-cli\) to manage local analytics data. A slimmed-down Tinybird local image (\docker/tinybird-local-slim\) is also provided to reduce disk usage for CI. These components work together to provide a unified, containerized development experience.

docker · high confidence

New E2E test infrastructure and data factories

The e2e workspace now includes a dedicated Dockerfile for building the test environment, a slim Playwright runner image, and a new data-factory module. The data-factory provides TypeScript-based factories for creating test data (posts, members, tags, tiers, offers, comments, staff accounts, and automated emails) with persistence adapters for the Ghost Admin API and Knex. Configuration examples and documentation (AGENTS.md, CLAUDE.md, README.md) have been added to guide test development and infrastructure setup.

e2e · high confidence

New Growth Sources analytics component for the Admin dashboard

A new \GrowthSources\ component has been added to the Admin analytics section, providing a detailed breakdown of traffic sources. It displays free and paid member counts, along with MRR impact when paid members are enabled, and supports both 'visits' and 'growth' modes to show how readers found your site or post. The component uses shared UI controls from the Shade library and integrates with the admin-x-framework for data fetching and settings.

apps/admin/src/posts/analytics/growth/components · high confidence

New Growth analytics tab for individual posts

A new Growth tab has been added to the post analytics view, displaying key performance metrics including free and paid member counts, Monthly Recurring Revenue (MRR), and top traffic sources. The component dynamically adjusts its layout and content based on whether paid memberships are enabled for the site, providing direct navigation links to filtered member lists for both free and paid segments.

apps/admin/src/posts/analytics/growth · high confidence

New Growth settings section in Admin

The Growth settings area in the Admin interface now includes dedicated configuration screens for Ghost Explore, the Social Web Network, Recommendations, Offers, and Tips & Donations. Users can enable Ghost Explore to promote their site and share growth data, toggle the Network feature to distribute posts to social platforms (with automatic disabling on private sites or unsupported domains), manage outgoing and incoming site recommendations, create discount offers for subscriptions, and configure one-time tips and donations via Stripe.

apps/admin/src/settings/growth · high confidence

New NQL string escaping utility

A new \nql-string\ package has been added to provide a shared \escapeNqlString\ function for safely embedding arbitrary values into NQL filters. This utility ensures that both single and double quotes are escaped while leaving backslashes unmodified, preventing parser errors and injection issues in newsletter links and other filter-based queries.

packages/nql-string · high confidence

New Portal settings interface with account page and Transistor integration

The admin portal settings have been restructured into a new tabbed interface (Signup options, Look & feel, Account page) that allows administrators to configure membership portal behavior. This update introduces an Account page tab featuring support email validation and a new Transistor integration section, enabling admins to display private podcast access for members. Additionally, the interface now supports gift subscription promotions via a dedicated toggle, provides a live preview of portal changes, and offers generated links and data attributes for theme integration.

apps/admin/src/settings/membership/portal · high confidence

New Post Analytics Overview page with Gift Link and Email Sending Status support

The Post Analytics Overview page has been updated to include a Gift Link usage card for eligible posts, displaying active token usage and allowing management via a modal. Additionally, the page now integrates an email sending status context to display newsletter analytics availability and conditions, ensuring users see accurate data based on email tracking settings and post types.

apps/admin/src/posts/analytics/overview · high confidence

New React Flow-based automation canvas with step insertion and email performance tracking

The automation editor now uses a new React Flow-based canvas that allows users to insert steps between existing nodes via a context menu and a dedicated 'Add Step Edge' component. The canvas includes zoom controls, viewport panning constraints to prevent losing the flow off-screen, and a step sidebar for configuring wait times and email content. Additionally, email performance metrics (opens, clicks, and top clicked links) are now visible directly on the canvas nodes and in a dedicated performance sidebar, with tracking status indicated by visual cues when analytics tracking is disabled.

apps/admin/src/automations/components/canvas · high confidence

New React admin API framework for shared data hooks and types

The admin-x-framework package now includes a comprehensive set of API hooks and TypeScript type definitions for the React admin interface. This adds data-fetching utilities (using React Query) and type contracts for core admin resources including actions, activitypub, automated emails, automations, comments, config, content types, custom fields, dunning, email previews, exports, feedback, files, gift links, images, integrations, members, newsletters, offers, posts, redirects, settings, staff, tags, and users. This provides a unified, type-safe data layer for the new React-based admin components.

apps/admin-x-framework/src/api · high confidence

New React admin shell with Ember-to-React migration gates

The admin interface now boots a new React application shell that wraps the existing Ember application. This shell provides a unified routing and theming layer, allowing specific screens (such as the editor, posts list, and member activity) to be progressively migrated to React behind Labs feature flags. When a flag is off, the shell renders the legacy Ember view; when on, it renders the new React component. The migration system ensures a smooth transition by handling state synchronization between the two frameworks and preventing split-brain states during flag toggles.

apps/admin/src · high confidence

New React hooks added to admin-x-framework

The admin-x-framework now includes a comprehensive suite of new React hooks to standardize data fetching, state management, and third-party integrations within the Admin interface. These additions include \useFeatureFlag\ for centralized Labs flag management, \useLimiter\ to enforce host plan limits, and \useForm\ for handling form state and validation. The framework also introduces hooks for analytics (\useActiveVisitors\, \useTinybirdQuery\), UI interactions (\useConfirmUnload\, \useHandleError\), and editor capabilities (\useKoenigFileUpload\, \useKoenigLinkSuggestions\). Additionally, hooks for external services like Featurebase and DocsBot are now available, along with utilities for permissions and API filtering.

apps/admin-x-framework/src/hooks · high confidence

New React hooks for mobile detection, dirty-state tracking, and pagination

The \apps/shade/src/hooks\ directory now includes three new hooks to support UI and data management features. \useIsMobile\ provides a reactive boolean indicating whether the viewport width is below 801px, enabling responsive layout adjustments. \useGlobalDirtyState\ introduces a context-based system to track unsaved changes across multiple components, ensuring the application correctly reports when a page has pending modifications. \useSimplePagination\ offers a utility for slicing data arrays and managing page navigation state, including bounds checking and automatic reset when data changes.

apps/shade/src/hooks · high confidence

New React post editor implementation

The admin interface now includes a new React-based post editor located in \apps/admin/src/editor\. This implementation introduces a dedicated save engine, a session-based state management system, and a settings sidebar with multiple sections (such as URL, Tags, Meta, and Access). It features a new publish and preview flow, a conflict banner for handling concurrent edits, and a date-time picker that respects the site's timezone. The editor is gated behind the \editorReact\ feature flag and is designed to replace the existing Ember editor.

apps/admin/src/editor · high confidence

New React-based Cmd+K global search in the Admin interface

The Admin interface now includes a new global search experience triggered by the Cmd+K (or Ctrl+K) shortcut, implemented in React. This feature introduces a modal that groups results by Staff, Tags, Posts, Pages, and configurable Billing items. It utilizes a lazy-loaded search index to improve performance, ensuring the heavy search libraries (like FlexSearch) are only loaded when the modal opens. The search supports highlighting matches, respects content status (prioritizing scheduled and draft items), and intelligently routes users to the correct destination, including handling cross-app navigation for billing sub-routes. The feature is gated by the \globalSearchReact\ flag, allowing for a controlled migration from the existing Ember-based search.

apps/admin/src/global-search · high confidence

New React-based Ghost Admin interface with gradual Ember migration

A new React-based Ghost Admin application has been introduced in the \apps/admin\ workspace, featuring an 'Ember Bridge' architecture that allows routes ported to React to render React components while unported routes fall back to the existing Ember admin, enabling a seamless, gradual migration. This new app includes a dedicated development server (port 5174), a Vite build configuration, and a new ESLint setup that enforces strict import boundaries (e.g., routing via \admin-x-framework\ instead of \react-router\, and API calls via the framework layer). The entry point (\index.html\) and asset handling are configured to support both the new React shell and the legacy Ember assets, including specific handling for favicons and the Koenig embed renderer.

apps/admin · high confidence

New React-based Post Analytics UI components

The Post Analytics section now uses a new set of React components (KpiCard, PostAnalyticsLayout, PostAnalyticsContent, PostAnalyticsHeader) to render the analytics interface. This includes a structured layout with a header that displays post details, tabs (Overview, Web, Newsletter, Growth), and actions like sharing and deleting, as well as KPI cards for displaying metrics. The header integrates with the new Admin 7 page chrome and handles post-specific logic such as email sending status, gift link management, and active visitor tracking.

apps/admin/src/posts/analytics/components · high confidence

New React-based member activity feed with email previews and granular filtering

Admin users can now view a comprehensive, filterable history of member interactions—including subscriptions, payments, logins, and email engagement—within a new React-based activity screen. This update introduces the ability to preview historical email content directly from the feed, with sandboxed rendering that neutralizes potentially unsafe links and scripts. The activity view also supports granular filtering by event type (e.g., toggling payment or email events) and includes a member search feature to quickly navigate between member profiles while maintaining activity context.

apps/admin/src/members/detail · high confidence

New React-based membership settings UI and acceptance tests

The membership settings section in the Admin app has been rewritten in React, introducing new components for Access, Analytics, Custom Fields, Gift Subscriptions, and Member Emails, along with comprehensive acceptance tests for each area. Users can now manage site visibility, subscription and post access rules, commenting permissions, and private site access codes (including server-side regeneration) via the new Access settings. Analytics controls for web analytics (with Tinybird configuration and plan-limit messaging), email opens/clicks, member sources, and outbound link tagging are now available. Custom fields can be created, edited, and reordered with drag-and-drop support, and archived fields are visible. Gift subscription shareable links can be copied and previewed. Welcome emails for free and paid members can be toggled and edited. The new UI leverages the Shade design system and admin-x-framework hooks for settings management and host limits.

apps/admin/src/settings/membership · high confidence

New React-based publish flow UI in the admin editor

The admin editor now includes a new React-based publish flow, introducing a multi-step modal interface for managing post publication. This update adds UI components for configuring publish options (such as publish type, email recipients, and scheduling), confirming the action, and handling completion states including success, email delivery errors, and limit warnings. It also introduces a gate dialog for pre-publish interstitials and robust recipient selection logic that handles tiers, labels, and newsletter scoping, along with tests for the underlying segment parsing and upgrade URL logic.

apps/admin/src/editor/publish/components · high confidence

New Shade pattern components for analytics, filtering, and content management

The Shade design system now includes a suite of new UI patterns for the admin interface. This adds a comprehensive Filters component with support for multiple field types (text, select, date, etc.) and operators, a FilterBar for displaying active filters, and a ColorPicker for selecting colors. Analytics dashboards gain a Ghost-specific Area Chart (GhAreaChart) for time-series data and KPI Cards/Tabs for displaying metrics with trend indicators. Content management is supported by a DirtyConfirmDialog to warn users about unsaved changes, an ImageUpload component with dropzone and preview states, and a KPI Card header layout.

apps/shade/src/components/patterns · high confidence

New Social Web account management and sharing preferences

The ActivityPub preferences view now includes dedicated settings for managing your social web identity and integrations. Users can configure their social web handle (username and domain), enable Bluesky content sharing via Bridgy Fed, and set up account migration aliases to move followers from other social web accounts like Mastodon. Additionally, a new Moderation section allows you to manage blocked users and domains, and toggle sensitive media display preferences.

apps/activitypub/src/views/preferences · high confidence

New Unsplash image selector component

The \kg-unsplash-selector\ package has been extracted and introduced, providing a dedicated modal interface for searching and inserting Unsplash photos into content. This component features a masonry gallery layout, debounced search functionality, and lazy-loading of images, while supporting both live API integration and in-memory mock data for testing.

koenig/kg-unsplash-selector · high confidence

New base adapter packages for cache, jobs, redirects, route-settings, scheduling, and SSO

Ghost now provides official base classes for several adapter types, allowing developers to build custom implementations with a standardized contract. The new packages include \@tryghost/adapter-base-cache\ for caching backends, \@tryghost/adapter-base-jobs\ for job queues, \@tryghost/adapter-base-redirects\ for URL redirects, \@tryghost/adapter-base-route-settings\ for route configuration, \@tryghost/adapter-base-scheduling\ for time-based jobs, and \@tryghost/adapter-base-sso\ for single sign-on. Each package defines the required methods (e.g., \get\/\set\ for cache, \enqueue\/\schedule\ for jobs) and includes TypeScript definitions, ESLint configurations, and Vitest test suites to ensure consistency across different adapter implementations.

packages/adapters · high confidence

New browser-mode acceptance test harness for the Admin app

A new acceptance testing tier has been introduced for the Admin application, allowing tests to run against the real React app in a real Chromium browser via Vitest Browser Mode. This harness uses MSW to provide a fake Ghost Admin API and a shared provider stack, enabling full-app integration tests that cover routing, shell chrome, and component interactions without the overhead of full e2e Playwright runs. The package includes utilities for mocking resources, boot overrides, and analytics, along with screen helpers and custom matchers to simplify test authoring.

apps/admin/test-utils/acceptance · high confidence

New bulk member management modals and redesigned CSV import

The admin interface now includes dedicated modals for bulk actions: adding or removing labels from members, unsubscribing members from newsletters (with an option to select specific newsletters), and deleting members (which automatically triggers a data backup download before deletion). Additionally, the members CSV import experience has been redesigned to support custom fields and improved mapping, gated by a Labs flag to allow gradual rollout alongside the previous import flow.

apps/admin/src/members/components/bulk-action-modals · high confidence

New comment management UI in the Admin app

The comments domain has been moved into the Admin app, introducing a new set of React components for managing comments. This includes a virtualized comment list with infinite scroll, a thread sidebar for viewing replies, and detailed comment cards showing metrics (likes, dislikes, reports, replies). Admins can now pin/unpin comments, hide/show individual comments, and disable commenting for specific members directly from the comment menu. The UI also supports filtering comments by member or post and displays comment content with expandable text for long entries.

apps/admin/src/comments/components · high confidence

New comments UI components for rendering, theming, and popups

The comments-ui app now includes core React components to handle the display and interaction of the comment interface. The ContentBox component manages the main comment area, automatically detecting and applying dark mode styling based on the container's color scheme. The Frame components (CommentsFrame and PopupFrame) encapsulate the UI within an isolated iframe to prevent style conflicts, with the CommentsFrame resizing to fit its content and the PopupFrame handling fixed-position overlays. Additionally, the PopupBox component manages the lifecycle and animation of various popup dialogs, ensuring smooth transitions when popups are opened or closed.

apps/comments-ui/src/components · high confidence

New common UI components for Portal

Added a suite of reusable UI components to the Portal, including ActionButton, BackButton, CloseButton, DatePicker, GiftCard, GiftDetailsToggle, GiftEmailPreview, InboxLinkButton, InputField, InputForm, MemberCustomFields, MemberGravatar, and NewsletterManagement. These components provide the foundational interface elements for address fields, gift subscriptions, email preferences, and general form interactions within the Portal.

apps/portal/src/components/common · high confidence

New context menu system for comments with admin and author actions

The comments UI now uses a new context menu system that provides role-specific actions for comments. Administrators can view comments in the admin panel, pin/unpin, hide/show, edit, and delete comments. Comment authors can edit or delete their own comments. Non-authors can report comments. The menu intelligently displays based on user role and comment status, with improved accessibility and viewport handling.

apps/comments-ui/src/components/content/context-menus · high confidence

New core service libraries and updated email/redirect logic

This change introduces several new service components in the core server: a DynamicRedirectManager for handling URL redirects with support for capture groups in query strings, an EmailContentGenerator for compiling HTML email templates into plain text, an InMemoryRepository for generic data storage, a LinkReplacer for modifying HTML links, and a MagicLink service for sending authentication emails. It also updates the Mailgun client to support optional per-recipient Message-Id headers for better email threading and refines the paid signup flow to skip redundant emails when a welcome email is active.

ghost/core/core/server/services · high confidence

New email settings UI with newsletter and automation email management

The email settings interface has been restructured into a dedicated section under the Admin settings, featuring a unified view for both newsletters and automation emails. Users can now enable or disable newsletter sending, configure default recipients (including specific segments like tiers, labels, and offers), and manage individual newsletter designs and sender addresses. The interface also includes a new tab for transactional/automation emails, allowing users to customize email design and verify sender addresses. Mailgun configuration remains available for bulk email delivery, with region selection and API key management. The new UI includes improved searchability with dedicated keywords for each subsection and handles email verification flows for both newsletter and automation email sender addresses.

apps/admin/src/settings/email · high confidence

New feedback and radial chart components for post analytics

The newsletter analytics view now includes dedicated UI components to display reader engagement data. A new Feedback component presents positive and negative feedback statistics with a tabbed interface, allowing users to view individual member responses and navigate to member profiles. Additionally, a NewsletterRadialChart component provides a customizable radial bar visualization for displaying percentage-based metrics, supporting various sizes and tooltips to enhance the clarity of analytics data.

apps/admin/src/posts/analytics/newsletter/components · high confidence

New frontend card styles and scripts for Ghost content blocks

The frontend now includes dedicated CSS and JavaScript assets for rendering Ghost content cards (such as audio, video, gallery, toggle, bookmark, CTA, header, signup, and collection cards) directly in the browser. This adds the visual styling and interactive behavior (e.g., video/audio playback, toggle states, gallery layouts) for these content blocks, ensuring they render consistently and responsively on the public site.

ghost/core/core/frontend · high confidence

New global UI components for ActivityPub interactions

The ActivityPub app now includes a set of reusable global components to enhance user interaction with federated content. These include an avatar component with follow/unfollow capabilities, a reply box that opens a modal for replying to posts, a back button for navigation, and a profile preview hover card that displays user details, follower counts, and a follow button. Additional components like an image lightbox for viewing attachments, a separator, a show-replies button for expanding threads, and suggested profiles for discovery have also been added to support the new social features.

apps/activitypub/src/components/global · high confidence

New hooks and providers for theme, unsaved-changes guarding, and image editing

The admin now includes dedicated React hooks and providers to manage user preferences, theme switching, and navigation safety. The \useTheme\ hook and \ThemeProvider\ allow users to switch between light, dark, and system appearance modes, with transitions suppressed during the switch to prevent flickering. A new \useUnsavedChangesGuard\ hook centralizes protection against accidental data loss by blocking in-router navigations, native hash-link clicks, and browser reloads when a screen has unsaved changes, presenting a confirmation dialog. Additionally, the \usePinturaEditor\ hook integrates the Pintura image editor, enabling users to crop, filter, and edit images directly within the admin interface.

apps/admin/src/hooks · high confidence

New kg-html-to-lexical package for HTML to Lexical conversion

The \@tryghost/kg-html-to-lexical\ package has been added to provide a dedicated utility for converting HTML strings into Lexical editor states. This new module exposes an \htmlToLexical\ function that leverages Lexical's headless editor and clipboard utilities to parse HTML, handle node generation from the DOM, and return a serializable editor state, effectively bridging raw HTML input with the Koenig editor's internal data structure.

koenig/kg-html-to-lexical · high confidence

New label picker with inline editing, creation, and deletion capabilities

The members label picker now supports creating new labels directly from the search input, as well as editing and deleting existing labels inline within the dropdown. The component intelligently prevents creating duplicate labels by hiding the create option when an exact match already exists, and provides immediate feedback for validation errors or network failures during save operations. This functionality is available in both the standalone LabelPicker component and the LabelFilterRenderer used for filtering members by label.

apps/admin/src/members/label-picker · high confidence

New multi-step members import wizard in the admin interface

The admin area now features a structured, multi-step wizard for importing members via CSV. This change introduces five distinct UI components that guide users through the process: an InitStep for file selection with drag-and-drop support, a MappingStep that allows users to preview CSV data and map columns to member fields, a ProcessingStep to indicate background processing, a CompleteStep to summarize import results and handle errors, and an ErrorStep for displaying critical failures. This replaces the previous single-page import experience with a more guided, step-by-step workflow.

apps/admin/src/members/components/bulk-action-modals/import-members/components · high confidence

A new newsletter analytics page has been added to the admin interface, providing detailed insights into email performance including open and click tracking, feedback statistics, and top-performing links. Users can now view the sending status of their newsletters and directly edit the destination URLs of tracked links within the analytics view. The page also includes a funnel visualization and redirects users to the general post analytics overview if the current post was not sent as a newsletter.

apps/admin/src/posts/analytics/newsletter · high confidence

New newsletter and web performance overview components in post analytics

The post analytics overview now includes dedicated \NewsletterOverview\ and \WebOverview\ components. The newsletter section displays open and click rates, a radial chart, and a list of top clicked links, while the web section shows unique visitors, a traffic area chart, and reader sources. Both components integrate with the new Admin 7 UI controls and provide a consolidated view of email and web performance metrics for individual posts.

apps/admin/src/posts/analytics/overview/components · high confidence

New onboarding checklist and redirect logic in the admin shell

The admin interface now includes a dedicated onboarding flow that guides new users through key setup tasks. A new \OnboardingRedirect\ component intercepts navigation to ensure users with an active checklist are directed to the onboarding screen, preserving their intended destination via a \returnTo\ parameter. The onboarding route itself presents a checklist of steps (such as customizing design, exploring the editor, and building an audience) which can be marked complete to navigate to relevant sections or dismiss the flow. This change introduces the core routing, state management hooks, and UI components for this guided experience within the admin shell.

apps/admin/src/onboarding · high confidence

New onboarding checklist and share publication dialog in Admin

The Admin app now includes a dedicated onboarding checklist view that guides users through setting up their Ghost publication, featuring a step-by-step progress tracker, a completion state with a dashboard exploration button, and a skip option. This view is supported by a new animated logo component that respects dark mode preferences. Additionally, a share publication dialog has been added, allowing users to share their site on X, Threads, Facebook, and LinkedIn, or copy the site link directly from the onboarding flow.

apps/admin/src/onboarding/components · high confidence

New popup components for comments UI

The comments UI now includes a set of new popup components located in the popups directory. These include an Add Details popup for completing user profiles, a CTA popup for call-to-action prompts, a Delete popup for confirming comment deletion, a Report popup for flagging comments, and a GenericPopup wrapper for consistent modal behavior. Each popup provides a consistent user experience with close buttons, transitions, and appropriate state management for actions like submitting or deleting.

apps/comments-ui/src/components/popups · high confidence

New post analytics hooks for gift links, feedback, newsletters, and referrers

The admin app now includes a suite of new React hooks in the post analytics module to power detailed post performance views. These hooks fetch and process specific data points: \useGiftLinkUsage\ retrieves visit and view counts for gift links via Tinybird; \usePostFeedback\ loads user feedback scores; \usePostNewsletterStats\ calculates send, open, and click rates along with top-performing links; \usePostReferrers\ aggregates traffic sources and MRR totals; and \usePostSuccessModal\ manages the post-publish confirmation UI. Comprehensive test suites have been added for each hook to verify data handling, loading states, and error resilience.

apps/admin/src/posts/analytics/hooks · high confidence

New post preview modal with browser and email rendering

The React editor now includes a self-contained PostPreviewModal that lets you see how a post will appear to readers. It supports two formats: a browser preview that renders the post as a free, paid, or tiered member (with device toggles for desktop and mobile), and an email preview that shows the newsletter version, allows selecting the newsletter, and lets you send a test email to yourself. The modal requires the post to be saved before rendering, handles audience segments correctly (excluding contributors from tier previews), and provides a Publish button for users with permission.

apps/admin/src/editor/preview · high confidence

New post settings sidebar with granular sections

The React editor now features a dedicated settings sidebar alongside the post editor, allowing writers to manage non-body fields without leaving the main view. This sidebar is organized into distinct sections including URL (slug editing), Publish date, Tags, Access (visibility and tier selection), Authors, Code injection, Keyboard shortcuts, Meta data, Social cards, Template, Show title, Post history, and Delete. The implementation introduces a shared editing session port to stage and commit changes, ensuring that fields like meta titles and descriptions are validated against character limits before saving, and that access controls correctly filter available tiers and authors based on user roles.

apps/admin/src/editor/settings · high confidence

New public-facing Tags list page in Admin

The admin interface now includes a dedicated Tags list page that displays public and internal tags separately via a toggle. The page supports pagination with infinite scroll, shows tag descriptions and post counts, and provides an empty state with a link to create new tags. Internal tags are identified by a '\#' prefix and can be viewed by switching tabs. The implementation uses lazy loading for the route components to optimize bundle size.

apps/admin/src/tags · high confidence

New repository configuration and tooling setup

The repository now includes a comprehensive set of configuration files to standardize development workflows and enforce architectural boundaries. A new \.coderabbit.yaml\ file configures the CodeRabbit AI review tool with specific rules for TypeScript type safety, API contract semantics, and UI component reuse, while disabling estimated review effort and docstring checks. Architectural integrity is enforced via \.dependency-cruiser.cjs\, which defines forbidden import paths to prevent circular dependencies between server/frontend layers and restricts the admin app's internal domain cross-references. Development hygiene is improved with \.editorconfig\ for consistent formatting, \.gitattributes\ for line endings, and a unified \.gitignore\ covering build artifacts, IDE files, and local configs. Additionally, \.lintstagedrc.cjs\ integrates linting and formatting into the pre-commit hook, and \.env.example\ provides a template for local Docker development environment variables.

(repo-wide) · high confidence

New retention offer management in Growth settings

The admin settings now include a dedicated interface for managing retention offers, allowing you to configure and edit separate discount rules for monthly and yearly subscription plans. This update introduces new modals for creating and editing these offers, a helper system for generating standardized offer names and calculating discount displays, and a success screen with one-click sharing to social platforms. The offers list view has been enhanced to display retention-specific metrics, including redemption counts and direct links to view affected members.

apps/admin/src/settings/growth/offers · high confidence

New routing and feature-flag override providers in admin-x-framework

The admin-x-framework now includes a new RouterProvider that wraps React Router to handle navigation, scroll-position restoration, and feature-flag overrides from URL parameters. It introduces a custom useNavigate hook that supports cross-app navigation via an externalNavigate callback, and a NavigationStackProvider that tracks the browser history stack to enable back-navigation logic. Additionally, a FeatureFlagOverridesContext and its associated hook allow components to access enabled flags derived from the current URL search params, with a callback to notify when these overrides change.

apps/admin-x-framework/src/providers · high confidence

New settings UI components and Koenig editor integration

The settings interface now includes a suite of new UI components, including a lazy-loaded CodeMirror-based code editor, color pickers, and an HTML editor powered by the Koenig lexical engine. The Koenig editor is now loaded asynchronously via a dedicated loader that caches the bundle to avoid redundant network requests and supports retrying on failure. Additionally, new components for confirmation modals, limit alerts, and preview modals have been added to standardize user interactions within the settings area.

apps/admin/src/settings/components · high confidence

New settings utility library and tests

The admin settings area now includes a new collection of utility functions and corresponding tests in \apps/admin/src/settings/utils\. This adds helpers for URL formatting, HTML escaping, debouncing, and locale validation, alongside specific tools for generating embed codes, handling portal and offer preview URLs, and managing iframe buffering for previews.

apps/admin/src/settings/utils · high confidence

New share modal for posts

The Portal now includes a share modal that allows users to share posts via social platforms (X/Twitter, Facebook, LinkedIn, Threads, Bluesky), email, or by copying the link. The modal displays a preview of the post including its image, title, excerpt, favicon, site name, and author, and handles data gathering from the host page's metadata (OG tags, canonical links) to populate the share content.

apps/portal/src/components/pages/share · high confidence

New shared ChipPicker component with improved keyboard handling

A new shared ChipPicker component has been introduced in the admin app's shared pickers directory, providing a chips-in-a-field interface for selecting multiple options. This component features a custom implementation for keyboard navigation and list management, specifically ensuring that pressing Escape closes the dropdown list without dismissing the surrounding settings pane, a behavior verified by new unit tests.

apps/admin/src/shared/pickers · high confidence

New shared TagPicker component for selecting and creating tags

A new shared \TagPicker\ component has been introduced in the admin app, providing a unified interface for selecting existing tags or creating new ones via a searchable chip-based input. This component, along with its underlying \tag-selection\ logic, handles tag identity (distinguishing between existing and typed tags), debounced server-side search, and internal tag detection (e.g., names starting with \\#\). It is designed to be reused across the editor's settings sidebar and the posts list's bulk actions, ensuring consistent tag selection behavior throughout the admin interface.

apps/admin/src/shared/tags · high confidence

New shared admin utilities and components

This change introduces several new shared components and utilities to the admin interface. It adds an AdminLink component that intelligently routes navigation: links to React-owned routes use the modern router, while links to Ember-owned routes fall back to native hash anchors to ensure compatibility. A new cleanTrackedUrl utility strips Ghost attribution parameters (ref, attribution\_id, attribution\_type) from URLs, with an option to produce a compact display version. The gift-link module provides logic to determine if a user can share a gift link for a post, enforcing role-based permissions (Owner, Administrator, Editor, Super Editor) and post visibility rules (gated posts only). Additionally, a FeatureImagePlaceholder component is added for UI consistency, and a NotFound component is introduced for handling 404 states. Tests are included for the gift-link logic to ensure correctness.

apps/admin/src/shared · high confidence

New shared utility functions added to the admin framework

The admin-x-framework now includes a suite of new utility modules in its \src/utils\ directory to standardize common logic across admin applications. These additions include analytics tracking helpers for Plausible and filter usage, country and currency formatting utilities, robust error handling classes with user-friendly messages, and logic for managing feature flag overrides. The framework also gains helpers for lazy-loading React components, post status and metrics calculations, recipient filter parsing for email campaigns, traffic source normalization for analytics, and API endpoint URL construction for stats.

apps/admin-x-framework/src/utils · high confidence

New shared utility library for Shade components

The Shade application now includes a new shared library (\apps/shade/src/lib\) containing foundational utilities for the UI layer. This includes \ds-utils.ts\, which provides helper functions for merging Tailwind CSS classes, debouncing, finding scroll parents, and formatting dates and times (including timezone-aware display formatting). It also introduces \overlay-escape.ts\, a utility to handle keyboard escape events for Radix overlays without interfering with legacy modal shells, and re-exports these utilities via \utils.ts\ for easy consumption by other Shade components.

apps/shade/src/lib · high confidence

New site settings UI with dedicated modals for design, navigation, and announcement bar

The site settings section has been restructured into a new, searchable interface that groups settings into four distinct areas: Design & branding, Theme, Navigation, and Announcement bar. Each area now opens a dedicated modal for configuration. The Design & branding modal allows users to customize global brand settings (logo, colors, fonts) and theme-specific custom settings with live previews for both homepage and post views. The Theme modal provides a unified interface to browse official themes, upload custom themes (with limit checks), and edit theme code. The Navigation modal enables editing of primary and secondary site menus with validation and icon support. The Announcement bar modal allows configuring the site-wide announcement text, background color, and audience visibility (public, free members, paid members). These changes replace the legacy settings plumbing and components, providing a more cohesive and modern user experience for managing site appearance and structure.

apps/admin/src/settings/site · high confidence

New standardized page layout templates for Shade

Added new \ListPage\, \DetailPage\, and \ModalPage\ component templates in the Shade application to standardize the structure of list, detail, and modal screens. \ListPage\ provides a sticky, full-bleed header with a scrollable body for consistent list views, while \DetailPage\ offers a non-sticky header and scrollable body for single-entity views. \ModalPage\ supplies a standardized layout for full-width modal content. Storybook stories are included to demonstrate usage and document the composition patterns for these templates.

apps/shade/src/components/page-templates · high confidence

New theme management and code editor interface

The theme settings area now features a comprehensive new interface for managing site themes. Users can browse official themes with variant previews, install and activate themes, and edit theme code directly in the browser using a file tree and code editor. The update includes improved validation feedback for theme uploads, clearer error modals for invalid themes, and a streamlined workflow for activating and managing installed themes.

apps/admin/src/settings/site/theme · high confidence

New user management interface in General Settings

The user management section in General Settings has been restructured into a tabbed interface, introducing dedicated tabs for Profile, Email Notifications, and Social Links. This update adds a new Change Password form with stricter validation rules (including checks against common patterns and blog metadata), a Role Selector that supports a new 'Super Editor' role via feature flags, and granular email notification toggles for engagement, members, and revenue events. Additionally, a Staff Token management component is now available for the current user to view and regenerate their access key.

apps/admin/src/settings/general/users · high confidence

New utility functions for admin navigation, URL handling, and platform detection

The admin application now includes several new utility modules in the utils directory to support the new admin toolbar and editor integration. A new \navigateTo\ function provides safe cross-app navigation by validating external URL schemes (allowing http, https, mailto, tel) to prevent XSS attacks while handling internal hash-based routing. The \getAdminToolbarUrl\ utility appends an admin flag to site URLs for toolbar integration. Platform detection is now handled by \isMacPlatform\ to determine appropriate keyboard shortcuts, and \deepMerge\ supports merging user preference objects. Additionally, \fetchKoenigLexical\ ensures the editor loads correctly in the React admin shell by dynamically importing the ESM module and its associated stylesheet, and a \deferred\ promise helper is available for asynchronous control flow.

apps/admin/src/utils · high confidence

New virtualized tags list component in the admin interface

The admin interface now includes a new \TagsList\ component located in \apps/admin/src/tags/components\. This component renders a table of tags with virtualized scrolling for performance, displaying tag names, slugs, and post counts. It integrates with the new Admin 7 UI theme via the \useShade\ hook, conditionally showing edit buttons and adjusting layout based on the theme version, and uses \AdminLink\ for internal navigation while keeping external post-filter links as standard anchors.

apps/admin/src/tags/components · high confidence

New welcome email customization and preview in Membership settings

The Membership settings area now includes a dedicated editor for Free and Paid member welcome emails. This change introduces a modal interface that allows you to edit the email subject and content using the Koenig rich-text editor, customize design elements (such as colors, fonts, and header images), and configure sender details. It also provides a live preview of the email in an iframe, validation for required fields, and the ability to send a test email to verify how it will appear in an inbox.

apps/admin/src/settings/membership/member-emails · high confidence

New welcome email design customization controls

Admin users can now customize the visual appearance of welcome emails through a new design interface. This adds controls for background, header, button, link, divider, and section title colors (including semantic 'Accent' and 'Auto' options that adapt to contrast), as well as typography settings for body and heading fonts and weights. Users can also adjust button styles (fill/outline), button and image corner shapes (square, rounded, pill), and link styles (underline, regular, bold). A live preview updates in real-time to reflect these changes, and the system resolves semantic color values to specific hex codes for consistent rendering.

apps/admin/src/settings/email-design · high confidence

Ported posts and pages list to React

The posts and pages list in the admin interface has been ported from Ember to React, introducing a new set of components for the list view. This includes the main list row with updated metric tooltips and email status indicators, a new right-click context menu, and bulk action modals for adding tags, changing access, and confirming destructive actions. The port also brings a new UI for managing saved post views, allowing admins to save, edit, and delete custom filtered views with color coding.

apps/admin/src/posts/list/components · high confidence

Ported posts and pages list to React with preserved selection and bulk-action behavior

The posts and pages list in the admin interface has been ported from Ember to React, behind a feature flag. This change introduces a new bucket-based composition logic that sequences the display of scheduled, draft, and published/sent posts to match the previous Ember behavior, ensuring the list remains empty until all initial data loads. It also implements modifier-click selection (Cmd/Ctrl+Click, Shift+Click, Cmd+A) and bulk actions (delete, edit, feature, etc.) with client-side cache patching to preserve scroll position and selection state, mirroring the original Ember implementation's handling of these interactions.

apps/admin/src/posts/list · high confidence

Shade design system initializes with Tailwind v4 and ShadCN/UI integration

The Shade design system is now established as a standalone package for micro-frontends, built on Tailwind v4 and configured with ShadCN/UI. It provides a CSS-first styling contract where styles are scoped under a \.shade\ container and dark mode is toggled via a \.dark\ class. The system includes a comprehensive set of semantic CSS variables for colors, surfaces, and states, along with a preflight reset to ensure consistent baseline styles. Developers can consume components via layer-specific subpaths (e.g., \@tryghost/shade/components\) and utilize the \ShadeApp\ wrapper for standalone surfaces. The package also includes ESLint configuration, Vite build settings, and Storybook integration for documentation and testing.

apps/shade · high confidence

Signup form re-architected with React, Vite, and Storybook

The signup form has been rebuilt from the ground up using React and Vite, replacing the previous implementation. This change introduces a component-based architecture with Storybook for isolated UI development and testing, and adds Playwright for end-to-end browser testing. The form now supports multiple display modes (full, minimal, centered, full-width) and includes improved accessibility features, such as proper ARIA attributes for error states and screen-reader-friendly transitions. The build process now generates a UMD bundle for embedding, with a dedicated development server for local preview.

apps/signup-form · high confidence

Support for creating and mapping custom fields during member import

The members import workflow now allows publishers to map CSV columns directly to site custom fields (metafields) and create new custom fields on the fly if a column does not match an existing one. The mapping step features a dedicated field picker that lists membership fields and available custom fields, with improved auto-detection that correctly identifies namespaced metafield columns and prevents them from being incorrectly mapped to standard fields like email or name. A new inline form lets users define the name and type for a new custom field directly within the import mapping table, and the system handles validation errors and site limits gracefully.

apps/admin/src/members/components/bulk-action-modals/import-members/custom-fields · high confidence

Architecture

Ghost Admin app relocated to apps/ember-admin

The Ember.js-based Ghost Admin application has been moved from the root ghost-admin directory into the apps/ember-admin folder. This relocation includes the full application source code, configuration files (such as .editorconfig and .ember-cli), and linting rules, establishing the new location as the canonical home for the admin interface.

apps/ember-admin · high confidence

Behavioural changes

ActivityPub app restructured with new routing and lazy loading

The ActivityPub application has been reorganized to support lazy-loaded routes and a new base path configuration. The app now conditionally renders only when ActivityPub is enabled, wrapping the UI in a ShadeApp component with specific styling classes. Routing has been updated to use lazy loading for views like Reader, Notes, Notifications, Explore, Profile, and Preferences, improving initial load performance. The base path is now dynamically determined, defaulting to 'activitypub' in production and empty in test environments. Additionally, the app exports key components and hooks for external use, including feature flags and notification counts.

apps/activitypub/src · high confidence

ActivityPub app styling and animation definitions

The ActivityPub application now includes a dedicated stylesheet defining visual presentation and interaction feedback. This adds CSS classes for note and profile content rendering, including specific typography, link coloring, list styling, and blockquote borders. It also introduces animation keyframes for slide-up and slide-down transitions, as well as a 'bump' effect for action buttons, ensuring consistent UI behavior for user interactions within the ActivityPub feed.

apps/activitypub/src/styles · high confidence

Admin 7 page chrome foundations and sidebar visibility logic

The Admin interface now uses a new \AdminLayout\ component that establishes the Admin 7 page chrome, including consistent content widths, gutters, and header padding across list and detail pages. Sidebar visibility is now determined by a new \useAdminSidebarVisibility\ hook that combines Ember's legacy state with React route handles, allowing React routes to explicitly opt out of the sidebar (e.g., the editor) while preserving the sidebar for other areas. Contributors see a simplified layout with a floating user menu instead of the full sidebar. The layout also handles dunning lock takeovers by freezing the main content scroll and marking covered regions as inert for accessibility. Acceptance tests verify the new layout structure, sidebar visibility rules, and navigation behavior for both React and Ember routes.

apps/admin/src/layout · high confidence

Admin X Framework restructured with modern build tooling and configuration

The Admin X Framework has been restructured to serve as the shared runtime for Ghost's React admin surfaces, introducing a new Vite-based build configuration that outputs both ES and CJS modules. TypeScript is now configured to enforce erasable syntax and strict type checking, while ESLint has been migrated to the flat config format using shared rule profiles. The framework also integrates Vitest for unit testing and provides a \FrameworkProvider\ and \RouterProvider\ to manage data and routing for the admin shell, ActivityPub app, and Koenig editor.

apps/admin-x-framework · high confidence

Admin comments page now supports advanced filtering and deep-linking

The comments management interface in the Admin app has been refactored to support a new filter engine, allowing administrators to filter comments by status, date, body text, post, author, and reported status. This change introduces a dedicated filter catalog and query serialization logic that handles timezone-aware date boundaries and maps internal fields to their underlying data keys (e.g., mapping 'body' to 'html'). The comments screen now supports deep-linking to specific comments or threads via URL parameters, enabling direct navigation to a single comment or a specific thread context. Additionally, the UI now includes a 'Disable commenting' action for members, allowing admins to prevent future comments from specific users while optionally hiding their existing comments.

apps/admin/src/comments · high confidence

Admin filters now use a composable codec system to preserve values and handle special characters

The Admin's filter engine has been refactored to use a composable codec architecture that separates field addressing from value semantics. This change ensures that filter values are preserved accurately during round-trips (serialize and parse), fixing issues where text filters lost values ending in a dollar sign or contained single quotes. The new system also introduces proper handling of NQL escaping, relative date preservation, and field-specific icons, providing a more robust and consistent filtering experience for members and content.

apps/admin/src/shared/filters · high confidence

Admin now shows progressive payment failure warnings and a full-page takeover

When a site's payment fails, the Admin now displays a warning banner during the initial phase and escalates to a full-page overlay in the final quarter of the payment window. The banner and overlay provide clear, role-specific messaging: owners see a "Pay now" link to the billing app, while staff see a reminder to contact the owner. The takeover intelligently stands down on the billing and data-export routes to keep those tools usable, and it respects existing modals to prevent focus conflicts.

apps/admin/src/dunning · high confidence

Admin settings now use client-side routing with unsaved-changes protection

The settings interface has moved from a modal-based overlay to a dedicated client-side route within the admin shell. This change introduces an unsaved-changes guard that prompts users to confirm before leaving dirty pages or closing dialogs via the browser back/forward buttons or the exit button. The settings UI is now structured around a new \routes.tsx\ file that defines lazy-loaded route children for all settings sections (such as staff, design, growth, and integrations), and the \api.ts\ file exposes public surfaces like \settingsRouteChildren\ and \canAccessSettingsRoute\ for the admin shell to consume.

apps/admin/src/settings · high confidence

Advanced settings page restructured with new UI components and capabilities

The Advanced settings page has been rebuilt using the new Shade UI components, introducing a searchable, section-based layout. This update includes a redesigned Integrations section for managing built-in and custom integrations (including webhooks and API key regeneration), a new History section that opens a detailed event log modal with filtering, and a reorganized Danger Zone with clearer descriptions for destructive actions like deleting content, resetting authentication, and invalidating gift links. Additionally, the Labs section now features a tabbed interface separating Beta and Private features, and the Migration Tools section has been enhanced with a new Export tab that supports selective component exports and sync exports to an archive host.

apps/admin/src/settings/advanced · high confidence

Announcement bar now uses a dedicated React component with session-based visibility

The announcement bar implementation has been refactored into a standalone React application located in \apps/announcement-bar/src\. It now renders via a dedicated root div and fetches site settings asynchronously from the Ghost API. A key behavioral change is that the bar's dismissal state is persisted in the browser's \sessionStorage\, meaning the bar will remain closed for the duration of the current browsing session rather than resetting on every page load or navigation.

apps/announcement-bar/src · high confidence

Centralized Shade application context and UI providers

The Shade application now uses a new \ShadeProvider\ component to manage shared state and UI infrastructure. This provider exposes context for dark mode, admin version (Admin 7), and control shape (pill vs. rounded), while also wrapping the application with a global dirty-state tracker, Radix tooltip support, and a custom-styled toast notification system (Toaster) rendered via portal.

apps/shade/src/providers · high confidence

Centralized shared configuration for linting, TypeScript, and build tools

The repository now provides shared, reusable configuration packages for ESLint, TypeScript, Vite, and Vitest to standardize development across workspaces. Developers can now use the \reactAppConfig\ factory for React frontend apps (supporting options for TypeScript, Tailwind v4/v3, and Storybook) and the \nodeLibConfig\ for Node libraries via the \@internal/cfg-eslint\ packages. A new \publicAppViteConfig\ factory standardizes the build setup for public UMD/IIFE apps like Portal and Comments, while a shared \createVitestConfig\ enforces consistent test and coverage settings for internal packages. A new \configs/typescript/esm.json\ establishes a baseline TypeScript configuration for ESM modules.

configs · high confidence

Comments UI adds fingerprinting-prevention build plugin and modernizes its development tooling

The Comments UI app now includes a Vite plugin that patches bundled editor libraries (ProseMirror, TipTap, w3c-keyname) to replace high-entropy browser detection APIs (navigator.vendor, navigator.platform, navigator.maxTouchPoints) with safer userAgent checks, helping avoid browser fingerprinting restrictions in Safari and by trackers like DuckDuckGo. Alongside this privacy improvement, the app has migrated its build system to Vite, adopted TypeScript with strict erasable syntax, configured Tailwind CSS for styling, and set up Playwright for end-to-end testing, providing a more robust and faster development experience for contributors.

apps/comments-ui · high confidence

Comments UI component library refactored to kebab-case

The comment display components in the comments-ui application have been reorganized and renamed to follow kebab-case file naming conventions. This structural change includes the creation of new files for core UI elements such as avatars, action buttons (like, dislike, reply, more), and layout containers, ensuring consistent naming across the component library.

apps/comments-ui/src/components/content · high confidence

Comments UI migrated to TypeScript with new threading and admin API utilities

The comments-ui application has been fully migrated to TypeScript, introducing a suite of new utility modules to support advanced features. A new admin API layer (\admin-api.ts\) enables moderation actions like pinning and hiding comments via iframe communication, while the public API (\api.ts\) now enforces a default limit of 20 comments and implements pagination filters based on the first comment's creation timestamp. Threading capabilities are significantly enhanced with \thread-graph.ts\ and \threading-context.ts\, which calculate nested reply depths and manage viewport windows for deeply nested discussions. Additionally, \helpers.ts\ introduces comment permalink support via URL hashes, and \editor.ts\ configures the TipTap editor with specific extensions for blockquotes and hard breaks.

apps/comments-ui/src/utils · high confidence

Comments-UI app refactored to TypeScript with new state management and admin moderation

The Comments-UI application has been migrated from JavaScript to TypeScript, introducing strict type definitions for comments, members, and application context. This refactor includes a new centralized action system (actions.ts) that manages state updates for loading, ordering, and adding comments, as well as dedicated admin API integration for moderation features like hiding comments and viewing hidden content. The app now supports threaded replies, admin-specific authentication flows via an auth-frame, and improved handling of comment pagination and deduplication to prevent duplicate entries.

apps/comments-ui/src · high confidence

Custom field filters now use metafield addressing and type-aware operators

The Admin interface's member custom field filtering has been rewritten to use a metafield-based addressing scheme, where field identifiers are constructed from namespace and key (e.g., \metafields.custom.shipping\). This change introduces type-aware filtering: scalar fields (text, date, number) use their standard operators, while composite fields (like addresses) restrict the whole field to presence checks ('is set'/'is not set') and allow specific parts (like 'city' or 'country') to use text or set operators respectively. The filter UI now dynamically adjusts available operators and input controls based on the selected part of a composite field, ensuring that invalid operator-value combinations are prevented.

apps/admin/src/members/custom-fields · high confidence

Deprecated heading components in Shade layout

The Shade layout area now includes deprecated H1–H4 and HTable components that wrap the shared Text primitive for backward compatibility. These components are marked as deprecated in favor of composing product-specific styles using the Text primitive directly, ensuring consistent typography while signaling that new usage should migrate away from these specific heading wrappers.

apps/shade/src/components/layout · high confidence

Email address parsing now normalizes domains to ASCII

The parse-email-address package has been restructured as a standalone library within the monorepo and updated to use an ESM build. For users, the key behavioral change is that the returned domain part of an email address is now consistently converted to ASCII (punycode) format, ensuring that internationalized domain names are normalized (e.g., '中文.example' becomes 'xn--fiq228c.example') while the local part remains unchanged.

packages/parse-email-address · high confidence

General settings section migrated to Shade UI with expanded social and SEO capabilities

The General settings area has been rebuilt using the Shade design system, introducing a searchable interface for managing site title, description, time zone, language, users, SEO metadata, social accounts, and analytics. This update adds support for new social platforms (Threads, Bluesky, Mastodon, TikTok, YouTube, Instagram, LinkedIn) alongside Facebook and X, with automatic URL normalization and validation. SEO management now includes a toggle for LLM/AI search engine structured data and a live search engine preview. The staff management section now includes an invitation modal with role-based access control and a dedicated modal for viewing system information, version details, and update status.

apps/admin/src/settings/general · high confidence

Improved email sending status display and reliability

The email sending progress banners in the admin posts list now display clearer status messages, including formatted progress counts (e.g., "1,200 of 5,000") and time estimates (e.g., "About 1 minute left") that are more stable and less prone to flashing. Additionally, the system now correctly handles stale status data by refreshing the email sending state upon entry, ensuring that users see the most current progress or failure status rather than potentially outdated cached information.

apps/admin/src/posts/email-sending-status · high confidence

Improved members filter accuracy and label management reliability

The members page now ensures filters are interpreted accurately by waiting for required context—such as the site timezone and custom field definitions—before hydrating the filter state, preventing misinterpretation of date or metafield values. A new \useLabelPicker\ hook streamlines label management by automatically adopting existing labels when a creation attempt results in a duplicate, and correctly handling slug changes during edits. Additionally, the member list now displays a banner warning when members have active subscriptions across multiple Stripe customers, allowing administrators to dismiss the notification with a per-user preference.

apps/admin/src/members/hooks · high confidence

Improved newsletter delivery rates and email suppression handling

Ghost now retains newsletter subscriptions for members even when they are on the suppression list, ensuring that future email campaigns can reach them once the suppression is lifted. This change also improves the overall handling of email suppression logic to enhance delivery reliability.

ghost · high confidence

Improved reliability and accuracy in the members CSV import process

The members import flow now correctly handles CSV files with ragged rows, ensuring that columns present only in later rows are not silently dropped. The parser also strips byte order marks (BOM) from the first row so headers match correctly, and the error report download now uses the standard members export format with proper escaping for formula-like values and complex fields like labels and newsletters. Additionally, the import mapping logic has been updated to use metafield terminology for custom fields and includes support for mapping the Gift ID field.

apps/admin/src/members/components/bulk-action-modals/import-members · high confidence

Introduce new Admin 7 UI components for the Automations feature

The Automations interface has been updated to use the new Admin 7 design system, introducing dedicated components for the automation header, status badges, and a help card layout. The automation list now displays server-sent descriptions (falling back to slug-based defaults) and run analytics (last entry, total entries, in progress) with a skeleton loading state, while ensuring row links navigate correctly without interfering with clickable analytics cells. These changes are accompanied by comprehensive tests for the list view and type definitions for the automation editor sidebar.

apps/admin/src/automations/components · high confidence

Introduced post-scoped analytics state management

The admin interface now uses a dedicated React context to manage post-specific analytics state, including the current post data, loading status, and selected date range. This change centralizes the retrieval of post details (such as authors, tags, and engagement metrics) and ensures that this scoped state is distinct from global framework data, providing a cleaner separation of concerns for post analytics features.

apps/admin/src/posts/analytics/providers · high confidence

Introduces shared settings providers and context infrastructure

The settings area now uses a dedicated provider hierarchy to manage global state and UI concerns. A new \SettingsAppProvider\ initializes shared data (official themes, Zapier templates, search service, sorting state) and wraps the app with a \GlobalDataProvider\ that fetches and exposes site settings, configuration, and user data via a React context. A \ConfirmationProvider\ centralizes modal confirmation logic, while a \DialogPortalProvider\ ensures modals render correctly outside stacking contexts. Additionally, \staffProfileModalPaths\ are exported to keep routing logic consistent between the settings router and the admin shell.

apps/admin/src/settings/providers · high confidence

Limit service source code converted to TypeScript

The limit-service package source files have been migrated from JavaScript to TypeScript, introducing explicit type definitions for limit configurations, database queries, and service options. This change provides stricter type safety for limit checks (max, periodic, flag, and allowlist) and improves developer experience through better IDE support and compile-time error detection within the service.

packages/limit-service · high confidence

Members domain refactored into a new React-based admin structure

The members management functionality has been reorganized into a new directory structure under apps/admin/src/members, establishing a clean public API surface in api.ts and separating concerns into dedicated modules for filtering (member-filter-catalog.ts, member-filter-query.ts), field definitions (member-fields.ts), and query parameter building (member-query-params.ts). This change introduces a new filter engine that supports custom fields and newsletters, adds acceptance tests for the redesigned members import flow (controlled by the membersImportRedesign flag), and includes new utilities for member formatting and URL building, laying the groundwork for the Admin 7 page chrome.

apps/admin/src/members · high confidence

Migrated Koenig packages to TypeScript and Vitest

The Koenig editor packages (kg-card-factory, kg-clean-basic-html, kg-converters) have been migrated from JavaScript to TypeScript and from Mocha to Vitest for testing. This change improves type safety and developer experience by providing strict type checking and faster test execution, while maintaining the same public APIs and functionality for consumers like Ghost Admin and the server-side renderer.

koenig · high confidence

Migrated kg-default-cards to TypeScript

The \kg-default-cards\ package has been converted from JavaScript to TypeScript. This migration introduces strict typing for card payloads and rendering logic, adds an \ambient.d.ts\ file to declare types for external dependencies (such as \simple-dom\, \@tryghost/url-utils\, and \luxon\), and updates all card implementations (including audio, bookmark, embed, and file cards) to use \.ts\ extensions and explicit type annotations.

koenig/kg-default-cards · high confidence

Migrated kg-default-nodes to TypeScript with improved HTML import fidelity

The \kg-default-nodes\ package has been rewritten in TypeScript, introducing a new \generateDecoratorNode\ utility that simplifies the creation of card nodes and standardizes the \exportDOM\ signature to align with Lexical. This migration includes extended text, heading, and quote nodes that now correctly parse HTML styling from Microsoft Word (such as bold, italic, underline, and strikethrough via \\<span\>\ tags) and preserve legacy mobile editor behavior in blockquotes. Additionally, the audio node parser has been updated to correctly handle duration values during HTML import, and the package now exports a comprehensive list of default nodes and utility functions for consistent usage across the editor.

koenig/kg-default-nodes · high confidence

New ActivityPub notification view with grouped items and sensitive media controls

The ActivityPub notifications view has been rebuilt to support grouped notifications (likes, reposts, follows) and individual items (replies, mentions), featuring a new compound component structure for consistent layout and iconography. This update introduces sensitive media controls, allowing users to manage the display of potentially sensitive content within notifications, and includes specific UI adjustments such as badge alignment fixes and DOM validation improvements for better accessibility and visual consistency.

apps/activitypub/src/views/notifications · high confidence

New Ember-to-React bridge for data syncing and state management

The Admin now includes a dedicated \ember-bridge\ module that synchronizes state between the legacy Ember application and the new React interface. This bridge automatically invalidates React Query cache entries when Ember data changes (such as creating a tag via a post save), syncs authentication status, and manages feature flags. It also provides a \ForceUpgradeGuard\ to block React routes during billing upgrades and handles the mounting of the Ember app within the React shell.

apps/admin/src/ember-bridge · high confidence

New Labs settings UI with feature toggles and YAML editors

The Labs settings page has been rebuilt in React, introducing a new \FeatureToggle\ component that manages lab flags via the settings API and supports confirmation modals for irreversible changes. The interface now includes dedicated sections for public beta features (such as Automations, Enhanced Editor role, and Additional payment methods) and private alpha features (including Automations per tier, Stripe Automatic Tax, and various React-based UI migrations). Additionally, the page provides new capabilities to upload, edit, and download redirects and routes files using a new \YamlFileEditorModal\ with syntax highlighting.

apps/admin/src/settings/advanced/labs · high confidence

New React-based Tag Detail screen with code injection and metadata editing

The Tag Detail page in the Admin interface has been rewritten in React, replacing the previous Ember implementation. This update introduces a new form for editing tag properties, including a dedicated color picker for accent colors, image upload fields, and a new CodeMirror-based editor for adding custom header and footer code injections. It also features live preview cards for Search, X, and Facebook metadata, along with a new delete confirmation modal that reports the number of posts affected by the deletion.

apps/admin/src/tags/detail · high confidence

New React-based filter value sources for admin lists

The admin app now uses a new set of React hooks to power filter dropdowns (e.g., for posts, pages, labels, members, tiers, and authors). These hooks replace the previous implementation by providing a unified engine that supports local, remote, hybrid, and combined data sources, ensuring consistent hydration of selected values and improved fallback handling for missing options.

apps/admin/src/shared/filter-sources · high confidence

New React-based publish flow with email confirmation and validation

The admin editor now uses a new, pure TypeScript state machine to manage the publish flow, replacing the previous implementation. This change introduces a dedicated publish modal that handles options (publish type, scheduling, newsletter selection), recipient filtering, and limit checks (sending and publishing limits) before dispatching the save command. A key behavioral addition is the asynchronous email confirmation poller, which waits for the email to be submitted after a publish, handling retries, timeouts, and partial failures with specific user-facing messages. The flow also includes validation for public preview warnings (paywall placement) and a celebration handoff to the post list. API responses are now strictly validated using Zod schemas to ensure data integrity for email status and post counts.

apps/admin/src/editor/publish · high confidence

New Stripe Connect onboarding flow in membership settings

The Stripe configuration interface in the membership settings has been replaced with a new multi-step modal. Users now follow a guided process to connect their Stripe account, starting with an introduction to Stripe as the exclusive payments partner, followed by a step to generate a secure key via a new connection button, and finally a step to paste that key. The flow includes a toggle for test mode, automatic creation of a default paid tier with specific pricing, and logic to handle backend readiness by polling for Stripe configuration completion before finalizing the setup.

apps/admin/src/settings/membership/stripe · high confidence

New advanced integrations settings UI

The Advanced \> Integrations settings page now features a modern, modal-based interface for managing integrations. Users can create and edit custom integrations with icon uploads and API key management, configure built-in integrations like Content API, Slack, Unsplash, Pintura, FirstPromoter, and Transistor.fm, and manage webhooks with event selection and validation. The new UI includes improved error handling, confirmation dialogs for destructive actions, and consistent styling across all integration modals.

apps/admin/src/settings/advanced/integrations · high confidence

The \koenig/kg-default-transforms\ package now provides a set of editor transforms that automatically clean up content structure. The \registerDefaultTransforms\ function applies three key behaviors: it removes unwanted text alignment formats from paragraphs, headings, quotes, and extended headings; it fixes invalid nesting by 'denesting' elements (such as headings or images) that are incorrectly placed inside other block elements, moving them to the correct parent level to prevent rendering issues; and it merges adjacent lists of the same type. Additionally, a separate transform is available to remove temporary \AtLink\ nodes during rendering to prevent them from appearing in the final output.

koenig/kg-default-transforms · high confidence

New editor session module and test infrastructure

The editor's session management has been restructured into a dedicated \apps/admin/src/editor/session\ module, which composes the save engine, change tracker, and slug machine into a single editing session that acts as the editor's only writer. This change introduces a live projection of the post state, a staging-and-committing workflow for settings fields, and robust handling of server acknowledgements, collisions, and slug generation. To support this new architecture, a shared test harness (\session-harness\) and save-engine spy have been added to standardize and simplify testing across the editor, along with comprehensive test coverage for session construction, record synchronization, saving behaviors, and settings field validation.

apps/admin/src/editor/session · high confidence

New email content modal for automation drafts

The email modal in the Automations editor has been rebuilt to provide a dedicated interface for composing and previewing automated email drafts. This update introduces a new modal component that integrates the Koenig lexical editor for rich content, complete with link suggestions and file upload capabilities. Users can now preview emails in a responsive iframe that dynamically adjusts to content height, and send test emails directly from the modal to verify formatting and content before publishing. The modal also handles sender identity resolution, automatically populating sender name and email fields based on the active newsletter and site settings, while enforcing validation rules for required subject and content fields.

apps/admin/src/automations/components/email-modal · high confidence

New iframe styles for Comments UI

A new CSS file (iframe.css) has been added to define the visual presentation of the comments interface when rendered inside an iframe. This stylesheet establishes base typography, disables scrolling within the iframe container, and applies specific styling to comment content, including accent-colored blockquote borders, link formatting, and editor placeholder text behavior.

apps/comments-ui/src/styles · high confidence

New newsletter creation and management interface in Email settings

The newsletter settings have been moved out of the settings quarantine into the main admin interface, introducing a complete UI for managing email newsletters. Users can now create new newsletters with a name, description, and opt-in preferences for existing subscribers, view a sortable list of active and archived newsletters, and edit detailed settings including sender information, reply-to addresses, and comprehensive design controls (colors, fonts, header images, and layout options) with a live preview. The interface also handles plan limits for newsletter creation and supports email verification workflows for sender addresses.

apps/admin/src/settings/email/newsletters · high confidence

New settings shell with unsaved-changes protection and unified layout

The Admin settings interface now uses a new layout structure in \apps/admin/src/settings/layout\ that replaces the legacy router with a React Router-based approach. This change introduces an unsaved-changes guard that prevents accidental navigation away from dirty forms via browser back/forward buttons, ensuring users are prompted to confirm before losing edits. The new layout also synchronizes the scroll-spy navigation with the URL, provides a consistent sidebar and main content area for all settings sections, and handles role-based access (e.g., restricting editors to their profile). Users will experience a more robust settings navigation that preserves their work and offers a unified visual structure across all settings pages.

apps/admin/src/settings/layout · high confidence

New web analytics dashboard for individual posts

The admin now includes a dedicated web analytics view for individual posts, replacing the previous implementation. This new interface displays Key Performance Indicators (visits, pageviews, bounce rate, and time on page) with interactive charts, tracks visitor locations with country flags and percentages, and identifies traffic sources with favicons. The dashboard supports filtering by audience and date range, syncs state to the URL for sharing, and allows users to click on specific sources or locations to filter the data further.

apps/admin/src/posts/analytics/web · high confidence

Portal UI now renders inside an isolated iframe

The Portal interface has been restructured to render its content within a dedicated iframe (via the new \Frame\ component) rather than directly in the host page. This isolation ensures that Portal styles (defined in \global.styles.js\ and \frame.styles.js\) do not leak into or conflict with the host site's CSS, and allows the Portal to manage its own layout and scroll behavior independently. The \PopupModal\ and \TriggerButton\ components now operate within this contained environment, providing a consistent, self-contained user experience for sign-ups, logins, and account management.

apps/portal/src/components · high confidence

Portal account pages restructured with new email and gift subscription flows

The Portal account interface has been reorganized into dedicated pages for managing subscriptions, profile details, and email preferences. A new Account Email Page allows members to manage newsletter subscriptions, comment notifications, and handle automatic unsubscribes from email links. The Account Plan Page now supports multi-month gift subscriptions, gift redemption, and improved plan change confirmations. Additionally, new pages handle email suppression recovery, email delivery FAQs, and member feedback, providing a more comprehensive self-service experience for account and communication settings.

apps/portal/src/components/pages · high confidence

Portal migrated to Vite and TypeScript with new configuration structure

The Portal application has been rebuilt using Vite instead of Create React App, introducing a new \vite.config.mjs\ and \tsconfig.json\ that enforce erasable TypeScript syntax and strict type checking. This migration includes a shift to ESLint 9 flat configuration, the adoption of pnpm as the package manager, and the integration of Vitest for testing. For users, this ensures faster development rebuilds and more robust type safety, while maintaining the same UMD bundle output for embedding in Ghost themes.

apps/portal · high confidence

Portal utility library restructured and expanded

The \apps/portal/src/utils\ directory has been reorganized into a comprehensive utility library, introducing dedicated modules for gift subscription logic (including duration catalogues, pricing, and redemption notifications), member custom fields, and country selection. It also adds new helpers for date-time formatting, discount calculations, HTML sanitization, and error handling, alongside updated API and fixture generators to support these features.

apps/portal/src/utils · high confidence

Post analytics moved to admin app with email sending status support

The post analytics feature has been relocated from the posts package into the admin application (apps/admin/src/posts/analytics), establishing a new routing structure with lazy-loaded tabs for overview, web traffic, growth, and newsletter data. This change introduces an email sending status provider and UI components that display real-time progress banners and withhold newsletter figures while an email is still submitting, ensuring users see accurate status indicators during the sending process.

apps/admin/src/posts/analytics · high confidence

Private blogging app restructured with dedicated login UI and access control

The private blogging feature has been reorganized into a dedicated app module (\ghost/core/core/frontend/apps/private-blogging\) with a new, self-contained login experience. This includes a dedicated \private.hbs\ template that supports both access-code entry and self-signup forms, a new \input\_password\ Handlebars helper for consistent styling, and a router handling the \/private/\ route with brute-force protection. The middleware layer now explicitly checks for private mode, serves a restrictive \robots.txt\ to prevent indexing, and ensures that 404 errors on private sites redirect back to the login page rather than exposing content.

ghost/core/core/frontend/apps/private-blogging · high confidence

Redesigned Account Home page with new subscription and gift features

The Account Home page has been rebuilt using a new set of modular components (AccountMain, AccountActions, AccountFooter, etc.) to improve structure and maintainability. This update introduces a 'Gift membership' entry point for paid members to purchase subscriptions for others, and a 'Continue subscription' banner that allows gift members to convert their gift period into a paid subscription. The layout now clearly displays subscription status, including expiry dates for gift and complimentary members, free trial start dates, and renewal dates, alongside a 'Resume subscription' button for canceled plans. Email management is streamlined with dedicated actions for newsletter toggling and preferences, and the page now supports a Transistor podcast integration, allowing users with enabled integrations to access their RSS feeds directly from the account dashboard.

apps/portal/src/components/pages/AccountHomePage/components · high confidence

Redesigned members list with saved views and improved table layout

The members list in the Admin has been rebuilt to support saved member views, allowing you to save, edit, and delete named filter configurations via a new ManageViewPopover. The table layout now features a sticky, pinned 'Member' column with a fade effect for better navigation in wide lists, and column widths are dynamically calculated based on the number of active custom fields. Bulk actions (import, export, label management, deletion) and search have been consolidated into a new MembersActions component that preserves the current filter context when navigating to member details or importing.

apps/admin/src/members/components · high confidence

Redesigned site design and branding settings with live previews

The Design & Branding settings page now features dedicated live preview iframes for the theme and announcement bar, allowing you to see changes in real-time. Global settings have been consolidated into a new interface that supports custom body and heading fonts via the @tryghost/custom-fonts package, alongside improved image upload handling for logos, icons, and cover images. Theme-specific settings are now dynamically rendered based on the active theme's type (text, boolean, select, color, or image), with official Ghost Foundation themes automatically hiding legacy typography controls in favor of the new custom font system.

apps/admin/src/settings/site/design-and-branding · high confidence

Redis cache adapter refactored for immediate resets and per-feature TTLs

The Redis cache adapter in the core server has been rewritten to support immediate cache resets via a dynamic key prefix mechanism and to correctly apply Time-To-Live (TTL) settings per feature rather than globally. This change introduces a \prefix\_hash\ strategy that allows O(1) invalidation of specific cache namespaces, fixes socket access issues on cloned instances by retrieving the Redis client through cache-manager, and ensures that distinct cache features maintain their own expiration policies even when sharing a connection. Additionally, the adapter now emits metrics for cache hits, misses, errors, and resets to aid in monitoring.

ghost/core/core/server/adapters · high confidence

Reduced memory usage and fixed email rendering crashes

The application now uses significantly less memory in the email rendering and Elasticsearch client paths by patching dependencies to defer heavy loads. The Elasticsearch client patch replaces an eager require of the apache-arrow library with lazy loading, saving approximately 3.3MB of RSS per process. The email styling patch switches the cheerio dependency to its 'slim' variant, avoiding the loading of unused parsing libraries and saving roughly 20MB of RSS. Additionally, the email rendering logic was hardened to prevent crashes caused by malformed CSS, specifically handling style attributes with no declarations and CSS properties missing values.

patches · high confidence

Refactored comment forms into a shared editor component with improved keyboard handling

The comment input UI has been restructured to use a shared \Form\ and \FormEditor\ component, replacing the previous scattered implementations. This change introduces consistent keyboard shortcuts across all forms (Ctrl/Cmd+Enter to submit, Escape to close/blur) and fixes a bug where the edit form incorrectly placed the cursor at the start of the text instead of the end. The refactoring also adds unsaved-change detection to prevent accidental data loss and standardizes the visual layout for main, reply, and edit forms.

apps/comments-ui/src/components/content/forms · high confidence

Server-side library refactoring and new utility modules

The server-side codebase has been reorganized with new TypeScript utilities for type-safe database normalization (DbBoolean, DbCount, DbDate), case-key mapping, and lazy Map population. Image handling has been consolidated into a new ImageUtils module that standardizes external request probing and caching. Content rendering now uses a dedicated Lexical module for async HTML conversion and validation, while Mobiledoc support is retained as a legacy module. Additional server-side features include a new inbox link provider system (get-inbox-links.ts) supporting Gmail, Outlook, and others, a bootstrap socket helper for inter-process communication, and a password generation utility that ensures valid passwords are created.

ghost/core/core/server · high confidence

Shade Storybook configuration and theming overhaul

The Shade Storybook setup has been reconfigured to use the \@storybook/react-vite\ framework, replacing the previous configuration. This change introduces a custom Shade theme for the Storybook UI, applies the Inter font family to documentation and stories to match the embedded Ember admin rendering, and adds a global decorator that wraps components in the \ShadeProvider\ with support for toggling between light and dark schemes. The configuration also includes custom viewports for responsive testing and adjusts Vite/Rollup settings to ensure node modules are bundled correctly for story compilation.

apps/shade/.storybook · high confidence

Shared Stripe Checkout constraints package

A new shared package, @tryghost/checkout, centralizes the measured constraints for Stripe Checkout to ensure consistency between Ghost Core, Admin, and the end-to-end harness. It defines the specific countries Stripe accepts for shipping addresses, the field ports (shipping name, address, phone) and their corresponding metafield types, and the limits on custom questions (maximum 3 fields, 50-character label length, short\_text only). These values are derived from live API probes rather than documentation or SDK unions to prevent session creation failures caused by divergent definitions.

packages/checkout · high confidence

Shared analytics module consolidates filtering, charting, and audience logic

The admin app now includes a shared analytics module that centralizes previously duplicated logic. It introduces a unified date-range selector and a URL-synced filter system that supports audience segmentation (public, free, paid), device, source, location, and UTM parameters, with stable bookmarking and sharing of filtered views. Chart data is now processed through shared helpers that automatically bucket daily, weekly, or monthly points based on the selected time range and trim leading empty data for cleaner visuals. A new audience bitmask system translates filter selections into query parameters, while constants standardize label mappings and range definitions. The module also provides reusable UI components for the post share modal (including Bluesky), disabled-source indicators, and source icons, alongside a data hook that reads configuration and site context from the framework to gate analytics requests.

apps/admin/src/shared/analytics · high confidence

Shared custom field picker with inline creation and improved loading stability

The admin interface now uses a new shared custom field picker component that allows publishers to select existing custom fields or create new ones directly within the selection dropdown. This control includes inline creation support, type-specific icons, and search functionality. Additionally, the underlying data fetching for custom field definitions has been updated to fail silently and avoid infinite retry loops when the server endpoint is unavailable or definitions fail to load, ensuring a stable experience on the members page.

apps/admin/src/shared/member-custom-fields · high confidence

The admin sidebar now conditionally displays upgrade, 'What's New', and theme error banners only when the sidebar is visible (hiding them in the Editor) and prioritizes theme errors over other notifications. Additionally, sidebar menu visibility and expanded navigation states are now persisted to user preferences, allowing settings to be saved and restored across sessions.

apps/admin/src/layout/app-sidebar/hooks · high confidence

Sodo Search app relocated to apps/ and rebuilt with Vite and Tailwind CSS

The Sodo Search interface has been moved into the \apps/\ directory and rebuilt using Vite, replacing the previous Create React App setup. The UI now uses Tailwind CSS for styling, and the build pipeline produces a UMD bundle and a single \main.css\ file for theme integration. The search index now fetches data from dedicated \/search-index/\ API endpoints for posts, authors, and tags, and includes improved support for CJK and RTL languages via custom tokenization in Flexsearch. The app also includes a new ESLint flat config and a suite of acceptance and unit tests.

apps/sodo-search · high confidence

Standardized image upload error messaging

The post editor now uses a centralized utility to display consistent, user-friendly error messages when image uploads fail. Users will see specific feedback for unsupported file types (GIF, JPG, JPEG, PNG, SVG, SVGZ, WEBP), file size limits, or server-side validation errors, rather than generic or inconsistent messages. This logic is now shared between the feature image and social card upload flows.

apps/admin/src/shared/images · high confidence

TypeScript implementation of default index name generation

The \defaultIndexName\ utility, responsible for generating database index names to ensure compatibility with Knex's naming conventions, has been converted to TypeScript. This change introduces a new \default-index-name.ts\ file in the schema library, providing type safety for the table name and column arguments while preserving the existing logic for sanitizing table names and formatting index suffixes.

ghost/core/core/server/data/schema · high confidence

i18n package restructured as a standalone monorepo module

The internationalization package has been moved to the \packages/i18n\ directory and restructured as a standalone module with its own build and linting configuration. This change introduces a new ESLint setup, a context generation script for translation management, and an i18next parser configuration, while also adding initial translation files for Afrikaans and Arabic across comments, portal, and ghost interfaces.

packages/i18n · high confidence

Fixes

Fix nvm Node path availability in Claude Code sessions

Added a SessionStart hook that automatically adds the project's nvm-managed Node.js binary to the PATH for the entire Claude Code session. This ensures the Bash tool can find \node\ even when launched from GUI environments that do not source the user's login shell, while avoiding permission prompts by setting the environment variable once rather than rewriting every command.

.claude/hooks · high confidence

Test coverage

Added ActivityPub test fixtures and mocking utilities; Added E2E test utilities for the comments-ui application; Added acceptance tests for ActivityPub reader and feed features; Added comprehensive test coverage for Portal gift subscriptions and profile updates; Added integration tests for image dimension resolution via S3 storage; Added test coverage for announcement bar API initialization; Added test utilities and documentation for the Admin X Framework; Added tests for the frontend admin toolbar; Added unit tests for ActivityPub content formatting and utility functions; Added unit tests for Portal account and gift pages; Added unit tests for Portal utility functions; Added unit tests for Portal utility functions; Added unit tests for Redis cache adapter and store factory; Added unit tests for Shade UI component patterns; Added unit tests for Shade app utility functions and test helpers; Added unit tests for Shade layout primitives; Added unit tests for comments-ui actions; Added unit tests for common Portal components; Added unit tests for frontend utilities and handlers; Added unit tests for image utility functions; Added unit tests for password generation and validation; Added unit tests for private blogging controller, middleware, and helpers; Added unit tests for the Admin X framework API layer; Added unit tests for the ModalPage component; Added unit tests for the default index name generation logic; Comprehensive E2E test suite for Comments UI; Editor engine documentation and test fixtures added; Expanded unit test coverage for core server utilities; New analytics acceptance tests and React component foundations; New centralized test utilities for Admin analytics; New test fixtures for dunning logic, MSW, and React Query; New test utilities for query state and environment setup; New test-data package for generating test fixtures; Public API and acceptance tests for the What's New feature; Updated Source theme test fixtures.

Dependencies

Updated pnpm to v12

The monorepo's package manager has been upgraded from pnpm v11 to v12, bringing the latest performance improvements and dependency resolution changes to the development and build environment.

(dependencies) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Score

  • CAI 38 → 45 (+7.6)
  • Rubric changed (rubric-2026.08.15 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 68 → 63 (-4.4)
  • Architecture 39 (new)
  • Maturity 73 → 79 (+5.7)
  • Readiness 20 → 46 (+25.9)
  • Security 43 → 75 (+31.8)
  • Accessibility 42 (new)

Resolved (144)

  • (anonymous) (cognitive 17) (packages/i18n/lib/i18n.js)
  • Boundary-crossing change coupling: actions.ts ↔ comment-replies.js (apps/comments-ui/src/actions.ts)
  • Boundary-crossing change coupling: vite.config.mjs ↔ vite.config.mjs (apps/portal/vite.config.mjs)
  • Change coupling: actions.js ↔ api.js (apps/portal/src/actions.js)
  • Change coupling: automated-emails.js ↔ service.js (ghost/core/core/server/api/endpoints/automated-emails.js)
  • Change coupling: boot.js ↔ index.js (ghost/core/core/boot.js)
  • Change coupling: commands.js ↔ schema.js (ghost/core/core/server/data/schema/commands.js)
  • Change coupling: index.js ↔ routes.js (ghost/core/core/server/api/endpoints/index.js)
  • Change coupling: pages.js ↔ posts.js (ghost/core/core/server/api/endpoints/utils/serializers/input/pages.js)
  • Change coupling: schema.js ↔ newsletter.js (ghost/core/core/server/data/schema/schema.js)
  • Critical CVE: [GHSA redacted] (pnpm-lock.yaml)
  • Critical CVE: [GHSA redacted] (pnpm-lock.yaml)
  • Critical CVE: [GHSA redacted] (pnpm-lock.yaml)
  • Dimension evaluation failed
  • FileTooLong: acceptance/search-test.js (apps/ember-admin/tests/acceptance/search-test.js)
  • FileTooLong: core/boot.js (ghost/core/core/boot.js)
  • FileTooLong: e2e-webhooks/posts.test.js (ghost/core/test/e2e-webhooks/posts.test.js)
  • FileTooLong: utils/e2e-framework-mock-manager.js (ghost/core/test/utils/e2e-framework-mock-manager.js)
  • FileTooLong: utils/e2e-framework.js (ghost/core/test/utils/e2e-framework.js)
  • FileTooLong: utils/fixtures-generator.js (apps/portal/src/utils/fixtures-generator.js)
  • …and 124 more

New (4373)

  • #fetchEventsFromDomain (cognitive 18) (ghost/core/core/server/services/lib/mailgun-client.js)
  • #fetchEventsFromDomain (cyclomatic 18) (ghost/core/core/server/services/lib/mailgun-client.js)
  • #mapPosts (cognitive 45) (ghost/core/core/server/services/posts/posts-exporter.js)
  • #mapPosts (cyclomatic 42) (ghost/core/core/server/services/posts/posts-exporter.js)
  • #run (cognitive 28) (ghost/core/core/server/data/seeders/data-generator.js)
  • #run (cyclomatic 21) (ghost/core/core/server/data/seeders/data-generator.js)
  • #runARRQueries (cognitive 30) (ghost/core/core/server/services/milestones/milestones-service.js)
  • #runARRQueries (cyclomatic 16) (ghost/core/core/server/services/milestones/milestones-service.js)
  • #runMemberQueries (cognitive 17) (ghost/core/core/server/services/milestones/milestones-service.js)
  • .lintstagedrc.expandPattern (cognitive 37) (.lintstagedrc.cjs)
  • .pnpmfile.beforePacking (cognitive 18) (.pnpmfile.mjs)
  • App.componentDidUpdate (cognitive 20) (apps/portal/src/app.jsx)
  • App.componentDidUpdate (cognitive 20) (apps/sodo-search/src/app.jsx)
  • App.fetchLinkData (cognitive 67) (apps/portal/src/app.jsx)
  • App.fetchLinkData (cyclomatic 48) (apps/portal/src/app.jsx)
  • App.fetchOfferQueryStrData (cognitive 29) (apps/portal/src/app.jsx)
  • App.fetchOfferQueryStrData (cyclomatic 29) (apps/portal/src/app.jsx)
  • App.fetchQueryStrData (cognitive 51) (apps/portal/src/app.jsx)
  • App.fetchQueryStrData (cyclomatic 50) (apps/portal/src/app.jsx)
  • App.getPageFromLinkPath (cognitive 27) (apps/portal/src/app.jsx)
  • …and 4353 more

Changes since last survey

  • 300 commits — 243 feature/other, 57 fixes

By area

  • ghost/core — 121 commits
  • apps/admin — 85 commits
  • (root) — 22 commits
  • packages/i18n — 15 commits
  • apps/ember-admin — 12 commits
  • apps/portal — 7 commits
  • .github/workflows — 6 commits
  • apps/admin-x-framework — 5 commits
  • .changeset/changelogs — 3 commits
  • e2e/helpers — 3 commits
  • packages/api-framework — 3 commits
  • packages/limit-service — 3 commits
  • (repo) — 2 commits
  • .agents/skills — 2 commits
  • apps/shade — 2 commits
  • packages/metafield-types — 2 commits
  • .github/renovate.json5 — 1 commit
  • apps/activitypub — 1 commit
  • docker/fake-mailgun — 1 commit
  • docker/ghost-dev — 1 commit

Notable commits

  • fix: Fixed Admin 7 pill style inconsistencies (#30849)
  • fix: Fixed Admin locale data type resolution
  • fix: Fixed CI coverage failing after the Node 22.23.3 bump (#30974)
  • fix: Fixed Portal address fields losing focus on every keystroke
  • fix: Fixed Portal lint running before the metafield types it checks against are built
  • fix: Fixed React Admin caches going stale after post deletes and tag-creating saves (#30968)
  • fix: Fixed React Admin crashing on periodic host limits (#30967)
  • fix: Fixed Renovate deadlock from stale env var and PR cap counting (#30876)
  • fix: Fixed S3 integration tests after MinIO image removal (#30707)
  • fix: Fixed a saved members view opening unfiltered when clicked straight after leaving it
  • fix: Fixed address part errors landing on the whole field in the member editor
  • fix: Fixed analytics debug timestamps to use UTC (#30679)
  • fix: Fixed author acceptance test race (#30942)
  • fix: Fixed automation email analytics filtering (#30430)
  • fix: Fixed bulk post deletes removing sent email history (#30981)
  • fix: Fixed content-type headers for local files storage (#30762)
  • fix: Fixed dev data scripts failing in a fresh checkout (#30984)
  • fix: Fixed email rendering crash on malformed inline CSS declarations (#30768)
  • fix: Fixed embed publish netlify workflow (#30973)
  • fix: Fixed embed publish netlify workflow (#30977)
  • …and 280 more

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

TryGhost/Ghost was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 25 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 75e2b7d3125c749e182513f6854491e642f9c709 — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-dd72cc24c749.