Changelog
diff --git a/apps/client/src/app/pages/about/about-page.scss b/apps/client/src/app/pages/about/about-page.scss
index fe52dfce1..2e4517709 100644
--- a/apps/client/src/app/pages/about/about-page.scss
+++ b/apps/client/src/app/pages/about/about-page.scss
@@ -7,6 +7,18 @@
}
.mat-card {
+ &.about-container,
+ &.changelog {
+ a {
+ color: rgba(var(--palette-primary-500), 1);
+ font-weight: 500;
+
+ &:hover {
+ color: rgba(var(--palette-primary-300), 1);
+ }
+ }
+ }
+
&.changelog {
::ng-deep {
markdown {
@@ -30,15 +42,6 @@
}
}
- a {
- color: rgba(var(--palette-primary-500), 1);
- font-weight: bold;
-
- &:hover {
- color: rgba(var(--palette-primary-300), 1);
- }
- }
-
.independent-and-bootstrapped-logo {
background-image: url('/assets/bootstrapped-dark.svg');
background-position: center;
diff --git a/apps/client/src/app/pages/account/account-page.component.ts b/apps/client/src/app/pages/account/account-page.component.ts
index 44bb0611c..e8ba412d6 100644
--- a/apps/client/src/app/pages/account/account-page.component.ts
+++ b/apps/client/src/app/pages/account/account-page.component.ts
@@ -35,7 +35,7 @@ export class AccountPageComponent implements OnDestroy, OnInit {
public couponId: string;
public currencies: Currency[] = [];
public defaultDateFormat = DEFAULT_DATE_FORMAT;
- public hasPermissionForSubscription;
+ public hasPermissionForSubscription: boolean;
public hasPermissionToUpdateViewMode: boolean;
public hasPermissionToUpdateUserSettings: boolean;
public price: number;
diff --git a/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page-routing.module.ts b/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page-routing.module.ts
new file mode 100644
index 000000000..d2f4532c1
--- /dev/null
+++ b/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page-routing.module.ts
@@ -0,0 +1,19 @@
+import { NgModule } from '@angular/core';
+import { RouterModule, Routes } from '@angular/router';
+import { AuthGuard } from '@ghostfolio/client/core/auth.guard';
+
+import { HalloGhostfolioPageComponent } from './hallo-ghostfolio-page.component';
+
+const routes: Routes = [
+ {
+ path: '',
+ component: HalloGhostfolioPageComponent,
+ canActivate: [AuthGuard]
+ }
+];
+
+@NgModule({
+ imports: [RouterModule.forChild(routes)],
+ exports: [RouterModule]
+})
+export class HalloGhostfolioPageRoutingModule {}
diff --git a/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts b/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts
new file mode 100644
index 000000000..8a2163374
--- /dev/null
+++ b/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts
@@ -0,0 +1,7 @@
+import { Component } from '@angular/core';
+
+@Component({
+ selector: 'gf-hallo-ghostfolio-page',
+ templateUrl: './hallo-ghostfolio-page.html'
+})
+export class HalloGhostfolioPageComponent {}
diff --git a/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.html b/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.html
new file mode 100644
index 000000000..a497e2de7
--- /dev/null
+++ b/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.html
@@ -0,0 +1,194 @@
+
+
+
+
+
+
Hallo Ghostfolio 👋
+
31.07.2021
+
+
+
+ In diesem Artikel möchte ich mein neues Open Source Projekt näher
+ vorstellen: Ghostfolio, eine
+ web-basierte Software für das Management der persönlichen Finanzen.
+
+
+
+ Welches Problem löst Ghostfolio?
+
+ Aufgrund der steigenden Inflation und den Negativzinsen befasse ich
+ mich seit einiger Zeit, wie ich mein Vermögen möglichst
+ diversifiziert anlegen kann. Konkret verfolge ich eine
+ Buy and Hold Strategie mit
+ Investitionen in verschiedene Anlageklassen verteilt auf
+ unterschiedliche Plattformen. Deshalb suchte ich nach einer App, die
+ mein Portfolio ganzheitlich zusammenfasst. Bei meiner
+ Internetrecherche und Suche in App Stores habe ich mehrere Lösungen
+ ausprobiert, doch keine hat mich vollkommen überzeugt: Zu
+ kompliziert, zu überladen, nicht optimiert für Smartphones oder zu
+ wenig umfassend.
+
+
+
+ Die Vision
+
+ Besonders wichtig ist mir, dass ich in Echtzeit die Übersicht über
+ mein gesamtes Vermögen erhalte. Bisher hatte ich nur einmal im Jahr,
+ beim Abschluss der Steuererklärung, die aufbereiteten Zahlen zur
+ Verfügung. Zum Gesamtbild gehören neben Cash auf dem Sparkonto auch
+ länderspezifische Besonderheiten wie beispielsweise die freiwillige
+ Altersvorsorge (Säule 3a) in der Schweiz.
+
+
+ In der Zwischenzeit habe ich mit vielen Kollegen gesprochen, die
+ schon länger investieren. Nicht wenige haben aus denselben
+ Überlegungen über die Zeit ein komplexes Spreadsheet angelegt. Ich
+ finde, dass dies im Jahr 2021 besser gehen muss.
+
+
+
+
+
+
+ Ghostfolio zeigt das Gesamtbild des Vermögens, um
+ bestmögliche Anlage-Entscheidungen zu treffen.
+
+
+
+
+
+
+ Ghostfolio soll eine simple Wealth Management Software sein. Diese
+ präsentiert jederzeit das aktuelle Vermögen und unterstützt bei
+ zukünftigen Investments. Sei es beim Rebalancing des Portfolios in
+ Anlageklassen (Aktien, Cryptocurrencies, ETFs, etc.) oder der
+ Finanzierung einer Wohnung, Ghostfolio bietet eine solide,
+ datengestützte Entscheidungshilfe.
+
+
+ Ich lege grossen Wert auf Datenschutz. Als
+ Open Source Software
+ (OSS) kann Ghostfolio vollständig anonym genutzt werden, ohne die
+ gierigen Blicke von Grossbanken oder Big Tech.
+
+
+
+ Von der Idee zur Umsetzung
+
+ Vor diesem Hintergrund habe ich das ambitionierte Projekt gestartet
+ und in kleinen Schritten eine Software programmiert, die ich rasch
+ selbst nutzen konnte. Als Stack habe ich mich für moderne
+ Web-Technologien entschieden, die mich persönlich besonders
+ interessieren beziehungsweise die ich gerne erlernen und vertiefen
+ möchte. Dazu zählen Docker,
+ Nx für das Management des Monorepos,
+ NestJS für das Backend und
+ PostgreSQL als Datenbank.
+ Der Code ist sowohl im Frontend als auch im Backend in
+ TypeScript
+ geschrieben.
+
+
+ Da ich bei einigen Kalkulationen an meine Grenzen gestossen bin,
+ habe ich mit verschiedenen Möglichkeiten auseinandergesetzt, um
+ Unterstützung zu bekommen. In der Hoffnung, dass andere Leute
+ ebenfalls von der Lösung profitieren und bei Interesse mit
+ Verbesserungen beitragen können, habe ich den bestehenden Code als
+ Open Source Software veröffentlicht. Schon nach kurzer Zeit haben
+ andere Entwickler
+ mit tollen Erweiterungen an Ghostfolio mitgewirkt.
+
+
+
+ Wie kann ich das Projekt unterstützen?
+
+ Bist du ebenfalls besessen von einer maximal diversifizierten
+ Anlagestrategie? Ich freue mich über alle, die Ghostfolio
+ ausprobieren. Bist du überzeugt vom Potential der Software? Jede
+ Unterstützung für Ghostfolio ist willkommen. Sei es mit einer
+ Ghostfolio Premium
+ Subscription zur Finanzierung des Hostings, einem positiven Rating
+ im
+ Google Play Store, einem Sternchen auf
+ GitHub,
+ Feedback, Bug Reports, Feature Requests und natürlich Contributions!
+
+
+ Du erreichst mich per E-Mail unter
+ hi@ghostfol.io oder auf Twitter
+ @ghostfolio_.
+
+
+ Ich freue mich, von dir zu hören.
+ Thomas von Ghostfolio
+
+
+
+
+ -
+ Aktie
+ Altersvorsorge
+ Anlage
+ App
+ Cryptocurrency
+ ETF
+ Feedback
+ Fintech
+ Ghostfolio
+ Investition
+ Open Source
+ OSS
+ Portfolio
+ Software
+ Strategie
+ Trading
+ TypeScript
+ Vermögen
+ Wealth Management
+
+
+
+
+
+
+
diff --git a/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.module.ts b/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.module.ts
new file mode 100644
index 000000000..203ab2ccc
--- /dev/null
+++ b/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.module.ts
@@ -0,0 +1,15 @@
+import { CommonModule } from '@angular/common';
+import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
+import { RouterModule } from '@angular/router';
+
+import { HalloGhostfolioPageRoutingModule } from './hallo-ghostfolio-page-routing.module';
+import { HalloGhostfolioPageComponent } from './hallo-ghostfolio-page.component';
+
+@NgModule({
+ declarations: [HalloGhostfolioPageComponent],
+ exports: [],
+ imports: [CommonModule, HalloGhostfolioPageRoutingModule, RouterModule],
+ providers: [],
+ schemas: [CUSTOM_ELEMENTS_SCHEMA]
+})
+export class HalloGhostfolioPageModule {}
diff --git a/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page-routing.module.ts b/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page-routing.module.ts
new file mode 100644
index 000000000..5165ad5bb
--- /dev/null
+++ b/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page-routing.module.ts
@@ -0,0 +1,19 @@
+import { NgModule } from '@angular/core';
+import { RouterModule, Routes } from '@angular/router';
+import { AuthGuard } from '@ghostfolio/client/core/auth.guard';
+
+import { HelloGhostfolioPageComponent } from './hello-ghostfolio-page.component';
+
+const routes: Routes = [
+ {
+ path: '',
+ component: HelloGhostfolioPageComponent,
+ canActivate: [AuthGuard]
+ }
+];
+
+@NgModule({
+ imports: [RouterModule.forChild(routes)],
+ exports: [RouterModule]
+})
+export class HelloGhostfolioPageRoutingModule {}
diff --git a/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.component.ts b/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.component.ts
new file mode 100644
index 000000000..8d5240fd3
--- /dev/null
+++ b/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.component.ts
@@ -0,0 +1,7 @@
+import { Component } from '@angular/core';
+
+@Component({
+ selector: 'gf-hello-ghostfolio-page',
+ templateUrl: './hello-ghostfolio-page.html'
+})
+export class HelloGhostfolioPageComponent {}
diff --git a/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.html b/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.html
new file mode 100644
index 000000000..97dea5930
--- /dev/null
+++ b/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.html
@@ -0,0 +1,173 @@
+
+
+
+
+
+
Hello Ghostfolio 👋
+
31.07.2021
+
+
+
+ In this article I would like to introduce my new open source project
+ in more detail: Ghostfolio, a
+ web-based personal finance management software.
+
+
+
+ What problem does Ghostfolio solve?
+
+ Due to rising inflation and negative interest rates, I have been
+ looking for some time at how I can invest my assets in the most
+ diversified way possible. Specifically, I follow a
+ buy and hold strategy with
+ investments in different asset classes spread across different
+ platforms. Therefore, I was looking for an app that would
+ holistically aggregate my portfolio. During my research on the
+ internet and in app stores, I have tried several solutions, but none
+ of them has convinced me completely: too complicated, too cluttered,
+ not optimized for smartphones or not comprehensive enough.
+
+
+
+ The vision
+
+ It is particularly important to me that I get an overview of all my
+ assets in real time. Previously, I only had the prepared figures
+ available once a year, when I had completed my annual tax
+ declaration. In addition to the cash balance in the savings account,
+ the overall picture also includes country-specific traits such as
+ the voluntary pension plan (pillar 3a) in Switzerland.
+
+
+ In the meantime, I have talked to many colleagues who have been
+ investing for a longer time. Quite a few have created complex
+ spreadsheets from the same considerations. I think that should be
+ better in 2021.
+
+
+
+
+
+
+ Ghostfolio presents the big picture of assets to make the
+ best possible investment decisions.
+
+
+
+
+
+
+ Ghostfolio is supposed to be a simple wealth management software. It
+ presents the current assets at any time and supports the decision
+ making of future investments. Whether rebalancing the portfolio in
+ asset classes (stocks, cryptocurrencies, ETFs, etc.) or financing an
+ apartment, Ghostfolio offers solid, data-driven decision support.
+
+
+ As I value privacy, data protection is an integral part of
+ Ghostfolio. As
+ open source software
+ (OSS), Ghostfolio can be used completely anonymously, without the
+ greedy eyes of big banks or big tech.
+
+
+
+ From idea to implementation
+
+ With this background I have started the ambitious project and
+ programmed with small steps a software that I could quickly use for
+ myself. As a stack, I chose modern web technologies that are
+ personally of particular interest or that I would like to learn and
+ deepen. These include Docker,
+ Nx for the management of the monorepo,
+ NestJS for the backend and
+ PostgreSQL as a database.
+ The code of the frontend and backend is written in
+ TypeScript.
+
+
+ Since I have shortly reached my limits with some calculations, I
+ have looked into different possibilities to get valuable support.
+ Hoping that other people could also benefit from the solution and
+ contribute with improvements if interested, I have released the
+ existing code as open source software. Very soon, other
+ developers
+ contributed to Ghostfolio with great enhancements.
+
+
+
+ How can I support the project?
+
+ Are you also obsessed with a maximally diversified investment
+ strategy? I'm happy for everyone who tries Ghostfolio. Are you
+ convinced of its potential? Any support for Ghostfolio is welcome.
+ Be it with a
+ Ghostfolio Premium
+ Subscription to finance the hosting, a positive rating in the
+ Google Play Store, a star on
+ GitHub,
+ feedback, bug reports, feature requests and of course contributions!
+
+
+ You can reach me by email at
+ hi@ghostfol.io or on Twitter
+ @ghostfolio_.
+
+
+ I look forward to hearing from you.
+ Thomas from Ghostfolio
+
+
+
+
+ -
+ Cryptocurrency
+ ETF
+ Fintech
+ Ghostfolio
+ Investment
+ Open Source
+ OSS
+ Portfolio
+ Software
+ Stock
+ Strategy
+ Wealth
+ Wealth Management
+
+
+
+
+
+
+
diff --git a/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.module.ts b/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.module.ts
new file mode 100644
index 000000000..c9b7d82f5
--- /dev/null
+++ b/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.module.ts
@@ -0,0 +1,15 @@
+import { CommonModule } from '@angular/common';
+import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
+import { RouterModule } from '@angular/router';
+
+import { HelloGhostfolioPageRoutingModule } from './hello-ghostfolio-page-routing.module';
+import { HelloGhostfolioPageComponent } from './hello-ghostfolio-page.component';
+
+@NgModule({
+ declarations: [HelloGhostfolioPageComponent],
+ exports: [],
+ imports: [CommonModule, HelloGhostfolioPageRoutingModule, RouterModule],
+ providers: [],
+ schemas: [CUSTOM_ELEMENTS_SCHEMA]
+})
+export class HelloGhostfolioPageModule {}
diff --git a/apps/client/src/app/pages/pricing/pricing-page.scss b/apps/client/src/app/pages/pricing/pricing-page.scss
index 19ca6bf26..829c1abef 100644
--- a/apps/client/src/app/pages/pricing/pricing-page.scss
+++ b/apps/client/src/app/pages/pricing/pricing-page.scss
@@ -4,7 +4,7 @@
a {
color: rgba(var(--palette-primary-500), 1);
- font-weight: bold;
+ font-weight: 500;
&:hover {
color: rgba(var(--palette-primary-300), 1);
diff --git a/apps/client/src/app/pages/resources/resources-page.scss b/apps/client/src/app/pages/resources/resources-page.scss
index 4341c770a..01a013378 100644
--- a/apps/client/src/app/pages/resources/resources-page.scss
+++ b/apps/client/src/app/pages/resources/resources-page.scss
@@ -5,7 +5,7 @@
.mat-card {
a {
color: rgba(var(--palette-primary-500), 1);
- font-weight: bold;
+ font-weight: 500;
&:hover {
color: rgba(var(--palette-primary-300), 1);
diff --git a/apps/client/src/app/pages/tools/analysis/analysis-page.scss b/apps/client/src/app/pages/tools/analysis/analysis-page.scss
index cbd3fde58..09e4ea30d 100644
--- a/apps/client/src/app/pages/tools/analysis/analysis-page.scss
+++ b/apps/client/src/app/pages/tools/analysis/analysis-page.scss
@@ -42,7 +42,7 @@
a {
color: rgba(var(--palette-primary-500), 1);
- font-weight: bold;
+ font-weight: 500;
&:hover {
color: rgba(var(--palette-primary-300), 1);
diff --git a/apps/client/src/assets/sitemap.xml b/apps/client/src/assets/sitemap.xml
index c41c22c2d..3ee979f4e 100644
--- a/apps/client/src/assets/sitemap.xml
+++ b/apps/client/src/assets/sitemap.xml
@@ -6,22 +6,30 @@
http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
https://ghostfol.io
- 2021-06-03T00:00:00+00:00
+ 2021-07-31T00:00:00+00:00
https://ghostfol.io/about
- 2021-06-03T00:00:00+00:00
+ 2021-07-31T00:00:00+00:00
-
+
+ https://ghostfol.io/de/blog/2021/07/hallo-ghostfolio
+ 2021-07-31T00:00:00+00:00
+
+
+ https://ghostfol.io/en/blog/2021/07/hello-ghostfolio
+ 2021-07-31T00:00:00+00:00
+
+
https://ghostfol.io/pricing
- 2021-06-03T00:00:00+00:00
+ 2021-07-31T00:00:00+00:00
https://ghostfol.io/register
- 2021-06-03T00:00:00+00:00
+ 2021-07-31T00:00:00+00:00
https://ghostfol.io/resources
- 2021-06-03T00:00:00+00:00
+ 2021-07-31T00:00:00+00:00
diff --git a/apps/client/src/styles.scss b/apps/client/src/styles.scss
index bf2c9c0fd..e41b3b0f7 100644
--- a/apps/client/src/styles.scss
+++ b/apps/client/src/styles.scss
@@ -28,6 +28,22 @@ body {
a {
color: var(--dark-primary-text);
+
+ &:hover {
+ color: unset;
+ text-decoration: none;
+ }
+ }
+
+ .blog {
+ a {
+ color: rgba(var(--palette-primary-500), 1);
+ font-weight: 500;
+
+ &:hover {
+ text-decoration: underline;
+ }
+ }
}
&.is-dark-theme {
@@ -82,11 +98,6 @@ body {
}
}
-a:hover {
- color: unset;
- text-decoration: none;
-}
-
button:focus {
outline: 0;
}
diff --git a/libs/common/src/lib/permissions.ts b/libs/common/src/lib/permissions.ts
index 5cc26ffd9..e8f7824d8 100644
--- a/libs/common/src/lib/permissions.ts
+++ b/libs/common/src/lib/permissions.ts
@@ -15,6 +15,7 @@ export const permissions = {
deleteOrder: 'deleteOrder',
deleteUser: 'deleteUser',
enableImport: 'enableImport',
+ enableBlog: 'enableBlog',
enableSocialLogin: 'enableSocialLogin',
enableStatistics: 'enableStatistics',
enableSubscription: 'enableSubscription',