Giter VIP home page Giter VIP logo

binance-pump-alerts's Introduction

Binance Pump Alerts

BPA is a simple application which gets the price data from Binance Spot or Futures API and sends Telegram messages based on parameters set used to detect pumps and dumps on the Binance Exchange.

Demo Telegram Channel hosted on AWS ec2 running the 'Base Stable Version' release 24/7.

image

Manual Setup

  1. On the command-line, run the command pip install -r requirements.txt while located at folder with code.
  2. Create a new telegram bot token from @botfather.
  3. Get telegram chat_id from @get_id_bot.
    • Alternatively, a channel_id can be used as well.
  4. Add pairs to watch into the watchlist or to ignore in blacklist or leave it empty to monitor all tickers on Binance.
  5. Run the script with the command python pumpAlerts.py.

Docker Setup

  1. Use environment variables in the docker-compse.yml file to provide your config.
    • See entrypoint.sh for environment variable names and the config possibilities.
    • You can also use a .env file during development.
    • If changing the config parameters, you have to make sure that search and replace will place the right parameter in the config.yml
    • Emojis are more tricky therefore defining it with some tricks e.g. PUMP_EMOJI="! \"\\\\U0001F4B9\""
  2. On the command line run docker-compose up -d --build to create and run the docker image/container.

Configuration

Mandatory Params

  1. telegramToken: The token obtained from@botfather.
  2. telegramChatId: The bot will send the messages to this chat_id. It can be a group or channel as well.

Main Customizable Params

  1. chartIntervals: Can be modified to consider other timeframes, follow the format of 's' for seconds, 'm' for minutes, 'h' for hours.
  2. outlierIntervals: (0.01 -> 1% , 0.1 -> 10%), modify accordingly based on needs. Avoid setting it too low to avoid noise.
  3. extractInterval: Default is 1s, Interval at which we retrieve the price information from Binance.
  4. pairsOfInterest: Default is USDT. Other options include BUSD, BTC, ETH etc.
  5. topReportIntervals: Default is 1h,3hand 6h Intervals for top pump and dump reports to be sent, ensure it is in chartIntervals + outlierIntervals as well.

Optional features to enable

  1. watchlist: Default if left empty it'll look at ALL symbols after filtering by pairs of interest. If pairs are added to the watchlist, the application will only TRACK the pairs specified. pairsOfInterest will be ignored.
  2. blacklist: Default if left empty it'll look at ALL symbols after filtering by pairs of interest. If pairs are added to the blacklist, the application will ignore pairs specified. pairs of Interest will NOT be impacted.
  3. dumpEnabled: If True, the application will alert on dumps as well.

Top Pump & Dump Params

  1. topPumpEnabled: If True, the application will send the Top X pumps at the defined interval.
  2. topDumpEnabled: If True, the application will send the Top X dumps at the defined interval.
    • Together with pump information, if enabled.
  3. noOfReportedCoins: Top X amount of coins shown, adjust to show more or less within the timeframe.
  4. telegramAlertChatId: Insert the alert chat_id for top pump dump alert, if left at 0, it'll send messages to the telegram chat_Id. For params not indicated above, refer to comments besides parameter for its use.

Debug Params (Avoid modifying if possible!)

  1. debug: Default is False. Please, only enable for debugging purposes. Default logging set to info level.
  2. resetInterval: Default 12h. It clears the array used to store data price points to prevent memory issues.
  3. priceRetryInterval: Default 5s. In the case of get price fail, this is the time delay before re-attempt
  4. checkNewListingEnabled: Default True. Enables checking and adding of new listing pairs.

Todo

  1. Integrate with Binance API to make trades on pumps.
  2. Integrate with Binance Websocket API to get volume information.
  3. Integrate with listing-predictor to monitor movements for potential listings.

