GithubHelp home page GithubHelp logo

deivitto / auditor-docker Goto Github PK

View Code? Open in Web Editor NEW
121.0 3.0 11.0 290 KB

Home Page: https://hackmd.io/7zriwLB0SD6-3AUDv3pBBg?view

License: GNU General Public License v3.0

Dockerfile 18.47% Shell 81.53%
auditor docker security tools

auditor-docker's Introduction

Auditor-Toolbox

square

Intro

The Auditor Toolbox essential goal is to pack all the essential auditor tools into a single Docker Image!

Keep yourself safe using an isolated enviorenment while keeping safe the web3 space!

Our beta version is up and running! I'm keen on keeping it fresh with the latest tools and versions. Got suggestions or updates? Don't hesitate to reach out or pitch in your ideas!

Prerequisites & general Docker guide

Index

  1. Auditor Toolbox Setup
  2. Auditor Toolbox for Ethereum Smart Contracts
  3. Scripts
  4. Troubleshooting

Basic build

Clone the repo and cd into it

git clone https://github.com/Deivitto/auditor-docker.git && \
cd auditor-docker

Then, within the directory where the Dockerfile is

docker build -t whitehat-machine .  

Then just run

docker run -it whitehat-machine 

If you are missing any package, run add2 inside the toolbox

Other options

For other things related to Docker itself, such as sharing a folder, use VSCode extension, restart docker container, change limite stack size, etc:

Quick tip: To restart a container use docker start NAME_OF_THE_CONTAINER or ID_OF_THE_CONTAINER

One-line command

The fast command to install the machine is

rm -rf auditor-docker && \
git clone https://github.com/Deivitto/auditor-docker.git && \
cd auditor-docker && \
docker build -t whitehat-machine . && \
docker run -it -d --name devops199 whitehat-machine

NOTE: This command uses -d to run the docker machine in the background, with the objective of using the VSCode docker extension. After installing the extension, run the command palette and type Attach to running container.... This command will attach the instance of the machine to the VSCode instance.

Credentials

The default password:

ngmi

Time metrics:

Total: [+] Building 589.3s
$ rm -rf auditor-docker && \
git clone https://github.com/Deivitto/auditor-docker.git && \
cd auditor-docker && \
git fetch origin && \
git checkout -b OpenSense_Demo origin/OpenSense_Demo && \
docker build -t open-sense-demo . && \
docker run -it  -d --name machine1 open-sense-demo
Cloning into 'auditor-docker'...
remote: Enumerating objects: 628, done.
remote: Counting objects: 100% (254/254), done.
remote: Compressing objects: 100% (154/154), done.
remote: Total 628 (delta 161), reused 153 (delta 100), pack-reused 374
Receiving objects:  99% (622/628)
Receiving objects: 100% (628/628), 181.93 KiB | 1.80 MiB/s, done.
Resolving deltas: 100% (353/353), done.
Switched to a new branch 'OpenSense_Demo'
branch 'OpenSense_Demo' set up to track 'origin/OpenSense_Demo'.

