Code Monkey home page Code Monkey logo

ledger-nano-s's Introduction

Ledger Nano S for developers

The Ledger Nano S is a personal lightweight mobile device architectured around a ST31 secure element with USB connectivity.

It is based on BOLOS (Blockchain Open Ledger Operating System), where apps can run securely in full isolation and leverage the main secrets (BIP39 seed) through allocated derivations. The functional architecture and project goals are described in the following Medium post : https://medium.com/@Ledger/secure-hardware-and-open-source-ecd26579d839

The Nano S can be purchased from Ledger shop and resellers.

This repository provides pointers to the development environment and applications available for developers

Getting started

Developers need to clone the following repositories and follow the building instructions

Production applications

Applications under development

Sample applications

You can review sample applications on https://github.com/LedgerHQ/blue-sample-apps

Documentation

To be added

Slack

To discuss your projects and get support, please join our slack at http://slack.ledger.co

ledger-nano-s's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ledger-nano-s's Issues

Message Signing for SEGWIT Broken

When attempting to sign a message for a BTC Segwit address, the address is changed to a BTC Legacy address during the signing process.

To reproduce:

  1. Choose Segwit address to sign: 3LzocuLiqXo9HKGyBBpXddhRBWqshBnMay
  2. Add message: This is an example of a signed message.
  3. Confirm hash on device.
  4. Notice signed message:
    -----BEGIN BITCOIN SIGNED MESSAGE-----
    This is an example of a signed message.
    -----BEGIN SIGNATURE-----
    1PEanNSQUjfisevAdBU6YztuuUEGxLyHCA
    INezEhuL57gx13q+kX1saVQcWab+XAVo58BS1/GakRFTVjJP5ieWgtjGmARrNFpPdCaYH+6AZID47fvbT//adnU=
    -----END BITCOIN SIGNED MESSAGE-----

