Git Product home page Git Product logo

mjsip's Introduction

mjSIP - a complete Java-based SIP stack implementation

SIP (Session Initiation Protocol) is the IETF (Internet Engineering Task Force) signaling standard for managing multimedia session initiation defined in RFC 3261 commonly used in VOIP communication. SIP can be used to initiate voice, video and multimedia sessions, for both interactive applications (e.g. an VOIP phone calls or a video conference applications) and non-interactive ones (e.g. video streaming).

The mjSIP stack has been used in research activities by Dept. of Engineering and Architecture at University of Parma and by DIE - University of Roma "Tor Vergata" and several commercial products.

mjSIP Features

mjSIP includes all classes and methods for creating SIP-based applications. It implements the complete layered stack architecture as defined in RFC 3261 (Transport, Transaction, and Dialog layers), and is fully compliant with RFC 3261 and successive standard RFCs. Moreover it includes higher level interfaces for Call Control and User Agent implementations. mjSIP comes with a core package implementation that includes:

  • all standard SIP layers and components,
  • various SIP extensions (already defined within IETF),
  • some useful call control APIs (e.g. Call-Control, UserAgent, etc.),
  • a reference implementation of some SIP systems (Proxy Server, Session Border Controlleer, and User Agent).

Changes since 1.8

  • Added Maven build.
  • Split source into core modules sip, server, ua, and supporting modules net, sound, and util. Extracted examples into modules examples and phone.
  • Code cleanup: Added type parameter, added override annotations, reduced excessive logging, made fields private final where possible, removed mutable static fields, replaced lazy initialization with defined initialization order, reduced number of constructors, enhanced configuration file parsing with args4j, applied Java naming conventions, encapsulated fields. Access configuration from production code through read-only interfaces.
  • Replaced self-made logging with slf4j over tinylog.
  • Clarified transaction timeout handling with separate handler methods for each timeout.
  • Modernized scheduling using ScheduledThreadPoolExecutor.
  • Implemented listening on DTMF info messages.
  • Implemented port pool for RTP media streams.
  • Fixed parsing of SDP messages with well-known formats that are not explained in rtpmap fields.
  • Separated creation of concrete media streams from user agent handling. Removed audio file configuration (for steaming and recording) from core components.
  • Pulled out system audio sounds played when calls are incoming, accepted, or terminated to client code.
  • Added audio filter for silence stripping.
  • Added IPv6 support.
  • Added Java module support.

License

mjSIP is available open source under the terms of the GNU GPL license (General Public Licence) as published by the Free Software Foundation.

See also

The project's original home page is at: http://mjsip.org/

There are several independent forks of the project on Github:

mjsip's People

Contributors

haumacher avatar hduelme avatar ven1337 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

mjsip's Issues

Making Sip Implementation using WebRTC

Hi. So I have an open-source project I am making called Ripple Server. I am trying to integrate mjsip into the server as a plugin feature that users can use if they require it to be able to make calls via this SIP library.

I need help to further understand how to implement this library. Yes, I am able to make a registration and pass the SDP from a client, but I get an error after the fact, and it's very from null media description objects from the library. How can I go about fixing this? Yes, the call also gets accepted, and the status can also be in progress as well. Please, can you assist?

Temporary file for *.wav files never gets deleted

