Giter Club home page Giter Club logo

dcapal's Introduction

About

DcaPal is a pragmatic Dollar Cost Averaging tool for passive investors like me: financially-educated people managing their own portfolios of not-too-many assets replicating major world indices.

I was facing a common problem: it's that time of the month, got some savings to invest and have to split them across my portfolio assets. How the heck can I do it so that my portfolio stays balanced?

Hence DcaPal. You come here every week/month/quarter, build your portfolio, define asset allocation in percentage, input how much you want to invest and let the algorithm do the splitting for you.

Getting started

You can start using DcaPal right away. It's free. No registration required.

Build your own portfolio or, if you don't know where to start, explore our Demo portfolios:

Build Instructions

DcaPal does not store any user data. But if you are still concerned for your privacy, you can build and run it on your machine.

Start Docker environment

cd dcapal-backend
docker compose -f docker-compose.yml -f docker/docker-compose.dev.yml up -d

(Note: if you're using a Mac with an ARM processor, you should replace (in the docker-compose dev file) Cadvisor's image version with gcr.io/cadvisor/cadvisor:v0.47.1 and set platform: linux/aarch64)

Run DcaPal backend

Prepare dcapal.yml config file

cd dcapal-backend
cp config/dcapal/dcapal.yml dcapal.yml

Compile and start backend service

cargo run --release

Run DcaPal frontend

Build DcaPal Optimizer

cd dcapal-optimizer-wasm
curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
wasm-pack build --release

Install NPM dependencies. Note: this is installing dcapal-optimizer-wasm package as well.

cd ../dcapal-frontend
npm install # Install dcapal-optimizer-wasm pkg as well

Run frontend server

npm run start

Architecture

flowchart LR
    Frontend[Frontend] ---|"/api/external/search?q={query}<br>/api/external/chart/${symbol}"|nginx[nginx]
    subgraph dcapal.com
        nginx---TradFiProvider[TradFi Provider]
        nginx---Backend[Backend]
        Backend---CryptoProvider[Crypto Provider REST API]
        Backend---|"/assets/fiat<br>/assets/crypto<br>/price/{base}?quote={quote}"|Redis[Redis]
    end

Contributing

Contributions and suggestions about how to improve this project are welcome! Please follow our contribution guidelines.

Thanks to all Contributors ❤️

Born as a personal Sunday morning project, DcaPal would have never grown so much without the help of heros willing to contribute with their time and work. Thank you very much ya all!

dcapal's People

Contributors

corradopetrelli avatar dependabot[bot] avatar kristianlentino99 avatar leonardoarcari avatar mattiapitossi avatar pietrograndi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

dcapal's Issues

[Feature]: Implement Single Sign-On (SSO) with E2EE Data Protection for Login and Registration

Background

DcaPal currently supports portfolio export, but this feature doesn't provide a seamless user experience. Users face challenges due to the lack of synchronization across devices, necessitating manual portfolio transfers. Additionally, the absence of personalized user areas in the app restricts users from effectively managing and engaging with their portfolios.

The objective is to introduce a Single Sign-On (SSO) solution in our application for user login and registration, addressing the current limitation where users cannot sign up and consequently cannot save their portfolios. This update aims to enhance user experience by providing data persistence and robust data protection.

Requiremens

  1. Explore SSO integration solutions
  2. Handle Data (Data Protection) and look for E2EE solutions
  3. UI/UX offers a smooth Login/Registration funnel
  4. Add E2E testing

ACs

  • Successful integration of SSO for login and registration.
  • Compliance with data protection regulations.
  • No critical bugs or security vulnerabilities post-implementation.

Useful Links
https://www.dolthub.com/blog/2023-11-08-building-sso-for-your-web-app/

[Bug]: OPT Problems get never deleted causing WASM memory leak

🐞 Bug Report

Describe the bug

When the client allocates some budget, it creates a new optimization problem in OPT and later solves it. Thing is, solved problems get never deleted, growing WASM heap over and over and eventually exhausting it.

The right approach is to add a Solver::delete_problem() function for the FE to call to clean OPT resources and free up memory after optimization has finished.

Is this a regression?