Completed features

  1. Telegram integration
  2. Price update every 1s
  3. Adjustable alert % param (outliers)
  4. Watchlist feature
  5. Monitor future markets
  6. Optional alert on dumps
  7. Customizable minimum alert interval for spam prevention
  8. Option to disable print debugs on extraction
  9. [Test] Volume Change Updates (TEST_VOL version)
  10. Allows long period of running without memory issues
  11. Send periodic Top X Pump & Dump reports
  12. Docker integration (Thanks to @patbaumgartner)
  13. Logging integration (Thanks to @patbaumgartner)
  14. Major Refactoring and cleanup (Thanks to @patbaumgartner)
  15. Blacklist feature

binance-pump-alerts's People

Contributors

brianleect avatar patbaumgartner 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

binance-pump-alerts's Issues

Params

How setup movement of price 1% in 1 minute?
'1m':0.01
'1m':0.1
'1m':1

what is the correct?

[Possible Feature] 24h Volume

Hi @brianleect, Could you add the USDT volume that Binance always shows and which is independent of the candles? I think it is the volume for the last 24 hours.

But not the percentage change in volume, I mean just the amount of USDT being traded at the moment.

For example:

"DUMP: TCTUSDT / Change: -1.16 % / Price: 0.023277 / Volume (USDT): 14.16M / Interval: 5m"

"PUMP: BTCUSDT / Change: 3.25 % / Price: 38536 / Volume (USDT): 20.14B / Interval: 30m"

Originally posted by @Juanjacinto123 in #10 (comment)

Spam alerts during a pump

Due to how checks are done, which is comparing a price point against a number of previous data point for each interval, we have repeated alerts within a short span.

image

Possible solution

  1. Implement auto sleep for x amount of seconds for alert (But it might result in missing out pumps that might be occurring at the same time)

[Improvement] [QOL] Spam Alerts

