From f3549c88fa0ff4c90aa0402493f5a939f5846156 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Wed, 21 Oct 2026 22:35:46 +0200 Subject: [PATCH 1/4] Task/upgrade undici to version 8.12.2 (#8272) * Update undici to version 8.12.2 * Update changelog --- CHANGELOG.md | 1 + package-lock.json | 8 ++++---- package.json | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ed0964923f..ccdc8d5ddd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Upgraded `@modelcontextprotocol/core` and `@modelcontextprotocol/server` from version `2.0.0` to `2.3.1` - Upgraded `@modelcontextprotocol/node` from version `2.0.0` to `2.1.1` - Upgraded `@rekog/mcp-nest` from version `2.0.7` to `2.0.8` +- Upgraded `undici` from version `8.11.2` to `8.12.2` ## 3.89.0 - 2026-10-20 diff --git a/package-lock.json b/package-lock.json index faf228c31a..3a5745def1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -104,7 +104,7 @@ "svgmap": "2.21.0", "tablemark": "4.1.0", "twitter-api-v2": "1.29.1", - "undici": "8.11.2", + "undici": "8.12.2", "uuid": "14.0.2", "yahoo-finance2": "4.0.2", "zod": "4.6.5", @@ -33913,9 +33913,9 @@ "license": "MIT" }, "node_modules/undici": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-8.11.2.tgz", - "integrity": "sha512-u4UB2/IrKdU6lFxumHmmo1a3fCQO5tzQllRorfoRS63txhrB7xTpSn1PftwC4qEHkOaqP95fCWW4lJzwErwzhQ==", + "version": "8.12.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-8.12.2.tgz", + "integrity": "sha512-XtuDWVdqTLr3NAxm2ly9/hU6kUsJOgGh1RASzMBbsw6aWCOaQzHdW+QQDfdERjfJ2V5vL5pRPa4RetO9UfivDg==", "license": "MIT", "engines": { "node": ">=22.19.0" diff --git a/package.json b/package.json index 4348407e87..72a09ad506 100644 --- a/package.json +++ b/package.json @@ -148,7 +148,7 @@ "svgmap": "2.21.0", "tablemark": "4.1.0", "twitter-api-v2": "1.29.1", - "undici": "8.11.2", + "undici": "8.12.2", "uuid": "14.0.2", "yahoo-finance2": "4.0.2", "zod": "4.6.5", From 44bcbf6147366b89cff7542869bb68b1f470551e Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Wed, 21 Oct 2026 22:38:23 +0200 Subject: [PATCH 2/4] Feature/trial variation of subscription interstitials (#8258) * Extend variations * Update changelog --- CHANGELOG.md | 1 + ...scription-interstitial-dialog.component.ts | 18 ++++++-- .../subscription-interstitial-dialog.html | 42 +++++++++++++++++++ .../user-account-membership.component.ts | 10 +---- .../user-account-membership.html | 5 ++- libs/common/src/lib/config.ts | 14 +++++++ 6 files changed, 78 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ccdc8d5ddd..6e363e6b71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Extended the variations of the interstitials for the subscription by a trial - Deprecated the `api/v1/auth-device` endpoint in favor of the `api/v1/auth-devices` endpoint - Deprecated the `api/v1/exchange-rate` endpoint in favor of the `api/v1/exchange-rates` endpoint - Upgraded `@modelcontextprotocol/core` and `@modelcontextprotocol/server` from version `2.0.0` to `2.3.1` diff --git a/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts b/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts index d10be10bd0..08f4d203e3 100644 --- a/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts +++ b/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts @@ -1,3 +1,5 @@ +import { TRY_SUBSCRIPTION_MAIL_HREF } from '@ghostfolio/common/config'; +import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { publicRoutes } from '@ghostfolio/common/routes/routes'; import { GfMembershipCardComponent } from '@ghostfolio/ui/membership-card'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; @@ -51,6 +53,7 @@ export class GfSubscriptionInterstitialDialogComponent implements OnInit { public remainingSkipButtonDelay = GfSubscriptionInterstitialDialogComponent.SKIP_BUTTON_DELAY_IN_SECONDS; public routerLinkPricing = publicRoutes.pricing.routerLink; + public trySubscriptionMailHref = TRY_SUBSCRIPTION_MAIL_HREF; public variantIndex: number; public constructor( @@ -59,9 +62,18 @@ export class GfSubscriptionInterstitialDialogComponent implements OnInit { private destroyRef: DestroyRef, public dialogRef: MatDialogRef ) { - this.variantIndex = Math.floor( - Math.random() * GfSubscriptionInterstitialDialogComponent.VARIANTS_COUNT - ); + const isEligibleForTrial = + !this.data.user?.subscription?.subscribedAt && + hasPermission( + this.data.user?.permissions, + permissions.updateUserSettings + ); + + const variantsCount = isEligibleForTrial + ? GfSubscriptionInterstitialDialogComponent.VARIANTS_COUNT + 1 + : GfSubscriptionInterstitialDialogComponent.VARIANTS_COUNT; + + this.variantIndex = Math.floor(Math.random() * variantsCount); addIcons({ arrowForwardOutline, checkmarkCircleOutline }); } diff --git a/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html b/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html index 8280067a87..5bac0e9baa 100644 --- a/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html +++ b/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -195,4 +195,46 @@ } + @case (4) { +
+
+
+
+
+
+
+
+ Ghostfolio Premium + +
+
+ Request a free trial +
+

+ No credit card required. The trial ends automatically. +

+
+
+
+ + + Try Premium + + +
+ } } diff --git a/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts b/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts index defe751ee8..20425d831e 100644 --- a/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts +++ b/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts @@ -1,5 +1,5 @@ import { UserService } from '@ghostfolio/client/services/user/user.service'; -import { E_MAIL_LINE_BREAK } from '@ghostfolio/common/config'; +import { TRY_SUBSCRIPTION_MAIL_HREF } from '@ghostfolio/common/config'; import { ConfirmationDialogType } from '@ghostfolio/common/enums'; import { getDateFormatString } from '@ghostfolio/common/helper'; import { User } from '@ghostfolio/common/interfaces'; @@ -49,13 +49,7 @@ export class GfUserAccountMembershipComponent { protected hasPermissionToCreateApiKey: boolean; protected hasPermissionToUpdateUserSettings: boolean; protected price: number; - protected readonly trySubscriptionMailHref = `mailto:hi@ghostfol.io?subject=Ghostfolio Premium Trial&body=${[ - 'Hello', - '', - 'I am interested in Ghostfolio Premium. Can you please send me a coupon code to try it for some time?', - '', - 'Kind regards' - ].join(E_MAIL_LINE_BREAK)}`; + protected readonly trySubscriptionMailHref = TRY_SUBSCRIPTION_MAIL_HREF; protected user: User; private couponId: string | undefined; diff --git a/apps/client/src/app/components/user-account-membership/user-account-membership.html b/apps/client/src/app/components/user-account-membership/user-account-membership.html index f18da13ed9..336f386139 100644 --- a/apps/client/src/app/components/user-account-membership/user-account-membership.html +++ b/apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -50,7 +50,10 @@ } }
- @if (!user?.subscription?.subscribedAt) { + @if ( + !user?.subscription?.subscribedAt && + hasPermissionToUpdateUserSettings + ) { { + return encodeURIComponent(line); + }) + .join(E_MAIL_LINE_BREAK)}`; + export const UNKNOWN_KEY = 'UNKNOWN'; From bcc86192f75d72c11dcd17034470f4efe01e8a5c Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Wed, 21 Oct 2026 22:44:01 +0200 Subject: [PATCH 3/4] Task/upgrade Node.js to version 22.23.4 (#8271) * Update Node.js to version 22.23.4 * Update changelog --- .github/workflows/build-code.yml | 2 +- CHANGELOG.md | 1 + DEVELOPMENT.md | 2 +- package-lock.json | 10 +++++----- package.json | 4 ++-- 5 files changed, 10 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build-code.yml b/.github/workflows/build-code.yml index 0c3f292ba3..2a3f277143 100644 --- a/.github/workflows/build-code.yml +++ b/.github/workflows/build-code.yml @@ -13,7 +13,7 @@ jobs: strategy: matrix: node_version: - - 22.23.2 + - 22.23.4 steps: - name: Checkout code uses: actions/checkout@v4 diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e363e6b71..19d132c80a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Extended the variations of the interstitials for the subscription by a trial - Deprecated the `api/v1/auth-device` endpoint in favor of the `api/v1/auth-devices` endpoint - Deprecated the `api/v1/exchange-rate` endpoint in favor of the `api/v1/exchange-rates` endpoint +- Upgraded the `Node.js` engine from version `>=22.22.3` to `>=22.23.4` (`package.json`) - Upgraded `@modelcontextprotocol/core` and `@modelcontextprotocol/server` from version `2.0.0` to `2.3.1` - Upgraded `@modelcontextprotocol/node` from version `2.0.0` to `2.1.1` - Upgraded `@rekog/mcp-nest` from version `2.0.7` to `2.0.8` diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 5b1b36afbb..0d43b42fbd 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -5,7 +5,7 @@ ### Prerequisites - [Docker](https://www.docker.com/products/docker-desktop) -- [Node.js](https://nodejs.org/en/download) (version `>=22.18.0`) +- [Node.js](https://nodejs.org/en/download) (version `>=22.23.4`) - Create a local copy of this Git repository (clone) - Copy the file `.env.dev` to `.env` and populate it with your data (`cp .env.dev .env`) diff --git a/package-lock.json b/package-lock.json index 3a5745def1..1a33c68300 100644 --- a/package-lock.json +++ b/package-lock.json @@ -149,7 +149,7 @@ "@types/jest": "30.0.0", "@types/jsonpath": "0.2.4", "@types/lodash-es": "4.17.12", - "@types/node": "22.20.1", + "@types/node": "22.20.5", "@types/papaparse": "5.5.2", "@types/passport-google-oauth20": "2.0.17", "@types/passport-openidconnect": "0.1.3", @@ -180,7 +180,7 @@ "webpack-cli": "7.1.0" }, "engines": { - "node": ">=22.22.3" + "node": ">=22.23.4" } }, "node_modules/@adobe/css-tools": { @@ -14306,9 +14306,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.20.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.1.tgz", - "integrity": "sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==", + "version": "22.20.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.5.tgz", + "integrity": "sha512-U2+DNr+wSjpsTS/wZGYHq7GcwfuSmKiKvoPvK22zwTlRhU91yOniN4qRR5KhIjvif7ysw/dz/hKmfDH0Ris4aA==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" diff --git a/package.json b/package.json index 72a09ad506..51c0c4564c 100644 --- a/package.json +++ b/package.json @@ -193,7 +193,7 @@ "@types/jest": "30.0.0", "@types/jsonpath": "0.2.4", "@types/lodash-es": "4.17.12", - "@types/node": "22.20.1", + "@types/node": "22.20.5", "@types/papaparse": "5.5.2", "@types/passport-google-oauth20": "2.0.17", "@types/passport-openidconnect": "0.1.3", @@ -224,6 +224,6 @@ "webpack-cli": "7.1.0" }, "engines": { - "node": ">=22.22.3" + "node": ">=22.23.4" } } From eaa4c3e6efc84298a20e5fdbe1116f67798b0d70 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Wed, 21 Oct 2026 22:47:22 +0200 Subject: [PATCH 4/4] Release 3.90.0 (#8275) --- CHANGELOG.md | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 19d132c80a..4f13393d1a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 3.90.0 - 2026-10-21 ### Changed diff --git a/package-lock.json b/package-lock.json index 1a33c68300..b310beb041 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "3.89.0", + "version": "3.90.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "3.89.0", + "version": "3.90.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/package.json b/package.json index 51c0c4564c..26250bfa31 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "3.89.0", + "version": "3.90.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio",