Giter VIP home page Giter VIP logo

multi-streaming-server's Introduction

Multi Streaming Server

A Nginx server with RTMP module to send video streaming to multiple services.

If you have an optical fiber connection, you might want to send your live streams to multiple services to reach a wider audience.

If you use Open Broadcast Software, I know it's possible to launch multiple instances, but it has a large CPU cost.

With this project, you can have only one stream to send and the Nginx RTMP server will dispatch this stream to every streaming services that you want. The only brake is your upload speed.

Please note that you also can encode your stream on the fly. If you want to stream to Youtube Gaming in 1080p at 60 FPS and on Twitch in 720p at 30 FPS, it's possible changing the Nginx configuration file.

Prerequisites

To work on Windows, this project needs to run a Unix virtual machine (exec command doesn't work on Windows) using VirtualBox. This VM is automatically setup using Vagrant.

You also need a software to stream to the Nginx server. I personally used Open Broadcast Software.

Usage

Rename the file nginx.template.conf (located into nginx/conf/) to nginx.conf and change its content with your specific data. For instance, you need to change {{ youtube_key }} by your Youtube stream key.

Then, launch this command at the root folder of this project (where there is the Vagrant file):

vagrant up

If you see the message "Nginx is ready to use", you can start to stream. With OBS, change the RTMP URL to rtmp://192.168.42.42:1935/live, you don't need to enter a stream key.

To check that the stream is properly received and sent to each services, you can browse to http://192.168.42.42:8080/stat.

FAQ

multi-streaming-server's People

Contributors

noxalus 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

multi-streaming-server's Issues

Secure RTMP Url with token?

Hey, can i secure the RTMP URL with an token, so one random can stream on it? In my case i want to run it on a dedicated Server.

nginx configuration for outputting multiple resolutions?

In the readme you imply that I can stream two separate resolutions/qualities to two separate services:

Please note that you also can encode your stream on the fly. If you want to stream to Youtube Gaming in 1080p at 60 FPS and on Twitch in 720p at 30 FPS, it's possible changing the Nginx configuration file.

I don't see any example of this however, and my attempts at modifying the nginx.conf file to accomplish it have failed. Any help?

Private key?

Hi, i can set private key for private stream with nginx?

Vagrant twitch

Noxalus, thanks so much for all of your time.

I sincerely appreciate you assisting me in getting the Virtual Box up and running!

My connection to twitch is encountering problems. It is connecting fine, but the encoder is not functioning properly.
This is the message I am receiving:
Max keyframe interval is currently at 8.0 seconds. Please set it to 2 seconds.
The broadcast is not set to constant bitrate (CBR). [Current average: 1896 kbps, current max: 2559.124 kbps"

Nginx not starting with "vagrant up"

The setup is working great, and im streaming to 3 different streaming services!

But i just have a quick question:

When ill start streaming do i have to run "vagrant up" and then "vagrant provision" to get the VM up and Nginx starting?

If i only run vagrant up, it does not start Nginx, but if i do "vagrant provision" it starts checking for VM updates, and then it starts Nginx.
Do you have any tips on how i should start the VM and Nginx without downloading ALOT of updates everytime i wanna stream?

command: vagrant up, fails when trying to connect to VM

When executing the command vagrant up the full process is as follows:

`Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'ubuntu/trusty64'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'ubuntu/trusty64' is up to date...
==> default: Setting the name of the VM: multi-stream_default_1515520520856_39720
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
default: Adapter 1: nat
default: Adapter 2: hostonly
==> default: Forwarding ports...
default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
default: SSH address: 127.0.0.1:2222
default: SSH username: vagrant
default: SSH auth method: private key
Timed out while waiting for the machine to boot. This means that
Vagrant was unable to communicate with the guest machine within
the configured ("config.vm.boot_timeout" value) time period.

If you look above, you should be able to see the error(s) that
Vagrant had when attempting to connect to the machine. These errors
are usually good hints as to what may be wrong.

If you're using a custom box, make sure that networking is properly
working and you're able to connect to the machine. It is a common
problem that networking isn't setup properly in these boxes.
Verify that authentication configurations are also setup properly,
as well.

If the box appears to be booting properly, you may want to increase
the timeout ("config.vm.boot_timeout") value.
`

This is an awesome tool and I hope to get it working

Could not connect to server

Hello, im having an issue when trying to stream through OBS. I get this message: Could not connnect to server 192.168.42.42:1935/live is offline. Try a different server (10061).

I am able to ping the VM from my PC.

here is my nginx.conf file:
test.txt

New Error

I've been running it for almost 4 months without a problem, but funny enough yesterday it gave me an error right before I went streaming.

D:\Multi-Streaming-Server-master>vagrant version
Installed Version: 1.8.5
Latest Version: 1.8.5

You're running an up-to-date version of Vagrant!

D:\Multi-Streaming-Server-master>vagrant reload
==> default: Checking if box 'ubuntu/trusty64' is up to date...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
default: Adapter 1: nat
default: Adapter 2: hostonly
==> default: Forwarding ports...
default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
The guest machine entered an invalid state while waiting for it
to boot. Valid states are 'starting, running'. The machine is in the
'poweroff' state. Please verify everything is configured
properly and try again.

If the provider you're using has a GUI that comes with it,
it is often helpful to open that and watch the machine, since the
GUI often has more helpful error messages than Vagrant can retrieve.
For example, if you're using VirtualBox, run vagrant up while the
VirtualBox GUI is open.

The primary issue for this error is that the provider you're using
is not properly configured. This is very rarely a Vagrant issue.

I actually tried deleting everything and just keeping my nginx config file. But the same error happens!

Could you help me? :(

Restart just one service

Hi, I know it's not your main concern, if you have the time, could you make a way somehow I can restart the stream just for 1 service?

I've been streaming to youtube/hitbox/twitch lately, one day youtube was "frozen" and the others seemed fine, so I stopped OBS and started the stream again. Obviously all my streams were gone for the time. It would be amazing if I could just restart one specific stream.

I know you are a busy person so dont worry much about it.

Also, sorry if I didnt find the right place to post this.

PS: amazing job you've done so far. I'm loving it.

./bootstrap.sh fails

EDIT : NB : I obviously replaced everything between curly braces in the configuration file.

Hello,

I tried to execute chmod +x bootstrap.sh && ./bootstrap.sh but always ends as follow :

cc -c -pipe  -O -W -Wall -Wpointer-arith -Wno-unused -Werror -g  -I../nginx-rtmp-module-1.2.1 -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs \
        -o objs/src/core/ngx_file.o \
        src/core/ngx_file.c
cc -c -pipe  -O -W -Wall -Wpointer-arith -Wno-unused -Werror -g  -I../nginx-rtmp-module-1.2.1 -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs \
        -o objs/src/core/ngx_crc32.o \
        src/core/ngx_crc32.c
cc -c -pipe  -O -W -Wall -Wpointer-arith -Wno-unused -Werror -g  -I../nginx-rtmp-module-1.2.1 -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs \
        -o objs/src/core/ngx_murmurhash.o \
        src/core/ngx_murmurhash.c
src/core/ngx_murmurhash.c: In function ‘ngx_murmur_hash2’:
src/core/ngx_murmurhash.c:37:11: error: this statement may fall through [-Werror=implicit-fallthrough=]
         h ^= data[2] << 16;
         ~~^~~~~~~~~~~~~~~~
src/core/ngx_murmurhash.c:38:5: note: here
     case 2:
     ^~~~
src/core/ngx_murmurhash.c:39:11: error: this statement may fall through [-Werror=implicit-fallthrough=]
         h ^= data[1] << 8;
         ~~^~~~~~~~~~~~~~~
src/core/ngx_murmurhash.c:40:5: note: here
     case 1:
     ^~~~
cc1: all warnings being treated as errors
objs/Makefile:524: recipe for target 'objs/src/core/ngx_murmurhash.o' failed
make[1]: *** [objs/src/core/ngx_murmurhash.o] Error 1
make[1]: Leaving directory '/home/imsbros/Multi-Streaming-Server/nginx-1.9.5'
Makefile:8: recipe for target 'build' failed
make: *** [build] Error 2
make -f objs/Makefile install
make[1]: Entering directory '/home/imsbros/Multi-Streaming-Server/nginx-1.9.5'
cc -c -pipe  -O -W -Wall -Wpointer-arith -Wno-unused -Werror -g  -I../nginx-rtmp-module-1.2.1 -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs \
        -o objs/src/core/ngx_murmurhash.o \
        src/core/ngx_murmurhash.c
src/core/ngx_murmurhash.c: In function ‘ngx_murmur_hash2’:
src/core/ngx_murmurhash.c:37:11: error: this statement may fall through [-Werror=implicit-fallthrough=]
         h ^= data[2] << 16;
         ~~^~~~~~~~~~~~~~~~
src/core/ngx_murmurhash.c:38:5: note: here
     case 2:
     ^~~~
src/core/ngx_murmurhash.c:39:11: error: this statement may fall through [-Werror=implicit-fallthrough=]
         h ^= data[1] << 8;
         ~~^~~~~~~~~~~~~~~
src/core/ngx_murmurhash.c:40:5: note: here
     case 1:
     ^~~~
cc1: all warnings being treated as errors
objs/Makefile:524: recipe for target 'objs/src/core/ngx_murmurhash.o' failed
make[1]: *** [objs/src/core/ngx_murmurhash.o] Error 1
make[1]: Leaving directory '/home/imsbros/Multi-Streaming-Server/nginx-1.9.5'
Makefile:12: recipe for target 'install' failed
make: *** [install] Error 2
Start Nginx service
/usr/local/nginx/script/restart.sh: line 9: nginx: command not found
/usr/local/nginx/script/restart.sh: line 12: /usr/sbin/nginx: No such file or directory
Error: Nginx's configuration file contains some errors.
Start Nginx config file monitoring
warn:    --minUptime not set. Defaulting to: 1000ms
warn:    --spinSleepTime not set. Your script will exit if it does not stay up for at least 1000ms
info:    Forever processing file: server.js

not pushing to facebook

https://i.imgur.com/RsfF3jC.png

it seens to be ok, but nothing show on my facebook live, here is my .conf:

`#user nobody;
worker_processes 1;

error_log logs/error.log debug;
error_log logs/error.log notice;
error_log logs/error.log info;
pid logs/nginx.pid;

events {
worker_connections 1024;
}

http {
include mime.types;
default_type application/octet-stream;

sendfile            on;
keepalive_timeout   65;

server {
    listen          8080;
    server_name     localhost;

    # rtmp stat
    location /stat {
        rtmp_stat all;
        rtmp_stat_stylesheet stat.xsl;
    }
    location /stat.xsl {
        # you can move stat.xsl to a different location
        root html;
    }

    # rtmp control
    location /control {
        rtmp_control all;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}

}

rtmp {
server {
listen 1935;
chunk_size 8192;

    application live {
        live on;
        record off;
        			
        push rtmp://localhost/facebook/${name};
    }

	application facebook {
		live on;
		record off;

		push rtmp://live-api-a.facebook.com:80/2415039085192327?s_ps=1&s_sw=0&s_vt=api-s&a=AbwIId-qcTTVEkLA;
	}
}

}`

Obs restart loop

Fresh install i got the server running, but obs go into restart loop.

Here my log files

ACCESS

MY-IP [13/Mar/2018:21:39:07 -0300] PUBLISH "live" "" "" - 341 409 "" "FMLE/3.0 (compatible; FMSc/1.0)" (0s)
MY-IP [13/Mar/2018:21:39:18 -0300] PUBLISH "live" "" "" - 341 409 "" "FMLE/3.0 (compatible; FMSc/1.0)" (0s)
MY-IP [13/Mar/2018:21:39:30 -0300] PUBLISH "live" "" "" - 341 409 "" "FMLE/3.0 (compatible; FMSc/1.0)" (0s)
MY-IP [13/Mar/2018:21:39:41 -0300] PUBLISH "live" "" "" - 341 409 "" "FMLE/3.0 (compatible; FMSc/1.0)" (0s)
MY-IP [13/Mar/2018:21:39:52 -0300] PUBLISH "live" "" "" - 341 409 "" "FMLE/3.0 (compatible; FMSc/1.0)" (0s)
MY-IP [13/Mar/2018:21:40:06 -0300] PUBLISH "live" "" "" - 341 409 "" "FMLE/3.0 (compatible; FMSc/1.0)" (0s)

ERROR

2018/03/13 21:39:29 [info] 25079#0: *256 client connected 'MY-IP'
2018/03/13 21:39:29 [info] 25079#0: *256 client connected 'MY-IP'
2018/03/13 21:39:29 [info] 25079#0: *256 connect: app='live' args='' flashver='FMLE/3.0 (compatible; FMSc/1.0)' swf_url='rtmp://DEDICATED-IP:1935/live' tc_url='rtmp://DEDICATED-IP:1935/live' page_url='' acodecs=0 vcodecs=0 object_encoding=0, client: MY-IP, server: 0.0.0.0:1935
2018/03/13 21:39:29 [info] 25079#0: *256 connect: app='live' args='' flashver='FMLE/3.0 (compatible; FMSc/1.0)' swf_url='rtmp://DEDICATED-IP:1935/live' tc_url='rtmp://DEDICATED-IP:1935/live' page_url='' acodecs=0 vcodecs=0 object_encoding=0, client: MY-IP, server: 0.0.0.0:1935
2018/03/13 21:39:30 [info] 25079#0: *256 createStream, client: MY-IP, server: 0.0.0.0:1935
2018/03/13 21:39:30 [info] 25079#0: *256 createStream, client: MY-IP, server: 0.0.0.0:1935
2018/03/13 21:39:30 [info] 25079#0: *256 publish: name='' args='' type=live silent=0, client: MY-IP, server: 0.0.0.0:1935
2018/03/13 21:39:30 [info] 25079#0: *256 publish: name='' args='' type=live silent=0, client: MY-IP, server: 0.0.0.0:1935
2018/03/13 21:39:30 [info] 25079#0: *256 exec: starting managed child 'ffmpeg', client: MY-IP, server: 0.0.0.0:1935
2018/03/13 21:39:30 [info] 25079#0: *256 exec: starting managed child 'ffmpeg', client: MY-IP, server: 0.0.0.0:1935
2018/03/13 21:39:30 [info] 25079#0: *256 relay: create push name='' app='' playpath='' url='localhost/youtube/${name}', client: MY-IP, server: 0.0.0.0:1935
2018/03/13 21:39:30 [info] 25079#0: *256 relay: create push name='' app='' playpath='' url='localhost/youtube/${name}', client: MY-IP, server: 0.0.0.0:1935
2018/03/13 21:39:30 [info] 25079#0: *256 relay: create push name='' app='' playpath='' url='localhost/dailymotion/${name}', client: MY-IP, server: 0.0.0.0:1935
2018/03/13 21:39:30 [info] 25079#0: *256 relay: create push name='' app='' playpath='' url='localhost/dailymotion/${name}', client: MY-IP, server: 0.0.0.0:1935
2018/03/13 21:39:30 [info] 25079#0: *256 relay: create push name='' app='' playpath='' url='localhost/hitbox/${name}', client: MY-IP, server: 0.0.0.0:1935
2018/03/13 21:39:30 [info] 25079#0: *256 relay: create push name='' app='' playpath='' url='localhost/hitbox/${name}', client: MY-IP, server: 0.0.0.0:1935
2018/03/13 21:39:30 [error] 25079#0: *256 access forbidden by rule, client: MY-IP, server: 0.0.0.0:1935
2018/03/13 21:39:30 [error] 25079#0: *256 access forbidden by rule, client: MY-IP, server: 0.0.0.0:1935
2018/03/13 21:39:30 [error] 25079#0: *256 access forbidden by rule, client: MY-IP, server: 0.0.0.0:1935
2018/03/13 21:39:30 [info] 25079#0: *256 disconnect, client: MY-IP, server: 0.0.0.0:1935
2018/03/13 21:39:30 [info] 25079#0: *256 disconnect, client: MY-IP, server: 0.0.0.0:1935
2018/03/13 21:39:30 [info] 25079#0: *256 deleteStream, client: MY-IP, server: 0.0.0.0:1935
2018/03/13 21:39:30 [info] 25079#0: *256 deleteStream, client: MY-IP, server: 0.0.0.0:1935
2018/03/13 21:39:30 [info] 25079#0: *256 exec: terminating child 27861, client: MY-IP, server: 0.0.0.0:1935
2018/03/13 21:39:30 [info] 25079#0: *256 exec: terminating child 27861, client: MY-IP, server: 0.0.0.0:1935
2018/03/13 21:39:30 [info] 25079#0: *259 disconnect, client: localhost/hitbox/${name}, server: ngx-relay
2018/03/13 21:39:30 [info] 25079#0: *259 disconnect, client: localhost/hitbox/${name}, server: ngx-relay
2018/03/13 21:39:30 [info] 25079#0: *259 deleteStream, client: localhost/hitbox/${name}, server: ngx-relay
2018/03/13 21:39:30 [info] 25079#0: *259 deleteStream, client: localhost/hitbox/${name}, server: ngx-relay
2018/03/13 21:39:30 [info] 25079#0: *258 disconnect, client: localhost/dailymotion/${name}, server: ngx-relay
2018/03/13 21:39:30 [info] 25079#0: *258 disconnect, client: localhost/dailymotion/${name}, server: ngx-relay
2018/03/13 21:39:30 [info] 25079#0: *258 deleteStream, client: localhost/dailymotion/${name}, server: ngx-relay
2018/03/13 21:39:30 [info] 25079#0: *258 deleteStream, client: localhost/dailymotion/${name}, server: ngx-relay
2018/03/13 21:39:30 [info] 25079#0: *257 disconnect, client: localhost/youtube/${name}, server: ngx-relay
2018/03/13 21:39:30 [info] 25079#0: *257 disconnect, client: localhost/youtube/${name}, server: ngx-relay
2018/03/13 21:39:30 [info] 25079#0: *257 deleteStream, client: localhost/youtube/${name}, server: ngx-relay
2018/03/13 21:39:30 [info] 25079#0: *257 deleteStream, client: localhost/youtube/${name}, server: ngx-relay
2018/03/13 21:39:30 [info] 25079#0: *260 client connected '127.0.0.1'
2018/03/13 21:39:30 [info] 25079#0: *260 client connected '127.0.0.1'
2018/03/13 21:39:30 [info] 25079#0: *260 disconnect, client: 127.0.0.1, server: 0.0.0.0:1935
2018/03/13 21:39:30 [info] 25079#0: *260 disconnect, client: 127.0.0.1, server: 0.0.0.0:1935
2018/03/13 21:39:30 [info] 25079#0: *260 deleteStream, client: 127.0.0.1, server: 0.0.0.0:1935
2018/03/13 21:39:30 [info] 25079#0: *260 deleteStream, client: 127.0.0.1, server: 0.0.0.0:1935
2018/03/13 21:39:30 [info] 25079#0: *261 client connected '127.0.0.1'
2018/03/13 21:39:30 [info] 25079#0: *261 client connected '127.0.0.1'
2018/03/13 21:39:30 [info] 25079#0: *261 disconnect, client: 127.0.0.1, server: 0.0.0.0:1935
2018/03/13 21:39:30 [info] 25079#0: *261 disconnect, client: 127.0.0.1, server: 0.0.0.0:1935
2018/03/13 21:39:30 [info] 25079#0: *261 deleteStream, client: 127.0.0.1, server: 0.0.0.0:1935
2018/03/13 21:39:30 [info] 25079#0: *261 deleteStream, client: 127.0.0.1, server: 0.0.0.0:1935
2018/03/13 21:39:30 [info] 25079#0: *262 client connected '127.0.0.1'
2018/03/13 21:39:30 [info] 25079#0: *262 client connected '127.0.0.1'
2018/03/13 21:39:30 [info] 25079#0: *262 disconnect, client: 127.0.0.1, server: 0.0.0.0:1935
2018/03/13 21:39:30 [info] 25079#0: *262 disconnect, client: 127.0.0.1, server: 0.0.0.0:1935
2018/03/13 21:39:30 [info] 25079#0: *262 deleteStream, client: 127.0.0.1, server: 0.0.0.0:1935
2018/03/13 21:39:30 [info] 25079#0: *262 deleteStream, client: 127.0.0.1, server: 0.0.0.0:1935
2018/03/13 21:39:30 [notice] 25079#0: signal 17 (SIGCHLD) received
2018/03/13 21:39:30 [notice] 25079#0: signal 17 (SIGCHLD) received
2018/03/13 21:39:30 [notice] 25079#0: signal 17 (SIGCHLD) received
2018/03/13 21:39:30 [alert] 25079#0: unknown process 27861 exited on signal 9
2018/03/13 21:39:30 [alert] 25079#0: unknown process 27861 exited on signal 9
2018/03/13 21:39:30 [alert] 25079#0: unknown process 27861 exited on signal 9
2018/03/13 21:39:30 [info] 25079#0: epoll_wait() failed (4: Interrupted system call)
2018/03/13 21:39:30 [info] 25079#0: epoll_wait() failed (4: Interrupted system call)

Facebook Live?

Can this be used for facebook live streaming also? I do not see any settings for it in the nginx.conf file

Issue with remote connection

i'm using vagrant and it appear to be working, i'm connecting to the machine over ssh and can see the server up and running.

Change in Vagrantfile

config.vm.network "public_network"

OBS connects just fine, to the public IP however external IPs cannot connect to the RTMP stream. Is this something wrong with my virtualbox driver? or anything you would know? the stats page shows the inbound data and then I can stream the content locally and it shows the output...it just doesn't work over the network externally (not sure if internally from another computer either, i'll check that tomorrow). I'll also test this on another computer.

nginx.conf

The machine is now launching properly with the VT-x! Thank you.
Now, I am not able to configure the nginx.conf properly.
Could you specify which lines need to be altered to my inputs, please.
I have grown extremely frustrated, although I have learned.

My apologies if I submitted this thread twice

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.