The temporary *.tmp file created by the AudioFile class, when saving*.wavfiles, never gets deleted. Even toughtmp.delete()` is called.
You also can not remove it manually because the java process is still holding a reference.

This is because the input stream, which is used to copy the *.tmp file to the actual *.wav file is never closed.

It is fixed by closing the AudioInputStream after AudioSystem.write(...) has written the *.wav file (see here).

Making outbound calls with UserAgentGui and UserAgentCli

Hi,

I have successfully registered both the UserAgentGui and UserAgentCli to an Asterisk server. I can call both the UserAgentGui and UserAgentCli phones using another SIP phone, and I am able to answer the inbound calls and have successful conversations. However, I am unable to make outbound calls to another SIP phone on the same Asterisk server. I receive the following error:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException: Cannot invoke "org.mjsip.sdp.SdpMessage.toString()" because "session_descriptor" is null
	at org.mjsip.sip.dialog.InviteDialog.invite(InviteDialog.java:315)
	at org.mjsip.sip.dialog.InviteDialog.inviteWithoutOffer(InviteDialog.java:367)
	at org.mjsip.sip.call.ExtendedCall.call(ExtendedCall.java:135)
	at org.mjsip.sip.call.Call.call(Call.java:183)
	at org.mjsip.sip.call.Call.call(Call.java:176)
	at org.mjsip.ua.UserAgent.call(UserAgent.java:180)
	at org.mjsip.ua.UserAgent.call(UserAgent.java:170)
	at org.mjsip.ua.UserAgent.call(UserAgent.java:156)
	at org.mjsip.phone.gui.UserAgentGui.jButton1_actionPerformed(UserAgentGui.java:431)
	at org.mjsip.phone.gui.UserAgentGui$2.actionPerformed(UserAgentGui.java:310)

I run both programs with the following parameters: -f ../mjsip.cfg --prefer-ipv4 true --address sip:[email protected]:5060
and with the following config file:

# 
#                   MjSip-1.7 Configuration File
# ________________________________________________________________
#
# This file inclues all MjSip configuration parameters.
# MjSip parameters are organized into 6 sections:
#  o Section 1: SipStack base configuration
#  o Section 2: Logs
#  o Section 3: SipProvider configuration
#  o Section 4: Server configuration
#  o Section 5: UA configuration
#  o Section 6: SBC configuration
#



# ________________________________________________________________
#
# Section 1: SipStack base configuration
# ________________________________________________________________
#
# Normally, you do not have to change the base configuration,
# and you can go directly to Section 2.
# SIP and transport layer configurations are handled in Section 3. 
#

# Default SIP port.
# Note that this is not the port used by the running stack, but simply the standard default SIP port.
# Normally it sould be set to 5060 as defined by RFC 3261. Using a different value may cause
# some problems when interacting with other unaware SIP UAs. 
# Default value: default_port=5060
#default_port=5060

# Default SIP port for TLS transport (SIPS).
# Note that this is not the port used by the running stack, but simply the standard default SIPS port.
# Normally it sould be set to 5061 as defined by RFC 3261. Using a different value may cause
# some problems when interacting with other unaware SIP UAs.
#default_tls_port=5061

# Default supported transport protocols.
# Default value: default_transport_protocols=udp,tcp
#default_transport_protocols=udp

# Default max number of contemporary open transport connections.
# Default value: default_nmax_connections=32
#default_nmax_connections=0

# Whether adding 'rport' parameter on via header fields of outgoing requests.
# Default value: use_rport=yes
#use_rport=no

# Whether adding (forcing) 'rport' parameter on via header field of incoming responses.
# Default value: force_rport=no
#force_rport=yes

# Starting retransmission timeout (milliseconds); called T1 in RFC2361; they suggest T1=500ms 
# Default value: retransmission_timeout=500
#retransmission_timeout=2000 

# Maximum retransmission timeout (milliseconds); called T2 in RFC2361; they suggest T2=4sec 
# Default value: max_retransmission_timeout=4000  
#max_retransmission_timeout=4000  

# Transaction timeout (milliseconds); RFC2361 suggests 64*T1=32000ms 
# Default value: transaction_timeout=32000
#transaction_timeout=10000    

# Clearing timeout (milliseconds); T4 in RFC2361; they suggest T4=5sec 
# Default value: clearing_timeout=5000
#clearing_timeout=5000

# Default max-forwards value (RFC3261 recommends value 70).
# Default value: max_forwards=70
#max_forwards=10

# Whether using only one thread for all timer instances (less precise but more efficient).
# Default value: single_timer=yes
#single_timer=no

# Whether at UAS side automatically sending (by default) a 100 Trying on INVITE.
# Default value: auto_trying=yes
#auto_trying=no

# Whether 1xx responses create an "early dialog" for methods that create dialog.
# Default value: early_dialog=no
#early_dialog=yes

# Default 'expires' time in seconds. RFC2361 gives as default value expires=3600 
# Default value: default_expires=3600
#default_expires=1800

# UA info included in request messages (in the User-Agent header field).
# Use 'NONE' string or let it blank if the User-Agent header filed must be added.
# Default value: ua_info=<the mjsip release>
# ua_info=NONE

# Server info included in request messages (in the Server header field).
# Use 'NONE' string or let it blank if the Server header filed must be added.
# Default value: server_info=<the mjsip release>
# server_info=NONE

# Starting registration timeout (msecs) after a registration failure due to request timeout.
# Default value: regc_min_attempt_timeout=60*1000 (that is 1min)
#regc_min_attempt_timeout=30*1000

# Maximum registration timeout (msecs) after a registration failure due to request timeout.
# Default value: regc_max_attempt_timeout=900*1000 (that is 15min)
#regc_max_attempt_timeout=600*1000

# Maximum number of consecutive registration authentication attempts before giving up.
# Default value: regc_auth_attempts=3
#regc_auth_attempts=5

# Whether forcing this node to stay within the dialog route as peer,
# by means of the insertion of a RecordRoute header.
# This is a non-standard behaviour and is normally not necessary.
# Default value: on_dialog_route=no
#on_dialog_route=yes



# ________________________________________________________________
#
# Section 3: SipProvider configuration
# ________________________________________________________________
#
# Change these parameters in order to customize the SIP transport layer.
# Usually you have to deal with some of these configuration parameters.
#

# Via IP address or fully-qualified domanin name (FQDN).
# Use 'AUTO-CONFIGURATION' for auto detection (or let it undefined).
# Default value: via_addr=AUTO-CONFIGURATION
via_addr=10.252.1.213

# Local SIP port.
# Default value: host_port=5060
#host_port=5060

# Network interface (IP address) used by SIP.
# Use 'all-interfaces' for binding SIP to all interfaces (or let it undefined).
# Default value: host_ifaddr=ALL-INTERFACES
#host_ifaddr=ALL-INTERFACES

# List of enabled transport protocols (the first protocol is used as default)
# Default value: transport_protocols=udp
transport_protocols=udp

# List of transport ports, ordered as the corresponding transport_protocols.
#transport_ports=5060,5060

# Max number of contemporary open transport connections.
# Default value: nmax_connections=32
#nmax_connections=0

# Outbound proxy URL ([sip:]host_addr[:host_port][;transport=proto]).
# Use 'NONE' for not using an outbound proxy (or let it undefined).
# Default value: outbound_proxy=NONE
#outbound_proxy=proxy.example.net:5060

# Whether logging all packets (including non-SIP keepalive tokens).
# Default value: log_all_packets=no
#log_all_packets=yes

# For TLS. Whether all client and server certificates should be considered trusted.
# By default, trust_all=no
#trust_all=yes

# For TLS. Path of the folder where trusted certificates are placed.
# All certificates (with file extension ".crt") found in this folder are considered trusted.
# By default, the folder "./cert" is used.
#trust_folder=cert

# For TLS. Absolute file name of the certificate (containing the public key) of the local node.
# The file name includes the full path starting from the current working folder.
# By default, the file "./cert/ssl.crt" is used.
#cert_file=cert/tls.crt

# For TLS. Absolute file name of the private key of the local node.
# The file name includes the full path starting from the current working folder.
# By default, the file "./cert/ssl.key" is used.
#key_file=cert/tls.key


# ________________________________________________________________
#
# Section 4: Server configuration
# ________________________________________________________________
#
# Change these parameters in order to customize the Server behaviour.
# You need to edit this section only if you are using a MjSip Server.
#

# The domain name(s) that the server administers.
# It lists the domain names for which the Location Service wmaintains user bindings. 
# Use 'auto-configuration' for automatic configuration of the domain name.
#domain_names=example.net example.com
#domain_names=AUTO-CONFIGURATION

# Whether consider any port as valid local domain port (regardless which sip port is used).
# Default value: domain_port_any=no
#domain_port_any=yes

# Whether the Server should act as Registrar (i.e. respond to REGISTER requests).    
# Default value: is_registrar=yes
#is_registrar=no

# Maximum expires time (in seconds).
# Default value: expires=3600
#expires=1800

# Whether the Registrar can register new users (i.e. REGISTER requests from unregistered users).    
# Default value: register_new_users=yes
#register_new_users=no

# Whether the Server relays requests for (or to) non-local users.   
# Default value: is_open_proxy=yes
#is_open_proxy=no

# The type of location service.
# You can specify the location service type (e.g. local, ldap, radius, mysql)
# or the class name (e.g. local.server.LocationServiceImpl).
# Default value: location_service=local
#location_service=ldap

# The name of the location DB.
# Default value: location_db=users.db
#location_db=config/users.db

# Whether location DB has to be cleaned at startup.
# Default value: clean_location_db=no
#clean_location_db=yes

# Whether the Server authenticates local users.   
# Default value: do_authentication=no
#do_authentication=yes

# Whether the Proxy authenticates users.
# Default value: do_proxy_authentication=no
#do_proxy_authentication=yes

# The authentication scheme.
# You can specify the authentication scheme name (e.g. Digest, AKA, etc.)
# or the class name (e.g. local.server.AuthenticationServerImpl).
# Default value: authentication_scheme=Digest
#authentication_scheme=AKA

# The authentication realm.
# If not defined or equal to 'NONE' (default), the used via address is used instead.
# Default value: authentication_realm=NONE
#authentication_realm=example.net

# The type of authentication service.
# You can specify the authentication service type (e.g. local, ldap, radius, mysql)
# or the class name (e.g. local.server.AuthenticationServiceImpl).
# Default value: authentication_service=local
#authentication_service=ldap

# The name of the authentication DB.
# Default value: authentication_db=aaa.db
#authentication_db=config/aaa.db

# Whether the server should stay in the signaling path (uses Record-Route/Route).
# Default value: on_route=no
#on_route=yes

# Whether implementing the RFC3261 Loose Route (or RFC2543 Strict Route) rule.
# Default value: loose_route=yes
#loose_route=no

# Whether checking for loops before forwarding a request (Loop Detection). In RFC3261 it is optional.
# Default value: loop_detection=yes
#loop_detection=no

# Proxy transaction timeout (in milliseconds), that corresponds to Timer "C" of RFC2361;
# RFC2361 suggests C>3min=180000ms.
# Default value: proxy_transaction_timeout=180000
#proxy_transaction_timeout=120000

# Sequence of pairs of username or phone prefix and corresponding nexthop address.
# It provides static rules for proxying number-based SIP-URL the server is responsible for.
# Use "default" (or "*") as default prefix.
# Example:
#   server is responsible for the domain 'example.com'
#   phone_proxying_rules={prefix=0123,nexthop=127.0.0.2:7002} {prefix=4567,nexthop=127.0.0.2:7003} {prefix=*,nexthop=127.0.0.3:7004}
#   a message with recipient 'sip:[email protected]' is forwarded to 'sip:[email protected]:7002'
#authenticated_phone_proxying_rules={prefix=0123,nexthop=127.0.0.2:7002}
#phone_proxying_rules={prefix=4567,nexthop=127.0.0.2:7003} {prefix=*,nexthop=127.0.0.3:7004}

# Sequence of pairs of destination domain and corresponding nexthop address.
# It provides static rules for proxying domain-based SIP-URL the server is NOT responsible for.
# It make the server acting (also) as 'Interrogating' Proxy, i.e. I-CSCF in the 3G networks.
# Example: <br>
#   server is responsible for the domain 'example.com'
#   domain_proxying_rules={domain=domain1.foo,nexthop=proxy.example.net:5060}
#   a message with recipient 'sip:[email protected]' is forwarded to 'sip:[email protected]:5060'
#authenticated_domain_proxying_rules={domain=domain1.foo,nexthop=192.168.0.4:5060}
#domain_proxying_rules={domain=domain2.foo,nexthop=192.168.0.5:5060}



# ________________________________________________________________
#
# Section 5: UA configuration
# ________________________________________________________________
#
# Change these parameters in order to customize the UA profile.
# You need to edit this section only if you are using a MjSip UA or
# you are managing 3PCC services.
#

# Display name for the user.
# It is used in the user's AOR registered to the registrar server and used as From URL.
display_name=777

# User's name.
# It is used to build the user's AOR registered to the registrar server and used as From URL.
user=777

# Fully qualified domain name (or address) of the proxy server.
# It is part of the user's AOR registered to the registrar server and used as From URL.
# If 'proxy' is not defined, the 'registrar' value is used in its place.
# If 'registrar' is not defined, the 'proxy' value is used in its place.
#proxy=proxy.example.net

# Fully qualified domain name (or address) of the registrar server.
# It is used as recipient for REGISTER requests.
# If 'registrar' is not defined, the 'proxy' value is used in its place.
# If 'proxy' is not defined, the 'registrar' value is used in its place.
registrar=10.252.1.213

# Contact URL.
# If not defined (default), it is formed as sip:user@via_addr:host_port.
# Normally you can leave it undefined.
#contact_url=sip:[email protected]:5070
#contact_url=sip:[email protected]:5060

# User's name used for server authentication.
auth_user=777

# User's realm used for server authentication.
auth_realm=asterisk

# User's passwd used for server authentication.
auth_passwd=password

# Absolute path (or complete URL) of the jar archive, where various UA media (gif, wav, etc.) are stored.
# Use value 'NONE' for getting resources from external folders.
# Default value: ua_jar=lib/ua.jar
#ua_jar=lib/ua.jar

# Absolute path (or complete URI) of the folder containing UA's resources.
# By default, the local folder "resources" is used.
#res_path=resources

# Relative path of UA media resources (gif, wav, etc.) within the UA jar file or within the resources folder. 
# By default, the folder "media/local/ua" is used.
#media_path=media/local/ua

# Absolute path (or complete URL) of the buddy list file where the buddy list is and loaded from (and saved to).
# Default value: buddy_list_file=buddy.lst
#buddy_list_file=config/buddy.lst

# Whether registering with the registrar server.
# Default value: do_register=no
do_register=yes

# Whether unregistering the contact address.
# Default value: do_unregister=no
#do_unregister=yes

# Whether unregistering all contacts beafore registering the contact address.
# Default value: do_unregister_all=no
#do_unregister_all=yes

# Expires time.
# Default value: expires=3600
# expires=1800

# Rate of keep-alive tokens (datagrams) sent toward the outbound proxy (if present) or toward the registrar server.
# Its value specifies the delta-time (in millesconds) between two keep-alive tokens.
# Set keepalive_time=0 for not sending keep-alive datagrams.
# Default value: keepalive_time=0
# keepalive_time=8000

# Automatic call a remote user secified by the 'call_to' value.
# Use value 'NONE' for manual calls (or let it undefined).
# Default value: call_to=NONE
#call_to=sip:[email protected]   
  
# Response time in seconds; it is the maximum time the user can wait before responding to an incoming call;
# after such time the call is automatically declined (refused).
# Default value: refuse_time=20

# Automatic answer time in seconds; time<0 corresponds to manual answer mode.
# Default value: accept_time=-1       
#accept_time=0

# Automatic hangup time (call duartion) in seconds; time<=0 corresponds to manual hangup mode.
# Default value: hangup_time=-1
#hangup_time=10

# Automatic call transfer time in seconds; time<0 corresponds to no auto transfer mode.
# Default value: transfer_time=-1
#transfer_time=10

# Automatic re-inviting time in seconds; time<0 corresponds to no auto re-invite mode.
# Default value: re_invite_time=-1
#re_invite_time=10

# Redirect incoming call to the secified url.
# Use value 'NONE' for not redirecting incoming calls (or let it undefined).
# Default value: redirect_to=NONE
#redirect_to=sip:[email protected]

# Transfer calls to the secified url.
# Use value 'NONE' for not transferring calls (or let it undefined).
# Default value: transfer_to=NONE
#transfer_to=sip:[email protected]

# No offer in the invite.
# Default value: no_offer=no
no_offer=yes

# Whether using audio.
# Default value: audio=no
audio=yes

# Whether using video.
# Default value: video=no
#video=yes

# Whether looping the received media streams back to the sender.
# Default value: loopback=no
#loopback=yes

# Whether playing in receive only mode.
# Default value: recv_only=no
#recv_only=yes

# Whether playing in send only mode.
# Default value: send_only=no
#send_only=yes

# Whether playing a test tone in send only mode.
# Default value: send_tone=no
#send_tone=yes

# Audio file to be played.
# Default value: send_file=NONE
#send_file=audio1.in

# Audio file to be recored.
# Default value: recv_file=NONE
#recv_file=audio1.out

# Media address (use it ONLY if you want to specify a media address different from the via address).
#media_addr=10.252.1.213

# First media port (use it ONLY if you want to specify media ports different from those specified by the 'media' parameter).
#media_port=7000

# Whether using symmetric_rtp.
# Default value: symmetric_rtp=no
#symmetric_rtp=yes

# Media descriptors:
# One or more 'media' (or 'media_desc') parameters specify for each supported media: the media type, port, and protocol/codec.
# Zero or more 'media_spec' parameters can be used to specify media attributes such as: codec name, sample rate, and frame size.
# Examples:
#   media=audio 4000 rtp/avp
#   media_spec=audio 0 PCMU 8000 160
#   media_spec=audio 8 PCMA 8000 160
#   media_spec=audio 101 G726-32 8000 80
#   media_spec=audio 102 G726-24 8000 60
#   media=video 3002 rtp/avp
#   media_spec=video 101
# Alternatively media attributes can be specified also within the 'media' parameter as comma-separated list between brackets.
# Examples:
#   media=audio 4000 rtp/avp {audio 0 PCMU 8000 160, audio 8 PCMA 8000 160}
#   media=video 3002 rtp/avp {video 101}
# Default values:
#media=audio 4000 rtp/avp
#media_spec=audio 0 PCMU 8000 160
#media=video 4002 rtp/avp
#media_spec=video 101
#media=audio 12506 RTP/AVP 0 8 101
media=audio 12858 RTP/AVP 0 101 {0 PCMU 8000 160, 8 PCMA 8000 160}

# Whether using JMF for audio streaming.
# Default value: use_jmf_audio=no
#use_jmf_audio=yes

# Whether using JMF for video streaming.
# Default value: use_jmf_video=yes
#use_jmf_video=no

# Whether using RAT (Robust Audio Tool) as audio sender/receiver.
# Default value: use_rat=no
#use_rat=yes

# RAT command-line executable.
# Default value: bin_rat=rat
#bin_rat=c:\programmi\mbone\rat

# Whether using VIC (Video Conferencing Tool) as video sender/receiver.
# Default value: use_vic=no
#use_vic=yes

# VIC command-line executable.
# Default value: bin_vic=vic
#bin_vic=c:\programmi\mbone\rat


# ________________________________________________________________
#
# Section 6: SBC
# ________________________________________________________________
#
# Change these parameters in order to customize the SessionBorderController (SBC) behaviour.
# You need to edit this section only if you are using a SBC.
#

# Maximum time that the UDP relay remains active without receiving UDP datagrams (in milliseconds).
# Default value: relay_timeout=60000

# Refresh time of address-binding cache (in milliseconds)
# Default value: binding_timeout=3600000

# Minimum time between two changes of peer address (in milliseconds)
# Default value: handover_time=0

# Rate of keep-alive datagrams sent toward all registered UAs (in milliseconds).
# Set keepalive_time=0 to disable the sending of keep-alive datagrams.
# Default value: keepalive_time=0

# Whether sending keepalive datagram to all contacted UAs (also toward non-registered UAs)
# Default value: keepalive_aggressive=no

# Minimum inter-packet departure time (in milliseconds).
# Set interpacket_time=0 to disable this option.
# Default value: interpacket_time=0 

# Whether intercepting media traffics.
# Default value: do_interception=no

# Whether injecting new media flows.
# Default value: do_active_interception=no

# Sink address for media traffic interception.
# Default value: sink_addr=127.0.0.1

# Sink port for media traffic interception.
# Default value: sink_port=0

# Media address.
# Default value: media_addr=0.0.0.0

# Available media ports.
# Default value: media_ports=41000-41499

# Backend proxy where all requests not coming from it are passed to. 
# It can be specified as FQDN or host_addr[:host_port].
# Use 'NONE' for not using a backend proxy (or let it undefined).
# Default value: backend_proxy=NONE
#backend_proxy=127.0.0.2:5069

Your help will be tremendously appreciated.

SRTP

Hello,

is there support for SRTP encrytped audio traffic? If so how can i enable SRTP for my UA.

Thanks

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.