Using any available VERIFY tool (for some reason Ledger doesn't include one???) One can see that the signature and message validate for the address starting with "1", the legacy address, and not the Segwit "3" address.

Self-destruction code

Feature request:
Optional second pin code, which immediately wipe device without additional questions.
I saw some news there are bandits torture bitcoin`s owners for passwords for wallets. I think, that in this situation 3 wrong attempts is not good idea.

random start for pin entry

As each digit starts at 5, everybody within hearing range has 2^4 guesses to get your pin. That includes everybody with access to any microphone in your vicinity. All he has to do is count the key presses. On my devices the two buttons sound differently, and a simultaneous press is even easier to distinguish.
If it started out with a random number rather than 5555, that would increase the security.
Of course it should be an option, as some people might not like it. Especially visually the impaired.

Encounter an error while trying to make

Hello,

I'm using a Mac OS and followed an instruction without any issue until encountering the following error:
$ env BAKING_APP= make
TARGET_NAME=TARGET_NANOS TARGET_ID=0x31100003
BOLOS_ENV=/users/junhur/ledger-app-tezos/bolos_env
find: glyphs/: No such file or directory
Prepare directories
make: *** No rule to make target apdu.c', needed by obj/apdu.o'. Stop.

Not sure if this is related to this, but I also saw the following error while running this script ./add_udev_rules.sh

bash: line 2: /etc/udev/rules.d/20-hw1.rules: No such file or directory
bash: line 3: /etc/udev/rules.d/20-hw1.rules: No such file or directory
bash: line 4: /etc/udev/rules.d/20-hw1.rules: No such file or directory
bash: line 5: /etc/udev/rules.d/20-hw1.rules: No such file or directory
bash: line 6: /etc/udev/rules.d/20-hw1.rules: No such file or directory
bash: line 7: /etc/udev/rules.d/20-hw1.rules: No such file or directory
bash: line 8: /etc/udev/rules.d/20-hw1.rules: No such file or directory
bash: line 9: /etc/udev/rules.d/20-hw1.rules: No such file or directory
bash: line 10: udevadm: command not found
bash: line 11: udevadm: command not found

Any help would be appreciated!

Ledger Nano S .stl file(s)?

I'm interested in getting ahold of the 3d / stl file(s) for the ledger nano S plastic case and swivel cover. Are these available? If not, are the exact dimensions of the plastic case available?

Message Signing for DOGECOIN Broken

Signs the message, but will not verify with bitcoinjs, or any other libraries. Have tried modifying the magic message and prefix to use both Dogecoin network and Bitcoin network, with same failed results. Please publish how you've gone about signing DOGE.

Message to test with:

Public Address: DPpVqDPfStJq6R4gU82qyCFWpPGDdctjg1
Message: This is an example of a signed message.
Signature: IKCH10PisOuRJmgLvvzgkOVN3pUBTZ6j9z8jNmKynSWDIvNDNedCWsOJrLv+RRkpTaTIMXf5EGAyLH+ggQ50law=

Can detect of whether signed in with Attach to PIN wallet or main wallet

An easy method to distinguish whether user is signed in with "Attach to PIN" wallet assuming the secondary PIN is given to the attacker.

Steps:

User

  1. Set up Attach to PIN wallet

Attacker

  1. Sign in to with extorted "Attach to PIN" PIN
  2. Observe bitcoin receive address
  3. Set up any Attach to PIN wallet while still signed in
  4. Observe bitcoin receive address
  5. The receive address has changed as you are automatically signed in with the new backup wallet. If you signed in with main wallet, the receive address has not changed.

Attacker now can extort main wallet address with knowledge of an existing secondary wallet.

Firmware update is not comprehensible and look very buggy.

Sorry for this mess, I rather post a half assed bug report and format it later than risk not following through onto something that I think is urgent.

I've seen too many error messages , unexpected and incomprehensible behavior trying to do the firmware update.


I've tried updating a Nano-S, I saw something on the screen asking to approve the update. I don't remember exactly but when I tried the update a 2nd time the ledger got forever stuck at "UPDATE" on the screen wherever I would plug it. (Looked Bricked)

image

I later found out that I had to click firmware on the other tab...

I tried updating another Ledger using another computer and different problem.
ledger-manager-logs-1477033204318.txt

Every time I click "firmware" it update the firmware - (it seems like it did - no progress - no completion message)

Your button should say UPDATE FIRMWARE and UPDATE OSU then pop-up the disclaimer/warning about deletion of the seed requiring to agree.
image
Compared to Trezor Ledger notice is very easy to miss :
image

Is it normal that the wallet say there is no update ?
image

I click :
image

I get :
image

Ledger does not verify that the OSU is already updated or not. It's not clear whether it ever worked or not.

Ledger Manager addon taking 100% CPU
image

On two browser at once without a ledger connected:
image

CPU when killing one addon then killing the 2nd :
image

Firmware update streamlined process, (Boot Loader ?)

We are resellers of Leger's products and prefer to sell the Nano S with updated firmware.

What are the steps to update without verifying the seed ?

I used to hold both button and get to a recovery on the screen and update would go smoothly but now more than half of the time I land on "Bootloader" and can't move forward from there.

Wrong ETH address displayed

Hey,

When I click on "Display address on Ledger" in MyEtherWallet, the last letter of my address is not displayed on the device. The rest of the address is correct

Missing zcash transaction

I made two transactions to my Zcash wallet on my Ledger Nano S running firmware 1.3.1 and one of the transactions did not show up in the wallet. The first transaction was for 1 ZEC. The second transaction for 6.5 ZEC.

  1. https://explorer.zcha.in/transactions/1d2e5a043237a93fdcb854de2b355fe427576fcb85b0f160356a3b7387a69e55
  2. https://explorer.zcha.in/transactions/b1b6260b84c1ed4f9d6af63664e5f285c98da6fc85ad3707260ed5b196d70f3f

When I saw the 6.5 ZEC from the second transaction did not show up, I transferred the 1 ZEC balance out to another wallet (see transaction here). Below is a screencap of the wallet at this stage, you can see the original 1 ZEC deposit, then the -1 ZEC transferred out. But the 6.5 ZEC is not there.

zcash_missing_20171226_01

After this I generated the series of Zcash public addresses from the mnemonic seed to make sure that the second transaction of 6.5 ZEC was sent to a valid address, in case it had been incorrectly cut and pasted. The address was in the list, so there was clearly an issue with how the Ledger wallet was processing the transactions. I tried removing and reinstalling the Zcash wallet but it did not resolve the issue. I then tried the Settings > Tools > Reset application data option, and reconnected the Ledger. This resolved the issue and it now shows the missing 6.5 ZEC:

zcash_missing_20171226_02

Support for Ledger Nano in Samourai Wallet

Hello Guys,

just to let you know that Samourai Wallet is becoming the best software wallet out there (with segwit...etc) and they are already supporting relaying transaction signature to Trezor Hardware Wallet.

I opened a discussion in their Github https://github.com/Samourai-Wallet/samourai-wallet-android/issues/96 to ask for Ledger nano support, and you I'm sure you'd like to weight in the discussion to get Ledger support in Samourai Wallet (or propose a Pull Request).

I believe this is a highly wanted feature among your users, to benefit from Ledger offline signature + cutting edge android bitcoin wallet.

Thanks for you feedback!

to Ledger users, please 👍 this issue if you'd like to get support in Samourai Wallet

Exception : Invalid status 6a83

Trying to install Viacoin app with Ledger Manager after it failed with Ledger Live.

The error with Ledger Live was that Bitcoin and Etherum need to be installed. Both apps are installed already.

Ledger Manager also tells me that Bitcoin needs to be installed first.

Here is the log from Ledger Manager:

2018-10-12T07:32:23.334Z D/Global: "query": "error",
2018-10-12T07:32:23.334Z D/Global: "data": "Exception : Invalid status 6a83"
2018-10-12T07:32:23.334Z D/Global: }
2018-10-12T07:32:23.336Z D/Global: Query: error
2018-10-12T07:32:23.338Z E/Global: java.lang.Exception: Exception : Invalid status 6a83
2018-10-12T07:32:23.339Z E/Global: at $c_jl_Exception.$c_jl_Throwable.fillInStackTrace__jl_Throwable(https://raw.githubusercontent.com/scala-js/scala-js/v0.6.9/library/src/main/scala/scala/scalajs/runtime/StackTrace.scala:33:4)
2018-10-12T07:32:23.662Z E/Global: at $c_jl_Exception.$c_jl_Throwable.init___T__jl_Throwable(https://raw.githubusercontent.com/scala-js/scala-js/v0.6.9/javalanglib/src/main/scala/java/lang/Throwables.scala:12:18)
2018-10-12T07:32:23.662Z E/Global: at java.lang.Exception.(https://raw.githubusercontent.com/scala-js/scala-js/v0.6.9/javalanglib/src/main/scala/java/lang/Throwables.scala:269:6)
2018-10-12T07:32:23.664Z E/Global: at {anonymous}()(../../src/main/scala/co/ledger/manager/web/controllers/manager/old/OldApplyScriptController.scala:243:15)
2018-10-12T07:32:23.664Z E/Global: at scala.scalajs.runtime.AnonFunction1.apply(https://raw.githubusercontent.com/scala-js/scala-js/v0.6.9/library/src/main/scala/scala/scalajs/runtime/AnonFunctions.scala:15:37)
2018-10-12T07:32:23.664Z E/Global: at co.ledger.manager.web.core.net.JsWebSocketFactory$JsWebSocket$$anonfun$1.apply(../../src/main/scala/co/ledger/manager/web/core/net/JsWebSocketFactory.scala:69:28)
2018-10-12T07:32:23.665Z E/Global: at co.ledger.manager.web.core.net.JsWebSocketFactory$JsWebSocket$$anonfun$1.apply(../../src/main/scala/co/ledger/manager/web/core/net/JsWebSocketFactory.scala:67:46)
2018-10-12T07:32:23.665Z E/Global: at WebSocket.(../../src/main/scala/co/ledger/manager/web/core/net/JsWebSocketFactory.scala:67:46)

Backup verification is too easy to bypass.

Take note of the first word and when asked for word #7 scroll words until you find first word then press next 6 times to get to the 7th word.

I also hate that this stop two people from doing a trusted setup where each person backup half of the words. All words are being given when it's time to verify any word.

the correct method for submitting subsequent data blocks with P1=0x80

This is a request for documentation, which might be considered an 'issue' at a stretch.

I’m currently attempting to implement a solution for deploying ethereum smart contracts using the ledger. This involves signing a data payload which is a thousand bytes long or more.

I don’t think that any of the current ledger implementations (geth, parity, mycrypto) have done this successfully.

I know that part of the magic here is that the P1 opcode must be changed from 0x00 to 0x80 on subsequent apdu calls,
and also that the data payload can be a maximum of 255 bytes.

Something is missing however, and after submitting all of the apdu messages, on the final call (when the payload is less than 255 bytes) the ledger always goes silent.

I have surmised that the solution may have something to do with the two bytes preceding the CLA. I wonder if these bytes are supposed to be set to the total remaining payload in bytes, that will eventually be send over subsequent apdu calls. I also considered that the value might need to be set as the total remaining payload plus the size of the CLA + INS + P1 + P2.

So far I have made progress by looking at the source code of the other projects, but I have come to dead end since I do not believe any of them have solved this problem either.

Would you be able to describe the correct protocol for a session of multiple apdu calls using the 0x80 P1 opcode?

please add feature to dump private key to ease coin splitting

I see the point of not revealing the private keys. Keeping them securely stored inside the ledger. The main point of a ledger.
However, in some well defined situations it would be good if private keys could be dumped on user request after proper authentication.

  • user must confirm using the ledger hardware button a warning message "are you sure you want to dump the private key for COIN address COIN-ADDRESS?"
  • perhaps the user should confirm twice
  • perhaps only allow to dump private keys of addresses that were previously swiped (moved all balance to another address)
    Why?
    Users want to split obscure coins such as the many bitcoin forks. How?
    Since there is no dump private key feature, users will enter their ledger seed into a desktop computer or notebook. Even if disconnected from internet and booted from live dvd. This is still not great to enter the whole seed. Also moving all coins to a new ledger seed beforehand is very inconvenient (if one has already backups in multiple physically separate places).
    A better solution would be if the private keys for addresses could be dumped on user request.

How are the change addresses verified ?

This question wasn't answered in my previous now closed issue.

#5

What if the change address (not displayed) does not belong to the Ledger wallet ?
Like what just happened...

KMD ledger does not accrue or spend interest

There are two parts to KMD 5% APR. Accruing and spending it. Accruing interest happens on the blockchain and even a paperwallet accrues interest by simply setting the nLockTime field in the transaction to a recent timestamp. This timestamp is needed to know how much time has elapsed when calculating how much interest can be spent. To have a bit of leeway, a wallet can just use the current unixtime - 777 seconds as the value of nLockTime. Basically we just want a locktime that will be accepted into the next block.

What this means is that funds sent to the ledger with nLockTime set, are already accruing interest. Any outgoing transaction should set the nLockTime so there is interest to be collected.

The collection side is a bit more complicated. It is done on a per utxo basis and for each utxo in a transaction's inputs the interest accrued for that utxo increases the effecting sum of inputs. this means it is not only possible but usual for a transaction spending interest to have the sum of vouts being more than the sum of the vins (not counting the interest). So wherever a transaction is being constructed in the wallet and you are calculating the equivalent of inputsum, also need to calculate the sum of interests and then pretend the total value of the inputs was actually (inputsum + interestsum)

The above logic is very wallet specific and it should be applied to all eligible utxo. To be eligible a utxo must be for 10 or more KMD and have nLockTime set and also be more than an hour old. It doesnt take long to do the calculation, so it is ok to just call the komodo_interest() function for every utxo.

The following komodo_interest() function will calculate the amount of accrued interest at the specified time for a utxo. So sum the return values from this function to calculate interestsum.

uint64_t komodo_interest(uint64_t nValue,uint32_t nLockTime,uint32_t tiptime)
{
int32_t minutes; uint64_t interest = 0;
if ( (minutes= (tiptime - nLockTime) / 60) >= 60 )
{
if ( minutes > 365 * 24 * 60 )
minutes = 365 * 24 * 60;
minutes -= 59;
interest = ((nValue / 10512000) * minutes);
}
return(interest);
}

You would want to call it from an if statement like:

if (  nLockTime >= LOCKTIME_THRESHOLD && tiptime != 0 && nLockTime < tiptime && nValue >= 10*COIN )
    interestsum += komodo_interestnew(nValue,nLockTime,tiptime);

nLockTime is the nLockTime of the utxo transaction
where LOCKTIME_THRESHOLD is 500000 (so as to not use the blockheight usage of nLockTime!)
nValue is the value of the utxo.
tiptime being the time(NULL) - 777, basically a recent unix timestamp
COIN is 100000000

I hope I explained this clearly enough, please ask if there are any questions.

Randomize first characters of PIN

Size of numbers on the screen : 0.2 cm,
Knuckle movement when pressing the buttons : 1 cm or more

In the meanwhile I suggest holding the button to change the numbers in public places.

After Trying Ledger Nano Desktop Can No Longer Install Litecoin App

After having the Chrome Ledger Manager suggest Ledger Live Desktop (Linux - Ubuntu 18.04), I tried to use that app. The app did not work for me (No on-device confirmation of the manager interface).

After reverting to Chrome Ledger Manger to try to perform some transactions, I find that after removing the Litecoin app to make room for some new apps, I cannot now reinstall the Litecoin app, "Unable to install application - must first install the Bitcoin app". The Bitcoin app is, however already installed.

I am, therefore, in need of some help. It seems, though I can not verify, that my Ledger Nano S' interaction with the Ledger Live Desktop app, has caused some error in my device. If this is the case, was it wise for the Chrome Ledger Manager to so forwardly suggest the use of Ledger Live Desktop?

Bad first experience. Setup > Firmware update > Restore required.

You have to do a full setup the wallet to be able to update the firmware
Then you need to install a hard to find Ledger manager.
Then I guess you have to figure out that you need to update OSU before firmware.
(I have done firmware update on 4 Nanos and I still don't understand fully what I'm supposed to be doing.)

Then once it's done you're expected to re-enter the 24 words letter by letter with the two buttons ?

Is there really no way to keep the user data in the Nano ? Will it always be like that for every updates?

Xlm deposit

please help me to return the funds in the amount of 700.163 xlm yesterday sent to another wallet and did not come
Thid: 23cb6bcaa3e1977ef6149858ae3557cf29a0c7635887828540e8e0e36679897f

Different colors

I would like to buy second nano s for testing / development. There is no option to buy different color for nano s to avoid confusion and accidental use of primary device instead of test one. I can put sticker or something on device, but having it in different color is better solution.

Feature Request: add support for EOS keys

Would it be possible to support EOS keys, i.e. the keys for the EOS chain that are needed after the EOS token swap (so not the ERC20 tokens)?

I couldn't find anything about it in the roadmap.

Thanks!

MONERO SUPPORT FOR LEDGER BLUE

It would be a real benefit for all ledger blue purchasers that paid significantly more money than nano s users to also be able to have support for the Monero app. Why is it that the developers have only chosen to develop apps for nano s, will ledger blue users no longer get support from ledger ? Will ledger only develop apps for nano s from now on ? I thought I purchased a higher quality product with equal support !

Same ledger for MEW and EtherDelta or Desktop Wallet possible

Can I use the same Ledger Nano S for MEW and EtherDelta or Desktop Wallet? That means I have several accounts on the same device.
Or do I need a seperate ledger nano for every account e.g. 1 for MEW, 1 for ED and 1 for Exodus

Sorry oouldnt find anything in the knowledge db
Thanks

Fido U2F doesn't seem to work with gmail/GitHub since 1.2 update

I updated to new firmware 1.2 and downloaded the Fido U2F app from the Ledger Manager (Chrome app).

When I try to login with the Fido U2F in gmail using Chrome (with OS X):

  1. the device displays the "Confirm registration" screen
  2. The device displays "Service 4141...4141" instead of "Service google.com"
  3. if I press the left button (cancel), it doesn't cancel and returns the the "Confirm registration" screen
  4. if I press the right button (OK), gmail answers "the key you are using is not registered for this account"

Note : I have a duress PIN setup on my device but I use my old PIN when powering the device

Blockchain Explorer Menu Error

The Bitcoin Legacy, UASF, & Segwit2x wallets contain an error in their Blockchain Explorer Menus. Setting the "Default Explorer" to "Blockr.io" leads to Coinbase.com.

Ledger Wallet Bitcoin Chrome App v1.9.6

Add a Setting to change 4 Personal Identification Number (PIN) of Ledger Nano S

As requested via email:

Please add a Setting in the device to change the PIN. I think that — from a security point of view — changing PIN regularly is a good security practice (even banks prompt you to change PIN of debit cards), even more important in a device where the PIN can be seen in the screen, and wiping the device every time to change it is inconvenient and dangerous.

So my idea is: Change PIN and verify with 2 random words from seed.

Ledger Nano S Restore from Seed Phrase UX issue

Not sure if this is the right repo to log this issue, but here is my problem:

I was restoring from a seed phrase. I kept choosing the wrong word during the "select word" portion of one of the word input portions. So at this point, I am in the dialog to select the letters to spell out the next word, and I have no option to re-select the previous word (which is was selected incorrectly). My only choice is to reset the device and re-try the seed-phrase entry process.

My suggestion to mitigate this is have an option to change the previous word when no letters has been selected in the next word selection process (for all words past word 1)

{"errorCode":1,"errorMessage":"device status code: -200"}

I keep getting this error message when trying to access my XLM on the Stellar wallet:
{"errorCode":1,"errorMessage":"device status code: -200"}

On top of this I can't install any apps for other coins. First time accessing the ledger in a few months and this is what is happening, pretty fucking unnerving for a device that is supposed to be offline and secure.

Browser support is on. Using a mac.

FIDO U2F not working

I just tried to add the ledger nano S as a security token to Github and github says 'Signature Attestation Error' or something to those words.

I also tried it with other U2F devices like Trezor and it worked no problem.

Future U2F counter-related lockouts and possible defenses

Currently, it appears that the Ledger Nano S uses a secret for U2F that is derived from the same seed words that are also used for deriving bitcoin and other virtual currency keys. So if two of these devices, call them A and B, are using the same seed words, they will look like the same U2F device. We can consider device B in its U2F role as an authorized clone of device A.

But each of A and B have internal counters, call them Ca and Cb, which are incremented on each use for U2F authentication. And if A and B are used at different times, then Ca and Cb will not be in sync.

Someday some remote website will suddenly implement a security policy of checking the counter, will notice that Cb is smaller than a previous Ca, and will lock the user out on the grounds that device B is an unauthorized clone of device A.

My tests suggest that Google doesn't check the counter.

However security policies can get revised. The user then suddenly gets locked out and has to go through a painful process of re-authenticating himself. Actual examples are omitted here, but we know they are legion and are easily found with a web search for: help locked out of account.

I can think of two possible solutions that might be considered.

  1. The U2F secret may be randomly generated independent of the virtual currency seed words. Now two devices will never be clones in their U2F roles.
  2. The U2F counter can increment with time, the time-of-day being obtained from the web browser. Unauthorized clones will no longer be detected.

A good argument can be made that 1 is the right choice. Two people should be able to access the same bitcoin addresses without having to share website logins.

It would be nice to have the choice be available in the Chrome app that manages the device.

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.