Giter Site home page Giter Site logo

walleth / walleth Goto Github PK

View Code? Open in Web Editor NEW
606.0 36.0 174.0 7.18 MB

free (libre) native Android Ethereum wallet

Home Page: https://walleth.org

License: GNU General Public License v3.0

Kotlin 99.75% Java 0.20% Shell 0.05%
ethereum android android-application ethereum-client java ethereum-wallet ethereum-blockchain ethereum-address

walleth's Introduction

WallETH

on Google Play on FDroid

WallΞTH

Native Android Ethereum wallet.

Features

Hardware Wallet Support

other Account types

  • Watch only
  • PIN protected
  • Password protected
  • Burner style accounts
  • Key Import ( JSON UTC, RAW and Mnemonics)

Networks (Chains)

  • main, görli, rinkeby, ropsten, kovan, POA, sokol, ETC, xDAI, ...
  • load all chains from chainid.network
  • DappNode support
  • Testnets with direct link to faucets (on görli and ropsten even auto-fill of address)
  • one flavor contains go-ethereum light client

UI

  • Day/Night mode (Dark mode)
  • display information about Security of the phone
  • Sourcify support
  • display function calls when available from https://github.com/ethereum-lists/4bytes (fallback if contracts are not verified on Sourcify)
  • Keys on your device under your control
  • Tokens (your own ERC-20 compatible or predefined like DAI, Unicorn, OMG, SNT, ZRC, GNO, ..) - add your own in the app or on https://github.com/ethereum-lists/tokens so everyone can use it
  • display value in fiat like EUR, NZD, USD, .. or MakerDAO DAI

Standards

  • ERC-67 / ERC-681 / ERC-1328 URLs (e.g. scanned from QR-Code or via intent)
  • ERC-55 Checksums
  • EIP712 signing
  • EIP155 Transactions

Other

  • WalletConnect 1.0 Support
  • Offline signing (compatible to Parity signing flow)

Find more information on https://walleth.org

License

GPL

walleth's People

Contributors

chriseth avatar esaulkov avatar friedger avatar hboon avatar hjubb avatar ligi avatar naofum avatar neoecos avatar rockyplanet12 avatar schildbach avatar vlsi avatar zaeleus 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

walleth's Issues

Need Receive button

How to share address of first wallet for receiving some amount?
There is no button to it. Only ability to view full address on "Switch account" page.

Wallet Overview Screen UX

I collected some UX issues that new users struggle with:

  • Send and receive arrows are not clear enough without text
  • Transactions: It is not clear which transaction is a "receive" and which is a "send". User has to use the app for a while to understand.
  • Unconfirmed transactions show as if they were confirmed. (I can make a transaction with 0 ETH fee, and it looks like it worked).
  • Camera FAB (= QR scanning) is not clear to new users. I see that other apps use camera icons, but usually with text (e.g. scan voucher code).

Here's a mockup of the proposed changes including some suggested updates to the information hierarchy and design:
Mockup

Custom token name limits

Custom tokens might have long names. Even "MySuperUnicorns".
But walleth allows only 5 symbols.
It's not a bug, but maybe need to enlarge that limit.

Console attach & privatechain configs

Namaste,
I was looking for geth console, only to find logs.
Please include an option to run geth console from Walleth
&& for now option to add/switching between Rinkeby & private chain configs would be great!!

Use case:
Start WS/RPC/.. from walleth app to run/test dapps in mobile apps/browser.

Example:
Using sms gateway app+walleth RPC. Every time my frens send me SMS with "****" code, sms gateway server will trigger a token transfer using walleth RPC.

Address clipboard attack

Copy to clipboard was requested and implemented.
But we at least need to warn users that there is a potential attack-vector here - some malicious app could listen to the clipboard and if it detects some ethereum-address - it could replace it with its own and try to steal money this way.
We could also listen for the clipboard our-self and detect such a malicious pattern and give the user some extra warning - that would also cover incoming addresses.
Thanks to @schildbach for the input regarding this problem

Add option to switch back to external scanner

after #42 #18 was closed - but I like to bring back the external scanner as an option (also e.g. when permission is not granted) - I kinda like the idea of apps combined in unix style and specialized to their task ..
But for UX reasons I was merging this as we really need the option on play to download app-dependencies to have a nicer UX flow

App crashes when an invalid address was entered in the addressbook

Issue description

