Code Monkey home page Code Monkey logo

treetracker-admin-api's Introduction

Treetracker Admin Panel – API

The Admin Panel is the part of the Greenstand Treetracker project for verifying, processing and managing data collected by the Treetracker app.

This is the RESTful API for the Admin Panel, built predominantly with Loopback 4.

The Admin Panel frontend is managed separately under Greenstand/treetracker-admin-client.

See Wiki for more info on goals

Please add any missing content to this readme.

Development Environment Quick Start

There are three main options for development in the Admin Panel:

  1. For frontend work only
    1. Follow setup instructions in the treetracker-admin-client project
  2. For API work only
    1. Fork and clone this repo as described below
    2. Use our development database credentials (available via team leads in Slack)
  3. As a completely local development environment
    1. Install postgres and postgis locally, install a database seed, and run database migrations
    2. Install and run the backend API, configured to use your local database
    3. Install and run the frontend, configured to use you local backend API

Step 1: Install git

See https://git-scm.com/downloads for instructions.

Step 2: Install Node.js

Node.js version 12.x works best for now; later versions have exhibited some strange behaviour with this project. If you encounter issues with the server, check your version of Node.js first. This includes CORS related issues when fetching the API.

We recommend using nvm to install and manage your Node.js instances. More details here: https://www.sitepoint.com/quick-tip-multiple-versions-node-nvm/

  1. Install nvm: curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.35.2/install.sh | bash
  2. Install the latest version of Node.js 12: nvm install 12
  3. Use the installed Node.js: nvm use 12

Alternatively, you can install Node.js directly from https://nodejs.org/dist/latest-v12.x/

On MacOS, you can alleviate the need to run as sudo by using nvm or by following John Papa's instructions.

Step 3: Fork and clone this repository

  1. Click Fork on this GitHub repo and follow the steps to fork the repo to your account
  2. Open terminal
  3. Go to a folder where you would like to install the project. Then type the following, replacing <username> with your GitHub username:
git clone https://github.com/<username>/treetracker-admin-api.git

Add Greenstand as a remote:

git remote add upstream https://github.com/Greenstand/treetracker-admin-api

Step 4: Get configuration files

  1. Get the server dev env file pinned to the #admin_panel_chat channel in Greenstand Slack: .env.development (Note that the leading . may be removed if you download the file from Slack, so you'll need to rename it). This contains PostgreSQL development database credentials.
  2. Copy the file to the root directory of your local repo

Step 5: Install npm dependencies

npm install

Step 6: Start the API server

npm start

Step 7: Start developing!

Commit Message and PR Title Format

We use automatic semantic versioning, which looks at commit messages to determine how to increment the version number for deployment.

Your commit messages will need to follow the Conventional Commits format, for example:

feat: add new button

Since we squash commits on merging PRs into master, this applies to PR titles as well.

Keeping Your Fork in Sync

Your forked repo won't automatically stay in sync with Greenstand, so you'll need to occassionally sync manually (typically before starting work on a new feature).

git pull upstream master --rebase
git push origin master

You might also need to sync and merge master into your feature branch before submitting a PR to resolve any conflicts.

git checkout <feature_branch>
git merge master

Code style guide

We follow the Airbnb JavaScript style guide. The superficial aspects of this style are enforced by a pre-commit hook in the project that runs Prettier when you commit a change.

If you are using VSCode as your IDE, please follow this guide to set up Prettier and automatically format your code on file save.

You can also manually run npm run prettier. Configuration files are already included in this repo.

Rules

Indention 2 Spaces for indentation

Semicolon Use semicolons at the end of each line

Characters 80 characters per line

Quotes Use single quotes unless you are writing JSON

const foo = 'bar';

Braces Opening braces go on the same line as the statement

if (true) {
  console.log('here');
}

Variable declaration Declare one Variable per statement

const dog = ['bark', 'woof'];
let cat = ['meow', 'sleep'];

Variable, properties and function names Use lowerCamelCase for variables, properties and function names

const adminUser = db.query('SELECT * From users ...');

Class names Use UpperCamelCase for class names

class Dog {
  bark() {
    console.log('woof');
  }
}

