Giter Club home page Giter Club logo

nardew / cryptoxlib-aio Goto Github PK

View Code? Open in Web Editor NEW
128.0 128.0 33.0 294 KB

cryptoxlib-aio - asynchronous python client for various crypto exchanges with full REST API and websocket support. Supported exchanges: AAX, Bibox, BiboxEurope, Binance (spot, margin, USDS-M futures, COIN-M futures, BLVT, BSwap), Bitforex, BitpandaPro, Bitvavo, BTSE, Coinmate, Eterbase, HitBTC, Liquid.

Home Page: https://pypi.org/project/cryptoxlib-aio/

License: MIT License

Python 99.98% Shell 0.02%
api asyncio binance crypto crypto-exchanges cryptocurrency python trading websockets

cryptoxlib-aio's People

Contributors

antoniogargaro avatar cyberjunky avatar dependabot[bot] avatar nardew avatar nkrsic avatar xiandong79 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

cryptoxlib-aio's Issues

[Question] What is the reason for asyncio in webscocket?

Hi :)

I'm new to asyncio in general, but I understood that for many simultan REST API calls, asyncio is much better than using threads, because asyncio makes use of the waiting time, while threads divide resources and most of the time just wait. And threads are limited in number, so you can't do 1000 REST calls at once for example.

But where is the advantage when using websocket? I mean where is the waiting time, asyncio is using for other tasks? You get a websocket message from the exchange and process them, after that you process the next message. There may be a small waiting time where you get no new message, but if this is the case, there is nothing else to do, so no need for asyncio.

Or is the whole point of asyncio+websocket that you can safe a single permanent thread?
When you have a script for trading, which uses websocket, the websocket of course needs to run simultanously to your trading script... so is this the point where asyncio is used? If this is the case... I think threads or especially processes are superior to asyncio, for example just because my trading script has no waitingtime, it calculates nonstop.. Am I right?

Trouble connecting to bitpanda pro

Hello,
there seems to be an error connection to the bitpanda API, because I always receive an error when I'm trying to connect. I created the API key with access to read, trade and withdrawal. However some functions seem to work like client.get_market_ticker(Pair("BTC", "EUR")) This returns everything as expected but most of the functions are returning error messages.

The following example dow not work

from cryptoxlib.CryptoXLib import CryptoXLib
from cryptoxlib.Pair import Pair
from cryptoxlib.version_conversions import async_run
from cryptoxlib.clients.bitpanda.exceptions import BitpandaException
from cryptoxlib.clients.bitpanda.enums import OrderSide


async def main():
    apikey = "key"
    client = CryptoXLib.create_bitpanda_client(apikey)

    try:
        await client.create_market_order(Pair("BTC", "EUR"), OrderSide.BUY, "0.00021")
    except BitpandaException as e:
        print(e)
    await client.close()


if __name__ == '__main__':
    async_run(main())

ModuleNotFoundError: No module named 'cryptoxlib'

i have 2 error..

  1. ModuleNotFoundError: No module named 'cryptoxlib'

`C:\Python>pip install git+https://github.com/nardew/cryptoxlib-aio.git@master
Collecting git+https://github.com/nardew/cryptoxlib-aio.git@master
Cloning https://github.com/nardew/cryptoxlib-aio.git (to revision master) to c:\users\mero\appdata\local\temp\pip-req-build-y9j6cl7k
Running command git clone --filter=blob:none --quiet https://github.com/nardew/cryptoxlib-aio.git 'C:\Users\mero\AppData\Local\Temp\pip-req-build-y9j6cl7k'
WARNING: Did not find branch or tag 'master', assuming revision or ref.
Running command git checkout -q master
error: pathspec 'master' did not match any file(s) known to git
error: subprocess-exited-with-error

× git checkout -q master did not run successfully.
│ exit code: 1
╰─> See above for output.

note: This error originates from a subprocess, and is likely not a problem with pip.
error: subprocess-exited-with-error

× git checkout -q master did not run successfully.
│ exit code: 1
╰─> See above for output.

note: This error originates from a subprocess, and is likely not a problem with pip.`