No

To Reproduce

  1. Build portfolio
  2. Allocate budget
  3. Repeat many many times
  4. ⚠️ FE crashes with WASM heap out of memory

Expected behaviour

  • Memory is freed-up after problem has been solved

Your environment

  • OS: Windows 11
  • Node version: v18.16.0
  • Npm version: v9.5.1
  • Browser name and version: Google Chrome v119.0.6045.160

[Enhancement]: Introduce an utils to format raw data to show

🚀 Enhancement Request

In the codebase it necessary to extract format feature to be complain to single responsibility principle. For instance in many places in the codebase there is this pattern:

rawValue.toLocaleString(i18n.language, options)

Extract this functionality should be useful to reduce codebase.

Is your enhancement request related to a problem? Please describe.

/

Describe the solution you'd like

  • Extract formatting logic in a separated file

Describe alternatives you've considered

/

Additional context

/

[Bug]: Missing suggested quantities to BUY/SELL when fractional shares are enabled

🐞 Bug Report

Description

When running the allocation step with fractional shares, the quantities to buy/sell in the last step are not present


To Reproduce

  1. Go to the allocation step
  2. Deselect the option "Don't split whole shares"
  3. Run Allocation
  4. Quantities are not present

Expected behaviour

Quantities must be shown in the last step


Add `/import` endpoint to enable integration with third-party tools

Overview

Add an /import endpoint to enable third-party tools to integrate with DcaPal by automatically importing their portfolio from a valid JSON file.

Action items

  • Add a POST /api/import endpoint to BE, validating and storing JSON temporarily in Redis (size limit, evicted in < 30 secs)
  • Endpoint attaches a unique id to the JSON file and redirects client to some /import?p=<id> FE route
  • FE fetches the JSON and runs the existing code to import the portfolio, load prices etc.
  • Put new BE endpoint behind rate limiting in Cloudflare. Think this should scale well, enabling third-party integrations while still preventing malicious users to DOS our BE.

References

Suggested by /u/FuocoFatuo on Reddit (link)

[Enhancement]: Replace `ImageKit` component with `<img>`

🚀 Enhancement Request

Now that we introduced Webpack's Asset Modules, there's no longer need for ImageKit component: it's cumbersome, makes image handling hard and it doesn't speed up image fetching at all. DcaPal is served behind Cloudflare which already does all the caching we need.

Describe the solution you'd like

Let's replace ImageKit with good old <img> tags importing assets from /images folder

[Bug]: Error during dcapal-optimizer-wasm building

🐞 Bug Report

Describe the bug

Compiling the optimizer in the v0.3.1 branch fails.
The steps in README.md were followed


To Reproduce

  1. Position yourself on the branch to rc/0.3.1
  2. Position yourself on the folder to dcapal-optimizer-wasm
  3. I try to run wasm-pack build --release
  4. Following error appears:
[INFO]: 🎯  Checking for the Wasm target...
[INFO]: 🌀  Compiling to Wasm...
   Compiling dcapal-optimizer-wasm v0.3.0 (/Users/corrado/Documents/dcapal/dcapal-optimizer-wasm)
error[E0499]: cannot borrow `solution.assets` as mutable more than once at a time
   --> dcapal-optimizer-wasm/src/optimize/advanced.rs:267:51
    |
184 |         let mut open_assets = under_allocated_view(&mut solution.assets);
    |                                                    -------------------- first mutable borrow occurs here
...
267 |                 open_assets = refresh_open_assets(&mut solution.assets, &budget_left);
    |                 -----------                       ^^^^^^^^^^^^^^^^^^^^ second mutable borrow occurs here
    |                 |
    |                 first borrow might be used here, when `open_assets` is dropped and runs the `Drop` code for type `Vec`

For more information about this error, try `rustc --explain E0499`.
error: could not compile `dcapal-optimizer-wasm` due to previous error
Error: Compiling your crate to WebAssembly failed
Caused by: Compiling your crate to WebAssembly failed
Caused by: failed to execute `cargo build`: exited with exit status: 101
  full command: cd "/Users/corrado/Documents/dcapal/dcapal-optimizer-wasm" && "cargo" "build" "--lib" "--release" "--target" "wasm32-unknown-unknown"