Descriptive conditions Make sure to have a descriptive name that tells the use and meaning of the code

const isValidPassword =
  password.length >= 4 && /^(?=.*\d).{4,}$/.test(password);

Object/Array creation Use trailing commas and put short declarations on a single line. Only quote keys when your interpreter complains:

var a = ['hello', 'world'];
var b = {
  good: 'code',
  'is generally': 'pretty',
};

Testing

We used a combination of JS and Typescript, and because Loopback would load services/controllers from the typescript output folder (dist), it can be tricky to test.

For the goal of protecting the shared development database, when running test, we will use a separate database.

Create a test environment file .env.test in the root directory with the test database URL set as follows:

DATABASE_URL=postgresql://<user>:<password>@<host>:<port>/<database>?ssl=true

NOTE: Please do not set this URL to point to our development database, because the tests will clear all the data in the database. It would cause trouble if we don't have any data in the dev DB.

To locally install postgresDB, this app might be helpful: https://postgresapp.com/

To run test:

npm test

To make the test process more smooth, we suggest running a command to compile the Loopback files automatically when files change:

npm run watch

In this way, we can write the code and get the tests result immediately.

NOTE: when running tests, the files related to Loopback are loaded from ./dist folder. That's because for Jest does not output compiled files at all, and Loopback will try to load the controllers at runtime.

Advanced local development using docker ## Currently broken ##

For developers familiar with docker, we offer a dockerized setup for local development.

To run docker on a local machine, you will have to install Docker first. Docker is a linux container technology, so running it on Mac or Windows requires an application with an attached linux VM. Docker provides one for each OS by default.

Mac

Install Docker for Mac using homebrew, using the following command

$ brew cask install docker

You can alternatively install Docker via: Docker for Mac

Once Docker is installed, lauch Docker from the Applications GUI.

Windows

For most versions of Windows: Docker for Windows

For some older versions or Win10 Home: Docker Toolbox. At least on one machine, to get this to work, when you get to the step to do QuickStart terminal script, instead, run:

docker-machine create default --virtualbox-no-vtx-check

then re-run the QuickStart terminal script.

If you use Docker Toolbox, check the IP address in the output of the QuickStart terminal script. You will use this IP address later instead of localhost.

Linux

To install on linux, you can run sudo apt-get install -y docker-ce but there is additional setup to verify keys, etc.

Install, build docker containers and go

Run the setup script. This script installs node modules, builds docker containers, and starts them

./dev/scripts/setup.sh

You can now view the Treetracker Admin Panel at http://localhost:8080.

Note: If you try to access the site on port 3001 you will recieve a CORS error

Note: If you used Docker Toolbox, you may need to use the IP address it reported, such as http://192.168.99.100:8080_

It may take a few seconds for the web and api servers to come up. You can monitor them using the docker logs commands as:

docker logs -f treetracker-admin-web
docker logs -f treetracker-admin-api

Also see Scripts below

To stop the dev environment use

./dev/scripts/down.sh

To start the dev environment back up use

./dev/scripts/up.sh

Just edit as you normally would to view changes in your development environment.

Alternative setup for MS Windows (Works on Linux and Mac also)

On Windows the easiest way to develop and debug Node.js applications is using Visual Studio Code. It comes with Node.js support out of the box.

https://code.visualstudio.com/docs

Still can not figure it out?

Here is our wiki page for troubleshooting, take a look.

Help us to improve it by adding your experience solving this problem.

Scripts

Useful scripts are contained in /dev/scripts. Their uses are described here. Scripts are run from the repository root as /dev/scripts/{script-name}.sh

install.sh install or update npm modules for server and client projects

build.sh build docker images

up.sh bring up docker containers in docker as described by docker-compose.yml

setup.sh run install.sh, build.sh, and up.sh

down.sh bring down docker containers

logs-api.sh show logs for api server

logs-web.sh show logs for React.js dev server

docker-clear-images.sh clear out all docker images

docker-remove-containers.sh clear out all docker containers

Further reading

See Contributing to the Cause

treetracker-admin-api's People

Contributors