create_margin_order() returns "code":-1102,"msg":"A mandatory parameter was not sent, was empty/null, or malformed."

create margin order always returns code 1102: "A mandatory parameter was not sent, was empty/null, or malformed.", but does not specify which parameter is malformed.

the following parameters are passed to the function and everything seems to check out:
{'symbol': 'BTCUSDT', 'side': 'BUY', 'type': 'LIMIT', 'quantity': '0.007715', 'quoteOrderQty': None, 'price': '28462.699999999997', 'stopPrice': None, 'isIsolated': 'TRUE', 'newClientOrderId': None, 'icebergQty': None, 'recvWindow': None, 'timestamp': 1621691008642}

Event loop is closed error?

Trying to execute your examples (tried binance and bitpanda REST to print orderbook), but after the orderbook is printed, it also prints an error (using python 3.8 on windows):

import asyncio
import logging
import os

from cryptoxlib.CryptoXLib import CryptoXLib
from cryptoxlib.clients.binance import enums
from cryptoxlib.Pair import Pair
from cryptoxlib.clients.binance.exceptions import BinanceException

LOG = logging.getLogger("cryptoxlib")
LOG.setLevel(logging.DEBUG)
LOG.addHandler(logging.StreamHandler())

async def run():
    api_key = ""
    sec_key = ""

    client = CryptoXLib.create_binance_client(api_key, sec_key)
    await client.get_orderbook(pair = Pair('ETH', 'BTC'), limit = enums.DepthLimit.L_5)
    
    await client.close() # error happens with and without this line.
    
if __name__ == "__main__":
    asyncio.run(run())

rest type [GET], resource [depth], params [{'symbol': 'ETHBTC', 'limit': '5'}], headers [{}], data [None]
<: status [200], response [{"lastUpdateId":1412346346,"bids":[["0.03061400","0.40500000"],["0.03061300","2.36500000"],["0.03061200","25.79300000"],["0.03061000","27.34100000"],["0.03060700","7.00000000"]],"asks":[["0.03061700","35.90500000"],["0.03061900","0.56500000"],["0.03062100","13.59100000"],["0.03062200","24.00000000"],["0.03062400","7.91600000"]]}]
Timer RestCall finished. Took 402.125 ms.
Exception ignored in: <function _ProactorBasePipeTransport.del at 0x03BEDEC8>
Traceback (most recent call last):
File "C:\Users\Serpens66\AppData\Local\Programs\Python\Python38-32\lib\asyncio\proactor_events.py", line 116, in del
self.close()
File "C:\Users\Serpens66\AppData\Local\Programs\Python\Python38-32\lib\asyncio\proactor_events.py", line 108, in close
self._loop.call_soon(self._call_connection_lost, None)
File "C:\Users\Serpens66\AppData\Local\Programs\Python\Python38-32\lib\asyncio\base_events.py", line 711, in call_soon
self._check_closed()
File "C:\Users\Serpens66\AppData\Local\Programs\Python\Python38-32\lib\asyncio\base_events.py", line 504, in _check_closed
raise RuntimeError('Event loop is closed')
RuntimeError: Event loop is closed

Bitvavo websocket trades, stream has different keyword than subscription

Code fix:

cryptoxlib/clients/bitvavo/BitvavoWebsocket.py
177:

class TradesSubscription(BitvavoSubscription):
    def __init__(self, pairs : List[Pair], callbacks : List[Callable[[dict], Any]] = None):
        super().__init__(callbacks)

        self.pairs = pairs

    @staticmethod
    def get_channel_name():
        return "trade"

    # Stupid bitvavo register "trades" answers "trade"
    def get_subscription_message(self, **kwargs) -> dict:
        return {
            "name": self.get_channel_name() + 's',
            "markets": [
                map_pair(pair) for pair in self.pairs
            ]
        }

Binance listenkeyExpired in BinanceFuture Websocket Channel

