Giter Club home page Giter Club logo

sx's Introduction

License Build Status GoReportCard Status Platform

sx is the command-line network scanner designed to follow the UNIX philosophy.

The goal of this project is to create the fastest network scanner with clean and simple code.

๐Ÿ“– Table of Contents

โœจ Features

  • โšก 30x times faster than nmap
  • ARP scan: Scan your local networks to detect live devices
  • ICMP scan: Use advanced ICMP scanning techniques to detect live hosts and firewall rules
  • TCP SYN scan: Traditional half-open scan to find open TCP ports
  • TCP FIN / NULL / Xmas scans: Scan techniques to bypass some firewall rules
  • Custom TCP scans with any TCP flags: Send whatever exotic packets you want and get a result with all the TCP flags set in the reply packet
  • UDP scan: Scan UDP ports and get full ICMP replies to detect open ports or firewall rules
  • Application scans:
    • SOCKS5 scan: Detect live SOCKS5 proxies by scanning ip range or list of ip/port pairs from a file
    • Docker scan: Detect open Docker daemons listening on TCP ports and get information about the docker node
    • Elasticsearch scan: Detect open Elasticsearch nodes and pull out cluster information with all index names
  • Randomized iteration over IP addresses using finite cyclic multiplicative groups
  • JSON output support: sx is designed specifically for convenient automatic processing of results

๐Ÿ“ฆ Install

The simplest way is to download from GitHub Releases and place the executable file in your PATH.

๐Ÿ›  Build from source

Requirements:

From the root of the source tree, run:

go build

๐Ÿš€ Quick Start

Here's a quick examples showing how you can scan networks with sx.

ARP scan

Scan your local network and display the IP address, MAC address and associated hardware vendor of connected devices:

sx arp 192.168.0.1/24

sample output:

192.168.0.1          b0:be:76:40:05:8d    TP-LINK TECHNOLOGIES CO.,LTD.
192.168.0.111        80:c5:f2:0b:02:e3    AzureWave Technology Inc.
192.168.0.171        88:53:95:2d:3c:af    Apple, Inc.

with JSON output:

sx arp --json 192.168.0.1/24

sample output:

{"ip":"192.168.0.1","mac":"b0:be:76:40:05:8d","vendor":"TP-LINK TECHNOLOGIES CO.,LTD."}
{"ip":"192.168.0.111","mac":"80:c5:f2:0b:02:e3","vendor":"AzureWave Technology Inc."}
{"ip":"192.168.0.171","mac":"88:53:95:2d:3c:af","vendor":"Apple, Inc."}

wait 5 seconds before exiting to receive delayed reply packets, by default sx waits 300 milliseconds:

sx arp --exit-delay 5s 192.168.0.1/24

Live scan mode that rescans network every 10 seconds:

sx arp 192.168.0.1/24 --live 10s

TCP scan

Unlike nmap and other scanners that implicitly perform ARP requests to resolve IP addresses to MAC addresses before the actual scan, sx explicitly uses the ARP cache concept. ARP cache file is a simple text file containing JSON string on each line (JSONL file), which has the same JSON fields as the ARP scan JSON output described above. Scans of higher-level protocols like TCP and UDP read the ARP cache file from the stdin and then start the actual scan.

This not only simplifies the design of the program, but also speeds up the scanning process, since it is not necessary to perform an ARP scan every time.

Let's assume that the actual ARP cache is in the arp.cache file. We can create it manually or use ARP scan as shown below:

sx arp 192.168.0.1/24 --json | tee arp.cache

Once we have the ARP cache file, we can run scans of higher-level protocols like TCP SYN scan:

cat arp.cache | sx tcp -p 1-65535 192.168.0.171

sample output:

192.168.0.171        22
192.168.0.171        443

In this case we find out that ports 22 and 443 are open.

scan with JSON output:

cat arp.cache | sx tcp  --json -p 1-65535 192.168.0.171

sample output:

{"scan":"tcpsyn","ip":"192.168.0.171","port":22}
{"scan":"tcpsyn","ip":"192.168.0.171","port":443}

