Compare commits
20 Commits
Author | SHA1 | Date | |
---|---|---|---|
b0fb986208 | |||
0b59fc639d | |||
7ddd6f27b5 | |||
c5d56f4b47 | |||
2f2b712999 | |||
c2fd31f5e5 | |||
f2d70f9070 | |||
f41dd9cd8e | |||
7d238b4935 | |||
da6591fca0 | |||
1f9b9e9998 | |||
49c4ea306d | |||
ccb5c664ef | |||
97e165ff69 | |||
45aefb6a45 | |||
2435535975 | |||
bd3d43bf05 | |||
02dc7c52b1 | |||
ff59fd4196 | |||
4955555ddd |
@ -9,6 +9,7 @@
|
|||||||
],
|
],
|
||||||
"attributeSort": "ASC",
|
"attributeSort": "ASC",
|
||||||
"endOfLine": "auto",
|
"endOfLine": "auto",
|
||||||
|
"plugins": ["prettier-plugin-organize-attributes"],
|
||||||
"printWidth": 80,
|
"printWidth": 80,
|
||||||
"singleQuote": true,
|
"singleQuote": true,
|
||||||
"tabWidth": 2,
|
"tabWidth": 2,
|
||||||
|
36
CHANGELOG.md
36
CHANGELOG.md
@ -5,7 +5,41 @@ 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/),
|
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).
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
## 1.301.0 - 2023-08-18
|
## 1.304.0 - 2023-08-27
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Added health check endpoints for data enhancers
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Upgraded `Nx` from version `16.7.2` to `16.7.4`
|
||||||
|
- Upgraded `prettier` from version `2.8.4` to `3.0.2`
|
||||||
|
|
||||||
|
## 1.303.0 - 2023-08-23
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Added a blog post: _Ghostfolio joins OSS Friends_
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Refreshed the cryptocurrencies list
|
||||||
|
- Improved the _OSS Friends_ page
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fixed an issue with the _Trackinsight_ data enhancer for asset profile data
|
||||||
|
|
||||||
|
## 1.302.0 - 2023-08-20
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Improved the language localization for German (`de`)
|
||||||
|
- Upgraded `angular` from version `16.1.8` to `16.2.1`
|
||||||
|
- Upgraded `Nx` from version `16.6.0` to `16.7.2`
|
||||||
|
|
||||||
|
## 1.301.1 - 2023-08-19
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
|
@ -41,9 +41,8 @@ export class AuthController {
|
|||||||
@Param('accessToken') accessToken: string
|
@Param('accessToken') accessToken: string
|
||||||
): Promise<OAuthResponse> {
|
): Promise<OAuthResponse> {
|
||||||
try {
|
try {
|
||||||
const authToken = await this.authService.validateAnonymousLogin(
|
const authToken =
|
||||||
accessToken
|
await this.authService.validateAnonymousLogin(accessToken);
|
||||||
);
|
|
||||||
return { authToken };
|
return { authToken };
|
||||||
} catch {
|
} catch {
|
||||||
throw new HttpException(
|
throw new HttpException(
|
||||||
|
@ -7,10 +7,10 @@ import {
|
|||||||
UseGuards
|
UseGuards
|
||||||
} from '@nestjs/common';
|
} from '@nestjs/common';
|
||||||
import { AuthGuard } from '@nestjs/passport';
|
import { AuthGuard } from '@nestjs/passport';
|
||||||
|
import { parseISO } from 'date-fns';
|
||||||
import { StatusCodes, getReasonPhrase } from 'http-status-codes';
|
import { StatusCodes, getReasonPhrase } from 'http-status-codes';
|
||||||
|
|
||||||
import { ExchangeRateService } from './exchange-rate.service';
|
import { ExchangeRateService } from './exchange-rate.service';
|
||||||
import { parseISO } from 'date-fns';
|
|
||||||
|
|
||||||
@Controller('exchange-rate')
|
@Controller('exchange-rate')
|
||||||
export class ExchangeRateController {
|
export class ExchangeRateController {
|
||||||
|
@ -18,6 +18,19 @@ export class HealthController {
|
|||||||
@Get()
|
@Get()
|
||||||
public async getHealth() {}
|
public async getHealth() {}
|
||||||
|
|
||||||
|
@Get('data-enhancer/:name')
|
||||||
|
public async getHealthOfDataEnhancer(@Param('name') name: string) {
|
||||||
|
const hasResponse =
|
||||||
|
await this.healthService.hasResponseFromDataEnhancer(name);
|
||||||
|
|
||||||
|
if (hasResponse !== true) {
|
||||||
|
throw new HttpException(
|
||||||
|
getReasonPhrase(StatusCodes.SERVICE_UNAVAILABLE),
|
||||||
|
StatusCodes.SERVICE_UNAVAILABLE
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Get('data-provider/:dataSource')
|
@Get('data-provider/:dataSource')
|
||||||
@UseInterceptors(TransformDataSourceInRequestInterceptor)
|
@UseInterceptors(TransformDataSourceInRequestInterceptor)
|
||||||
public async getHealthOfDataProvider(
|
public async getHealthOfDataProvider(
|
||||||
@ -30,9 +43,8 @@ export class HealthController {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const hasResponse = await this.healthService.hasResponseFromDataProvider(
|
const hasResponse =
|
||||||
dataSource
|
await this.healthService.hasResponseFromDataProvider(dataSource);
|
||||||
);
|
|
||||||
|
|
||||||
if (hasResponse !== true) {
|
if (hasResponse !== true) {
|
||||||
throw new HttpException(
|
throw new HttpException(
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module';
|
import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module';
|
||||||
|
import { DataEnhancerModule } from '@ghostfolio/api/services/data-provider/data-enhancer/data-enhancer.module';
|
||||||
import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module';
|
import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module';
|
||||||
import { Module } from '@nestjs/common';
|
import { Module } from '@nestjs/common';
|
||||||
|
|
||||||
@ -7,7 +8,7 @@ import { HealthService } from './health.service';
|
|||||||
|
|
||||||
@Module({
|
@Module({
|
||||||
controllers: [HealthController],
|
controllers: [HealthController],
|
||||||
imports: [ConfigurationModule, DataProviderModule],
|
imports: [ConfigurationModule, DataEnhancerModule, DataProviderModule],
|
||||||
providers: [HealthService]
|
providers: [HealthService]
|
||||||
})
|
})
|
||||||
export class HealthModule {}
|
export class HealthModule {}
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
import { DataEnhancerService } from '@ghostfolio/api/services/data-provider/data-enhancer/data-enhancer.service';
|
||||||
import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service';
|
import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service';
|
||||||
import { Injectable } from '@nestjs/common';
|
import { Injectable } from '@nestjs/common';
|
||||||
import { DataSource } from '@prisma/client';
|
import { DataSource } from '@prisma/client';
|
||||||
@ -5,9 +6,14 @@ import { DataSource } from '@prisma/client';
|
|||||||
@Injectable()
|
@Injectable()
|
||||||
export class HealthService {
|
export class HealthService {
|
||||||
public constructor(
|
public constructor(
|
||||||
|
private readonly dataEnhancerService: DataEnhancerService,
|
||||||
private readonly dataProviderService: DataProviderService
|
private readonly dataProviderService: DataProviderService
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
|
public async hasResponseFromDataEnhancer(aName: string) {
|
||||||
|
return this.dataEnhancerService.enhance(aName);
|
||||||
|
}
|
||||||
|
|
||||||
public async hasResponseFromDataProvider(aDataSource: DataSource) {
|
public async hasResponseFromDataProvider(aDataSource: DataSource) {
|
||||||
return this.dataProviderService.checkQuote(aDataSource);
|
return this.dataProviderService.checkQuote(aDataSource);
|
||||||
}
|
}
|
||||||
|
@ -470,9 +470,8 @@ export class PortfolioService {
|
|||||||
transactionPoints[0]?.date ?? format(new Date(), DATE_FORMAT)
|
transactionPoints[0]?.date ?? format(new Date(), DATE_FORMAT)
|
||||||
);
|
);
|
||||||
const startDate = this.getStartDate(dateRange, portfolioStart);
|
const startDate = this.getStartDate(dateRange, portfolioStart);
|
||||||
const currentPositions = await portfolioCalculator.getCurrentPositions(
|
const currentPositions =
|
||||||
startDate
|
await portfolioCalculator.getCurrentPositions(startDate);
|
||||||
);
|
|
||||||
|
|
||||||
const cashDetails = await this.accountService.getCashDetails({
|
const cashDetails = await this.accountService.getCashDetails({
|
||||||
filters,
|
filters,
|
||||||
@ -810,9 +809,8 @@ export class PortfolioService {
|
|||||||
const transactionPoints = portfolioCalculator.getTransactionPoints();
|
const transactionPoints = portfolioCalculator.getTransactionPoints();
|
||||||
|
|
||||||
const portfolioStart = parseDate(transactionPoints[0].date);
|
const portfolioStart = parseDate(transactionPoints[0].date);
|
||||||
const currentPositions = await portfolioCalculator.getCurrentPositions(
|
const currentPositions =
|
||||||
portfolioStart
|
await portfolioCalculator.getCurrentPositions(portfolioStart);
|
||||||
);
|
|
||||||
|
|
||||||
const position = currentPositions.positions.find(
|
const position = currentPositions.positions.find(
|
||||||
(item) => item.symbol === aSymbol
|
(item) => item.symbol === aSymbol
|
||||||
@ -1046,9 +1044,8 @@ export class PortfolioService {
|
|||||||
|
|
||||||
const portfolioStart = parseDate(transactionPoints[0].date);
|
const portfolioStart = parseDate(transactionPoints[0].date);
|
||||||
const startDate = this.getStartDate(dateRange, portfolioStart);
|
const startDate = this.getStartDate(dateRange, portfolioStart);
|
||||||
const currentPositions = await portfolioCalculator.getCurrentPositions(
|
const currentPositions =
|
||||||
startDate
|
await portfolioCalculator.getCurrentPositions(startDate);
|
||||||
);
|
|
||||||
|
|
||||||
const positions = currentPositions.positions.filter(
|
const positions = currentPositions.positions.filter(
|
||||||
(item) => !item.quantity.eq(0)
|
(item) => !item.quantity.eq(0)
|
||||||
@ -1238,9 +1235,8 @@ export class PortfolioService {
|
|||||||
portfolioCalculator.setTransactionPoints(transactionPoints);
|
portfolioCalculator.setTransactionPoints(transactionPoints);
|
||||||
|
|
||||||
const portfolioStart = parseDate(transactionPoints[0].date);
|
const portfolioStart = parseDate(transactionPoints[0].date);
|
||||||
const currentPositions = await portfolioCalculator.getCurrentPositions(
|
const currentPositions =
|
||||||
portfolioStart
|
await portfolioCalculator.getCurrentPositions(portfolioStart);
|
||||||
);
|
|
||||||
|
|
||||||
const positions = currentPositions.positions.filter(
|
const positions = currentPositions.positions.filter(
|
||||||
(item) => !item.quantity.eq(0)
|
(item) => !item.quantity.eq(0)
|
||||||
|
@ -93,9 +93,8 @@ export class SubscriptionService {
|
|||||||
|
|
||||||
public async createSubscriptionViaStripe(aCheckoutSessionId: string) {
|
public async createSubscriptionViaStripe(aCheckoutSessionId: string) {
|
||||||
try {
|
try {
|
||||||
const session = await this.stripe.checkout.sessions.retrieve(
|
const session =
|
||||||
aCheckoutSessionId
|
await this.stripe.checkout.sessions.retrieve(aCheckoutSessionId);
|
||||||
);
|
|
||||||
|
|
||||||
await this.createSubscription({
|
await this.createSubscription({
|
||||||
price: session.amount_total / 100,
|
price: session.amount_total / 100,
|
||||||
|
@ -15,13 +15,13 @@ import {
|
|||||||
import { REQUEST } from '@nestjs/core';
|
import { REQUEST } from '@nestjs/core';
|
||||||
import { AuthGuard } from '@nestjs/passport';
|
import { AuthGuard } from '@nestjs/passport';
|
||||||
import { DataSource } from '@prisma/client';
|
import { DataSource } from '@prisma/client';
|
||||||
|
import { parseISO } from 'date-fns';
|
||||||
import { StatusCodes, getReasonPhrase } from 'http-status-codes';
|
import { StatusCodes, getReasonPhrase } from 'http-status-codes';
|
||||||
import { isDate, isEmpty } from 'lodash';
|
import { isDate, isEmpty } from 'lodash';
|
||||||
|
|
||||||
import { LookupItem } from './interfaces/lookup-item.interface';
|
import { LookupItem } from './interfaces/lookup-item.interface';
|
||||||
import { SymbolItem } from './interfaces/symbol-item.interface';
|
import { SymbolItem } from './interfaces/symbol-item.interface';
|
||||||
import { SymbolService } from './symbol.service';
|
import { SymbolService } from './symbol.service';
|
||||||
import { parseISO } from 'date-fns';
|
|
||||||
|
|
||||||
@Controller('symbol')
|
@Controller('symbol')
|
||||||
export class SymbolController {
|
export class SymbolController {
|
||||||
|
@ -51,7 +51,9 @@
|
|||||||
"3FT": "ThreeFold Token",
|
"3FT": "ThreeFold Token",
|
||||||
"3ULL": "3ULL Coin",
|
"3ULL": "3ULL Coin",
|
||||||
"3XD": "3DChain",
|
"3XD": "3DChain",
|
||||||
|
"420CHAN": "420chan",
|
||||||
"4ART": "4ART Coin",
|
"4ART": "4ART Coin",
|
||||||
|
"4CHAN": "4Chan",
|
||||||
"4JNET": "4JNET",
|
"4JNET": "4JNET",
|
||||||
"77G": "GraphenTech",
|
"77G": "GraphenTech",
|
||||||
"7E": "7ELEVEN",
|
"7E": "7ELEVEN",
|
||||||
@ -60,6 +62,7 @@
|
|||||||
"8BT": "8 Circuit Studios",
|
"8BT": "8 Circuit Studios",
|
||||||
"8PAY": "8Pay",
|
"8PAY": "8Pay",
|
||||||
"8X8": "8X8 Protocol",
|
"8X8": "8X8 Protocol",
|
||||||
|
"9GAG": "9GAG",
|
||||||
"A5T": "Alpha5",
|
"A5T": "Alpha5",
|
||||||
"AAA": "Moon Rabbit",
|
"AAA": "Moon Rabbit",
|
||||||
"AAB": "AAX Token",
|
"AAB": "AAX Token",
|
||||||
@ -101,6 +104,7 @@
|
|||||||
"ACN": "AvonCoin",
|
"ACN": "AvonCoin",
|
||||||
"ACOIN": "ACoin",
|
"ACOIN": "ACoin",
|
||||||
"ACP": "Anarchists Prime",
|
"ACP": "Anarchists Prime",
|
||||||
|
"ACQ": "Acquire.Fi",
|
||||||
"ACS": "Access Protocol",
|
"ACS": "Access Protocol",
|
||||||
"ACT": "Achain",
|
"ACT": "Achain",
|
||||||
"ACTIN": "Actinium",
|
"ACTIN": "Actinium",
|
||||||
@ -180,7 +184,7 @@
|
|||||||
"AGX": "Agricoin",
|
"AGX": "Agricoin",
|
||||||
"AHOO": "Ahoolee",
|
"AHOO": "Ahoolee",
|
||||||
"AHT": "AhaToken",
|
"AHT": "AhaToken",
|
||||||
"AI": "Multiverse",
|
"AI": "AiDoge",
|
||||||
"AIB": "AdvancedInternetBlock",
|
"AIB": "AdvancedInternetBlock",
|
||||||
"AIBB": "AiBB",
|
"AIBB": "AiBB",
|
||||||
"AIBK": "AIB Utility Token",
|
"AIBK": "AIB Utility Token",
|
||||||
@ -213,6 +217,7 @@
|
|||||||
"AKA": "Akroma",
|
"AKA": "Akroma",
|
||||||
"AKITA": "Akita Inu",
|
"AKITA": "Akita Inu",
|
||||||
"AKN": "Akoin",
|
"AKN": "Akoin",
|
||||||
|
"AKNC": "Aave KNC v1",
|
||||||
"AKRO": "Akropolis",
|
"AKRO": "Akropolis",
|
||||||
"AKT": "Akash Network",
|
"AKT": "Akash Network",
|
||||||
"AKTIO": "AKTIO Coin",
|
"AKTIO": "AKTIO Coin",
|
||||||
@ -237,12 +242,14 @@
|
|||||||
"ALIC": "AliCoin",
|
"ALIC": "AliCoin",
|
||||||
"ALICE": "My Neighbor Alice",
|
"ALICE": "My Neighbor Alice",
|
||||||
"ALIEN": "AlienCoin",
|
"ALIEN": "AlienCoin",
|
||||||
|
"ALINK": "Aave LINK v1",
|
||||||
"ALIS": "ALISmedia",
|
"ALIS": "ALISmedia",
|
||||||
"ALITA": "Alita Network",
|
"ALITA": "Alita Network",
|
||||||
"ALIX": "AlinX",
|
"ALIX": "AlinX",
|
||||||
"ALKI": "Alkimi",
|
"ALKI": "Alkimi",
|
||||||
"ALLBI": "ALL BEST ICO",
|
"ALLBI": "ALL BEST ICO",
|
||||||
"ALLEY": "NFT Alley",
|
"ALLEY": "NFT Alley",
|
||||||
|
"ALLIN": "All in",
|
||||||
"ALN": "Aluna",
|
"ALN": "Aluna",
|
||||||
"ALOHA": "Aloha",
|
"ALOHA": "Aloha",
|
||||||
"ALP": "Alphacon",
|
"ALP": "Alphacon",
|
||||||
@ -410,12 +417,14 @@
|
|||||||
"ARIX": "Arix",
|
"ARIX": "Arix",
|
||||||
"ARK": "ARK",
|
"ARK": "ARK",
|
||||||
"ARKER": "Arker",
|
"ARKER": "Arker",
|
||||||
|
"ARKM": "Arkham",
|
||||||
"ARKN": "Ark Rivals",
|
"ARKN": "Ark Rivals",
|
||||||
"ARM": "Armory Coin",
|
"ARM": "Armory Coin",
|
||||||
"ARMOR": "ARMOR",
|
"ARMOR": "ARMOR",
|
||||||
"ARMR": "ARMR",
|
"ARMR": "ARMR",
|
||||||
"ARMS": "2Acoin",
|
"ARMS": "2Acoin",
|
||||||
"ARNA": "ARNA Panacea",
|
"ARNA": "ARNA Panacea",
|
||||||
|
"ARNM": "Arenum",
|
||||||
"ARNO": "ARNO",
|
"ARNO": "ARNO",
|
||||||
"ARNX": "Aeron",
|
"ARNX": "Aeron",
|
||||||
"ARNXM": "Armor NXM",
|
"ARNXM": "Armor NXM",
|
||||||
@ -472,6 +481,7 @@
|
|||||||
"ASTO": "Altered State Token",
|
"ASTO": "Altered State Token",
|
||||||
"ASTON": "Aston",
|
"ASTON": "Aston",
|
||||||
"ASTR": "Astar",
|
"ASTR": "Astar",
|
||||||
|
"ASTRAFER": "Astrafer",
|
||||||
"ASTRAL": "Astral",
|
"ASTRAL": "Astral",
|
||||||
"ASTRO": "AstroSwap",
|
"ASTRO": "AstroSwap",
|
||||||
"ASTROC": "Astroport Classic",
|
"ASTROC": "Astroport Classic",
|
||||||
@ -531,6 +541,7 @@
|
|||||||
"AURY": "Aurory",
|
"AURY": "Aurory",
|
||||||
"AUSCM": "Auric Network",
|
"AUSCM": "Auric Network",
|
||||||
"AUSD": "Appeal dollar",
|
"AUSD": "Appeal dollar",
|
||||||
|
"AUSDC": "Aave USDC v1",
|
||||||
"AUT": "Autoria",
|
"AUT": "Autoria",
|
||||||
"AUTHORSHIP": "Authorship",
|
"AUTHORSHIP": "Authorship",
|
||||||
"AUTO": "Auto",
|
"AUTO": "Auto",
|
||||||
@ -612,6 +623,7 @@
|
|||||||
"BACK": "DollarBack",
|
"BACK": "DollarBack",
|
||||||
"BACOIN": "BACoin",
|
"BACOIN": "BACoin",
|
||||||
"BACON": "BaconDAO (BACON)",
|
"BACON": "BaconDAO (BACON)",
|
||||||
|
"BAD": "Bad Idea AI",
|
||||||
"BADGER": "Badger DAO",
|
"BADGER": "Badger DAO",
|
||||||
"BAG": "BondAppetit",
|
"BAG": "BondAppetit",
|
||||||
"BAGS": "Basis Gold Share",
|
"BAGS": "Basis Gold Share",
|
||||||
@ -662,6 +674,7 @@
|
|||||||
"BBCT": "TraDove B2BCoin",
|
"BBCT": "TraDove B2BCoin",
|
||||||
"BBDT": "BBD Token",
|
"BBDT": "BBD Token",
|
||||||
"BBF": "Bubblefong",
|
"BBF": "Bubblefong",
|
||||||
|
"BBFT": "Block Busters Tech Token",
|
||||||
"BBG": "BigBang",
|
"BBG": "BigBang",
|
||||||
"BBGC": "BigBang Game",
|
"BBGC": "BigBang Game",
|
||||||
"BBI": "BelugaPay",
|
"BBI": "BelugaPay",
|
||||||
@ -725,6 +738,7 @@
|
|||||||
"BDX": "Beldex",
|
"BDX": "Beldex",
|
||||||
"BDY": "Buddy DAO",
|
"BDY": "Buddy DAO",
|
||||||
"BEACH": "BeachCoin",
|
"BEACH": "BeachCoin",
|
||||||
|
"BEAI": "BeNFT Solutions",
|
||||||
"BEAM": "Beam",
|
"BEAM": "Beam",
|
||||||
"BEAN": "BeanCash",
|
"BEAN": "BeanCash",
|
||||||
"BEAST": "CryptoBeast",
|
"BEAST": "CryptoBeast",
|
||||||
@ -806,6 +820,7 @@
|
|||||||
"BIDR": "Binance IDR Stable Coin",
|
"BIDR": "Binance IDR Stable Coin",
|
||||||
"BIFI": "Beefy.Finance",
|
"BIFI": "Beefy.Finance",
|
||||||
"BIFIF": "BiFi",
|
"BIFIF": "BiFi",
|
||||||
|
"BIG": "Big Eyes",
|
||||||
"BIGHAN": "BighanCoin",
|
"BIGHAN": "BighanCoin",
|
||||||
"BIGSB": "BigShortBets",
|
"BIGSB": "BigShortBets",
|
||||||
"BIGUP": "BigUp",
|
"BIGUP": "BigUp",
|
||||||
@ -1090,6 +1105,7 @@
|
|||||||
"BRNK": "Brank",
|
"BRNK": "Brank",
|
||||||
"BRNX": "Bronix",
|
"BRNX": "Bronix",
|
||||||
"BRO": "Bitradio",
|
"BRO": "Bitradio",
|
||||||
|
"BROCK": "Bitrock",
|
||||||
"BRONZ": "BitBronze",
|
"BRONZ": "BitBronze",
|
||||||
"BRT": "Bikerush",
|
"BRT": "Bikerush",
|
||||||
"BRTR": "Barter",
|
"BRTR": "Barter",
|
||||||
@ -1226,7 +1242,7 @@
|
|||||||
"BULL": "Bullieverse",
|
"BULL": "Bullieverse",
|
||||||
"BULLC": "BuySell",
|
"BULLC": "BuySell",
|
||||||
"BULLION": "BullionFX",
|
"BULLION": "BullionFX",
|
||||||
"BULLS": "BullshitCoin",
|
"BULLS": "Bull Coin",
|
||||||
"BULLSH": "Bullshit Inu",
|
"BULLSH": "Bullshit Inu",
|
||||||
"BUMN": "BUMooN",
|
"BUMN": "BUMooN",
|
||||||
"BUMP": "Bumper",
|
"BUMP": "Bumper",
|
||||||
@ -1319,8 +1335,10 @@
|
|||||||
"CAP": "BottleCaps",
|
"CAP": "BottleCaps",
|
||||||
"CAPD": "Capdax",
|
"CAPD": "Capdax",
|
||||||
"CAPP": "Cappasity",
|
"CAPP": "Cappasity",
|
||||||
|
"CAPRICOIN": "CapriCoin",
|
||||||
"CAPS": "Ternoa",
|
"CAPS": "Ternoa",
|
||||||
"CAPT": "Bitcoin Captain",
|
"CAPT": "Bitcoin Captain",
|
||||||
|
"CAPTAINPLANET": "Captain Planet",
|
||||||
"CAR": "CarBlock",
|
"CAR": "CarBlock",
|
||||||
"CARAT": "Carats Token",
|
"CARAT": "Carats Token",
|
||||||
"CARBON": "Carboncoin",
|
"CARBON": "Carboncoin",
|
||||||
@ -1478,6 +1496,7 @@
|
|||||||
"CHECKR": "CheckerChain",
|
"CHECKR": "CheckerChain",
|
||||||
"CHECOIN": "CheCoin",
|
"CHECOIN": "CheCoin",
|
||||||
"CHEDDA": "Chedda",
|
"CHEDDA": "Chedda",
|
||||||
|
"CHEEL": "Cheelee",
|
||||||
"CHEESE": "CHEESE",
|
"CHEESE": "CHEESE",
|
||||||
"CHEESUS": "Cheesus",
|
"CHEESUS": "Cheesus",
|
||||||
"CHEQ": "CHEQD Network",
|
"CHEQ": "CHEQD Network",
|
||||||
@ -1520,7 +1539,8 @@
|
|||||||
"CHX": "Own",
|
"CHX": "Own",
|
||||||
"CHY": "Concern Poverty Chain",
|
"CHY": "Concern Poverty Chain",
|
||||||
"CHZ": "Chiliz",
|
"CHZ": "Chiliz",
|
||||||
"CIC": "CIChain",
|
"CIC": "Crazy Internet Coin",
|
||||||
|
"CICHAIN": "CIChain",
|
||||||
"CIF": "Crypto Improvement Fund",
|
"CIF": "Crypto Improvement Fund",
|
||||||
"CIM": "COINCOME",
|
"CIM": "COINCOME",
|
||||||
"CIN": "CinderCoin",
|
"CIN": "CinderCoin",
|
||||||
@ -1630,7 +1650,6 @@
|
|||||||
"COB": "Cobinhood",
|
"COB": "Cobinhood",
|
||||||
"COC": "Coin of the champions",
|
"COC": "Coin of the champions",
|
||||||
"COCK": "Shibacock",
|
"COCK": "Shibacock",
|
||||||
"COCOS": "COCOS BCX",
|
|
||||||
"CODEO": "Codeo Token",
|
"CODEO": "Codeo Token",
|
||||||
"CODEX": "CODEX Finance",
|
"CODEX": "CODEX Finance",
|
||||||
"CODI": "Codi Finance",
|
"CODI": "Codi Finance",
|
||||||
@ -1659,7 +1678,7 @@
|
|||||||
"COLX": "ColossusCoinXT",
|
"COLX": "ColossusCoinXT",
|
||||||
"COM": "Coliseum",
|
"COM": "Coliseum",
|
||||||
"COMB": "Combo",
|
"COMB": "Combo",
|
||||||
"COMBO": "Furucombo",
|
"COMBO": "COMBO",
|
||||||
"COMFI": "CompliFi",
|
"COMFI": "CompliFi",
|
||||||
"COMM": "Community Coin",
|
"COMM": "Community Coin",
|
||||||
"COMMUNITYCOIN": "Community Coin",
|
"COMMUNITYCOIN": "Community Coin",
|
||||||
@ -1672,7 +1691,6 @@
|
|||||||
"CONI": "CoinBene",
|
"CONI": "CoinBene",
|
||||||
"CONS": "ConSpiracy Coin",
|
"CONS": "ConSpiracy Coin",
|
||||||
"CONSENTIUM": "Consentium",
|
"CONSENTIUM": "Consentium",
|
||||||
"CONT": "Contentos",
|
|
||||||
"CONUN": "CONUN",
|
"CONUN": "CONUN",
|
||||||
"CONV": "Convergence",
|
"CONV": "Convergence",
|
||||||
"COOK": "Cook",
|
"COOK": "Cook",
|
||||||
@ -1683,17 +1701,19 @@
|
|||||||
"COPS": "Cops Finance",
|
"COPS": "Cops Finance",
|
||||||
"COR": "Corion",
|
"COR": "Corion",
|
||||||
"CORAL": "CoralPay",
|
"CORAL": "CoralPay",
|
||||||
"CORE": "Coreum",
|
"CORE": "Core",
|
||||||
"COREDAO": "coreDAO",
|
"COREDAO": "coreDAO",
|
||||||
"COREG": "Core Group Asset",
|
"COREG": "Core Group Asset",
|
||||||
|
"COREUM": "Coreum",
|
||||||
"CORGI": "Corgi Inu",
|
"CORGI": "Corgi Inu",
|
||||||
"CORN": "CORN",
|
"CORN": "CORN",
|
||||||
"CORX": "CorionX",
|
"CORX": "CorionX",
|
||||||
"COS": "COS",
|
"COS": "Contentos",
|
||||||
"COSHI": "CoShi Inu",
|
"COSHI": "CoShi Inu",
|
||||||
"COSM": "CosmoChain",
|
"COSM": "CosmoChain",
|
||||||
"COSMIC": "CosmicSwap",
|
"COSMIC": "CosmicSwap",
|
||||||
"COSP": "Cosplay Token",
|
"COSP": "Cosplay Token",
|
||||||
|
"COSS": "COS",
|
||||||
"COSX": "Cosmecoin",
|
"COSX": "Cosmecoin",
|
||||||
"COT": "CoTrader",
|
"COT": "CoTrader",
|
||||||
"COTI": "COTI",
|
"COTI": "COTI",
|
||||||
@ -1729,7 +1749,7 @@
|
|||||||
"CPOOL": "Clearpool",
|
"CPOOL": "Clearpool",
|
||||||
"CPROP": "CPROP",
|
"CPROP": "CPROP",
|
||||||
"CPRX": "Crypto Perx",
|
"CPRX": "Crypto Perx",
|
||||||
"CPS": "CapriCoin",
|
"CPS": "Cryptostone",
|
||||||
"CPT": "Cryptaur",
|
"CPT": "Cryptaur",
|
||||||
"CPU": "CPUcoin",
|
"CPU": "CPUcoin",
|
||||||
"CPX": "Apex Token",
|
"CPX": "Apex Token",
|
||||||
@ -1796,6 +1816,7 @@
|
|||||||
"CRTS": "Cratos",
|
"CRTS": "Cratos",
|
||||||
"CRU": "Crust Network",
|
"CRU": "Crust Network",
|
||||||
"CRV": "Curve DAO Token",
|
"CRV": "Curve DAO Token",
|
||||||
|
"CRVUSD": "crvUSD",
|
||||||
"CRW": "Crown Coin",
|
"CRW": "Crown Coin",
|
||||||
"CRWD": "CRWD Network",
|
"CRWD": "CRWD Network",
|
||||||
"CRWNY": "Crowny Token",
|
"CRWNY": "Crowny Token",
|
||||||
@ -1843,7 +1864,7 @@
|
|||||||
"CTLX": "Cash Telex",
|
"CTLX": "Cash Telex",
|
||||||
"CTN": "Continuum Finance",
|
"CTN": "Continuum Finance",
|
||||||
"CTO": "Crypto",
|
"CTO": "Crypto",
|
||||||
"CTP": "Captain Planet",
|
"CTP": "Ctomorrow Platform",
|
||||||
"CTPL": "Cultiplan",
|
"CTPL": "Cultiplan",
|
||||||
"CTPT": "Contents Protocol",
|
"CTPT": "Contents Protocol",
|
||||||
"CTR": "Creator Platform",
|
"CTR": "Creator Platform",
|
||||||
@ -2007,6 +2028,7 @@
|
|||||||
"DBC": "DeepBrain Chain",
|
"DBC": "DeepBrain Chain",
|
||||||
"DBCCOIN": "Datablockchain",
|
"DBCCOIN": "Datablockchain",
|
||||||
"DBD": "Day By Day",
|
"DBD": "Day By Day",
|
||||||
|
"DBEAR": "DBear Coin",
|
||||||
"DBET": "Decent.bet",
|
"DBET": "Decent.bet",
|
||||||
"DBIC": "DubaiCoin",
|
"DBIC": "DubaiCoin",
|
||||||
"DBIX": "DubaiCoin",
|
"DBIX": "DubaiCoin",
|
||||||
@ -2058,6 +2080,7 @@
|
|||||||
"DEEP": "DeepCloud AI",
|
"DEEP": "DeepCloud AI",
|
||||||
"DEEPG": "Deep Gold",
|
"DEEPG": "Deep Gold",
|
||||||
"DEEX": "DEEX",
|
"DEEX": "DEEX",
|
||||||
|
"DEEZ": "DEEZ NUTS",
|
||||||
"DEFI": "Defi",
|
"DEFI": "Defi",
|
||||||
"DEFI5": "DEFI Top 5 Tokens Index",
|
"DEFI5": "DEFI Top 5 Tokens Index",
|
||||||
"DEFIL": "DeFIL",
|
"DEFIL": "DeFIL",
|
||||||
@ -2162,11 +2185,12 @@
|
|||||||
"DIEM": "Facebook Diem",
|
"DIEM": "Facebook Diem",
|
||||||
"DIESEL": "Diesel",
|
"DIESEL": "Diesel",
|
||||||
"DIFX": "Digital Financial Exchange",
|
"DIFX": "Digital Financial Exchange",
|
||||||
"DIG": "Dignity",
|
"DIG": "DIEGO",
|
||||||
"DIGG": "DIGG",
|
"DIGG": "DIGG",
|
||||||
"DIGIC": "DigiCube",
|
"DIGIC": "DigiCube",
|
||||||
"DIGIF": "DigiFel",
|
"DIGIF": "DigiFel",
|
||||||
"DIGITAL": "Digital Reserve Currency",
|
"DIGITAL": "Digital Reserve Currency",
|
||||||
|
"DIGNITY": "Dignity",
|
||||||
"DIGS": "Diggits",
|
"DIGS": "Diggits",
|
||||||
"DIKO": "Arkadiko",
|
"DIKO": "Arkadiko",
|
||||||
"DILI": "D Community",
|
"DILI": "D Community",
|
||||||
@ -2246,6 +2270,7 @@
|
|||||||
"DOGBOSS": "Dog Boss",
|
"DOGBOSS": "Dog Boss",
|
||||||
"DOGDEFI": "DogDeFiCoin",
|
"DOGDEFI": "DogDeFiCoin",
|
||||||
"DOGE": "Dogecoin",
|
"DOGE": "Dogecoin",
|
||||||
|
"DOGE20": "Doge 2.0",
|
||||||
"DOGEBNB": "DogeBNB",
|
"DOGEBNB": "DogeBNB",
|
||||||
"DOGEC": "DogeCash",
|
"DOGEC": "DogeCash",
|
||||||
"DOGECEO": "Doge CEO",
|
"DOGECEO": "Doge CEO",
|
||||||
@ -2559,6 +2584,7 @@
|
|||||||
"EMC2": "Einsteinium",
|
"EMC2": "Einsteinium",
|
||||||
"EMD": "Emerald",
|
"EMD": "Emerald",
|
||||||
"EMIGR": "EmiratesGoldCoin",
|
"EMIGR": "EmiratesGoldCoin",
|
||||||
|
"EML": "EML Protocol",
|
||||||
"EMN.CUR": "Eastman Chemical",
|
"EMN.CUR": "Eastman Chemical",
|
||||||
"EMON": "Ethermon",
|
"EMON": "Ethermon",
|
||||||
"EMOT": "Sentigraph.io",
|
"EMOT": "Sentigraph.io",
|
||||||
@ -2692,6 +2718,7 @@
|
|||||||
"ETHD": "Ethereum Dark",
|
"ETHD": "Ethereum Dark",
|
||||||
"ETHER": "Etherparty",
|
"ETHER": "Etherparty",
|
||||||
"ETHERDELTA": "EtherDelta",
|
"ETHERDELTA": "EtherDelta",
|
||||||
|
"ETHERKING": "Ether Kingdoms Token",
|
||||||
"ETHERNITY": "Ethernity Chain",
|
"ETHERNITY": "Ethernity Chain",
|
||||||
"ETHF": "EthereumFair",
|
"ETHF": "EthereumFair",
|
||||||
"ETHIX": "EthicHub",
|
"ETHIX": "EthicHub",
|
||||||
@ -2709,6 +2736,7 @@
|
|||||||
"ETHSHIB": "Eth Shiba",
|
"ETHSHIB": "Eth Shiba",
|
||||||
"ETHV": "Ethverse",
|
"ETHV": "Ethverse",
|
||||||
"ETHW": "Ethereum PoW",
|
"ETHW": "Ethereum PoW",
|
||||||
|
"ETHX": "Stader ETHx",
|
||||||
"ETHY": "Ethereum Yield",
|
"ETHY": "Ethereum Yield",
|
||||||
"ETI": "EtherInc",
|
"ETI": "EtherInc",
|
||||||
"ETK": "Energi Token",
|
"ETK": "Energi Token",
|
||||||
@ -2722,7 +2750,7 @@
|
|||||||
"ETR": "Electric Token",
|
"ETR": "Electric Token",
|
||||||
"ETRNT": "Eternal Trusts",
|
"ETRNT": "Eternal Trusts",
|
||||||
"ETS": "ETH Share",
|
"ETS": "ETH Share",
|
||||||
"ETSC": "Ether star blockchain",
|
"ETSC": "Ether star blockchain",
|
||||||
"ETT": "EncryptoTel",
|
"ETT": "EncryptoTel",
|
||||||
"ETY": "Ethereum Cloud",
|
"ETY": "Ethereum Cloud",
|
||||||
"ETZ": "EtherZero",
|
"ETZ": "EtherZero",
|
||||||
@ -2773,6 +2801,7 @@
|
|||||||
"EXB": "ExaByte (EXB)",
|
"EXB": "ExaByte (EXB)",
|
||||||
"EXC": "Eximchain",
|
"EXC": "Eximchain",
|
||||||
"EXCC": "ExchangeCoin",
|
"EXCC": "ExchangeCoin",
|
||||||
|
"EXCHANGEN": "ExchangeN",
|
||||||
"EXCL": "Exclusive Coin",
|
"EXCL": "Exclusive Coin",
|
||||||
"EXE": "ExeCoin",
|
"EXE": "ExeCoin",
|
||||||
"EXFI": "Flare Finance",
|
"EXFI": "Flare Finance",
|
||||||
@ -2781,7 +2810,7 @@
|
|||||||
"EXLT": "ExtraLovers",
|
"EXLT": "ExtraLovers",
|
||||||
"EXM": "EXMO Coin",
|
"EXM": "EXMO Coin",
|
||||||
"EXMR": "EXMR FDN",
|
"EXMR": "EXMR FDN",
|
||||||
"EXN": "ExchangeN",
|
"EXN": "Exeno",
|
||||||
"EXO": "Exosis",
|
"EXO": "Exosis",
|
||||||
"EXP": "Expanse",
|
"EXP": "Expanse",
|
||||||
"EXRD": "Radix",
|
"EXRD": "Radix",
|
||||||
@ -2814,6 +2843,7 @@
|
|||||||
"FAIR": "FairCoin",
|
"FAIR": "FairCoin",
|
||||||
"FAIRC": "Faireum Token",
|
"FAIRC": "Faireum Token",
|
||||||
"FAIRG": "FairGame",
|
"FAIRG": "FairGame",
|
||||||
|
"FAKE": "FAKE COIN",
|
||||||
"FAKT": "Medifakt",
|
"FAKT": "Medifakt",
|
||||||
"FALCONS": "Falcon Swaps",
|
"FALCONS": "Falcon Swaps",
|
||||||
"FAME": "Fame MMA",
|
"FAME": "Fame MMA",
|
||||||
@ -2870,6 +2900,7 @@
|
|||||||
"FEN": "First Ever NFT",
|
"FEN": "First Ever NFT",
|
||||||
"FENOMY": "Fenomy",
|
"FENOMY": "Fenomy",
|
||||||
"FER": "Ferro",
|
"FER": "Ferro",
|
||||||
|
"FERC": "FairERC20",
|
||||||
"FERMA": "Ferma",
|
"FERMA": "Ferma",
|
||||||
"FESS": "Fesschain",
|
"FESS": "Fesschain",
|
||||||
"FET": "Fetch.AI",
|
"FET": "Fetch.AI",
|
||||||
@ -2931,7 +2962,7 @@
|
|||||||
"FLASH": "Flashstake",
|
"FLASH": "Flashstake",
|
||||||
"FLASHC": "FLASH coin",
|
"FLASHC": "FLASH coin",
|
||||||
"FLC": "FlowChainCoin",
|
"FLC": "FlowChainCoin",
|
||||||
"FLD": "FLUID",
|
"FLD": "FluidAI",
|
||||||
"FLDC": "Folding Coin",
|
"FLDC": "Folding Coin",
|
||||||
"FLDT": "FairyLand",
|
"FLDT": "FairyLand",
|
||||||
"FLETA": "FLETA",
|
"FLETA": "FLETA",
|
||||||
@ -3091,6 +3122,7 @@
|
|||||||
"FUEL": "Jetfuel Finance",
|
"FUEL": "Jetfuel Finance",
|
||||||
"FUJIN": "Fujinto",
|
"FUJIN": "Fujinto",
|
||||||
"FUKU": "Furukuru",
|
"FUKU": "Furukuru",
|
||||||
|
"FUMO": "Alien Milady Fumo",
|
||||||
"FUN": "FUN Token",
|
"FUN": "FUN Token",
|
||||||
"FUNC": "FunCoin",
|
"FUNC": "FunCoin",
|
||||||
"FUND": "Unification",
|
"FUND": "Unification",
|
||||||
@ -3101,6 +3133,7 @@
|
|||||||
"FUNDZ": "FundFantasy",
|
"FUNDZ": "FundFantasy",
|
||||||
"FUNK": "Cypherfunks Coin",
|
"FUNK": "Cypherfunks Coin",
|
||||||
"FUR": "Furio",
|
"FUR": "Furio",
|
||||||
|
"FURU": "Furucombo",
|
||||||
"FURY": "Engines of Fury",
|
"FURY": "Engines of Fury",
|
||||||
"FUS": "Fus",
|
"FUS": "Fus",
|
||||||
"FUSE": "Fuse Network Token",
|
"FUSE": "Fuse Network Token",
|
||||||
@ -3118,6 +3151,7 @@
|
|||||||
"FXP": "FXPay",
|
"FXP": "FXPay",
|
||||||
"FXS": "Frax Share",
|
"FXS": "Frax Share",
|
||||||
"FXT": "FuzeX",
|
"FXT": "FuzeX",
|
||||||
|
"FXY": "Floxypay",
|
||||||
"FYN": "Affyn",
|
"FYN": "Affyn",
|
||||||
"FYP": "FlypMe",
|
"FYP": "FlypMe",
|
||||||
"FYZ": "Fyooz",
|
"FYZ": "Fyooz",
|
||||||
@ -3172,6 +3206,7 @@
|
|||||||
"GAT": "GATCOIN",
|
"GAT": "GATCOIN",
|
||||||
"GATE": "GATENet",
|
"GATE": "GATENet",
|
||||||
"GATEWAY": "Gateway Protocol",
|
"GATEWAY": "Gateway Protocol",
|
||||||
|
"GAYPEPE": "Gay Pepe",
|
||||||
"GAZE": "GazeTV",
|
"GAZE": "GazeTV",
|
||||||
"GB": "GoldBlocks",
|
"GB": "GoldBlocks",
|
||||||
"GBA": "Geeba",
|
"GBA": "Geeba",
|
||||||
@ -3222,6 +3257,7 @@
|
|||||||
"GEMZ": "Gemz Social",
|
"GEMZ": "Gemz Social",
|
||||||
"GEN": "DAOstack",
|
"GEN": "DAOstack",
|
||||||
"GENE": "Genopets",
|
"GENE": "Genopets",
|
||||||
|
"GENIE": "The Genie",
|
||||||
"GENIX": "Genix",
|
"GENIX": "Genix",
|
||||||
"GENS": "Genshiro",
|
"GENS": "Genshiro",
|
||||||
"GENSTAKE": "Genstake",
|
"GENSTAKE": "Genstake",
|
||||||
@ -3261,6 +3297,7 @@
|
|||||||
"GHCOLD": "Galaxy Heroes Coin",
|
"GHCOLD": "Galaxy Heroes Coin",
|
||||||
"GHD": "Giftedhands",
|
"GHD": "Giftedhands",
|
||||||
"GHNY": "Grizzly Honey",
|
"GHNY": "Grizzly Honey",
|
||||||
|
"GHO": "GHO",
|
||||||
"GHOST": "GhostbyMcAfee",
|
"GHOST": "GhostbyMcAfee",
|
||||||
"GHOSTCOIN": "GhostCoin",
|
"GHOSTCOIN": "GhostCoin",
|
||||||
"GHOSTM": "GhostMarket",
|
"GHOSTM": "GhostMarket",
|
||||||
@ -3274,6 +3311,7 @@
|
|||||||
"GIFT": "GiftNet",
|
"GIFT": "GiftNet",
|
||||||
"GIG": "GigaCoin",
|
"GIG": "GigaCoin",
|
||||||
"GIGA": "GigaSwap",
|
"GIGA": "GigaSwap",
|
||||||
|
"GIGX": "GigXCoin",
|
||||||
"GIM": "Gimli",
|
"GIM": "Gimli",
|
||||||
"GIMMER": "Gimmer",
|
"GIMMER": "Gimmer",
|
||||||
"GIN": "GINcoin",
|
"GIN": "GINcoin",
|
||||||
@ -3385,6 +3423,7 @@
|
|||||||
"GOVT": "The Government Network",
|
"GOVT": "The Government Network",
|
||||||
"GOZ": "Göztepe S.K. Fan Token",
|
"GOZ": "Göztepe S.K. Fan Token",
|
||||||
"GP": "Wizards And Dragons",
|
"GP": "Wizards And Dragons",
|
||||||
|
"GPBP": "Genius Playboy Billionaire Philanthropist",
|
||||||
"GPKR": "Gold Poker",
|
"GPKR": "Gold Poker",
|
||||||
"GPL": "Gold Pressed Latinum",
|
"GPL": "Gold Pressed Latinum",
|
||||||
"GPPT": "Pluto Project Coin",
|
"GPPT": "Pluto Project Coin",
|
||||||
@ -3501,7 +3540,8 @@
|
|||||||
"HALF": "0.5X Long Bitcoin Token",
|
"HALF": "0.5X Long Bitcoin Token",
|
||||||
"HALFSHIT": "0.5X Long Shitcoin Index Token",
|
"HALFSHIT": "0.5X Long Shitcoin Index Token",
|
||||||
"HALLO": "Halloween Coin",
|
"HALLO": "Halloween Coin",
|
||||||
"HALO": "Halo Platform",
|
"HALO": "Halo Coin",
|
||||||
|
"HALOPLATFORM": "Halo Platform",
|
||||||
"HAM": "Hamster",
|
"HAM": "Hamster",
|
||||||
"HAMS": "HamsterCoin",
|
"HAMS": "HamsterCoin",
|
||||||
"HANA": "Hanacoin",
|
"HANA": "Hanacoin",
|
||||||
@ -3598,6 +3638,7 @@
|
|||||||
"HILL": "President Clinton",
|
"HILL": "President Clinton",
|
||||||
"HINA": "Hina Inu",
|
"HINA": "Hina Inu",
|
||||||
"HINT": "Hintchain",
|
"HINT": "Hintchain",
|
||||||
|
"HIPPO": "HIPPO",
|
||||||
"HIRE": "HireMatch",
|
"HIRE": "HireMatch",
|
||||||
"HIT": "HitChain",
|
"HIT": "HitChain",
|
||||||
"HITBTC": "HitBTC Token",
|
"HITBTC": "HitBTC Token",
|
||||||
@ -3634,6 +3675,7 @@
|
|||||||
"HNTR": "Hunter",
|
"HNTR": "Hunter",
|
||||||
"HNY": "Honey",
|
"HNY": "Honey",
|
||||||
"HNZO": "Hanzo Inu",
|
"HNZO": "Hanzo Inu",
|
||||||
|
"HOBO": "HOBO THE BEAR",
|
||||||
"HOD": "HoDooi.com",
|
"HOD": "HoDooi.com",
|
||||||
"HODL": "HOdlcoin",
|
"HODL": "HOdlcoin",
|
||||||
"HOGE": "Hoge Finance",
|
"HOGE": "Hoge Finance",
|
||||||
@ -3839,7 +3881,7 @@
|
|||||||
"IMPCN": "Brain Space",
|
"IMPCN": "Brain Space",
|
||||||
"IMPER": "Impermax",
|
"IMPER": "Impermax",
|
||||||
"IMPS": "Impulse Coin",
|
"IMPS": "Impulse Coin",
|
||||||
"IMPT": "Ether Kingdoms Token",
|
"IMPT": "IMPT",
|
||||||
"IMPULSE": "IMPULSE by FDR",
|
"IMPULSE": "IMPULSE by FDR",
|
||||||
"IMS": "Independent Money System",
|
"IMS": "Independent Money System",
|
||||||
"IMST": "Imsmart",
|
"IMST": "Imsmart",
|
||||||
@ -4001,6 +4043,7 @@
|
|||||||
"JAM": "Tune.Fm",
|
"JAM": "Tune.Fm",
|
||||||
"JANE": "JaneCoin",
|
"JANE": "JaneCoin",
|
||||||
"JAR": "Jarvis+",
|
"JAR": "Jarvis+",
|
||||||
|
"JARED": "Jared From Subway",
|
||||||
"JASMY": "JasmyCoin",
|
"JASMY": "JasmyCoin",
|
||||||
"JBS": "JumBucks Coin",
|
"JBS": "JumBucks Coin",
|
||||||
"JBX": "Juicebox",
|
"JBX": "Juicebox",
|
||||||
@ -4163,9 +4206,10 @@
|
|||||||
"KIN": "Kin",
|
"KIN": "Kin",
|
||||||
"KIND": "Kind Ads",
|
"KIND": "Kind Ads",
|
||||||
"KINE": "Kine Protocol",
|
"KINE": "Kine Protocol",
|
||||||
"KING": "King Finance",
|
"KING": "KING",
|
||||||
"KING93": "King93",
|
"KING93": "King93",
|
||||||
"KINGDOMQUEST": "Kingdom Quest",
|
"KINGDOMQUEST": "Kingdom Quest",
|
||||||
|
"KINGF": "King Finance",
|
||||||
"KINGSHIB": "King Shiba",
|
"KINGSHIB": "King Shiba",
|
||||||
"KINGSWAP": "KingSwap",
|
"KINGSWAP": "KingSwap",
|
||||||
"KINT": "Kintsugi",
|
"KINT": "Kintsugi",
|
||||||
@ -4175,6 +4219,7 @@
|
|||||||
"KISC": "Kaiser",
|
"KISC": "Kaiser",
|
||||||
"KISHIMOTO": "Kishimoto Inu",
|
"KISHIMOTO": "Kishimoto Inu",
|
||||||
"KISHU": "Kishu Inu",
|
"KISHU": "Kishu Inu",
|
||||||
|
"KITA": "KITA INU",
|
||||||
"KITSU": "Kitsune Inu",
|
"KITSU": "Kitsune Inu",
|
||||||
"KITTY": "Kitty Inu",
|
"KITTY": "Kitty Inu",
|
||||||
"KKO": "Kineko",
|
"KKO": "Kineko",
|
||||||
@ -4267,10 +4312,12 @@
|
|||||||
"KUBO": "KUBO",
|
"KUBO": "KUBO",
|
||||||
"KUBOS": "KubosCoin",
|
"KUBOS": "KubosCoin",
|
||||||
"KUE": "Kuende",
|
"KUE": "Kuende",
|
||||||
|
"KUJI": "Kujira",
|
||||||
"KUMA": "Kuma Inu",
|
"KUMA": "Kuma Inu",
|
||||||
"KUNCI": "Kunci Coin",
|
"KUNCI": "Kunci Coin",
|
||||||
"KUR": "Kuro",
|
"KUR": "Kuro",
|
||||||
"KURT": "Kurrent",
|
"KURT": "Kurrent",
|
||||||
|
"KUSA": "Kusa Inu",
|
||||||
"KUSD": "Kowala",
|
"KUSD": "Kowala",
|
||||||
"KUSH": "KushCoin",
|
"KUSH": "KushCoin",
|
||||||
"KUV": "Kuverit",
|
"KUV": "Kuverit",
|
||||||
@ -4280,6 +4327,7 @@
|
|||||||
"KVT": "Kinesis Velocity Token",
|
"KVT": "Kinesis Velocity Token",
|
||||||
"KWATT": "4New",
|
"KWATT": "4New",
|
||||||
"KWD": "KIWI DEFI",
|
"KWD": "KIWI DEFI",
|
||||||
|
"KWENTA": "Kwenta",
|
||||||
"KWH": "KWHCoin",
|
"KWH": "KWHCoin",
|
||||||
"KWIK": "KwikSwap",
|
"KWIK": "KwikSwap",
|
||||||
"KWS": "Knight War Spirits",
|
"KWS": "Knight War Spirits",
|
||||||
@ -4299,7 +4347,9 @@
|
|||||||
"LABX": "Stakinglab",
|
"LABX": "Stakinglab",
|
||||||
"LACCOIN": "LocalAgro",
|
"LACCOIN": "LocalAgro",
|
||||||
"LACE": "Lovelace World",
|
"LACE": "Lovelace World",
|
||||||
|
"LADYS": "Milady Meme Coin",
|
||||||
"LAEEB": "LaEeb",
|
"LAEEB": "LaEeb",
|
||||||
|
"LAELAPS": "Laelaps",
|
||||||
"LAIKA": "Laika Protocol",
|
"LAIKA": "Laika Protocol",
|
||||||
"LALA": "LaLa World",
|
"LALA": "LaLa World",
|
||||||
"LAMB": "Lambda",
|
"LAMB": "Lambda",
|
||||||
@ -4455,13 +4505,14 @@
|
|||||||
"LLAND": "Lyfe Land",
|
"LLAND": "Lyfe Land",
|
||||||
"LLG": "Loligo",
|
"LLG": "Loligo",
|
||||||
"LLION": "Lydian Lion",
|
"LLION": "Lydian Lion",
|
||||||
"LM": "LM Token",
|
"LM": "LeisureMeta",
|
||||||
"LMAO": "LMAO Finance",
|
"LMAO": "LMAO Finance",
|
||||||
"LMC": "LomoCoin",
|
"LMC": "LomoCoin",
|
||||||
"LMCH": "Latamcash",
|
"LMCH": "Latamcash",
|
||||||
"LMCSWAP": "LimoCoin SWAP",
|
"LMCSWAP": "LimoCoin SWAP",
|
||||||
"LMR": "Lumerin",
|
"LMR": "Lumerin",
|
||||||
"LMT": "Lympo Market Token",
|
"LMT": "Lympo Market Token",
|
||||||
|
"LMTOKEN": "LM Token",
|
||||||
"LMXC": "LimonX",
|
"LMXC": "LimonX",
|
||||||
"LMY": "Lunch Money",
|
"LMY": "Lunch Money",
|
||||||
"LN": "LINK",
|
"LN": "LINK",
|
||||||
@ -4530,6 +4581,7 @@
|
|||||||
"LRG": "Largo Coin",
|
"LRG": "Largo Coin",
|
||||||
"LRN": "Loopring [NEO]",
|
"LRN": "Loopring [NEO]",
|
||||||
"LSD": "LightSpeedCoin",
|
"LSD": "LightSpeedCoin",
|
||||||
|
"LSETH": "Liquid Staked ETH",
|
||||||
"LSK": "Lisk",
|
"LSK": "Lisk",
|
||||||
"LSP": "Lumenswap",
|
"LSP": "Lumenswap",
|
||||||
"LSS": "Lossless",
|
"LSS": "Lossless",
|
||||||
@ -4626,6 +4678,7 @@
|
|||||||
"MAEP": "Maester Protocol",
|
"MAEP": "Maester Protocol",
|
||||||
"MAG": "Magnet",
|
"MAG": "Magnet",
|
||||||
"MAGIC": "Magic",
|
"MAGIC": "Magic",
|
||||||
|
"MAGICF": "MagicFox",
|
||||||
"MAHA": "MahaDAO",
|
"MAHA": "MahaDAO",
|
||||||
"MAI": "Mindsync",
|
"MAI": "Mindsync",
|
||||||
"MAID": "MaidSafe Coin",
|
"MAID": "MaidSafe Coin",
|
||||||
@ -4639,6 +4692,7 @@
|
|||||||
"MANDOX": "MandoX",
|
"MANDOX": "MandoX",
|
||||||
"MANGA": "Manga Token",
|
"MANGA": "Manga Token",
|
||||||
"MANNA": "Manna",
|
"MANNA": "Manna",
|
||||||
|
"MANTLE": "Mantle",
|
||||||
"MAP": "MAP Protocol",
|
"MAP": "MAP Protocol",
|
||||||
"MAPC": "MapCoin",
|
"MAPC": "MapCoin",
|
||||||
"MAPE": "Mecha Morphing",
|
"MAPE": "Mecha Morphing",
|
||||||
@ -4672,6 +4726,7 @@
|
|||||||
"MATIC": "Polygon",
|
"MATIC": "Polygon",
|
||||||
"MATPAD": "MaticPad",
|
"MATPAD": "MaticPad",
|
||||||
"MATTER": "AntiMatter",
|
"MATTER": "AntiMatter",
|
||||||
|
"MAV": "Maverick Protocol",
|
||||||
"MAX": "MaxCoin",
|
"MAX": "MaxCoin",
|
||||||
"MAXR": "Max Revive",
|
"MAXR": "Max Revive",
|
||||||
"MAY": "Theresa May Coin",
|
"MAY": "Theresa May Coin",
|
||||||
@ -4776,6 +4831,7 @@
|
|||||||
"MESA": "MetaVisa",
|
"MESA": "MetaVisa",
|
||||||
"MESG": "MESG",
|
"MESG": "MESG",
|
||||||
"MESH": "MeshBox",
|
"MESH": "MeshBox",
|
||||||
|
"MESSI": "MESSI COIN",
|
||||||
"MET": "Metronome",
|
"MET": "Metronome",
|
||||||
"META": "Metadium",
|
"META": "Metadium",
|
||||||
"METAC": "Metacoin",
|
"METAC": "Metacoin",
|
||||||
@ -4881,6 +4937,7 @@
|
|||||||
"MIODIO": "MIODIOCOIN",
|
"MIODIO": "MIODIOCOIN",
|
||||||
"MIOTA": "IOTA",
|
"MIOTA": "IOTA",
|
||||||
"MIR": "Mirror Protocol",
|
"MIR": "Mirror Protocol",
|
||||||
|
"MIRACLE": "MIRACLE",
|
||||||
"MIRC": "MIR COIN",
|
"MIRC": "MIR COIN",
|
||||||
"MIS": "Mithril Share",
|
"MIS": "Mithril Share",
|
||||||
"MISA": "Sangkara",
|
"MISA": "Sangkara",
|
||||||
@ -4938,7 +4995,6 @@
|
|||||||
"MNRB": "MoneyRebel",
|
"MNRB": "MoneyRebel",
|
||||||
"MNS": "Monnos",
|
"MNS": "Monnos",
|
||||||
"MNST": "MoonStarter",
|
"MNST": "MoonStarter",
|
||||||
"MNT": "microNFT",
|
|
||||||
"MNTC": "Manet Coin",
|
"MNTC": "Manet Coin",
|
||||||
"MNTG": "Monetas",
|
"MNTG": "Monetas",
|
||||||
"MNTL": "AssetMantle",
|
"MNTL": "AssetMantle",
|
||||||
@ -4967,6 +5023,7 @@
|
|||||||
"MOF": "Molecular Future (TRC20)",
|
"MOF": "Molecular Future (TRC20)",
|
||||||
"MOFI": "MobiFi",
|
"MOFI": "MobiFi",
|
||||||
"MOFOLD": "Molecular Future (ERC20)",
|
"MOFOLD": "Molecular Future (ERC20)",
|
||||||
|
"MOG": "Mog Coin",
|
||||||
"MOGU": "Mogu",
|
"MOGU": "Mogu",
|
||||||
"MOGX": "Mogu",
|
"MOGX": "Mogu",
|
||||||
"MOI": "MyOwnItem",
|
"MOI": "MyOwnItem",
|
||||||
@ -4989,9 +5046,11 @@
|
|||||||
"MONEYIMT": "MoneyToken",
|
"MONEYIMT": "MoneyToken",
|
||||||
"MONF": "Monfter",
|
"MONF": "Monfter",
|
||||||
"MONG": "MongCoin",
|
"MONG": "MongCoin",
|
||||||
|
"MONG20": "Mongoose 2.0",
|
||||||
"MONI": "Monsta Infinite",
|
"MONI": "Monsta Infinite",
|
||||||
"MONK": "Monkey Project",
|
"MONK": "Monkey Project",
|
||||||
"MONKEY": "Monkey",
|
"MONKEY": "Monkey",
|
||||||
|
"MONKEYS": "Monkeys Token",
|
||||||
"MONO": "MonoX",
|
"MONO": "MonoX",
|
||||||
"MONONOKEINU": "Mononoke Inu",
|
"MONONOKEINU": "Mononoke Inu",
|
||||||
"MONS": "Monsters Clan",
|
"MONS": "Monsters Clan",
|
||||||
@ -5011,11 +5070,13 @@
|
|||||||
"MOONSHOT": "Moonshot",
|
"MOONSHOT": "Moonshot",
|
||||||
"MOOO": "Hashtagger",
|
"MOOO": "Hashtagger",
|
||||||
"MOOV": "dotmoovs",
|
"MOOV": "dotmoovs",
|
||||||
|
"MOOX": "Moox Protocol",
|
||||||
"MOPS": "Mops",
|
"MOPS": "Mops",
|
||||||
"MORA": "Meliora",
|
"MORA": "Meliora",
|
||||||
"MORE": "More Coin",
|
"MORE": "More Coin",
|
||||||
"MOS": "MOS Coin",
|
"MOS": "MOS Coin",
|
||||||
"MOT": "Olympus Labs",
|
"MOT": "Olympus Labs",
|
||||||
|
"MOTG": "MetaOctagon",
|
||||||
"MOTI": "Motion",
|
"MOTI": "Motion",
|
||||||
"MOTO": "Motocoin",
|
"MOTO": "Motocoin",
|
||||||
"MOV": "MovieCoin",
|
"MOV": "MovieCoin",
|
||||||
@ -5076,6 +5137,7 @@
|
|||||||
"MSWAP": "MoneySwap",
|
"MSWAP": "MoneySwap",
|
||||||
"MT": "MyToken",
|
"MT": "MyToken",
|
||||||
"MTA": "Meta",
|
"MTA": "Meta",
|
||||||
|
"MTB": "MetaBridge",
|
||||||
"MTBC": "Metabolic",
|
"MTBC": "Metabolic",
|
||||||
"MTC": "MEDICAL TOKEN CURRENCY",
|
"MTC": "MEDICAL TOKEN CURRENCY",
|
||||||
"MTCMN": "MTC Mesh",
|
"MTCMN": "MTC Mesh",
|
||||||
@ -5108,6 +5170,7 @@
|
|||||||
"MUE": "MonetaryUnit",
|
"MUE": "MonetaryUnit",
|
||||||
"MULTI": "Multichain",
|
"MULTI": "Multichain",
|
||||||
"MULTIBOT": "Multibot",
|
"MULTIBOT": "Multibot",
|
||||||
|
"MULTIV": "Multiverse",
|
||||||
"MUN": "MUNcoin",
|
"MUN": "MUNcoin",
|
||||||
"MUNCH": "Munch Token",
|
"MUNCH": "Munch Token",
|
||||||
"MUSD": "mStable USD",
|
"MUSD": "mStable USD",
|
||||||
@ -5648,6 +5711,7 @@
|
|||||||
"OZP": "OZAPHYRE",
|
"OZP": "OZAPHYRE",
|
||||||
"P202": "Project 202",
|
"P202": "Project 202",
|
||||||
"P2PS": "P2P Solutions Foundation",
|
"P2PS": "P2P Solutions Foundation",
|
||||||
|
"PAAL": "PAAL AI",
|
||||||
"PAC": "PAC Protocol",
|
"PAC": "PAC Protocol",
|
||||||
"PACOCA": "Pacoca",
|
"PACOCA": "Pacoca",
|
||||||
"PAD": "NearPad",
|
"PAD": "NearPad",
|
||||||
@ -5736,6 +5800,7 @@
|
|||||||
"PEARL": "Pearl Finance",
|
"PEARL": "Pearl Finance",
|
||||||
"PEC": "PeaceCoin",
|
"PEC": "PeaceCoin",
|
||||||
"PEEL": "Meta Apes",
|
"PEEL": "Meta Apes",
|
||||||
|
"PEEPA": "Peepa",
|
||||||
"PEEPS": "The People’s Coin",
|
"PEEPS": "The People’s Coin",
|
||||||
"PEG": "PegNet",
|
"PEG": "PegNet",
|
||||||
"PEGS": "PegShares",
|
"PEGS": "PegShares",
|
||||||
@ -5748,6 +5813,7 @@
|
|||||||
"PEOPLE": "ConstitutionDAO",
|
"PEOPLE": "ConstitutionDAO",
|
||||||
"PEOS": "pEOS",
|
"PEOS": "pEOS",
|
||||||
"PEPE": "Pepe",
|
"PEPE": "Pepe",
|
||||||
|
"PEPE20": "Pepe 2.0",
|
||||||
"PEPECASH": "Pepe Cash",
|
"PEPECASH": "Pepe Cash",
|
||||||
"PEPPER": "Pepper Token",
|
"PEPPER": "Pepper Token",
|
||||||
"PEPS": "PEPS Coin",
|
"PEPS": "PEPS Coin",
|
||||||
@ -5822,6 +5888,7 @@
|
|||||||
"PINK": "PinkCoin",
|
"PINK": "PinkCoin",
|
||||||
"PINKX": "PantherCoin",
|
"PINKX": "PantherCoin",
|
||||||
"PINMO": "Pinmo",
|
"PINMO": "Pinmo",
|
||||||
|
"PINO": "Pinocchu",
|
||||||
"PINU": "Piccolo Inu",
|
"PINU": "Piccolo Inu",
|
||||||
"PIO": "Pioneershares",
|
"PIO": "Pioneershares",
|
||||||
"PIPI": "Pippi Finance",
|
"PIPI": "Pippi Finance",
|
||||||
@ -5885,6 +5952,7 @@
|
|||||||
"PLS": "Pulsechain",
|
"PLS": "Pulsechain",
|
||||||
"PLSD": "PulseDogecoin",
|
"PLSD": "PulseDogecoin",
|
||||||
"PLSPAD": "PulsePad",
|
"PLSPAD": "PulsePad",
|
||||||
|
"PLSX": "PulseX",
|
||||||
"PLT": "Poollotto.finance",
|
"PLT": "Poollotto.finance",
|
||||||
"PLTC": "PlatonCoin",
|
"PLTC": "PlatonCoin",
|
||||||
"PLTX": "PlutusX",
|
"PLTX": "PlutusX",
|
||||||
@ -5911,7 +5979,6 @@
|
|||||||
"PNK": "Kleros",
|
"PNK": "Kleros",
|
||||||
"PNL": "True PNL",
|
"PNL": "True PNL",
|
||||||
"PNODE": "Pinknode",
|
"PNODE": "Pinknode",
|
||||||
"PNP": "LogisticsX",
|
|
||||||
"PNT": "pNetwork Token",
|
"PNT": "pNetwork Token",
|
||||||
"PNX": "PhantomX",
|
"PNX": "PhantomX",
|
||||||
"PNY": "Peony Coin",
|
"PNY": "Peony Coin",
|
||||||
@ -5927,6 +5994,7 @@
|
|||||||
"POINTS": "Cryptsy Points",
|
"POINTS": "Cryptsy Points",
|
||||||
"POK": "Pokmonsters",
|
"POK": "Pokmonsters",
|
||||||
"POKEM": "Pokemonio",
|
"POKEM": "Pokemonio",
|
||||||
|
"POKEMON": "Pokemon",
|
||||||
"POKER": "PokerCoin",
|
"POKER": "PokerCoin",
|
||||||
"POKT": "Pocket Network",
|
"POKT": "Pocket Network",
|
||||||
"POL": "Pool-X",
|
"POL": "Pool-X",
|
||||||
@ -6010,6 +6078,7 @@
|
|||||||
"PRIME": "Echelon Prime",
|
"PRIME": "Echelon Prime",
|
||||||
"PRIMECHAIN": "PrimeChain",
|
"PRIMECHAIN": "PrimeChain",
|
||||||
"PRINT": "Printer.Finance",
|
"PRINT": "Printer.Finance",
|
||||||
|
"PRINTERIUM": "Printerium",
|
||||||
"PRINTS": "FingerprintsDAO",
|
"PRINTS": "FingerprintsDAO",
|
||||||
"PRISM": "Prism",
|
"PRISM": "Prism",
|
||||||
"PRIX": "Privatix",
|
"PRIX": "Privatix",
|
||||||
@ -6033,7 +6102,7 @@
|
|||||||
"PROTON": "Proton",
|
"PROTON": "Proton",
|
||||||
"PROUD": "PROUD Money",
|
"PROUD": "PROUD Money",
|
||||||
"PROXI": "PROXI",
|
"PROXI": "PROXI",
|
||||||
"PRP": "Papyrus",
|
"PRP": "Pepe Prime",
|
||||||
"PRPS": "Purpose",
|
"PRPS": "Purpose",
|
||||||
"PRPT": "Purple Token",
|
"PRPT": "Purple Token",
|
||||||
"PRQ": "PARSIQ",
|
"PRQ": "PARSIQ",
|
||||||
@ -6042,7 +6111,7 @@
|
|||||||
"PRTG": "Pre-Retogeum",
|
"PRTG": "Pre-Retogeum",
|
||||||
"PRV": "PrivacySwap",
|
"PRV": "PrivacySwap",
|
||||||
"PRVS": "Previse",
|
"PRVS": "Previse",
|
||||||
"PRX": "Printerium",
|
"PRX": "Parex",
|
||||||
"PRXY": "Proxy",
|
"PRXY": "Proxy",
|
||||||
"PRY": "PRIMARY",
|
"PRY": "PRIMARY",
|
||||||
"PSB": "Planet Sandbox",
|
"PSB": "Planet Sandbox",
|
||||||
@ -6120,6 +6189,7 @@
|
|||||||
"PYRAM": "Pyram Token",
|
"PYRAM": "Pyram Token",
|
||||||
"PYRK": "Pyrk",
|
"PYRK": "Pyrk",
|
||||||
"PYT": "Payther",
|
"PYT": "Payther",
|
||||||
|
"PYUSD": "PayPal USD",
|
||||||
"PZM": "Prizm",
|
"PZM": "Prizm",
|
||||||
"Q1S": "Quantum1Net",
|
"Q1S": "Quantum1Net",
|
||||||
"Q2C": "QubitCoin",
|
"Q2C": "QubitCoin",
|
||||||
@ -6178,6 +6248,7 @@
|
|||||||
"QUA": "Quantum Tech",
|
"QUA": "Quantum Tech",
|
||||||
"QUACK": "Rich Quack",
|
"QUACK": "Rich Quack",
|
||||||
"QUAM": "Quam Network",
|
"QUAM": "Quam Network",
|
||||||
|
"QUANT": "Quant Finance",
|
||||||
"QUARASHI": "Quarashi Network",
|
"QUARASHI": "Quarashi Network",
|
||||||
"QUARTZ": "Sandclock",
|
"QUARTZ": "Sandclock",
|
||||||
"QUASA": "Quasacoin",
|
"QUASA": "Quasacoin",
|
||||||
@ -6201,7 +6272,7 @@
|
|||||||
"RAC": "RAcoin",
|
"RAC": "RAcoin",
|
||||||
"RACA": "Radio Caca",
|
"RACA": "Radio Caca",
|
||||||
"RACEFI": "RaceFi",
|
"RACEFI": "RaceFi",
|
||||||
"RAD": "Radicle",
|
"RAD": "Radworks",
|
||||||
"RADAR": "DappRadar",
|
"RADAR": "DappRadar",
|
||||||
"RADI": "RadicalCoin",
|
"RADI": "RadicalCoin",
|
||||||
"RADIO": "RadioShack",
|
"RADIO": "RadioShack",
|
||||||
@ -6220,7 +6291,7 @@
|
|||||||
"RAM": "Ramifi Protocol",
|
"RAM": "Ramifi Protocol",
|
||||||
"RAMP": "RAMP",
|
"RAMP": "RAMP",
|
||||||
"RANKER": "RankerDao",
|
"RANKER": "RankerDao",
|
||||||
"RAP": "Rapture",
|
"RAP": "Philosoraptor",
|
||||||
"RAPDOGE": "RapDoge",
|
"RAPDOGE": "RapDoge",
|
||||||
"RARE": "SuperRare",
|
"RARE": "SuperRare",
|
||||||
"RARI": "Rarible",
|
"RARI": "Rarible",
|
||||||
@ -6277,6 +6348,7 @@
|
|||||||
"REA": "Realisto",
|
"REA": "Realisto",
|
||||||
"REAL": "RealLink",
|
"REAL": "RealLink",
|
||||||
"REALM": "Realm",
|
"REALM": "Realm",
|
||||||
|
"REALMS": "Realms of Ethernity",
|
||||||
"REALPLATFORM": "REAL",
|
"REALPLATFORM": "REAL",
|
||||||
"REALY": "Realy Metaverse",
|
"REALY": "Realy Metaverse",
|
||||||
"REAP": "ReapChain",
|
"REAP": "ReapChain",
|
||||||
@ -6287,6 +6359,7 @@
|
|||||||
"RED": "RED TOKEN",
|
"RED": "RED TOKEN",
|
||||||
"REDC": "RedCab",
|
"REDC": "RedCab",
|
||||||
"REDCO": "Redcoin",
|
"REDCO": "Redcoin",
|
||||||
|
"REDDIT": "Reddit",
|
||||||
"REDI": "REDi",
|
"REDI": "REDi",
|
||||||
"REDLANG": "RED",
|
"REDLANG": "RED",
|
||||||
"REDLC": "Redlight Chain",
|
"REDLC": "Redlight Chain",
|
||||||
@ -6324,7 +6397,7 @@
|
|||||||
"REST": "Restore",
|
"REST": "Restore",
|
||||||
"RET": "RealTract",
|
"RET": "RealTract",
|
||||||
"RETAIL": "Retail.Global",
|
"RETAIL": "Retail.Global",
|
||||||
"RETH": "Realms of Ethernity",
|
"RETH": "Rocket Pool ETH",
|
||||||
"RETH2": "rETH2",
|
"RETH2": "rETH2",
|
||||||
"RETIRE": "Retire Token",
|
"RETIRE": "Retire Token",
|
||||||
"REU": "REUCOIN",
|
"REU": "REUCOIN",
|
||||||
@ -6351,6 +6424,7 @@
|
|||||||
"RGP": "Rigel Protocol",
|
"RGP": "Rigel Protocol",
|
||||||
"RGT": "Rari Governance Token",
|
"RGT": "Rari Governance Token",
|
||||||
"RHEA": "Rhea",
|
"RHEA": "Rhea",
|
||||||
|
"RHINO": "RHINO",
|
||||||
"RHOC": "RChain",
|
"RHOC": "RChain",
|
||||||
"RHP": "Rhypton Club",
|
"RHP": "Rhypton Club",
|
||||||
"RIC": "Riecoin",
|
"RIC": "Riecoin",
|
||||||
@ -6490,6 +6564,7 @@
|
|||||||
"RWE": "Real-World Evidence",
|
"RWE": "Real-World Evidence",
|
||||||
"RWN": "Rowan Token",
|
"RWN": "Rowan Token",
|
||||||
"RWS": "Robonomics Web Services",
|
"RWS": "Robonomics Web Services",
|
||||||
|
"RXD": "Radiant",
|
||||||
"RXT": "RIMAUNANGIS",
|
"RXT": "RIMAUNANGIS",
|
||||||
"RYC": "RoyalCoin",
|
"RYC": "RoyalCoin",
|
||||||
"RYCN": "RoyalCoin 2.0",
|
"RYCN": "RoyalCoin 2.0",
|
||||||
@ -6564,6 +6639,7 @@
|
|||||||
"SBTC": "Super Bitcoin",
|
"SBTC": "Super Bitcoin",
|
||||||
"SC": "Siacoin",
|
"SC": "Siacoin",
|
||||||
"SCA": "SiaClassic",
|
"SCA": "SiaClassic",
|
||||||
|
"SCAM": "Scam Coin",
|
||||||
"SCAP": "SafeCapital",
|
"SCAP": "SafeCapital",
|
||||||
"SCAR": "Velhalla",
|
"SCAR": "Velhalla",
|
||||||
"SCASH": "SpaceCash",
|
"SCASH": "SpaceCash",
|
||||||
@ -6624,6 +6700,7 @@
|
|||||||
"SEER": "SEER",
|
"SEER": "SEER",
|
||||||
"SEI": "Sei",
|
"SEI": "Sei",
|
||||||
"SEL": "SelenCoin",
|
"SEL": "SelenCoin",
|
||||||
|
"SELF": "SELFCrypto",
|
||||||
"SEM": "Semux",
|
"SEM": "Semux",
|
||||||
"SEN": "Sentaro",
|
"SEN": "Sentaro",
|
||||||
"SENATE": "SENATE",
|
"SENATE": "SENATE",
|
||||||
@ -6665,6 +6742,7 @@
|
|||||||
"SGE": "Society of Galactic Exploration",
|
"SGE": "Society of Galactic Exploration",
|
||||||
"SGLY": "Singularity",
|
"SGLY": "Singularity",
|
||||||
"SGN": "Signals Network",
|
"SGN": "Signals Network",
|
||||||
|
"SGO": "SafuuGO",
|
||||||
"SGOLD": "SpaceGold",
|
"SGOLD": "SpaceGold",
|
||||||
"SGP": "SGPay",
|
"SGP": "SGPay",
|
||||||
"SGR": "Sogur Currency",
|
"SGR": "Sogur Currency",
|
||||||
@ -6684,6 +6762,7 @@
|
|||||||
"SHEESH": "Sheesh it is bussin bussin",
|
"SHEESH": "Sheesh it is bussin bussin",
|
||||||
"SHEESHA": "Sheesha Finance",
|
"SHEESHA": "Sheesha Finance",
|
||||||
"SHELL": "Shell Token",
|
"SHELL": "Shell Token",
|
||||||
|
"SHERA": "Shera Tokens",
|
||||||
"SHFL": "SHUFFLE!",
|
"SHFL": "SHUFFLE!",
|
||||||
"SHFT": "Shyft Network",
|
"SHFT": "Shyft Network",
|
||||||
"SHI": "Shirtum",
|
"SHI": "Shirtum",
|
||||||
@ -6719,6 +6798,8 @@
|
|||||||
"SHR": "ShareToken",
|
"SHR": "ShareToken",
|
||||||
"SHREK": "ShrekCoin",
|
"SHREK": "ShrekCoin",
|
||||||
"SHROOM": "Shroom.Finance",
|
"SHROOM": "Shroom.Finance",
|
||||||
|
"SHROOMFOX": "Magic Shroom",
|
||||||
|
"SHS": "SHEESH",
|
||||||
"SHX": "Stronghold Token",
|
"SHX": "Stronghold Token",
|
||||||
"SI": "Siren",
|
"SI": "Siren",
|
||||||
"SIB": "SibCoin",
|
"SIB": "SibCoin",
|
||||||
@ -7018,9 +7099,11 @@
|
|||||||
"STEN": "Steneum Coin",
|
"STEN": "Steneum Coin",
|
||||||
"STEP": "Step Finance",
|
"STEP": "Step Finance",
|
||||||
"STEPH": "Step Hero",
|
"STEPH": "Step Hero",
|
||||||
|
"STEPR": "Step",
|
||||||
"STEPS": "Steps",
|
"STEPS": "Steps",
|
||||||
"STERLINGCOIN": "SterlingCoin",
|
"STERLINGCOIN": "SterlingCoin",
|
||||||
"STETH": "Staked Ether",
|
"STETH": "Staked Ether",
|
||||||
|
"STEWIE": "Stewie Coin",
|
||||||
"STEX": "STEX",
|
"STEX": "STEX",
|
||||||
"STF": "Structure Finance",
|
"STF": "Structure Finance",
|
||||||
"STFX": "STFX",
|
"STFX": "STFX",
|
||||||
@ -7055,7 +7138,7 @@
|
|||||||
"STR": "Sourceless",
|
"STR": "Sourceless",
|
||||||
"STRAKS": "Straks",
|
"STRAKS": "Straks",
|
||||||
"STRAX": "Stratis",
|
"STRAX": "Stratis",
|
||||||
"STRAY": "Animal Token",
|
"STRAY": "Stray Dog",
|
||||||
"STREAM": "STREAMIT COIN",
|
"STREAM": "STREAMIT COIN",
|
||||||
"STRIP": "Stripto",
|
"STRIP": "Stripto",
|
||||||
"STRK": "Strike",
|
"STRK": "Strike",
|
||||||
@ -7361,6 +7444,7 @@
|
|||||||
"TOM": "TOM Finance",
|
"TOM": "TOM Finance",
|
||||||
"TOMAHAWKCOIN": "Tomahawkcoin",
|
"TOMAHAWKCOIN": "Tomahawkcoin",
|
||||||
"TOMB": "Tomb",
|
"TOMB": "Tomb",
|
||||||
|
"TOMI": "tomiNet",
|
||||||
"TOMO": "TomoChain",
|
"TOMO": "TomoChain",
|
||||||
"TOMOE": "TomoChain ERC20",
|
"TOMOE": "TomoChain ERC20",
|
||||||
"TOMS": "TomTomCoin",
|
"TOMS": "TomTomCoin",
|
||||||
@ -7385,6 +7469,7 @@
|
|||||||
"TOTM": "Totem",
|
"TOTM": "Totem",
|
||||||
"TOWER": "Tower",
|
"TOWER": "Tower",
|
||||||
"TOWN": "Town Star",
|
"TOWN": "Town Star",
|
||||||
|
"TOX": "INTOverse",
|
||||||
"TOZ": "Tozex",
|
"TOZ": "Tozex",
|
||||||
"TP": "Token Swap",
|
"TP": "Token Swap",
|
||||||
"TPAD": "TrustPad",
|
"TPAD": "TrustPad",
|
||||||
@ -7600,6 +7685,7 @@
|
|||||||
"UNITY": "SuperNET",
|
"UNITY": "SuperNET",
|
||||||
"UNIVRS": "Universe",
|
"UNIVRS": "Universe",
|
||||||
"UNIX": "UniX",
|
"UNIX": "UniX",
|
||||||
|
"UNLEASH": "UnleashClub",
|
||||||
"UNN": "UNION Protocol Governance Token",
|
"UNN": "UNION Protocol Governance Token",
|
||||||
"UNO": "Unobtanium",
|
"UNO": "Unobtanium",
|
||||||
"UNORE": "UnoRe",
|
"UNORE": "UnoRe",
|
||||||
@ -7673,6 +7759,7 @@
|
|||||||
"UTT": "United Traders Token",
|
"UTT": "United Traders Token",
|
||||||
"UTU": "UTU Protocol",
|
"UTU": "UTU Protocol",
|
||||||
"UUU": "U Network",
|
"UUU": "U Network",
|
||||||
|
"UWU": "uwu",
|
||||||
"UZUMAKI": "Uzumaki Inu",
|
"UZUMAKI": "Uzumaki Inu",
|
||||||
"VAB": "Vabble",
|
"VAB": "Vabble",
|
||||||
"VADER": "Vader Protocol",
|
"VADER": "Vader Protocol",
|
||||||
@ -7695,6 +7782,7 @@
|
|||||||
"VCF": "Valencia CF Fan Token",
|
"VCF": "Valencia CF Fan Token",
|
||||||
"VCG": "VCGamers",
|
"VCG": "VCGamers",
|
||||||
"VCK": "28VCK",
|
"VCK": "28VCK",
|
||||||
|
"VCORE": "VCORE",
|
||||||
"VDG": "VeriDocGlobal",
|
"VDG": "VeriDocGlobal",
|
||||||
"VDL": "Vidulum",
|
"VDL": "Vidulum",
|
||||||
"VDO": "VidioCoin",
|
"VDO": "VidioCoin",
|
||||||
@ -7710,6 +7798,7 @@
|
|||||||
"VEIL": "VEIL",
|
"VEIL": "VEIL",
|
||||||
"VELA": "Vela Token",
|
"VELA": "Vela Token",
|
||||||
"VELO": "Velo",
|
"VELO": "Velo",
|
||||||
|
"VELOD": "Velodrome Finance",
|
||||||
"VELOX": "Velox",
|
"VELOX": "Velox",
|
||||||
"VELOXPROJECT": "Velox",
|
"VELOXPROJECT": "Velox",
|
||||||
"VEMP": "vEmpire DDAO",
|
"VEMP": "vEmpire DDAO",
|
||||||
@ -7782,6 +7871,7 @@
|
|||||||
"VNT": "VNT Chain",
|
"VNT": "VNT Chain",
|
||||||
"VNTW": "Value Network Token",
|
"VNTW": "Value Network Token",
|
||||||
"VNX": "VisionX",
|
"VNX": "VisionX",
|
||||||
|
"VNXAU": "VNX Gold",
|
||||||
"VNXLU": "VNX Exchange",
|
"VNXLU": "VNX Exchange",
|
||||||
"VOCO": "Provoco",
|
"VOCO": "Provoco",
|
||||||
"VODKA": "Vodka Token",
|
"VODKA": "Vodka Token",
|
||||||
@ -7902,7 +7992,8 @@
|
|||||||
"WEC": "Whole Earth Coin",
|
"WEC": "Whole Earth Coin",
|
||||||
"WEGEN": "WeGen Platform",
|
"WEGEN": "WeGen Platform",
|
||||||
"WELD": "Weld",
|
"WELD": "Weld",
|
||||||
"WELL": "Well",
|
"WELL": "Moonwell",
|
||||||
|
"WELLTOKEN": "Well",
|
||||||
"WELT": "Fabwelt",
|
"WELT": "Fabwelt",
|
||||||
"WELUPS": "Welups Blockchain",
|
"WELUPS": "Welups Blockchain",
|
||||||
"WEMIX": "WEMIX",
|
"WEMIX": "WEMIX",
|
||||||
@ -7958,6 +8049,7 @@
|
|||||||
"WIX": "Wixlar",
|
"WIX": "Wixlar",
|
||||||
"WIZ": "WIZ Protocol",
|
"WIZ": "WIZ Protocol",
|
||||||
"WKD": "Wakanda Inu",
|
"WKD": "Wakanda Inu",
|
||||||
|
"WLD": "Worldcoin",
|
||||||
"WLF": "Wolfs Group",
|
"WLF": "Wolfs Group",
|
||||||
"WLITI": "wLITI",
|
"WLITI": "wLITI",
|
||||||
"WLK": "Wolk",
|
"WLK": "Wolk",
|
||||||
@ -7983,6 +8075,7 @@
|
|||||||
"WNZ": "Winerz",
|
"WNZ": "Winerz",
|
||||||
"WOA": "Wrapped Origin Axie",
|
"WOA": "Wrapped Origin Axie",
|
||||||
"WOD": "World of Defish",
|
"WOD": "World of Defish",
|
||||||
|
"WOID": "WORLD ID",
|
||||||
"WOJ": "Wojak Finance",
|
"WOJ": "Wojak Finance",
|
||||||
"WOLF": "Insanity Coin",
|
"WOLF": "Insanity Coin",
|
||||||
"WOLFILAND": "Wolfiland",
|
"WOLFILAND": "Wolfiland",
|
||||||
@ -8000,6 +8093,7 @@
|
|||||||
"WOOFY": "Woofy",
|
"WOOFY": "Woofy",
|
||||||
"WOOL": "Wolf Game Wool",
|
"WOOL": "Wolf Game Wool",
|
||||||
"WOONK": "Woonkly",
|
"WOONK": "Woonkly",
|
||||||
|
"WOOO": "wooonen",
|
||||||
"WOOP": "Woonkly Power",
|
"WOOP": "Woonkly Power",
|
||||||
"WOP": "WorldPay",
|
"WOP": "WorldPay",
|
||||||
"WORLD": "World Token",
|
"WORLD": "World Token",
|
||||||
@ -8010,6 +8104,7 @@
|
|||||||
"WOZX": "Efforce",
|
"WOZX": "Efforce",
|
||||||
"WPC": "WePiggy Coin",
|
"WPC": "WePiggy Coin",
|
||||||
"WPE": "OPES (Wrapped PE)",
|
"WPE": "OPES (Wrapped PE)",
|
||||||
|
"WPLS": "Wrapped Pulse",
|
||||||
"WPP": "Green Energy Token",
|
"WPP": "Green Energy Token",
|
||||||
"WPR": "WePower",
|
"WPR": "WePower",
|
||||||
"WQT": "Work Quest",
|
"WQT": "Work Quest",
|
||||||
@ -8049,6 +8144,7 @@
|
|||||||
"WZEC": "Wrapped Zcash",
|
"WZEC": "Wrapped Zcash",
|
||||||
"WZENIQ": "Wrapped Zeniq (ETH)",
|
"WZENIQ": "Wrapped Zeniq (ETH)",
|
||||||
"WZRD": "Wizardia",
|
"WZRD": "Wizardia",
|
||||||
|
"X": "AI-X",
|
||||||
"X2": "X2Coin",
|
"X2": "X2Coin",
|
||||||
"X2Y2": "X2Y2",
|
"X2Y2": "X2Y2",
|
||||||
"X42": "X42 Protocol",
|
"X42": "X42 Protocol",
|
||||||
@ -8096,7 +8192,7 @@
|
|||||||
"XCI": "Cannabis Industry Coin",
|
"XCI": "Cannabis Industry Coin",
|
||||||
"XCLR": "ClearCoin",
|
"XCLR": "ClearCoin",
|
||||||
"XCM": "CoinMetro",
|
"XCM": "CoinMetro",
|
||||||
"XCN": "Chain",
|
"XCN": "Onyxcoin",
|
||||||
"XCO": "XCoin",
|
"XCO": "XCoin",
|
||||||
"XCONSOL": "X-Consoles",
|
"XCONSOL": "X-Consoles",
|
||||||
"XCP": "CounterParty",
|
"XCP": "CounterParty",
|
||||||
@ -8365,6 +8461,7 @@
|
|||||||
"YUANG": "Yuang Coin",
|
"YUANG": "Yuang Coin",
|
||||||
"YUCJ": "Yu Coin",
|
"YUCJ": "Yu Coin",
|
||||||
"YUCT": "Yucreat",
|
"YUCT": "Yucreat",
|
||||||
|
"YUDI": "Yudi",
|
||||||
"YUM": "Yumerium",
|
"YUM": "Yumerium",
|
||||||
"YUMMY": "Yummy",
|
"YUMMY": "Yummy",
|
||||||
"YUP": "Crowdholding",
|
"YUP": "Crowdholding",
|
||||||
|
@ -142,6 +142,10 @@
|
|||||||
<loc>https://ghostfol.io/en/blog/2023/07/exploring-the-path-to-fire</loc>
|
<loc>https://ghostfol.io/en/blog/2023/07/exploring-the-path-to-fire</loc>
|
||||||
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
|
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
|
||||||
</url>
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://ghostfol.io/en/blog/2023/08/ghostfolio-joins-oss-friends</loc>
|
||||||
|
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
|
||||||
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://ghostfol.io/en/faq</loc>
|
<loc>https://ghostfol.io/en/faq</loc>
|
||||||
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
|
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
|
||||||
@ -322,6 +326,10 @@
|
|||||||
<loc>https://ghostfol.io/es/sobre/licencia</loc>
|
<loc>https://ghostfol.io/es/sobre/licencia</loc>
|
||||||
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
|
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
|
||||||
</url>
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://ghostfol.io/es/sobre/oss-friends</loc>
|
||||||
|
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
|
||||||
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://ghostfol.io/es/sobre/politica-de-privacidad</loc>
|
<loc>https://ghostfol.io/es/sobre/politica-de-privacidad</loc>
|
||||||
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
|
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
|
||||||
@ -342,6 +350,10 @@
|
|||||||
<loc>https://ghostfol.io/fr/a-propos/licence</loc>
|
<loc>https://ghostfol.io/fr/a-propos/licence</loc>
|
||||||
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
|
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
|
||||||
</url>
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://ghostfol.io/fr/a-propos/oss-friends</loc>
|
||||||
|
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
|
||||||
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://ghostfol.io/fr/a-propos/politique-de-confidentialite</loc>
|
<loc>https://ghostfol.io/fr/a-propos/politique-de-confidentialite</loc>
|
||||||
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
|
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
|
||||||
@ -396,12 +408,16 @@
|
|||||||
<loc>https://ghostfol.io/it/informazioni-su/changelog</loc>
|
<loc>https://ghostfol.io/it/informazioni-su/changelog</loc>
|
||||||
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
|
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
|
||||||
</url>
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://ghostfol.io/it/informazioni-su/informativa-sulla-privacy</loc>
|
||||||
|
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
|
||||||
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://ghostfol.io/it/informazioni-su/licenza</loc>
|
<loc>https://ghostfol.io/it/informazioni-su/licenza</loc>
|
||||||
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
|
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://ghostfol.io/it/informazioni-su/informativa-sulla-privacy</loc>
|
<loc>https://ghostfol.io/it/informazioni-su/oss-friends</loc>
|
||||||
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
|
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
@ -460,6 +476,10 @@
|
|||||||
<loc>https://ghostfol.io/nl/over/licentie</loc>
|
<loc>https://ghostfol.io/nl/over/licentie</loc>
|
||||||
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
|
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
|
||||||
</url>
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://ghostfol.io/nl/over/oss-friends</loc>
|
||||||
|
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
|
||||||
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://ghostfol.io/nl/over/privacybeleid</loc>
|
<loc>https://ghostfol.io/nl/over/privacybeleid</loc>
|
||||||
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
|
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
|
||||||
@ -520,6 +540,10 @@
|
|||||||
<loc>https://ghostfol.io/pt/sobre/licenca</loc>
|
<loc>https://ghostfol.io/pt/sobre/licenca</loc>
|
||||||
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
|
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
|
||||||
</url>
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://ghostfol.io/pt/sobre/oss-friends</loc>
|
||||||
|
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
|
||||||
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://ghostfol.io/pt/sobre/politica-de-privacidade</loc>
|
<loc>https://ghostfol.io/pt/sobre/politica-de-privacidade</loc>
|
||||||
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
|
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
|
||||||
|
@ -71,6 +71,10 @@ const locales = {
|
|||||||
'/en/blog/2023/07/exploring-the-path-to-fire': {
|
'/en/blog/2023/07/exploring-the-path-to-fire': {
|
||||||
featureGraphicPath: 'assets/images/blog/20230701.jpg',
|
featureGraphicPath: 'assets/images/blog/20230701.jpg',
|
||||||
title: `Exploring the Path to FIRE - ${titleShort}`
|
title: `Exploring the Path to FIRE - ${titleShort}`
|
||||||
|
},
|
||||||
|
'/en/blog/2023/08/ghostfolio-joins-oss-friends': {
|
||||||
|
featureGraphicPath: 'assets/images/blog/ghostfolio-joins-oss-friends.png',
|
||||||
|
title: `Ghostfolio joins OSS Friends - ${titleShort}`
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -127,12 +127,10 @@ export class DataGatheringService {
|
|||||||
uniqueAssets = await this.getUniqueAssets();
|
uniqueAssets = await this.getUniqueAssets();
|
||||||
}
|
}
|
||||||
|
|
||||||
const assetProfiles = await this.dataProviderService.getAssetProfiles(
|
const assetProfiles =
|
||||||
uniqueAssets
|
await this.dataProviderService.getAssetProfiles(uniqueAssets);
|
||||||
);
|
const symbolProfiles =
|
||||||
const symbolProfiles = await this.symbolProfileService.getSymbolProfiles(
|
await this.symbolProfileService.getSymbolProfiles(uniqueAssets);
|
||||||
uniqueAssets
|
|
||||||
);
|
|
||||||
|
|
||||||
for (const [symbol, assetProfile] of Object.entries(assetProfiles)) {
|
for (const [symbol, assetProfile] of Object.entries(assetProfiles)) {
|
||||||
const symbolMapping = symbolProfiles.find((symbolProfile) => {
|
const symbolMapping = symbolProfiles.find((symbolProfile) => {
|
||||||
|
@ -4,14 +4,18 @@ import { TrackinsightDataEnhancerService } from '@ghostfolio/api/services/data-p
|
|||||||
import { YahooFinanceDataEnhancerService } from '@ghostfolio/api/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service';
|
import { YahooFinanceDataEnhancerService } from '@ghostfolio/api/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service';
|
||||||
import { Module } from '@nestjs/common';
|
import { Module } from '@nestjs/common';
|
||||||
|
|
||||||
|
import { DataEnhancerService } from './data-enhancer.service';
|
||||||
|
|
||||||
@Module({
|
@Module({
|
||||||
exports: [
|
exports: [
|
||||||
'DataEnhancers',
|
DataEnhancerService,
|
||||||
TrackinsightDataEnhancerService,
|
TrackinsightDataEnhancerService,
|
||||||
YahooFinanceDataEnhancerService
|
YahooFinanceDataEnhancerService,
|
||||||
|
'DataEnhancers'
|
||||||
],
|
],
|
||||||
imports: [ConfigurationModule, CryptocurrencyModule],
|
imports: [ConfigurationModule, CryptocurrencyModule],
|
||||||
providers: [
|
providers: [
|
||||||
|
DataEnhancerService,
|
||||||
TrackinsightDataEnhancerService,
|
TrackinsightDataEnhancerService,
|
||||||
YahooFinanceDataEnhancerService,
|
YahooFinanceDataEnhancerService,
|
||||||
{
|
{
|
||||||
|
@ -0,0 +1,44 @@
|
|||||||
|
import { DataEnhancerInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-enhancer.interface';
|
||||||
|
import { HttpException, Inject, Injectable } from '@nestjs/common';
|
||||||
|
import { Prisma } from '@prisma/client';
|
||||||
|
import { StatusCodes, getReasonPhrase } from 'http-status-codes';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class DataEnhancerService {
|
||||||
|
public constructor(
|
||||||
|
@Inject('DataEnhancers')
|
||||||
|
private readonly dataEnhancers: DataEnhancerInterface[]
|
||||||
|
) {}
|
||||||
|
|
||||||
|
public async enhance(aName: string) {
|
||||||
|
const dataEnhancer = this.dataEnhancers.find((dataEnhancer) => {
|
||||||
|
return dataEnhancer.getName() === aName;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!dataEnhancer) {
|
||||||
|
throw new HttpException(
|
||||||
|
getReasonPhrase(StatusCodes.NOT_FOUND),
|
||||||
|
StatusCodes.NOT_FOUND
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const assetProfile = await dataEnhancer.enhance({
|
||||||
|
response: {
|
||||||
|
assetClass: 'EQUITY',
|
||||||
|
assetSubClass: 'ETF'
|
||||||
|
},
|
||||||
|
symbol: dataEnhancer.getTestSymbol()
|
||||||
|
});
|
||||||
|
|
||||||
|
if (
|
||||||
|
(assetProfile.countries as unknown as Prisma.JsonArray)?.length > 0 &&
|
||||||
|
(assetProfile.sectors as unknown as Prisma.JsonArray)?.length > 0
|
||||||
|
) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} catch {}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
@ -7,7 +7,7 @@ import got from 'got';
|
|||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class TrackinsightDataEnhancerService implements DataEnhancerInterface {
|
export class TrackinsightDataEnhancerService implements DataEnhancerInterface {
|
||||||
private static baseUrl = 'https://data.trackinsight.com';
|
private static baseUrl = 'https://www.trackinsight.com/data-api';
|
||||||
private static countries = require('countries-list/dist/countries.json');
|
private static countries = require('countries-list/dist/countries.json');
|
||||||
private static countriesMapping = {
|
private static countriesMapping = {
|
||||||
'Russian Federation': 'Russia'
|
'Russian Federation': 'Russia'
|
||||||
@ -33,14 +33,22 @@ export class TrackinsightDataEnhancerService implements DataEnhancerInterface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const profile = await got(
|
const profile = await got(
|
||||||
`${TrackinsightDataEnhancerService.baseUrl}/data-api/funds/${symbol}.json`
|
`${TrackinsightDataEnhancerService.baseUrl}/funds/${symbol}.json`
|
||||||
)
|
)
|
||||||
.json<any>()
|
.json<any>()
|
||||||
.catch(() => {
|
.catch(() => {
|
||||||
return {};
|
return got(
|
||||||
|
`${TrackinsightDataEnhancerService.baseUrl}/funds/${symbol.split(
|
||||||
|
'.'
|
||||||
|
)?.[0]}.json`
|
||||||
|
)
|
||||||
|
.json<any>()
|
||||||
|
.catch(() => {
|
||||||
|
return {};
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
const isin = profile.isin?.split(';')?.[0];
|
const isin = profile?.isin?.split(';')?.[0];
|
||||||
|
|
||||||
if (isin) {
|
if (isin) {
|
||||||
response.isin = isin;
|
response.isin = isin;
|
||||||
@ -52,10 +60,14 @@ export class TrackinsightDataEnhancerService implements DataEnhancerInterface {
|
|||||||
.json<any>()
|
.json<any>()
|
||||||
.catch(() => {
|
.catch(() => {
|
||||||
return got(
|
return got(
|
||||||
`${TrackinsightDataEnhancerService.baseUrl}/holdings/${
|
`${TrackinsightDataEnhancerService.baseUrl}/holdings/${symbol.split(
|
||||||
symbol.split('.')?.[0]
|
'.'
|
||||||
}.json`
|
)?.[0]}.json`
|
||||||
);
|
)
|
||||||
|
.json<any>()
|
||||||
|
.catch(() => {
|
||||||
|
return {};
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
if (holdings?.weight < 0.95) {
|
if (holdings?.weight < 0.95) {
|
||||||
@ -114,4 +126,8 @@ export class TrackinsightDataEnhancerService implements DataEnhancerInterface {
|
|||||||
public getName() {
|
public getName() {
|
||||||
return 'TRACKINSIGHT';
|
return 'TRACKINSIGHT';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public getTestSymbol() {
|
||||||
|
return 'QQQ';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -99,9 +99,8 @@ export class YahooFinanceDataEnhancerService implements DataEnhancerInterface {
|
|||||||
yahooSymbol = quotes[0].symbol;
|
yahooSymbol = quotes[0].symbol;
|
||||||
}
|
}
|
||||||
|
|
||||||
const { countries, sectors, url } = await this.getAssetProfile(
|
const { countries, sectors, url } =
|
||||||
yahooSymbol
|
await this.getAssetProfile(yahooSymbol);
|
||||||
);
|
|
||||||
|
|
||||||
if (countries) {
|
if (countries) {
|
||||||
response.countries = countries;
|
response.countries = countries;
|
||||||
@ -234,6 +233,10 @@ export class YahooFinanceDataEnhancerService implements DataEnhancerInterface {
|
|||||||
return DataSource.YAHOO;
|
return DataSource.YAHOO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public getTestSymbol() {
|
||||||
|
return 'AAPL';
|
||||||
|
}
|
||||||
|
|
||||||
public parseAssetClass({
|
public parseAssetClass({
|
||||||
quoteType,
|
quoteType,
|
||||||
shortName
|
shortName
|
||||||
|
@ -10,4 +10,6 @@ export interface DataEnhancerInterface {
|
|||||||
}): Promise<Partial<SymbolProfile>>;
|
}): Promise<Partial<SymbolProfile>>;
|
||||||
|
|
||||||
getName(): string;
|
getName(): string;
|
||||||
|
|
||||||
|
getTestSymbol(): string;
|
||||||
}
|
}
|
||||||
|
@ -65,9 +65,8 @@ export class TwitterBotService {
|
|||||||
status += benchmarkListing;
|
status += benchmarkListing;
|
||||||
}
|
}
|
||||||
|
|
||||||
const { data: createdTweet } = await this.twitterClient.v2.tweet(
|
const { data: createdTweet } =
|
||||||
status
|
await this.twitterClient.v2.tweet(status);
|
||||||
);
|
|
||||||
|
|
||||||
Logger.log(
|
Logger.log(
|
||||||
`Fear & Greed Index has been tweeted: https://twitter.com/ghostfolio_/status/${createdTweet.id}`,
|
`Fear & Greed Index has been tweeted: https://twitter.com/ghostfolio_/status/${createdTweet.id}`,
|
||||||
|
@ -4,20 +4,24 @@ import { PageTitleStrategy } from '@ghostfolio/client/services/page-title.strate
|
|||||||
|
|
||||||
import { ModulePreloadService } from './core/module-preload.service';
|
import { ModulePreloadService } from './core/module-preload.service';
|
||||||
|
|
||||||
|
export const paths = {
|
||||||
|
about: $localize`about`,
|
||||||
|
faq: $localize`faq`,
|
||||||
|
features: $localize`features`,
|
||||||
|
license: $localize`license`,
|
||||||
|
markets: $localize`markets`,
|
||||||
|
pricing: $localize`pricing`,
|
||||||
|
privacyPolicy: $localize`privacy-policy`,
|
||||||
|
register: $localize`register`,
|
||||||
|
resources: $localize`resources`
|
||||||
|
};
|
||||||
|
|
||||||
const routes: Routes = [
|
const routes: Routes = [
|
||||||
...[
|
{
|
||||||
'about',
|
path: paths.about,
|
||||||
/////
|
|
||||||
'a-propos',
|
|
||||||
'informazioni-su',
|
|
||||||
'over',
|
|
||||||
'sobre',
|
|
||||||
'ueber-uns'
|
|
||||||
].map((path) => ({
|
|
||||||
path,
|
|
||||||
loadChildren: () =>
|
loadChildren: () =>
|
||||||
import('./pages/about/about-page.module').then((m) => m.AboutPageModule)
|
import('./pages/about/about-page.module').then((m) => m.AboutPageModule)
|
||||||
})),
|
},
|
||||||
{
|
{
|
||||||
path: 'account',
|
path: 'account',
|
||||||
loadChildren: () =>
|
loadChildren: () =>
|
||||||
@ -42,64 +46,40 @@ const routes: Routes = [
|
|||||||
loadChildren: () =>
|
loadChildren: () =>
|
||||||
import('./pages/auth/auth-page.module').then((m) => m.AuthPageModule)
|
import('./pages/auth/auth-page.module').then((m) => m.AuthPageModule)
|
||||||
},
|
},
|
||||||
...['blog'].map((path) => ({
|
{
|
||||||
path,
|
path: 'blog',
|
||||||
loadChildren: () =>
|
loadChildren: () =>
|
||||||
import('./pages/blog/blog-page.module').then((m) => m.BlogPageModule)
|
import('./pages/blog/blog-page.module').then((m) => m.BlogPageModule)
|
||||||
})),
|
},
|
||||||
{
|
{
|
||||||
path: 'demo',
|
path: 'demo',
|
||||||
loadChildren: () =>
|
loadChildren: () =>
|
||||||
import('./pages/demo/demo-page.module').then((m) => m.DemoPageModule)
|
import('./pages/demo/demo-page.module').then((m) => m.DemoPageModule)
|
||||||
},
|
},
|
||||||
...[
|
{
|
||||||
'faq',
|
path: paths.faq,
|
||||||
/////
|
|
||||||
'domande-piu-frequenti',
|
|
||||||
'foire-aux-questions',
|
|
||||||
'haeufig-gestellte-fragen',
|
|
||||||
'perguntas-mais-frequentes',
|
|
||||||
'preguntas-mas-frecuentes',
|
|
||||||
'vaak-gestelde-vragen'
|
|
||||||
].map((path) => ({
|
|
||||||
path,
|
|
||||||
loadChildren: () =>
|
loadChildren: () =>
|
||||||
import('./pages/faq/faq-page.module').then((m) => m.FaqPageModule)
|
import('./pages/faq/faq-page.module').then((m) => m.FaqPageModule)
|
||||||
})),
|
},
|
||||||
...[
|
{
|
||||||
'features',
|
path: paths.features,
|
||||||
/////
|
|
||||||
'fonctionnalites',
|
|
||||||
'funcionalidades',
|
|
||||||
'funzionalita',
|
|
||||||
'kenmerken'
|
|
||||||
].map((path) => ({
|
|
||||||
path,
|
|
||||||
loadChildren: () =>
|
loadChildren: () =>
|
||||||
import('./pages/features/features-page.module').then(
|
import('./pages/features/features-page.module').then(
|
||||||
(m) => m.FeaturesPageModule
|
(m) => m.FeaturesPageModule
|
||||||
)
|
)
|
||||||
})),
|
},
|
||||||
{
|
{
|
||||||
path: 'home',
|
path: 'home',
|
||||||
loadChildren: () =>
|
loadChildren: () =>
|
||||||
import('./pages/home/home-page.module').then((m) => m.HomePageModule)
|
import('./pages/home/home-page.module').then((m) => m.HomePageModule)
|
||||||
},
|
},
|
||||||
...[
|
{
|
||||||
'markets',
|
path: paths.markets,
|
||||||
/////
|
|
||||||
'maerkte',
|
|
||||||
'marches',
|
|
||||||
'markten',
|
|
||||||
'mercados',
|
|
||||||
'mercati'
|
|
||||||
].map((path) => ({
|
|
||||||
path,
|
|
||||||
loadChildren: () =>
|
loadChildren: () =>
|
||||||
import('./pages/markets/markets-page.module').then(
|
import('./pages/markets/markets-page.module').then(
|
||||||
(m) => m.MarketsPageModule
|
(m) => m.MarketsPageModule
|
||||||
)
|
)
|
||||||
})),
|
},
|
||||||
{
|
{
|
||||||
path: 'open',
|
path: 'open',
|
||||||
loadChildren: () =>
|
loadChildren: () =>
|
||||||
@ -119,53 +99,27 @@ const routes: Routes = [
|
|||||||
(m) => m.PortfolioPageModule
|
(m) => m.PortfolioPageModule
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
...[
|
{
|
||||||
'pricing',
|
path: paths.pricing,
|
||||||
/////
|
|
||||||
'precios',
|
|
||||||
'precos',
|
|
||||||
'preise',
|
|
||||||
'prezzi',
|
|
||||||
'prijzen',
|
|
||||||
'prix'
|
|
||||||
].map((path) => ({
|
|
||||||
path,
|
|
||||||
loadChildren: () =>
|
loadChildren: () =>
|
||||||
import('./pages/pricing/pricing-page.module').then(
|
import('./pages/pricing/pricing-page.module').then(
|
||||||
(m) => m.PricingPageModule
|
(m) => m.PricingPageModule
|
||||||
)
|
)
|
||||||
})),
|
},
|
||||||
...[
|
{
|
||||||
'register',
|
path: paths.register,
|
||||||
/////
|
|
||||||
'enregistrement',
|
|
||||||
'iscrizione',
|
|
||||||
'registo',
|
|
||||||
'registratie',
|
|
||||||
'registrierung',
|
|
||||||
'registro'
|
|
||||||
].map((path) => ({
|
|
||||||
path,
|
|
||||||
loadChildren: () =>
|
loadChildren: () =>
|
||||||
import('./pages/register/register-page.module').then(
|
import('./pages/register/register-page.module').then(
|
||||||
(m) => m.RegisterPageModule
|
(m) => m.RegisterPageModule
|
||||||
)
|
)
|
||||||
})),
|
},
|
||||||
...[
|
{
|
||||||
'resources',
|
path: paths.resources,
|
||||||
/////
|
|
||||||
'bronnen',
|
|
||||||
'recursos',
|
|
||||||
'ressourcen',
|
|
||||||
'ressources',
|
|
||||||
'risorse'
|
|
||||||
].map((path) => ({
|
|
||||||
path,
|
|
||||||
loadChildren: () =>
|
loadChildren: () =>
|
||||||
import('./pages/resources/resources-page.module').then(
|
import('./pages/resources/resources-page.module').then(
|
||||||
(m) => m.ResourcesPageModule
|
(m) => m.ResourcesPageModule
|
||||||
)
|
)
|
||||||
})),
|
},
|
||||||
{
|
{
|
||||||
path: 'start',
|
path: 'start',
|
||||||
loadChildren: () =>
|
loadChildren: () =>
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
<a
|
<a
|
||||||
*ngIf="canCreateAccount"
|
*ngIf="canCreateAccount"
|
||||||
class="text-center"
|
class="text-center"
|
||||||
[routerLink]="['/register']"
|
[routerLink]="routerLinkRegister"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="cursor-pointer d-inline-block info-message px-3 py-2"
|
class="cursor-pointer d-inline-block info-message px-3 py-2"
|
||||||
@ -43,22 +43,7 @@
|
|||||||
<router-outlet></router-outlet>
|
<router-outlet></router-outlet>
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<footer
|
<footer *ngIf="showFooter" class="d-flex justify-content-center py-4 w-100">
|
||||||
*ngIf="
|
|
||||||
(currentRoute === 'blog' ||
|
|
||||||
currentRoute === 'faq' ||
|
|
||||||
currentRoute === 'features' ||
|
|
||||||
currentRoute === 'markets' ||
|
|
||||||
currentRoute === 'open' ||
|
|
||||||
currentRoute === 'p' ||
|
|
||||||
currentRoute === 'pricing' ||
|
|
||||||
currentRoute === 'resources' ||
|
|
||||||
currentRoute === 'register' ||
|
|
||||||
currentRoute === 'start') &&
|
|
||||||
deviceType !== 'mobile'
|
|
||||||
"
|
|
||||||
class="d-flex justify-content-center py-4 w-100"
|
|
||||||
>
|
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="mb-3 row">
|
<div class="mb-3 row">
|
||||||
<div class="col-sm">
|
<div class="col-sm">
|
||||||
@ -68,36 +53,38 @@
|
|||||||
<div class="h6 mt-2" i18n>Personal Finance</div>
|
<div class="h6 mt-2" i18n>Personal Finance</div>
|
||||||
<ul class="list-unstyled">
|
<ul class="list-unstyled">
|
||||||
<li *ngIf="hasPermissionToAccessFearAndGreedIndex">
|
<li *ngIf="hasPermissionToAccessFearAndGreedIndex">
|
||||||
<a i18n [routerLink]="['/markets']">Markets</a>
|
<a i18n [routerLink]="routerLinkMarkets">Markets</a>
|
||||||
</li>
|
</li>
|
||||||
<li><a i18n [routerLink]="['/resources']">Resources</a></li>
|
<li><a i18n [routerLink]="routerLinkResources">Resources</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm">
|
<div class="col-sm">
|
||||||
<div class="h6 mt-2">Ghostfolio</div>
|
<div class="h6 mt-2">Ghostfolio</div>
|
||||||
<ul class="list-unstyled">
|
<ul class="list-unstyled">
|
||||||
<li><a i18n [routerLink]="['/about']">About</a></li>
|
<li><a i18n [routerLink]="routerLinkAbout">About</a></li>
|
||||||
<li *ngIf="hasPermissionForBlog">
|
<li *ngIf="hasPermissionForBlog">
|
||||||
<a i18n [routerLink]="['/blog']">Blog</a>
|
<a i18n [routerLink]="['/blog']">Blog</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a i18n [routerLink]="['/about', 'changelog']">Changelog</a>
|
<a i18n [routerLink]="routerLinkAboutChangelog">Changelog</a>
|
||||||
</li>
|
</li>
|
||||||
<li><a i18n [routerLink]="['/features']">Features</a></li>
|
<li><a i18n [routerLink]="routerLinkFeatures">Features</a></li>
|
||||||
<li *ngIf="hasPermissionForSubscription">
|
<li *ngIf="hasPermissionForSubscription">
|
||||||
<a i18n [routerLink]="['/faq']">Frequently Asked Questions (FAQ)</a>
|
<a i18n [routerLink]="routerLinkFaq"
|
||||||
|
>Frequently Asked Questions (FAQ)</a
|
||||||
|
>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a i18n [routerLink]="['/about', 'license']">License</a>
|
<a i18n [routerLink]="routerLinkAboutLicense">License</a>
|
||||||
</li>
|
</li>
|
||||||
<li *ngIf="hasPermissionForStatistics">
|
<li *ngIf="hasPermissionForStatistics">
|
||||||
<a [routerLink]="['/open']">Open Startup</a>
|
<a [routerLink]="['/open']">Open Startup</a>
|
||||||
</li>
|
</li>
|
||||||
<li *ngIf="hasPermissionForSubscription">
|
<li *ngIf="hasPermissionForSubscription">
|
||||||
<a i18n [routerLink]="['/pricing']">Pricing</a>
|
<a i18n [routerLink]="routerLinkPricing">Pricing</a>
|
||||||
</li>
|
</li>
|
||||||
<li *ngIf="hasPermissionForSubscription">
|
<li *ngIf="hasPermissionForSubscription">
|
||||||
<a i18n [routerLink]="['/about', 'privacy-policy']"
|
<a i18n [routerLink]="routerLinkAboutPrivacyPolicy"
|
||||||
>Privacy Policy</a
|
>Privacy Policy</a
|
||||||
>
|
>
|
||||||
</li>
|
</li>
|
||||||
|
@ -38,6 +38,20 @@ export class AppComponent implements OnDestroy, OnInit {
|
|||||||
public hasPermissionToAccessFearAndGreedIndex: boolean;
|
public hasPermissionToAccessFearAndGreedIndex: boolean;
|
||||||
public info: InfoItem;
|
public info: InfoItem;
|
||||||
public pageTitle: string;
|
public pageTitle: string;
|
||||||
|
public routerLinkAbout = ['/' + $localize`about`];
|
||||||
|
public routerLinkAboutChangelog = ['/' + $localize`about`, 'changelog'];
|
||||||
|
public routerLinkAboutLicense = ['/' + $localize`about`, $localize`license`];
|
||||||
|
public routerLinkAboutPrivacyPolicy = [
|
||||||
|
'/' + $localize`about`,
|
||||||
|
$localize`privacy-policy`
|
||||||
|
];
|
||||||
|
public routerLinkFaq = ['/' + $localize`faq`];
|
||||||
|
public routerLinkFeatures = ['/' + $localize`features`];
|
||||||
|
public routerLinkMarkets = ['/' + $localize`markets`];
|
||||||
|
public routerLinkPricing = ['/' + $localize`pricing`];
|
||||||
|
public routerLinkRegister = ['/' + $localize`register`];
|
||||||
|
public routerLinkResources = ['/' + $localize`resources`];
|
||||||
|
public showFooter = false;
|
||||||
public user: User;
|
public user: User;
|
||||||
public version = environment.version;
|
public version = environment.version;
|
||||||
|
|
||||||
@ -89,6 +103,19 @@ export class AppComponent implements OnDestroy, OnInit {
|
|||||||
const urlSegments = urlSegmentGroup.segments;
|
const urlSegments = urlSegmentGroup.segments;
|
||||||
this.currentRoute = urlSegments[0].path;
|
this.currentRoute = urlSegments[0].path;
|
||||||
|
|
||||||
|
this.showFooter =
|
||||||
|
(this.currentRoute === 'blog' ||
|
||||||
|
this.currentRoute === this.routerLinkFaq[0].slice(1) ||
|
||||||
|
this.currentRoute === this.routerLinkFeatures[0].slice(1) ||
|
||||||
|
this.currentRoute === this.routerLinkMarkets[0].slice(1) ||
|
||||||
|
this.currentRoute === 'open' ||
|
||||||
|
this.currentRoute === 'p' ||
|
||||||
|
this.currentRoute === this.routerLinkPricing[0].slice(1) ||
|
||||||
|
this.currentRoute === this.routerLinkRegister[0].slice(1) ||
|
||||||
|
this.currentRoute === this.routerLinkResources[0].slice(1) ||
|
||||||
|
this.currentRoute === 'start') &&
|
||||||
|
this.deviceType !== 'mobile';
|
||||||
|
|
||||||
if (this.deviceType === 'mobile') {
|
if (this.deviceType === 'mobile') {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
const index = this.title.getTitle().indexOf('–');
|
const index = this.title.getTitle().indexOf('–');
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
}"
|
}"
|
||||||
[title]="
|
[title]="
|
||||||
(itemByMonth.key + '-' + (i + 1 < 10 ? '0' + (i + 1) : i + 1)
|
(itemByMonth.key + '-' + (i + 1 < 10 ? '0' + (i + 1) : i + 1)
|
||||||
| date : defaultDateFormat) ?? ''
|
| date: defaultDateFormat) ?? ''
|
||||||
"
|
"
|
||||||
(click)="
|
(click)="
|
||||||
onOpenMarketDataDetail({
|
onOpenMarketDataDetail({
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="mb-5 row">
|
<div class="mb-5 row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<h3 class="text-center" i18n>Platforms</h3>
|
<h2 class="text-center" i18n>Platforms</h2>
|
||||||
<gf-admin-platform></gf-admin-platform>
|
<gf-admin-platform></gf-admin-platform>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!--
|
<!--
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<h3 class="text-center" i18n>Tags</h3>
|
<h2 class="text-center" i18n>Tags</h2>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
-->
|
-->
|
||||||
|
@ -69,10 +69,10 @@
|
|||||||
i18n
|
i18n
|
||||||
mat-flat-button
|
mat-flat-button
|
||||||
[ngClass]="{
|
[ngClass]="{
|
||||||
'font-weight-bold': currentRoute === 'resources',
|
'font-weight-bold': currentRoute === routeResources,
|
||||||
'text-decoration-underline': currentRoute === 'resources'
|
'text-decoration-underline': currentRoute === routeResources
|
||||||
}"
|
}"
|
||||||
[routerLink]="['/resources']"
|
[routerLink]="routerLinkResources"
|
||||||
>Resources</a
|
>Resources</a
|
||||||
>
|
>
|
||||||
</li>
|
</li>
|
||||||
@ -87,10 +87,10 @@
|
|||||||
i18n
|
i18n
|
||||||
mat-flat-button
|
mat-flat-button
|
||||||
[ngClass]="{
|
[ngClass]="{
|
||||||
'font-weight-bold': currentRoute === 'pricing',
|
'font-weight-bold': currentRoute === routePricing,
|
||||||
'text-decoration-underline': currentRoute === 'pricing'
|
'text-decoration-underline': currentRoute === routePricing
|
||||||
}"
|
}"
|
||||||
[routerLink]="['/pricing']"
|
[routerLink]="routerLinkPricing"
|
||||||
>Pricing</a
|
>Pricing</a
|
||||||
>
|
>
|
||||||
</li>
|
</li>
|
||||||
@ -100,10 +100,10 @@
|
|||||||
i18n
|
i18n
|
||||||
mat-flat-button
|
mat-flat-button
|
||||||
[ngClass]="{
|
[ngClass]="{
|
||||||
'font-weight-bold': currentRoute === 'about',
|
'font-weight-bold': currentRoute === routeAbout,
|
||||||
'text-decoration-underline': currentRoute === 'about'
|
'text-decoration-underline': currentRoute === routeAbout
|
||||||
}"
|
}"
|
||||||
[routerLink]="['/about']"
|
[routerLink]="routerLinkAbout"
|
||||||
>About</a
|
>About</a
|
||||||
>
|
>
|
||||||
</li>
|
</li>
|
||||||
@ -210,9 +210,9 @@
|
|||||||
i18n
|
i18n
|
||||||
mat-menu-item
|
mat-menu-item
|
||||||
[ngClass]="{
|
[ngClass]="{
|
||||||
'font-weight-bold': currentRoute === 'resources'
|
'font-weight-bold': currentRoute === routeResources
|
||||||
}"
|
}"
|
||||||
[routerLink]="['/resources']"
|
[routerLink]="routerLinkResources"
|
||||||
>Resources</a
|
>Resources</a
|
||||||
>
|
>
|
||||||
<a
|
<a
|
||||||
@ -223,16 +223,16 @@
|
|||||||
class="d-flex d-sm-none"
|
class="d-flex d-sm-none"
|
||||||
i18n
|
i18n
|
||||||
mat-menu-item
|
mat-menu-item
|
||||||
[ngClass]="{ 'font-weight-bold': currentRoute === 'pricing' }"
|
[ngClass]="{ 'font-weight-bold': currentRoute === routePricing }"
|
||||||
[routerLink]="['/pricing']"
|
[routerLink]="routerLinkPricing"
|
||||||
>Pricing</a
|
>Pricing</a
|
||||||
>
|
>
|
||||||
<a
|
<a
|
||||||
class="d-flex d-sm-none"
|
class="d-flex d-sm-none"
|
||||||
i18n
|
i18n
|
||||||
mat-menu-item
|
mat-menu-item
|
||||||
[ngClass]="{ 'font-weight-bold': currentRoute === 'about' }"
|
[ngClass]="{ 'font-weight-bold': currentRoute === routeAbout }"
|
||||||
[routerLink]="['/about']"
|
[routerLink]="routerLinkAbout"
|
||||||
>About Ghostfolio</a
|
>About Ghostfolio</a
|
||||||
>
|
>
|
||||||
<hr class="d-flex d-sm-none m-0" />
|
<hr class="d-flex d-sm-none m-0" />
|
||||||
@ -260,10 +260,10 @@
|
|||||||
i18n
|
i18n
|
||||||
mat-flat-button
|
mat-flat-button
|
||||||
[ngClass]="{
|
[ngClass]="{
|
||||||
'font-weight-bold': currentRoute === 'features',
|
'font-weight-bold': currentRoute === routeFeatures,
|
||||||
'text-decoration-underline': currentRoute === 'features'
|
'text-decoration-underline': currentRoute === routeFeatuers
|
||||||
}"
|
}"
|
||||||
[routerLink]="['/features']"
|
[routerLink]="routerLinkFeatures"
|
||||||
>Features</a
|
>Features</a
|
||||||
>
|
>
|
||||||
</li>
|
</li>
|
||||||
@ -273,10 +273,10 @@
|
|||||||
i18n
|
i18n
|
||||||
mat-flat-button
|
mat-flat-button
|
||||||
[ngClass]="{
|
[ngClass]="{
|
||||||
'font-weight-bold': currentRoute === 'about',
|
'font-weight-bold': currentRoute === routeAbout,
|
||||||
'text-decoration-underline': currentRoute === 'about'
|
'text-decoration-underline': currentRoute === routeAbout
|
||||||
}"
|
}"
|
||||||
[routerLink]="['/about']"
|
[routerLink]="routerLinkAbout"
|
||||||
>About</a
|
>About</a
|
||||||
>
|
>
|
||||||
</li>
|
</li>
|
||||||
@ -285,10 +285,10 @@
|
|||||||
i18n
|
i18n
|
||||||
mat-flat-button
|
mat-flat-button
|
||||||
[ngClass]="{
|
[ngClass]="{
|
||||||
'font-weight-bold': currentRoute === 'pricing',
|
'font-weight-bold': currentRoute === routePricing,
|
||||||
'text-decoration-underline': currentRoute === 'pricing'
|
'text-decoration-underline': currentRoute === routePricing
|
||||||
}"
|
}"
|
||||||
[routerLink]="['/pricing']"
|
[routerLink]="routerLinkPricing"
|
||||||
>Pricing</a
|
>Pricing</a
|
||||||
>
|
>
|
||||||
</li>
|
</li>
|
||||||
@ -301,10 +301,10 @@
|
|||||||
i18n
|
i18n
|
||||||
mat-flat-button
|
mat-flat-button
|
||||||
[ngClass]="{
|
[ngClass]="{
|
||||||
'font-weight-bold': currentRoute === 'markets',
|
'font-weight-bold': currentRoute === routeMarkets,
|
||||||
'text-decoration-underline': currentRoute === 'markets'
|
'text-decoration-underline': currentRoute === routeMarkets
|
||||||
}"
|
}"
|
||||||
[routerLink]="['/markets']"
|
[routerLink]="routerLinkMarkets"
|
||||||
>Markets</a
|
>Markets</a
|
||||||
>
|
>
|
||||||
</li>
|
</li>
|
||||||
@ -329,7 +329,7 @@
|
|||||||
class="d-none d-sm-block"
|
class="d-none d-sm-block"
|
||||||
color="primary"
|
color="primary"
|
||||||
mat-flat-button
|
mat-flat-button
|
||||||
[routerLink]="['/register']"
|
[routerLink]="routerLinkRegister"
|
||||||
><ng-container i18n>Get started</ng-container>
|
><ng-container i18n>Get started</ng-container>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
@ -42,6 +42,17 @@ export class HeaderComponent implements OnChanges {
|
|||||||
public hasPermissionToCreateUser: boolean;
|
public hasPermissionToCreateUser: boolean;
|
||||||
public impersonationId: string;
|
public impersonationId: string;
|
||||||
public isMenuOpen: boolean;
|
public isMenuOpen: boolean;
|
||||||
|
public routeAbout = $localize`about`;
|
||||||
|
public routeFeatures = $localize`features`;
|
||||||
|
public routeMarkets = $localize`markets`;
|
||||||
|
public routePricing = $localize`pricing`;
|
||||||
|
public routeResources = $localize`resources`;
|
||||||
|
public routerLinkAbout = ['/' + $localize`about`];
|
||||||
|
public routerLinkFeatures = ['/' + $localize`features`];
|
||||||
|
public routerLinkMarkets = ['/' + $localize`markets`];
|
||||||
|
public routerLinkPricing = ['/' + $localize`pricing`];
|
||||||
|
public routerLinkRegister = ['/' + $localize`register`];
|
||||||
|
public routerLinkResources = ['/' + $localize`resources`];
|
||||||
|
|
||||||
private unsubscribeSubject = new Subject<void>();
|
private unsubscribeSubject = new Subject<void>();
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<h3 class="d-none d-sm-block mb-3 text-center" i18n>Markets</h3>
|
<h1 class="d-none d-sm-block h3 mb-4 text-center" i18n>Markets</h1>
|
||||||
<div class="mb-5 row">
|
<div class="mb-5 row">
|
||||||
<div class="col-xs-12 col-md-8 offset-md-2">
|
<div class="col-xs-12 col-md-8 offset-md-2">
|
||||||
<div class="mb-2 text-center text-muted">
|
<div class="mb-2 text-center text-muted">
|
||||||
|
@ -121,7 +121,7 @@ export class HomeSummaryComponent implements OnDestroy, OnInit {
|
|||||||
});
|
});
|
||||||
|
|
||||||
this.snackBarRef.onAction().subscribe(() => {
|
this.snackBarRef.onAction().subscribe(() => {
|
||||||
this.router.navigate(['/pricing']);
|
this.router.navigate(['/' + $localize`pricing`]);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<div class="container pb-3 px-3">
|
<div class="container pb-3 px-3">
|
||||||
<h3 class="d-none d-sm-block mb-3 text-center" i18n>Summary</h3>
|
<h1 class="d-none d-sm-block h3 mb-4 text-center" i18n>Summary</h1>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-xs-12 col-md-8 offset-md-2">
|
<div class="col-xs-12 col-md-8 offset-md-2">
|
||||||
<mat-card appearance="outlined">
|
<mat-card appearance="outlined">
|
||||||
|
@ -11,6 +11,8 @@ import { SubscriptionInterstitialDialogParams } from './interfaces/interfaces';
|
|||||||
templateUrl: 'subscription-interstitial-dialog.html'
|
templateUrl: 'subscription-interstitial-dialog.html'
|
||||||
})
|
})
|
||||||
export class SubscriptionInterstitialDialog {
|
export class SubscriptionInterstitialDialog {
|
||||||
|
public routerLinkPricing = ['/' + $localize`pricing`];
|
||||||
|
|
||||||
public constructor(
|
public constructor(
|
||||||
@Inject(MAT_DIALOG_DATA) public data: SubscriptionInterstitialDialogParams,
|
@Inject(MAT_DIALOG_DATA) public data: SubscriptionInterstitialDialogParams,
|
||||||
public dialogRef: MatDialogRef<SubscriptionInterstitialDialog>
|
public dialogRef: MatDialogRef<SubscriptionInterstitialDialog>
|
||||||
|
@ -56,7 +56,7 @@
|
|||||||
<a
|
<a
|
||||||
color="primary"
|
color="primary"
|
||||||
mat-flat-button
|
mat-flat-button
|
||||||
[routerLink]="['/pricing']"
|
[routerLink]="routerLinkPricing"
|
||||||
(click)="closeDialog()"
|
(click)="closeDialog()"
|
||||||
>
|
>
|
||||||
<span i18n>Upgrade Plan</span>
|
<span i18n>Upgrade Plan</span>
|
||||||
|
@ -4,6 +4,7 @@ import {
|
|||||||
Router,
|
Router,
|
||||||
RouterStateSnapshot
|
RouterStateSnapshot
|
||||||
} from '@angular/router';
|
} from '@angular/router';
|
||||||
|
import { paths } from '@ghostfolio/client/app-routing.module';
|
||||||
import { DataService } from '@ghostfolio/client/services/data.service';
|
import { DataService } from '@ghostfolio/client/services/data.service';
|
||||||
import { SettingsStorageService } from '@ghostfolio/client/services/settings-storage.service';
|
import { SettingsStorageService } from '@ghostfolio/client/services/settings-storage.service';
|
||||||
import { UserService } from '@ghostfolio/client/services/user/user.service';
|
import { UserService } from '@ghostfolio/client/services/user/user.service';
|
||||||
@ -13,21 +14,17 @@ import { catchError } from 'rxjs/operators';
|
|||||||
@Injectable({ providedIn: 'root' })
|
@Injectable({ providedIn: 'root' })
|
||||||
export class AuthGuard {
|
export class AuthGuard {
|
||||||
private static PUBLIC_PAGE_ROUTES = [
|
private static PUBLIC_PAGE_ROUTES = [
|
||||||
'/about',
|
`/${paths.about}`,
|
||||||
'/about/changelog',
|
|
||||||
'/about/privacy-policy',
|
|
||||||
'/blog',
|
'/blog',
|
||||||
'/de/blog',
|
|
||||||
'/demo',
|
'/demo',
|
||||||
'/en/blog',
|
`/${paths.faq}`,
|
||||||
'/faq',
|
`/${paths.features}`,
|
||||||
'/features',
|
`/${paths.markets}`,
|
||||||
'/markets',
|
|
||||||
'/open',
|
'/open',
|
||||||
'/p',
|
'/p',
|
||||||
'/pricing',
|
`/${paths.pricing}`,
|
||||||
'/register',
|
`/${paths.register}`,
|
||||||
'/resources'
|
`/${paths.resources}`
|
||||||
];
|
];
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
@ -53,7 +50,7 @@ export class AuthGuard {
|
|||||||
this.router.navigate(['/demo']);
|
this.router.navigate(['/demo']);
|
||||||
resolve(false);
|
resolve(false);
|
||||||
} else if (utmSource === 'trusted-web-activity') {
|
} else if (utmSource === 'trusted-web-activity') {
|
||||||
this.router.navigate(['/register']);
|
this.router.navigate(['/' + $localize`register`]);
|
||||||
resolve(false);
|
resolve(false);
|
||||||
} else if (
|
} else if (
|
||||||
AuthGuard.PUBLIC_PAGE_ROUTES.filter((publicPageRoute) =>
|
AuthGuard.PUBLIC_PAGE_ROUTES.filter((publicPageRoute) =>
|
||||||
|
@ -77,7 +77,7 @@ export class HttpResponseInterceptor implements HttpInterceptor {
|
|||||||
});
|
});
|
||||||
|
|
||||||
this.snackBarRef.onAction().subscribe(() => {
|
this.snackBarRef.onAction().subscribe(() => {
|
||||||
this.router.navigate(['/pricing']);
|
this.router.navigate(['/' + $localize`pricing`]);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} else if (error.status === StatusCodes.INTERNAL_SERVER_ERROR) {
|
} else if (error.status === StatusCodes.INTERNAL_SERVER_ERROR) {
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
|
import * as path from 'path';
|
||||||
|
|
||||||
import { NgModule } from '@angular/core';
|
import { NgModule } from '@angular/core';
|
||||||
import { RouterModule, Routes } from '@angular/router';
|
import { RouterModule, Routes } from '@angular/router';
|
||||||
|
import { paths } from '@ghostfolio/client/app-routing.module';
|
||||||
import { AuthGuard } from '@ghostfolio/client/core/auth.guard';
|
import { AuthGuard } from '@ghostfolio/client/core/auth.guard';
|
||||||
|
|
||||||
import { AboutPageComponent } from './about-page.component';
|
import { AboutPageComponent } from './about-page.component';
|
||||||
@ -22,22 +25,13 @@ const routes: Routes = [
|
|||||||
(m) => m.ChangelogPageModule
|
(m) => m.ChangelogPageModule
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
...[
|
{
|
||||||
'license',
|
path: paths.license,
|
||||||
/////
|
|
||||||
'licenca',
|
|
||||||
'licence',
|
|
||||||
'licencia',
|
|
||||||
'licentie',
|
|
||||||
'lizenz',
|
|
||||||
'licenza'
|
|
||||||
].map((path) => ({
|
|
||||||
path,
|
|
||||||
loadChildren: () =>
|
loadChildren: () =>
|
||||||
import('./license/license-page.module').then(
|
import('./license/license-page.module').then(
|
||||||
(m) => m.LicensePageModule
|
(m) => m.LicensePageModule
|
||||||
)
|
)
|
||||||
})),
|
},
|
||||||
{
|
{
|
||||||
path: 'oss-friends',
|
path: 'oss-friends',
|
||||||
loadChildren: () =>
|
loadChildren: () =>
|
||||||
@ -45,22 +39,13 @@ const routes: Routes = [
|
|||||||
(m) => m.OpenSourceSoftwareFriendsPageModule
|
(m) => m.OpenSourceSoftwareFriendsPageModule
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
...[
|
{
|
||||||
'privacy-policy',
|
path: paths.privacyPolicy,
|
||||||
/////
|
|
||||||
'datenschutzbestimmungen',
|
|
||||||
'informativa-sulla-privacy',
|
|
||||||
'politique-de-confidentialite',
|
|
||||||
'politica-de-privacidad',
|
|
||||||
'politica-de-privacidade',
|
|
||||||
'privacybeleid'
|
|
||||||
].map((path) => ({
|
|
||||||
path,
|
|
||||||
loadChildren: () =>
|
loadChildren: () =>
|
||||||
import('./privacy-policy/privacy-policy-page.module').then(
|
import('./privacy-policy/privacy-policy-page.module').then(
|
||||||
(m) => m.PrivacyPolicyPageModule
|
(m) => m.PrivacyPolicyPageModule
|
||||||
)
|
)
|
||||||
}))
|
}
|
||||||
],
|
],
|
||||||
component: AboutPageComponent,
|
component: AboutPageComponent,
|
||||||
path: '',
|
path: '',
|
||||||
|
@ -48,17 +48,17 @@ export class AboutPageComponent implements OnDestroy, OnInit {
|
|||||||
{
|
{
|
||||||
iconName: 'reader-outline',
|
iconName: 'reader-outline',
|
||||||
label: $localize`About`,
|
label: $localize`About`,
|
||||||
path: ['/about']
|
path: ['/' + $localize`about`]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
iconName: 'sparkles-outline',
|
iconName: 'sparkles-outline',
|
||||||
label: $localize`Changelog`,
|
label: $localize`Changelog`,
|
||||||
path: ['/about', 'changelog']
|
path: ['/' + $localize`about`, 'changelog']
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
iconName: 'ribbon-outline',
|
iconName: 'ribbon-outline',
|
||||||
label: $localize`License`,
|
label: $localize`License`,
|
||||||
path: ['/about', 'license']
|
path: ['/' + $localize`about`, $localize`license`]
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
@ -66,7 +66,7 @@ export class AboutPageComponent implements OnDestroy, OnInit {
|
|||||||
this.tabs.push({
|
this.tabs.push({
|
||||||
iconName: 'shield-checkmark-outline',
|
iconName: 'shield-checkmark-outline',
|
||||||
label: $localize`Privacy Policy`,
|
label: $localize`Privacy Policy`,
|
||||||
path: ['/about', 'privacy-policy'],
|
path: ['/' + $localize`about`, $localize`privacy-policy`],
|
||||||
showCondition: this.hasPermissionForSubscription
|
showCondition: this.hasPermissionForSubscription
|
||||||
});
|
});
|
||||||
this.user = state.user;
|
this.user = state.user;
|
||||||
@ -83,7 +83,7 @@ export class AboutPageComponent implements OnDestroy, OnInit {
|
|||||||
this.tabs.push({
|
this.tabs.push({
|
||||||
iconName: 'happy-outline',
|
iconName: 'happy-outline',
|
||||||
label: 'OSS Friends',
|
label: 'OSS Friends',
|
||||||
path: ['/about', 'oss-friends']
|
path: ['/' + $localize`about`, 'oss-friends']
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="mb-5 row">
|
<div class="mb-5 row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<h1 class="d-none d-sm-block h3 mb-3 text-center" i18n>Changelog</h1>
|
<h1 class="d-none d-sm-block h3 mb-4 text-center" i18n>Changelog</h1>
|
||||||
<div class="changelog">
|
<div class="changelog">
|
||||||
<markdown [src]="'../assets/CHANGELOG.md'"></markdown>
|
<markdown [src]="'../assets/CHANGELOG.md'"></markdown>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="mb-5 row">
|
<div class="mb-5 row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<h1 class="d-none d-sm-block h3 mb-3 text-center" i18n>License</h1>
|
<h1 class="d-none d-sm-block h3 mb-4 text-center" i18n>License</h1>
|
||||||
<div>
|
<div>
|
||||||
<markdown [src]="'../assets/LICENSE'"></markdown>
|
<markdown [src]="'../assets/LICENSE'"></markdown>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
import { Component, OnDestroy } from '@angular/core';
|
import { Component, OnDestroy } from '@angular/core';
|
||||||
import { Subject } from 'rxjs';
|
import { Subject } from 'rxjs';
|
||||||
|
|
||||||
|
const ossFriends = require('../../../../assets/oss-friends.json');
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
host: { class: 'page' },
|
host: { class: 'page' },
|
||||||
selector: 'gf-oss-friends-page',
|
selector: 'gf-oss-friends-page',
|
||||||
@ -8,131 +10,7 @@ import { Subject } from 'rxjs';
|
|||||||
templateUrl: './oss-friends-page.html'
|
templateUrl: './oss-friends-page.html'
|
||||||
})
|
})
|
||||||
export class OpenSourceSoftwareFriendsPageComponent implements OnDestroy {
|
export class OpenSourceSoftwareFriendsPageComponent implements OnDestroy {
|
||||||
public ossFriends = [
|
public ossFriends = ossFriends.data;
|
||||||
{
|
|
||||||
description: 'Build build custom software on top of your data.',
|
|
||||||
name: 'Appsmith',
|
|
||||||
url: 'https://www.appsmith.com'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description:
|
|
||||||
'BoxyHQ’s suite of APIs for security and privacy helps engineering teams build and ship compliant cloud applications faster.',
|
|
||||||
name: 'BoxyHQ',
|
|
||||||
url: 'https://boxyhq.com'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description:
|
|
||||||
'Cal.com is a scheduling tool that helps you schedule meetings without the back-and-forth emails.',
|
|
||||||
name: 'Cal.com',
|
|
||||||
url: 'https://cal.com'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description:
|
|
||||||
'Centralize community, product, and customer data to understand which companies are engaging with your open source project.',
|
|
||||||
name: 'Crowd.dev',
|
|
||||||
url: 'https://www.crowd.dev'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description:
|
|
||||||
'The Open-Source DocuSign Alternative. We aim to earn your trust by enabling you to self-host the platform and examine its inner workings.',
|
|
||||||
name: 'Documenso',
|
|
||||||
url: 'https://documenso.com'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description:
|
|
||||||
'The Open-Source HubSpot Alternative. A single XOS enables to create unique and life-changing experiences that work for all types of business.',
|
|
||||||
name: 'Erxes',
|
|
||||||
url: 'https://erxes.io'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description:
|
|
||||||
'Survey granular user segments at any point in the user journey. Gather up to 6x more insights with targeted micro-surveys. All open-source.',
|
|
||||||
name: 'Formbricks',
|
|
||||||
url: 'https://formbricks.com'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description:
|
|
||||||
'GitWonk is an open-source technical documentation tool, designed and built focusing on the developer experience.',
|
|
||||||
name: 'GitWonk',
|
|
||||||
url: 'https://gitwonk.com'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description:
|
|
||||||
'Open-source authentication and user management for the passkey era. Integrated in minutes, for web and mobile apps.',
|
|
||||||
name: 'Hanko',
|
|
||||||
url: 'https://www.hanko.io'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description:
|
|
||||||
'HTMX is a dependency-free JavaScript library that allows you to access AJAX, CSS Transitions, WebSockets, and Server Sent Events directly in HTML.',
|
|
||||||
name: 'HTMX',
|
|
||||||
url: 'https://htmx.org'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description:
|
|
||||||
'Open source, end-to-end encrypted platform that lets you securely manage secrets and configs across your team, devices, and infrastructure.',
|
|
||||||
name: 'Infisical',
|
|
||||||
url: 'https://infisical.com'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description:
|
|
||||||
'Mockoon is the easiest and quickest way to design and run mock REST APIs.',
|
|
||||||
name: 'Mockoon',
|
|
||||||
url: 'https://mockoon.com'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description:
|
|
||||||
'The open-source notification infrastructure for developers. Simple components and APIs for managing all communication channels in one place.',
|
|
||||||
name: 'Novu',
|
|
||||||
url: 'https://novu.co'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description:
|
|
||||||
'Democratizing investment research through an open source financial ecosystem. The OpenBB Terminal allows everyone to perform investment research, from everywhere.',
|
|
||||||
name: 'OpenBB',
|
|
||||||
url: 'https://openbb.co'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description:
|
|
||||||
'Sniffnet is a network monitoring tool to help you easily keep track of your Internet traffic.',
|
|
||||||
name: 'Sniffnet',
|
|
||||||
url: 'https://www.sniffnet.net'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description: 'Software localization from A to Z made really easy.',
|
|
||||||
name: 'Tolgee',
|
|
||||||
url: 'https://tolgee.io'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description:
|
|
||||||
'Create long-running Jobs directly in your codebase with features like API integrations, webhooks, scheduling and delays.',
|
|
||||||
name: 'Trigger.dev',
|
|
||||||
url: 'https://trigger.dev'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description:
|
|
||||||
'Typebot gives you powerful blocks to create unique chat experiences. Embed them anywhere on your apps and start collecting results like magic.',
|
|
||||||
name: 'Typebot',
|
|
||||||
url: 'https://typebot.io'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description:
|
|
||||||
'A modern CRM offering the flexibility of open-source, advanced features and sleek design.',
|
|
||||||
name: 'Twenty',
|
|
||||||
url: 'https://twenty.com'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description:
|
|
||||||
'Open-source enterprise-grade serverless CMS. Own your data. Scale effortlessly. Customize everything.',
|
|
||||||
name: 'Webiny',
|
|
||||||
url: 'https://www.webiny.com'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description: 'Webstudio is an open source alternative to Webflow',
|
|
||||||
name: 'Webstudio',
|
|
||||||
url: 'https://webstudio.is'
|
|
||||||
}
|
|
||||||
];
|
|
||||||
|
|
||||||
private unsubscribeSubject = new Subject<void>();
|
private unsubscribeSubject = new Subject<void>();
|
||||||
|
|
||||||
|
@ -1,34 +1,40 @@
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="mb-5 row">
|
<div class="mb-5 row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<h3 class="d-none d-sm-block mb-3 text-center">
|
<h1 class="h3 mb-4 text-center">
|
||||||
<ng-container i18n>Our</ng-container> OSS Friends
|
<span class="d-none d-sm-block"
|
||||||
</h3>
|
><ng-container i18n>Our</ng-container> OSS Friends</span
|
||||||
|
>
|
||||||
|
<small class="text-muted" i18n
|
||||||
|
>Discover other exciting Open Source Software projects</small
|
||||||
|
>
|
||||||
|
</h1>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div
|
<div
|
||||||
*ngFor="let ossFriend of ossFriends"
|
*ngFor="let ossFriend of ossFriends"
|
||||||
class="col-xs-12 col-md-4 mb-3"
|
class="col-xs-12 col-md-4 mb-3"
|
||||||
>
|
>
|
||||||
<mat-card appearance="outlined" class="d-flex flex-column h-100">
|
<a target="_blank" [href]="ossFriend.href">
|
||||||
<mat-card-header>
|
<mat-card appearance="outlined" class="d-flex flex-column h-100">
|
||||||
<mat-card-title class="h4"
|
<mat-card-header>
|
||||||
><a target="_blank" [href]="ossFriend.url"
|
<mat-card-title class="h4">{{ ossFriend.name }}</mat-card-title>
|
||||||
>{{ ossFriend.name }}</a
|
</mat-card-header>
|
||||||
></mat-card-title
|
<mat-card-content class="flex-grow-1">
|
||||||
>
|
<p>{{ ossFriend.description }}</p>
|
||||||
</mat-card-header>
|
</mat-card-content>
|
||||||
<mat-card-content class="flex-grow-1">
|
<mat-card-actions class="justify-content-end">
|
||||||
<p>{{ ossFriend.description }}</p>
|
<a mat-button target="_blank" [href]="ossFriend.href">
|
||||||
</mat-card-content>
|
<span
|
||||||
<mat-card-actions class="justify-content-end">
|
><ng-container i18n>Visit</ng-container> {{ ossFriend.name
|
||||||
<a mat-button target="_blank" [href]="ossFriend.url">
|
}}</span
|
||||||
<span
|
><ion-icon
|
||||||
><ng-container i18n>Visit</ng-container> {{ ossFriend.name
|
class="ml-1"
|
||||||
}}</span
|
name="arrow-forward-outline"
|
||||||
><ion-icon class="ml-1" name="arrow-forward-outline"></ion-icon>
|
></ion-icon>
|
||||||
</a>
|
</a>
|
||||||
</mat-card-actions>
|
</mat-card-actions>
|
||||||
</mat-card>
|
</mat-card>
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
import { CommonModule } from '@angular/common';
|
import { CommonModule } from '@angular/common';
|
||||||
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
|
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
|
||||||
|
import { MatButtonModule } from '@angular/material/button';
|
||||||
|
import { MatCardModule } from '@angular/material/card';
|
||||||
|
|
||||||
import { OpenSourceSoftwareFriendsPageRoutingModule } from './oss-friends-page-routing.module';
|
import { OpenSourceSoftwareFriendsPageRoutingModule } from './oss-friends-page-routing.module';
|
||||||
import { OpenSourceSoftwareFriendsPageComponent } from './oss-friends-page.component';
|
import { OpenSourceSoftwareFriendsPageComponent } from './oss-friends-page.component';
|
||||||
import { MatCardModule } from '@angular/material/card';
|
|
||||||
import { MatButtonModule } from '@angular/material/button';
|
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
declarations: [OpenSourceSoftwareFriendsPageComponent],
|
declarations: [OpenSourceSoftwareFriendsPageComponent],
|
||||||
|
@ -1,3 +1,9 @@
|
|||||||
:host {
|
:host {
|
||||||
display: block;
|
display: block;
|
||||||
|
|
||||||
|
.mat-mdc-card {
|
||||||
|
&:hover {
|
||||||
|
border-color: var(--gf-theme-primary-500);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,8 @@ export class AboutOverviewPageComponent implements OnDestroy, OnInit {
|
|||||||
public hasPermissionForStatistics: boolean;
|
public hasPermissionForStatistics: boolean;
|
||||||
public hasPermissionForSubscription: boolean;
|
public hasPermissionForSubscription: boolean;
|
||||||
public isLoggedIn: boolean;
|
public isLoggedIn: boolean;
|
||||||
|
public routerLinkFaq = ['/' + $localize`faq`];
|
||||||
|
public routerLinkFeatures = ['/' + $localize`features`];
|
||||||
public user: User;
|
public user: User;
|
||||||
public version = environment.version;
|
public version = environment.version;
|
||||||
|
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="mb-5 row">
|
<div class="mb-5 row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<h3 class="d-none d-sm-block mb-3 text-center">About Ghostfolio</h3>
|
<h1 class="d-none d-sm-block h3 mb-4 text-center">
|
||||||
|
<ng-container i18n>About Ghostfolio</ng-container>
|
||||||
|
</h1>
|
||||||
<div class="about-container">
|
<div class="about-container">
|
||||||
<p>
|
<p>
|
||||||
Ghostfolio is a lightweight wealth management application for
|
Ghostfolio is a lightweight wealth management application for
|
||||||
@ -46,7 +48,7 @@
|
|||||||
<p>
|
<p>
|
||||||
If you encounter a bug or would like to suggest an improvement or a
|
If you encounter a bug or would like to suggest an improvement or a
|
||||||
new
|
new
|
||||||
<a [routerLink]="['/features']">feature</a>, please join the
|
<a [routerLink]="routerLinkFeatures">feature</a>, please join the
|
||||||
Ghostfolio
|
Ghostfolio
|
||||||
<a
|
<a
|
||||||
href="https://join.slack.com/t/ghostfolio/shared_invite/zt-vsaan64h-F_I0fEo5M0P88lP9ibCxFg"
|
href="https://join.slack.com/t/ghostfolio/shared_invite/zt-vsaan64h-F_I0fEo5M0P88lP9ibCxFg"
|
||||||
@ -139,7 +141,7 @@
|
|||||||
class="py-4 w-100"
|
class="py-4 w-100"
|
||||||
color="primary"
|
color="primary"
|
||||||
mat-flat-button
|
mat-flat-button
|
||||||
[routerLink]="['/faq']"
|
[routerLink]="routerLinkFaq"
|
||||||
>Frequently Asked Questions (FAQ)</a
|
>Frequently Asked Questions (FAQ)</a
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="mb-5 row">
|
<div class="mb-5 row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<h3 class="d-none d-sm-block mb-3 text-center" i18n>Privacy Policy</h3>
|
<h1 class="d-none d-sm-block h3 mb-4 text-center" i18n>Privacy Policy</h1>
|
||||||
<markdown [src]="'../assets/privacy-policy.md'"></markdown>
|
<markdown [src]="'../assets/privacy-policy.md'"></markdown>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<h3 class="d-none d-sm-block mb-3 text-center" i18n>Accounts</h3>
|
<h1 class="d-none d-sm-block h3 mb-4 text-center" i18n>Accounts</h1>
|
||||||
<div class="accounts">
|
<div class="accounts">
|
||||||
<gf-accounts-table
|
<gf-accounts-table
|
||||||
[accounts]="accounts"
|
[accounts]="accounts"
|
||||||
|
@ -9,4 +9,7 @@ import { RouterModule } from '@angular/router';
|
|||||||
standalone: true,
|
standalone: true,
|
||||||
templateUrl: './hallo-ghostfolio-page.html'
|
templateUrl: './hallo-ghostfolio-page.html'
|
||||||
})
|
})
|
||||||
export class HalloGhostfolioPageComponent {}
|
export class HalloGhostfolioPageComponent {
|
||||||
|
public routerLinkPricing = ['/' + $localize`pricing`];
|
||||||
|
public routerLinkResources = ['/' + $localize`resources`];
|
||||||
|
}
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
Aufgrund der steigenden Inflation und den Negativzinsen befasse ich
|
Aufgrund der steigenden Inflation und den Negativzinsen befasse ich
|
||||||
mich seit einiger Zeit, wie ich mein Vermögen möglichst
|
mich seit einiger Zeit, wie ich mein Vermögen möglichst
|
||||||
diversifiziert anlegen kann. Konkret verfolge ich eine
|
diversifiziert anlegen kann. Konkret verfolge ich eine
|
||||||
<a [routerLink]="['/resources']">Buy and Hold Strategie</a> mit
|
<a [routerLink]="routerLinkResources">Buy and Hold Strategie</a> mit
|
||||||
Investitionen in verschiedene Anlageklassen verteilt auf
|
Investitionen in verschiedene Anlageklassen verteilt auf
|
||||||
unterschiedliche Plattformen. Deshalb suchte ich nach einer App, die
|
unterschiedliche Plattformen. Deshalb suchte ich nach einer App, die
|
||||||
mein Portfolio ganzheitlich zusammenfasst. Bei meiner
|
mein Portfolio ganzheitlich zusammenfasst. Bei meiner
|
||||||
@ -119,7 +119,7 @@
|
|||||||
Anlagestrategie? Ich freue mich über alle, die Ghostfolio
|
Anlagestrategie? Ich freue mich über alle, die Ghostfolio
|
||||||
ausprobieren. Bist du überzeugt vom Potential der Software? Jede
|
ausprobieren. Bist du überzeugt vom Potential der Software? Jede
|
||||||
Unterstützung für Ghostfolio ist willkommen. Sei es mit einer
|
Unterstützung für Ghostfolio ist willkommen. Sei es mit einer
|
||||||
<a [routerLink]="['/pricing']">Ghostfolio Premium</a>
|
<a [routerLink]="routerLinkPricing">Ghostfolio Premium</a>
|
||||||
Subscription zur Finanzierung des Hostings, einem positiven Rating
|
Subscription zur Finanzierung des Hostings, einem positiven Rating
|
||||||
im
|
im
|
||||||
<a
|
<a
|
||||||
|
@ -9,4 +9,7 @@ import { RouterModule } from '@angular/router';
|
|||||||
standalone: true,
|
standalone: true,
|
||||||
templateUrl: './hello-ghostfolio-page.html'
|
templateUrl: './hello-ghostfolio-page.html'
|
||||||
})
|
})
|
||||||
export class HelloGhostfolioPageComponent {}
|
export class HelloGhostfolioPageComponent {
|
||||||
|
public routerLinkPricing = ['/' + $localize`pricing`];
|
||||||
|
public routerLinkResources = ['/' + $localize`resources`];
|
||||||
|
}
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
Due to rising inflation and negative interest rates, I have been
|
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
|
looking for some time at how I can invest my assets in the most
|
||||||
diversified way possible. Specifically, I follow a
|
diversified way possible. Specifically, I follow a
|
||||||
<a [routerLink]="['/resources']">buy and hold strategy</a> with
|
<a [routerLink]="routerLinkResources">buy and hold strategy</a> with
|
||||||
investments in different asset classes spread across different
|
investments in different asset classes spread across different
|
||||||
platforms. Therefore, I was looking for an app that would
|
platforms. Therefore, I was looking for an app that would
|
||||||
holistically aggregate my portfolio. During my research on the
|
holistically aggregate my portfolio. During my research on the
|
||||||
@ -115,7 +115,7 @@
|
|||||||
strategy? I'm happy for everyone who tries Ghostfolio. Are you
|
strategy? I'm happy for everyone who tries Ghostfolio. Are you
|
||||||
convinced of its potential? Any support for Ghostfolio is welcome.
|
convinced of its potential? Any support for Ghostfolio is welcome.
|
||||||
Be it with a
|
Be it with a
|
||||||
<a [routerLink]="['/pricing']">Ghostfolio Premium</a>
|
<a [routerLink]="routerLinkPricing">Ghostfolio Premium</a>
|
||||||
Subscription to finance the hosting, a positive rating in the
|
Subscription to finance the hosting, a positive rating in the
|
||||||
<a
|
<a
|
||||||
href="https://play.google.com/store/apps/details?id=ch.dotsilver.ghostfolio.twa"
|
href="https://play.google.com/store/apps/details?id=ch.dotsilver.ghostfolio.twa"
|
||||||
|
@ -9,4 +9,6 @@ import { RouterModule } from '@angular/router';
|
|||||||
standalone: true,
|
standalone: true,
|
||||||
templateUrl: './first-months-in-open-source-page.html'
|
templateUrl: './first-months-in-open-source-page.html'
|
||||||
})
|
})
|
||||||
export class FirstMonthsInOpenSourcePageComponent {}
|
export class FirstMonthsInOpenSourcePageComponent {
|
||||||
|
public routerLinkPricing = ['/' + $localize`pricing`];
|
||||||
|
}
|
||||||
|
@ -86,7 +86,7 @@
|
|||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
My personal goal is to reach break-even with the Saas offering (<a
|
My personal goal is to reach break-even with the Saas offering (<a
|
||||||
[routerLink]="['/pricing']"
|
[routerLink]="routerLinkPricing"
|
||||||
>Ghostfolio Premium</a
|
>Ghostfolio Premium</a
|
||||||
>) and regularly report about the progress and my learnings on this
|
>) and regularly report about the progress and my learnings on this
|
||||||
exciting journey.
|
exciting journey.
|
||||||
|
@ -9,4 +9,6 @@ import { RouterModule } from '@angular/router';
|
|||||||
standalone: true,
|
standalone: true,
|
||||||
templateUrl: './how-do-i-get-my-finances-in-order-page.html'
|
templateUrl: './how-do-i-get-my-finances-in-order-page.html'
|
||||||
})
|
})
|
||||||
export class HowDoIGetMyFinancesInOrderPageComponent {}
|
export class HowDoIGetMyFinancesInOrderPageComponent {
|
||||||
|
public routerLinkResources = ['/' + $localize`resources`];
|
||||||
|
}
|
||||||
|
@ -9,9 +9,9 @@
|
|||||||
<section class="mb-4">
|
<section class="mb-4">
|
||||||
<p>
|
<p>
|
||||||
Before you can think of
|
Before you can think of
|
||||||
<a [routerLink]="['/resources']">long-term investing</a>, you have
|
<a [routerLink]="routerLinkResources">long-term investing</a>, you
|
||||||
to get your finances in order. Take a look at Peter's journey to see
|
have to get your finances in order. Take a look at Peter's journey
|
||||||
how you can achieve it, too.
|
to see how you can achieve it, too.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Peter enjoys life, but sometimes he overspends a bit. He realizes it
|
Peter enjoys life, but sometimes he overspends a bit. He realizes it
|
||||||
|
@ -9,4 +9,7 @@ import { RouterModule } from '@angular/router';
|
|||||||
standalone: true,
|
standalone: true,
|
||||||
templateUrl: './500-stars-on-github-page.html'
|
templateUrl: './500-stars-on-github-page.html'
|
||||||
})
|
})
|
||||||
export class FiveHundredStarsOnGitHubPageComponent {}
|
export class FiveHundredStarsOnGitHubPageComponent {
|
||||||
|
public routerLinkMarkets = ['/' + $localize`markets`];
|
||||||
|
public routerLinkPricing = ['/' + $localize`pricing`];
|
||||||
|
}
|
||||||
|
@ -71,10 +71,10 @@
|
|||||||
<h2 class="h4">Break-even Point</h2>
|
<h2 class="h4">Break-even Point</h2>
|
||||||
<p>
|
<p>
|
||||||
Despite the complicated
|
Despite the complicated
|
||||||
<a [routerLink]="['/markets']">economic situation</a> at this time,
|
<a [routerLink]="routerLinkMarkets">economic situation</a> at this
|
||||||
the goal set at the beginning of the year to build a sustainable
|
time, the goal set at the beginning of the year to build a
|
||||||
business and reach break-even with the SaaS offering (<a
|
sustainable business and reach break-even with the SaaS offering (<a
|
||||||
[routerLink]="['/pricing']"
|
[routerLink]="routerLinkPricing"
|
||||||
>Ghostfolio Premium</a
|
>Ghostfolio Premium</a
|
||||||
>) has been achieved. We will continue to leverage the revenue to
|
>) has been achieved. We will continue to leverage the revenue to
|
||||||
further improve the fully managed cloud offering for our paying
|
further improve the fully managed cloud offering for our paying
|
||||||
|
@ -11,5 +11,6 @@ import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator';
|
|||||||
templateUrl: './black-friday-2022-page.html'
|
templateUrl: './black-friday-2022-page.html'
|
||||||
})
|
})
|
||||||
export class BlackFriday2022PageComponent {
|
export class BlackFriday2022PageComponent {
|
||||||
public constructor() {}
|
public routerLinkFeatures = ['/' + $localize`features`];
|
||||||
|
public routerLinkPricing = ['/' + $localize`pricing`];
|
||||||
}
|
}
|
||||||
|
@ -35,17 +35,18 @@
|
|||||||
software presents the current assets (stocks, ETFs,
|
software presents the current assets (stocks, ETFs,
|
||||||
cryptocurrencies, commodities etc.) in real time to make solid,
|
cryptocurrencies, commodities etc.) in real time to make solid,
|
||||||
data-driven investment decisions. Check out the numerous
|
data-driven investment decisions. Check out the numerous
|
||||||
<a [routerLink]="['/features']">features</a> to manage your wealth.
|
<a [routerLink]="routerLinkFeatures">features</a> to manage your
|
||||||
|
wealth.
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
<section class="mb-4">
|
<section class="mb-4">
|
||||||
<p>
|
<p>
|
||||||
Snap the limited Black Friday 2022 deal before it’s gone. For
|
Snap the limited Black Friday 2022 deal before it’s gone. For
|
||||||
detailed information on plans and pricing, please visit our
|
detailed information on plans and pricing, please visit our
|
||||||
<a [routerLink]="['/pricing']">pricing page</a>.
|
<a [routerLink]="routerLinkPricing">pricing page</a>.
|
||||||
</p>
|
</p>
|
||||||
<p class="text-center">
|
<p class="text-center">
|
||||||
<a color="primary" mat-flat-button [routerLink]="['/pricing']"
|
<a color="primary" mat-flat-button [routerLink]="routerLinkPricing"
|
||||||
>Get the Deal</a
|
>Get the Deal</a
|
||||||
>
|
>
|
||||||
</p>
|
</p>
|
||||||
|
@ -9,4 +9,7 @@ import { RouterModule } from '@angular/router';
|
|||||||
standalone: true,
|
standalone: true,
|
||||||
templateUrl: './1000-stars-on-github-page.html'
|
templateUrl: './1000-stars-on-github-page.html'
|
||||||
})
|
})
|
||||||
export class ThousandStarsOnGitHubPageComponent {}
|
export class ThousandStarsOnGitHubPageComponent {
|
||||||
|
public routerLinkFeatures = ['/' + $localize`features`];
|
||||||
|
public routerLinkPricing = ['/' + $localize`pricing`];
|
||||||
|
}
|
||||||
|
@ -92,7 +92,7 @@
|
|||||||
<p>
|
<p>
|
||||||
These self-hosting platforms allow users to run applications on
|
These self-hosting platforms allow users to run applications on
|
||||||
their own hardware rather than rely on a
|
their own hardware rather than rely on a
|
||||||
<a [routerLink]="['/pricing']">SaaS offering</a>. As a result,
|
<a [routerLink]="routerLinkPricing">SaaS offering</a>. As a result,
|
||||||
Ghostfolio has become accessible to an even wider range of users who
|
Ghostfolio has become accessible to an even wider range of users who
|
||||||
would like to take control of their wealth management.
|
would like to take control of their wealth management.
|
||||||
</p>
|
</p>
|
||||||
@ -108,9 +108,9 @@
|
|||||||
As the project continues to evolve, we can expect to see even more
|
As the project continues to evolve, we can expect to see even more
|
||||||
exciting developments and innovations around Ghostfolio which guides
|
exciting developments and innovations around Ghostfolio which guides
|
||||||
users through the process of
|
users through the process of
|
||||||
<a [routerLink]="['/features']">tracking their assets</a>, such as
|
<a [routerLink]="routerLinkFeatures">tracking their assets</a>, such
|
||||||
stocks, ETFs, or cryptocurrencies. Especially in the areas of data
|
as stocks, ETFs, or cryptocurrencies. Especially in the areas of
|
||||||
import and portfolio analysis.
|
data import and portfolio analysis.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
We are honored to be a part of this vibrant and growing community,
|
We are honored to be a part of this vibrant and growing community,
|
||||||
|
@ -9,4 +9,7 @@ import { RouterModule } from '@angular/router';
|
|||||||
standalone: true,
|
standalone: true,
|
||||||
templateUrl: './unlock-your-financial-potential-with-ghostfolio-page.html'
|
templateUrl: './unlock-your-financial-potential-with-ghostfolio-page.html'
|
||||||
})
|
})
|
||||||
export class UnlockYourFinancialPotentialWithGhostfolioPageComponent {}
|
export class UnlockYourFinancialPotentialWithGhostfolioPageComponent {
|
||||||
|
public routerLinkFeatures = ['/' + $localize`features`];
|
||||||
|
public routerLinkResources = ['/' + $localize`resources`];
|
||||||
|
}
|
||||||
|
@ -44,13 +44,13 @@
|
|||||||
<h2 class="h4">Empowering Buy & Hold Strategies</h2>
|
<h2 class="h4">Empowering Buy & Hold Strategies</h2>
|
||||||
<p>
|
<p>
|
||||||
For those committed to a
|
For those committed to a
|
||||||
<a [routerLink]="['/resources']">buy & hold strategy</a>, Ghostfolio
|
<a [routerLink]="routerLinkResources">buy & hold strategy</a>,
|
||||||
provides an intuitive interface to monitor long-term investments.
|
Ghostfolio provides an intuitive interface to monitor long-term
|
||||||
Users can track performance over time, gaining insights into
|
investments. Users can track performance over time, gaining insights
|
||||||
portfolio growth and stability. With strong visualizations and
|
into portfolio growth and stability. With strong visualizations and
|
||||||
reporting <a [routerLink]="['/features']">features</a>, Ghostfolio
|
reporting <a [routerLink]="routerLinkFeatures">features</a>,
|
||||||
equips users to make well-informed decisions aligned with their
|
Ghostfolio equips users to make well-informed decisions aligned with
|
||||||
long-term investment goals.
|
their long-term investment goals.
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
<section class="mb-4">
|
<section class="mb-4">
|
||||||
@ -91,7 +91,7 @@
|
|||||||
<h2 class="h4">Driving Financial Independence (FIRE)</h2>
|
<h2 class="h4">Driving Financial Independence (FIRE)</h2>
|
||||||
<p>
|
<p>
|
||||||
Achieving
|
Achieving
|
||||||
<a [routerLink]="['/resources']">financial independence</a>
|
<a [routerLink]="routerLinkResources">financial independence</a>
|
||||||
including early retirement (<a
|
including early retirement (<a
|
||||||
href="../en/blog/2023/07/exploring-the-path-to-fire"
|
href="../en/blog/2023/07/exploring-the-path-to-fire"
|
||||||
>FIRE</a
|
>FIRE</a
|
||||||
|
@ -9,4 +9,6 @@ import { RouterModule } from '@angular/router';
|
|||||||
standalone: true,
|
standalone: true,
|
||||||
templateUrl: './exploring-the-path-to-fire-page.html'
|
templateUrl: './exploring-the-path-to-fire-page.html'
|
||||||
})
|
})
|
||||||
export class ExploringThePathToFirePageComponent {}
|
export class ExploringThePathToFirePageComponent {
|
||||||
|
public routerLinkFeatures = ['/' + $localize`features`];
|
||||||
|
}
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
<div class="mb-3 text-muted"><small>2023-07-01</small></div>
|
<div class="mb-3 text-muted"><small>2023-07-01</small></div>
|
||||||
<img
|
<img
|
||||||
alt="Exploring the Path to Financial Independence and Retiring Early (FIRE) Teaser"
|
alt="Exploring the Path to Financial Independence and Retiring Early (FIRE) Teaser"
|
||||||
class="border rounded w-100"
|
class="rounded w-100"
|
||||||
src="../assets/images/blog/20230701.jpg"
|
src="../assets/images/blog/20230701.jpg"
|
||||||
title="Exploring the Path to Financial Independence and Retiring Early (FIRE)"
|
title="Exploring the Path to Financial Independence and Retiring Early (FIRE)"
|
||||||
/>
|
/>
|
||||||
@ -135,10 +135,10 @@
|
|||||||
track your investments, and make informed decisions to accelerate
|
track your investments, and make informed decisions to accelerate
|
||||||
your progress towards financial independence. Ghostfolio also
|
your progress towards financial independence. Ghostfolio also
|
||||||
provides a dedicated
|
provides a dedicated
|
||||||
<a [routerLink]="['/features']">FIRE calculator</a>, allowing you to
|
<a [routerLink]="routerLinkFeatures">FIRE calculator</a>, allowing
|
||||||
simulate your customized plan to achieve FIRE. You get the tools to
|
you to simulate your customized plan to achieve FIRE. You get the
|
||||||
optimize your financial journey and confidently strive for a future
|
tools to optimize your financial journey and confidently strive for
|
||||||
that is both personally fulfilling and financially secure.
|
a future that is both personally fulfilling and financially secure.
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
<section class="mb-4 py-3">
|
<section class="mb-4 py-3">
|
||||||
|
@ -0,0 +1,14 @@
|
|||||||
|
import { Component } from '@angular/core';
|
||||||
|
import { MatButtonModule } from '@angular/material/button';
|
||||||
|
import { RouterModule } from '@angular/router';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
host: { class: 'page' },
|
||||||
|
imports: [MatButtonModule, RouterModule],
|
||||||
|
selector: 'gf-ghostfolio-joins-oss-friends-page',
|
||||||
|
standalone: true,
|
||||||
|
templateUrl: './ghostfolio-joins-oss-friends-page.html'
|
||||||
|
})
|
||||||
|
export class GhostfolioJoinsOssFriendsPageComponent {
|
||||||
|
public routerLinkAboutOssFriends = ['/' + $localize`about`, 'oss-friends'];
|
||||||
|
}
|
@ -0,0 +1,167 @@
|
|||||||
|
<div class="blog container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-8 offset-md-2">
|
||||||
|
<article>
|
||||||
|
<div class="mb-4 text-center">
|
||||||
|
<h1 class="mb-1">Ghostfolio joins OSS Friends</h1>
|
||||||
|
<div class="mb-3 text-muted"><small>2023-08-23</small></div>
|
||||||
|
<img
|
||||||
|
alt="Ghostfolio joins OSS Friends Teaser"
|
||||||
|
class="rounded w-100"
|
||||||
|
src="../assets/images/blog/ghostfolio-joins-oss-friends.png"
|
||||||
|
title="Ghostfolio joins OSS Friends"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<section class="mb-4">
|
||||||
|
<p>
|
||||||
|
We are excited to announce that Ghostfolio is now part of the
|
||||||
|
<a [routerLink]="routerLinkAboutOssFriends">OSS Friends</a>. This
|
||||||
|
new initiative is all about helping open source projects grow and
|
||||||
|
become more popular.
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
<section class="mb-4">
|
||||||
|
<h2 class="h4">The Story of OSS Friends</h2>
|
||||||
|
<p>
|
||||||
|
OSS Friends started as a simple
|
||||||
|
<a
|
||||||
|
href="https://twitter.com/formbricks/status/1660735970281508878"
|
||||||
|
target="_blank"
|
||||||
|
>post</a
|
||||||
|
>
|
||||||
|
on X (formerly known as <i>Twitter</i>). The idea came from
|
||||||
|
<a href="https://formbricks.com" target="_blank">Formbricks</a>, an
|
||||||
|
open source experience management platform to create surveys in
|
||||||
|
minutes, and is all about giving open source projects a boost.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
If you are excited about the OSS Friends movement and want to bring
|
||||||
|
your own open source project along, just take a moment to fill out
|
||||||
|
<a
|
||||||
|
href="https://app.formbricks.com/s/clhys1p9r001cpr0hu65rwh17"
|
||||||
|
target="_blank"
|
||||||
|
>this form</a
|
||||||
|
>. Let’s work and learn together – all the open source way.
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
<section class="mb-4">
|
||||||
|
<h2 class="h4">
|
||||||
|
Ghostfolio – Next Generation Software for your Personal Finances
|
||||||
|
</h2>
|
||||||
|
<p>
|
||||||
|
Money management can be tricky, especially when you have various
|
||||||
|
investments like cryptocurrencies, ETFs and stocks in your
|
||||||
|
portfolio. But guess what? There are cooler ways than staring at
|
||||||
|
boring spreadsheets. Say hello to Ghostfolio, a privacy-first, open
|
||||||
|
source dashboard for your personal finances.
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
<section class="mb-4 py-3">
|
||||||
|
<h2 class="h4 mb-0 text-center">
|
||||||
|
Would you like to simplify asset tracking?
|
||||||
|
</h2>
|
||||||
|
<p class="lead mb-2 text-center">
|
||||||
|
Ghostfolio empowers you to make informed investment decisions.
|
||||||
|
</p>
|
||||||
|
<div class="text-center">
|
||||||
|
<a color="primary" href="https://ghostfol.io" mat-flat-button>
|
||||||
|
Get Started
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section class="mb-4">
|
||||||
|
<ul class="list-inline">
|
||||||
|
<li class="list-inline-item">
|
||||||
|
<span class="badge badge-light">Asset</span>
|
||||||
|
</li>
|
||||||
|
<li class="list-inline-item">
|
||||||
|
<span class="badge badge-light">Collaboration</span>
|
||||||
|
</li>
|
||||||
|
<li class="list-inline-item">
|
||||||
|
<span class="badge badge-light">Cryptocurrency</span>
|
||||||
|
</li>
|
||||||
|
<li class="list-inline-item">
|
||||||
|
<span class="badge badge-light">Community</span>
|
||||||
|
</li>
|
||||||
|
<li class="list-inline-item">
|
||||||
|
<span class="badge badge-light">Dashboard</span>
|
||||||
|
</li>
|
||||||
|
<li class="list-inline-item">
|
||||||
|
<span class="badge badge-light">ETF</span>
|
||||||
|
</li>
|
||||||
|
<li class="list-inline-item">
|
||||||
|
<span class="badge badge-light">Finance</span>
|
||||||
|
</li>
|
||||||
|
<li class="list-inline-item">
|
||||||
|
<span class="badge badge-light">Fintech</span>
|
||||||
|
</li>
|
||||||
|
<li class="list-inline-item">
|
||||||
|
<span class="badge badge-light">Ghostfolio</span>
|
||||||
|
</li>
|
||||||
|
<li class="list-inline-item">
|
||||||
|
<span class="badge badge-light">Initiative</span>
|
||||||
|
</li>
|
||||||
|
<li class="list-inline-item">
|
||||||
|
<span class="badge badge-light">Innovation</span>
|
||||||
|
</li>
|
||||||
|
<li class="list-inline-item">
|
||||||
|
<span class="badge badge-light">Investment</span>
|
||||||
|
</li>
|
||||||
|
<li class="list-inline-item">
|
||||||
|
<span class="badge badge-light">Open Source</span>
|
||||||
|
</li>
|
||||||
|
<li class="list-inline-item">
|
||||||
|
<span class="badge badge-light">OSS</span>
|
||||||
|
</li>
|
||||||
|
<li class="list-inline-item">
|
||||||
|
<span class="badge badge-light">OSS Friends</span>
|
||||||
|
</li>
|
||||||
|
<li class="list-inline-item">
|
||||||
|
<span class="badge badge-light">Personal Finance</span>
|
||||||
|
</li>
|
||||||
|
<li class="list-inline-item">
|
||||||
|
<span class="badge badge-light">Platform</span>
|
||||||
|
</li>
|
||||||
|
<li class="list-inline-item">
|
||||||
|
<span class="badge badge-light">Portfolio</span>
|
||||||
|
</li>
|
||||||
|
<li class="list-inline-item">
|
||||||
|
<span class="badge badge-light">Privacy</span>
|
||||||
|
</li>
|
||||||
|
<li class="list-inline-item">
|
||||||
|
<span class="badge badge-light">Software</span>
|
||||||
|
</li>
|
||||||
|
<li class="list-inline-item">
|
||||||
|
<span class="badge badge-light">Stock</span>
|
||||||
|
</li>
|
||||||
|
<li class="list-inline-item">
|
||||||
|
<span class="badge badge-light">Technology</span>
|
||||||
|
</li>
|
||||||
|
<li class="list-inline-item">
|
||||||
|
<span class="badge badge-light">Tracking</span>
|
||||||
|
</li>
|
||||||
|
<li class="list-inline-item">
|
||||||
|
<span class="badge badge-light">Wealth Management</span>
|
||||||
|
</li>
|
||||||
|
<li class="list-inline-item">
|
||||||
|
<span class="badge badge-light">Web3</span>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
<nav aria-label="breadcrumb">
|
||||||
|
<ol class="breadcrumb">
|
||||||
|
<li class="breadcrumb-item">
|
||||||
|
<a i18n [routerLink]="['/blog']">Blog</a>
|
||||||
|
</li>
|
||||||
|
<li
|
||||||
|
aria-current="page"
|
||||||
|
class="active breadcrumb-item text-truncate"
|
||||||
|
>
|
||||||
|
Ghostfolio joins OSS Friends
|
||||||
|
</li>
|
||||||
|
</ol>
|
||||||
|
</nav>
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
@ -136,6 +136,15 @@ const routes: Routes = [
|
|||||||
'./2023/07/exploring-the-path-to-fire/exploring-the-path-to-fire-page.component'
|
'./2023/07/exploring-the-path-to-fire/exploring-the-path-to-fire-page.component'
|
||||||
).then((c) => c.ExploringThePathToFirePageComponent),
|
).then((c) => c.ExploringThePathToFirePageComponent),
|
||||||
title: 'Exploring the Path to FIRE'
|
title: 'Exploring the Path to FIRE'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
canActivate: [AuthGuard],
|
||||||
|
path: '2023/08/ghostfolio-joins-oss-friends',
|
||||||
|
loadComponent: () =>
|
||||||
|
import(
|
||||||
|
'./2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.component'
|
||||||
|
).then((c) => c.GhostfolioJoinsOssFriendsPageComponent),
|
||||||
|
title: 'Ghostfolio joins OSS Friends'
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@ -1,7 +1,39 @@
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="mb-5 row">
|
<div class="mb-5 row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<h3 class="d-none d-sm-block mb-3 text-center" i18n>Blog</h3>
|
<h1 class="h3 mb-4 text-center">
|
||||||
|
<span class="d-none d-sm-block" i18n>Blog</span>
|
||||||
|
<small class="text-muted" i18n
|
||||||
|
>Discover the latest Ghostfolio updates and insights on personal
|
||||||
|
finance</small
|
||||||
|
>
|
||||||
|
</h1>
|
||||||
|
<mat-card appearance="outlined" class="mb-3">
|
||||||
|
<mat-card-content>
|
||||||
|
<div class="container p-0">
|
||||||
|
<div class="flex-nowrap no-gutters row">
|
||||||
|
<a
|
||||||
|
class="d-flex overflow-hidden w-100"
|
||||||
|
href="../en/blog/2023/08/ghostfolio-joins-oss-friends"
|
||||||
|
>
|
||||||
|
<div class="flex-grow-1 overflow-hidden">
|
||||||
|
<div class="h6 m-0 text-truncate">
|
||||||
|
Ghostfolio joins OSS Friends
|
||||||
|
</div>
|
||||||
|
<div class="d-flex text-muted">2023-08-23</div>
|
||||||
|
</div>
|
||||||
|
<div class="align-items-center d-flex">
|
||||||
|
<ion-icon
|
||||||
|
class="chevron text-muted"
|
||||||
|
name="chevron-forward-outline"
|
||||||
|
size="small"
|
||||||
|
></ion-icon>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</mat-card-content>
|
||||||
|
</mat-card>
|
||||||
<mat-card appearance="outlined" class="mb-3">
|
<mat-card appearance="outlined" class="mb-3">
|
||||||
<mat-card-content>
|
<mat-card-content>
|
||||||
<div class="container p-0">
|
<div class="container p-0">
|
||||||
|
@ -10,6 +10,10 @@ import { Subject, takeUntil } from 'rxjs';
|
|||||||
templateUrl: './faq-page.html'
|
templateUrl: './faq-page.html'
|
||||||
})
|
})
|
||||||
export class FaqPageComponent implements OnDestroy {
|
export class FaqPageComponent implements OnDestroy {
|
||||||
|
public routerLinkFeatures = ['/' + $localize`features`];
|
||||||
|
public routerLinkMarkets = ['/' + $localize`markets`];
|
||||||
|
public routerLinkPricing = ['/' + $localize`pricing`];
|
||||||
|
public routerLinkRegister = ['/' + $localize`register`];
|
||||||
public user: User;
|
public user: User;
|
||||||
|
|
||||||
private unsubscribeSubject = new Subject<void>();
|
private unsubscribeSubject = new Subject<void>();
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="mb-5 row">
|
<div class="mb-5 row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<h3 class="d-none d-sm-block mb-3 text-center">
|
<h1 class="d-none d-sm-block h3 mb-4 text-center" i18n>
|
||||||
Frequently Asked Questions (FAQ)
|
Frequently Asked Questions (FAQ)
|
||||||
</h3>
|
</h1>
|
||||||
<p>
|
<p>
|
||||||
Find quick answers to commonly asked questions about Ghostfolio in our
|
Find quick answers to commonly asked questions about Ghostfolio in our
|
||||||
Frequently Asked Questions (FAQ) section. Discover what Ghostfolio is,
|
Frequently Asked Questions (FAQ) section. Discover what Ghostfolio is,
|
||||||
@ -39,7 +39,7 @@
|
|||||||
>
|
>
|
||||||
<mat-card-content>
|
<mat-card-content>
|
||||||
Please find a feature overview to manage your wealth
|
Please find a feature overview to manage your wealth
|
||||||
<a [routerLink]="['/features']">here</a>.
|
<a [routerLink]="routerLinkFeatures">here</a>.
|
||||||
</mat-card-content>
|
</mat-card-content>
|
||||||
</mat-card>
|
</mat-card>
|
||||||
<mat-card appearance="outlined" class="mb-3">
|
<mat-card appearance="outlined" class="mb-3">
|
||||||
@ -47,7 +47,7 @@
|
|||||||
<mat-card-title>How do I start?</mat-card-title></mat-card-header
|
<mat-card-title>How do I start?</mat-card-title></mat-card-header
|
||||||
>
|
>
|
||||||
<mat-card-content>
|
<mat-card-content>
|
||||||
You can sign up via the “<a [routerLink]="['/register']"
|
You can sign up via the “<a [routerLink]="routerLinkRegister"
|
||||||
>Get Started</a
|
>Get Started</a
|
||||||
>” button at the top of the page. You have multiple options to join
|
>” button at the top of the page. You have multiple options to join
|
||||||
Ghostfolio: Create an account with a security token, using
|
Ghostfolio: Create an account with a security token, using
|
||||||
@ -93,7 +93,7 @@
|
|||||||
world. The
|
world. The
|
||||||
<a href="https://github.com/ghostfolio/ghostfolio">source code</a> is
|
<a href="https://github.com/ghostfolio/ghostfolio">source code</a> is
|
||||||
fully available as open source software (OSS). Thanks to our generous
|
fully available as open source software (OSS). Thanks to our generous
|
||||||
<a [routerLink]="['/pricing']">Ghostfolio Premium</a> users and
|
<a [routerLink]="routerLinkPricing">Ghostfolio Premium</a> users and
|
||||||
<a href="https://www.buymeacoffee.com/ghostfolio">sponsors</a> we have
|
<a href="https://www.buymeacoffee.com/ghostfolio">sponsors</a> we have
|
||||||
the ability to run a free, limited plan for novice
|
the ability to run a free, limited plan for novice
|
||||||
investors.</mat-card-content
|
investors.</mat-card-content
|
||||||
@ -105,8 +105,8 @@
|
|||||||
>
|
>
|
||||||
<mat-card-content
|
<mat-card-content
|
||||||
>Yes, it is! Our
|
>Yes, it is! Our
|
||||||
<a [routerLink]="['/pricing']">pricing page</a> details everything you
|
<a [routerLink]="routerLinkPricing">pricing page</a> details
|
||||||
get for free.</mat-card-content
|
everything you get for free.</mat-card-content
|
||||||
>
|
>
|
||||||
</mat-card>
|
</mat-card>
|
||||||
<mat-card appearance="outlined" class="mb-3">
|
<mat-card appearance="outlined" class="mb-3">
|
||||||
@ -127,7 +127,8 @@
|
|||||||
></mat-card-header
|
></mat-card-header
|
||||||
>
|
>
|
||||||
<mat-card-content
|
<mat-card-content
|
||||||
>By offering <a [routerLink]="['/pricing']">Ghostfolio Premium</a>, a
|
>By offering
|
||||||
|
<a [routerLink]="routerLinkPricing">Ghostfolio Premium</a>, a
|
||||||
subscription plan with a managed hosting service and enhanced
|
subscription plan with a managed hosting service and enhanced
|
||||||
features, we fund our business while providing added value to our
|
features, we fund our business while providing added value to our
|
||||||
users.</mat-card-content
|
users.</mat-card-content
|
||||||
@ -140,12 +141,12 @@
|
|||||||
></mat-card-header
|
></mat-card-header
|
||||||
>
|
>
|
||||||
<mat-card-content
|
<mat-card-content
|
||||||
><a [routerLink]="['/pricing']">Ghostfolio Premium</a> is a fully
|
><a [routerLink]="routerLinkPricing">Ghostfolio Premium</a> is a fully
|
||||||
managed Ghostfolio cloud offering for ambitious investors. The revenue
|
managed Ghostfolio cloud offering for ambitious investors. The revenue
|
||||||
is used to cover the hosting infrastructure and to fund the ongoing
|
is used to cover the hosting infrastructure and to fund the ongoing
|
||||||
development. It is the Open Source code base with some extras like the
|
development. It is the Open Source code base with some extras like the
|
||||||
<a [routerLink]="['/markets']">markets overview</a> and a professional
|
<a [routerLink]="routerLinkMarkets">markets overview</a> and a
|
||||||
data provider.</mat-card-content
|
professional data provider.</mat-card-content
|
||||||
>
|
>
|
||||||
</mat-card>
|
</mat-card>
|
||||||
<mat-card appearance="outlined" class="mb-3">
|
<mat-card appearance="outlined" class="mb-3">
|
||||||
@ -156,9 +157,9 @@
|
|||||||
>
|
>
|
||||||
<mat-card-content
|
<mat-card-content
|
||||||
>Yes, you can try
|
>Yes, you can try
|
||||||
<a [routerLink]="['/pricing']">Ghostfolio Premium</a> by signing up
|
<a [routerLink]="routerLinkPricing">Ghostfolio Premium</a> by signing
|
||||||
for Ghostfolio and applying for a trial (see “My Ghostfolio”). It is
|
up for Ghostfolio and applying for a trial (see “My Ghostfolio”). It
|
||||||
easy, free and there is no commitment. You can stop using it at any
|
is easy, free and there is no commitment. You can stop using it at any
|
||||||
time.</mat-card-content
|
time.</mat-card-content
|
||||||
>
|
>
|
||||||
</mat-card>
|
</mat-card>
|
||||||
@ -214,8 +215,9 @@
|
|||||||
</mat-card-header>
|
</mat-card-header>
|
||||||
<mat-card-content
|
<mat-card-content
|
||||||
>Any support for Ghostfolio is welcome. Be it with a
|
>Any support for Ghostfolio is welcome. Be it with a
|
||||||
<a [routerLink]="['/pricing']">Ghostfolio Premium</a> subscription to
|
<a [routerLink]="routerLinkPricing">Ghostfolio Premium</a>
|
||||||
finance the hosting infrastructure, a positive rating in the
|
subscription to finance the hosting infrastructure, a positive rating
|
||||||
|
in the
|
||||||
<a
|
<a
|
||||||
href="https://play.google.com/store/apps/details?id=ch.dotsilver.ghostfolio.twa"
|
href="https://play.google.com/store/apps/details?id=ch.dotsilver.ghostfolio.twa"
|
||||||
>Google Play Store</a
|
>Google Play Store</a
|
||||||
|
@ -14,6 +14,7 @@ import { Subject, takeUntil } from 'rxjs';
|
|||||||
export class FeaturesPageComponent implements OnDestroy {
|
export class FeaturesPageComponent implements OnDestroy {
|
||||||
public hasPermissionForSubscription: boolean;
|
public hasPermissionForSubscription: boolean;
|
||||||
public info: InfoItem;
|
public info: InfoItem;
|
||||||
|
public routerLinkRegister = ['/' + $localize`register`];
|
||||||
public user: User;
|
public user: User;
|
||||||
|
|
||||||
private unsubscribeSubject = new Subject<void>();
|
private unsubscribeSubject = new Subject<void>();
|
||||||
|
@ -1,13 +1,12 @@
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<h3 class="d-none d-sm-block mb-3 text-center" i18n>Features</h3>
|
<h1 class="h3 mb-4 text-center">
|
||||||
<div class="mb-4">
|
<span class="d-none d-sm-block" i18n>Features</span>
|
||||||
<p>
|
<small class="text-muted" i18n>
|
||||||
Check out the numerous features of <strong>Ghostfolio</strong> to
|
Check out the numerous features of Ghostfolio to manage your wealth
|
||||||
manage your wealth.
|
</small>
|
||||||
</p>
|
</h1>
|
||||||
</div>
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-xs-12 col-md-4 mb-3">
|
<div class="col-xs-12 col-md-4 mb-3">
|
||||||
<mat-card appearance="outlined" class="d-flex flex-column h-100">
|
<mat-card appearance="outlined" class="d-flex flex-column h-100">
|
||||||
@ -212,7 +211,7 @@
|
|||||||
</h4>
|
</h4>
|
||||||
<p class="m-0">
|
<p class="m-0">
|
||||||
Check the current market mood (<a
|
Check the current market mood (<a
|
||||||
[routerLink]="['/resources']"
|
[routerLink]="routerLinkResources"
|
||||||
>Fear & Greed Index</a
|
>Fear & Greed Index</a
|
||||||
>) within the app.
|
>) within the app.
|
||||||
</p>
|
</p>
|
||||||
@ -295,7 +294,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div *ngIf="!user" class="row">
|
<div *ngIf="!user" class="row">
|
||||||
<div class="col mt-3 text-center">
|
<div class="col mt-3 text-center">
|
||||||
<a color="primary" i18n mat-flat-button [routerLink]="['/register']"
|
<a color="primary" i18n mat-flat-button [routerLink]="routerLinkRegister"
|
||||||
>Get Started</a
|
>Get Started</a
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
|
@ -22,6 +22,8 @@ export class LandingPageComponent implements OnDestroy, OnInit {
|
|||||||
public hasPermissionForStatistics: boolean;
|
public hasPermissionForStatistics: boolean;
|
||||||
public hasPermissionForSubscription: boolean;
|
public hasPermissionForSubscription: boolean;
|
||||||
public hasPermissionToCreateUser: boolean;
|
public hasPermissionToCreateUser: boolean;
|
||||||
|
public routerLinkAbout = ['/' + $localize`about`];
|
||||||
|
public routerLinkRegister = ['/' + $localize`register`];
|
||||||
public statistics: Statistics;
|
public statistics: Statistics;
|
||||||
public testimonials = [
|
public testimonials = [
|
||||||
{
|
{
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col text-center">
|
<div class="col text-center">
|
||||||
<h1 class="font-weight-bold intro mt-5">
|
<h1 class="font-weight-bold intro mt-5" i18n>
|
||||||
Manage your wealth like a boss
|
Manage your wealth like a boss
|
||||||
</h1>
|
</h1>
|
||||||
<p class="lead mb-4">
|
<p class="lead mb-4" i18n>
|
||||||
Ghostfolio is a privacy-first, open source dashboard for your personal
|
Ghostfolio is a privacy-first, open source dashboard for your personal
|
||||||
finances. Break down your asset allocation, know your net worth and make
|
finances. Break down your asset allocation, know your net worth and make
|
||||||
solid, data-driven investment decisions.
|
solid, data-driven investment decisions.
|
||||||
@ -31,13 +31,20 @@
|
|||||||
<div class="button-container mb-5 row">
|
<div class="button-container mb-5 row">
|
||||||
<div class="align-items-center col d-flex justify-content-center">
|
<div class="align-items-center col d-flex justify-content-center">
|
||||||
<ng-container *ngIf="hasPermissionToCreateUser">
|
<ng-container *ngIf="hasPermissionToCreateUser">
|
||||||
<a color="primary" mat-flat-button [routerLink]="['/register']">
|
<a
|
||||||
|
color="primary"
|
||||||
|
i18n
|
||||||
|
mat-flat-button
|
||||||
|
[routerLink]="routerLinkRegister"
|
||||||
|
>
|
||||||
Get Started
|
Get Started
|
||||||
</a>
|
</a>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
<ng-container *ngIf="hasPermissionForDemo">
|
<ng-container *ngIf="hasPermissionForDemo">
|
||||||
<div *ngIf="hasPermissionToCreateUser" class="mx-3 text-muted">or</div>
|
<div *ngIf="hasPermissionToCreateUser" class="mx-3 text-muted" i18n>
|
||||||
<a mat-stroked-button [routerLink]="['/demo']"> Live Demo </a>
|
or
|
||||||
|
</div>
|
||||||
|
<a i18n mat-stroked-button [routerLink]="['/demo']">Live Demo</a>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -53,6 +60,7 @@
|
|||||||
[routerLink]="['/open']"
|
[routerLink]="['/open']"
|
||||||
>
|
>
|
||||||
<gf-value
|
<gf-value
|
||||||
|
i18n
|
||||||
icon="people-outline"
|
icon="people-outline"
|
||||||
size="large"
|
size="large"
|
||||||
[value]="statistics?.activeUsers30d ?? '-'"
|
[value]="statistics?.activeUsers30d ?? '-'"
|
||||||
@ -70,6 +78,7 @@
|
|||||||
[routerLink]="['/open']"
|
[routerLink]="['/open']"
|
||||||
>
|
>
|
||||||
<gf-value
|
<gf-value
|
||||||
|
i18n
|
||||||
icon="star-outline"
|
icon="star-outline"
|
||||||
size="large"
|
size="large"
|
||||||
[value]="statistics?.gitHubStargazers ?? '-'"
|
[value]="statistics?.gitHubStargazers ?? '-'"
|
||||||
@ -87,6 +96,7 @@
|
|||||||
[routerLink]="['/open']"
|
[routerLink]="['/open']"
|
||||||
>
|
>
|
||||||
<gf-value
|
<gf-value
|
||||||
|
i18n
|
||||||
icon="cloud-download-outline"
|
icon="cloud-download-outline"
|
||||||
size="large"
|
size="large"
|
||||||
[value]="statistics?.dockerHubPulls ?? '-'"
|
[value]="statistics?.dockerHubPulls ?? '-'"
|
||||||
@ -97,7 +107,9 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row mb-5">
|
<div class="row mb-5">
|
||||||
<div class="col-12 text-center text-muted"><small>As seen in</small></div>
|
<div class="col-12 text-center text-muted">
|
||||||
|
<small i18n>As seen in</small>
|
||||||
|
</div>
|
||||||
<div class="col-md-3 d-flex justify-content-center my-1">
|
<div class="col-md-3 d-flex justify-content-center my-1">
|
||||||
<a
|
<a
|
||||||
class="d-block logo logo-alternative-to mask"
|
class="d-block logo logo-alternative-to mask"
|
||||||
@ -190,11 +202,11 @@
|
|||||||
|
|
||||||
<div class="pt-3 row">
|
<div class="pt-3 row">
|
||||||
<div class="col text-center">
|
<div class="col text-center">
|
||||||
<h2 class="h4 mb-1 text-center">
|
<h2 class="h4 mb-1 text-center" i18n>
|
||||||
Protect your <strong>assets</strong>. Refine your
|
Protect your <strong>assets</strong>. Refine your
|
||||||
<strong>personal investment strategy</strong>.
|
<strong>personal investment strategy</strong>.
|
||||||
</h2>
|
</h2>
|
||||||
<p class="lead m-0">
|
<p class="lead m-0" i18n>
|
||||||
Ghostfolio empowers busy people to keep track of stocks, ETFs or
|
Ghostfolio empowers busy people to keep track of stocks, ETFs or
|
||||||
cryptocurrencies without being tracked.
|
cryptocurrencies without being tracked.
|
||||||
</p>
|
</p>
|
||||||
@ -205,19 +217,20 @@
|
|||||||
<div class="col-md-4 my-2">
|
<div class="col-md-4 my-2">
|
||||||
<mat-card appearance="outlined">
|
<mat-card appearance="outlined">
|
||||||
<mat-card-header>
|
<mat-card-header>
|
||||||
<mat-card-title>360° View</mat-card-title>
|
<mat-card-title i18n>360° View</mat-card-title>
|
||||||
</mat-card-header>
|
</mat-card-header>
|
||||||
<mat-card-content>
|
<mat-card-content i18n>
|
||||||
Get the full picture of your personal finances across multiple
|
Get the full picture of your personal finances across multiple
|
||||||
|
platforms.
|
||||||
</mat-card-content>
|
</mat-card-content>
|
||||||
</mat-card>
|
</mat-card>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-4 my-2">
|
<div class="col-md-4 my-2">
|
||||||
<mat-card appearance="outlined">
|
<mat-card appearance="outlined">
|
||||||
<mat-card-header>
|
<mat-card-header>
|
||||||
<mat-card-title>Web3 Ready</mat-card-title>
|
<mat-card-title i18n>Web3 Ready</mat-card-title>
|
||||||
</mat-card-header>
|
</mat-card-header>
|
||||||
<mat-card-content>
|
<mat-card-content i18n>
|
||||||
Use Ghostfolio anonymously and own your financial data.
|
Use Ghostfolio anonymously and own your financial data.
|
||||||
</mat-card-content>
|
</mat-card-content>
|
||||||
</mat-card>
|
</mat-card>
|
||||||
@ -225,9 +238,9 @@
|
|||||||
<div class="col-md-4 my-2">
|
<div class="col-md-4 my-2">
|
||||||
<mat-card appearance="outlined">
|
<mat-card appearance="outlined">
|
||||||
<mat-card-header>
|
<mat-card-header>
|
||||||
<mat-card-title>Open Source</mat-card-title>
|
<mat-card-title i18n>Open Source</mat-card-title>
|
||||||
</mat-card-header>
|
</mat-card-header>
|
||||||
<mat-card-content>
|
<mat-card-content i18n>
|
||||||
Benefit from continuous improvements through a strong community.
|
Benefit from continuous improvements through a strong community.
|
||||||
</mat-card-content>
|
</mat-card-content>
|
||||||
</mat-card>
|
</mat-card>
|
||||||
@ -236,51 +249,53 @@
|
|||||||
|
|
||||||
<div class="row my-5">
|
<div class="row my-5">
|
||||||
<div class="col-md-6 offset-md-3">
|
<div class="col-md-6 offset-md-3">
|
||||||
<h2 class="h4 mb-1 text-center">Why <strong>Ghostfolio</strong>?</h2>
|
<h2 class="h4 mb-1 text-center" i18n>Why <strong>Ghostfolio</strong>?</h2>
|
||||||
<p class="lead mb-3 text-center">Ghostfolio is for you if you are...</p>
|
<p class="lead mb-3 text-center" i18n>
|
||||||
|
Ghostfolio is for you if you are...
|
||||||
|
</p>
|
||||||
<ul class="list-unstyled">
|
<ul class="list-unstyled">
|
||||||
<li class="d-flex mb-3">
|
<li class="d-flex mb-3">
|
||||||
<span class="mr-3">💼 </span
|
<span class="mr-3">💼 </span
|
||||||
><span
|
><span i18n
|
||||||
>trading stocks, ETFs or cryptocurrencies on multiple
|
>trading stocks, ETFs or cryptocurrencies on multiple
|
||||||
platforms</span
|
platforms</span
|
||||||
>
|
>
|
||||||
</li>
|
</li>
|
||||||
<li class="d-flex mb-3">
|
<li class="d-flex mb-3">
|
||||||
<span class="mr-3">🏦</span
|
<span class="mr-3">🏦</span
|
||||||
><span>pursuing a buy & hold strategy</span>
|
><span i18n>pursuing a buy & hold strategy</span>
|
||||||
</li>
|
</li>
|
||||||
<li class="d-flex mb-3">
|
<li class="d-flex mb-3">
|
||||||
<span class="mr-3">🎯</span
|
<span class="mr-3">🎯</span
|
||||||
><span
|
><span i18n
|
||||||
>interested in getting insights of your portfolio composition</span
|
>interested in getting insights of your portfolio composition</span
|
||||||
>
|
>
|
||||||
</li>
|
</li>
|
||||||
<li class="d-flex mb-3">
|
<li class="d-flex mb-3">
|
||||||
<span class="mr-3">👻</span
|
<span class="mr-3">👻</span
|
||||||
><span>valuing privacy and data ownership</span>
|
><span i18n>valuing privacy and data ownership</span>
|
||||||
</li>
|
</li>
|
||||||
<li class="d-flex mb-3">
|
<li class="d-flex mb-3">
|
||||||
<span class="mr-3">🧘</span><span>into minimalism</span>
|
<span class="mr-3">🧘</span><span i18n>into minimalism</span>
|
||||||
</li>
|
</li>
|
||||||
<li class="d-flex mb-3">
|
<li class="d-flex mb-3">
|
||||||
<span class="mr-3">🧺</span
|
<span class="mr-3">🧺</span
|
||||||
><span>caring about diversifying your financial resources</span>
|
><span i18n>caring about diversifying your financial resources</span>
|
||||||
</li>
|
</li>
|
||||||
<li class="d-flex mb-3">
|
<li class="d-flex mb-3">
|
||||||
<span class="mr-3">🆓</span
|
<span class="mr-3">🆓</span
|
||||||
><span>interested in financial independence</span>
|
><span i18n>interested in financial independence</span>
|
||||||
</li>
|
</li>
|
||||||
<li class="d-flex mb-3">
|
<li class="d-flex mb-3">
|
||||||
<span class="mr-3">🙅</span
|
<span class="mr-3">🙅</span
|
||||||
><span>saying no to spreadsheets in {{ currentYear }}</span>
|
><span i18n>saying no to spreadsheets in {{ currentYear }}</span>
|
||||||
</li>
|
</li>
|
||||||
<li class="d-flex mb-3">
|
<li class="d-flex mb-3">
|
||||||
<span class="mr-3">😎</span><span>still reading this list</span>
|
<span class="mr-3">😎</span><span i18n>still reading this list</span>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<div class="mt-4 text-center">
|
<div class="mt-4 text-center">
|
||||||
<a mat-stroked-button [routerLink]="['/about']"
|
<a i18n mat-stroked-button [routerLink]="routerLinkAbout"
|
||||||
>Learn more about Ghostfolio</a
|
>Learn more about Ghostfolio</a
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
@ -289,7 +304,7 @@
|
|||||||
|
|
||||||
<div class="row my-5">
|
<div class="row my-5">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<h2 class="h4 mb-1 text-center">
|
<h2 class="h4 mb-1 text-center" i18n>
|
||||||
What our <strong>users</strong> are saying
|
What our <strong>users</strong> are saying
|
||||||
</h2>
|
</h2>
|
||||||
</div>
|
</div>
|
||||||
@ -319,7 +334,7 @@
|
|||||||
|
|
||||||
<div *ngIf="hasPermissionForSubscription" class="row my-5">
|
<div *ngIf="hasPermissionForSubscription" class="row my-5">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<h2 class="h4 text-center">
|
<h2 class="h4 text-center" i18n>
|
||||||
Members from around the globe are using
|
Members from around the globe are using
|
||||||
<a href="pricing"><strong>Ghostfolio Premium</strong></a>
|
<a href="pricing"><strong>Ghostfolio Premium</strong></a>
|
||||||
</h2>
|
</h2>
|
||||||
@ -334,17 +349,17 @@
|
|||||||
|
|
||||||
<div *ngIf="hasPermissionForSubscription" class="row my-3">
|
<div *ngIf="hasPermissionForSubscription" class="row my-3">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<h2 class="h4 mb-1 text-center">
|
<h2 class="h4 mb-1 text-center" i18n>
|
||||||
How does <strong>Ghostfolio</strong> work?
|
How does <strong>Ghostfolio</strong> work?
|
||||||
</h2>
|
</h2>
|
||||||
<p class="lead mb-3 text-center">Get started in only 3 steps</p>
|
<p class="lead mb-3 text-center" i18n>Get started in only 3 steps</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-4 my-2">
|
<div class="col-md-4 my-2">
|
||||||
<mat-card appearance="outlined" class="h-100">
|
<mat-card appearance="outlined" class="h-100">
|
||||||
<mat-card-content class="d-flex flex-row">
|
<mat-card-content class="d-flex flex-row">
|
||||||
<div class="flex-grow-1">
|
<div class="flex-grow-1">
|
||||||
<div class="font-weight-bold">Sign up anonymously*</div>
|
<div class="font-weight-bold" i18n>Sign up anonymously*</div>
|
||||||
<div class="text-muted">
|
<div class="text-muted" i18n>
|
||||||
<small>* no e-mail address nor credit card required</small>
|
<small>* no e-mail address nor credit card required</small>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -356,7 +371,7 @@
|
|||||||
<mat-card appearance="outlined" class="h-100">
|
<mat-card appearance="outlined" class="h-100">
|
||||||
<mat-card-content class="d-flex flex-row">
|
<mat-card-content class="d-flex flex-row">
|
||||||
<div class="flex-grow-1">
|
<div class="flex-grow-1">
|
||||||
<div class="font-weight-bold">
|
<div class="font-weight-bold" i18n>
|
||||||
Add any of your historical transactions
|
Add any of your historical transactions
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -368,7 +383,7 @@
|
|||||||
<mat-card appearance="outlined" class="h-100">
|
<mat-card appearance="outlined" class="h-100">
|
||||||
<mat-card-content class="d-flex flex-row">
|
<mat-card-content class="d-flex flex-row">
|
||||||
<div class="flex-grow-1">
|
<div class="flex-grow-1">
|
||||||
<div class="font-weight-bold">
|
<div class="font-weight-bold" i18n>
|
||||||
Get valuable insights of your portfolio composition
|
Get valuable insights of your portfolio composition
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -380,19 +395,24 @@
|
|||||||
|
|
||||||
<div *ngIf="hasPermissionToCreateUser" class="row my-5">
|
<div *ngIf="hasPermissionToCreateUser" class="row my-5">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<h2 class="h4 mb-1 text-center">Are <strong>you</strong> ready?</h2>
|
<h2 class="h4 mb-1 text-center" i18n>Are <strong>you</strong> ready?</h2>
|
||||||
<p class="lead mb-3 text-center">
|
<p class="lead mb-3 text-center" i18n>
|
||||||
Join now<ng-container *ngIf="hasPermissionForDemo">
|
Join now<ng-container *ngIf="hasPermissionForDemo">
|
||||||
or check out the example account</ng-container
|
or check out the example account</ng-container
|
||||||
>
|
>
|
||||||
</p>
|
</p>
|
||||||
<div class="align-items-center d-flex justify-content-center py-2">
|
<div class="align-items-center d-flex justify-content-center py-2">
|
||||||
<a color="primary" mat-flat-button [routerLink]="['/register']">
|
<a
|
||||||
|
color="primary"
|
||||||
|
i18n
|
||||||
|
mat-flat-button
|
||||||
|
[routerLink]="routerLinkRegister"
|
||||||
|
>
|
||||||
Get Started
|
Get Started
|
||||||
</a>
|
</a>
|
||||||
<ng-container *ngIf="hasPermissionForDemo">
|
<ng-container *ngIf="hasPermissionForDemo">
|
||||||
<div class="mx-3 text-muted">or</div>
|
<div class="mx-3 text-muted" i18n>or</div>
|
||||||
<a mat-stroked-button [routerLink]="['/demo']"> Live Demo </a>
|
<a i18n mat-stroked-button [routerLink]="['/demo']">Live Demo</a>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<h3 class="d-none d-sm-block mb-3 text-center">Open Startup</h3>
|
<h1 class="d-none d-sm-block h3 mb-4 text-center">Open Startup</h1>
|
||||||
<div class="intro-container">
|
<div class="intro-container mb-4">
|
||||||
<p i18n>
|
<p i18n>
|
||||||
At Ghostfolio, transparency is at the core of our values. We publish
|
At Ghostfolio, transparency is at the core of our values. We publish
|
||||||
the source code as
|
the source code as
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row mb-3">
|
<div class="row mb-3">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<h3 class="d-none d-sm-block mb-3 text-center" i18n>Activities</h3>
|
<h1 class="d-none d-sm-block h3 mb-3 text-center" i18n>Activities</h1>
|
||||||
<gf-activities-table
|
<gf-activities-table
|
||||||
[activities]="activities"
|
[activities]="activities"
|
||||||
[baseCurrency]="user?.settings?.baseCurrency"
|
[baseCurrency]="user?.settings?.baseCurrency"
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<h3 class="d-none d-sm-block mb-3 text-center" i18n>Allocations</h3>
|
<h1 class="d-none d-sm-block h3 mb-3 text-center" i18n>Allocations</h1>
|
||||||
<gf-activities-filter
|
<gf-activities-filter
|
||||||
[allFilters]="allFilters"
|
[allFilters]="allFilters"
|
||||||
[isLoading]="isLoading"
|
[isLoading]="isLoading"
|
||||||
@ -260,30 +260,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-4">
|
|
||||||
<mat-card appearance="outlined" class="mb-3">
|
|
||||||
<mat-card-header class="overflow-hidden w-100">
|
|
||||||
<mat-card-title class="align-items-center d-flex text-truncate"
|
|
||||||
><span i18n>By Country</span
|
|
||||||
><gf-premium-indicator
|
|
||||||
*ngIf="user?.subscription?.type === 'Basic'"
|
|
||||||
class="ml-1"
|
|
||||||
></gf-premium-indicator
|
|
||||||
></mat-card-title>
|
|
||||||
</mat-card-header>
|
|
||||||
<mat-card-content>
|
|
||||||
<gf-portfolio-proportion-chart
|
|
||||||
[baseCurrency]="user?.settings?.baseCurrency"
|
|
||||||
[colorScheme]="user?.settings?.colorScheme"
|
|
||||||
[isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
|
|
||||||
[keys]="['name']"
|
|
||||||
[locale]="user?.settings?.locale"
|
|
||||||
[maxItems]="10"
|
|
||||||
[positions]="countries"
|
|
||||||
></gf-portfolio-proportion-chart>
|
|
||||||
</mat-card-content>
|
|
||||||
</mat-card>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-4">
|
<div class="col-md-4">
|
||||||
<mat-card appearance="outlined" class="mb-3">
|
<mat-card appearance="outlined" class="mb-3">
|
||||||
<mat-card-header class="overflow-hidden w-100">
|
<mat-card-header class="overflow-hidden w-100">
|
||||||
@ -326,5 +302,29 @@
|
|||||||
</mat-card-content>
|
</mat-card-content>
|
||||||
</mat-card>
|
</mat-card>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="col-md-4">
|
||||||
|
<mat-card appearance="outlined" class="mb-3">
|
||||||
|
<mat-card-header class="overflow-hidden w-100">
|
||||||
|
<mat-card-title class="align-items-center d-flex text-truncate"
|
||||||
|
><span i18n>By Country</span
|
||||||
|
><gf-premium-indicator
|
||||||
|
*ngIf="user?.subscription?.type === 'Basic'"
|
||||||
|
class="ml-1"
|
||||||
|
></gf-premium-indicator
|
||||||
|
></mat-card-title>
|
||||||
|
</mat-card-header>
|
||||||
|
<mat-card-content>
|
||||||
|
<gf-portfolio-proportion-chart
|
||||||
|
[baseCurrency]="user?.settings?.baseCurrency"
|
||||||
|
[colorScheme]="user?.settings?.colorScheme"
|
||||||
|
[isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
|
||||||
|
[keys]="['name']"
|
||||||
|
[locale]="user?.settings?.locale"
|
||||||
|
[maxItems]="10"
|
||||||
|
[positions]="countries"
|
||||||
|
></gf-portfolio-proportion-chart>
|
||||||
|
</mat-card-content>
|
||||||
|
</mat-card>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<h3 class="d-none d-sm-block mb-3 text-center" i18n>Analysis</h3>
|
<h1 class="d-none d-sm-block h3 mb-3 text-center" i18n>Analysis</h1>
|
||||||
<div *ngIf="user?.settings?.viewMode !== 'ZEN'" class="my-4 text-center">
|
<div *ngIf="user?.settings?.viewMode !== 'ZEN'" class="my-4 text-center">
|
||||||
<gf-toggle
|
<gf-toggle
|
||||||
[defaultValue]="user?.settings?.dateRange"
|
[defaultValue]="user?.settings?.dateRange"
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row mb-5">
|
<div class="row mb-5">
|
||||||
<div class="col-lg">
|
<div class="col-lg">
|
||||||
<h3 class="d-none d-sm-block mb-3 text-center" i18n>FIRE</h3>
|
<h2 class="d-none d-sm-block h3 mb-3 text-center" i18n>FIRE</h2>
|
||||||
<div>
|
<div>
|
||||||
<h4 class="align-items-center d-flex mb-3">
|
<h4 class="align-items-center d-flex mb-3">
|
||||||
<span i18n>Calculator</span
|
<span i18n>Calculator</span
|
||||||
@ -94,7 +94,7 @@
|
|||||||
<div class="container mt-5">
|
<div class="container mt-5">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<h3 class="mb-3 text-center">X-ray</h3>
|
<h2 class="h3 mb-3 text-center">X-ray</h2>
|
||||||
<p class="mb-4">
|
<p class="mb-4">
|
||||||
Ghostfolio X-ray uses static analysis to identify potential issues and
|
Ghostfolio X-ray uses static analysis to identify potential issues and
|
||||||
risks in your portfolio.
|
risks in your portfolio.
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<h3 class="d-none d-sm-block mb-3 text-center" i18n>Holdings</h3>
|
<h1 class="d-none d-sm-block h3 mb-3 text-center" i18n>Holdings</h1>
|
||||||
<gf-activities-filter
|
<gf-activities-filter
|
||||||
[allFilters]="allFilters"
|
[allFilters]="allFilters"
|
||||||
[isLoading]="isLoading"
|
[isLoading]="isLoading"
|
||||||
|
@ -29,6 +29,8 @@ export class PricingPageComponent implements OnDestroy, OnInit {
|
|||||||
public isLoggedIn: boolean;
|
public isLoggedIn: boolean;
|
||||||
public price: number;
|
public price: number;
|
||||||
public priceId: string;
|
public priceId: string;
|
||||||
|
public routerLinkFeatures = ['/' + $localize`features`];
|
||||||
|
public routerLinkRegister = ['/' + $localize`register`];
|
||||||
public user: User;
|
public user: User;
|
||||||
|
|
||||||
private unsubscribeSubject = new Subject<void>();
|
private unsubscribeSubject = new Subject<void>();
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<h3 class="d-none d-sm-block mb-3 text-center" i18n>Pricing Plans</h3>
|
<h1 class="d-none d-sm-block h3 mb-4 text-center" i18n>Pricing Plans</h1>
|
||||||
<div class="mb-4">
|
<div class="mb-4">
|
||||||
<p i18n>
|
<p i18n>
|
||||||
Our official Ghostfolio Premium cloud offering is the easiest way to
|
Our official Ghostfolio Premium cloud offering is the easiest way to
|
||||||
@ -21,7 +21,7 @@
|
|||||||
<a href="mailto:hi@ghostfol.io?Subject=Student Discount">here</a> with
|
<a href="mailto:hi@ghostfol.io?Subject=Student Discount">here</a> with
|
||||||
your university e-mail address.
|
your university e-mail address.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p i18n>
|
||||||
If you prefer to run Ghostfolio on your own infrastructure, please
|
If you prefer to run Ghostfolio on your own infrastructure, please
|
||||||
find the source code and further instructions on
|
find the source code and further instructions on
|
||||||
<a href="https://github.com/ghostfolio/ghostfolio">GitHub</a>.
|
<a href="https://github.com/ghostfolio/ghostfolio">GitHub</a>.
|
||||||
@ -106,7 +106,7 @@
|
|||||||
class="mr-1"
|
class="mr-1"
|
||||||
name="checkmark-circle-outline"
|
name="checkmark-circle-outline"
|
||||||
></ion-icon>
|
></ion-icon>
|
||||||
<a i18n [routerLink]="['/features']"
|
<a i18n [routerLink]="routerLinkFeatures"
|
||||||
>and more Features...</a
|
>and more Features...</a
|
||||||
>
|
>
|
||||||
</li>
|
</li>
|
||||||
@ -302,7 +302,7 @@
|
|||||||
class="mr-1"
|
class="mr-1"
|
||||||
name="checkmark-circle-outline"
|
name="checkmark-circle-outline"
|
||||||
></ion-icon>
|
></ion-icon>
|
||||||
<a i18n [routerLink]="['/features']"
|
<a i18n [routerLink]="routerLinkFeatures"
|
||||||
>and more Features...</a
|
>and more Features...</a
|
||||||
>
|
>
|
||||||
</li>
|
</li>
|
||||||
@ -360,7 +360,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div *ngIf="!user" class="row">
|
<div *ngIf="!user" class="row">
|
||||||
<div class="col mt-3 text-center">
|
<div class="col mt-3 text-center">
|
||||||
<a color="primary" i18n mat-flat-button [routerLink]="['/register']">
|
<a color="primary" i18n mat-flat-button [routerLink]="routerLinkRegister">
|
||||||
Get Started
|
Get Started
|
||||||
</a>
|
</a>
|
||||||
<p class="m-0 text-muted"><small i18n>It’s free.</small></p>
|
<p class="m-0 text-muted"><small i18n>It’s free.</small></p>
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<h3 class="h4 mb-3 text-center" i18n>
|
<h1 class="h4 mb-3 text-center" i18n>
|
||||||
Hello, {{ portfolioPublicDetails?.alias ?? 'someone' }} has shared a
|
Hello, {{ portfolioPublicDetails?.alias ?? 'someone' }} has shared a
|
||||||
<strong>Portfolio</strong> with you!
|
<strong>Portfolio</strong> with you!
|
||||||
</h3>
|
</h1>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="proportion-charts row">
|
<div class="proportion-charts row">
|
||||||
|
@ -22,7 +22,7 @@ const routes: Routes = [
|
|||||||
path: `open-source-alternative-to-${key}`,
|
path: `open-source-alternative-to-${key}`,
|
||||||
loadComponent: () =>
|
loadComponent: () =>
|
||||||
import(`./products/${key}-page.component`).then(() => component),
|
import(`./products/${key}-page.component`).then(() => component),
|
||||||
title: `Open Source Alternative to ${name}`
|
title: $localize`Open Source Alternative to ${name}`
|
||||||
};
|
};
|
||||||
})
|
})
|
||||||
];
|
];
|
||||||
|
@ -10,9 +10,11 @@ import { products } from './products';
|
|||||||
templateUrl: './personal-finance-tools-page.html'
|
templateUrl: './personal-finance-tools-page.html'
|
||||||
})
|
})
|
||||||
export class PersonalFinanceToolsPageComponent implements OnDestroy {
|
export class PersonalFinanceToolsPageComponent implements OnDestroy {
|
||||||
|
public pathResources = '/' + $localize`resources`;
|
||||||
public products = products.filter(({ key }) => {
|
public products = products.filter(({ key }) => {
|
||||||
return key !== 'ghostfolio';
|
return key !== 'ghostfolio';
|
||||||
});
|
});
|
||||||
|
public routerLinkAbout = ['/' + $localize`about`];
|
||||||
|
|
||||||
private unsubscribeSubject = new Subject<void>();
|
private unsubscribeSubject = new Subject<void>();
|
||||||
|
|
||||||
|
@ -1,19 +1,19 @@
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="mb-5 row">
|
<div class="mb-5 row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<h3 class="d-none d-sm-block mb-3 text-center" i18n>
|
<h1 class="d-none d-sm-block h3 mb-4 text-center" i18n>
|
||||||
Discover Open Source Alternatives for Personal Finance Tools
|
Discover Open Source Alternatives for Personal Finance Tools
|
||||||
</h3>
|
</h1>
|
||||||
<div class="introduction mb-4">
|
<div class="introduction mb-4">
|
||||||
<p>
|
<p i18n>
|
||||||
This overview page features a curated collection of personal finance
|
This overview page features a curated collection of personal finance
|
||||||
tools compared to the open source alternative
|
tools compared to the open source alternative
|
||||||
<a [routerLink]="['/about']">Ghostfolio</a>. If you value
|
<a [routerLink]="routerLinkAbout">Ghostfolio</a>. If you value
|
||||||
transparency, data privacy, and community collaboration, Ghostfolio
|
transparency, data privacy, and community collaboration, Ghostfolio
|
||||||
provides an excellent opportunity to take control of your financial
|
provides an excellent opportunity to take control of your financial
|
||||||
management.
|
management.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p i18n>
|
||||||
Explore the links below to compare a variety of personal finance tools
|
Explore the links below to compare a variety of personal finance tools
|
||||||
with Ghostfolio.
|
with Ghostfolio.
|
||||||
</p>
|
</p>
|
||||||
@ -29,10 +29,10 @@
|
|||||||
<a
|
<a
|
||||||
class="d-flex overflow-hidden w-100"
|
class="d-flex overflow-hidden w-100"
|
||||||
title="Compare Ghostfolio to {{ product.name }}"
|
title="Compare Ghostfolio to {{ product.name }}"
|
||||||
[routerLink]="['/resources', 'personal-finance-tools', 'open-source-alternative-to-' + product.key]"
|
[routerLink]="[pathResources, 'personal-finance-tools', 'open-source-alternative-to-' + product.key]"
|
||||||
>
|
>
|
||||||
<div class="flex-grow-1 overflow-hidden">
|
<div class="flex-grow-1 overflow-hidden">
|
||||||
<div class="h6 m-0 text-truncate">
|
<div class="h6 m-0 text-truncate" i18n>
|
||||||
Open Source Alternative to {{ product.name }}
|
Open Source Alternative to {{ product.name }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -4,19 +4,22 @@
|
|||||||
<article>
|
<article>
|
||||||
<div class="mb-4 text-center">
|
<div class="mb-4 text-center">
|
||||||
<h1 class="mb-1">
|
<h1 class="mb-1">
|
||||||
<strong>Ghostfolio</strong>: The Open Source Alternative to
|
<strong>Ghostfolio</strong>:
|
||||||
<strong>{{ product2.name }}</strong>
|
<ng-container i18n>The Open Source Alternative to</ng-container
|
||||||
|
> <strong>{{ product2.name }}</strong>
|
||||||
</h1>
|
</h1>
|
||||||
</div>
|
</div>
|
||||||
<section class="mb-4">
|
<section class="mb-4">
|
||||||
<p>
|
<p>
|
||||||
Are you looking for an open source alternative to {{ product2.name
|
Are you looking for an open source alternative to {{ product2.name
|
||||||
}}? <a [routerLink]="['/about']">Ghostfolio</a> is a powerful
|
}}? <a [routerLink]="routerLinkAbout">Ghostfolio</a> is a powerful
|
||||||
portfolio management tool that provides individuals with a
|
portfolio management tool that provides individuals with a
|
||||||
comprehensive platform to track, analyze, and optimize their
|
comprehensive platform to track, analyze, and optimize their
|
||||||
investments. Whether you are an experienced investor or just
|
investments. Whether you are an experienced investor or just
|
||||||
starting out, Ghostfolio offers an intuitive user interface and a
|
starting out, Ghostfolio offers an intuitive user interface and a
|
||||||
<a [routerLink]="['/features']">wide range of functionalities</a>
|
<a [routerLink]="routerLinkFeatures"
|
||||||
|
>wide range of functionalities</a
|
||||||
|
>
|
||||||
to help you make informed decisions and take control of your
|
to help you make informed decisions and take control of your
|
||||||
financial future.
|
financial future.
|
||||||
</p>
|
</p>
|
||||||
@ -280,7 +283,7 @@
|
|||||||
<nav aria-label="breadcrumb">
|
<nav aria-label="breadcrumb">
|
||||||
<ol class="breadcrumb">
|
<ol class="breadcrumb">
|
||||||
<li class="breadcrumb-item">
|
<li class="breadcrumb-item">
|
||||||
<a i18n [routerLink]="['/resources', 'personal-finance-tools']"
|
<a i18n [routerLink]="routerLinkResourcesPersonalFinanceTools"
|
||||||
>Personal Finance Tools</a
|
>Personal Finance Tools</a
|
||||||
>
|
>
|
||||||
</li>
|
</li>
|
||||||
|
@ -21,4 +21,11 @@ export class AltooPageComponent {
|
|||||||
public product2 = products.find(({ key }) => {
|
public product2 = products.find(({ key }) => {
|
||||||
return key === 'altoo';
|
return key === 'altoo';
|
||||||
});
|
});
|
||||||
|
|
||||||
|
public routerLinkAbout = ['/' + $localize`about`];
|
||||||
|
public routerLinkFeatures = ['/' + $localize`features`];
|
||||||
|
public routerLinkResourcesPersonalFinanceTools = [
|
||||||
|
'/' + $localize`resources`,
|
||||||
|
'personal-finance-tools'
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
@ -21,4 +21,11 @@ export class CopilotMoneyPageComponent {
|
|||||||
public product2 = products.find(({ key }) => {
|
public product2 = products.find(({ key }) => {
|
||||||
return key === 'copilot-money';
|
return key === 'copilot-money';
|
||||||
});
|
});
|
||||||
|
|
||||||
|
public routerLinkAbout = ['/' + $localize`about`];
|
||||||
|
public routerLinkFeatures = ['/' + $localize`features`];
|
||||||
|
public routerLinkResourcesPersonalFinanceTools = [
|
||||||
|
'/' + $localize`resources`,
|
||||||
|
'personal-finance-tools'
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
@ -21,4 +21,11 @@ export class DeltaPageComponent {
|
|||||||
public product2 = products.find(({ key }) => {
|
public product2 = products.find(({ key }) => {
|
||||||
return key === 'delta';
|
return key === 'delta';
|
||||||
});
|
});
|
||||||
|
|
||||||
|
public routerLinkAbout = ['/' + $localize`about`];
|
||||||
|
public routerLinkFeatures = ['/' + $localize`features`];
|
||||||
|
public routerLinkResourcesPersonalFinanceTools = [
|
||||||
|
'/' + $localize`resources`,
|
||||||
|
'personal-finance-tools'
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
@ -21,4 +21,11 @@ export class DivvyDiaryPageComponent {
|
|||||||
public product2 = products.find(({ key }) => {
|
public product2 = products.find(({ key }) => {
|
||||||
return key === 'divvydiary';
|
return key === 'divvydiary';
|
||||||
});
|
});
|
||||||
|
|
||||||
|
public routerLinkAbout = ['/' + $localize`about`];
|
||||||
|
public routerLinkFeatures = ['/' + $localize`features`];
|
||||||
|
public routerLinkResourcesPersonalFinanceTools = [
|
||||||
|
'/' + $localize`resources`,
|
||||||
|
'personal-finance-tools'
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
@ -21,4 +21,11 @@ export class ExirioPageComponent {
|
|||||||
public product2 = products.find(({ key }) => {
|
public product2 = products.find(({ key }) => {
|
||||||
return key === 'exirio';
|
return key === 'exirio';
|
||||||
});
|
});
|
||||||
|
|
||||||
|
public routerLinkAbout = ['/' + $localize`about`];
|
||||||
|
public routerLinkFeatures = ['/' + $localize`features`];
|
||||||
|
public routerLinkResourcesPersonalFinanceTools = [
|
||||||
|
'/' + $localize`resources`,
|
||||||
|
'personal-finance-tools'
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
@ -21,4 +21,11 @@ export class FolisharePageComponent {
|
|||||||
public product2 = products.find(({ key }) => {
|
public product2 = products.find(({ key }) => {
|
||||||
return key === 'folishare';
|
return key === 'folishare';
|
||||||
});
|
});
|
||||||
|
|
||||||
|
public routerLinkAbout = ['/' + $localize`about`];
|
||||||
|
public routerLinkFeatures = ['/' + $localize`features`];
|
||||||
|
public routerLinkResourcesPersonalFinanceTools = [
|
||||||
|
'/' + $localize`resources`,
|
||||||
|
'personal-finance-tools'
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
@ -21,4 +21,11 @@ export class GetquinPageComponent {
|
|||||||
public product2 = products.find(({ key }) => {
|
public product2 = products.find(({ key }) => {
|
||||||
return key === 'getquin';
|
return key === 'getquin';
|
||||||
});
|
});
|
||||||
|
|
||||||
|
public routerLinkAbout = ['/' + $localize`about`];
|
||||||
|
public routerLinkFeatures = ['/' + $localize`features`];
|
||||||
|
public routerLinkResourcesPersonalFinanceTools = [
|
||||||
|
'/' + $localize`resources`,
|
||||||
|
'personal-finance-tools'
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
@ -21,4 +21,11 @@ export class GoSpatzPageComponent {
|
|||||||
public product2 = products.find(({ key }) => {
|
public product2 = products.find(({ key }) => {
|
||||||
return key === 'gospatz';
|
return key === 'gospatz';
|
||||||
});
|
});
|
||||||
|
|
||||||
|
public routerLinkAbout = ['/' + $localize`about`];
|
||||||
|
public routerLinkFeatures = ['/' + $localize`features`];
|
||||||
|
public routerLinkResourcesPersonalFinanceTools = [
|
||||||
|
'/' + $localize`resources`,
|
||||||
|
'personal-finance-tools'
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
@ -21,4 +21,11 @@ export class JustEtfPageComponent {
|
|||||||
public product2 = products.find(({ key }) => {
|
public product2 = products.find(({ key }) => {
|
||||||
return key === 'justetf';
|
return key === 'justetf';
|
||||||
});
|
});
|
||||||
|
|
||||||
|
public routerLinkAbout = ['/' + $localize`about`];
|
||||||
|
public routerLinkFeatures = ['/' + $localize`features`];
|
||||||
|
public routerLinkResourcesPersonalFinanceTools = [
|
||||||
|
'/' + $localize`resources`,
|
||||||
|
'personal-finance-tools'
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
@ -21,4 +21,11 @@ export class KuberaPageComponent {
|
|||||||
public product2 = products.find(({ key }) => {
|
public product2 = products.find(({ key }) => {
|
||||||
return key === 'kubera';
|
return key === 'kubera';
|
||||||
});
|
});
|
||||||
|
|
||||||
|
public routerLinkAbout = ['/' + $localize`about`];
|
||||||
|
public routerLinkFeatures = ['/' + $localize`features`];
|
||||||
|
public routerLinkResourcesPersonalFinanceTools = [
|
||||||
|
'/' + $localize`resources`,
|
||||||
|
'personal-finance-tools'
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
@ -21,4 +21,11 @@ export class MarketsShPageComponent {
|
|||||||
public product2 = products.find(({ key }) => {
|
public product2 = products.find(({ key }) => {
|
||||||
return key === 'markets.sh';
|
return key === 'markets.sh';
|
||||||
});
|
});
|
||||||
|
|
||||||
|
public routerLinkAbout = ['/' + $localize`about`];
|
||||||
|
public routerLinkFeatures = ['/' + $localize`features`];
|
||||||
|
public routerLinkResourcesPersonalFinanceTools = [
|
||||||
|
'/' + $localize`resources`,
|
||||||
|
'personal-finance-tools'
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
@ -21,4 +21,11 @@ export class MaybeFinancePageComponent {
|
|||||||
public product2 = products.find(({ key }) => {
|
public product2 = products.find(({ key }) => {
|
||||||
return key === 'maybe-finance';
|
return key === 'maybe-finance';
|
||||||
});
|
});
|
||||||
|
|
||||||
|
public routerLinkAbout = ['/' + $localize`about`];
|
||||||
|
public routerLinkFeatures = ['/' + $localize`features`];
|
||||||
|
public routerLinkResourcesPersonalFinanceTools = [
|
||||||
|
'/' + $localize`resources`,
|
||||||
|
'personal-finance-tools'
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
@ -21,4 +21,11 @@ export class MonsePageComponent {
|
|||||||
public product2 = products.find(({ key }) => {
|
public product2 = products.find(({ key }) => {
|
||||||
return key === 'monse';
|
return key === 'monse';
|
||||||
});
|
});
|
||||||
|
|
||||||
|
public routerLinkAbout = ['/' + $localize`about`];
|
||||||
|
public routerLinkFeatures = ['/' + $localize`features`];
|
||||||
|
public routerLinkResourcesPersonalFinanceTools = [
|
||||||
|
'/' + $localize`resources`,
|
||||||
|
'personal-finance-tools'
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user