Giter Site home page Giter Site logo

assetgrid / assetgridapp Goto Github PK

View Code? Open in Web Editor NEW
119.0 3.0 3.0 5.39 MB

๐Ÿ“Š A selfhosted data-driven personal finance manager ๐Ÿ’ธ

Home Page: https://assetgrid.app

License: GNU Affero General Public License v3.0

HTML 0.12% TypeScript 48.19% SCSS 1.56% JavaScript 0.58% C# 49.52% Dockerfile 0.03%
personal-finance-manager personal-finances selfhosted budgeting money finances expenses

assetgridapp's People

Contributors

alex6480 avatar milkyware avatar sebastianmarines avatar shalak 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  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

assetgridapp's Issues

Multiple issues importing CSV

Our goal is for Assetgrid's CSV importer to be flexible enough to import any CSV file, but we know that some banks aren't exactly keen on following standards.

Describe the issue
What is the problem when importing the CSV file?

  1. Importer does not understand common US date format (MM/dd/yyyy)
  2. Importer does not allow for files with withdrawals and deposits in separate cols

Describe what is needed to resolve the issue
What do you think it would take to be able to import the CSV file. How can it be integrated into the existing process?

  1. This would be solved by recognizing common formats used in the US
  2. This would be solved by allowing separate cols for withdraws and deposits (also it would be nice to have balance to rationalize).

Upload a sample
test.csv

Feature request: money transfers between own accounts

I am using accounts in the suggested way, that MY accounts are included in the net worth.
Now, when I transfer money between such accounts, on the Dashboard, such transactions are shown as Expense / Revenue.
In my opinion it makes confusion, as such transaction is not an expense at all, I do not own less money because of transaction between my account.
I think filtering transactions when transfer is between accounts, which are included (both) in net worth would make Dashboard more closer to the reality.

Problems with assetgrid container

Describe the bug
When I use the "standard"/example docker compose found in the docs, I get an error which continuously makes the container exit/stop.

To Reproduce
Steps to reproduce the behavior:

  1. Make the docker-compose.yml with the example found in the docs or make a new stack in Portainer.
  2. Start the stack/use docker compose up
  3. Wait
  4. See error in logs (either via CMD or Portainer GUI)

Expected behavior
Assetgrid container starts

Desktop (please complete the following information):

  • OS: macOS Monterey and Windows 10
  • Browser: Brave
  • Version: 1.44.108

Server (please complete the following information):

  • OS: Debian 11 with Proxmox kernel
  • Docker + Portainer
  • Docker Version: 20.10.18

Additional context
Logs attatched
_assetgrid_logs.txt

Microsoft.EntityFrameworkCore.Model.Validation[10620]

After deploying the docker container the below enter showed up on the logs.

warn: Microsoft.EntityFrameworkCore.Model.Validation[10620]
The property 'TransactionAutomation.Actions' is a collection or enumeration type with a value converter but with no value comparer. Set a value comparer to ensure the collection/enumeration elements are compared correctly.

Architecture used : ARM (Raspberry Pi 4)

docker compose used:

version: "3.1"
services:
db:
image: mariadb:latest
container_name: mariadb
volumes:
- ./mariadb:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret

assetgrid:
  image: assetgrid/assetgrid
  container_name: assetgrid
  links:
    - db:db
  environment:
    CONNECTION_STRING: "Server=db;Database=assetgrid;Uid=assetgrid;Pwd=secret"
  ports:
    - 80:8080

Issue with decimal places