actions-user avatar alansvits avatar arunbakt avatar birdtho avatar bittricky avatar blancoal avatar bsbjones27 avatar dadiorchen avatar davidezrajay avatar dependabot[bot] avatar elfiyang16 avatar eltongarcia avatar gwynndp avatar iremaka avatar jparaujo avatar jun383914 avatar luacmartins avatar lukasbicus avatar misterinterrupt avatar nickharrisdev avatar nmcharlton avatar phips30 avatar quorth0n avatar rgesulfo avatar semantic-release-bot avatar sjaymoon15 avatar tanguyen1893 avatar thiagodemellobueno avatar tranquanghuy0801 avatar zavenarra 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

treetracker-admin-api's Issues

UI Style Guide & Wireframes

Generate wireframes and a style guide that explains how the overall admin panel UI should function. This should solve our questions from a UI/UX perspective, but leave more traditional 'design styling' (fonts and graphics) to a different responsibility.

Create Tree Scrubber

M x M Scoallable view of incoming images, with the ability to flag images that are invalid.

Update overall admin panel UI

Update the admin panel navigation and overall look/feel to match our latest specs.

This ticket is currently blocked by #72

Specs will be posted here once #72 is resolved.

Add google analytics to Admin Panel

below the google admin panel tracking ID and code

<script async src="https://www.googletagmanager.com/gtag/js?id=UA-1280531-65"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'UA-1280531-65'); </script>

Implement filtering using loopback

Extend the API calls made to loopback to support the following filters. These filters can be composed together. Loopback supports all API calls for these filters using its where filter https://loopback.io/doc/en/lb2/Where-filter.html

Loopback API currently available can be viewed here: http://localhost:3002/explorer/#/Tree

API calls should be implemented in models/trees.js following the current pattern of other calls, or improvements can be suggested.

Filters to implement:
Filter trees by tree id

curl --globoff  -X GET "http://localhost:3000/trees?filter[offset]=0&filter[limit]=200&filter[where][id]=115"

Filter trees by status

curl --globoff  -X GET "http://localhost:3000/trees?filter[offset]=0&filter[limit]=200&filter[where][status]=planted"

Filter trees by date created (date range, or before/after only)

Syntax for trrees after a date:
curl --globoff  -X GET "http://localhost:3000/trees?filter[offset]=0&filter[limit]=200&filter[where][timeCreated][gte]=2018-08-08"

Syntax for trees before a date:
curl --globoff  -X GET "http://localhost:3000/trees?filter[offset]=0&filter[limit]=200&filter[where][timeCreated][lte]=2018-08-08"

Syntax for trees between two dates:
curl --globoff  -X GET "http://localhost:3000/trees?filter[offset]=0&filter[limit]=200&filter[where][timeCreated][between]=2018-08-07&filter[where][timeCreated][between]=2018-10-01"

Implement a react styleguide.

thiagodemellobueno commented on May 2, 2018
Helps with maintainability, planning, dev/frontend collaboration, ensures consistency, and makes for . good documentation.

https://react-styleguidist.js.org/

@thiagodemellobueno thiagodemellobueno created this issue from a note in Tree-Tracker Admin (To do) on May 2, 2018
@thiagodemellobueno thiagodemellobueno moved this from To do to Backlog in Tree-Tracker Admin on May 21, 2018
@thiagodemellobueno thiagodemellobueno removed this from Backlog in Tree-Tracker Admin on Jun 6, 2018

Implement API endpoints for filtering trees by user

Filter trees to show those associated to an email address or phone number (via the users table).

First get the user id from users API, then query for active trees. curls below specify the query parameters to use.

curl for getting user id, these are the GET params to use:

curl --globoff  -X GET "http://localhost:3000/users?filter[offset]=0&filter[limit]=200&filter[where][phone]=3133333232 " -H "accept: application/json"
curl --globoff  -X GET "http://localhost:3000/users?filter[offset]=0&filter[limit]=200&filter[where][email]=matt%40asdf.com" -H "accept: application/json"

note URL encoding of @ in email address

returned object will be an array, object(s) in that array will contain a field 'id' which is the user id, and can be used to query trees as seen in the following curl:

curl --globoff  -X GET "http://localhost:3000/trees?filter[offset]=0&filter[limit]=200&filter[where][userId]=5&filer[where][active]=true"