scan multiple port ranges:

cat arp.cache | sx tcp -p 1-23,25-443 192.168.0.171

or individual ports:

cat arp.cache | sx tcp -p 22,443 192.168.0.171

or use the --ports-file option to specify a file with ports or port ranges to scan, one per line.

scan ip/port pairs from a file with JSON output:

cat arp.cache | sx tcp --json -f ip_ports_file.jsonl

Each line of the input file is a json string, which must contain the ip and port fields.

sample input file:

{"ip":"10.0.1.1","port":1080}
{"ip":"10.0.2.2","port":1081}

It is possible to specify the ARP cache file using the -a or --arp-cache options:

sx tcp -a arp.cache -p 22,443 192.168.0.171

or stdin redirect:

sx tcp -p 22,443 192.168.0.171 < arp.cache

You can also use the tcp syn subcommand instead of the tcp:

cat arp.cache | sx tcp syn -p 22 192.168.0.171

tcp subcomand is just a shorthand for tcp syn subcommand unless --flags option is passed, see below.

VPN interfaces

sx supports scanning with virtual network interfaces (wireguard, openvpn, etc.) and in this case it is not necessary to use the arp cache, since these interfaces require raw IP packets instead of Ethernet frames as input. For instance, scanning an IP address on a vpn network:

sx tcp 10.1.27.1 -p 80 --json

TCP FIN scan

Most network scanners try to interpret results of the scan. For instance they say "this port is closed" instead of "I received a RST". Sometimes they are right. Sometimes not. It's easier for beginners, but when you know what you're doing, you keep on trying to deduce what really happened from the program's interpretation, especially for more advanced scan techniques.

sx tries to overcome those problems. It returns information about all reply packets for TCP FIN, NULL, Xmas and custom TCP scans. The information contains IP address, TCP port and all TCP flags set in the reply packet.

TCP FIN scan and its other variations (NULL and Xmas) exploit RFC793 Section 3.9:

SEGMENT ARRIVES

If the state is CLOSED (i.e., TCB does not exist) then

 all data in the incoming segment is discarded.  An incoming
 segment containing a RST is discarded.  An incoming segment not
 containing a RST causes a RST to be sent in response.  The
 acknowledgment and sequence field values are selected to make the
 reset sequence acceptable to the TCP that sent the offending
 segment.

so closed port should return packet with RST flag.

This section also states that:

If the state is LISTEN then

...

Any other control or text-bearing segment (not containing SYN) must have an ACK and thus would be discarded by the ACK processing. An incoming RST segment could not be valid, since it could not have been sent in response to anything sent by this incarnation of the connection. So you are unlikely to get here, but if you do, drop the segment, and return.

the main phrase here: drop the segment, and return. So an open port on most operating systems will drop the TCP packet containing any flags except SYN,ACK and RST.

Let's scan some closed port with TCP FIN scan:

cat arp.cache | sx tcp fin --json -p 23 192.168.0.171

sample output:

{"scan":"tcpfin","ip":"192.168.0.171","port":23,"flags":"ar"}

flags field contains all TCP flags in the reply packet, where each letter represents one of the TCP flags:

  • s - SYN flag
  • a - ACK flag
  • f - FIN flag
  • r - RST flag
  • p - PSH flag
  • u - URG flag
  • e - ECE flag
  • c - CWR flag
  • n - NS flag

In this case we find out that port 23 sent reply packet with ACK and RST flags set (typical response for a closed port according to the rfc793).

If we scan an open port, we get no response (unless the firewall is spoofing the responses).

Other types of TCP scans can be conducted by analogy.

TCP NULL scan:

cat arp.cache | sx tcp null --json -p 23 192.168.0.171

TCP Xmas scan:

cat arp.cache | sx tcp xmas --json -p 23 192.168.0.171

Custom TCP scans

It is possible to send TCP packets with custom TCP flags using --flags option.

Let's send TCP packet with SYN, FIN and ACK flags set to fingerprint remote OS:

cat arp.cache | sx tcp --flags syn,fin,ack --json -p 23 192.168.0.171

Windows and MacOS will not respond to this packet, but Linux will send reply packet with RST flag.

Possible arguments to --flags option:

  • syn - SYN flag
  • ack - ACK flag
  • fin - FIN flag
  • rst - RST flag
  • psh - PSH flag
  • urg - URG flag
  • ece - ECE flag
  • cwr - CWR flag
  • ns - NS flag

UDP scan

sx can help investigate open UDP ports. UDP scan exploits RFC1122 Section 4.1.3.1:

If a datagram arrives addressed to a UDP port for which there is no pending LISTEN call, UDP SHOULD send an ICMP Port Unreachable message.

Similar to TCP scans, sx returns information about all reply ICMP packets for UDP scan. The information contains IP address, ICMP packet type and code set in the reply packet.

For instance, to detect DNS server on host, run:

cat arp.cache | sx udp --json -p 53 192.168.0.171

sample output:

{"scan":"udp","ip":"192.168.0.171","icmp":{"type":3,"code":3}}

In this case we find out that host sent ICMP reply packet with Destination Unreachable type and Port Unreachable code (typical response for a closed port according to the rfc1122).

Firewalls typically set ICMP code distinct from Port Unreachanble and so can be easily detected.

Rate limiting

Sometimes you need to limit the speed at which generated packets are sent. This can be done with the --rate option.

For example, to limit the speed to 1 packet per 5 seconds:

cat arp.cache | sx tcp --rate 1/5s --json -p 22,80,443 192.168.0.171

Exclude subnets

Sometimes you need to exclude some ip addresses and subnets from scanning. This can be done with the --exclude option. It specifies a file with IPs or subnets in CIDR notation to exclude, one-per line.

For instance, to exclude RFC 1918 addresses, create a file ips.txt with the following contents:

10.0.0.0/8
172.16.0.0/16
192.168.0.0/16

You can also insert comments and blank lines:

# exclude RFC 1918 addresses
10.0.0.0/8 # comment 1
172.16.0.0/12 # comment 2
192.168.0.0/16 # comment 3

0.0.0.0/8 # used in initialization procedures (RFC 6890)

# exclude RFC 5735 addresses
127.0.0.0/8 # loopback address
192.0.0.0/24 # reserved block for IETF protocol assignments
224.0.0.0/4 # allocated for use in IPv4 multicast address assignments
240.0.0.0/4 # reserved for future use

# exclude Amazon network
3.0.0.0/8

# ip addresses are valid as well
1.1.1.1

and run a scan with --exclude ips.txt option.

Live LAN TCP SYN scanner

As an example of scan composition, you can combine ARP and TCP SYN scans to create live TCP port scanner that periodically scan whole LAN network.

Start live ARP scan and save results to arp.cache file:

sx arp 192.168.0.1/24 --live 10s --json | tee arp.cache

In another terminal start TCP SYN scan:

while true; do sx tcp -p 1-65535 -a arp.cache -f arp.cache; sleep 30; done

SOCKS5 scan

sx can detect live SOCKS5 proxies. To scan, you must specify an IP range or JSONL file with ip/port pairs.

For example, an IP range scan:

sx socks -p 1080 10.0.0.1/16

scan ip/port pairs from a file with JSON output:

sx socks --json -f ip_ports_file.jsonl 

Each line of the input file is a json string, which must contain the ip and port fields.

sample input file:

{"ip":"10.0.1.1","port":1080}
{"ip":"10.0.2.2","port":1081}

You can also specify a range of ports to scan:

sx socks -p 1080-4567 -f ips_file.jsonl

In this case only ip addresses will be taken from the file and the port field is no longer necessary.

Elasticsearch scan

Elasticsearch scan retrieves the cluster information and a list of all indexes along with aliases.

For example, an IP range scan:

sx elastic -p 9200 10.0.0.1/16

By default the scan uses the http protocol, to use the https protocol specify the --proto option:

sx elastic --proto https -p 9200 10.0.0.1/16

scan ip/port pairs from a file with JSON output:

sx elastic --json -f ip_ports_file.jsonl

Each line of the input file is a json string, which must contain the ip and port fields.

sample input file:

{"ip":"10.0.1.1","port":9200}
{"ip":"10.0.2.2","port":9201}

You can also specify a range of ports to scan:

sx elastic -p 9200-9267 -f ips_file.jsonl

In this case only ip addresses will be taken from the file and the port field is no longer necessary.

Usage help

sx help

๐Ÿ“œ References

๐Ÿค Contributing

Contributions, issues and feature requests are welcome.

๐Ÿ’Ž Credits

Logo is designed by mikhailtsoy.com

License

This project is licensed under the MIT License. See the LICENSE file for the full license text.

sx's People

Contributors

mrgossett avatar renovate-bot avatar renovate[bot] avatar v-byte-cpu 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

sx's Issues

Dependency Dashboard

This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.

Open

These updates have all been created already. Click a checkbox below to force a retry/rebase of any.

Detected dependencies

dockerfile
Dockerfile
  • golang 1.19-alpine
  • alpine 3.16
droneci
.drone.yml
  • golangci/golangci-lint v1.49-alpine
  • golang 1.19-alpine
  • golang 1.19-alpine
  • golang 1.19-alpine
gomod
go.mod
  • go 1.19
  • github.com/docker/docker v20.10.7+incompatible
  • github.com/golang/mock v1.6.0
  • github.com/google/gopacket v1.1.20-0.20210304165259-20562ffb40f8@20562ffb40f8
  • github.com/mailru/easyjson v0.7.7
  • github.com/moby/moby v20.10.7+incompatible
  • github.com/spf13/cobra v1.5.0
  • github.com/stretchr/testify v1.8.0
  • github.com/vishvananda/netlink v1.1.0
  • github.com/yl2chen/cidranger v1.0.2
  • go.uber.org/ratelimit v0.2.0
  • go.uber.org/zap v1.23.0

  • Check this box to trigger a request for Renovate to run again on this repository

how can i scan internet servers

sx arp xxx can only get mac address of servers which in local network, and sx tcp xxx scan mode can only be used with arp scan result before. so how can i scan internet servers, i cannot get its mac address.

Run on Windows 10?

From a command prompt (as administrator)
sx arp 192.168.0.1/24
Error: OS platform is not supported
Usage:
sx arp [flags] subnet

Examples:
arp 192.168.0.1/24
arp 10.0.0.1

Sessions problem

SYN scan will hold too many sessions with full port scan so that the firewall gateway's CPU overload.

Error log 76, 214

@v-byte-cpu
hi,
Why this error come to me help me plz...
{"level":"error","ts":1665350624.2440908,"caller":"log/logger.go:76","msg":"socks","error":"dial tcp 192.168.0.241:1080: i/o timeout","stacktrace":"github.com/v-byte-cpu/sx/command/log.(*logger).Error\n\t/home/creedx/sx/command/log/logger.go:76\ngithub.com/v-byte-cpu/sx/command.startScanEngine.func3\n\t/home/creedx/sx/command/root.go:214"}
Screenshot-81

Many duplicate MAC address

I'm seeing 100+ IP addresses sharing a Mac address during an ARP scan.

I check my managed switch and those do not appear.

Is this an issue with my network or a problem with the way sx is scanning ARP?

Binary name conflict with lrzsz

