pool-of-tears / myne Goto Github PK
View Code? Open in Web Editor NEWAn android app to download & read ebooks from Project Gutenberg, built with Jetpack Compose.
Home Page: https://pooloftears.in
License: Apache License 2.0
An android app to download & read ebooks from Project Gutenberg, built with Jetpack Compose.
Home Page: https://pooloftears.in
License: Apache License 2.0
Hello,
Long time i was looking for an app like this one, so thank you !
Do you plan to add possibility to download multiple ebooks by author and language ?
Hi,
I make the Spanish translations for the app but when I tried to push the changes, my push was rejected
remote: Permission to Pool-Of-Tears/Myne.git denied to Dolanpls.
fatal: unable to access 'https://github.com/Pool-Of-Tears/Myne.git/': The requested URL returned error: 403
I'm in a new branch called 'spanish-translation' so I'm not trying to push into 'main' directly
Add swipe actions in library items like swipe left to delete and swipe right to maybe share the epub file.
I was searching for tales myths and legends and dovnloaded a good bunch of books. Unfortunately i couldn't remember which ones i did download…
The app could remember which ebook pages have been seen, or even downloaded.
This could be seen both on the ebook list and ebook page with an eye icon 👁️ for a page seen, and a dowload icon 📥✅ for downloaded ones.
Further down the line, it could even become a sorting filter to hide seen/downloaded ebooks.
This will help anyone willing to read new books to sort out the ones they have already seen before.
No response
Sometimes, it feels quite random, the internal reader scrolls to the beginning of the book. Maybe I'm doing something accidently with touch movements, but I wasn't able to reliably reproduce the behavior. It happened twice to me in two days.
This in combination of the lack of a progress indicator makes the internal reader almost unusable for me.
Only scroll to the beginning of the book in well defined cases and don't let such an action be easily triggered on accident.
It scrolls to the beginning of the book unexpectedly.
OnePlus 7T
LineageOS 21
3.0.0
No response
No response
TalkBack should read a useful label for each item, e.g. categories, downloads and settings.
The screen reader only recognizes a label for the start item. The other items in the navigation are spoken as "unknown" or some nonsense text, in case that automatic icon descriptions are enabled in TalkBack's settings.
Google Pixel 6
Android 14
2.9.0
No response
No response
Reading digital content often causes eye strain, especially during low-light conditions. The app lacks a sepia theme option, which is known to reduce eye strain while maintaining readability.
Requesting a sepia theme for the app. Sepia tones offer a soothing reading experience, imitating aged paper and providing a comfortable contrast between text and background.
Users who read extensively, especially at night, will benefit from reduced eye strain. The sepia theme offers a visually appealing and comfortable reading experience, aligning with current trends for eye-friendly interfaces.
Research supports sepia themes for minimizing blue light's negative effects on sleep patterns. Adding this feature could enhance user satisfaction, attract more users, and increase app usage.
hi! the app is beautiful, yet im missing books with other languages
maybe i just cant find it, but i cant sort by language or generally read any books that are not in english
gutenberg.org i.e. does have russian books but theyre not in myne
would be cool if this was a feature, thanks!
Catch API errors properly & show relevant error messages.
The internal reader of the app doesn't give any indication of how far we have progressed within the book.
One of the following:
It will let me and everyone else know how far they have progressed within the book and how much of the book is still left to be read.
The internal reader of the app looks really nice so I would prefer to use it instead lf just switching to some external reader.
As title suggest, It would be nice if it can be implemented or atleast change the default storage location to somewhere in Home directory(or whatever it's called in android) rather than in Download or Documents.
I request this because I sync them to another system with syncthing & don't want directories that don't use regularly to be in there, since the books can be read from inside Myne & we can always copy the files if we need them somewhere else.
Build version: 2.4.0
Current date: 2023-08-15 22:30:01
Device: OnePlus GM1911
OS version: Android 13 (SDK 33)
Stack trace:
java.io.FileNotFoundException: /external_files/Books/meditations emperor-of rome marcus aurelius hays.epub: open failed: ENOENT (No such file or directory)
at libcore.io.IoBridge.open(IoBridge.java:574)
at java.io.FileInputStream.(FileInputStream.java:160)
at java.io.FileInputStream.(FileInputStream.java:115)
at z7.d$b.k(Unknown Source:7)
at z7.d$b.r0(Unknown Source:12)
at ac.x.v(Unknown Source:4)
at a4.a.q0(Unknown Source:71)
at z7.d.a(Unknown Source:67)
at q8.f.k(Unknown Source:39)
at m9.a.q(Unknown Source:8)
at lc.k0.run(Unknown Source:100)
at kotlinx.coroutines.internal.f.run(Unknown Source:11)
at kotlinx.coroutines.scheduling.j.run(Unknown Source:2)
at kotlinx.coroutines.scheduling.a$a.run(Unknown Source:78)
Suppressed: b5.e: [s1{Cancelling}@4a088b5, Dispatchers.IO]
Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)
at libcore.io.Linux.open(Native Method)
at libcore.io.ForwardingOs.open(ForwardingOs.java:563)
at libcore.io.BlockGuardOs.open(BlockGuardOs.java:274)
at libcore.io.ForwardingOs.open(ForwardingOs.java:563)
at android.app.ActivityThread$AndroidOs.open(ActivityThread.java:7808)
at libcore.io.IoBridge.open(IoBridge.java:560)
... 13 more
When I try to open an ebook from the launcher, myne crashes instantly.
If it is possible, add opportunity to open epub, fb2, or other formats. All these formats contain metadata to display names, authors, and book covers.
Add some unit tests for backend stuffs like API class, paginator, epub parser etc.
As i understand it, the search engine only allows searching by author and title, but i wanted to search about thematics.
For example i want books about astrology, but if i search for astrology, there is only wne book that pops up, which contains Astrology in its name, whereas if i search for stars or constellation i can see many books with Astrology labeled as one of the thematics fwr these books.
Being able to search by thematics.
More search option will allow us to discover even more books and fulfill more precise needs.
No response
if someone prefers to use a different reader app they can disable it from settings, as it may be confusing for some people to understand if they don't have any ebook reader apps installed on their device.
Reference: https://t.me/PotApps/7526
Improve book details page further and add a book download progress indicator.
Standard Ebooks provides project gutenberg books with standardized formatting, various editorial tweaks, and rich metadata. They also provide OPDS feeds to browse their collection. Apparently, this is locked behind a Patreon donation, but Foliate sources from SE so I assume they make an exception for FOSS projects.
restart app
error like the pictureshow the book screen
for reading
for every books I take this error
Xiaomi M2010J19CI
Android 12
2.6.0
Build version: 2.6.0
Current date: 2023-11-06 18:54:23
Device: Xiaomi M2010J19CI
OS version: Android 12 (SDK 31)
Stack trace:
org.json.JSONException: Value <!DOCTYPE of type java.lang.String cannot be converted to JSONObject
at org.json.JSON.typeMismatch(JSON.java:112)
at org.json.JSONObject.<init>(JSONObject.java:172)
at org.json.JSONObject.<init>(JSONObject.java:185)
at q7.j.f(Unknown Source:7)
at q7.d.a(Unknown Source:23)
at kc.g.run(Unknown Source:42)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644)
at java.lang.Thread.run(Thread.java:1012)
No response
Hii can you please add light novel also: https://github.com/dipu-bd/lightnovel-crawler
After update to 1.1.0, when opening the home page or a category page the loading spinner appears for a while then the app crashes. If I switch to the main category page, library page, or settings page quick enough the crash does not occur.
Android 13/One UI 5
This is happening because apparently the gutendex API the app uses seems to be down, see garethbjohnson/gutendex#28
I'll keep this issue open until next release or until gutendex API comes back online.
Currently (as of 2023-03-16) i can find books either by category or by "text search"
It would be great to have the possibility to see only books that are in a language that i can read.
Book thematics are shown on the scrollable book list but aren't on the book page. I thought maybe i could see the whole list of thematics it fell into but i couldn't.
Show the categories/thematics on the book page.
Seeing some information on the book list and not on the book page is misleading, so people won't be mislead.
At first i thought these categories might be explorable, might be available filters for my search. Couldn't find if they were, but ran into this issue nonetheless!
https://archive.org/details/texts
https://openlibrary.org/
Suggest creating a group at https://rvlt.gg
Gutenberg has a lack of selection
Add ability to use custom sources for books
This will greatly increase the scope of the application
No response
Epub file will open and can be read
App crashes immediately
Samsung Galaxy 23
Android 14
2.8.0
Build version: 2.8.0
Current date: 2024-01-26 14:01:32
Device: Samsung SM-S916U
OS version: Android 14 (SDK 34)
Stack trace:
java.lang.Exception: .opf metadata title tag missing
at s7.h.l(Unknown Source:862)
at g9.a.s(Unknown Source:8)
at ec.f0.run(Unknown Source:112)
at lc.a.run(Unknown Source:91)
Suppressed: jc.f: [p1{Cancelling}@8343a91, Dispatchers.IO]
The .epub file was lifted from https://archive.org/details/RMCG0002
Through the system TTS engine, read the book aloud
I coudn't find the language button for a while when familarizing myself with UI
Version 2.8.1 from f droid
The search bar stays open beetween changing states home <-> categories and doesn't reveal the language sort
Language button isn't hidden when searching
Other worse solutions:
Change language on start up and change in the settings
Collapse search bar on screen transitions
It will be less confusing on first experience
Use the new splash screen API to avoid two splash screens (one by system and one by app) on Android 12 and above.
Add a basic yet functional inbuilt ebook reader while also having option to open epub files with other apps.
Libgen and Scihub should be incorporated into myne and not only project Gutenberg.
Language selection is not kept while the app is relaunched
I would like that language selection could be maintained between different sessions
We would not have to change the selection everytime we use the app
Thanks for job already done !
(And sorry for my English)
Currently we are calling methods to load API data directly in composeables, it can may cause duplicate API requests whenever screen recomposes due to any changes in mutable states the screen is observing, this can be solved by making API calls inside scope of LaunchedEffect
with a fixed key eg: true
, which will not change on recompositions and avoid duplicate API calls.
This is very nice client for accessing books available in public domain. Adding support for Public Domain Audiobooks could really improve the app further.
When there are lots of item in book library fetching and validating epub files can take quite sometime and blocks the main thread, which can cause choppy animations and make UI feel laggy. This can be fixed by moving file validation code inside viewmodel's coroutine scope and adding a kind of progress bar in library screen while it's validating ebook files.
The message (i believe it's called a toast box or something ?) should stay long enough on the screen for the user to read it.
A message appears for a flash second while the button is seemingly activated, but disapears as soon as the button appears to revert back to its inactivated state.
No response
Android 11
1.5.0
No response
It might be because the message is automatically hidden when the app "reverts" back the buton and UI to its previous state, although it didn't change the UI to begin with.
Shouldn't crash and open book normally in 1st scenario, whereas should show network error screen instead of crash on 2nd case.
Crashes in both cases as of now.
Redmi Note 9 Pro
Android 13
1.8.0
Current date: 2023-04-01 07:48:33
Device: Xiaomi Redmi Note 10 Lite
OS version: Android 13 (SDK 33)
Stack trace:
java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.List com.starry.myne.api.models.BookSet.getBooks()' on a null object reference
at com.starry.myne.ui.screens.home.viewmodels.HomeViewModel$g.k(SourceFile:8)
at com.starry.myne.ui.screens.home.viewmodels.HomeViewModel$g.S(SourceFile:24)
at b8.e.a(SourceFile:164)
at b8.e$a.k(Unknown Source:11)
at j9.a.t(Unknown Source:8)
at hc.k0.run(Unknown Source:100)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7913)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:942)
N/A
When i try to download "Tractatus Logico-Philosophicus" I get a null pointer exception.
Device Android-10
Manufacturer LG
App 1.4.0 (2023-03-11) downloaded from izzy repository
Also reproducable with current sourcecode (as of 2023-03-15) build from https://github.com/Pool-Of-Tears/Myne/
reason: in BookDownloader.kt:51 val uri = Uri.parse(book.formats.applicationepubzip) applicationepubzip is null
Book(id=5740, title=Tractatus Logico-Philosophicus, authors=[Author(name=Wittgenstein, Ludwig, birthYear=1889, deathYear=1951)], translators=[Translator(name=Ogden, C. K. (Charles Kay), birthYear=1889, deathYear=1957)], subjects=[Language and languages -- Philosophy, Logic, Symbolic and mathematical], bookshelves=[DE Sachbuch, Mathematics, Philosophy], languages=[de, en], copyright=false, mediaType=Text, formats=Formats(textplain=null, applicationxMobipocketEbook=null, texthtml=null, applicationoctetStream=https://www.gutenberg.org/files/5740/5740-page-images/f0001.png, textplainCharsetusAscii=null, applicationepubzip=null, imagejpeg=https://www.gutenberg.org/cache/epub/5740/pg5740.cover.medium.jpg, applicationrdfxml=https://www.gutenberg.org/ebooks/5740.rdf, texthtmlCharsetiso88591=null, texthtmlCharsetutf8=null, textplainCharsetutf8=null, textplainCharsetiso88591=null), downloadCount=4386)
Logcat
2023-03-15 13:03:40.331 13563-13563 MainActivity::Storage com.starry.myne.dev D Permission is granted 2023-03-15 13:03:40.366 13563-13563 AndroidRuntime com.starry.myne.dev E FATAL EXCEPTION: main Process: com.starry.myne.dev, PID: 13563 java.lang.NullPointerException: uriString at android.net.Uri$StringUri.(Uri.java:496) at android.net.Uri$StringUri.(Uri.java:486) at android.net.Uri.parse(Uri.java:458) at com.starry.myne.others.BookDownloader.downloadBook(BookDownloader.kt:51) at com.starry.myne.ui.screens.home.viewmodels.BookDetailViewModel.downloadBook(BookDetailViewModel.kt:82) at com.starry.myne.ui.screens.home.composables.BookDetailScreenKt$BookDetailScreen$2$1$4$3.invoke(BookDetailScreen.kt:336) at com.starry.myne.ui.screens.home.composables.BookDetailScreenKt$BookDetailScreen$2$1$4$3.invoke(BookDetailScreen.kt:300) at com.starry.myne.ui.screens.home.composables.BookDetailScreenKt$MiddleBar$1$3$1.invoke(BookDetailScreen.kt:522) at com.starry.myne.ui.screens.home.composables.BookDetailScreenKt$MiddleBar$1$3$1.invoke(BookDetailScreen.kt:522) at androidx.compose.foundation.ClickableKt$clickable$4$gesture$1$1$2.invoke-k-4lQ0M(Clickable.kt:167) at androidx.compose.foundation.ClickableKt$clickable$4$gesture$1$1$2.invoke(Clickable.kt:156) at androidx.compose.foundation.gestures.TapGestureDetectorKt$detectTapAndPress$2$1.invokeSuspend(TapGestureDetector.kt:255) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTaskKt.resume(DispatchedTask.kt:178) at kotlinx.coroutines.DispatchedTaskKt.dispatch(DispatchedTask.kt:166) at kotlinx.coroutines.CancellableContinuationImpl.dispatchResume(CancellableContinuationImpl.kt:397) at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl(CancellableContinuationImpl.kt:431) at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl$default(CancellableContinuationImpl.kt:420) at kotlinx.coroutines.CancellableContinuationImpl.resumeWith(CancellableContinuationImpl.kt:328) at androidx.compose.ui.input.pointer.SuspendingPointerInputFilter$PointerEventHandlerCoroutine.offerPointerEvent(SuspendingPointerInputFilter.kt:566) at androidx.compose.ui.input.pointer.SuspendingPointerInputFilter.dispatchPointerEvent(SuspendingPointerInputFilter.kt:456) at androidx.compose.ui.input.pointer.SuspendingPointerInputFilter.onPointerEvent-H0pRuoY(SuspendingPointerInputFilter.kt:469) at androidx.compose.ui.node.BackwardsCompatNode.onPointerEvent-H0pRuoY(BackwardsCompatNode.kt:374) at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(HitPathTracker.kt:314) at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(HitPathTracker.kt:301) at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(HitPathTracker.kt:301) at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(HitPathTracker.kt:301) at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(HitPathTracker.kt:301) at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(HitPathTracker.kt:301) at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(HitPathTracker.kt:301) at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(HitPathTracker.kt:301) at androidx.compose.ui.input.pointer.NodeParent.dispatchMainEventPass(HitPathTracker.kt:183) at androidx.compose.ui.input.pointer.HitPathTracker.dispatchChanges(HitPathTracker.kt:102) at androidx.compose.ui.input.pointer.PointerInputEventProcessor.process-BIzXfog(PointerInputEventProcessor.kt:98) at androidx.compose.ui.platform.AndroidComposeView.sendMotionEvent-8iAsVTc(AndroidComposeView.android.kt:1357) at androidx.compose.ui.platform.AndroidComposeView.handleMotionEvent-8iAsVTc(AndroidComposeView.android.kt:1303) at androidx.compose.ui.platform.AndroidComposeView.dispatchTouchEvent(AndroidComposeView.android.kt:1242) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3142) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2834) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3142) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2834) 2023-03-15 13:03:40.370 13563-13563 AndroidRuntime com.starry.myne.dev E at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3142) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2834) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3142) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2834) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3142) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2834) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3142) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2834) at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:495) at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1868) at android.app.Activity.dispatchTouchEvent(Activity.java:4022) at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:70) at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:453) at android.view.View.dispatchPointerEvent(View.java:14261) at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5919) at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:5722) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5169) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5222) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5188) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5196) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5169) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5222) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5188) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5344) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5196) at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:5401) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5169) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5222) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5188) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5196) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5169) at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:8018) at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:7985) at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:7946) at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:8172) at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:189) at android.os.MessageQueue.nativePollOnce(Native Method) at android.os.MessageQueue.next(MessageQueue.java:336) at android.os.Looper.loop(Looper.java:174) at android.app.ActivityThread.main(ActivityThread.java:7615) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:964) Suppressed: kotlinx.coroutines.DiagnosticCoroutineContextException: [androidx.compose.ui.platform.MotionDurationScaleImpl@1411474, androidx.compose.runtime.BroadcastFrameClock@2a93d9d, StandaloneCoroutine{Cancelling}@7434212, AndroidUiDispatcher@1b0cde3]
Some ppl can't focus while reading, this feature helps some to focus.
A Setting to Enable/Disable Bionic Reading
Bionic Reading is a nice to have feature.
Millions of people have also been reacting to bionic reading on social media, and many people with dyslexia and ADHD have said bionic reading helps them focus.
No response
i think the default reading font is terrible, at least it's hard to read for me.
more Font Family like Inter, OpenDylexia, Arial and Device Fonts.
Customizabilty, some can just use the font that works the best for them. / Better Readabilty.
No response
I've just noticed your app has the android:usesCleartextTraffic
flag set – which is only needed if you have to access sites without SSL/https. As Gutenberg supports HTTPS, I wonder what for the flag needs to be declared. Can you please shed some light? Thanks in advance!
Myne 1.4.0 Crashes almost immediately
Activity swirl for a second or 3 .. then crash
Tried tapping on different bottom buttons Home ___ Library ___,
no difference.
2 different fones:
Sams s5 andriod 6.0.1
MotoEdge2022 andriod 12
Try to improve mapping between google books API and Gutenberg further by manually investigating some book titles and adjusting parameters accordingly.
When you try to download a book with filesystem forbidden characters in its name. And it keeps trying and trying. An example Oscar Wilde's The Importance of Being Earnest: A Trivial Comedy for Serious People.
The link is: https://www.gutenberg.org/ebooks/844
Using GitHub releases.
The title of a book shold always be rendered in full.
Well, it isnt'.
Some names are even too long for landscape mode:
No response
Android 11
1.5.0
No response
No response
it's absolutely necessary for me to be able to translate the whole chapter.
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.