The app crashes when a invalid address was entered in the address book (1 wrong character).

Steps to reproduce the issue

  1. Find a valid ETH address
  2. Change one character and add to address book
  3. Try to send Ether to that address.

What's the expected result?

  • Not crashing (Preferably checksum validation when creating the address book entry.)

Disable Multidex

I had to enable MultiDex for now to release a version that contains TREZOR support, #42 and more.
But I want to remove this at a later point again - this issue is a reminder to not forget. One way to remove lots of methods can be: trezor/trezor-android#29

Send Money Flow [Alpha Version Feedback]

screen shot 2017-06-03 at 15 01 59

Found issues:

  • A FAB shouldn't be used as the "Confirm/Send" button. This leads to users accidentally sending, because it's too easy to accidentally press it and due to position users can confuse it with "close keyboard". (I'm aware that there's maybe a PIN planned to prevent this, but it's still not how FABs are usually used)
  • Gas/Fee is problematic for the average user (talk about it in a separate issue here):
  • Can't paste address
  • Can't type address

Minor issues:

  • Focuses right away onto "step 2", the amount, but the address on top hasn't been entered yet. Users read from top to bottom.
  • Android keyboard shows keys that can't be entered
  • Infinity icon meaning unclear

Changes:
To make the app as fast (reducing the amount of clicks and making things clearer) and easy to use as possible (also for users who are new to Ethereum) I'm recommending trying split this up more and the features easy to discover.

Mockup

Step 1: Recipient

It is made clear what the options are, so users can easily discover the possibilities.
Functionality:

  • Press on Scan QR Code QR Code scanner.
  • Press on Address book: Current implementation
  • Press on Paste Address: Error popup if there's no valid address in the clipboard
  • Press on Enter Address: Change to enter manually in popup, see: http://imgur.com/74YQ4T3

After the action it proceeds automatically to amount.

Step 2: Amount

I see this is extra work to create a in-app keyboard, so it's optional and maybe not necessary for the MVP, but it has many benefits from a UX standpoint, which is why the most popular Bitcoin apps all have one (e.g: Mycelium, Bitpay, Coinbase, Electrum): Some of them are: The correct keys, not device dependent, faster and uncluttered design (+ maybe possible security benefits?). It can be reuse this in other areas of the app.

Other improvements: Adding a calculator functionality, swapping between FIAT/CRYPTO.

Step 3: Overview

The overview shows everything before you confirm the transaction. By pressing the fields you can make changes if you spot mistakes or changed your mind.

Fee/Gas will be discussed in a separate post here: #26

Notes:

  • I included "From: Wallet Address" here, which wouldn't be seen if the user only has only one wallet. And other changes would be necessary to make it easier to switch between wallets and see the balances.

Camera.native_setParameters (Camera.java) failed

After releasing a version that contains #42 - I got the following crash-report. Unfortunately I cannot reproduce it. cc @zaeleus

Exception java.lang.RuntimeException: setParameters failed
android.hardware.Camera.native_setParameters (Camera.java)
android.hardware.Camera.setParameters (Camera.java:1932)
org.walleth.activities.qrscan.Videographer.setDefaultParameters (Videographer.kt:127)
org.walleth.activities.qrscan.Videographer.access$setDefaultParameters (Videographer.kt:13)
org.walleth.activities.qrscan.Videographer$openCamera$1.run (Videographer.kt:99)
android.os.Handler.handleCallback (Handler.java:739)
android.os.Handler.dispatchMessage (Handler.java:95)
android.os.Looper.loop (Looper.java:135)
android.os.HandlerThread.run (HandlerThread.java:61)

Conversion to fiat in transaction history uses current conversion rate

Issue description

All fiat numbers in the transaction history get converted according to todays conversion rate.

Steps to reproduce the issue

  1. Make a transaction
  2. Wait some days
  3. See the FIAT value change

What's the expected result?

The app should use the conversion rate from the date of the transaction. If a user sends 10 € in ETH to a friend for a cinema ticket and ETH loses 30% of it's value then it should still say that the user transfered 10€, because that's how much it was worth.

What's happening:

The numbers constantly get converted again according to todays rate and therefor always changes, making it confusing and difficult to see what the transaction were.

building in android studio

when I try to build in android studio I get the following error, do you know what that's about?

screen shot 2017-06-18 at 2 40 06 pm

Executing tasks: [:app:generateNoFirebaseForFDroidDebugSources, :app:prepareNoFirebaseForFDroidDebugUnitTestDependencies, :app:mockableAndroidJar, :app:generateNoFirebaseForFDroidDebugAndroidTestSources, :app:compileNoFirebaseForFDroidDebugSources, :app:compileNoFirebaseForFDroidDebugUnitTestSources, :app:compileNoFirebaseForFDroidDebugAndroidTestSources]

Configuration on demand is an incubating feature.
NDK is missing a "platforms" directory.
If you are using NDK, verify the ndk.dir is set to a valid NDK directory. It is currently set to /Users/s.matthew.english/Library/Android/sdk/ndk-bundle.
If you are not using NDK, unset the NDK variable from ANDROID_NDK_HOME or local.properties to remove this warning.

:app:preBuild UP-TO-DATE
:app:preNoFirebaseForFDroidDebugBuild UP-TO-DATE
:app:checkNoFirebaseForFDroidDebugManifest
:app:preNoFirebaseForFDroidReleaseBuild UP-TO-DATE
:app:preWithFirebaseForAmazonDebugBuild UP-TO-DATE
:app:preWithFirebaseForAmazonReleaseBuild UP-TO-DATE
:app:preWithFirebaseForPlayDebugBuild UP-TO-DATE
:app:preWithFirebaseForPlayReleaseBuild UP-TO-DATE
:app:prepareComAndroidSupportAnimatedVectorDrawable2531Library
:app:prepareComAndroidSupportAppcompatV72531Library
:app:prepareComAndroidSupportCardviewV72531Library
:app:prepareComAndroidSupportDesign2531Library
:app:prepareComAndroidSupportPreferenceV142531Library
:app:prepareComAndroidSupportPreferenceV72531Library
:app:prepareComAndroidSupportRecyclerviewV72531Library
:app:prepareComAndroidSupportSupportCompat2531Library
:app:prepareComAndroidSupportSupportCoreUi2531Library
:app:prepareComAndroidSupportSupportCoreUtils2531Library
:app:prepareComAndroidSupportSupportFragment2531Library
:app:prepareComAndroidSupportSupportMediaCompat2531Library
:app:prepareComAndroidSupportSupportV42531Library
:app:prepareComAndroidSupportSupportVectorDrawable2531Library
:app:prepareComAndroidSupportTransition2531Library
:app:prepareComChibatchingKotprefKotpref211Library
:app:prepareComGithubLigiExtraCompats04Library
:app:prepareComGithubLigiKAXT017Library
:app:prepareComGithubLigiKAXTUI03Library
:app:prepareComGithubSalomonbrysKodeinKodeinAndroid330Library
:app:prepareComGoogleAndroidGmsPlayServicesBasement1026Library
:app:prepareComGoogleAndroidGmsPlayServicesTasks1026Library
:app:prepareComGoogleFirebaseFirebaseAnalytics1026Library
:app:prepareComGoogleFirebaseFirebaseAnalyticsImpl1026Library
:app:prepareComGoogleFirebaseFirebaseCommon1026Library
:app:prepareComGoogleFirebaseFirebaseCore1026Library
:app:prepareComGoogleFirebaseFirebaseIid1026Library
:app:prepareComJakewhartonProcessPhoenix200Library
:app:prepareComJakewhartonThreetenabpThreetenabp105Library
:app:prepareOrgEthereumGeth165Library
:app:prepareNoFirebaseForFDroidDebugDependencies
:app:compileNoFirebaseForFDroidDebugAidl
:app:compileNoFirebaseForFDroidDebugRenderscript
:app:generateNoFirebaseForFDroidDebugBuildConfig
:app:generateNoFirebaseForFDroidDebugResValues
:app:processNoFirebaseForFDroidDebugGoogleServices
Parsing json file: /Users/s.matthew.english/Projects/Ethereum/walleth/app/google-services.json
:app:processNoFirebaseForFDroidDebugGoogleServices FAILED

FAILURE: Build failed with an exception.

  • What went wrong:
    Execution failed for task ':app:processNoFirebaseForFDroidDebugGoogleServices'.

com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 25 path $

  • Try:
    Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 14.158 sec

Split apk

I did some experiments with split apk - and we can get down to 10MBish apks - but will not do it in the alpha/beta phase as the overhead of copying things around is higher.

⋊> ~/g/w/a/b/o/apk on master ⨯ ls -l
total 9344
-rw-r--r-- 1 ligi ligi 9557636 Mai  6 05:52 WALLETH-0.5-noFirebase-forFDroid-debug.apk
    splits {
        abi {
            enable true
            exclude 'x86', 'x86_64', 'arm64-v8a', 'mips', 'mips64', 'armeabi'
        }
    }

Add ValueInputLayout

Currently we have a ValueView (which can show Token+Refernece) and then in several places an additional EditText to change these values (e.g. for request and send)
This is not really good UX and wastes space. Ideally we have a ValueInputView where the user can directly enter the value (either the tokenvalue or the reference like EUR or NZD) in place.

"Only ERC67 supported currently" error when scanning address

When I use the camera-icon in the lower right corner of the main screen to scan an address I get this error: "Only ERC67 supported currently". However when I open the "Transfer"-screen and use the camera-icon there (next to the To-Address-field), I dont get this error (using the same address). I would have expected that this error appears either using both icons or not at all.

Use checksummed format for Ethereum addresses

I don't think it is THAT important, but most of the Ethereum wallets I've seen use

0x1f815D67006163E502b8eD4947C91ad0A62De24e

rather than plain lowercase addresses

0x1f815d67006163e502b8ed4947c91ad0a62de24e

and I expect users are used to seeing this more in the wild.

Ability to switch off EtherScan

Mainly to test that everything works fine without
perhaps configurable list of connectors
[ ] EtherScan
[ ] Infura
[ ] Custom Node

and if none is selected it is like the test of switching off

Deal with file-picking on bad ROMS

will do like whisper-systems: signalapp/Signal-Android@6e3751a

stacktrace:

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.OPEN_DOCUMENT cat=[android.intent.category.OPENABLE] typ=*/* }
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1818)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1525)
at android.app.Activity.startActivityForResult(Activity.java:4229)
at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:50)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:79)
at android.app.Activity.startActivityForResult(Activity.java:4187)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859)
at org.walleth.activities.ImportActivity.onOptionsItemSelected(ImportActivity.kt:131)
at android.app.Activity.onMenuItemSelected(Activity.java:3208)
at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:408)
at android.support.v7.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:195)
at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:113)
at android.support.v7.app.AppCompatDelegateImplV9.onMenuItemSelected(AppCompatDelegateImplV9.java:679)
at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:822)
at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:156)
at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:969)
at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:959)
at android.support.v7.widget.ActionMenuView.invokeItem(ActionMenuView.java:623)
at android.support.v7.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:154)
at android.view.View.performClick(View.java:5637)
at android.view.View$PerformClick.run(View.java:22433)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6236)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:891)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:781)

Offline transaction test failed

Hi!

I have tried to test the offline transaction function you implemented in Walleth, but I couldn't get the QR code with the transaction data.

What I have done:

  • Created an "Online Wallet" on my main smartphone
  • Got 3 ETH from the Faucet to that "Online Wallet"
  • Copied the APK to an offline, freshly reset android phone, no Wifi connected, no SIM
  • Opened Walleth, renamed the automatically created account to "Offline Wallet"
  • On my main phone, I added a new account by scanning the public address from the "Offline Wallet"
  • Sent 1 ETH from the "Online Wallet" to the "Offline Wallet"
  • From the main smartphone I selected my "Offline Wallet" without private key (watch-only?)
  • I set up a transfer of all the funds on that "Offline Wallet" to the "Online Wallet"
  • Tried to validate the transaction thinking there would be a QR Code shown, but there wasn't

After some trial and nothing, I'm lost and I don't know where the QR Code of the transaction is supposed to show up?

Can you help me? Thanks!

Add support for ERC67 for ERC20 tokens in the Request Transaction Activity

Right now, if I change the default token the wallet shows the information about that token, but when I press the request button and puts a value to generate and ERC67 string it does not put the Token information.

An example from ERC67

This is the same function as above, to send 5 unicorns from he sender to deadbeef, but now with a more readable function, which the client converts to byte code.

ethereum:0x89205A3A3b2A69De6Dbf7f01ED13B2108B2c43e7?gas=100000&function=transfer(address 0xdeadbeef, uint 5)

In order to fully support the ERC67 feature, the when a ERC67 URI is scanned the Walleth also needs to support that operation.

Make gas fee easy to use and understand [Alpha Version Feedback]

Current implementation:
screenshot_20170603-130535_01

  • The meaning of gas and the units are a mystery to many users. People don't know what to enter in those fields. Gas station icon doesn't help much, because the site mostly uses different units (Gwei)
  • Having a field to adjust the gas price can be problematic. Can lead to errors: Some might overpay, pay too little and never get it never confirmed or they just won't touch these settings. Users have to do extensive research to understand gas and what they have to fill into these fields.
  • Most users don't edit the gas fee
  • A number with 10 Zero's is hard to read and understand.

I highly recommend reading this Medium post by the guys from Ethgasstation.info: https://medium.com/@ethgasstation/the-safe-low-gas-price-fb44fdc85b91 - It touches on many of those points and lists even more issues.

Changes:

I propose to narrow it down to three easy choices (The ETHgasAPI or some custom implementation could be used), just as explained in the Medium post. A 4th option would be to make custom edits, so advance users that for example want to skip the line in an ICO can make the changes they want.

Mockup:
screen shot 2017-06-03 at 14 08 02

Notes:

  • This is an additional step at the moment (though with a bright signifier), but if we want to make even more users adjust the gas, it be beneficial to make it a separate step in the transaction-flow. (And test to see the impact).
  • Fastest wouldn't be the default. This is just an example.
  • Gas limit is missing here. (Could be a second text field that is also only active once the recommendation is turned off.) Some apps don't let users adjust it. E.g. Lunary, Mist. Need more info about the use cases.

UI quirk: "scan QR code" location different on different screens

Android: 6.0.1
Walleth: 0.17 (using light theme)

What confuses me

On the wallet overview screen, there's a circular green button to "scan QR code" in the bottom right.

Going to the "offline transaction"/"Relay transaction" screen, there's also a circular green button in the bottom right - except it's the "confirmation check". The "scan QR code" button is in the top right.

The same visual style and location are used for different functions. More importantly, the "scan QRC" button isn't very visible on the "offline transaction" screen.

How this could be fixed

First, maybe change color of one of the buttons - and perhaps its shape, for colorblind people.

OTOH More importantly, the "send tx" screen (reachable via "right arrow" button on overview screen) has a nicely contextualised "scan QRC" button, that's right next to the field where the scanned data will be put. Suggesting the same be done on the "offline tx" screen.

Request Money Flow [Alpha Version Feedback]

Current design:
screen shot 2017-06-03 at 15 02 49

Issues to improve:

  • The QR code is the main thing on this page. Having copy and share icons in the app bar make it seem to some users as if the QR code gets shared
  • No address visible, so I don't know what I share/copy.
  • Meaning of "Add value" string could be stronger
  • It doesn't say if the value is FIAT or ETH
  • After the value is entered it's not clear that what changed/happened

Changes:

  • Adding the receiving address
  • Reuse "amount entry" from
  • After the user entered an amount the request page changes to clearly reflect that the QR code and share/copy include the amount now. (Good example: Mycelium)

Mockup:
screen shot 2017-06-03 at 11 24 27

Deploy token contract

create your own token
you can currently already add tokens - but they have to be already deployed. In the same screen there could be an option to deploy a new token and then the fields get filled out.

Full backup export

Currently you can export the key - we should also allow an export of address-book ..

Use EIP155 Signer

with geth 1.7.X there is the option to use the EIP155 signer which I want to leverage. Unfortunately I stumbled upon problems there - but I need to get a version out as byzantium activation on rinkeby is very close. But don't want to forget it and also perhaps @karalabe has some idea - so opening this issue

the following creates a valid transaction-signature

val transactionWithSignature = newTransaction.withSignature(signHash, null)

when passing the chainID (second parameter) so that EIP155 can be used the transaction gets messed up. E.g. when sending to etherscan - etherscan responds that the funds are not enough for value+gas. When using the old signer everything is fine.

like this for a rinkeby tx:
val transactionWithSignature = newTransaction.withSignature(signHash, BigInt(4L))

this is the go-code below:

func (tx *Transaction) WithSignature(sig []byte, chainID *BigInt) (signedTx *Transaction, _ error) {
        var signer types.Signer = types.HomesteadSigner{}
        if chainID != nil {
                signer = types.NewEIP155Signer(chainID.bigint)
        }
        rawTx, err := tx.tx.WithSignature(signer, common.CopyBytes(sig))
        return &Transaction{rawTx}, err
}

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.