walachewaka / open-record-pool Goto Github PK
View Code? Open in Web Editor NEWA self-hosted DJ record-pool
License: GNU General Public License v3.0
A self-hosted DJ record-pool
License: GNU General Public License v3.0
Update Vue.js to Vue 3, so that we use the latest technologies, not the soon-to-be deprecated ones.
Vue 3 became the default version of Vue.js on Monday, February 7, 2022.
Listen to the sample of a song
It should not be possible to access the backend from another host if localhost CORS are set.
How can we reproduce this bug?
Simply go to the ip adress of the specified machine from another machine and the service is available.
Expected Behavior
Services bind to localhost, refusing connections from all other ip adresses except itself unless specified
As a user, I want the software to save the transformed tags to the MP3 files, so that the tags of my MP3 files are formatted as I wish.
Log out
View the list of all songs
Avoid mounting the frontend/ folder as a Docker Compose volume
It would be better to have a production version of the Docker container for the frontend, so that it's faster.
Mounting the frontend folder is useful for development, though, should still be an option in dev mode.
As a user I need to be able to configure the CORS allowed origin hosts easily, so that I can access the service from the computer of my choice.
Eliminate song duplicates
Cannot override the mount point for the shared volume in docker-compose.override.yml
Launch the application easily
Allow one user to be admin, so that they can have more priviledges than the other users. (for example, being able to see the list of songs we have on the host!)
Question: Do we need admin users in the 0-POC phase?
401 Unauthorized response for POST /login
Backend logs:
"POST /login HTTP/1.1" 401 Unauthorized
Frontend logs:
POST http://localhost:5000/login 401 (Unauthorized)
Store the info about an MP3 file in PostgreSQL
Read files from a specific path on the host computer
Fix the eslint warnings in the frontend
There are lots of warnings:
frontend_1 | /app/src/App.vue
frontend_1 | 5:19 warning Expected a space before '/>', but not found vue/html-closing-bracket-spacing
frontend_1 |
frontend_1 | ✖ 1 problem (0 errors, 1 warning)
frontend_1 | 0 errors and 1 warning potentially fixable with the `--fix` option.
frontend_1 |
frontend_1 |
frontend_1 | Module Warning (from ./node_modules/eslint-loader/index.js):
frontend_1 |
frontend_1 | /app/src/components/NavBar.vue
frontend_1 | 5:33 warning 'href' should be on a new line vue/max-attributes-per-line
frontend_1 | 6:40 warning 'type' should be on a new line vue/max-attributes-per-line
frontend_1 | 6:54 warning 'data-bs-toggle' should be on a new line vue/max-attributes-per-line
frontend_1 | 6:80 warning 'data-bs-target' should be on a new line vue/max-attributes-per-line
frontend_1 | 6:113 warning 'aria-controls' should be on a new line vue/max-attributes-per-line
frontend_1 | 6:144 warning 'aria-expanded' should be on a new line vue/max-attributes-per-line
frontend_1 | 6:166 warning 'aria-label' should be on a new line vue/max-attributes-per-line
frontend_1 | 7:11 warning Require self-closing on HTML elements (<span>) vue/html-self-closing
frontend_1 | 9:47 warning 'id' should be on a new line vue/max-attributes-per-line
frontend_1 | 9:47 warning Attribute "id" should go before "class" vue/attributes-order
frontend_1 | 10:33 warning 'class' should be on a new line vue/max-attributes-per-line
frontend_1 | 12:45 warning 'to' should be on a new line vue/max-attributes-per-line
frontend_1 | 12:52 warning Expected 1 line break after opening tag (`<router-link>`), but no line breaks found vue/singleline-html-element-content-newline
frontend_1 | 12:56 warning Expected 1 line break before closing tag (`</router-link>`), but no line breaks found vue/singleline-html-element-content-newline
frontend_1 | 15:45 warning 'to' should be on a new line vue/max-attributes-per-line
frontend_1 | 15:61 warning Expected 1 line break after opening tag (`<router-link>`), but no line breaks found vue/singleline-html-element-content-newline
frontend_1 | 15:70 warning Expected 1 line break before closing tag (`</router-link>`), but no line breaks found vue/singleline-html-element-content-newline
frontend_1 | 18:45 warning 'to' should be on a new line vue/max-attributes-per-line
frontend_1 | 18:59 warning Expected 1 line break after opening tag (`<router-link>`), but no line breaks found vue/singleline-html-element-content-newline
frontend_1 | 18:69 warning Expected 1 line break before closing tag (`</router-link>`), but no line breaks found vue/singleline-html-element-content-newline
frontend_1 | 21:35 warning '@click' should be on a new line vue/max-attributes-per-line
frontend_1 | 24:22 warning 'class' should be on a new line vue/max-attributes-per-line
frontend_1 | 26:45 warning 'to' should be on a new line vue/max-attributes-per-line
frontend_1 | 26:52 warning Expected 1 line break after opening tag (`<router-link>`), but no line breaks found vue/singleline-html-element-content-newline
frontend_1 | 26:56 warning Expected 1 line break before closing tag (`</router-link>`), but no line breaks found vue/singleline-html-element-content-newline
frontend_1 | 29:45 warning 'to' should be on a new line vue/max-attributes-per-line
frontend_1 | 29:60 warning Expected 1 line break after opening tag (`<router-link>`), but no line breaks found vue/singleline-html-element-content-newline
frontend_1 | 29:68 warning Expected 1 line break before closing tag (`</router-link>`), but no line breaks found vue/singleline-html-element-content-newline
frontend_1 | 32:45 warning 'to' should be on a new line vue/max-attributes-per-line
frontend_1 | 32:57 warning Expected 1 line break after opening tag (`<router-link>`), but no line breaks found vue/singleline-html-element-content-newline
frontend_1 | 32:63 warning Expected 1 line break before closing tag (`</router-link>`), but no line breaks found vue/singleline-html-element-content-newline
frontend_1 |
frontend_1 | ✖ 31 problems (0 errors, 31 warnings)
frontend_1 | 0 errors and 26 warnings potentially fixable with the `--fix` option.
frontend_1 |
frontend_1 |
frontend_1 | Module Warning (from ./node_modules/eslint-loader/index.js):
frontend_1 |
frontend_1 | /app/src/views/Dashboard.vue
frontend_1 | 5:7 warning Disallow self-closing on HTML void elements (<hr/>) vue/html-self-closing
frontend_1 | 5:10 warning Expected a space before '/>', but not found vue/html-closing-bracket-spacing
frontend_1 | 5:12 warning Disallow self-closing on HTML void elements (<br/>) vue/html-self-closing
frontend_1 | 5:15 warning Expected a space before '/>', but not found vue/html-closing-bracket-spacing
frontend_1 | 9:30 warning 'class' should be on a new line vue/max-attributes-per-line
frontend_1 | 10:11 warning Disallow self-closing on HTML void elements (<input/>) vue/html-self-closing
frontend_1 | 10:30 warning 'name' should be on a new line vue/max-attributes-per-line
frontend_1 | 10:43 warning 'v-model' should be on a new line vue/max-attributes-per-line
frontend_1 | 10:43 warning Attribute "v-model" should go before "name" vue/attributes-order
frontend_1 | 10:64 warning 'class' should be on a new line vue/max-attributes-per-line
frontend_1 | 13:32 warning 'class' should be on a new line vue/max-attributes-per-line
frontend_1 | 14:11 warning Require self-closing on HTML elements (<textarea>) vue/html-self-closing
frontend_1 | 16:13 warning Attribute "v-model" should go before "name" vue/attributes-order
frontend_1 | 20:31 warning 'class' should be on a new line vue/max-attributes-per-line
frontend_1 | 20:55 warning Expected 1 line break after opening tag (`<button>`), but no line breaks found vue/singleline-html-element-content-newline
frontend_1 | 20:61 warning Expected 1 line break before closing tag (`</button>`), but no line breaks found vue/singleline-html-element-content-newline
frontend_1 | 24:5 warning Disallow self-closing on HTML void elements (<br/>) vue/html-self-closing
frontend_1 | 24:8 warning Expected a space before '/>', but not found vue/html-closing-bracket-spacing
frontend_1 | 24:10 warning Disallow self-closing on HTML void elements (<br/>) vue/html-self-closing
frontend_1 | 24:13 warning Expected a space before '/>', but not found vue/html-closing-bracket-spacing
frontend_1 | 28:7 warning Disallow self-closing on HTML void elements (<hr/>) vue/html-self-closing
frontend_1 | 28:10 warning Expected a space before '/>', but not found vue/html-closing-bracket-spacing
frontend_1 | 28:12 warning Disallow self-closing on HTML void elements (<br/>) vue/html-self-closing
frontend_1 | 28:15 warning Expected a space before '/>', but not found vue/html-closing-bracket-spacing
frontend_1 | 31:36 warning ':key' should be on a new line vue/max-attributes-per-line
frontend_1 | 31:51 warning 'class' should be on a new line vue/max-attributes-per-line
frontend_1 | 32:29 warning 'style' should be on a new line vue/max-attributes-per-line
frontend_1 | 37:77 warning Expected 1 line break after opening tag (`<router-link>`), but no line breaks found vue/singleline-html-element-content-newline
frontend_1 | 37:81 warning Expected 1 line break before closing tag (`</router-link>`), but no line breaks found vue/singleline-html-element-content-newline
frontend_1 | 41:11 warning Disallow self-closing on HTML void elements (<br/>) vue/html-self-closing
frontend_1 | 41:14 warning Expected a space before '/>', but not found vue/html-closing-bracket-spacing
frontend_1 | 67:3 warning The "computed" property should be above the "created" property on line 64 vue/order-in-components
frontend_1 |
frontend_1 | ✖ 32 problems (0 errors, 32 warnings)
frontend_1 | 0 errors and 28 warnings potentially fixable with the `--fix` option.
frontend_1 |
frontend_1 |
frontend_1 | Module Warning (from ./node_modules/eslint-loader/index.js):
frontend_1 |
frontend_1 | /app/src/views/EditNote.vue
frontend_1 | 4:5 warning Disallow self-closing on HTML void elements (<hr/>) vue/html-self-closing
frontend_1 | 4:8 warning Expected a space before '/>', but not found vue/html-closing-bracket-spacing
frontend_1 | 4:10 warning Disallow self-closing on HTML void elements (<br/>) vue/html-self-closing
frontend_1 | 4:13 warning Expected a space before '/>', but not found vue/html-closing-bracket-spacing
frontend_1 | 8:28 warning 'class' should be on a new line vue/max-attributes-per-line
frontend_1 | 9:9 warning Disallow self-closing on HTML void elements (<input/>) vue/html-self-closing
frontend_1 | 9:28 warning 'name' should be on a new line vue/max-attributes-per-line
frontend_1 | 9:41 warning 'v-model' should be on a new line vue/max-attributes-per-line
frontend_1 | 9:41 warning Attribute "v-model" should go before "name" vue/attributes-order
frontend_1 | 9:62 warning 'class' should be on a new line vue/max-attributes-per-line
frontend_1 | 12:30 warning 'class' should be on a new line vue/max-attributes-per-line
frontend_1 | 13:9 warning Require self-closing on HTML elements (<textarea>) vue/html-self-closing
frontend_1 | 15:11 warning Attribute "v-model" should go before "name" vue/attributes-order
frontend_1 | 19:29 warning 'class' should be on a new line vue/max-attributes-per-line
frontend_1 | 19:53 warning Expected 1 line break after opening tag (`<button>`), but no line breaks found vue/singleline-html-element-content-newline
frontend_1 | 19:59 warning Expected 1 line break before closing tag (`</button>`), but no line breaks found vue/singleline-html-element-content-newline
frontend_1 | 28:11 warning Prop "id" should define at least its type vue/require-prop-types
frontend_1 | 40:3 warning The "computed" property should be above the "created" property on line 37 vue/order-in-components
frontend_1 |
frontend_1 | ✖ 18 problems (0 errors, 18 warnings)
frontend_1 | 0 errors and 14 warnings potentially fixable with the `--fix` option.
frontend_1 |
frontend_1 |
frontend_1 | Module Warning (from ./node_modules/eslint-loader/index.js):
frontend_1 |
frontend_1 | /app/src/views/Home.vue
frontend_1 | 5:28 warning 'id' should be on a new line vue/max-attributes-per-line
frontend_1 | 6:22 warning Expected 1 line break after opening tag (`<p>`), but no line breaks found vue/singleline-html-element-content-newline
frontend_1 | 6:76 warning Expected 1 line break before closing tag (`</p>`), but no line breaks found vue/singleline-html-element-content-newline
frontend_1 |
frontend_1 | ✖ 3 problems (0 errors, 3 warnings)
frontend_1 | 0 errors and 3 warnings potentially fixable with the `--fix` option.
frontend_1 |
frontend_1 |
frontend_1 | Module Warning (from ./node_modules/eslint-loader/index.js):
frontend_1 |
frontend_1 | /app/src/views/Login.vue
frontend_1 | 5:31 warning 'class' should be on a new line vue/max-attributes-per-line
frontend_1 | 6:9 warning Disallow self-closing on HTML void elements (<input/>) vue/html-self-closing
frontend_1 | 6:28 warning 'name' should be on a new line vue/max-attributes-per-line
frontend_1 | 6:44 warning 'v-model' should be on a new line vue/max-attributes-per-line
frontend_1 | 6:44 warning Attribute "v-model" should go before "name" vue/attributes-order
frontend_1 | 6:68 warning 'class' should be on a new line vue/max-attributes-per-line
frontend_1 | 9:31 warning 'class' should be on a new line vue/max-attributes-per-line
frontend_1 | 10:9 warning Disallow self-closing on HTML void elements (<input/>) vue/html-self-closing
frontend_1 | 10:32 warning 'name' should be on a new line vue/max-attributes-per-line
frontend_1 | 10:48 warning 'v-model' should be on a new line vue/max-attributes-per-line
frontend_1 | 10:48 warning Attribute "v-model" should go before "name" vue/attributes-order
frontend_1 | 10:72 warning 'class' should be on a new line vue/max-attributes-per-line
frontend_1 | 12:29 warning 'class' should be on a new line vue/max-attributes-per-line
frontend_1 | 12:53 warning Expected 1 line break after opening tag (`<button>`), but no line breaks found vue/singleline-html-element-content-newline
frontend_1 | 12:59 warning Expected 1 line break before closing tag (`</button>`), but no line breaks found vue/singleline-html-element-content-newline
frontend_1 |
frontend_1 | ✖ 15 problems (0 errors, 15 warnings)
frontend_1 | 0 errors and 11 warnings potentially fixable with the `--fix` option.
frontend_1 |
frontend_1 |
frontend_1 | Module Warning (from ./node_modules/eslint-loader/index.js):
frontend_1 |
frontend_1 | /app/src/views/Note.vue
frontend_1 | 8:70 warning 'class' should be on a new line vue/max-attributes-per-line
frontend_1 | 8:94 warning Expected 1 line break after opening tag (`<router-link>`), but no line breaks found vue/singleline-html-element-content-newline
frontend_1 | 8:98 warning Expected 1 line break before closing tag (`</router-link>`), but no line breaks found vue/singleline-html-element-content-newline
frontend_1 | 9:40 warning 'class' should be on a new line vue/max-attributes-per-line
frontend_1 | 9:40 warning Attribute "class" should go before "@click" vue/attributes-order
frontend_1 | 9:66 warning Expected 1 line break after opening tag (`<button>`), but no line breaks found vue/singleline-html-element-content-newline
frontend_1 | 9:72 warning Expected 1 line break before closing tag (`</button>`), but no line breaks found vue/singleline-html-element-content-newline
frontend_1 | 19:11 warning Prop "id" should define at least its type vue/require-prop-types
frontend_1 | 28:3 warning The "computed" property should be above the "created" property on line 20 vue/order-in-components
frontend_1 |
frontend_1 | ✖ 9 problems (0 errors, 9 warnings)
frontend_1 | 0 errors and 7 warnings potentially fixable with the `--fix` option.
frontend_1 |
frontend_1 |
frontend_1 | Module Warning (from ./node_modules/eslint-loader/index.js):
frontend_1 |
frontend_1 | /app/src/views/Profile.vue
frontend_1 | 4:5 warning Disallow self-closing on HTML void elements (<hr/>) vue/html-self-closing
frontend_1 | 4:8 warning Expected a space before '/>', but not found vue/html-closing-bracket-spacing
frontend_1 | 4:10 warning Disallow self-closing on HTML void elements (<br/>) vue/html-self-closing
frontend_1 | 4:13 warning Expected a space before '/>', but not found vue/html-closing-bracket-spacing
frontend_1 | 8:43 warning 'class' should be on a new line vue/max-attributes-per-line
frontend_1 | 8:43 warning Attribute "class" should go before "@click" vue/attributes-order
frontend_1 | 8:67 warning Expected 1 line break after opening tag (`<button>`), but no line breaks found vue/singleline-html-element-content-newline
frontend_1 | 8:81 warning Expected 1 line break before closing tag (`</button>`), but no line breaks found vue/singleline-html-element-content-newline
frontend_1 | 20:3 warning The "computed" property should be above the "created" property on line 17 vue/order-in-components
frontend_1 |
frontend_1 | ✖ 9 problems (0 errors, 9 warnings)
frontend_1 | 0 errors and 8 warnings potentially fixable with the `--fix` option.
frontend_1 |
frontend_1 |
frontend_1 | Module Warning (from ./node_modules/eslint-loader/index.js):
frontend_1 |
frontend_1 | /app/src/views/Register.vue
frontend_1 | 5:31 warning 'class' should be on a new line vue/max-attributes-per-line
frontend_1 | 6:9 warning Disallow self-closing on HTML void elements (<input/>) vue/html-self-closing
frontend_1 | 6:28 warning 'name' should be on a new line vue/max-attributes-per-line
frontend_1 | 6:44 warning 'v-model' should be on a new line vue/max-attributes-per-line
frontend_1 | 6:44 warning Attribute "v-model" should go before "name" vue/attributes-order
frontend_1 | 6:68 warning 'class' should be on a new line vue/max-attributes-per-line
frontend_1 | 9:32 warning 'class' should be on a new line vue/max-attributes-per-line
frontend_1 | 10:9 warning Disallow self-closing on HTML void elements (<input/>) vue/html-self-closing
frontend_1 | 10:28 warning 'name' should be on a new line vue/max-attributes-per-line
frontend_1 | 10:45 warning 'v-model' should be on a new line vue/max-attributes-per-line
frontend_1 | 10:45 warning Attribute "v-model" should go before "name" vue/attributes-order
frontend_1 | 10:70 warning 'class' should be on a new line vue/max-attributes-per-line
frontend_1 | 13:31 warning 'class' should be on a new line vue/max-attributes-per-line
frontend_1 | 14:9 warning Disallow self-closing on HTML void elements (<input/>) vue/html-self-closing
frontend_1 | 14:32 warning 'name' should be on a new line vue/max-attributes-per-line
frontend_1 | 14:48 warning 'v-model' should be on a new line vue/max-attributes-per-line
frontend_1 | 14:48 warning Attribute "v-model" should go before "name" vue/attributes-order
frontend_1 | 14:72 warning 'class' should be on a new line vue/max-attributes-per-line
frontend_1 | 16:29 warning 'class' should be on a new line vue/max-attributes-per-line
frontend_1 | 16:53 warning Expected 1 line break after opening tag (`<button>`), but no line breaks found vue/singleline-html-element-content-newline
frontend_1 | 16:59 warning Expected 1 line break before closing tag (`</button>`), but no line breaks found vue/singleline-html-element-content-newline
frontend_1 |
frontend_1 | ✖ 21 problems (0 errors, 21 warnings)
frontend_1 | 0 errors and 15 warnings potentially fixable with the `--fix` option.
frontend_1 |
frontend_1 |
frontend_1 | You may use special comments to disable some warnings.
frontend_1 | Use // eslint-disable-next-line to ignore the next line.
frontend_1 | Use /* eslint-disable */ to ignore all warnings in a file.
frontend_1 | <s> [webpack.Progress] 100%
Download a song
Run the SQL migrations when we start Docker Compose, so that we don't need to run it manually.
For now, we need to:
It would be easier for the user, and less error-prone if we had only the step 1 to do.
Continue listening to a song while navigating
Parse the tags of an MP3 file
Publish a single Docker image for the whole app
See radarr or sonarr: it pulls the image from Github directly:
---
version: "2.1"
services:
sonarr:
image: lscr.io/linuxserver/sonarr:latest
container_name: sonarr
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/London
volumes:
- /path/to/data:/config
- /path/to/tvseries:/tv #optional
- /path/to/downloadclient-downloads:/downloads #optional
ports:
- 8989:8989
Search a song in the library
Log in
Check the Python code with black, so that we minimize the risks of introducing poor-quality code.
black is a python package for checking the Python source code. https://black.readthedocs.io/en/stable/
Just got it up and running, can't register a user or log in.
When running inside Docker Compose:
> [email protected] serve
> npx vue-cli-service serve
npm ERR! code E404
npm ERR! 404 Not Found - GET https://registry.npmjs.org/vue-cli-service - Not found
npm ERR! 404
npm ERR! 404 'vue-cli-service@latest' is not in this registry.
npm ERR! 404
npm ERR! 404 Note that you can also install from a
npm ERR! 404 tarball, folder, http url, or git url.
Expected result:
Current error:
Provide the SQL credentials for the database administration tool, so that we don't have to type in the database credentials when we want to administer it using the web UI.
Use PHPMyAdmin with credentials as a database administration tool
So that we don't have to type the credentials.
Improve the look of the basic layout theme
Fix the npm warnings in the frontend
If we fix #17, it might fix this.
There are lots of warnings:
npm WARN deprecated [email protected]: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
npm WARN deprecated [email protected]: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.
npm WARN deprecated [email protected]: Please see https://github.com/lydell/urix#deprecated
npm WARN deprecated [email protected]: Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility
npm WARN deprecated [email protected]: See https://github.com/lydell/source-map-url#deprecated
npm WARN deprecated [email protected]: See https://github.com/lydell/source-map-resolve#deprecated
npm WARN deprecated [email protected]: This SVGO version is no longer supported. Upgrade to v2.x.x.
npm WARN deprecated [email protected]: older versions vulnerable to prototype pollution
npm WARN deprecated [email protected]: https://github.com/lydell/resolve-url#deprecated
npm WARN deprecated [email protected]: request has been deprecated, see https://github.com/request/request/issues/3142
npm WARN deprecated [email protected]: The querystring API is considered Legacy. new code should use the URLSearchParams API instead.
npm WARN deprecated [email protected]: 3.x is no longer supported
npm WARN deprecated [email protected]: this library is no longer supported
npm WARN deprecated [email protected]: This loader has been deprecated. Please use eslint-webpack-plugin
npm WARN deprecated [email protected]: babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.
npm WARN deprecated @hapi/[email protected]: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated @hapi/[email protected]: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated @hapi/[email protected]: Switch to 'npm install joi'
npm WARN deprecated @hapi/[email protected]: Moved to 'npm install @sideway/address'
npm WARN deprecated @hapi/[email protected]: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated [email protected]: Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies
npm WARN deprecated [email protected]: Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies
Basic project setup
Document how to backup and restore a database
Registration errors should be displayed to the user.
Sometimes, registration fails because there is already another user with the same name, or because of CORS errors. Currently, we don't display any error message to the user when one of these scenarios happen. We should display some error message to the user when a registration error happens, or when we cannot reach the backend.
Build the frontend for production and serve with NGINX, so that the frontend is faster and doesn't create root-owned files in our local filesystem.
Note that the development build is not optimized.
frontend_1 | To create a production build, run npm run build.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.