Hi,
1st of all - even if the app is not yet fully usable in my case, I like very much its clean view and simplicity!
I have just installed Assetgrid in the container with MariaDB as DB engine.
I have noticed, that when I put any new (or edit, doesn't matter) transaction, I can't put numbers like 123,45. When I just type . or , character, value in the field is cleared to 0.
I am not sure if it is related, but in DB structure I can see amount value is bigint:
image
In Preferences I have changed decimal separator to ",", and thousands separator to ".". However, even if I rollback this to defaults, behavior is still the same.

Sล‚awek

Use identifiers for accounts

Similar as to how a transaction can have multiple identifiers, accounts should too.

When importing the user has the choice between selecting accounts based on identifiers or selecting the same account for all transactions.
In the transaction page they will be shown a dropdown to select account for transactions with no accounts matching the column. New accounts can also be created. Selecting an account adds the identifier to that account. Similarly there will be an X to remove an identifier from an account.

Add support for custom metadata/field

Assetgrid should support the creation of custom metadata fields like notes, links between transactions, files, and more.
Custom metadata will be integrated into other Assetgrid features such as search, automation and import.

Error when updating account

I tried updating the account for a transaction and received the following error:

Connection id "0HML6UQ8KCRKE", Request id "0HML6UQ8KCRKE:00000002": An unhandled exception was thrown by the application.
assetgrid | System.ArgumentNullException: Value cannot be null. (Parameter 'source')
assetgrid | at System.Linq.ThrowHelper.ThrowArgumentNullException(ExceptionArgument argument)
assetgrid | at System.Linq.Enumerable.Select[TSource,TResult](IEnumerable1 source, Func2 selector)
assetgrid | at assetgrid_backend.Controllers.TransactionController.UpdateTransaction(Transaction dbObject, User user, ViewUpdateTransaction model) in /home/runner/work/assetgridapp/assetgridapp/backend/Controllers/TransactionController.cs:line 434
assetgrid | at assetgrid_backend.Controllers.TransactionController.Update(Int32 id, ViewUpdateTransaction model) in /home/runner/work/assetgridapp/assetgridapp/backend/Controllers/TransactionController.cs:line 212
assetgrid | at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.TaskOfIActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
assetgrid | at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask1 actionResultValueTask) assetgrid | at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted) assetgrid | at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context) assetgrid | at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) assetgrid | at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeInnerFilterAsync>g__Awaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted) assetgrid | at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|20_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted) assetgrid | at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker) assetgrid | at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker) assetgrid | at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger) assetgrid | at assetgrid_backend.Helpers.JwtMiddleware.Invoke(HttpContext context, IUserService userService) in /home/runner/work/assetgridapp/assetgridapp/backend/Helpers/JwtMiddleware.cs:line 29 assetgrid | at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication1 application)

Docker multi-arch support

Is your feature request related to a problem? Please describe.
There is no arm64 or arm32 docker image.

Describe the solution you'd like
Add the following in GitHub workflow.

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v2

      - name: Setup Docker buildx
        uses: docker/setup-buildx-action@v2

      - name: Log in to Docker Hub
      .
      .
      .

      - name: Build and push Docker images
        uses: docker/build-push-action@v2
        with:
          platforms: linux/amd64,linux/arm64  #,linux/arm/v7,linux/arm/v6, linux/386, linux/ppc64le,linux/s390x
        .
        .

You also might have to change some stuff in the backend and frontend buildings

Describe alternatives you've considered
No other alternatives

Additional context
image

version information

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

Describe the solution you'd like
have version information (and maybe release date) listed somewhere?

maybe a little watermark area in the Preferences page, or an about button

Contractors / recipients

When adding a transaction, I would like to have possibility to choose 'contractor', so I can see in which shop, to whom, I've spent my money.

If you do not plan to implement it, then maybe as workaround tags can be used... just thinking.
Or - maybe destination field, when I transfer money between my accounts I can put my other account here, but when I spent money, I can choose where I have paid.

Auto detect date format when importing

Assetgrid should attempt to detect the date format by default, rather than making the user import it, since most date formats can probably be detected automatically.

Suggested in #39

CSV import assigns arbitrary time import date

I was playing around with a docker instance, and created an import, pulling in account data from several sources.

Each transaction is assigned a time (either 10PM or 11PM) despite no time being present in the CSV file. And in the span of a single import, I received both times on the imported transactions.
Screenshot 2022-10-19 104908

Forbid result fails due to missing scheme

Connection id "0HML70B2EVKT5", Request id "0HML70B2EVKT5:00000002": An unhandled exception was thrown by the application.
assetgrid | System.InvalidOperationException: No authenticationScheme was specified, and there was no DefaultForbidScheme found. The default schemes can be set using either AddAuthentication(string defaultScheme) or AddAuthentication(Action configureOptions).
assetgrid | at Microsoft.AspNetCore.Authentication.AuthenticationService.ForbidAsync(HttpContext context, String scheme, AuthenticationProperties properties)
assetgrid | at Microsoft.AspNetCore.Mvc.ForbidResult.ExecuteResultAsync(ActionContext context)
assetgrid | at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|30_0[TFilter,TFilterAsync](ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
assetgrid | at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResultExecutedContextSealed context)
assetgrid | at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.ResultNext[TFilter,TFilterAsync](State& next, Scope& scope, Object& state, Boolean& isCompleted)
assetgrid | at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeResultFilters()
assetgrid | --- End of stack trace from previous location ---
assetgrid | at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|20_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
assetgrid | at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Logged|17_1(ResourceInvoker invoker)
assetgrid | at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Logged|17_1(ResourceInvoker invoker)
assetgrid | at Microsoft.AspNetCore.Routing.EndpointMiddleware.g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
assetgrid | at assetgrid_backend.Helpers.JwtMiddleware.Invoke(HttpContext context, IUserService userService) in /home/runner/work/assetgridapp/assetgridapp/backend/Helpers/JwtMiddleware.

