metlo-labs / metlo Goto Github PK
View Code? Open in Web Editor NEWMetlo is an open-source API security platform.
Home Page: https://metlo.com
License: MIT License
Metlo is an open-source API security platform.
Home Page: https://metlo.com
License: MIT License
Hi there 👋
I setup Metlo locally using docker compose ( read me instructions ).
git clone https://github.com/metlo-labs/metlo.git
cd metlo
ENCRYPTION_KEY="some random string" EXPRESS_SECRET="some random string" docker-compose up -d
I'm also running my local app via docker compose and followed your intructions for a node connection.
var metlo = require("metlo")
metlo(<YOUR_METLO_API_KEY>, <YOUR_METLO_COLLECTOR_URL>)
Can't find in your docs what the YOUR_METLO_COLLECTOR_URL
should be.
From looking at your docker compose file it looks like collector is also an alias for injestor and looking at the node library the value expected is just the host.
Not sure if I can just pass the host or also need to include the port for the injestor (8081).
Suggestion:
YOUR_METLO_COLLECTOR_URL
value when the user is on the connections page or when creating a keySince I'm running both apps in docker I can't point to localhost. I tried using http://host.docker.internal
but without success. Do you know what I should set as the YOUR_METLO_COLLECTOR_URL
in my case?
Grab a mac and
run a docker container with node:
docker run -it node:16 bash
Inside the container, install metlo.
mkdir foo
cd foo
npm install metlo
Run node and require it
root@70ed70d3850b:/foo# node
Welcome to Node.js v16.20.1.
Type ".help" for more information.
> require("metlo")
Uncaught Error: Cannot find module '@metlo/metlo-node-agent-bindings-linux-x86-gnu'
Require stack:
- /foo/node_modules/metlo/dist/rust_binds.js
- /foo/node_modules/metlo/dist/middlewares/index.js
- /foo/node_modules/metlo/dist/index.js
- <repl>
at Function.Module._resolveFilename (node:internal/modules/cjs/loader:1028:15)
at Function.Module._load (node:internal/modules/cjs/loader:873:27)
at Module.require (node:internal/modules/cjs/loader:1100:19)
at require (node:internal/modules/cjs/helpers:108:18) {
code: 'MODULE_NOT_FOUND',
requireStack: [
'/foo/node_modules/metlo/dist/rust_binds.js',
'/foo/node_modules/metlo/dist/middlewares/index.js',
'/foo/node_modules/metlo/dist/index.js',
'<repl>'
]
}
This makes it impossible for developers using devcontainers on mac to use metlo :-)
following installation instructions i get:
metlo-db-1 | 2022-10-14 11:41:09.171 UTC [1] LOG: database system is ready to accept connections
metlo-jobs | Migration "removeOwnerColumnFromApitrace1665697571667" failed, error: Table "api_trace" does not exist.
metlo-jobs | /usr/src/app/backend/node_modules/typeorm/query-runner/BaseQueryRunner.js:193
metlo-jobs | throw new TypeORMError_1.TypeORMError(`Table "${tableName}" does not exist.`);
metlo-jobs | ^
metlo-jobs |
metlo-jobs | TypeORMError: Table "api_trace" does not exist.
metlo-jobs | at PostgresQueryRunner.getCachedTable (/usr/src/app/backend/node_modules/typeorm/query-runner/BaseQueryRunner.js:193:19)
metlo-jobs | at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
metlo-jobs | at async PostgresQueryRunner.dropColumn (/usr/src/app/backend/node_modules/typeorm/driver/postgres/PostgresQueryRunner.js:1098:15)
metlo-jobs |
metlo-jobs | Node.js v18.10.0
metlo-jobs | error Command failed with exit code 1.
metlo-jobs | info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
metlo-jobs exited with code 1
metlo-ingestor | Migration "removeOwnerColumnFromApitrace1665697571667" failed, error: Table "api_trace" does not exis
According to the Django docs, current Django ingestor middleware won't work in asynchronous mode. Consider making changes as per Django doc for asynchronous support: https://docs.djangoproject.com/en/3.2/topics/http/middleware/#asynchronous-support
Example from doc:
import asyncio
from django.utils.decorators import sync_and_async_middleware
@sync_and_async_middleware
def simple_middleware(get_response):
# One-time configuration and initialization goes here.
if asyncio.iscoroutinefunction(get_response):
async def middleware(request):
# Do something here!
response = await get_response(request)
return response
else:
def middleware(request):
# Do something here!
response = get_response(request)
return response
return middleware
We are investigating traffic access methods, see support for nginx, but with so library delivery
Hope open source
Hello! I tried to start Metlo in local environment with docker-compose-local.yaml
file:
sudo docker-compose -f docker-compose-local.yaml up
in repo root directory.
Firstly, I get the next error: Service 'ingestor' failed to buid: ADD failed: forbidden path outside the build context: ../../../backend ()
.
So, I changed ADD ../../../backend backend
to ADD ./backend backend
, and ADD ../../../common common
to ADD ./common common
in all dockerfiles in deploy directory
.
And it works.
But the next error has been appeared, like in previous issue (#32):
Could you please help me? Thanks!
Hi! With the nodejs agent when the POST
request is sent to the metlo backend from nodejs agent the endpoint /api/v1/log-request/single
is missing, so the current workaround is to add /api/v1/log-request/single
to the host URL
I've previously deployed metlo using docker and I've ensured that I'm running latest images using
$ python3 manage-deployment.py update
Pulling Docker Images...
Using default tag: latest
latest: Pulling from metlo/backend
Digest: sha256:60e16f21d066eb93f40d4187be4fe0982d7bd8dbc5212ef9732e7d61d8c7aaef
Status: Image is up to date for metlo/backend:latest
docker.io/metlo/backend:latest
Using default tag: latest
latest: Pulling from metlo/frontend
Digest: sha256:03f6a763e4ed2ed71e5d16fb30ee9c1eba090c4abc533909b9f0cd7ffb4404e8
Status: Image is up to date for metlo/frontend:latest
docker.io/metlo/frontend:latest
Using default tag: latest
latest: Pulling from metlo/jobrunner
Digest: sha256:f47b487634270cd7714d472cd7c2c68171e18b8ca4e661a957a6b5a83cfb9817
Status: Image is up to date for metlo/jobrunner:latest
docker.io/metlo/jobrunner:latest
/usr/lib/python3/dist-packages/requests/__init__.py:89: RequestsDependencyWarning: urllib3 (1.26.13) or chardet (3.0.4) doesn't match a supported version!
warnings.warn("urllib3 ({}) or chardet ({}) doesn't match a supported "
Stopping metlo-analyzer ... done
Stopping metlo-jobs ... done
Stopping metlo-backend ... done
Stopping metlo-ingestor ... done
Stopping metlo_db_1 ... done
Stopping metlo_cache_1 ... done
Stopping metlo-frontend ... done
Removing metlo-analyzer ... done
Removing metlo-jobs ... done
Removing metlo-backend ... done
Removing metlo-ingestor ... done
Removing metlo_db_1 ... done
Removing metlo_cache_1 ... done
Removing metlo-frontend ... done
Removing network metlo_default
Pulling Updated Files...
/usr/lib/python3/dist-packages/requests/__init__.py:89: RequestsDependencyWarning: urllib3 (1.26.13) or chardet (3.0.4) doesn't match a supported version!
warnings.warn("urllib3 ({}) or chardet ({}) doesn't match a supported "
Traceback (most recent call last):
File "/usr/lib/python3.8/urllib/request.py", line 1354, in do_open
h.request(req.get_method(), req.selector, req.data, headers,
File "/usr/lib/python3.8/http/client.py", line 1256, in request
self._send_request(method, url, body, headers, encode_chunked)
File "/usr/lib/python3.8/http/client.py", line 1302, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File "/usr/lib/python3.8/http/client.py", line 1251, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "/usr/lib/python3.8/http/client.py", line 1011, in _send_output
self.send(msg)
File "/usr/lib/python3.8/http/client.py", line 951, in send
self.connect()
File "/usr/lib/python3.8/http/client.py", line 1418, in connect
super().connect()
File "/usr/lib/python3.8/http/client.py", line 922, in connect
self.sock = self._create_connection(
File "/usr/lib/python3.8/socket.py", line 808, in create_connection
raise err
File "/usr/lib/python3.8/socket.py", line 796, in create_connection
sock.connect(sa)
OSError: [Errno 101] Network is unreachable
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "manage-deployment.py", line 170, in <module>
main()
File "manage-deployment.py", line 164, in main
update()
File "manage-deployment.py", line 128, in update
update_files()
File "manage-deployment.py", line 92, in update_files
get_file(f)
File "manage-deployment.py", line 24, in get_file
with urllib.request.urlopen(request) as response:
File "/usr/lib/python3.8/urllib/request.py", line 222, in urlopen
return opener.open(url, data, timeout)
File "/usr/lib/python3.8/urllib/request.py", line 525, in open
response = self._open(req, data)
File "/usr/lib/python3.8/urllib/request.py", line 542, in _open
result = self._call_chain(self.handle_open, protocol, protocol +
File "/usr/lib/python3.8/urllib/request.py", line 502, in _call_chain
result = func(*args)
File "/usr/lib/python3.8/urllib/request.py", line 1397, in https_open
return self.do_open(http.client.HTTPSConnection, req,
File "/usr/lib/python3.8/urllib/request.py", line 1357, in do_open
raise URLError(err)
urllib.error.URLError: <urlopen error [Errno 101] Network is unreachable>
I get network unreachable error on running above command.
On starting metlo docker containers using manage-deployment.py
file. I don't see any testing tab on dashboard.
$ python3 manage-deployment.py start
/usr/lib/python3/dist-packages/requests/__init__.py:89: RequestsDependencyWarning: urllib3 (1.26.13) or chardet (3.0.4) doesn't match a supported version!
warnings.warn("urllib3 ({}) or chardet ({}) doesn't match a supported "
Creating network "metlo_default" with the default driver
Creating metlo_db_1 ... done
Creating metlo_cache_1 ... done
Creating metlo-frontend ... done
Creating metlo-ingestor ... done
Creating metlo-backend ... done
Creating metlo-analyzer ... done
Creating metlo-jobs ... done
Ig I deployed metlo using docker before testing tab was introduced.
I downloaded the latest metlo burp extension, and it installs fine in burp, but it throws an error on the command line.
"/tmp/metlo-agent-linux: 1: Syntax error: word unexpected (expecting ")")"
When I look at the /dist/binaries directory in the jar, it looks like they were all compiled for mac.
file dist/binaries/*
metlo-agent: Mach-O 64-bit arm64 executable, flags:<NOUNDEFS|DYLDLINK|TWOLEVEL|PIE|HAS_TLV_DESCRIPTORS>
metlo-agent-linux: Mach-O 64-bit arm64 executable, flags:<NOUNDEFS|DYLDLINK|TWOLEVEL|PIE|HAS_TLV_DESCRIPTORS>
metlo-agent-mac: Mach-O 64-bit x86_64 executable, flags:<NOUNDEFS|DYLDLINK|TWOLEVEL|PIE|HAS_TLV_DESCRIPTORS>
Hi,
when i run the this error came in browser Cannot GET / How to fix this issue
We are seeing below error when we try to install metlo daemonset on K8S cluster.
I can see similar issue on #52 (comment)
Can you share solution.
STARTING
starting suricata
starting metlo
10/11/2022 -- 19:26:26 - - This is Suricata version 6.0.1 RELEASE running in SYSTEM mode
10/11/2022 -- 19:26:26 - - [ERRCODE: SC_ERR_SYSCALL(50)] - Failure when trying to get MTU via ioctl for 'eth0': No such device (19)
10/11/2022 -- 19:26:26 - - [ERRCODE: SC_ERR_SYSCALL(50)] - Failure when trying to get MTU via ioctl for 'eth0': No such device (19)
10/11/2022 -- 19:26:26 - - [ERRCODE: SC_ERR_SOCKET(200)] - Error connecting to socket "/tmp/eve.sock": Connection refused (will keep trying)
10/11/2022 -- 19:26:26 - - JsonRdpLog logger not enabled: protocol rdp is disabled
10/11/2022 -- 19:26:26 - - JsonIKEv2Log logger not enabled: protocol ikev2 is disabled
10/11/2022 -- 19:26:26 - - JsonKRB5Log logger not enabled: protocol krb5 is disabled
10/11/2022 -- 19:26:26 - - JsonSNMPLog logger not enabled: protocol snmp is disabled
10/11/2022 -- 19:26:26 - - JsonRFBLog logger not enabled: protocol rfb is disabled
10/11/2022 -- 19:26:26 - - [ERRCODE: SC_ERR_STATS_LOG_GENERIC(278)] - eve.stats: stats are disabled globally: set stats.enabled to true. See https://suricata.readthedocs.io/en/suricata-6.0.1/configuration/suricata-yaml.html#stats
10/11/2022 -- 19:26:27 - - [ERRCODE: SC_ERR_AFP_CREATE(190)] - Unable to find type for iface "eth0": No such device
10/11/2022 -- 19:26:27 - - all 2 packet processing threads, 2 management threads initialized, engine started.
10/11/2022 -- 19:26:27 - - [ERRCODE: SC_ERR_AFP_CREATE(190)] - Unable to find iface eth0: No such device
10/11/2022 -- 19:26:27 - - [ERRCODE: SC_ERR_AFP_CREATE(190)] - Couldn't init AF_PACKET socket, fatal error
10/11/2022 -- 19:26:27 - - [ERRCODE: SC_ERR_FATAL(171)] - thread W#01-eth0 failed
While self deploying metlo on custom VPC, the cloudformation stackset fails.
The reason is MetloSecurityGroup
is created in a VPC provided in parameters however the MetloInstance
doesnt consider the VPC parameter and creates in a default VPC.
So the stackset fails due to the following error and rolls back:
Security group sg-xxxxxxxxxxx and subnet subnet-yyyyyyyyyyyyy belong to different networks. (Service: AmazonEC2; Status Code: 400; Error Code: InvalidParameter; Request ID: aaa-bbb-ccc; Proxy: null)
Hi Metlo team, what a fantastic project! I'd just like to put in a request for an AMI in the AWS Sydney Region please and keep up the great work!
I deployed with Docker step by step in a cloud server, following the instructions:
Devtools network tab show this:
/auth/login
(200 OK - POST) -> JWT/_next/data/XXXXXXXXXXXX/index.json
(307 Temporary Redirect - GET) -> no response/_next/data/XXXXXXXXXXXX/login.json
(200 OK - GET) ->{
"pageProps": {
"localAuthAllowed": true
},
"__N_SSP": true
}
Thank you @akshay288!!
sudo metlo-deploy update
I tried it on my Android repo but, almost all of the issued cases were false-positive. For example Drjacky/MVIModularizationTemplate#19
It says there is an issue with kotlin-stdlib-1.4.31.jar
but, neither my repo nor the internal library(root dependency) use that version:
Third-library: https://github.com/detekt/sarif4k/blob/main/build.gradle.kts
Greetings Metlo Team,
Is it possible to store PII information in obfuscated form? This will ensure user privacy.
for example:
{
"other_params":"...",
"email":"[email protected]",
"phone":"1234567890"
}
Obfuscated Form:
{
"other_params":"...",
"email":"[email protected]",
"phone":"xx3456xxxx"
}
How does Metlo detect params?
Some request paths are marked with incorrect parameters.
The current path in Metlo:
/api/{param1}/org/{param2}
Expected
/api/{param1}/org/onboardingStatus
Could it use the express routes to detect the params instead of using some magic logic? It can even detect what is the name of the param instead of using generic param1
param2
etc
eg: /user/:userUuid
-> /user/{userUuid}
/opt/venv/lib/python3.10/site-packages/django/test/client.py:751: in post
response = super().post(path, data=data, content_type=content_type, secure=secure, **extra)
/opt/venv/lib/python3.10/site-packages/django/test/client.py:407: in post
return self.generic('POST', path, post_data, content_type,
/opt/venv/lib/python3.10/site-packages/django/test/client.py:473: in generic
return self.request(**r)
/opt/venv/lib/python3.10/site-packages/django/test/client.py:719: in request
self.check_exception(response)
/opt/venv/lib/python3.10/site-packages/django/test/client.py:580: in check_exception
raise exc_value
/opt/venv/lib/python3.10/site-packages/django/core/handlers/exception.py:47: in inner
response = get_response(request)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <metlo.django.MetloDjango object at 0xffff911058a0>
request = <WSGIRequest: POST '/admin/module/group/group_name/delete/'>
def __call__(self, request):
response = self.get_response(request)
params = request.GET if request.method == "GET" else request.POST
dest_ip = request.META.get("SERVER_NAME") if \
"1.0.0.127.in-addr.arpa" not in request.META.get("SERVER_NAME") else "localhost"
src_ip = request.META.get("REMOTE_ADDR") if \
"1.0.0.127.in-addr.arpa" not in request.META.get("REMOTE_ADDR") else "localhost"
> source_port = request.environ["wsgi.input"].stream.raw._sock.getpeername()[1]
E AttributeError: 'FakePayload' object has no attribute 'stream'
/opt/venv/lib/python3.10/site-packages/metlo/django.py:45: AttributeError
I've deployed docker version of Metlo and configured our Django application with the metlo
module. After running our test suite I ended up with most of the tests failing with same AttributeError.
I'm trying to use metlo on my local host. I've followed the steps from README. After containers are started when I try to visit the web app, it returns a 500 error.
Do I need to set environment variables? can the team add those instructions to the README?
$ docker-compose up -d
WARNING: The BACKEND_URL variable is not set. Defaulting to a blank string.
WARNING: The SANDBOX_MODE variable is not set. Defaulting to a blank string.
WARNING: The DISABLE_LOGGING_STATS variable is not set. Defaulting to a blank string.
WARNING: The NUM_WORKERS variable is not set. Defaulting to a blank string.
-- snip --
Hey gang,
very cool stuff happening here! I was looking over the docs for the ingestion connections in go and would love to see an example of it with the vanilla net/http handler middleware usage I'm sure the broader community would appreciate it, it's a very commonly used pattern, here's a nice example thats compatible with any service using the stdlib for their server.
Great stuff here, looking forward to following this project!
HI Team,
We have configured metlo in GCP and daemonset in GKE. Data is not getting exported to application. KIndly help us on this.
Here are the attached log of one of pod
21/10/2022 -- 06:56:59 - - [ERRCODE: SC_ERR_STATS_LOG_GENERIC(278)] - eve.stats: stats are disabled globally: set stats.enabled to true. See https://suricata.readthedocs.io/en/suricata-6.0.5/configuration/suricata-yaml.html#stats
21/10/2022 -- 06:56:59 - - Running in live mode, activating unix socket
21/10/2022 -- 06:56:59 - - 1 rule files processed. 1 rules successfully loaded, 0 rules failed
21/10/2022 -- 06:56:59 - - Threshold config parsed: 0 rule(s) found
21/10/2022 -- 06:56:59 - - 1 signatures processed. 0 are IP-only rules, 0 are inspecting packet payload, 1 inspect application layer, 0 are decoder event only
21/10/2022 -- 06:56:59 - - Going to use 1 thread(s)
21/10/2022 -- 06:56:59 - - Running in live mode, activating unix socket
21/10/2022 -- 06:56:59 - - Using unix socket file '/var/run/suricata/suricata-command.socket'
21/10/2022 -- 06:56:59 - - all 1 packet processing threads, 2 management threads initialized, engine started.
21/10/2022 -- 06:56:59 - - All AFP capture threads are running.
21/10/2022 -- 06:56:58 - - This is Suricata version 6.0.5 RELEASE running in SYSTEM mode
21/10/2022 -- 06:56:58 - - CPUs/cores online: 1
21/10/2022 -- 06:56:59 - - Found an MTU of 1460 for 'eth0'
21/10/2022 -- 06:56:59 - - Found an MTU of 1460 for 'eth0'
21/10/2022 -- 06:56:59 - - Setting logging socket of non-blocking in live mode.
21/10/2022 -- 06:56:59 - - eve-log output device (unix_stream) initialized: /etc/suricata-logs/eve.sock
21/10/2022 -- 06:56:59 - - JsonRdpLog logger not enabled: protocol rdp is disabled
21/10/2022 -- 06:56:59 - - JsonIKEv2Log logger not enabled: protocol ikev2 is disabled
21/10/2022 -- 06:56:59 - - JsonKRB5Log logger not enabled: protocol krb5 is disabled
21/10/2022 -- 06:56:59 - - JsonSNMPLog logger not enabled: protocol snmp is disabled
21/10/2022 -- 06:56:59 - - JsonRFBLog logger not enabled: protocol rfb is disabled
21/10/2022 -- 06:56:59 - - [ERRCODE: SC_ERR_STATS_LOG_GENERIC(278)] - eve.stats: stats are disabled globally: set stats.enabled to true. See https://suricata.readthedocs.io/en/suricata-6.0.5/configuration/suricata-yaml.html#stats
============================================================================================
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: metlo-app
spec:
selector:
matchLabels:
name: metlo-app
template:
metadata:
labels:
name: metlo-app
spec:
hostNetwork: true
tolerations:
# this toleration is to have the daemonset runnable on master nodes
# remove it if your masters can't run pods
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- name: suricata-daemon
image: metlo/suricata-daemon
imagePullPolicy: Always
securityContext:
privileged: true
env:
- name: METLO_ADDR
value: ------------
- name: METLO_KEY
value: *****
Hey,
Thanks for making metlo Opensource, i think the future is OSS, but, do you've any plan guys to make a simple version of Protection feature available in OSS version? that may speed up the adoption of the product.
I install metlo from npm
npm i -g @metlo/cli
Server: Ubuntu 22.04.1 LTS
Nodejs: v12.22.9
Npm: 8.5.1
metlo: metlo/[email protected]
Error log
metlo --help
/usr/local/lib/node_modules/@metlo/cli/node_modules/@aws-sdk/client-ec2/dist-cjs/protocols/Aws_ec2.js:22372
if (input.TagSpecifications?.length === 0) {
^
SyntaxError: Unexpected token '.'
at wrapSafe (internal/modules/cjs/loader.js:915:16)
at Module._compile (internal/modules/cjs/loader.js:963:27)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)
at Module.load (internal/modules/cjs/loader.js:863:32)
at Function.Module._load (internal/modules/cjs/loader.js:708:14)
at Module.require (internal/modules/cjs/loader.js:887:19)
at require (internal/modules/cjs/helpers.js:74:18)
at Object.<anonymous> (/usr/local/lib/node_modules/@metlo/cli/node_modules/@aws-sdk/client-ec2/dist-cjs/commands/AcceptAddressTransferCommand.js:8:19)
at Module._compile (internal/modules/cjs/loader.js:999:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)
when i create an account in my.metlo.com , the website return me a user license key ,but i according to use it ,it tells me User License key invalid or expired, so how can i solve this problem , it may be a bug
DId you support GraphQL API or only REST API support?
I would like to support Metlo by implementing Uffizzi preview environments.
Disclaimer: I work on Uffizzi.
Uffizzi is a Open Source full stack previews engine and our platform is available completely free for Metlo (and all open source projects). This will provide maintainers with preview environments of every PR in the cloud, which enables faster iterations and reduces time to merge. You can see the open source repos which are currently using Uffizzi over here
Uffizzi is purpose-built for the task of previewing PRs and it integrates with your workflow to deploy preview environments in the background without any manual steps for maintainers or contributors.
We can go ahead and create an Initial PoC for you right away if you think there is value in this proposal.
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.