[+] Building 589.3s (45/45) FINISHED
 => [internal] load build definition from Dockerfile                                                   0.1s
 => => transferring dockerfile: 7.78kB                                                                 0.0s
 => [internal] load .dockerignore                                                                      0.0s
 => => transferring context: 2B                                                                        0.0s
 => resolve image config for docker.io/docker/dockerfile:1.3                                           1.8s
 => docker-image://docker.io/docker/dockerfile:1.3@sha256:42399d4635eddd7a9b8a24be879d2f9a930d0ed040a  0.9s
 => => resolve docker.io/docker/dockerfile:1.3@sha256:42399d4635eddd7a9b8a24be879d2f9a930d0ed040a6132  0.0s
 => => sha256:42399d4635eddd7a9b8a24be879d2f9a930d0ed040a61324cfdf59ef1357b3b2 2.00kB / 2.00kB         0.0s
 => => sha256:93f32bd6dd9004897fed4703191f48924975081860667932a4df35ba567d7426 528B / 528B             0.0s
 => => sha256:e532695ddd93ca7c85a816c67afdb352e91052fab7ac19a675088f80915779a7 1.21kB / 1.21kB         0.0s
 => => sha256:24a639a53085eb680e1d11618ac62f3977a3926fedf5b8471ace519b8c778030 9.67MB / 9.67MB         0.7s
 => => extracting sha256:24a639a53085eb680e1d11618ac62f3977a3926fedf5b8471ace519b8c778030              0.1s
 => [internal] load build definition from Dockerfile                                                   0.0s
 => [internal] load .dockerignore                                                                      0.0s
 => [internal] load metadata for docker.io/library/ubuntu:jammy                                        1.3s
 => [audit-toolbox  1/31] FROM docker.io/library/ubuntu:jammy@sha256:aabed3296a3d45cede1dc866a24476c4  3.4s
 => => resolve docker.io/library/ubuntu:jammy@sha256:aabed3296a3d45cede1dc866a24476c4d7e093aa806263c2  0.0s
 => => sha256:aabed3296a3d45cede1dc866a24476c4d7e093aa806263c27ddaadbdce3c1054 1.13kB / 1.13kB         0.0s
 => => sha256:b492494d8e0113c4ad3fe4528a4b5ff89faa5331f7d52c5c138196f69ce176a6 424B / 424B             0.0s
 => => sha256:c6b84b685f35f1a5d63661f5d4aa662ad9b7ee4f4b8c394c022f25023c907b65 2.30kB / 2.30kB         0.0s
 => => sha256:445a6a12be2be54b4da18d7c77d4a41bc4746bc422f1f4325a60ff4fc7ea2e5d 29.54MB / 29.54MB       2.6s
 => => extracting sha256:445a6a12be2be54b4da18d7c77d4a41bc4746bc422f1f4325a60ff4fc7ea2e5d              0.6s
 => [internal] load build context                                                                      0.1s
 => => transferring context: 31.72kB                                                                   0.0s
 => [audit-toolbox  2/31] RUN apt-get update &&     DEBIAN_FRONTEND=noninteractive apt-get install   307.7s
 => [builder 2/6] RUN apt-get update && apt-get install -y curl git build-essential pkg-config libss  73.4s
 => [builder 3/6] RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y         54.5s
 => [builder 4/6] RUN curl -L https://foundry.paradigm.xyz | bash                                      1.8s
 => [builder 5/6] RUN foundryup                                                                       10.0s
 => [builder 6/6] RUN curl -L http://get.heimdall.rs | bash &&     . /root/.cargo/env &&     /root/  239.2s
 => [audit-toolbox  3/31] RUN add-apt-repository -y ppa:ethereum/ethereum &&     add-apt-repository   45.0s
 => [audit-toolbox  4/31] RUN curl -fsSL https://julialang-s3.julialang.org/bin/linux/x64/1.7/julia-  22.0s
 => [audit-toolbox  5/31] RUN useradd -m -G sudo whitehat &&     echo 'whitehat ALL=(ALL) NOPASSWD: A  0.6s
 => [audit-toolbox  6/31] WORKDIR /home/whitehat                                                       0.0s
 => [audit-toolbox  7/31] RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.s  2.9s
 => [audit-toolbox  8/31] RUN . "/home/whitehat/.nvm/nvm.sh" &&     nvm install --lts &&     nvm al  110.9s
 => [audit-toolbox  9/31] RUN curl --proto "=https" --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -  28.6s
 => [audit-toolbox 10/31] RUN mkdir -p /home/whitehat/scripts                                          0.5s
 => [audit-toolbox 11/31] RUN mkdir -p /home/whitehat/templates                                        0.5s
 => [audit-toolbox 12/31] RUN echo '#!/bin/bash\n/home/whitehat/scripts/installer.sh' > /home/whiteha  0.6s
 => [audit-toolbox 13/31] RUN chmod +x /home/whitehat/add2lbox                                         0.6s
 => [audit-toolbox 14/31] RUN python3.9 -m pip install --no-cache-dir pip setuptools wheel             2.4s
 => [audit-toolbox 15/31] RUN python3.9 -m pip install --no-cache-dir     solc-select     slither-an  28.8s
 => [audit-toolbox 16/31] RUN git clone https://github.com/tomlion/vim-solidity.git ~/.vim/pack/plugi  1.3s
 => [audit-toolbox 17/31] RUN solc-select install 0.8.21  &&     solc-select use 0.8.21                3.3s
 => [audit-toolbox 18/31] RUN mv /home/whitehat/add2lbox /home/whitehat/.local/bin/                    0.6s
 => [audit-toolbox 19/31] COPY /scripts/*.sh /home/whitehat/scripts/                                   0.0s
 => [audit-toolbox 20/31] COPY /scripts/readme.md /home/whitehat/scripts/readme.md                     0.0s
 => [audit-toolbox 21/31] COPY /templates/* /home/whitehat/templates/                                  0.0s
 => [audit-toolbox 22/31] RUN chmod +x /home/whitehat/scripts/*.sh &&     chown -R whitehat:whitehat   0.5s
 => [audit-toolbox 23/31] COPY motd /etc/motd                                                          0.0s
 => [audit-toolbox 24/31] RUN echo -e '\ncat /etc/motd\n' >> /etc/bash.bashrc                          0.5s
 => [audit-toolbox 25/31] RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3  0.5s
 => [audit-toolbox 26/31] RUN curl https://bootstrap.pypa.io/get-pip.py | python3.9 &&     update-alt  6.5s
 => [audit-toolbox 27/31] RUN ln -s ~/scripts/certora_key_setup.sh ~/.local/bin/certoraKey &&     ln   0.6s
 => [audit-toolbox 28/31] RUN echo '# Point to the latest version of VS Code Remote server' >> ~/.bas  0.5s
 => [audit-toolbox 29/31] RUN echo 'export PATH="$PATH:$HOME/.yarn/bin:$HOME/.config/yarn/global/node  0.6s
 => [audit-toolbox 30/31] COPY --from=builder /root/.bifrost/bin/* /home/whitehat/.bifrost/bin/        0.1s
 => [audit-toolbox 31/31] COPY --from=builder /root/.foundry/bin/* /home/whitehat/.foundry/bin/        0.2s
 => exporting to image                                                                                14.6s
 => => exporting layers                                                                               14.6s
 => => writing image sha256:ff21d8e4a4fe377a7551449afdf9e4d420b9c0ded70be7b3a577c42c4120737a           0.0s
 => => naming to docker.io/library/open-sense-demo                                                     0.0s

Auditor Toolbox for Ethereum Smart Contracts

Easily deploy an auditing environment for Ethereum smart contracts using this Docker image.

Features

Base Setup:

  • Operating System: Ubuntu Jammy (22.04)
  • Utilities: Git, Curl/wget, gawk/ripgrep, z3, pandoc, openssh-client, texlive, solidity plugins for Vim, etc.
  • Ethereum dependencies.

Languages & Frameworks:

  • Python: Version 3.9
  • Rust: Comprehensive setup with Cargo
  • Julia: Built-in support.
  • Noir: Support for the Noir language (Nargo).
  • Circom: Framework for zkSNARK circuits.
  • Solidity: Smart contracts language.
  • Vyper: Smart contracts language.

Ethereum Development:

A set of most of the famous tools in the ecosystem by different authors.

  • Foundry as modular toolkit for Ethereum application development written in Rust. It includes: Forge, Anvil, Cast, and Chisel. Author Paradigm.
  • Halmos for Symbolic Bounded Model Checker for Ethereum Smart Contracts Bytecode. Author a16z.
  • Heimdall for advanced EVM smart contract toolkit specialized in bytecode analysis. Author Jon-Becker.
  • Slither, Echidna, Medusa Fuzzer, Manticore, and Etheno, solc-select and crytic compile. Author Trail of Bits.
  • Extra Slither detectors, specialized detectors for Slither. Author Pessimistic.io.
  • Prover tool for symbolic analysis. Author Certora.
  • Mythril for smart contract analysis. Author Consensys.
  • Spearbit Report Generator, all needed dependencies to use the report generator in Spearbit audits
  • Python developer kit: It includes Vyper, Ape-Vyper, Py-solc-x and pyevwasm, can be found in add2
  • 4nalyz3r: A comprehensive static analysis tool for smart contracts. Author: Picodes.
  • Ganache and Truffle: Tools such as running a personal blockchain, development environment, testing framework, and asset pipeline for Ethereum. Author: Truffle Suite.
  • Pyrometer: is a mix of symbolic execution, abstract interpretation, and static analysis. Author: nascentxyz
  • Brownie: Python-based development and testing framework for smart contracts targeting the Ethereum Virtual Machine.
  • QuickPoc: Write fast proof of concepts for bug bounties. Author: Zachobront

Node.js Development:

  • NVM: Node Version Manager to switch between different Node.js versions.
  • Node: Long Term Support (LTS) version.
  • Package Managers: npm, yarn, and pnpm.

For more info go to the table with all the features or to the references page in the wiki, where all the links to the packages are included.

Additionally, the image sets up an environment for a user named whitehat and includes several installer scripts to simplify the installation of various tools and libraries.

Scripts

add2

The toolbox includes scripts to fast install multiple packages, utilities or dependencies that maybe not all auditors but a considerable part may use.

After the docker is builded, you may be missing some tool not installed by default, if so, execute the add2 command:

add2 # this is a shortcut of add2lbox

Select the option you want to install and voila, you're all set!

add2-update

It also includes a script to update the scripts and templates folder with the latest version of this github:

add2-update

issue

Also, it includes a script to create issues fastly without leaving the docker enviornment. Example:

issue c4 -n UncheckedTransfer -vim

That would create an issue with the Code4rena template, with name UncheckedTransfer and it is opened at the end using vim. For more info run issue -h

analyze4

analyze4 is a wrapper designed to seamlessly and intuitively execute the yarn analyze command from .4nalyz3r, making the process more transparent for the user." To use it, just go to the project you want to analyze, and run something like:

analyze4 src -nano

This would get the relative path of the src folder where all the contracts are (if the contracts folder is named "contracts", just change the word) and will launch 4nalyz3r against that code. The output will be given in the current folder and in this case, opened with nano text editor.

Troubleshooting

For general information, go to Troubleshooting section in the wiki

auditor-docker's People

Contributors

deivitto avatar luksgrin avatar magnetto90 avatar misirov 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

auditor-docker's Issues

`yarn` is not recognized as a command

Yarn is installed in ~/.yarn, however, even if the path is declared at .bashrc, there is another line that I don't know yet why, it is overriding it. The line is line 125 in .basrhc after a clean installation:

- export PATH=":/home/whitehat/.nvm/versions/node/v18.17.1/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/whitehat/.local/bin"
+ export PATH="$PATH:/home/whitehat/.nvm/versions/node/v18.17.1/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/whitehat/.local/bin"

As can be notice, it is not appending $PATH variable, what actually fixes it into a regular installation. Need to further investigate. Meanwhile, the hotfix is just to append yarn after that line:

# Dockerfile#L166
# Append the specified PATH to .bashrc 
RUN echo 'export PATH="$PATH:$HOME/.yarn/bin:$HOME/.config/yarn/global/node_modules/.bin"' >> ~/.bashrc

Add different flows guide

  • Add video / images and explanation of different use cases of different tools in order to improve user adoption of different tools
  • The point for new users is to have everything easy to try, but sometimes they don't know for what is a good use case:
    • I.e.: Pyrometer to follow the range of values that should be allowed in certain codes where a lot of operations are performed

Templates of different contest platforms

I think makes sense to have the template file of the different bug bounty / contest platforms in a folder so you don't need to look into previous issues or go into the webpage in order to get the template. This may be useful if you are offline or don't want to log into the page.

Notice some platforms need to log in and maybe you don't have in that moment the HWW you use / you are in a new computer or don't want to connect to the page for any reason.

However, maybe just opening a repo, and adding a script with the path to clone, like:
Name: audits / contests repos
Content:

  • 4rena template
  • CodeHawks template
  • Sherlock template
  • ????
  • Some audit firm template?

Would be enough for people that know sometimes will go offline (to say any reason)

Docker clock out-of-sync disallows package update and upgrade

So I wanted to install some stuff through apt-get and it crashed. It was a dependency issue. Thus, I executed

sudo apt-get update

And it crashed. Seemingly, the internal clock was out of sync.

Attemtped to use the fix propted in the readme (but for the docker image):

sudo date -s "$(curl -s --head http://google.com | grep ^Date: | sed 's/Date: //g')"

Permission denied...
After doing some research, my fix was

1. Stopping the docker container

docker stop devops199

2. Stashing a copy somewhere else

docker commit devops199 my_temporary_image

3. Making sure my local machine's clock was set properly

Because the docker image inherits the time from the machine

4. Deleting the old image

docker rm devops199

5. Re-running the image

docker run -it -d --name devops199 -e TZ=MyTimeZone my_temporary_image

Replace MyTimeZone by the appropriate one (i.e. America/New_York, Europe/Madrid ...).

The bad thing about this fix is that now I have some space occupied by my_temporary_image:

docker image list

yields

REPOSITORY                         TAG       IMAGE ID       CREATED         SIZE
my_temporary_image                 latest    3a9438defdaf   2 hours ago     5.7GB
whitehat-machine                   latest    82d98c925275   2 months ago    2.65GB

Fails on npm i -g typescript && npm i

Issues with npm installation or user permissions

Fails on npm i -g typescript && npm i

probably is a bug related to installatino of node, maybe its installed with sudo permission so the workaround is to always use sudo, what is not recommended

remove the chown -R whitehat lmao

Info: spends more than 4 minutes building that layer, just do chown where is needed lmao

  • check what is not owned by whitehat and run the command just on it

Use the tob image as part of the base?

Their installation of their packages should be clean on manticore, echidna, etc, maybe doing that copy pasting logic using multiple docker machines. Need more research

Issues with myth command / alias

Fix goes by removing alias itself and create a bash function, this may go to a .sh file

alias myth='source /home/whitehat/mythril_env/bin/activate && echo $@ && command myth $@ && deactivate'

function myth() {
source /home/whitehat/mythril_env/bin/activate
echo "$@"
command myth "$@"
deactivate
}

Manticore and Etheno not working

To do:

Check if using venv can make it work

Example:

$ manticore
Traceback (most recent call last):
File "/home/whitehat/.manticore_env/bin/manticore", line 5, in
from manticore.main import main
File "/home/whitehat/.manticore_env/lib/python3.9/site-packages/manticore/init.py", line 10, in
from .ethereum.manticore import ManticoreEVM
File "/home/whitehat/.manticore_env/lib/python3.9/site-packages/manticore/ethereum/init.py", line 3, in
from .manticore import ManticoreEVM, config
File "/home/whitehat/.manticore_env/lib/python3.9/site-packages/manticore/ethereum/manticore.py", line 15, in
from ..core.manticore import ManticoreBase, ManticoreError
File "/home/whitehat/.manticore_env/lib/python3.9/site-packages/manticore/core/manticore.py", line 29, in
from .worker import (
File "/home/whitehat/.manticore_env/lib/python3.9/site-packages/manticore/core/worker.py", line 4, in
from .state_pb2 import StateList, MessageList, State, LogMessage
File "/home/whitehat/.manticore_env/lib/python3.9/site-packages/manticore/core/state_pb2.py", line 32, in
_descriptor.EnumValueDescriptor(
File "/home/whitehat/.manticore_env/lib/python3.9/site-packages/google/protobuf/descriptor.py", line 796, in new
_message.Message._CheckCalledFromGeneratedFile()
TypeError: Descriptors cannot not be created directly.
If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc >= 3.19.0.
If you cannot immediately regenerate your protos, some other possible workarounds are:

  1. Downgrade the protobuf package to 3.20.x or lower.
  2. Set PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python (but this will use pure-Python parsing and will be much slower).

More information: https://developers.google.com/protocol-buffers/docs/news/2022-05-06#python-update

`pip3` is broken

The pip3 alias is defined within .bashrc as follows:

alias pip3="pip3.9"

This does not work. I imagine the intention is to use python3.9's corresponding pip. The fix is:

- alias pip3="pip3.9"
+ alias pip3="python3 -m pip"

This only works because earlier python3 has been defined as an alias for python3.9. Cool feature is that if python3 points towards a different python version in the future, this alias will adapt appropriately.

Also, I would remove alias python3.9-pip='python3.9 -m pip' because it's obsolete given the fix above.

Add support for pyrometer

pyrometer even if it's in beta, it's getting more common as tool.

Pyrometer is a mix of symbolic execution, abstract interpretation, and static analysis - we take ideas from each and apply them with an engineering first mindset to create an effective tool (and avoid nerdsnipes by academic papers) aiming to help both auditors and developers.

Pyrometer may eventually be language agnostic, but for now it is targeting Solidity. The code isn't currently entirely structured for multi-language support, but it has some of the bones to be able to support other EVM-targeting languages.

https://github.com/nascentxyz/pyrometer

`code` sometimes is not sync with the current version of vscode

Where: [v0.0.1 - v0.0.2]

Code command sometimes is failing due to not having in the path the version in .vscode/[...]/ACTUAL_HASH_VERSION/[...]/code

The solution is to stop adding the path or to add an alias with an exact version, but adding to .bashrc a code that gets latest version by commit into a custom folder latest, and add tot he PATH latest folder, in that way, even if the hash changes, the latest version changes too.

local `.bin` for shady executables?

So I wanted to try ToB's medusa. I downloaded and unzipped the latest release, and had a nice binary. So, for the sake of order, I did:

mkdir /home/whitehat/.bin
mv medusa /home/whitehat/.bin/.
echo 'export PATH="$PATH:/home/whitehat/.bin"' >> /home/whitehat/.bashrc
source .bashrc

TLDR;

Is it worth it to add a .bin directory and adding it to $PATH for these scenarios?

Want to know my opinion? Everyone should be fluent with Linux systems, thus they should be capable of doing these things... So I would not include this feature lol

Issues installing solidity `0.8.20` with `solc-select` on M1 mac

Reproducing steps:

whitehat@4cfb79db3f7b:~/test/echidna$  solc-select install 0.8.20
Installing solc '0.8.20'...
solVersion '0.8.20' installed.
whitehat@4cfb79db3f7b:~/test/echidna$ solc-select use 0.8.20
Switched global version to 0.8.20
whitehat@4cfb79db3f7b:~/test/echidna$ solc --version
qemu-x86_64: Could not open '/lib64/ld-linux-x86-64.so.2': No such file or directory
whitehat@4cfb79db3f7b:~/test/echidna$ 

should we create a basic setup command?

something like
docker-setup: installs extensions, installs cargo forge etc,...

maybe with questions, like when you create a new project and ask you things like.

Example:
Name: nanai
Author: Deivitto
Choose wagmi package:
-> rainbow
-> wallet coneeeeeeect
-> etc

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.