Split transactions no longer work

Describe the bug
A clear and concise description of what the bug is.

To Reproduce
Steps to reproduce the behavior:

  1. Go to '...'
  2. Click on '....'
  3. Scroll down to '....'
  4. See error

Expected behavior
A clear and concise description of what you expected to happen.

Screenshots
If applicable, add screenshots to help explain your problem.

Desktop (please complete the following information):

  • OS: [e.g. iOS]
  • Browser [e.g. chrome, safari]
  • Version [e.g. 22]

Smartphone (please complete the following information):

  • Device: [e.g. iPhone6]
  • OS: [e.g. iOS8.1]
  • Browser [e.g. stock browser, safari]
  • Version [e.g. 22]

Additional context
Add any other context about the problem here.

Use balance column during imports

Many bank exports provide a column with account balance.
This information could be used to double check that the transaction amounts are correct during import, or perhaps even as an alternative way to calculate amounts.

These options should be looked into.

suggested in #39

Bug when updating multiple with greaterthan operator

System.Exception: Operator 'GreaterThan' expects value of type 'System.Int64' but received type System.String
assetgrid | at assetgrid_backend.Data.DataExtensionMethods.SearchGroupToExpression(ViewSearchGroup group, ValueTuple3[] columns, Expression parameter) in /home/runner/work/assetgridapp/assetgridapp/backend/Data/DataExtensionMethods.cs:line 220 assetgrid | at assetgrid_backend.Data.DataExtensionMethods.SearchGroupToExpression(ViewSearchGroup group, ValueTuple3[] columns, Expression parameter) in /home/runner/work/assetgridapp/assetgridapp/backend/Data/DataExtensionMethods.cs:line 262
assetgrid | at assetgrid_backend.Data.DataExtensionMethods.ApplySearch(IQueryable1 items, ViewSearch query, Boolean applyOrder) in /home/runner/work/assetgridapp/assetgridapp/backend/Data/DataExtensionMethods.cs:line 71 assetgrid | at assetgrid_backend.Data.DataExtensionMethods.ApplySearch(IQueryable1 items, ViewSearchGroup query) in /home/runner/work/assetgridapp/assetgridapp/backend/Data/DataExtensionMethods.cs:line 98
assetgrid | at assetgrid_backend.Controllers.TransactionController.UpdateMultiple(ViewUpdateMultipleTransactions request)
assetgrid | at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.TaskOfIActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
assetgrid | at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask`1 actionResultValueTask)
assetgrid | at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
assetgrid | at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
assetgrid | at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
assetgrid | at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
assetgrid | at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|20_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
assetgrid | at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Logged|17_1(ResourceInvoker invoker)
assetgrid | at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Logged|17_1(ResourceInvoker invoker)
assetgrid | at Microsoft.AspNetCore.Routing.EndpointMiddleware.g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
assetgrid | at assetgrid_backend.Helpers.JwtMiddleware.Invoke(HttpContext context, IUserService userService) in /home/runner/work/assetgridapp/assetgridapp/backend/Helpers/JwtMiddleware.cs:line 29

Support for Axis Bank statements

Our goal is for Assetgrid's CSV importer to be flexible enough to import any CSV file, but we know that some banks aren't exactly keen on following standards.

Describe the issue
What is the problem when importing the CSV file?

  • Fields are missing
  • Extra fields that are not required (can be manually removed before uploading for import)

Describe what is needed to resolve the issue
What do you think it would take to be able to import the CSV file. How can it be integrated into the existing process?

  • The bank has Credit and Debit column, and a description column that has payment method and sender/recipient.
  • The Date column has two different styles.
  • There is no Unique ID column.

Upload a sample
Please attach a sample CSV file that illustrates the issue. You can open CSV files in Excel and remove rows or sensitive information.

Searching based on categories does not work

Connection id "0HML70B2EVCPT", Request id "0HML70B2EVCPT:00000002": An unhandled exception was thrown by the application.
assetgrid | System.ArgumentException: Instance property 'NormalizedName' is not defined for type 'System.String' (Parameter 'propertyName')
assetgrid | at System.Linq.Expressions.Expression.Property(Expression expression, String propertyName)
assetgrid | at assetgrid_backend.Data.DataExtensionMethods.SearchGroupToExpression(ViewSearchGroup group, ValueTuple3[] columns, Expression parameter) in /home/runner/work/assetgridapp/assetgridapp/backend/Data/DataExtensionMethods.cs:line 126 assetgrid | at assetgrid_backend.Data.DataExtensionMethods.SearchGroupToExpression(ViewSearchGroup group, ValueTuple3[] columns, Expression parameter) in /home/runner/work/assetgridapp/assetgridapp/backend/Data/DataExtensionMethods.cs:line 262
assetgrid | at assetgrid_backend.Data.DataExtensionMethods.ApplySearch(IQueryable1 items, ViewSearch query, Boolean applyOrder) in /home/runner/work/assetgridapp/assetgridapp/backend/Data/DataExtensionMethods.cs:line 71 assetgrid | at assetgrid_backend.Controllers.TransactionController.Search(ViewSearch query) in /home/runner/work/assetgridapp/assetgridapp/backend/Controllers/TransactionController.cs:line 538 assetgrid | at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.TaskOfIActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments) assetgrid | at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask1 actionResultValueTask)
assetgrid | at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
assetgrid | at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
assetgrid | at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
assetgrid | at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
assetgrid | --- End of stack trace from previous location ---
assetgrid | at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|20_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
assetgrid | at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Logged|17_1(ResourceInvoker invoker)
assetgrid | at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Logged|17_1(ResourceInvoker invoker)
assetgrid | at Microsoft.AspNetCore.Routing.EndpointMiddleware.g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
assetgrid | at assetgrid_backend.Helpers.JwtMiddleware.Invoke(HttpContext context, IUserService userService) in /home/runner/work/assetgridapp/assetgridapp/backend/Helpers/JwtMiddleware.cs:line 29
assetgrid | at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 application)

Alert on mapping page for missing/invalid/duplicate transactions

Instead of having a page for reviewing each of invalid/duplicate transactions or missing accounts, it should be possible to filter the results to show only problematic accounts.

If trying to continue with unresolved issues, the user should be prompted to confirm that they acknowledge that not all transactions will be imported.

Guess column name assignments when importing

I just did an import of a BofA-generated CSV files. While I recognize that it won't work for all banks/languages, in many cases, you can probably assign a column name.

These were the csv-provided header names:

Date | Description | Amount | Running Bal.

Time of transaction is displayed in wrong timezone (?)

I am adding transaction and select some time for them, let's imagine 16:00.
But later on, when I look at transactions list, such transaction is shown as which took place at 14:00, and when I go to edit such transaction, it has also time set to 14:00.
My computer is set to use CEST timezone.

Translation into Spanish

I would like to translate it into Spanish, my mother languaje. Just drop me a message to start, I am a newbie here contributing in GitHub.

Dark mode

Is your feature request related to a problem? Please describe.
A clear and concise description of what the problem is.

  • I'm always frustrated when i open the app, only to get my eyes flashed.

Describe the solution you'd like
A clear and concise description of what you want to happen.

  • Option to enable dark mode.

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

  • I am using Dark reader browser extension.

Additional context
Add any other context or screenshots about the feature request here.

  • None

notes field

Is your feature request related to a problem? Please describe.
No problem, looks great, love the dashboard.

Describe the solution you'd like
I was confused at first about the Description field. I wanted to put in there, "Breakfast with the kids" because we went to Waffle House this morning. If I import from my bank, Description is where I spent the money so that makes sense for searching for transactions by where you spent your money.
I guess I'm just looking for a possible blank field where I can add some context.
Like if I had a car expense, it would look like this:

  • Description: Costco
  • Category: Auto-repair
  • Notes: new tires for the wife's car

Describe alternatives you've considered
I thought about adding a lot of data to the description field but I think its messy that way

Additional context
N/A

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.