What I understand is that the new alert will continue to be sent as long as the change is greater than or equal to what was previously notified. Am I correct?
For example:
intervals = [''5m', '15m']
outlier_param = {'5m':0.02,'15m':0.04,'}
First notification:
"PUMP: TCTUSDT / Change: 2.5% / Price: 0.023277 / Interval: 5m"
Muted notification:
"PUMP: TCTUSDT / Change: 2.3% / Price: 0.023277 / Interval: 5m"
Second notification:
"PUMP: TCTUSDT / Change: 2.6% / Price: 0.023277 / Interval: 5m"

In this case the 2nd & 3rd notification will both not be triggered as the second condition trigger condition is not satisfied which is price must have a movement of larger than that of previous triggered price alert

Outlier_param * 0.023277

The intention was that there is little value in price alerts triggered which have little to no deviation in price.

I understand, that is to say that the percentages are accumulated.

I think that the most optimal for the second trigger condition would be that the next value is simply greater than the previous one.

As in the previous example:

intervals = [''5m']
outlier_param = {'5m':0.02}

First notification:
"PUMP: TCTUSDT / Change: 2.5% / Price: 0.023277 / Interval: 5m"

Second (Muted) notification:
"PUMP: TCTUSDT / Change: 2.3% / Price: 0.023277 / Interval: 5m"

Third notification:
"PUMP: TCTUSDT / Change: 2.6% / Price: 0.023277 / Interval: 5m"

The way you propose it is optimal for small percentages, but when handling slightly larger percentages, say greater than 4 or 5%, many alerts would be lost.

Originally posted by @Juanjacinto123 in #31 (comment)

[Major] [Rework] Telegram Message sending

Look into co-routines / async / threading implementation for telegram messages.

Current model sleeps on a failed message which stops the entire program and impacts the price extraction process. Not optimal and might be give off false alerts.

[Feature Request] Making param names consistent

In params.py the first params are written lower case whereas other params are written UPPER_CASE. I would love to adjust the Dockerfile for all params in the same way. Therefore it would be great to have all the params written in the same way. WDYT? Is there a specific reason?

Best,
Patrick

[Bug] [Test Vol] 100054 Error

image

Occurs randomly but unlikely due to weight limit being surpassed as the next retry attempt after sleep(1) works. Not sure what is causing this issue.

Seems to only be an issue for endpoint for 24h ticker. Did not notice the error happening for the previous version with just price.

This issue does not impact the current script significantly, script still works as intended.

specific cryptocurrency

How could it be modified for a specific cryptocurrency?
example only see ADAUSDT every 5 seconds

thanks

CPU Consumption

image
image

Perhaps I should limit to only USDT pairs to see if CPU consumption is reduced. Possibly use sleep instead of while loop check time?

Inefficient method of storage with arrays might be be a cause as well

[Possible Feature] Individualized Outlier Params

Could consider setting individual trigger params for pairs of concern e.g. for BTC or ETH we could have lower trigger params we wish to customize.

Will consider implementing if there's enough interest.

[Discussion] [Improvement] Overall market state

In scheduled TDPA, instead of just top pump and dumped coins some other possibly insightful values could be added such as

  1. Average % change in price for each coin
  2. Net coins up / Net coins down

Would be an interesting piece of information to be sent along with top X dump and pump coins.

Implementation should not be too difficult. Will try to implement within 1-2 weeks or sooner if I can find the time.

I'm open to implementing other metrics as well, feel free to comment any interesting ideas.

[Bug] Crash after extended period ran

image

Ran for extended period of 30 days. No visible error. Program stopped running.

image

^ After manually terminating the process using Ctrl + C on terminal, it appears issue might have been related to request portion of code.

Will continue running and see if issue can be replicated and identified.

[QOL] Remove pairs returned but not actually listed

Problem: Certain pairs are being alerted while not actually being listed

Suspected cause: api by binance returns price for tokens not listed on Binance

Soln & follow up: Determine tokens that are being sent but not on binance and add these tokens to default blacklist

E.g. NBTUSDT
image
image

Possible bug for intervals other than 1s

No notification has been seen thus far on 5s/15s or further indicators. Possibly due to strict parameters to trigger? Will have to test to ensure they are functional.

[Bug] Possible problem with handling of connection

Thanks Brian. I am currently testing and eventually gets stuck on the following message:

"DUMP: TCTUSDT / Change: -1.16 % / Price: 0.023277 Interval: 1m
Time taken to extract and append: 6.69248366355896
Extracting after 15 s"

And I have to interrupt the process and then restart it and have it start up again. I think maybe it is due to some failures in my internet connection, but I think the code should try to reconnect after some specific period of time, to avoid getting stuck at that point. Update: This situation occurred three times during the day.

Another bug occurs when too many notifications accumulate for Telegram message and I get the following error:

"DUMP: VTHOUSDT / Change: -1.09 % / Price: 0.005849 Interval: 1m
DUMP: STORJUSDT / Change: -1.15 % / Price: 0.9025 Interval: 1m
DUMP: MANAUSDT / Change: -1.03 % / Price: 0.6822 Interval: 1m
Telegram bot error
Telegram bot error
Telegram bot error
Telegram bot error
Telegram bot error
DUMP: BONDUSDT / Change: -2.26 % / Price: 28.76 Interval: 3m
DUMP: VTHOUSDT / Change: -1.09 % / Price: 0.005849 Interval: 1m"

I don't know if configuring a minimum pause between each notification can fix it.

Originally posted by @Juanjacinto123 in #10 (comment)

[Possible Feature] Periodic Price Alert

Could possibly set customizable parameters e.g. send price updates every X seconds.

Recommended to separate from the pump alerts telegram bot to prevent clash when sending multiple messages.

Simple implementation but not on priority unless feature is requested for.

Volume Mappings Docker

can I somehow assign the path myself for my docker setup

volumes:

  • /path/to/appdata/config.yml:/config.yml

[Bug] Wrong price % change

image

Clearly it can't be 97%. Need to take a closer look at implementation. Suspect >1 price pushed in per interval resulting in wrong calculation?

Error in first execution

Hello!
I get this error on first execution:
python pumpAlerts.py
File "pumpAlerts.py", line 26
color_format = f"{bold_seq} " "%(log_color)s " f"{log_format}"
^
SyntaxError: invalid syntax

[Discussion] [Improvement] Reducing spam without missing out on critical information

Quite a bit has been done previously in reducing unnecessary spam in #6 and #20 which have been adequately addressed as the spam was mostly information we see as unnecessary.

However, in this new issue regarding spam, it is actually clear that we are getting what we want which is a clear signal for a pump with '1s' interval getting triggered multiple times as shown below.

image

image

If anyone managed to managed to open a margin 3x short position ~55, close to 50-60% profits would have been achieved selling at the current dumped prices. So it is clear that the alert in this scenario is valid.

However, while the objective of alerting us to a pump has been achieved, close to 20 alert notifications were sent within a 5 minute period which does seem a little unnecessary.

Possible Solutions

  1. Integrate back MIN_ALERT_INTERVAL (Takes the longer period between actual interval vs MIN_ALERT_INTERVAL)
    -- Cons: Might potentially miss out on critical pump information

  2. Prevent normal pump price volatility from triggering alerts
    -- Can be achieved by comparison of price from previous trigger. And require % deviation form previous trigger to be considered valid?

I'm open to suggestions as well on possible alternatives so feel free to comment below!

[Minor Bug] Handling of Delistings

gitissue1

Method: CheckAddNewAssetListings

While delistings doesn't happen frequently on Binance, when it does happen the program should be able to deal with the situation properly. It currently just ignores the issue when a delisting occurs.

Possible solution: Tweak logic used for detection of pairs added and follow message sending format.

[Bug] Memory Error

image

Likely due to the way data points are stored. Happened after running for ~24 hours consecutively.

Possible solutions

  1. Pop element from array from every insertion past max interval (Should work but would be inefficient)
  2. Cronjob for restarting after every 6 hours

[Bug] Aws Ec2 Killed

image

Issue only faced in latest version. Not sure what is causing it. Not sure if this error is specific to ec2 as well or occurs for other machines running for extended duration.

Duration: ~30+ Hours

Will see if i can replicate this error again.

Request Futures Api

Could an option be added to choose between the Spot Market and the Binance Futures Market? I guess it would be a matter of alternating between the two Api. Thanks

[FEATURE] Add USDT Volume to the alert (Optional)

Thank you very much for this excellent work.

Would it be possible to add to the alert the USDT Volume traded at the moment? It would be very good, since it is an important parameter to decide whether to enter or not to trade the market. It could be optional.

Regards

[Bug] Spam alerts (Case 2)

image

Previously implemented MIN_ALERT_INTERVAL was not sufficient. Especially once we introduce multiple longer intervals. There's a need for a more dynamic solution to the problem

cant run the bot

Traceback (most recent call last):
File "/Users/yasserben/Desktop/b3/pumpAlerts.py", line 92, in
main()
File "/Users/yasserben/Desktop/b3/pumpAlerts.py", line 47, in main
token=config["55348167:AAGtp0fcHhmWAy8cam7yu2yXQUdUk-8u_ww"],
KeyError: '55383467:AAGtp0fcHhmWAy8cam7yu2yXQUdUk-8u_ww'

[Bug] Delay in "Top Dump & Pumps" notifications

After running the program (with "Nearest Hour" active) for a few hours, the notifications do not arrive exactly at the selected time (at the beginning they arrive exactly at each selected time interval).

For example for 15 minutes:

At the beginning: (they arrive exactly)

1st notification: 01:00 pm
2nd notification: 01:15 pm
3rd notification: 01:30 pm
4th notification: 01:45 pm

After some hours: (the order is lost)

1st notification: 01:07 pm
2nd notification: 01:25 pm
3rd notification: 01:43 pm
4th notification: 01:51 pm

Perhaps the automatic restart of the program every certain time, for the case of the example, if it is restarted every hour, the problem is solved (tested by me, since I do it manually). And it could be added as an option.

Thanks @brianleect

Problem with timeframes larger than 5m

Hi, I want to receive alerts for longer periods such as 5m, 15m, 30m, 1h, etc. And I would like percentage changes of 5%, 10%, etc. So my configuration file has been as follows:

intervals = ['5m', '15m', '30m', '1h']
outlier_param = {'5m': 0.05, '5m': 0.1, '15m': 0.05, '15m': 0.1, '30m': 0.05, '30m': 0.1,}

But after obtaining the prices:

"Added symbol: ADAUSDT
Added symbol: SNXUSDT
Added symbol: DOGEUSDT
Added symbol: BZRXUSDT
Added symbol: SKLUSDT"

The Script gets stuck in the following bubcle and does not continue:

"Time taken to extract and append: 0.6562504768371582
Extracting after 1s
Time taken to extract and append: 0.7968761920928955
Extracting after 1s
Time taken to extract and append: 0.7186744213104248
Extracting after 1s
Time taken to extract and append: 0.8281247615814209
Extracting after 1s
Time taken to extract and append: 0.9391098022460938
Extracting after 1s
Time taken to extract and append: 0.9218747615814209
Extracting after 1s
Time taken to extract and append: 0.9999191761016846
Extracting after 1s
Time taken to extract and append: 0.5155398845672607"

And finally I have to stop it.

It should be noted that with the following configuration I can receive alerts but they are repeated a lot and generate Spam:

"intervals = ['1s', '5s', '15s', '30s', '1m']
outlier_param = {'1s': 0.01, '5s': 0.03, '15s': 0.05, '30s': 0.06, '1m': 0.07, '5m': 0.10}"

I'm not really sure if I'm setting something wrong or there could be an error with the large timeframes.

[Possible Feature] Exclusion of a specific cryptocurrency from the watch list

A pleasure to greet you again @brianleect,

I would like to suggest that specific pairs could be excluded from the watch list.

For example, if out of a total of 140 pairs I want to exclude 5 pairs, it is more practical to exclude only those 5 pairs, than to have to manually add 135 pairs to the watch list.

It would be something like:

Exclusion mode, if enabled, pairs in this list will not be monitored.

For example, 'ADAUSDT', 'ETHUSDT'.

Exclusion list:

- ADAUSDT

- ETHUSDT

Thanks in advance as always.

[QOL] Top Dump & Pumps

  1. Option to start alerts based on rounding to the nearest half hour / hour mark.
  2. Change structure to rely on time.time() rather than number of values in array

[FEATURE] Dump Detection

Price change detection could also be added, but in this case when prices go down. That is to say, exactly the same parameters but alerting when it is down.

In this way the alert could indicate Dump or Pump.

It would be a great feature, since both strong rises and strong falls in price, you can take advantage of them.

And the use of this feature would be optional.

[BUG] Restart after reload of the pairs list

The app is restarting after message -1565 new pairs found, adding to monitored list - Restarting because I use a docker deployment, but it seems the process dies and docker restarts the process.

The following messages are printed in the logs

binance-pump-alerts_1 | Extract time: 0.26943373680114746 / Time ran: 0:02:02.101398
binance-pump-alerts_1 | checkNewListings(data)
binance-pump-alerts_1 | File "/binance-pump-alerts/price_tracker.py", line 70, in checkNewListings
binance-pump-alerts_1 | symbols_to_add = [asset['symbol'] for asset in data_t if asset['symbol'] not in init_symbols ]
binance-pump-alerts_1 | File "/binance-pump-alerts/price_tracker.py", line 70, in
binance-pump-alerts_1 | symbols_to_add = [asset['symbol'] for asset in data_t if asset['symbol'] not in init_symbols ]
binance-pump-alerts_1 | TypeError: string indices must be integers

binance-pump-alerts_1 | Extracting after 1 s
binance-pump-alerts_1 | Extract time: 0.27173900604248047 / Time ran: 0:02:55.764196
binance-pump-alerts_1 | Extracting after 1 s
binance-pump-alerts_1 | symbols_to_add = [asset['symbol'] for asset in data_t if asset['symbol'] not in init_symbols ]
binance-pump-alerts_1 | TypeError: string indices must be integers
binance-pump-alerts_1 | Traceback (most recent call last):
binance-pump-alerts_1 | File "/binance-pump-alerts/price_tracker.py", line 22, in
binance-pump-alerts_1 | init_data = data[:] # Used for checking for new listings
binance-pump-alerts_1 | TypeError: unhashable type: 'slice'
binance-pump-alerts_1 | Hard Alert Interval is being used
binance-pump-alerts_1 | Extract interval: 1
binance-pump-alerts_1 | Hard Alert Interval is being used
binance-pump-alerts_1 | Extract interval: 1

binance-pump-alerts_1 | Hard Alert Interval is being used
binance-pump-alerts_1 | Extract interval: 1
binance-pump-alerts_1 | Traceback (most recent call last):
binance-pump-alerts_1 | File "/binance-pump-alerts/price_tracker.py", line 22, in
binance-pump-alerts_1 | init_data = data[:] # Used for checking for new listings
binance-pump-alerts_1 | TypeError: unhashable type: 'slice'
binance-pump-alerts_1 | Hard Alert Interval is being used
binance-pump-alerts_1 | Extract interval: 1
binance-pump-alerts_1 | Added symbol: BTCUSDT
binance-pump-alerts_1 | Added symbol: ETHUSDT

[Bug] P&D Alerts

image

Outlier params
image

Shouldn't be seeing a trigger of -0.5% when the minimum is 2%.

[Minor Bug] Newly listed coins

Due to how the program is currently structured, it only initializes the coin array once. Assuming we run the program for an extended period of time it is likely to not consider new pairs that are introduced.

Potential Solution

  1. On each run we check length of price data. (If it changes from the prior length) we either
    1a. Re-initialize the entire array (simple but inefficient sol resulting in loss of price data as well)
    1b. Identify new pairs and initialize them into the current array (Slightly more effort but should be simple still)

[Feat] Smart trigger % grouping / Filtering

Currently we are using a one size fit all triggering mechanism for the pairs involved. However, setting it too low results in a ton of noise while having it too high results in missing out movements in larger pair pumps E.g. ETHUSDT / BTCUSDT

Iirc old suggestion was to simply run 2 instances with specified pairs and trigger values set, however there is a possibility to have this built in automatically.


image

Flow

  1. On program start, hit https://api.binance.com/api/v3/ticker/24hr
  2. Calculate volume in usd based on main symbol and usdt price
  3. Categorize into group based on usd volume

Example groupings

10k volume : Multiplier 3x
100k volume: Multiplier of 2x
1 mil volume: Multiplier of 0.5x

Base settings could be 5s:2% , 15s:5%? Would need to look into adjusting accordingly.

Note that this is mostly focused on USDT pairs however, in theory we could simply

Alternatively, we could simply set an ignore filter for any pairs below a set amount of USD 24h volume.

Measures above should be able to reduce noise and capture pumps across. Not sure if the slight increase in complexity is worthwhile though.

Likely won't have the time to add this in short term but placing it here for future reference.

[Bug] Alert triggering / Spam filtering

image

image

Not sure if it's purely a coincidence due to differing "heartbeat" (Different second for program start).

Even if it differs slightly due to different start time, most updated version seems to consistently be seeing lesser notifications.

I suspect it might be due to how spam is being filtered for the latest version which filters out more alerts?

Will need more testing to confirm.

[Bug] 0% Top Pump Dump Alerts

There might also be a possible bug where we attempt to send an alert after a recent reset has been triggered. I have yet to test this case. In theory it would end up sending a message with all change being 0% due to the lack of data points.

Originally posted by @brianleect in #16 (comment)

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.