Expected behaviour

  • I expect a correct compilation without errors

Media prove

Nothing


Your environment

  • OS: macOS 12.2.1 (21D62) with Apple Silicon
  • Node version: v16.15.0
  • Npm version: v8.5.5
  • Browser name and version: /
  • Cargo version: cargo 1.69.0 (6e9a83356 2023-04-12)

Additional context

  • It works on the branch v0.2.2

[Bug]: NaN problem in allocation when it is not possible to allocate any assets

🐞 Bug Report

Describe the bug

There is a problem with the weight percentage, in some cases it results in NaN.


Is this a regression?

I test this only in master (v0.5.0)


To Reproduce

  1. Choose currency
  2. Choose an asset (I have 0 unit of this asset and I want a 100% weight)
  3. I want to allocate my liquidity but this is less than unit price of my selected asset
  4. All my liquidity is unallocated
  5. ⚠️ NaN weight on my asset ⚠️

Expected behaviour

Asset with 0% weight instead of NaN


Media prove

Registrazione.schermo.2023-11-11.alle.12.36.18.mov

Your environment

OS: macOs
Node version: 18.18.1
Npm version: 9.8.1
Browser name and version: Chrome 119


Additional context

/

[Enhancement]: Add GDPR-Compliant Banner for User Consent Regarding IP Location Data Collection

🚀 Enhancement Request

Background

EU laws require people to explicitly consent to collect their data as the IP address is considered personal data. In our case, we collect IP location data, and it is crucial to introduce a mechanism to obtain user consent for this specific data processing.

Proposal

In order to achieve GDPR compliance, we need to implement a user notification banner that informs users about the usage of their data and allows them to either accept or reject it.

When users choose to reject the usage of their data, a header should be added to requests to prevent the collection of their IP.

We could use the following plugin https://github.com/orestbida/cookieconsent

[Enhancement]: Move Transaction Fees component out of Settings button.

🚀 Enhancement Request

As a user I would like to have the fees box always visibile and easy to access. For this reason the "Filter" like button is redundant and can be removed.
image


Describe the solution you'd like

We should move the Fees block on the left side of the "Portfolio Assets" section (sidebar) and remove the useless button on the top right side.
Screenshot 2023-09-30 at 21 49 14

[FEATURE] Improve the user experience of the assets search bar

Issue Description

According to me the search logic is improvable.
As you can see in the following GIF when you type a character, a new API fetch is executed (It is clear from the fact that every time there is a loading phase)
Problem

Proposal

Integrate orama to load all assets (or some of these), in this way the number of API calls is minimized (assets are hardly added in a short instant of time).
When the search bar loads, the user will already have the required values without having to wait.

Advantages

  • Minimize API call of assets data
  • Improve user experience
  • Data are ready to be used
  • Orama is a very fast full-text search engine. It is adapt to this use case

[Proposal]: Multiple portfolios support

🚀 Feature Proposal

As of today DcaPal supports building and optimizing a single portfolio at a time. If users want to work on multiple portfolios, they need to export the current one, delete it and create or import a new one. This is cumbersome and should be fixed. Let's build multiple portfolios support.

This issue specs out an idea brainstormed in Discussion #60.

Describe the solution you'd like

Multiple portfolios support should allow the user to:

  • View all their portfolios
  • Create a new portfolio
  • Modify name of an existing portfolio
  • Delete an existing portfolio
  • Duplicate an existing portfolio
  • Importing a portfolio adds it to the list of portfolios
  • Export/import all portfolios

Out of scope

The following items should be considered out of scope:

  • Changing portfolio currency

Additional context

This is a proposed user journey.

image

Tracking PRs

Misc FE improvements

Action items

  • Sunset ImageKit (which is penalizing Lighthouse score and makes asset management less agile)
  • Replace ImageKit with Webpack's Asset Modules
  • Fix text wrapping in EndStep in mobile view
image

Rust: fix workspace config

  • Profiles for non root package