I [2021-07-01 10:30:49,174] [.swap_account_update] swap_account_update: {'stream': '6uxymh85KEkkHQJFqQeUeWjY5eCQO00G5s0DZx3aQtZ9Nn6IcGqxGGRWBKzr6SVx', 'data': {'e': 'listenKeyExpired', 'E': 1625135449173}} 
I [2021-07-01 10:30:49,175] [.swap_account_update] swap_account_update: {'stream': '6uxymh85KEkkHQJFqQeUeWjY5eCQO00G5s0DZx3aQtZ9Nn6IcGqxGGRWBKzr6SVx', 'data': {'e': 'listenKeyExpired', 'E': 1625135449173}} 

after exact 1 hour run, this error this happens.

Extra actions on this is needed, like when receive a msg like above, the client do get_listenkey() + the re-connection() + send_subscription_message() directly and update internal listenkey.

Candlesticks / klines support on websockets

I see that cryptoxlib-aio does not yet have support for subscribing to websockets candlesticks / klines / OHLC (choose your preferred name). Certainly that is the case on Binance. I don't know the other exchanges covered here so well.

Is this a design decision around candles, or perhaps has some complexities to deal with?
... or just that no-one has wanted candlesticks on the WS feed yet?

Thanks for this great resource.

Requesting support for WS unsubscriptions and orderly shutdowns

This issue is a request to provide clean effective ways to unsubscribe from websocket streams, and achieve an orderly shutdown of all the websocket connections.

Like the rest of us here, I'm building a cryptoxlib-based program that's designed to run 24/7. But in my case, I also need mechanisms to shut down my program without fear of corrupting my data or states.

I am recommending the creation of methods to (a) unsubscribe from one, some or all feeds at will, and (b) cleanly close one, some or all live websockets.

Would you folks consider scheduling something like this into your dev workflow, or would you prefer I have a crack myself and file a PR?

If you want me to do it, it might take a few weeks. In the meantime, I'll just add a signal mechanism into my app to tell it to disable websocket callbacks and flush out data, so it can cop a SIGKILL without risk of damage.

Keen for your thoughts

BTSE authentication handshake updated

BTSE updated websocket messages exchanged following successful websocket authentication. Upon successful authorization message "UNLOGIN_USER connect success" is published to the client which is not expected by the library.

Bug on Binance Margin create_margin_order function

@nardew

/cryptoxlib-aio/cryptoxlib/clients/binance/BinanceClient.py , for create_margin_order function, when send market order, the time_in_force should be empty.

time_in_force: Optional[enums.TimeInForce] = enums.TimeInForce.GOOD_TILL_CANCELLED,

should be

time_in_force: Optional[enums.TimeInForce] = None,

otherwise, you get

cryptoxlib.clients.binance.exceptions.BinanceRestException: Rest API exception: status [400], response [{'code': -1106, 'msg': "Parameter 'timeInForce' sent when not required."}]

Question: How binance websocket on account channel is keep_alive?

https://binance-docs.github.io/apidocs/spot/cn/#listen-key

Ping/Keep-alive a ListenKey (USER_STREAM)

    Response:

{}

PUT /api/v3/userDataStream

Keepalive a user data stream to prevent a time out. User data streams will close after 60 minutes. It's recommended to send a ping about every 30 minutes.

I see a function named "keep_alive_spot_listen_key()", however, after a global search, I did not find where it is used to keep account channel alive.

we can add a forever-loop which send a RESTful request every 30 min to keep account channel alive.

async_create_task is not supported after python3.8

