block-equity / stellar-android-wallet Goto Github PK
View Code? Open in Web Editor NEWAn open source Android wallet for Stellar.
Home Page: https://www.blockeq.com
License: MIT License
An open source Android wallet for Stellar.
Home Page: https://www.blockeq.com
License: MIT License
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:354)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
at java.util.concurrent.FutureTask.run(FutureTask.java:271)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:764)
Caused by: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
at org.stellar.sdk.StrKey.decodeCheck(StrKey.java:107)
at org.stellar.sdk.StrKey.decodeStellarAccountId(StrKey.java:31)
at org.stellar.sdk.KeyPair.fromAccountId(KeyPair.java:104)
at blockeq.com.stellarwallet.services.networking.Horizon$Companion$LoadEffectsTask.doInBackground(Horizon.kt:55)
at blockeq.com.stellarwallet.services.networking.Horizon$Companion$LoadEffectsTask.doInBackground(Horizon.kt:52)
at android.os.AsyncTask$2.call(AsyncTask.java:333)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:764)
fail the pin for more than 3 times and sometimes you get this crash
Reward:
This bounty rewards 500,000 Blockpoints (PTS).
User Interface Reference:
The navigation functionality buttons will follow iOS App. Here is the UI for reference:
More details below regarding UI and functionality below!
Philosophy:
Bounty Requirements:
Reward & Deadline
This bounty rewards 500,000 Blockpoints (PTS). Deadline: 2 weeks from acceptance of the bounty.
User Interface Reference:
The PIN view functionality buttons will follow iOS App. Here is the UI for reference:
More details below regarding UI and functionality below!
Philosophy:
Bounty Requirements:
https://www.stellar.org/developers/guides/concepts/federation.html
Example of implementation made by fed.network
https://fed.network/federation?q=david*fed.network&type=name
The following unit test should work (androidTest > AccountUtilsTest.kt)
@Test
public void basic_encryption_mnemonic_with_pass_phrase_with_spaces() {
Context context = InstrumentationRegistry.getTargetContext();
String mnemonicString = String.join(" ", mnemonic);
String passPhrase = "this is a passphrase";
String phrase = AccountUtils.Companion.getEncryptedMnemonicPhrase(InstrumentationRegistry.getTargetContext(), mnemonicString, passPhrase, pin);
assertNotNull(phrase);
KeyPair keyPair = AccountUtils.Companion.getPinMasterKey(context, pin);
assertNotNull(keyPair);
Pair<String, String> decryptedPair = AccountUtils.Companion.getDecryptedMnemonicPhrasePair(phrase, keyPair.getPrivate());
assertEquals(passPhrase, decryptedPair.component2());
assertEquals(decryptedPair.component1(), mnemonicString);
}
the requirements got extracted from ios team in Block-Equity/stellar-ios-wallet#154
All assets should be available in the 'from' list, at all times
All assets excluding the currently selected 'from' asset should be in the 'to' list.
When you select any item in the 'to' list, the 'from' option is not modified.
When you select any item in the 'from' list, the 'to' option is not modified.
Unless it's the current 'to' item. In that case, the first asset in the 'to' list is selected.
Properly load the user's account information on the MainActivity wallet screen
Crash on MainActivity Wallet screen
e.g. detailed explanation, stacktraces, related issues, suggestions how to fix, links for us to have context
Stacktrace:
java.lang.RuntimeException:
at android.os.AsyncTask$3.done (AsyncTask.java:365)
at java.util.concurrent.FutureTask.finishCompletion (FutureTask.java:383)
at java.util.concurrent.FutureTask.setException (FutureTask.java:252)
at java.util.concurrent.FutureTask.run (FutureTask.java:271)
at android.os.AsyncTask$SerialExecutor$1.run (AsyncTask.java:257)
at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:636)
at java.lang.Thread.run (Thread.java:784)
Caused by: java.lang.ArrayIndexOutOfBoundsException:
at org.stellar.sdk.StrKey.decodeCheck (StrKey.java:107)
at org.stellar.sdk.StrKey.decodeStellarAccountId (StrKey.java:31)
at org.stellar.sdk.KeyPair.fromAccountId (KeyPair.java:104)
at blockeq.com.stellarwallet.services.networking.Horizon$Companion$LoadAccountTask.doInBackground (Horizon.kt:30)
at blockeq.com.stellarwallet.services.networking.Horizon$Companion$LoadAccountTask.doInBackground (Horizon.kt:27)
at android.os.AsyncTask$2.call (AsyncTask.java:345)
at java.util.concurrent.FutureTask.run (FutureTask.java:266)
The same implementation as iOS in version 2.4.0 (latest). But to also include in the final screen an option to send an email (with the diagnostic ID in the subject) along with an optional message field for the user to input their actual problem to the email.
Product discussions are in https://airtable.com/tbltVhiXxomHljBxX/viwzllQDutDx2SJVI/recbi6YB6aULADBK0
https://api-staging.blockeq.com/directory/exchanges?asArray
ui and logic has to be agreed because there are 2 different implementations ios and desktop.
In desktop the field memo changes from memoID
to memoText
accordingly with the api.
This bug was reproducible in the market v4.6 and in dev branch.
Be able to create a wallet after entering to the recovery flow and going back to first activity.
Once the user enters recovery flow with secret key can not cancel and create a wallet.
Once the wallet is created it asks for the pin again and it crashes.
Sometimes it returns to the first screen.
I have written it down
The possible issue may be caused when isRecoveryPhrase is set to true to soon in the
RecoveryWalletActivity.kt:65 and the full recovery has not been completed yet.
Process: blockeq.com.stellarwallet, PID: 13459
java.lang.IllegalArgumentException: com.google.common.io.BaseEncoding$DecodingException: Unrecognized character: d
at com.google.common.io.BaseEncoding.decode(BaseEncoding.java:228)
at org.stellar.sdk.StrKey.decodeCheck(StrKey.java:106)
at org.stellar.sdk.StrKey.decodeStellarSecretSeed(StrKey.java:39)
at org.stellar.sdk.KeyPair.fromSecretSeed(KeyPair.java:81)
at blockeq.com.stellarwallet.utils.AccountUtils$Companion.getKeyPair(AccountUtils.kt:60)
at blockeq.com.stellarwallet.activities.PinActivity$onComplete$runnableCode$1.run(PinActivity.kt:89)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: com.google.common.io.BaseEncoding$DecodingException: Unrecognized character: d
at com.google.common.io.BaseEncoding$Alphabet.decode(BaseEncoding.java:503)
at com.google.common.io.BaseEncoding$StandardBaseEncoding$2.read(BaseEncoding.java:675)
at com.google.common.io.BaseEncoding.decodeChecked(BaseEncoding.java:245)
at com.google.common.io.BaseEncoding.decode(BaseEncoding.java:226)
at org.stellar.sdk.StrKey.decodeCheck(StrKey.java:106)
at org.stellar.sdk.StrKey.decodeStellarSecretSeed(StrKey.java:39)
at org.stellar.sdk.KeyPair.fromSecretSeed(KeyPair.java:81)
at blockeq.com.stellarwallet.utils.AccountUtils$Companion.getKeyPair(AccountUtils.kt:60)
at blockeq.com.stellarwallet.activities.PinActivity$onComplete$runnableCode$1.run(PinActivity.kt:89)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
Crash 2
2018-10-31 11:12:17.290 13730-14409/blockeq.com.stellarwallet E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
Process: blockeq.com.stellarwallet, PID: 13730
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:354)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
at java.util.concurrent.FutureTask.run(FutureTask.java:271)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:764)
Caused by: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
at org.stellar.sdk.StrKey.decodeCheck(StrKey.java:107)
at org.stellar.sdk.StrKey.decodeStellarAccountId(StrKey.java:31)
at org.stellar.sdk.KeyPair.fromAccountId(KeyPair.java:104)
at blockeq.com.stellarwallet.services.networking.Horizon$Companion$LoadAccountTask.doInBackground(Horizon.kt:30)
at blockeq.com.stellarwallet.services.networking.Horizon$Companion$LoadAccountTask.doInBackground(Horizon.kt:27)
at android.os.AsyncTask$2.call(AsyncTask.java:333)
There is no single check in the CI it is not even checking compiler issues.
Lint check, build, unit tests and compiler checks should be run in every commit or PR.
If the app does not support RTL language it should not move the English strings to the right.
The text gets moved to the right and the mnemonic is not getting rendered properly.
Switch the language to one of following ones and use the app, specially check the mnemonic words
Priority Low
The app uses in at least 9 places elevation attribute. Elevation is not supported in a pre-lollipop.
the solutions is to increase the minSdk to 21 or provide a way that is not api specific like the following one:
https://blog.iamsuleiman.com/add-a-toolbar-elevation-on-pre-lollipop/
This crash was found in the google console using app version 13
Infinix HOT 6 Pro (Infinix-X608), Android 8.0
java.lang.RuntimeException:
at android.os.AsyncTask$3.done (AsyncTask.java:353)
at java.util.concurrent.FutureTask.finishCompletion (FutureTask.java:383)
at java.util.concurrent.FutureTask.setException (FutureTask.java:252)
at java.util.concurrent.FutureTask.run (FutureTask.java:271)
at android.os.AsyncTask$SerialExecutor$1.run (AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:636)
at java.lang.Thread.run (Thread.java:764)
Caused by: javax.net.ssl.SSLHandshakeException:
at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake (Native Method)
at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake (OpenSSLSocketImpl.java:351)
at okhttp3.internal.connection.RealConnection.connectTls (RealConnection.java:299)
at okhttp3.internal.connection.RealConnection.establishProtocol (RealConnection.java:268)
at okhttp3.internal.connection.RealConnection.connect (RealConnection.java:160)
at okhttp3.internal.connection.StreamAllocation.findConnection (StreamAllocation.java:256)
at okhttp3.internal.connection.StreamAllocation.findHealthyConnection (StreamAllocation.java:134)
at okhttp3.internal.connection.StreamAllocation.newStream (StreamAllocation.java:113)
at okhttp3.internal.connection.ConnectInterceptor.intercept (ConnectInterceptor.java:42)
at okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:147)
at okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:121)
at okhttp3.internal.cache.CacheInterceptor.intercept (CacheInterceptor.java:93)
at okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:147)
at okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:121)
at okhttp3.internal.http.BridgeInterceptor.intercept (BridgeInterceptor.java:93)
at okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:147)
at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept (RetryAndFollowUpInterceptor.java:125)
at okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:147)
at okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:121)
at okhttp3.RealCall.getResponseWithInterceptorChain (RealCall.java:200)
at okhttp3.RealCall.execute (RealCall.java:77)
at org.stellar.sdk.requests.AccountsRequestBuilder.account (AccountsRequestBuilder.java:41)
at org.stellar.sdk.requests.AccountsRequestBuilder.account (AccountsRequestBuilder.java:54)
at blockeq.com.stellarwallet.services.networking.Horizon$Companion$ChangeTrust.doInBackground (Horizon.kt:187)
at blockeq.com.stellarwallet.services.networking.Horizon$Companion$ChangeTrust.doInBackground (Horizon.kt:175)
at android.os.AsyncTask$2.call (AsyncTask.java:333)
at java.util.concurrent.FutureTask.run (FutureTask.java:266)
Reward and timeline:
This bounty rewards 750,000 Blockpoints (PTS). The bounty is due in 2.5 weeks after accepting the bounty. Bounty will be rewarded upon satisfactory code review and thorough QA testing (no crashes or jittery UI experience for users!)
User Interface Reference:
Functionality will follow iOS App. Here is the UI for reference for Receiving:
More details below regarding UI and functionality below!
Philosophy:
Bounty Requirements:
Receive:
Send:
See the requirements on the mock image above
Is your feature request related to a problem? Please describe.
Describe the solution you'd like
A clear and concise description of what you want to happen.
onActivityResult
to return the secret seedAdditional context
Add any other context or screenshots about the feature request here.
The app sometimes is not able to scan a QR code to send coins to another wallet.
if I try to scan the QR code generated from ios wallet or desktop using the android client is not able to get the address.
NOTE: For support questions, please use Stack Overflow.
This repository's issues are reserved for feature requests and bug reports.
Screenshots and videos also help, where possible! Be mindful of sensitive data.
e.g. detailed explanation, stacktraces, related issues, suggestions how to fix, links for us to have context
Android wallet might work as same as desktop and show
Incorrect Mnemonic Phrase. Please try again.
the user is able to recover the wallet using with a mneumonic word that is not in the BIP39 list.
Restore wallet and put a word that is not in the BIP39 list.
Users may be confused creating a new wallet instead of recovering the original one.
appVersion 20
java.lang.ClassCastException:
at blockeq.com.stellarwallet.utils.AccountUtils$Companion.getOldDecryptedPair (AccountUtils.kt:157)
at blockeq.com.stellarwallet.activities.PinActivity$onComplete$runnableCode$1.run (PinActivity.kt:100)
at android.os.Handler.handleCallback (Handler.java:809)
at android.os.Handler.dispatchMessage (Handler.java:102)
at android.os.Looper.loop (Looper.java:166)
at android.app.ActivityThread.main (ActivityThread.java:7555)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:469)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:963)
Steps to reproduced (reported by @MeghaBambra )
NOTE: For support questions, please use Stack Overflow.
This repository's issues are reserved for feature requests and bug reports.
Be able to see all mnemonics to write them down.
In small screen devices the last mnemonics are hidden behind the button I have written it down
Create a new wallet with 24 words using a 480x800 device.
Nexus One API 22 4'' 480x800 hdpiPassphrase should not be set with an empty string
Passphrase can be set with an empty string
NOTE: For support questions, please use Stack Overflow.
This repository's issues are reserved for feature requests and bug reports.
It is safer to avoid the usage of the special characters for the passphrase.
#Side effects
Previous wallets created with special characters may not able to recover. It should be better to prevent the special characters in the creation flow not in the recovering.
Reward and timeline:
This bounty rewards 750,000 Blockpoints (PTS). The bounty is due in 2.5 weeks after accepting the bounty. Bounty will be rewarded upon satisfactory code review and thorough QA testing (no crashes or jittery UI experience for users!)
User Interface Reference:
Functionality will follow iOS App. Here is the UI for reference for Trade Tab:
More details below regarding UI and functionality below!
Philosophy:
Bounty Requirements:
Please see requirements in the screenshot above.
Login properly
Crash on login
Screenshots and videos also help, where possible! Be mindful of sensitive data.
e.g. detailed explanation, stacktraces, related issues, suggestions how to fix, links for us to have context
java.lang.IllegalArgumentException:
at com.google.common.io.BaseEncoding.decode (BaseEncoding.java:228)
at org.stellar.sdk.StrKey.decodeCheck (StrKey.java:106)
at org.stellar.sdk.StrKey.decodeStellarSecretSeed (StrKey.java:39)
at org.stellar.sdk.KeyPair.fromSecretSeed (KeyPair.java:81)
at blockeq.com.stellarwallet.utils.AccountUtils$Companion.getKeyPair (AccountUtils.kt:60)
at blockeq.com.stellarwallet.activities.PinActivity$onComplete$runnableCode$1.run (PinActivity.kt:89)
at android.os.Handler.handleCallback (Handler.java:751)
at android.os.Handler.dispatchMessage (Handler.java:95)
at android.os.Looper.loop (Looper.java:163)
at android.app.ActivityThread.main (ActivityThread.java:6228)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:776)
Caused by: com.google.common.io.BaseEncoding$DecodingException:
at com.google.common.io.BaseEncoding$Alphabet.decode (BaseEncoding.java:503)
at com.google.common.io.BaseEncoding$StandardBaseEncoding$2.read (BaseEncoding.java:675)
at com.google.common.io.BaseEncoding.decodeChecked (BaseEncoding.java:245)
at com.google.common.io.BaseEncoding.decode (BaseEncoding.java:226)
Desktop wallet sets in every row the gray color
IOS Wallet sets to the trade items a gray color.
Android sets green if the trade resulted with more current coins otherwise red.
Android will sync up with IOS.
Implement espresso test that follow the use cases: 23, 24, 25, 26 and 27.
https://airtable.com/tbl5bSEYL0OYIQ4wJ/viwPKP4Gw9Ba6fvHJ
Please follow the basic rules of ui testing on
https://github.com/Block-Equity/stellar-android-wallet/blob/dev/app/src/androidTest/README.md
NOTE: For support questions, please use Stack Overflow.
This repository's issues are reserved for feature requests and bug reports.
Crash 1:
Crash 2:
Crash 3:
The pin has to be requests when the user changes the request pin when sending payments
flag in settings.
The user can change the request pin when sending payments
without being ask for the pin.
NOTE: For support questions, please use Stack Overflow.
This repository's issues are reserved for feature requests and bug reports.
we should parse the response like
val response = server.submitTransaction(transaction)
// one more check
response.isSuccess
0 coin should not be a valid value to send the button should be disabled.
Sending 100% should fail because of the fees and now there is no error message.
it shows successful and it goes back to the main screen
NOTE: For support questions, please use Stack Overflow.
This repository's issues are reserved for feature requests and bug reports.
the app should not crash decrypting the passphrase
looks like some users have the flag isPassPhrase true when the pass phrase was not set.
java.lang.StringIndexOutOfBoundsException:
at java.lang.String.substring (String.java:1939)
at blockeq.com.stellarwallet.utils.AccountUtils$Companion.getOldDecryptedPair (AccountUtils.kt:98)
at blockeq.com.stellarwallet.activities.PinActivity$onComplete$runnableCode$1.run (PinActivity.kt:97)
at android.os.Handler.handleCallback (Handler.java:789)
at android.os.Handler.dispatchMessage (Handler.java:98)
at android.os.Looper.loop (Looper.java:164)
at android.app.ActivityThread.main (ActivityThread.java:6938)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:327)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1374)
Describe the solution you'd like
A clear and concise description of what you want to happen.
This two request should use OkHttp
instead of Volley
and they should share the okHttClient
instance with Horizon.
"https://api.blockeq.com/directory/assets"
"https://api.blockeq.com/directory/exchanges?asArray"
ViewModel
|
LiveData
|
Repository ---> remote
|
LiveData
|
RoomDatabase
High entropy in the default random generator
Low entropy in the default random generator
https://android-developers.googleblog.com/2013/08/some-securerandom-thoughts.html
Process: com.blockeq.stellarwallet, PID: 18131
kotlin.UninitializedPropertyAccessException: lateinit property orderBooksAdapter has not been initialized
at com.blockeq.stellarwallet.fragments.tabs.OrderBookTabFragment.access$getOrderBooksAdapter$p(OrderBookTabFragment.kt:24)
at com.blockeq.stellarwallet.fragments.tabs.OrderBookTabFragment$loadOrderBook$3.run(OrderBookTabFragment.kt:108)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
miteshpithadiya/SearchableSpinner#48
ava.lang.IllegalStateException: Fragment already added: SearchableListDialog{ad4f6610 #0 TAG}
at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1133)
at android.app.BackStackRecord.run(BackStackRecord.java:618)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.