Git Product home page Git Product logo

ledger-cosmos's Introduction

Ledger Cosmos app

License GithubActions


zondax_light zondax_dark

Please visit our website at zondax.ch

You can also visit Zondax Hub to test any of the versions of the app


This project contains the Cosmos app for Ledger Nano S, Nano S+, X and Stax.

  • Ledger Nano S/S+/X/Stax Cosmos app
  • Specs / Documentation
  • C++ unit tests
  • Zemu tests

ATTENTION

Please:

  • Do not use in production
  • Do not use a Ledger device with funds for development purposes.
  • Have a separate and marked device that is used ONLY for development and testing

Tip:

  • In releases, you will find a precompiled test app. If you are just curious, you can run zxtool.sh and avoid building.

Download and install a prerelease

Once the app is approved by Ledger, it will be available in their app store (Ledger Live). You can get builds generated by CircleCI from the release tab. THESE ARE UNVETTED DEVELOPMENT RELEASES

Download a release from here (https://github.com/Zondax/ledger-cosmos/releases). You only need zxtool.sh

If the file is not executable, run

chmod +x ./zxtool.sh

then run:

./installer_s.sh load

Development

Preconditions

  • Be sure you checkout submodules too:

    git submodule update --init --recursive
    
  • Install Docker CE

  • We only officially support Ubuntu. Install the following packages:

    sudo apt update && apt-get -y install build-essential git wget cmake \
    libssl-dev libgmp-dev autoconf libtool
    
  • Install node > v13.0. We typically recommend using n

  • You will need python 3 and then run

    • make deps
  • This project requires Ledger firmware 2.0

    • The current repository keeps track of Ledger's SDK but it is possible to override it by changing the git submodule.

Warning: Some IDEs may not use the same python interpreter or virtual enviroment as the one you used when running pip. If you see conan is not found, check that you installed the package in the same interpreter as the one that launches cmake.

How to build ?

We like clion or vscode but let's have some reproducible command line steps

  • Building the app itself

    If you installed the what is described above, just run:

    make

Running tests

  • Running rust tests (x64)

    If you installed the what is described above, just run:

    make rust_test
  • Running C/C++ tests (x64)

    If you installed the what is described above, just run:

    make cpp_test
  • Running device emulation+integration tests!!

     Use Zemu! Explained below!

How to test with Zemu?

What is Zemu?? Great you asked!! As part of this project, we are making public a beta version of our internal testing+emulation framework for Ledger apps.

Npm Package here: https://www.npmjs.com/package/@zondax/zemu

Repo here: https://github.com/Zondax/zemu

Let's go! First install everything:

At this moment, if you change the app you will need to run make before running the test again.

make zemu_install

Then you can run JS tests:

make zemu_test

To run a single specific test:

At the moment, the recommendation is to run from the IDE. Remember to run make if you change the app.

Using a real device

How to prepare your DEVELOPMENT! device:

You can use an emulated device for development. This is only required if you are using a physical device

Please do not use a Ledger device with funds for development purposes.

Have a separate and marked device that is used ONLY for development and testing

There are a few additional steps that increase reproducibility and simplify development:

1 - Ensure your device works in your OS

2 - Set a test mnemonic

Many of our integration tests expect the device to be configured with a known test mnemonic.

  • Plug your device while pressing the right button

  • Your device will show "Recovery" in the screen

  • Double click

  • Run make dev_init. This will take about 2 minutes. The device will be initialized to:

    PIN: 5555
    Mnemonic: equip will roof matter pink blind book anxiety banner elbow sun young
    

3 - Add a development certificate

  • Plug your device while pressing the right button

  • Your device will show "Recovery" in the screen

  • Click both buttons at the same time

  • Enter your pin if necessary

  • Run make dev_ca. The device will receive a development certificate to avoid constant manual confirmations.

Loading into your development device

The Makefile will build the firmware in a docker container and leave the binary in the correct directory.

  • Build

    make                # Builds the app
    
  • Upload to a device The following command will upload the application to the ledger. Warning: The application will be deleted before uploading.

    make load          # Builds and loads the app to the device
    

APDU Specifications

DISCLAIMER

Ledger NanoS does not support Cosmos Textual Mode due to memory restriction

ledger-cosmos's People

Contributors

ainhoa-a avatar brejski avatar chcmedeiros avatar codacy-badger avatar cwgoes avatar dependabot[bot] avatar fbeutin-ledger avatar ftheirs avatar gagbo avatar greg-szabo avatar grydz avatar hcleonis avatar jibeee avatar jleni avatar leongb avatar liamsi avatar lpascal-ledger avatar nddeluca avatar odeke-em avatar pscott avatar rnbguy avatar saltari avatar sgliner-ledger avatar tamtamhero avatar tdejoigny-ledger avatar thomas-rj avatar xchapron-ledger 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

Watchers

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

ledger-cosmos's Issues

CLI len(response) < 2 - USB Disconnect?

Often on CLI TX signing with ledger I get the following error:

Error: len(response) < 2

The ledger device may or may not display the TX information. (50/50 chance)

Is there a portion of this project we should look into to help improve?

Or is this related to needing to change the protocol used to establish a better connection with the USB device on ledger? (U2F vs HID which might take a significant amount of work?)

Ledger can't sign MsgMultiSend

Response from ledger:

message: 'Ledger device: UNKNOWN_ERROR (0x6984)',
statusCode: 27012,
statusText: 'UNKNOWN_ERROR

trying to sign:

{
    "account_number": "8",
    "chain_id": "testing",
    "fee": {
        "amount": [
            {
                "amount": "0",
                "denom": "uatom"
            }
        ],
        "gas": "200000"
    },
    "memo": "",
    "msgs": [
        {
            "type": "cosmos-sdk/MsgMultiSend",
            "value": {
                "inputs": [
                    {
                        "address": "cosmos1hr9x0sjvel6z3vt9qny8sdd5gnnlgk0p69d6cv",
                        "coins": [
                            {
                                "amount": "101000",
                                "denom": "uatom"
                            }
                        ]
                    }
                ],
                "outputs": [
                    {
                        "address": "cosmos13dr26wdygna3s8fdl5tlc45m2le2ydydgjk8ek",
                        "coins": [
                            {
                                "amount": "1000",
                                "denom": "uatom"
                            }
                        ]
                    },
                    {
                        "address": "cosmos1hr9x0sjvel6z3vt9qny8sdd5gnnlgk0p69d6cv",
                        "coins": [
                            {
                                "amount": "100000",
                                "denom": "uatom"
                            }
                        ]
                    }
                ]
            }
        }
    ],
    "sequence": "0"
}

I can sign

{
    "account_number": "8",
    "chain_id": "testing",
    "fee": {
        "amount": [
            {
                "amount": "0",
                "denom": "uatom"
            }
        ],
        "gas": "200000"
    },
    "memo": "",
    "msgs": [
        {
            "inputs": [
                {
                    "address": "cosmos1hr9x0sjvel6z3vt9qny8sdd5gnnlgk0p69d6cv",
                    "coins": [
                        {
                            "amount": "101000",
                            "denom": "uatom"
                        }
                    ]
                }
            ],
            "outputs": [
                {
                    "address": "cosmos13dr26wdygna3s8fdl5tlc45m2le2ydydgjk8ek",
                    "coins": [
                        {
                            "amount": "1000",
                            "denom": "uatom"
                        }
                    ]
                },
                {
                    "address": "cosmos1hr9x0sjvel6z3vt9qny8sdd5gnnlgk0p69d6cv",
                    "coins": [
                        {
                            "amount": "100000",
                            "denom": "uatom"
                        }
                    ]
                }
            ]
        }
    ],
    "sequence": "0"
}

but the signature fails validation when broadcasting.

I think it's related to

static const key_subst_t value_substitutions[] = {
{"cosmos-sdk/MsgSend", "Send"},
{"cosmos-sdk/MsgDelegate", "Delegate"},
{"cosmos-sdk/MsgUndelegate", "Undelegate"},
{"cosmos-sdk/MsgBeginRedelegate", "Redelegate"},
{"cosmos-sdk/MsgSubmitProposal", "Propose"},
{"cosmos-sdk/MsgDeposit", "Deposit"},
{"cosmos-sdk/MsgVote", "Vote"},
{"cosmos-sdk/MsgWithdrawDelegationReward", "Withdraw Reward"},
};

// FIXME: Are these obsolete?? multisend?
{"msgs/inputs/address", "Source Address"},
{"msgs/inputs/coins", "Source Coins"},
{"msgs/outputs/address", "Dest Address"},
{"msgs/outputs/coins", "Dest Coins"},

Cosmos app v2.16.1 not working with command line

After upgrade app Cosmos to new v2.16.1 the app do not "Show Address" in menu
as before in v1.5.3
I use commands line in Terminal of my Mac. I open Cosmos app
When I try to make transaction the following error shown:
Please see below error
confirm transaction before signing and broadcasting [y/N]: y
ERROR: please open Cosmos app on the Ledger device - error: [APDU_CODE_INS_NOT_SUPPORTED] Instruction code not supported or invalid

Ledger live problem

After creating an address on cosmos Ledger Live, the message "Verify that your physical wallet is configured with the recovery phrase associated with the selected account." appears systematically whereas I use the right key and I have no problem on the other cryptos.
When I create a new account on Ledger Live I have a different cosmos address yet I have the same path.
To get my receiving address on my first account, I have to open the cosmos app on my Ledger, and wait for the device to screenlock, then I have my first address.
If I don't wait for the device to screenlock and I'm in the cosmos app, I'll get the second address.
I think when the app is in sleep mode, we are pointing to a different path than what is displayed or to a random address.

Show values in ATOMs instead of uATOMs

I have no way of knowing what I am actually signing because the amount is displayed in UATOM. This is useless as I am not transacting in UATOM. Every time I use the app I cross my fingers that my account does not get drained.

add key, ERROR: address rejected

gaiacli keys add test_ledger --ledger
ERROR: address rejected

ledger v1.6.0
cosmos app: v2.12.0

client_name: gaiacli
version: 2.0.10

Advanced Log in Ledger shows wrong prefix for xpub

In Ledger Live, the Advanced Logs object shows an xpub value with the regular cosmos account human-readable prefix (cosmos) instead of the bech32 public key prefix (cosmospub).

If I recall, an earlier version did in fact display the correct prefix so there might be a regression?

Please let me know if this is the wrong place to file this issue! Thanks!

UX ideas

  • Show the message type first. Most message types are not critical as the user doesn't loose access to their tokens.
  • Show amounts as text: [{amount: 1, denom: uatom}, {amount: 1, denom: stake}] = 1uatom, 1stake
  • Show amounts as atoms: 100000uatom = 1atom
  • Show short addresses: bech32 has a hashsum. The user then can doubletab to see the whole address
  • Show sequence, account and chain-id late. Those information are barely critical.
  • Hide gas? Fees are the important thing.

Is there any specific reason to limit coin type to 118 in HD path ?

Versions

Cosmos Ledger app version: v2.34.9
Ledger mode: Ledger Nano X A8D5

Firmware Versions:
Secure Element: 2.0.2
Microcontroller: 2.30
Bootloader: 1.16

Hardware version: 2

Issue description

While creating key using cosmos SDK cli & using ledger as key storage I face limitation of app not allowing to create key for HD path if coin type is different from default cosmos BIP-0044 coin type (118). And since our chain uses custom coin type (990) I'm not able to add key for it on ledger device. Getting the following error:

cored keys add ledger-testnet-3 --ledger

Error: failed to generate ledger key: failed to recover pubkey: [APDU_CODE_DATA_INVALID] Referenced data reversibly blocked (invalidated): address rejected for path m/44'/990'/0'/0/0

But when I try to add key overriding coin-type to default cosmos value (118) it works so I'm sure that is the reason of failure.

cored keys add ledger-testnet-3 --ledger --coin-type=118

- name: ledger-testnet-3
  type: ledger
  address: testcore17hszunv8mctyu5qh5ehxnl7p4pxzk8gdl86cef
  pubkey: '{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"AqCFxDHHgy13cbDs1VtKu2W8oqB5XTwQG/ff0CstGiEp"}'
  mnemonic: ""

I do not see any issue in allowing custom coin type in HD path for key generation since it doesn't bring any security issues. What is more a lot of cosmos based chains use coin types different from default cosmos (e.g. Kava), which is proper approach actually since it improves privacy.

Reproduction

  1. Download any cosmos based binary e.g osmosisd
  2. Try to use custom coin type to add key to ledger device:
osmosisd keys add ledger-testnet-1 --ledger --coin-type=100
  1. you get error:
Error: failed to generate ledger key: failed to recover pubkey: [APDU_CODE_DATA_INVALID] Referenced data reversibly blocked (invalidated): address rejected for path m/44'/990'/0'/0/0

Ledger: Fail to send token: Data is invalid : Unrecognized error code

After updating the cosmos app on the ledger i can't send through IBC.
I throws: Fail to send token: Data is invalid : Unrecognized error code

To Reproduce
Steps to reproduce the behavior:

Update your ledger device with the latest cosmos app
From keprl go to osmosis chain
Select an IBC token (eg. Juno) and sent it to another Osmosis address (don't use IBC transfer, click on the asset!)
You'll get Fail to send token: Data is invalid : Unrecognized error code

Before the update of the cosmos app on ledger it worked.
Anyhow only the IBC transfer doesn't work the the updated cosmos app on ledger.

Expected behavior
To send the token to the other address

So something has changed either from the cosmos ledger app or the keprl.

Thank you

Reported the same issue on Keprl's github they think it's your issue:
chainapsis/keplr-wallet#368

Thanks

Kava Lend - IBC assets can't be supplied/withdrawn

Ledger Live Version and Operating System

  • tested on Ledger Live 2.42.0
  • Platform and version: MacOS 12.2.1

Expected behavior

Supplying IBC assets to Kava lend via kava.io

Actual behavior

Supplying/withdrawing IBC assets with the COSMOS app (2.34.4) is no longer possible after one of the latest updates. Assets are stuck. See screenshot with error message below.

Steps to reproduce the behavior

Connecting to kava.io. Tried direct connection and Keplr. Kava Telegram community reports same problem with Trust.
Trying to supply to and withdraw from Kava Atom lending pool.

ledger_ibc_bug

Originally posted by @Terminal-Geek in LedgerHQ/ledger-live-desktop#4994

app/src: addr_getNumItems unconditionally logs "num_items 1\n" even in expert mode when num_items = 2

If we examine the code in

*num_items = 1;
if (app_mode_expert()) {
zemu_log("num_items 2\n");
*num_items = 2;
}
zemu_log("num_items 1\n");
we can see that even in expert mode when num_items is changed to 2 we log it firstly then later on unconditionally logging num_items 1.

We can fix it by logging after checking values so either on *num_items or by an else statement so

diff --git a/app/src/addr.c b/app/src/addr.c
index b7461e9..cb6910c 100644
--- a/app/src/addr.c
+++ b/app/src/addr.c
@@ -28,8 +28,9 @@ zxerr_t addr_getNumItems(uint8_t *num_items) {
     if (app_mode_expert()) {
         zemu_log("num_items 2\n");
         *num_items = 2;
+    } else {
+        zemu_log("num_items 1\n");
     }
-    zemu_log("num_items 1\n");
     return zxerr_ok;
 }

Binaries For Testing

Could binaries for testing new cosmos ledger app be published on github with instructions on how to flash them into the device? This would be a huge help for those trying to support other platforms.

False positive on `json contains whitespace` during signature

Version is 2.16.3 ran on LNX

Payload :

{"account_number":"53479","chain_id":"cosmoshub-4","fee":{"amount":[{"amount":"12807","denom":"uatom"}],"gas":"512272"},"memo":"Ledger Live","msgs":[{"type":"cosmos-sdk/MsgUndelegate","value":{"amount":{"amount":"107694","denom":"uatom"},"delegator_address":"cosmos14q7965clxk5vfuw232p3qdk8x5cg6mfhxd9yxe","validator_address":"cosmosvaloper1qdxmyqkvt8jsxpn5pp45a38ngs36mn2604cqk9"}}],"sequence":"16"}

Sent as

55020100fa7b226163636f756e745f6e756d626572223a223533343739222c22636861696e5f6964223a22636f736d6f736875622d34222c22666565223a7b22616d6f756e74223a5b7b22616d6f756e74223a223132383037222c2264656e6f6d223a227561746f6d227d5d2c22676173223a22353132323732227d2c226d656d6f223a224c6564676572204c697665222c226d736773223a5b7b2274797065223a22636f736d6f732d73646b2f4d7367556e64656c6567617465222c2276616c7565223a7b22616d6f756e74223a7b22616d6f756e74223a22313037363934222c2264656e6f6d223a227561746f6d227d2c2264656c656761746f725f61

and

5502020096646472657373223a22636f736d6f7331347137393635636c786b3576667577323332703371646b3878356367366d6668786439797865222c2276616c696461746f725f61646472657373223a22636f736d6f7376616c6f706572317164786d79716b7674386a7378706e35707034356133386e677333366d6e3236303463716b39227d7d5d2c2273657175656e6365223a223136227d

I'm expecting a signature back, but instead I have

4a534f4e20436f6e7461696e73207768697465737061636520696e2074686520636f727075736984

which seems to be DATA_INVALID with "JSON Contains whitespace in the corpus". The only whitespace I see in this payload is the one in the memo, and I don't think it should trigger the error. Is there something I'm missing ?

use hw-transport-u2f

Error:
{return_code: 25600, error_message: "App Version is not supported"}

Browser:
Chrome

Ledger Cosmos App:
v2.16.1

Code:

import TransportU2F from "@ledgerhq/hw-transport-u2f";

const transport = await TransportU2F.create();
const app = new CosmosApp(transport);
const response = await app.getAddressAndPubKey([44, 118, 5, 0, 3], "cosmos");

other:
LedgerHQ/ledgerjs#413

I'm trying to integrating a ledger nano s inside a chrome extension.

Unable to retrieve my Atom on my Ledger

I helped to identify and correct a bug, which consisted in giving a wrong address.

#61

I was told that the bug had been corrected, but unfortunately no one is helping me get my Atom back.
I helped spontaneously so that this would not happen to other people, I think that my participation allowed the products to be of better quality, I would like now to be helped to recover my Atoms.
My previous ticket was closed by the developer without contacting me.

Unable to recreate generating the address for SECP256K1

I've been following the spec written here using the cosmos app on my ledger, but I am getting rather unhelpful errors. The exact information that I am sending to my ledger lookalike this

running 1 test
command: ApduCommand {
    cla: 85,
    ins: 4,
    p1: 1,
    p2: 0,
    length: 27,
    data: [],
}
data: [6, 99, 111, 115, 109, 111, 115, 44, 0, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[ 64] << 01010500000005550401001b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
[  2] << 6984
Error: Ledger(Apdu("[APDU_CODE_DATA_INVALID] data reversibly blocked (invalidated)"))

If anyone has any info on what's going on here it would be greatly appreciated. This is specifically trying to return the SECP256K1 public key, and you can see above for the derivation path I am using [44, 118, 0, 0, 0] in 32bit little endian.
The HRP is "cosmos" and HRP_LENGTH is set to 6.

Can't send funds from INJ account

I tried sending some funds from my INJ account using ledger live. On the first attempt it wanted to activate Advanced mode which I did. The first transaction went through succesfully. I then tried making another transaction and I keep getting the error:

invalid broadcast return (code: 32, message: 'account sequence mismatch, expected 1, got 0: incorrect account sequence')

Indeed, on my Ledger device I see the sequence 0 listed.

the version of my Cosmos app is v2.34.12

Can you please help ?

Validator app freezes if host disconnects during user interaction

Steps:

  1. Vote is sent to the app and the initialization screen is shown
  2. app answers with *flags |= IO_ASYNCH_REPLY; and shows a menu for user confirmation.
  3. Before the user replies, stop the client in the host
  4. Click reject:
    io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 2);```
    
  5. The app is not responsive anymore, it is not clear is cancel worked
  6. The app does not respond anymore to any APDUs
  7. The ledger has to be unplugged and restarted

I open this issue for tracking purposes. The problem and possible solutions are being discussed with Ledger at this moment.

Empty error when attempting to sign using the updated ledger firmware

Previous to the 2.2.2 ledger nano X firmware upgrade, we were able to sign transactions via the cli. Now, after updating to 2.2.2, the ledger is unable to sign and nothing happens. please see celestiaorg/celestia-app#2650 for more details.

From that issue:

Summary of Bug

When attempting to sign any TX with ledger hardware wallet an empty error is thrown with a second delay.

celestia-appd tx sign tx-test.json --from ledger-test --chain-id="mocha-4" --offline -s 0 -a 0 --ledger
Default sign-mode 'direct' not supported by Ledger, using sign-mode 'amino-json'.
Error:
I tried playing around with various options and flags - the result is always the same

Path information displayed on Nano X

On Nano X, in normal mode, the actual derivation path is not displayed, but after having checked the address, it is again displayed but this time as the path.

The issue is not present on Nano S.

Missing root pages when signing tx

After adding an address via cli, only the first two pages (Chain ID and Account) are shown when signing a tx.

No other pages can be accessed (though a double click jumps to the end menu where the tx can be succesfully signed)
Powering the ledger off and on fixes this issue and all pages for the tx are shown.

Steps to Reproduce:

  • install kava v0.8.1 (git clone ..., make install)
  • add a new key to the cli store: kvcli keys add ledgertest --ledger --legacy-hd-path
  • create a json tx to sign: kvcli tx send (kvcli keys show ledgertest -a) kava1adkm6svtzjsxxvg7g6rshg6kj9qwej8gwqadqd 1ukava --from ledgertest --generate-only > tx.json
  • initiate signing: kvcli tx sign tx.json --from ledgertest --account-number 0 --sequence 0 --offline

The first two pages Chain ID and Account will be accessible but not any others. If you unplug the ledger and plug it back in and run the last step it will work as expected - all pages will be visible.

Note:

  • kava uses cosmos-sdk v0.38.4.
  • I've verified that the bytes sent to the ledger are identical between the tx that showed all pages and the tx that didn't

Support for MsgSetWithdrawAddress

I'm trying to sign a MsgSetWithdrawAddress, and correct me if I'm wrong, but it seems it's not supported currently. During signing I see cosmos-sdk/MsgSetWithdrawAddress as the message type as opposed to "Withdraw Address" or something like that and the withdraw address field name is also not "prettified" as with MsgSend or MsgDelegate, and sending with it throws a signature error. Can you please support this message type?

This is the message I'm passing to sign:

{
  "account_number": "8",
  "chain_id": "testing",
  "fee": {
    "amount": [
      {
        "amount": "5000",
        "denom": "uatom"
      }
    ],
    "gas": "200000"
  },
  "memo": "",
  "msgs": [
    {
      "type": "cosmos-sdk/MsgSetWithdrawAddress",
      "value": {
        "delegator_address": "cosmos1hr9x0sjvel6z3vt9qny8sdd5gnnlgk0p69d6cv",
        "withdraw_address": "cosmos12d64j98tjjpqkx70r08aspc4nvntqp2w6wr2de"
      }
    },
    {
      "type": "cosmos-sdk/MsgWithdrawDelegationReward",
      "value": {
        "delegator_address": "cosmos1hr9x0sjvel6z3vt9qny8sdd5gnnlgk0p69d6cv",
        "validator_address": "cosmosvaloper13dr26wdygna3s8fdl5tlc45m2le2ydyddxzj49"
      }
    }
  ],
  "sequence": "7"
}

Support gRPC transactions

Not so long ago, Cosmos migrated from Rest API to gRPC, in this regard, the format of transactions for sending through the cosmos.tx.v1beta1.Service/BroadcastTx service has changed.
This kind of transaction cannot currently be signed via the ledger-app.
Do you plan to support gRPC transactions in ledger-app?

Thank you in advance.

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.