warning: profiles for the non root package will be ignored, specify profiles at the workspace root:
package:   C:\Users\leonardoarcari\Development\rust\dcapal\dcapal-optimizer-wasm\Cargo.toml
workspace: C:\Users\leonardoarcari\Development\rust\dcapal\Cargo.toml
  • Crates resolver v2
warning: some crates are on edition 2021 which defaults to `resolver = "2"`, but virtual workspaces default to `resolver = "1"`
note: to keep the current resolver, specify `workspace.resolver = "1"` in the workspace root's manifest
note: to use the edition 2021 resolver, specify `workspace.resolver = "2"` in the workspace root's manifest
  • Move shared crate dependencies to workspace root (link)

Restore unique visitors + IP location metrics

🚀 Enhancement Request

Background

At the very beginning of DcaPal life, backend collected unique visitors + IP geo location metrics to display in Grafana. The feature was backed by a third-party service (ipapi.com) that provided geo data for an input IP address.

Data was collected and streamed to Prometheus to display in a Grafana dashboard.

The feature was later suspended for two reasons:

  • ipapi has a 1k requests/month limit which quickly became unreasonable (especially given the many failed requests)
  • Geo metrics were suspected to cause too many metric points exhausting free Grafana quota. We later discovered that was not the root cause

Proposal

Let's bring geo location back! This time, even cooler.

Turns out, ip2location.com offers free monthly-updated binary files mapping IPs to their geo location. That's such a de-facto standard for IP location that many libraries exist to consume those binaries and offer a handy hash map to localize IPs offline.

Here's a rough plan:

  • Integrate ip2location lib in backend
  • Add an IP2Location service wrapping loading and lookup
  • Redirect calls to ipapi to IP2Location
  • Add a dcapal.yml option to set ip2location file path
  • Setup a Cloudflare R2 bucket to store monthly updated ip2location DB files (free)
  • Add a deploy step downloading latest ip2location file from R2
  • Deploy the bin file with the rest of the bundle

[Proposal] Suggest the minimum investment amount for reach the target allocation

Background

Currently, the web application allows users to insert their assets with target allocations and specify the investment amount. The algorithm then calculates the quantity of each asset to buy/sell while maintaining the balanced weight of ETFs. However, there's an enhancement that could improve the user experience by providing information about the minimum investment required to reach the desired target allocation.

Proposed Functionality

Before users input the investment amount, the application should provide an estimate of the minimum investment required to achieve the specified target allocation.

For instance, consider the following scenario:

ETF1: Quantity 7, Target Allocation 90%, Price 10€
ETF2: Quantity 0, Target Allocation 10%, Price 10€
In this example, the algorithm should calculate and display a message indicating that a minimum investment of at least 30€ is required to achieve the desired target allocation.

Use case

  • The user loads or inputs the composition of their portfolio.
  • The algorithm suggests the minimum amount to invest to reach the desired target allocation.
  • The user can choose to invest the suggested amount

[Migration]: From Webpack to Vite

🚀 Enhancement Request

Vite is a frontend devtool that is very popular, it is becoming the de facto standard for building web applications.

It offer a significant faster build times and it has a built-in HMR and automatically resolves JS and JSX files.
In my opinion it could give a boost to the application in terms of performance and dev experience.


Describe the solution you'd like

  • Install Vite
  • Create a Vite configuration
  • Configure output and public path
  • Configure rules for JS and CSS
  • Substitute webpack plugin with vite plugin:
    • html-webpack-plugin to vite-plugin-html
    • copy-webpack-plugin: useless, you can copy static assets to public directory and Vite will serve them as-is
  • experiments.asyncWebAssembly configuration to package vite-plugin-wasm
  • experiments.syncWebAssembly: useless (?)
  • Migrate dev settings to Vite
  • Migrate production settings to Vite

[Bug]: Error on not found page and error page

🐞 Bug Report

Describe the bug

  • Error page is not loaded
  • Not found page is not loaded
  • Demo pages are not loaded

Is this a regression?

/


To Reproduce

  1. Go to dcapal.com/foo
  2. Blank page will be shown

Expected behaviour

  • Required page should be shown

Media prove

/

Your environment

  • OS: macOs
  • Node version: 16.15.0
  • Npm version: 8.5.5
  • Browser name and version: Chrome 117

