mirror of https://github.com/ghostfolio/ghostfolio
47 changed files with 8723 additions and 1197 deletions
@ -0,0 +1,15 @@ |
|||||
|
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-hacktoberfest-2023-debriefing-page', |
||||
|
standalone: true, |
||||
|
templateUrl: './hacktoberfest-2023-debriefing-page.html' |
||||
|
}) |
||||
|
export class Hacktoberfest2023DebriefingPageComponent { |
||||
|
public routerLinkAbout = ['/' + $localize`about`]; |
||||
|
public routerLinkFeatures = ['/' + $localize`features`]; |
||||
|
} |
@ -0,0 +1,283 @@ |
|||||
|
<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">Hacktoberfest 2023 Debriefing</h1> |
||||
|
<div class="mb-3 text-muted"><small>2023-11-05</small></div> |
||||
|
<img |
||||
|
alt="Hacktoberfest 2023 with Ghostfolio Teaser" |
||||
|
class="rounded w-100" |
||||
|
src="../assets/images/blog/hacktoberfest-2023.png" |
||||
|
title="Hacktoberfest 2023 with Ghostfolio" |
||||
|
/> |
||||
|
</div> |
||||
|
<section class="mb-4"> |
||||
|
<p> |
||||
|
As <a href="https://hacktoberfest.com">Hacktoberfest</a> has come to |
||||
|
an end, it’s time to look back and share our learnings. |
||||
|
Hacktoberfest is a month-long celebration of open source software |
||||
|
(OSS) projects, their maintainers, and the entire community of |
||||
|
contributors. Each October, open source maintainers from all over |
||||
|
the world give extra attention to new contributors while guiding |
||||
|
them through their first pull requests on |
||||
|
<a href="https://github.com/ghostfolio/ghostfolio">GitHub</a>. This |
||||
|
year the event celebrated its 10th anniversary. At Ghostfolio, we |
||||
|
have participated in the event for the |
||||
|
<a href="../en/blog/2023/09/hacktoberfest-2023">second time</a> this |
||||
|
year. |
||||
|
</p> |
||||
|
<p> |
||||
|
In this debriefing, we’ll take a closer look at our journey during |
||||
|
Hacktoberfest, exploring the facts and figures, key takeaways, and |
||||
|
the impact on Ghostfolio. |
||||
|
</p> |
||||
|
</section> |
||||
|
<section class="mb-4"> |
||||
|
<h2 class="h4">Hacktoberfest with Ghostfolio</h2> |
||||
|
<p> |
||||
|
<a href="https://ghostfol.io">Ghostfolio</a> is a modern web |
||||
|
application for managing personal finances. The software aggregates |
||||
|
your assets and empowers informed decision-making to help you |
||||
|
balance your portfolio or plan for future investments. |
||||
|
</p> |
||||
|
<p> |
||||
|
Our experience at Ghostfolio during Hacktoberfest 2023 has been |
||||
|
truly remarkable. Despite the absence of T-shirt rewards this year, |
||||
|
our expectations were exceeded in every way. |
||||
|
<a [routerLink]="routerLinkAbout">We</a> had the privilege of |
||||
|
collaborating with |
||||
|
<a |
||||
|
href="https://github.com/ghostfolio/ghostfolio/graphs/contributors" |
||||
|
>20 talented developers</a |
||||
|
> |
||||
|
from around the world, each bringing their unique skills and |
||||
|
backgrounds to our fintech project. |
||||
|
</p> |
||||
|
<p> |
||||
|
<figure class="figure"> |
||||
|
<a |
||||
|
href="https://github.com/ghostfolio/ghostfolio/graphs/contributors" |
||||
|
> |
||||
|
<img |
||||
|
alt="Screenshot of the Ghostfolio’s Hacktoberfest 2023 Insights" |
||||
|
class="figure-img img-fluid rounded" |
||||
|
src="../assets/images/blog/hacktoberfest-2023-insights.png" |
||||
|
title="Screenshot of the Ghostfolio’s Hacktoberfest 2023 Insights" |
||||
|
/> |
||||
|
</a> |
||||
|
<figcaption class="figure-caption text-center"> |
||||
|
Screenshot of the Ghostfolio’s Hacktoberfest 2023 Insights |
||||
|
</figcaption> |
||||
|
</figure> |
||||
|
</p> |
||||
|
<p> |
||||
|
All these contributions made during Hacktoberfest have a significant |
||||
|
impact on Ghostfolio. As many as 100 new |
||||
|
<a [routerLink]="routerLinkFeatures">features</a> and improvements |
||||
|
have been merged to enhance the user experience and software |
||||
|
platform management. |
||||
|
</p> |
||||
|
<p class="text-center"> |
||||
|
<img |
||||
|
alt="Hacktoberfest 2023 Badges" |
||||
|
class="figure-img img-fluid rounded w-50" |
||||
|
src="../assets/images/blog/hacktoberfest-2023-badges.png" |
||||
|
title="Hacktoberfest 2023 Badges" |
||||
|
/> |
||||
|
</p> |
||||
|
<p> |
||||
|
The lessons learned through this global collaboration highlight the |
||||
|
collective spirit of the open source community, even without |
||||
|
traditional incentives. It serves as a driving force for Ghostfolio |
||||
|
to evolve into an exceptional piece of open source wealth management |
||||
|
software. Hacktoberfest 2023 has been an amazing and enlightening |
||||
|
journey for everyone involved. |
||||
|
</p> |
||||
|
</section> |
||||
|
<section class="mb-4"> |
||||
|
<h2 class="h4">Key Takeaways</h2> |
||||
|
<p> |
||||
|
We’ve gathered some valuable takeaways from our experience to |
||||
|
consider for upcoming years. These insights can help us and fellow |
||||
|
open source projects make the most of Hacktoberfest: |
||||
|
</p> |
||||
|
<ul class="list-unstyled"> |
||||
|
<li> |
||||
|
<h3 class="h5">Prepare early</h3> |
||||
|
<p> |
||||
|
Prospective contributors often begin looking for tasks as early |
||||
|
as the end of September. Preparing your project, organizing |
||||
|
issues, and setting clear goals in advance can help you attract |
||||
|
and engage more participants. |
||||
|
</p> |
||||
|
</li> |
||||
|
<li> |
||||
|
<h3 class="h5">Meet formal requirements</h3> |
||||
|
<p> |
||||
|
Ensure that your project aligns with Hacktoberfest’s formal |
||||
|
requirements and rules. Properly tag issues, provide clear |
||||
|
guidelines for contributions, and make sure your project is |
||||
|
accessible to newcomers. |
||||
|
</p> |
||||
|
</li> |
||||
|
<li> |
||||
|
<h3 class="h5">Allocate sufficient time</h3> |
||||
|
<p> |
||||
|
Being responsive and providing support to participants is |
||||
|
crucial. Allocate enough time to answer questions, review and |
||||
|
merge pull requests, and offer guidance to first-time |
||||
|
contributors. This level of support can significantly enhance |
||||
|
the experience for both contributors and maintainers. |
||||
|
</p> |
||||
|
</li> |
||||
|
<li> |
||||
|
<h3 class="h5">Provide clarity in descriptions</h3> |
||||
|
<p> |
||||
|
When creating issues for Hacktoberfest, be as clear as possible |
||||
|
in your descriptions. Including screenshots, links to code |
||||
|
examples, and detailed instructions can make it easier for |
||||
|
contributors to understand and complete the task successfully. |
||||
|
</p> |
||||
|
</li> |
||||
|
<li> |
||||
|
<h3 class="h5">Isolate tasks</h3> |
||||
|
<p> |
||||
|
Ideally, focus on tasks that are approachable for beginners, as |
||||
|
the setup and frameworks used can already be quite challenging. |
||||
|
This way, you can attract a wider range of contributors. |
||||
|
</p> |
||||
|
</li> |
||||
|
<li> |
||||
|
<h3 class="h5">Embrace learning</h3> |
||||
|
<p> |
||||
|
Understand that not every attempt will result in a successful |
||||
|
contribution. It’s okay if a contributor’s pull request doesn’t |
||||
|
make it into the project. Encourage a learning mindset and |
||||
|
provide constructive feedback, helping contributors grow and |
||||
|
improve over time. |
||||
|
</p> |
||||
|
</li> |
||||
|
</ul> |
||||
|
<p> |
||||
|
By following these takeaways, we can ensure a rewarding experience |
||||
|
for everyone taking part in future Hacktoberfest events. |
||||
|
</p> |
||||
|
</section> |
||||
|
<section class="mb-4"> |
||||
|
<h2 class="h4">Thank you</h2> |
||||
|
<p> |
||||
|
Our experience with Hacktoberfest truly showcases the magic of open |
||||
|
source. The sense of community, mentorship, and our shared |
||||
|
dedication to software development is what motivates us at |
||||
|
Ghostfolio. As we look forward to future collaborations to make |
||||
|
personal finance and investing more accessible, we simply want to |
||||
|
thank everyone involved. |
||||
|
</p> |
||||
|
<p> |
||||
|
Keep coding and sharing your learnings!<br /> |
||||
|
Thomas from Ghostfolio |
||||
|
</p> |
||||
|
</section> |
||||
|
<section class="mb-4"> |
||||
|
<ul class="list-inline"> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge badge-light">Code</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">Community</span> |
||||
|
</li> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge badge-light">Development</span> |
||||
|
</li> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge badge-light">Feature</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">GitHub</span> |
||||
|
</li> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge badge-light">Hacktoberfest</span> |
||||
|
</li> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge badge-light">Investing</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">Learning</span> |
||||
|
</li> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge badge-light">Lessons learned</span> |
||||
|
</li> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge badge-light">Mindset</span> |
||||
|
</li> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge badge-light">October</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">Personal Finance</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">Programming</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">Takeaways</span> |
||||
|
</li> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge badge-light">User Experience</span> |
||||
|
</li> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge badge-light">UX</span> |
||||
|
</li> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge badge-light">Wealth</span> |
||||
|
</li> |
||||
|
<li class="list-inline-item"> |
||||
|
<span class="badge badge-light">Wealth Management</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" |
||||
|
> |
||||
|
Hacktoberfest 2023 Debriefing |
||||
|
</li> |
||||
|
</ol> |
||||
|
</nav> |
||||
|
</article> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
@ -0,0 +1,31 @@ |
|||||
|
import { CommonModule } from '@angular/common'; |
||||
|
import { Component } from '@angular/core'; |
||||
|
import { MatButtonModule } from '@angular/material/button'; |
||||
|
import { RouterModule } from '@angular/router'; |
||||
|
|
||||
|
import { products } from '../products'; |
||||
|
|
||||
|
@Component({ |
||||
|
host: { class: 'page' }, |
||||
|
imports: [CommonModule, MatButtonModule, RouterModule], |
||||
|
selector: 'gf-eightfigures-page', |
||||
|
standalone: true, |
||||
|
styleUrls: ['../product-page-template.scss'], |
||||
|
templateUrl: '../product-page-template.html' |
||||
|
}) |
||||
|
export class EightFiguresPageComponent { |
||||
|
public product1 = products.find(({ key }) => { |
||||
|
return key === 'ghostfolio'; |
||||
|
}); |
||||
|
|
||||
|
public product2 = products.find(({ key }) => { |
||||
|
return key === 'eightfigures'; |
||||
|
}); |
||||
|
|
||||
|
public routerLinkAbout = ['/' + $localize`about`]; |
||||
|
public routerLinkFeatures = ['/' + $localize`features`]; |
||||
|
public routerLinkResourcesPersonalFinanceTools = [ |
||||
|
'/' + $localize`resources`, |
||||
|
'personal-finance-tools' |
||||
|
]; |
||||
|
} |
@ -0,0 +1,31 @@ |
|||||
|
import { CommonModule } from '@angular/common'; |
||||
|
import { Component } from '@angular/core'; |
||||
|
import { MatButtonModule } from '@angular/material/button'; |
||||
|
import { RouterModule } from '@angular/router'; |
||||
|
|
||||
|
import { products } from '../products'; |
||||
|
|
||||
|
@Component({ |
||||
|
host: { class: 'page' }, |
||||
|
imports: [CommonModule, MatButtonModule, RouterModule], |
||||
|
selector: 'gf-finwise-page', |
||||
|
standalone: true, |
||||
|
styleUrls: ['../product-page-template.scss'], |
||||
|
templateUrl: '../product-page-template.html' |
||||
|
}) |
||||
|
export class FinWisePageComponent { |
||||
|
public product1 = products.find(({ key }) => { |
||||
|
return key === 'ghostfolio'; |
||||
|
}); |
||||
|
|
||||
|
public product2 = products.find(({ key }) => { |
||||
|
return key === 'finwise'; |
||||
|
}); |
||||
|
|
||||
|
public routerLinkAbout = ['/' + $localize`about`]; |
||||
|
public routerLinkFeatures = ['/' + $localize`features`]; |
||||
|
public routerLinkResourcesPersonalFinanceTools = [ |
||||
|
'/' + $localize`resources`, |
||||
|
'personal-finance-tools' |
||||
|
]; |
||||
|
} |
@ -0,0 +1,31 @@ |
|||||
|
import { CommonModule } from '@angular/common'; |
||||
|
import { Component } from '@angular/core'; |
||||
|
import { MatButtonModule } from '@angular/material/button'; |
||||
|
import { RouterModule } from '@angular/router'; |
||||
|
|
||||
|
import { products } from '../products'; |
||||
|
|
||||
|
@Component({ |
||||
|
host: { class: 'page' }, |
||||
|
imports: [CommonModule, MatButtonModule, RouterModule], |
||||
|
selector: 'gf-rocket-money-page', |
||||
|
standalone: true, |
||||
|
styleUrls: ['../product-page-template.scss'], |
||||
|
templateUrl: '../product-page-template.html' |
||||
|
}) |
||||
|
export class RocketMoneyPageComponent { |
||||
|
public product1 = products.find(({ key }) => { |
||||
|
return key === 'ghostfolio'; |
||||
|
}); |
||||
|
|
||||
|
public product2 = products.find(({ key }) => { |
||||
|
return key === 'rocket-money'; |
||||
|
}); |
||||
|
|
||||
|
public routerLinkAbout = ['/' + $localize`about`]; |
||||
|
public routerLinkFeatures = ['/' + $localize`features`]; |
||||
|
public routerLinkResourcesPersonalFinanceTools = [ |
||||
|
'/' + $localize`resources`, |
||||
|
'personal-finance-tools' |
||||
|
]; |
||||
|
} |
@ -0,0 +1,31 @@ |
|||||
|
import { CommonModule } from '@angular/common'; |
||||
|
import { Component } from '@angular/core'; |
||||
|
import { MatButtonModule } from '@angular/material/button'; |
||||
|
import { RouterModule } from '@angular/router'; |
||||
|
|
||||
|
import { products } from '../products'; |
||||
|
|
||||
|
@Component({ |
||||
|
host: { class: 'page' }, |
||||
|
imports: [CommonModule, MatButtonModule, RouterModule], |
||||
|
selector: 'gf-vyzer-page', |
||||
|
standalone: true, |
||||
|
styleUrls: ['../product-page-template.scss'], |
||||
|
templateUrl: '../product-page-template.html' |
||||
|
}) |
||||
|
export class VyzerPageComponent { |
||||
|
public product1 = products.find(({ key }) => { |
||||
|
return key === 'ghostfolio'; |
||||
|
}); |
||||
|
|
||||
|
public product2 = products.find(({ key }) => { |
||||
|
return key === 'vyzer'; |
||||
|
}); |
||||
|
|
||||
|
public routerLinkAbout = ['/' + $localize`about`]; |
||||
|
public routerLinkFeatures = ['/' + $localize`features`]; |
||||
|
public routerLinkResourcesPersonalFinanceTools = [ |
||||
|
'/' + $localize`resources`, |
||||
|
'personal-finance-tools' |
||||
|
]; |
||||
|
} |
After Width: | Height: | Size: 263 KiB |
After Width: | Height: | Size: 227 KiB |
File diff suppressed because it is too large
File diff suppressed because it is too large
File diff suppressed because it is too large
File diff suppressed because it is too large
File diff suppressed because it is too large
File diff suppressed because it is too large
File diff suppressed because it is too large
File diff suppressed because it is too large
@ -0,0 +1,2 @@ |
|||||
|
-- AlterTable |
||||
|
UPDATE "Account" SET "accountType" = NULL; |
Can't render this file because it has a wrong number of fields in line 3.
|
Can't render this file because it has a wrong number of fields in line 4.
|
Loading…
Reference in new issue