lrzsz (used by software like minicom and other rzsz-based software offer the sx executable for sending files with the XMODEM protocol.

Modems aren't used that much anymore, so this probably isn't a showstopper; minicom is mostly useful for working with remote computers over a broken LAN nowadays. However, it might be worth knowing that another existing networking-related utility shares this tool's name.

Instructions how to build under Windows?

When trying to compile under Windows with regular go install <...> there is an error:

>go install github.com/v-byte-cpu/sx@latest
go: downloading github.com/v-byte-cpu/sx v0.5.0
go: downloading github.com/google/gopacket v1.1.20-0.20210304165259-20562ffb40f8
go: downloading github.com/spf13/cobra v1.5.0
go: downloading github.com/docker/docker v20.10.7+incompatible
go: downloading github.com/moby/moby v20.10.7+incompatible
go: downloading go.uber.org/zap v1.23.0
go: downloading github.com/docker/go-units v0.4.0
go: downloading github.com/opencontainers/go-digest v1.0.0
go: downloading github.com/docker/distribution v2.7.1+incompatible
go: downloading github.com/containerd/containerd v1.4.4
go: downloading github.com/Microsoft/go-winio v0.4.16
go: downloading github.com/konsorten/go-windows-terminal-sequences v1.0.1
# github.com/v-byte-cpu/sx/command
go\pkg\mod\github.com\v-byte-cpu\[email protected]\command\root.go:168:56: too many arguments in call to afpacket.NewPacketSource
        have (string, bool)
        want (string)

sx arp finds fewer results compared to arp-scan

While playing around with sx for the first time, I noticed that sx finds fewer devices on the network than arp-scan.
Are there any major differences in how they operate or what could cause this?

Mac addresses are replaced with ---.
sx:

~/r/sx โฏโฏโฏ ./sx arp 10.1.1.0/24
10.1.1.2             ---    Raspberry Pi Trading Ltd
10.1.1.22            ---    Philips Lighting BV
10.1.1.3             ---    ASUSTek COMPUTER INC.
10.1.1.21            ---    TP-LINK TECHNOLOGIES CO.,LTD.
10.1.1.29            ---
10.1.1.232           ---    Brother Industries, LTD.
10.1.1.1             ---    AVM Audiovisuelles Marketing und Computersysteme GmbH
10.1.1.3             ---    ASUSTek COMPUTER INC.
10.1.1.19            ---

arp-scan:

~/r/sx โฏโฏโฏ arp-scan -g 10.1.1.0/24
Interface: enp5s0, type: EN10MB, MAC: ---, IPv4: 10.1.1.23
Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan)
10.1.1.2	---	Raspberry Pi Trading Ltd
10.1.1.3	---	ASUSTek COMPUTER INC.
10.1.1.1	---	AVM Audiovisuelles Marketing und Computersysteme GmbH
10.1.1.21	---	TP-LINK TECHNOLOGIES CO.,LTD.
10.1.1.22	---	Philips Lighting BV
10.1.1.29	---	QEMU
10.1.1.18	---	Espressif Inc.
10.1.1.19	---	Espressif Inc.
10.1.1.72	---	(Unknown: locally administered)
10.1.1.4	---	AVM Audiovisuelles Marketing und Computersysteme GmbH
10.1.1.232	---	Brother Industries, LTD.
10.1.1.253	---	AVM Audiovisuelles Marketing und Computersysteme GmbH
10.1.1.254	---	AVM Audiovisuelles Marketing und Computersysteme GmbH
10.1.1.229	---	Apple, Inc.

15 packets received by filter, 0 packets dropped by kernel
Ending arp-scan 1.10.0: 256 hosts scanned in 1.956 seconds (130.88 hosts/sec). 14 responded

Error: stdin is from a terminal

TCP scans are failing with Error: stdin is from a terminal exception.

Environment information:

  • OS: Kali 2021.2
  • Console & shell: XFCE TerminalEmulator + zsh
  • sx: pre-built binary release (tested on v0.2 & 0.3)

Some sx snippets I tested with (I renamed sx binary to sxscanner, because Kali already has some tool named sx):

sxscanner tcp fin -p 80 10.10.10.230
sxscanner tcp -p 1-65535 10.10.10.230

Issues might be somewhere here: sx/command/config.go#L288, but I don't know Go, so now sure what can cause the issue.

Error: address family not supported by protocol

sx arp 192.168.10.1
Error: address family not supported by protocol
Am I doing something wrong?
Using --iface wifi3 or 192.168.10.1/24 parameters also result in the same error.
I am on WSL Kali.

