diff --git a/CHANGELOG.md b/CHANGELOG.md
index 842a41aeb..e5189deef 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,7 +5,23 @@ 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
+## Unreleased
+
+### Changed
+
+- Changed the default value of the `DATA_SOURCE_FEAR_AND_GREED_INDEX_STOCKS` environment variable from `RAPID_API` to `MANUAL`
+- Upgraded `helmet` from version `7.0.0` to `8.2.0`
+
+### Fixed
+
+- Fixed the display of assets without a currency in the search results of the assistant
+- Fixed the display of assets without a currency in the symbol autocomplete component
+
+### Todo
+
+- **Breaking Change**: Set the environment variable `DATA_SOURCE_FEAR_AND_GREED_INDEX_STOCKS=RAPID_API` to keep using _Rapid API_ as the data source of the _Fear & Greed Index_ (market mood)
+
+## 3.24.0 - 2026-07-11
### Added
@@ -13,6 +29,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Exposed the `ENABLE_FEATURE_RATE_LIMITING` environment variable to control rate limiting for authentication and sign-up endpoints
- Exposed the `TRUST_PROXY` environment variable to determine the client IP address when running behind a reverse proxy
+### Changed
+
+- Rounded the value of the _Fear & Greed Index_ (market mood)
+- Improved the language localization for Korean (`ko`)
+
## 3.23.0 - 2026-07-10
### Changed
diff --git a/apps/api/src/services/configuration/configuration.service.ts b/apps/api/src/services/configuration/configuration.service.ts
index 497dc6040..3c152d5df 100644
--- a/apps/api/src/services/configuration/configuration.service.ts
+++ b/apps/api/src/services/configuration/configuration.service.ts
@@ -57,7 +57,7 @@ export class ConfigurationService {
CACHE_TTL: num({ default: CACHE_TTL_NO_CACHE }),
DATA_SOURCE_EXCHANGE_RATES: str({ default: DataSource.YAHOO }),
DATA_SOURCE_FEAR_AND_GREED_INDEX_STOCKS: str({
- default: DataSource.RAPID_API
+ default: DataSource.MANUAL
}),
DATA_SOURCE_IMPORT: str({ default: DataSource.YAHOO }),
DATA_SOURCES: json({
diff --git a/apps/client/src/app/app.routes.ts b/apps/client/src/app/app.routes.ts
index 9588cee68..2c0591b2c 100644
--- a/apps/client/src/app/app.routes.ts
+++ b/apps/client/src/app/app.routes.ts
@@ -128,8 +128,7 @@ export const routes: Routes = [
import('./pages/webauthn/webauthn-page.component').then(
(c) => c.GfWebauthnPageComponent
),
- path: internalRoutes.webauthn.path,
- title: internalRoutes.webauthn.title
+ path: internalRoutes.webauthn.path
},
{
path: internalRoutes.zen.path,
diff --git a/apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.html b/apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.html
index 67274ae38..dd2925f43 100644
--- a/apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.html
+++ b/apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.html
@@ -5,7 +5,7 @@
diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf
index 27f3729fb..c1d6f9d8b 100644
--- a/apps/client/src/locales/messages.ca.xlf
+++ b/apps/client/src/locales/messages.ca.xlf
@@ -4073,7 +4073,7 @@
How does Ghostfolio work?
- Com ho fa Ghostfolio treballar?
+ Com ho fa Ghostfolio treballar?apps/client/src/app/pages/landing/landing-page.html286
diff --git a/apps/client/src/locales/messages.ko.xlf b/apps/client/src/locales/messages.ko.xlf
index f21f8fa02..ea2df8596 100644
--- a/apps/client/src/locales/messages.ko.xlf
+++ b/apps/client/src/locales/messages.ko.xlf
@@ -433,7 +433,7 @@
Copy
- Copy
+ 복사libs/ui/src/lib/notifications/alert-dialog/alert-dialog.html20
@@ -605,7 +605,7 @@
Paid
- Paid
+ 유료apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts122
@@ -693,7 +693,7 @@
and is driven by the efforts of its contributors
- 기여자들의 노력으로 발전하고 있습니다
+ 기여자들의 노력으로 발전하고 있습니다apps/client/src/app/pages/about/overview/about-overview-page.html50
@@ -769,7 +769,7 @@
Watch the Ghostfol.io Trailer on YouTube
- Watch the Ghostfol.io Trailer on YouTube
+ YouTube에서 Ghostfol.io 트레일러 보기apps/client/src/app/pages/landing/landing-page.html19
@@ -805,7 +805,7 @@
Category
- Category
+ 카테고리apps/client/src/app/pages/resources/personal-finance-tools/product-page.html77
@@ -869,7 +869,7 @@
Data Gathering Frequency
- Data Gathering Frequency
+ 데이터 수집 빈도apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html454
@@ -913,7 +913,7 @@
Subscription History
- Subscription History
+ 구독 내역apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html136
@@ -1097,7 +1097,7 @@
Total
- Total
+ 합계apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html155
@@ -1721,7 +1721,7 @@
The source code is fully available as open source software (OSS) under the AGPL-3.0 license
- 소스 코드는 오픈 소스 소프트웨어로 완전히 공개되어 있으며, AGPL-3.0 라이선스 하에 제공됩니다
+ 소스 코드는 오픈 소스 소프트웨어로 완전히 공개되어 있으며, AGPL-3.0 라이선스 하에 제공됩니다apps/client/src/app/pages/about/overview/about-overview-page.html16
@@ -2293,7 +2293,7 @@
Ghostfolio in Numbers: Monthly Active Users (MAU)
- Ghostfolio in Numbers: Monthly Active Users (MAU)
+ Ghostfolio 통계: 월간 활성 사용자 수(MAU)apps/client/src/app/pages/landing/landing-page.html63
@@ -2333,7 +2333,7 @@
The value has been copied to the clipboard
- The value has been copied to the clipboard
+ 값이 클립보드에 복사되었습니다.libs/ui/src/lib/notifications/alert-dialog/alert-dialog.component.ts46
@@ -2493,7 +2493,7 @@
Coupon
- Coupon
+ 쿠폰apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts127
@@ -2529,7 +2529,7 @@
Close Account
- Close Account
+ 계정 폐쇄apps/client/src/app/components/user-account-settings/user-account-settings.html337
@@ -2549,7 +2549,7 @@
Contributors to Ghostfolio
- Contributors to Ghostfolio
+ Ghostfolio의 기여자apps/client/src/app/pages/about/overview/about-overview-page.html54
@@ -2885,7 +2885,7 @@
Financial Planning
- Financial Planning
+ 재무 설계libs/ui/src/lib/i18n.ts108
@@ -3221,7 +3221,7 @@
For security reasons, please delete all activities and accounts first before your Ghostfolio account can be closed.
- For security reasons, please delete all activities and accounts first before your Ghostfolio account can be closed.
+ 보안을 위해 Ghostfolio 계정을 폐쇄하려면 먼저 모든 거래 내역과 계좌를 삭제해 주세요.apps/client/src/app/components/user-account-settings/user-account-settings.html348
@@ -3349,7 +3349,7 @@
Creation
- Creation
+ 생성apps/client/src/app/components/admin-overview/admin-overview.html185
@@ -3389,7 +3389,7 @@
just now
- just now
+ 방금 전apps/client/src/app/components/admin-users/admin-users.component.ts217
@@ -3713,7 +3713,7 @@
Oops! Could not delete the asset profiles.
- Oops! Could not delete the asset profiles.
+ 이런! 자산 프로필을 삭제할 수 없습니다.apps/client/src/app/components/admin-market-data/admin-market-data.service.ts52
@@ -3801,7 +3801,7 @@
At Ghostfolio, transparency is at the core of our values. We publish the source code as open source software (OSS) under the AGPL-3.0 license and we openly share aggregated key metrics of the platform’s operational status.
- Ghostfolio는 투명성을 핵심 가치로 삼습니다. 우리는 소스 코드를 오픈 소스 소프트웨어로 공개하며, AGPL-3.0 라이선스 하에 배포합니다. 또한 플랫폼 운영 현황에 대한 집계된 핵심 지표를 공개적으로 공유합니다.
+ Ghostfolio는 투명성을 핵심 가치로 삼습니다. 우리는 소스 코드를 오픈 소스 소프트웨어로 공개하며, AGPL-3.0 라이선스 하에 배포합니다. 또한 플랫폼 운영 현황에 대한 집계된 핵심 지표를 공개적으로 공유합니다.apps/client/src/app/pages/open/open-page.html7
@@ -3897,7 +3897,7 @@
Available on
- Available on
+ 이용 가능 플랫폼apps/client/src/app/pages/resources/personal-finance-tools/product-page.html130
@@ -4205,7 +4205,7 @@
Price
- Price
+ 가격apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html171
@@ -4305,7 +4305,7 @@
Trial
- Trial
+ 체험판apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts126
@@ -4613,7 +4613,7 @@
Hourly
- Hourly
+ 매시간apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts214
@@ -4725,7 +4725,7 @@
Expiration
- Expiration
+ 만료apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html204
@@ -5034,7 +5034,7 @@
Upgrade to Ghostfolio Premium
- Upgrade to Ghostfolio Premium
+ Ghostfolio 프리미엄으로 업그레이드libs/ui/src/lib/premium-indicator/premium-indicator.component.html4
@@ -5122,7 +5122,7 @@
Stock Tracking
- Stock Tracking
+ 주식 추적libs/ui/src/lib/i18n.ts111
@@ -5146,7 +5146,7 @@
Web
- Web
+ 웹libs/ui/src/lib/i18n.ts120
@@ -5342,7 +5342,7 @@
Portfolio Filters
- Portfolio Filters
+ 포트폴리오 필터apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html63
@@ -5406,7 +5406,7 @@
{VAR_PLURAL, plural, =1 {Profile} other {Profiles}}
- {VAR_PLURAL, plural, =1 {Profile} other {Profiles}}
+ {VAR_PLURAL, plural, =1 {프로필} other {프로필}}apps/client/src/app/components/admin-market-data/admin-market-data.html255
@@ -5718,7 +5718,7 @@
Ghostfolio in Numbers: Pulls on Docker Hub
- Ghostfolio in Numbers: Pulls on Docker Hub
+ Ghostfolio 통계: Docker Hub 다운로드 수apps/client/src/app/pages/landing/landing-page.html101
@@ -6350,7 +6350,7 @@
Expires ()
- Expires ()
+ 만료 ()apps/client/src/app/components/admin-users/admin-users.html34
@@ -6511,7 +6511,7 @@
Daily
- Daily
+ 매일apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts210
@@ -6811,7 +6811,7 @@
Oops! Could not delete the asset profile.
- Oops! Could not delete the asset profile.
+ 이런! 자산 프로필을 삭제할 수 없습니다.apps/client/src/app/components/admin-market-data/admin-market-data.service.ts51
@@ -6931,7 +6931,7 @@
Do you really want to delete these asset profiles?
- Do you really want to delete these asset profiles?
+ 이 개의 자산 프로필을 정말 삭제하시겠습니까?apps/client/src/app/components/admin-market-data/admin-market-data.service.ts67
@@ -7159,7 +7159,7 @@
Performance with currency effect Performance
- 환율 효과 반영 수익률 수익률
+ 환율 효과 반영 수익률 수익률 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html83
@@ -7175,7 +7175,7 @@
Tax Reporting
- Tax Reporting
+ 세금 보고libs/ui/src/lib/i18n.ts112
@@ -7183,7 +7183,7 @@
Change with currency effect Change
- 환율 효과 반영 변동 변동
+ 환율 효과 반영 변동 변동 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html63
@@ -7199,7 +7199,7 @@
Compare Ghostfolio to -
- Compare Ghostfolio to -
+ Ghostfolio와 비교 - apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html32
@@ -7239,7 +7239,7 @@
Dividend Tracking
- Dividend Tracking
+ 배당 추적libs/ui/src/lib/i18n.ts105
@@ -7303,7 +7303,7 @@
Delete
- Delete
+ 삭제apps/client/src/app/components/admin-market-data/admin-market-data.html250
@@ -7419,7 +7419,7 @@
Investment Research
- Investment Research
+ 투자 리서치libs/ui/src/lib/i18n.ts109
@@ -7701,7 +7701,7 @@
Net Worth Tracking
- Net Worth Tracking
+ 순자산 추적libs/ui/src/lib/i18n.ts110
@@ -7833,7 +7833,7 @@
Ghostfolio in Numbers: Stars on GitHub
- Ghostfolio in Numbers: Stars on GitHub
+ Ghostfolio 통계: GitHub 스타 수apps/client/src/app/pages/landing/landing-page.html82
@@ -8139,7 +8139,7 @@
ETF Tracking
- ETF Tracking
+ ETF 추적libs/ui/src/lib/i18n.ts106
@@ -8305,7 +8305,7 @@
Post to Ghostfolio on X (formerly Twitter)
- Post to Ghostfolio on X (formerly Twitter)
+ X(이전의 Twitter)에서 Ghostfolio에 게시하세요.apps/client/src/app/pages/about/overview/about-overview-page.html85
@@ -8526,7 +8526,7 @@
If you encounter a bug, would like to suggest an improvement or a new feature, please join the Ghostfolio Slack community, post to @ghostfolio_
- 버그가 발생하거나 개선 사항이나 새로운 기능을 제안하고 싶다면 Ghostfolio 슬랙 커뮤니티에 가입하고 @ghostfolio_에 게시하세요.
+ 버그가 발생하거나 개선 사항이나 새로운 기능을 제안하고 싶다면 Ghostfolio 슬랙 커뮤니티에 가입하고 @ghostfolio_에 게시하세요.apps/client/src/app/pages/about/overview/about-overview-page.html71
diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf
index 9e43076f7..1acc6ea9e 100644
--- a/apps/client/src/locales/messages.tr.xlf
+++ b/apps/client/src/locales/messages.tr.xlf
@@ -2096,7 +2096,7 @@
1Y
- 1Y
+ 1Yapps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts232
@@ -4273,7 +4273,7 @@
This overview page features a curated collection of personal finance tools compared to the open source alternative Ghostfolio. If you value transparency, data privacy, and community collaboration, Ghostfolio provides an excellent opportunity to take control of your financial management.
- Bu genel bakış sayfası, diğer kişisel finans araçlarının seçilmiş bir koleksiyonunun açık kaynak alternatifiGhostfolio ile karşılaştırmasını sunmaktadır.. Şeffaflığa, veri gizliliğine ve topluluk işbirliğine değer veriyorsanız Ghostfolio, finansal yönetiminizin kontrolünü ele almak için mükemmel Şeffaflığa, veri gizliliğine ve topluluk işbirliğine değer veriyorsanız Ghostfolio, finansal yönetiminizin kontrolünü ele almak için mükemmel bir fırsat sunuyor.
+ Bu genel bakış sayfası, diğer kişisel finans araçlarının seçilmiş bir koleksiyonunun açık kaynak alternatifiGhostfolio ile karşılaştırmasını sunmaktadır.. Şeffaflığa, veri gizliliğine ve topluluk işbirliğine değer veriyorsanız Ghostfolio, finansal yönetiminizin kontrolünü ele almak için mükemmel bir fırsat sunuyor.apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html9
diff --git a/libs/common/src/lib/routes/interfaces/internal-route.interface.ts b/libs/common/src/lib/routes/interfaces/internal-route.interface.ts
index f08cf8b5c..8240db46a 100644
--- a/libs/common/src/lib/routes/interfaces/internal-route.interface.ts
+++ b/libs/common/src/lib/routes/interfaces/internal-route.interface.ts
@@ -5,5 +5,5 @@ export interface InternalRoute {
path?: string;
routerLink: string[];
subRoutes?: Record;
- title: string;
+ title?: string;
}
diff --git a/libs/common/src/lib/routes/routes.ts b/libs/common/src/lib/routes/routes.ts
index 2785efdde..8132520fc 100644
--- a/libs/common/src/lib/routes/routes.ts
+++ b/libs/common/src/lib/routes/routes.ts
@@ -153,8 +153,7 @@ export const internalRoutes = {
webauthn: {
excludeFromAssistant: true,
path: 'webauthn',
- routerLink: ['/webauthn'],
- title: $localize`Sign in`
+ routerLink: ['/webauthn']
},
zen: {
excludeFromAssistant: true,
diff --git a/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.html b/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.html
index 36179b719..fa30d0c03 100644
--- a/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.html
+++ b/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.html
@@ -8,7 +8,10 @@
@if (item && isAsset(item)) {
{{ item?.symbol ?? '' | gfSymbol }} · {{ item?.currency }}
+ >{{ item?.symbol ?? '' | gfSymbol }}
+ @if (item.currency) {
+ · {{ item.currency }}
+ }
@if (item?.assetSubClassString) {
· {{ item.assetSubClassString }}
}
diff --git a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html
index 456cd9940..12867662b 100644
--- a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html
+++ b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html
@@ -25,7 +25,10 @@
}
{{ lookupItem.symbol | gfSymbol }} · {{ lookupItem.currency }}
+ >{{ lookupItem.symbol | gfSymbol }}
+ @if (lookupItem.currency) {
+ · {{ lookupItem.currency }}
+ }
@if (lookupItem.assetSubClass) {
· {{ lookupItem.assetSubClassString }}
}
diff --git a/package-lock.json b/package-lock.json
index 41c915bd1..fababe870 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "ghostfolio",
- "version": "3.23.0",
+ "version": "3.24.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "ghostfolio",
- "version": "3.23.0",
+ "version": "3.24.0",
"hasInstallScript": true,
"license": "AGPL-3.0",
"dependencies": {
@@ -72,7 +72,7 @@
"fast-redact": "3.5.0",
"fuse.js": "7.3.0",
"google-spreadsheet": "3.2.0",
- "helmet": "7.0.0",
+ "helmet": "8.2.0",
"http-status-codes": "2.3.0",
"ionicons": "8.0.13",
"jsonpath": "1.3.0",
@@ -21897,12 +21897,15 @@
}
},
"node_modules/helmet": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/helmet/-/helmet-7.0.0.tgz",
- "integrity": "sha512-MsIgYmdBh460ZZ8cJC81q4XJknjG567wzEmv46WOBblDb6TUd3z8/GhgmsM9pn8g2B80tAJ4m5/d3Bi1KrSUBQ==",
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/helmet/-/helmet-8.2.0.tgz",
+ "integrity": "sha512-DRgTIUgnWcJ62KyarxxziuqYxKGnR6Rgg19BlbucN/dpmJbl1XOit6qvoOX0ZT+HhWe5OUVhU/a1zpGyc1xA0Q==",
"license": "MIT",
"engines": {
- "node": ">=16.0.0"
+ "node": ">=18.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/EvanHahn"
}
},
"node_modules/hono": {
diff --git a/package.json b/package.json
index ae7d29e6e..1f377c3e1 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "ghostfolio",
- "version": "3.23.0",
+ "version": "3.24.0",
"homepage": "https://ghostfol.io",
"license": "AGPL-3.0",
"repository": "https://github.com/ghostfolio/ghostfolio",
@@ -116,7 +116,7 @@
"fast-redact": "3.5.0",
"fuse.js": "7.3.0",
"google-spreadsheet": "3.2.0",
- "helmet": "7.0.0",
+ "helmet": "8.2.0",
"http-status-codes": "2.3.0",
"ionicons": "8.0.13",
"jsonpath": "1.3.0",