Additional context

/

[Enhancement]: Allow users to exhaust all their budget

🚀 Enhancement Request

As of today, DcaPal allocates funds to assets until they meet their target allocation, never over-weighing them. This leads to some cash being left unallocated. The issue is even more visibile when the following conditions apply:

  • Most assets are non-fractional
  • Trading fees are high

One might desire to always see their budget fully allocated, even though it results in overweighing some asset, knowing that they'll rebalance their portfolio the month after with new liquidity.

This issue specs out an idea brainstormed in Discussion #60.

Describe the solution you'd like

A possible algorithm to overcome this issue could be

  • Allocate cash according to target weights as of today
  • Spread remaining cash on assets with non-zero allocated amount (so that we ignore assets with too high transaction fees), starting from the one furthest from target allocation

[Enhancement]: Add more e2e to the codebase

🚀 Enhancement Request

To have a more consistent and stable project, we should add a few e2e tests which tests the following scenarios. We should basically create some fake portfolio and tests the correct behaviour of the website given the scenarios describe below.


Describe the solution you'd like

  • An e2e that tests the user portfolio allocation with no fees.
  • An e2e that tests the user portfolio allocation with fixed fees (19 euros per order for example).
  • An e2e that tests the user portfolio allocation with variable fees.
  • An e2e that tests when the user remove the check "Use the tax efficient algorithm" in order to calculate both buys and sells.
image

Describe alternatives you've considered

Any other test scenarios which can be useful are always welcomed!


Additional context

  • We use Playwright in our CI to run e2e tests

Fix false-positive warnings in BE logs

🐞 Bug Report

Describe the bug

  1. ETH2.S asset should be normalized to ETH

Fixes false warnings:

Price for market 'eth2.s/eur' not available
Cannot find any of markets: 'eth2.susd', 'usdeth2.s'
  1. IP already exists (due to race condition)

Fixes false warnings:

Failed to store visitor ip (<some-ip>) from IpApi

Is this a regression?

No

[Enhancement]: Introduce aliases to avoid double dots in imports

🚀 Enhancement Request

When you move a file between folders are there different points where codebase changes.
For instance from:

./../../../../foo.js

If you move foo to parent folder all file that depends from foo changes is relative path and in review phase is difficult to read.

./../../../foo.js

Is your enhancement request related to a problem? Please describe.

/


Describe the solution you'd like

  • Webpack aliases, for instance define some checkpoint like: @app, @core ...

In this way the relative path will be:

@app/folder/folder2/foo.js

If you move to parent folder will be

@app/folder/foo.js

Describe alternatives you've considered

/


Additional context

/

Bug: Division by zero on portfolio with zero quantities and zero budget

Summary

Reported by u/gionn on Reddit (link)

panicked at 'Division by zero', /home/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/rust_decimal-1.29.0/src/arithmetic_impls.rs:219:45

Fix

  • FE: Disable Run Allocation button if budget + portfolio amount <= 0
  • OPT: Check pre-condition on budget + portfolio amount > 0

Do not weigh unallocated cash if portfolio does not have liquidity position

🐞 Bug Report

Describe the bug

As of today, DcaPal accounts unallocated cash from optimization, weighing on user's portfolio. As a result, even if the algorithm allocated a positive amount on real portfolio assets, the new weight might be lower than the original one, due to unallocated cash effect.

This behavior was implemented as a way to support Portfolios with cash positions, but it's undoubtedly misleading in all other scenarios.


Is this a regression?

No, undesired feature.


To Reproduce

  1. Build portfolio
  • 10 SWDA.MI, target 70%
  • 4 IMEA.SW, target 20%
  • 5 EIMI.L, target 10%
  1. Allocate €250
  2. Optimize

Expected behaviour

  • Expected to Buy 2 SWDA.MI, rest is unallocated
  • Expected to see SWDA.MI new weight increased

[Feature]: Introduce IT translation

🚀 Feature Request

  • Introduce IT translation

Describe the solution you'd like

  • Integrate react-i18next
  • Build data structure to manage translation
  • Introduce Italian translation