Can't build docker image with podman

$ podman build -t sx .
STEP 1: FROM golang:1.16-alpine AS builder
โœ” docker.io/library/golang:1.16-alpine
Getting image source signatures
Copying blob 540db60ca938 done
Copying blob 0510c868ecb4 done
Copying blob 4c4ab2625f07 done
Copying blob afea3b2eda06 done
Copying blob adcc1eea9eea done
Copying config 270727b8fd done
Writing manifest to image destination
Storing signatures
STEP 2: RUN apk add --no-cache libpcap-dev libc-dev gcc linux-headers
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/community/x86_64/APKINDEX.tar.gz
(1/17) Installing libgcc (10.2.1_pre1-r3)
(2/17) Installing libstdc++ (10.2.1_pre1-r3)
(3/17) Installing binutils (2.35.2-r1)
(4/17) Installing libgomp (10.2.1_pre1-r3)
(5/17) Installing libatomic (10.2.1_pre1-r3)
(6/17) Installing libgphobos (10.2.1_pre1-r3)
(7/17) Installing gmp (6.2.1-r0)
(8/17) Installing isl22 (0.22-r0)
(9/17) Installing mpfr4 (4.1.0-r0)
(10/17) Installing mpc1 (1.2.0-r0)
(11/17) Installing gcc (10.2.1_pre1-r3)
(12/17) Installing musl-dev (1.2.2-r0)
(13/17) Installing libc-dev (0.7.2-r3)
(14/17) Installing libpcap (1.10.0-r0)
(15/17) Installing pkgconf (1.7.3-r0)
(16/17) Installing libpcap-dev (1.10.0-r0)
(17/17) Installing linux-headers (5.7.8-r0)
Executing busybox-1.32.1-r6.trigger
OK: 135 MiB in 32 packages
--> 5af35877a00
STEP 3: ADD . /app
--> 67e808a4805
STEP 4: WORKDIR /app
--> 93f4d5205ce
STEP 5: RUN go build -ldflags "-w -s" -o /sx
go: github.com/docker/[email protected]+incompatible: Get "https://proxy.golang.org/github.com/docker/docker/@v/v20.10.6+incompatible.mod": dial tcp: lookup proxy.golang.org: Try again
STEP 6: FROM alpine:3.13
Error: error building at STEP "RUN go build -ldflags "-w -s" -o /sx": error while running runtime: exit status 1

ICMP Scan: sending ICMP for IPs not listed in the ARP cache

Hi, I'm experimenting with "sx" and found an interesting issue.

Well, I was trying to ICMP scan a local WiFi network. First of all, I generated the ARP cache file. After that I run the ICMP Scan. Everything seems to work, but the interesting thing that I'm talking about is: I generated a PCAP file while I was scanning the network and noted that even though I had just provided an ARP cache of 3 entries, sx had sent ICMP packets for all the subnet I provided in the command line.

I was expecting ICMP packets only for the 3 IP addresses/MACs listed in the ARP cache file. This is the ARP cache I used:

{"ip":"192.168.15.1","mac":"d8:c6:78:1f:bc:90","vendor":"MitraStar Technology Corp."} {"ip":"192.168.15.250","mac":"c8:5d:38:29:6b:08","vendor":"HUMAX Co., Ltd."} {"ip":"192.168.15.238","mac":"c8:5d:38:29:77:2f","vendor":"HUMAX Co., Ltd."}

Another thing that I noticed was that for each ICMP packet sent and which the MAC was not listed in the ARP cache, "sx" included the MAC address of the first entry in the ARP cache as the Ethernet frame destination address.

For example, for the IPs:

  • 192.168.15.10 -> MAC d8:c6:78:1f:bc:90
  • 192.168.15.20 -> MAC d8:c6:78:1f:bc:90
  • 192.168.15.30 -> MAC d8:c6:78:1f:bc:90

Is it how it's supposed to work?

p.s) I'm using a development version. sx version dev

Thanks for any feedback.

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.