About page (English and Swahili) for Just Dig It App

_This Tree Tracker app is made to track the location and growth of Kisiki Hai Trees.

Instructions:

  • After signing in, take a photo of the Kisiki Hai tree with the measuring stick.

  • Make sure the full measuring stick is captured in the photo.

  • You can only take a photo is the GPS accuracy is 10 meters or better. If this is not the case, please wait a short while or move to a spot where you can see the sky.

  • Click the height class of the tree.

  • Once you are done and have a good network reception, make sure you sync the data so it will be uploaded to the internet.

Visit www.greenstand.org for more details on the app.

Contact LEAD Foundation, visit www.leadfoundation.org or www.justdiggit.org for more info on the Kisiki Hai program._

Kuhusu

Programu hii ya Tracker ya Miti inafanywa kufuatilia eneo na ukuaji wa Miti Hai ya Kiisiki.

Maelekezo:

  • Baada ya kuingia, fanya picha ya mti wa Kisiki Hai na fimbo ya kupimia.

  • Hakikisha fimbo kamili ya kupimwa inachukuliwa kwenye picha.

  • Unaweza tu kuchukua picha ni usahihi GPS ni mita 10 au bora. Ikiwa sio kesi, tafadhali subiri muda mfupi au uende mahali ambapo unaweza kuona anga.

  • Bonyeza darasa la urefu wa mti.

  • Mara baada ya kukamilika na kuwa na huduma nzuri ya mtandao, hakikisha usawazisha data ili itapakiwe kwenye mtandao.

Tembelea www.greenstand.org kwa maelezo zaidi juu ya programu.

Wasiliana na Foundation Foundation, tembelea www.leadfoundation.org au www.justdiggit.org kwa maelezo zaidi juu ya programu ya Kisiki Hai.

Add "select number of images" for Verify Page

Currently, the Verify Page auto loads images when user reaches the bottom of the page.
Screenshot (49)

The desired function is the same as the function displayed on the trees page as shown below.

Screenshot (50)_LI

This is the Verify page that should be modified.
Screenshot (52)

Cannot find module ./config

Fresh git checkout,
ran npm i
then
node index.js

and I get the following error:

Thiagos-MacBook-Pro:treetracker-admin-api thiagodemellobueno$ node index.js
module.js:538
    throw err;
    ^