E [2022-06-19 02:52:24,037] Task exception was never retrieved
future: <Task finished name='Task-4' coro=<CryptoXLibClient.start_websockets() done, defined at /home/ubuntu/.local/lib/python3.10/site-packages/cryptoxlib/CryptoXLibClient.py:219> exception=Exception('Unsupported Python version! Only versions 3.6.x, 3.7.x and 3.8.x are supported.')>
Traceback (most recent call last):
  File "/home/ubuntu/.local/lib/python3.10/site-packages/cryptoxlib/CryptoXLibClient.py", line 227, in start_websockets
    tasks.append(async_create_task(
  File "/home/ubuntu/.local/lib/python3.10/site-packages/cryptoxlib/version_conversions.py", line 40, in async_create_task
    raise Exception(f'Unsupported Python version! Only versions 3.6.x, 3.7.x and 3.8.x are supported.')
Exception: Unsupported Python version! Only versions 3.6.x, 3.7.x and 3.8.x are supported.
/usr/lib/python3.10/asyncio/base_events.py:1897: RuntimeWarning: coroutine 'WebsocketMgr.run' was never awaited
  handle = None  # Needed to break cycles when an exception occurs.
RuntimeWarning: Enable tracemalloc to get the object allocation traceback

Binance Margin (cross/isolated) WS channel has different listen-key

https://binance-docs.github.io/apidocs/spot/cn/#payload

if Binance Margin (cross/isolated) WS private channel is supported, please provide an example.

I think it is not supported yet, as it need a different API path than spot to get_listen_key()

    async def get_listen_key(self):
        return await self._create_post("userDataStream", headers = self._get_header(), api_variable_path = BinanceClient.API_V3)

so, in order to subscribe the Margin (cross/isolated) WS private channel, AccountSubscription needs 3 different get_listen_key() for each type

from cryptoxlib.clients.binance.BinanceWebsocket import AccountSubscription

need to be updared into

from cryptoxlib.clients.binance.BinanceWebsocket import SpotAccountSubscription
from cryptoxlib.clients.binance.BinanceWebsocket import CrossMarginAccountSubscription
from cryptoxlib.clients.binance.BinanceWebsocket import IsolatedMarginAccountSubscription

test network

hi,

crptoxlib is working nicely for me, however I need to switch over to binance testnet... as we're testing trading and obviously cant trade with real network during dev cycle.

while I know this isn't strictly speaking the place to ask this but...

we download historical trades from

https://data.binance.vision/data/spot/daily/trades/

We then use

binance_client.get_historical_trades(symbol_pair, 1000, last_trade_id)

To get the trades since "last_trade_id" .. this works perfectly in prod, the IP address is setup so the client call is accepted. However using the demo keys, I get;

response [{'code': -2015, 'msg': 'Invalid API-key, IP, or permissions for action.'}]

Not sure where/how I validate the test net new keys I have generated for test net (Im using newly generated keys instead of the old "production" ones). Again the documentation is a bit all over the place, I find.

thanks much,

Graham

auto reconnection for binance websocket


E [2021-06-25 11:01:36,670] ************************************************************
E [2021-06-25 11:01:36,671] [.spot_account_update] ReadTimeout(ReadTimeoutError("HTTPSConnectionPool(host='api.binance.com', port=443): Read timed out. (read timeout=10)")) 
E [2021-06-25 11:01:36,671] ************************************************************
I [2021-06-25 11:01:36,673] [.execute_logic] for UNIUSD_PERP, spot_balance: 11.891,  swap_position: {"platform": "BINANCE", "account": null, "strategy": null, "symbol": "UNIUSD_PERP", "short_quantity": 20657.0, "short_avg_price": 17.352, "long_quantity": 0, "long_avg_price": 0, "liquid_price": 0, "timestamp": 1624618866914} 
E [2021-06-25 11:01:36,678] [3] An exception [] occurred. The websocket manager will be closed.
I [2021-06-25 11:01:36,678] [3] Subscriptions: ['ku1BBJk6y9sDTb8THUVLsnvG8c7vkr9gewfQtuDub5hNCWGmuR0Ccz5fRHLR']
E [2021-06-25 11:01:36,678] Unrecoverable exception occurred while processing messages: 
I [2021-06-25 11:01:36,678] Remaining websocket managers scheduled for shutdown.
I [2021-06-25 11:01:36,679] [2] Exception [<class 'cryptoxlib.exceptions.WebsocketClosed'>]: Websocket was closed: None
E [2021-06-25 11:01:36,679] Task exception was never retrieved
future: <Task finished name='Task-4' coro=<CryptoXLibClient.start_websockets() done, defined at /home/ubuntu/deployment/cryptoxlib-aio/cryptoxlib/CryptoXLibClient.py:217> exception=AttributeError("'NoneType' object has no attribute 'close'")>
Traceback (most recent call last):
  File "/home/ubuntu/deployment/cryptoxlib-aio/cryptoxlib/CryptoXLibClient.py", line 233, in start_websockets
    task.result()
  File "/home/ubuntu/deployment/cryptoxlib-aio/cryptoxlib/WebsocketMgr.py", line 366, in run
    task.result()
  File "/home/ubuntu/deployment/cryptoxlib-aio/cryptoxlib/WebsocketMgr.py", line 331, in main_loop
    await self._process_message(self.websocket, message)
  File "/home/ubuntu/deployment/cryptoxlib-aio/cryptoxlib/clients/binance/BinanceCommonWebsocket.py", line 80, in _process_message
    await self.publish_message(WebsocketMessage(subscription_id = message['stream'], message = message))
  File "/home/ubuntu/deployment/cryptoxlib-aio/cryptoxlib/WebsocketMgr.py", line 414, in publish_message
    await subscription.process_message(message)
  File "/home/ubuntu/deployment/cryptoxlib-aio/cryptoxlib/WebsocketMgr.py", line 219, in process_message
    await self.process_callbacks(message)
  File "/home/ubuntu/deployment/cryptoxlib-aio/cryptoxlib/WebsocketMgr.py", line 231, in process_callbacks
    await asyncio.gather(*tasks)
  File "/home/ubuntu/deployment/strategy/utils/decorator.py", line 43, in wrapper
    return await asyncio.wait_for(method(*args, **kwargs), timeout)
  File "/usr/lib/python3.8/asyncio/tasks.py", line 501, in wait_for
    raise exceptions.TimeoutError()
asyncio.exceptions.TimeoutError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ubuntu/deployment/cryptoxlib-aio/cryptoxlib/CryptoXLibClient.py", line 238, in start_websockets
    await self.shutdown_websockets()
  File "/home/ubuntu/deployment/cryptoxlib-aio/cryptoxlib/CryptoXLibClient.py", line 248, in shutdown_websockets
    await subscription_set.websocket_mgr.shutdown()
  File "/home/ubuntu/deployment/cryptoxlib-aio/cryptoxlib/WebsocketMgr.py", line 434, in shutdown
    await self.websocket.close()
  File "/home/ubuntu/deployment/cryptoxlib-aio/cryptoxlib/WebsocketMgr.py", line 126, in close
    await self.session.close()
AttributeError: 'NoneType' object has no attribute 'close'

Running the client in background

Hello,

I'm trying to use your websocket async client and I got problems to run asynchronously the client.
I did something like :

class Test(legacy.Legacy):
   def __init__(self, xx):
      self.client = CryptoXLib.create_aax_client(self.__api_key, self.__api_secret)

    async def account_update(self, response: dict) -> None:
        print(f"Callback account_update: [{response}]")

    async func(self):
        self.ws_request_client.compose_subscriptions([
            AccountSubscription(callbacks=[self.account_update])
        ])
        await self.ws_request_client.start_websockets())
        # a lot of other stuff then
        toto()
        tata() # do some orders on market
        .....

If I do that, await will block the execution flow and toto/tata will never be executed. However I'll see orders with account_update function callback (order that I do manually).
I would like to subscribe to Account but keep the execution flow, to execute toto and tata. I did tried this, but now I don't see orders (like websockets never been started) :

class Test(legacy.Legacy):
   def __init__(self, xx):
      self.client = CryptoXLib.create_aax_client(self.__api_key, self.__api_secret)

    async def account_update(self, response: dict) -> None:
        print(f"Callback account_update: [{response}]")

    async func(self):
        self.ws_request_client.compose_subscriptions([
            AccountSubscription(callbacks=[self.account_update])
        ])
        loop = asyncio.get_event_loop()
        loop.create_task(coro=self.ws_request_client.start_websockets())
        # a lot of other stuff then
        toto() # now executed
        tata() # now executed, do some orders on market
        .....

I'm calling the function func in another class with asyncio.run(func()) to avoid the await/async all my app.
Any advise would be appreciated

Binance Private Chnannel listenKeyExpired, auto reconnection


I [2021-06-25 13:48:09,570] [.swap_account_update] swap_account_update: {'stream': 'njbKoDaXfnrYsLgychLJ4B8cCfdFHxbBNxHbm9sqgrrNizGB2b1k4lL3Ud7BbaDh', 'data': {'e': 'listenKeyExpired', 'E': 1624628889565}} 
I [2021-06-25 13:48:09,584] [.swap_account_update] swap_account_update: {'stream': 'njbKoDaXfnrYsLgychLJ4B8cCfdFHxbBNxHbm9sqgrrNizGB2b1k4lL3Ud7BbaDh', 'data': {'e': 'listenKeyExpired', 'E': 1624628889565}} 

Issue on Binance

I am trying to runthe example binance_ws.py but I have an error, I remplazed API KEY for my API KEY and SEC (Here remplazed by XXX) but does not work. Any suggestion?

Datails of errors are below

Available loggers: ['concurrent.futures', 'concurrent', 'asyncio', 'aiohttp.access', 'aiohttp', 'aiohttp.client', 'aiohttp.internal', 'aiohttp.server', 'aiohttp.web', 'aiohttp.websocket', 'cryptoxlib.Timer', 'cryptoxlib', 'websockets.protocol', 'websockets', 'websockets.server', 'websockets.client', 'cryptoxlib.WebsocketMgr', 'cryptoxlib.CryptoXLibClient', 'cryptoxlib.PeriodicChecker', 'cryptoxlib.clients.bitforex.BitforexWebsocket', 'cryptoxlib.clients.bitforex', 'cryptoxlib.clients', 'cryptoxlib.clients.bitforex.BitforexClient', 'cryptoxlib.clients.liquid.LiquidWebsocket', 'cryptoxlib.clients.liquid', 'cryptoxlib.clients.liquid.LiquidClient', 'cryptoxlib.clients.bibox.BiboxWebsocket', 'cryptoxlib.clients.bibox', 'cryptoxlib.clients.bibox.BiboxClient', 'cryptoxlib.clients.bibox_europe.BiboxEuropeWebsocket', 'cryptoxlib.clients.bibox_europe', 'cryptoxlib.clients.bibox_europe.BiboxEuropeClient', 'cryptoxlib.clients.bitpanda.BitpandaWebsocket', 'cryptoxlib.clients.bitpanda', 'cryptoxlib.clients.bitpanda.BitpandaClient', 'cryptoxlib.clients.binance.BinanceWebsocket', 'cryptoxlib.clients.binance', 'cryptoxlib.clients.binance.BinanceClient', 'cryptoxlib.clients.bitvavo.BitvavoWebsocket', 'cryptoxlib.clients.bitvavo', 'cryptoxlib.clients.bitvavo.BitvavoClient', 'cryptoxlib.clients.btse.BtseWebsocket', 'cryptoxlib.clients.btse', 'cryptoxlib.clients.btse.BtseClient', 'cryptoxlib.clients.aax.AAXWebsocket', 'cryptoxlib.clients.aax', 'cryptoxlib.clients.aax.AAXClient']

Traceback (most recent call last):
File "c:/Users/Gabriel/Desktop/Bot/BinanaceEx.py", line 56, in
asyncio.run(run())
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.752.0_x64__qbz5n2kfra8p0\lib\asyncio\runners.py", line 43, in run
return loop.run_until_complete(main)
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.752.0_x64__qbz5n2kfra8p0\lib\asyncio\base_events.py", line 616, in run_until_complete
return future.result()
File "c:/Users/Gabriel/Desktop/Bot/BinanaceEx.py", line 33, in run
api_key = os.environ['XXX']
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.752.0_x64__qbz5n2kfra8p0\lib\os.py", line 675, in getitem
raise KeyError(key) from None
KeyError: 'XXX'

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.