Describe alternatives you've considered

Nothing


Additional context

In my opinion it is necessary to scale the application

[Proposal] Rootcard in row grouped by 2

What do you think about having the cards in the homepage grouped by 2 in the same row? it allow the website to be shorter and needs less scroll. It's also easier to read it.

image

On mobile instead it will remain the same as now:
image

[Feature]: Tour component for Portfolio

🚀 Feature Request

Is your feature request related to a problem? Please describe.

Introduce a tour of Dcapal feel like Ant Design Tour to describe all functionalities


Describe the solution you'd like

Any suggestion are welcome


Describe alternatives you've considered

/


Additional context

/

[Feature]: Introduce exporting of suggested allocation (PNG + JSON)

🚀 Feature Request

Is your feature request related to a problem? Please describe.

Add a button to export the suggested allocation:

  • In JSON format: to be able to use it in case it is applied to your portfolio to use it for the subsequent allocation
  • In PNG format: to be able to use it as a reminder as a note for your broker being more human-readable

Describe the solution you'd like

As described a button here:
image


Describe alternatives you've considered

A button with a menu like that with the following options:

  • PNG
  • JSON
  • JSON + PNG
    image

Additional context

/

Optimization constraint over transaction costs

Summary

Some brokers apply non-negligible transaction fees that can make investing small amounts quite costly. As suggested in this Reddit comment, investors may want to increase their positions only if transaction fees represent less than some percentage limit of the invested amount.

DcaPal should provide a transaction fees aware optimizer that refuses to invest on an asset if fees are greater than a user-defined percentage.

Design proposal

Brokers implement the most creative fee structures, varying based on number of trades made per year, size of the investment or asset class. Despite that, they all come down to:

  • Absolute fee (e.g. €5 per trade)
  • Percentage fee with minimum and maximum (e.g. 0.19% min €1.5 max 18€)

DcaPal should allow a user to define their fee structure and maximum fee rate ($\hat{r_i}$) they are willing to spend. After computing the amount $a_i$ to allocate on asset $i$, the OPT should compute the impact of fee $f_i$ on the investment.

$$ \frac{f_i}{a_i} > \hat{r_i} \Rightarrow \text{Revert the allocation} $$

Note: Budget reduction due to fees is out of scope, i.e. OPT should allocate the budget as if no fees are due.

UI changes

  • Add general fee structure component in PortfolioStep with the following options
    • No fees
    • Absolute fees with InputNumber for the amount
    • Percentage fees with percentage, min and max amounts
  • Add fee structure component under Advanced section of AssetCard to set asset-specific fee structure
  • Add what-if fee impact on unallocated assets because of too high fees:
    • Amount would have invested
    • Fee would have paid
    • Fee impact
Mockups
mockup

[Proposal] Add Dynamic DCA Investment Strategy to DcaPal

Background

In traditional Dollar Cost Averaging, an investor allocates a fixed amount of money at regular intervals (e.g., weekly, monthly) to purchase a specific asset, regardless of price. This approach aims to reduce the impact of market volatility and lower the average purchase price over time. The idea behind dynamic DCA is to increase the investment amount when the market is experiencing a downtrend or when prices are lower, this allows the investor to buy more of the asset when it's cheaper.

Proposed Functionality

The user has the option to select the Dynamic DCA investment strategy, the investment amount would be calculated based on the following parameters (users can customize these defaults):

Average Cost Price variation Periodic Investment Multiplier
-10% 100€ 1
Between -10% and -15% 125€ 1.25
Between -15% and -20% 150€ 1.5
-20% or worse 175€ 1.75

The implementation should consider that the Average Buy Price variation must be calculated across all assets as a weighted average.

Use case

  • The user loads or inputs the composition of their portfolio with the corresponding ABP for each asset.
  • The user specifies the amount they wish to invest.
  • The user selects the option to calculate the Dynamic DCA strategy.
  • If the average Average Cost Price is lower than 10%, the algorithm suggests investing an additional amount.

Refresh prices

Refresh prices older than 5 minutes

  • Store timestamp in Redux
  • Set timer in useEffect() in portfolioStep
  • Show a toast upon refresh

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.