Error: Cannot find module './config'
    at Function.Module._resolveFilename (module.js:536:15)
    at Function.Module._load (module.js:466:25)
    at Module.require (module.js:579:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (/Users/thiagodemellobueno/repos/treetracker-admin-api/index.js:9:12)
    at Module._compile (module.js:635:30)
    at Object.Module._extensions..js (module.js:646:10)
    at Module.load (module.js:554:32)
    at tryModuleLoad (module.js:497:12)
    at Function.Module._load (module.js:489:3)
Thiagos-MacBook-Pro:treetracker-admin-api thiagodemellobueno$ 

tried npm i -s config (not expecting much) and problem persists.

Filter trees by date range

Add a date range picker to the UI and send this data through loopback to filter trees displayed to be within that date range.

Implement filtering

thiagodemellobueno commented on May 21, 2018 •
https://github.com/TarikHuber/material-ui-filter

@thiagodemellobueno thiagodemellobueno created this issue from a note in Tree-Tracker Admin (To do) on May 21, 2018
@thiagodemellobueno thiagodemellobueno moved this from To do to In progress in Tree-Tracker Admin on Jun 7, 2018
@thiagodemellobueno thiagodemellobueno self-assigned this on Jun 7, 2018
@thiagodemellobueno thiagodemellobueno moved this from In progress to Ready to be worked on in Tree-Tracker Admin on Nov 29, 2018
@thiagodemellobueno thiagodemellobueno removed their assignment on Nov 29, 2018
@bittricky
Contributor
bittricky commented on Jan 21
@thiagodemellobueno - If this issue is up for grabs, I can take this issue.

For filtering would a search bar in the header like in the example be the desired implementation for filtering?

Tree Image gallery for quick reviewing and disabling of fake tree entries....

Open
Tree Image gallery for quick reviewing and disabling of fake tree entries.... #32
sebastiangaertner opened this Issue on Jun 1, 2018

Ready to be worked on in Tree-Tracker Admin

Tree Gallery

@sebastiangaertner sebastiangaertner changed the title Tree Image gallery for quick reviewing (done by human for now) to make sure its actually a tree on the picture and not something else. Best would be a kind of Gallary with something that can disable the tree entry quickly. Tree Image gallery for quick reviewing and disabling of fake tree entries.... on Jun 1, 2018
@jparaujo
Member
jparaujo commented on Jun 4, 2018
About my suggestion to use AI
https://greenstand.slack.com/archives/C8W6GT9MZ/p1528157040000043

@jparaujo
Member
jparaujo commented on Jun 6, 2018
After a quick discussion yesterday, we decided to make this feature available next in the Admin Panel. Something simple but functional for starters, to solve the current situation of "shoes pictures".

@jparaujo jparaujo self-assigned this on Jun 6, 2018
@jparaujo jparaujo added this to Backlog in Tree-Tracker Admin on Jun 6, 2018
@jparaujo jparaujo moved this from Backlog to To do in Tree-Tracker Admin on Jun 6, 2018
@jparaujo jparaujo moved this from To do to In progress in Tree-Tracker Admin on Jun 6, 2018
@thiagodemellobueno
Member
thiagodemellobueno commented on Jun 7, 2018
@jparaujo - do you see tree images being broken out into their own api top level object, and then being simply associated with trees? this may make some things easier (less parsing when only the image matters)

@jparaujo
Member
jparaujo commented on Jun 7, 2018
@thiagodemellobueno I think we have only one photo at the tree level, so maybe a dedicated model on the front (I believe it would be like this anyway) and a URL bringing only imageUrl and id from the tree api would be enough. Unless by parsing you mean something else I'm not seeing here.

@thiagodemellobueno
Member
thiagodemellobueno commented on Jun 20, 2018
Possibly of use in these efforts: https://www.npmjs.com/package/react-masonry-component

@thiagodemellobueno thiagodemellobueno added enhancement Epic labels on Jun 20, 2018
@jparaujo
Member
jparaujo commented on Jun 20, 2018
That's a nice one. I'm currently experimenting with this: https://bvaughn.github.io/react-virtualized/#/components/Masonry

But having issues on auto positioning. I'm guessing it's something related with the Material theme we have in place. I will find out tonight. Haven't had much time to invest since our last meeting...

@thiagodemellobueno
Member
thiagodemellobueno commented on Jun 20, 2018
No worries, just doing a little garden tending.

@sebastiangaertner
Member Author
sebastiangaertner commented on Jun 20, 2018
Looks good. If even I understand the package code...

Sent from myMail for Android Wednesday, 20 June 2018, 02:49PM +01:00 from Thiago de Mello Bueno [email protected] :

@thiagodemellobueno thiagodemellobueno moved this from In progress to To do in Tree-Tracker Admin on Sep 25, 2018
@thiagodemellobueno
Member
thiagodemellobueno commented on Sep 25, 2018 •
I see a series of subtasks we can break out (@jparaujo probably has done some part of this already)

Query trees with images
Wire up checkbox selection (see tree table)
Wire up buttons (disable and delete)
Set up a masonry view with thumb
@thiagodemellobueno thiagodemellobueno added the help wanted label on Sep 25, 2018
@thiagodemellobueno thiagodemellobueno added this to the Tree Gallery milestone on Sep 25, 2018
@Davidezrajay Davidezrajay referenced this issue on Oct 17, 2018
Open
Implement Next Tree Button #57
@thiagodemellobueno thiagodemellobueno unassigned jparaujo on Nov 29, 2018

Implement API endpoints for filtering trees by lat/lng and radius

We need to filter trees in both table and image lists by lat/lng and a radius. We use the postGIS extension in postgres server side for spatial queries. Some research will need to be done to understand the correct pattern for implementing this query in our loopback driven API. https://loopback.io/. We are currently running loopback 4.0

This feature requires some advanced customization of loopback. We need an engineer with specific LoopBack 4 experience in order to include this in our milestone.

Tagging of accept/reject reason via API

A tree can be tagged blurry, hole dug, not a tree, etc. We don't currently support this via the API. I will add support for this so we can implement that tagging feature during review.

The field 'status' has been added to trees in the database and api. Status is a string and can have the following values:

planted
hole
blurry
not-a-tree

A patch request (just like what is used for active and approved) can be used to update these values.

add imagescrubber actions to imagescrubber

We have a husk component for ImageScrubberActions.
At first it may just have:

  1. A count of items selected
  2. A "delete" button (deactivate tree)
  3. Possibly a "we just marked X trees inactive. " option

Filter trees by user id

Add a field for direct type-in of a user id, and send that to our loopback rest API as a where parameter to only display trees for that user.

Modify rejection workflow to capture rejection reason

image

We would like 4 buttons instead of just 2. The ‘reject’ will be replaced by 3 different buttons. The ‘Approve’ will stay the same.

The 3 buttons will be
Not a Tree
Duplicate
Blurry Image

These will be reported to the server by both setting the ‘active’ column to false, as well as sending a field named ‘reject_reason’

The values for reject_reason are
not_tree
duplicate
blurry_image

The developer database has been updated with the reject_reason column, which is an enumerated type with the values listed above.

The Loopback API has NOT been updated yet. The trees model file will need to be extended to capture this new column, which is of type ‘reject_reason’

Add 'planter_id' and 'device_id' to tree

Please add 'planter_id' and 'device_id' to each tree.

This will speed up the tree verification. Currently every tree we need to know about, we are searching for the tree in the data base to find the 'planter_id'
Note: The 'user_id' has been changed to the 'planter_id' in the database

Screenshot (63)

Swahili primary language Kisiki Hai App

Nearly all of the users for the Kisiki Hia app are Swahili speakers and do not read English. They don't have their phones language set to Swahili, many phones don't actually support Swahili.

A request has been to set the default language to Swahili.

Document Set Up

Please evaluate the documentation and make sure it is complete enough to run. Comment on this ticket if there are problems and create a pull request for any updates to the setup readme.

If you have errors please note and document the problem/solution.

Link to trees on webmap

Create a link using the tree id to open our webmap in a separate tab and show the location of the tree.

The URL to show a tree by id on the webmap is http://{base_domain}/?treeid={tree_id}

For instance, in production this is:
https://treetracker.org/?treeid=1000

A quick fix for a basic operational need - there is no official UI spec for this at the moment. For a now, a link in both the images and trees area would be ideal. The text of the link should be 'Location.' It's fine to just it in where it seems to make the most sense for the moment. We will be returning to this soon with a more clear UI spec, but it will take a while to push that out, and we need some of these features for operational reasons ASAP.

Implement pagination in admin-api

We need to be able to say, "give me X trees starting from Y"
Api/admin/trees?start_index=1000&page_size=100

it would also be good to be able to sort the results of most requests, and possibly filter by properties, or presense of properties however a good deal of that could be done on the client-side.

At the moment though JS hangs during XHR requests that take longer and longer the more trees we have, development becomes burdensome, and the UX suffers greatly.

Reverse lookup from lat-lon

We can show "closest city" based on lat lon, this maybe more human readable for every day tasks, the ability to see lat lon in detailed view, or simply as a separate column should be maintained.

https://www.npmjs.com/package/reverse-geocoding

@thiagodemellobueno thiagodemellobueno created this issue from a note in Tree-Tracker Admin (Backlog) on Jun 6, 2018
@thiagodemellobueno thiagodemellobueno moved this from Backlog to In progress in Tree-Tracker Admin on Jun 7, 2018
@thiagodemellobueno
Member Author
thiagodemellobueno commented on Jun 7, 2018
Have this working, but unless we then record the new info into the API we're going to get rate limited.
https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=${payload.latitude}&lon=${payload.longitude}

@thiagodemellobueno thiagodemellobueno moved this from In progress to Ready to be worked on in Tree-Tracker Admin on Nov 29, 2018

Establish a link to tree on tree map

Each tree should have a link to the tree map.

When using the filter there should be an option to view the filtered trees on the map. This could/should be done with a call to the webmap API. (same sql statement)

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.