This is the source code of the KManga site.
With KManga you can subscribe and receive manga directly in your Kindle.
KManga site
License: GNU General Public License v3.0
This is the source code of the KManga site.
With KManga you can subscribe and receive manga directly in your Kindle.
I really enjoy the Kmanga app/site and don't want to stop the use. I can read in English of course but it's easier in my mother language. How I can help you?
thanks for this project, was greatest. now i tried to use it on heroku, when i deploy it throws an error
"You're using the staticfiles app without having set the STATIC_ROOT setting #48"
so i add this to settings.py
STATIC_ROOT =os.path.join(BASE_DIR, 'static')
after that deploy was successful but on app it says Application error check logs.
Here is the logs. i would be appreciated if someone help me. Thanks
-----> Python app detected
-----> Installing python-3.6.9
-----> Installing pip
-----> Installing SQLite3
-----> Installing requirements with pip
Collecting Django==2.0.6 (from -r /tmp/build_957eb7b73e9314a7e7e9bdf6a1c33b8e/requirements/base.txt (line 1))
Downloading https://files.pythonhosted.org/packages/56/0e/afdacb47503b805f3ed213fe732bff05254c8befaa034bbada580be8a0ac/Django-2.0.6-py3-none-any.whl (7.1MB)
Collecting django-rq==1.3.1 (from -r /tmp/build_957eb7b73e9314a7e7e9bdf6a1c33b8e/requirements/base.txt (line 2))
Downloading https://files.pythonhosted.org/packages/4a/83/23de75cf067c72b64bbe624ac6308d5e774b019c4cb60ad7fe8d16be7bc3/django_rq-1.3.1-py2.py3-none-any.whl (50kB)
Collecting easy-thumbnails==2.5 (from -r /tmp/build_957eb7b73e9314a7e7e9bdf6a1c33b8e/requirements/base.txt (line 3))
Downloading https://files.pythonhosted.org/packages/5a/50/15211bfae0096feced4b97c69e76f01758c6ceac802ee468f7d478d43c5d/easy-thumbnails-2.5.tar.gz (67kB)
Collecting Pillow==5.1.0 (from -r /tmp/build_957eb7b73e9314a7e7e9bdf6a1c33b8e/requirements/base.txt (line 4))
Downloading https://files.pythonhosted.org/packages/5f/4b/8b54ab9d37b93998c81b364557dff9f61972c0f650efa0ceaf470b392740/Pillow-5.1.0-cp36-cp36m-manylinux1_x86_64.whl (2.0MB)
Collecting psycopg2-binary==2.7.4 (from -r /tmp/build_957eb7b73e9314a7e7e9bdf6a1c33b8e/requirements/base.txt (line 5))
Downloading https://files.pythonhosted.org/packages/5f/0b/aa7078d3f6d27d951c38b6a1f4b99b71b2caecebb2921b2d808b5bf0e2e0/psycopg2_binary-2.7.4-cp36-cp36m-manylinux1_x86_64.whl (2.7MB)
Collecting Scrapy==1.5.0 (from -r /tmp/build_957eb7b73e9314a7e7e9bdf6a1c33b8e/requirements/base.txt (line 6))
Downloading https://files.pythonhosted.org/packages/db/9c/cb15b2dc6003a805afd21b9b396e0e965800765b51da72fe17cf340b9be2/Scrapy-1.5.0-py2.py3-none-any.whl (251kB)
Collecting service-identity==17.0.0 (from -r /tmp/build_957eb7b73e9314a7e7e9bdf6a1c33b8e/requirements/base.txt (line 7))
Downloading https://files.pythonhosted.org/packages/29/fa/995e364220979e577e7ca232440961db0bf996b6edaf586a7d1bd14d81f1/service_identity-17.0.0-py2.py3-none-any.whl
Collecting spidermonkey==58.0a1.post2 (from -r /tmp/build_957eb7b73e9314a7e7e9bdf6a1c33b8e/requirements/base.txt (line 8))
Downloading https://files.pythonhosted.org/packages/78/93/916cd3f5563ee989251a8e1db17575de803765da8325e5ca55e226a8dca7/spidermonkey-58.0a1.post2.tar.gz (20.3MB)
Collecting pytz (from Django==2.0.6->-r /tmp/build_957eb7b73e9314a7e7e9bdf6a1c33b8e/requirements/base.txt (line 1))
Downloading https://files.pythonhosted.org/packages/e7/f9/f0b53f88060247251bf481fa6ea62cd0d25bf1b11a87888e53ce5b7c8ad2/pytz-2019.3-py2.py3-none-any.whl (509kB)
Collecting redis>=3 (from django-rq==1.3.1->-r /tmp/build_957eb7b73e9314a7e7e9bdf6a1c33b8e/requirements/base.txt (line 2))
Downloading https://files.pythonhosted.org/packages/cc/ed/c7447328a3d9fb26961ca4ee877629a9514705b9442d3179456cb860c70f/redis-3.3.10-py2.py3-none-any.whl (66kB)
Collecting rq<1.0,>=0.13 (from django-rq==1.3.1->-r /tmp/build_957eb7b73e9314a7e7e9bdf6a1c33b8e/requirements/base.txt (line 2))
Downloading https://files.pythonhosted.org/packages/73/49/ab50a9277231f9d2cb74575869ce70f428e608a4bc92678ad7b4c1a64f32/rq-0.13.0-py2.py3-none-any.whl (54kB)
Collecting six>=1.5.2 (from Scrapy==1.5.0->-r /tmp/build_957eb7b73e9314a7e7e9bdf6a1c33b8e/requirements/base.txt (line 6))
Downloading https://files.pythonhosted.org/packages/73/fb/00a976f728d0d1fecfe898238ce23f502a721c0ac0ecfedb80e0d88c64e9/six-1.12.0-py2.py3-none-any.whl
Collecting PyDispatcher>=2.0.5 (from Scrapy==1.5.0->-r /tmp/build_957eb7b73e9314a7e7e9bdf6a1c33b8e/requirements/base.txt (line 6))
Downloading https://files.pythonhosted.org/packages/cd/37/39aca520918ce1935bea9c356bcbb7ed7e52ad4e31bff9b943dfc8e7115b/PyDispatcher-2.0.5.tar.gz
Collecting parsel>=1.1 (from Scrapy==1.5.0->-r /tmp/build_957eb7b73e9314a7e7e9bdf6a1c33b8e/requirements/base.txt (line 6))
Downloading https://files.pythonhosted.org/packages/86/c8/fc5a2f9376066905dfcca334da2a25842aedfda142c0424722e7c497798b/parsel-1.5.2-py2.py3-none-any.whl
Collecting pyOpenSSL (from Scrapy==1.5.0->-r /tmp/build_957eb7b73e9314a7e7e9bdf6a1c33b8e/requirements/base.txt (line 6))
Downloading https://files.pythonhosted.org/packages/01/c8/ceb170d81bd3941cbeb9940fc6cc2ef2ca4288d0ca8929ea4db5905d904d/pyOpenSSL-19.0.0-py2.py3-none-any.whl (53kB)
Collecting Twisted>=13.1.0 (from Scrapy==1.5.0->-r /tmp/build_957eb7b73e9314a7e7e9bdf6a1c33b8e/requirements/base.txt (line 6))
Downloading https://files.pythonhosted.org/packages/14/49/eb654da38b15285d1f594933eefff36ce03106356197dba28ee8f5721a79/Twisted-19.7.0-cp36-cp36m-manylinux1_x86_64.whl (3.1MB)
Collecting queuelib (from Scrapy==1.5.0->-r /tmp/build_957eb7b73e9314a7e7e9bdf6a1c33b8e/requirements/base.txt (line 6))
Downloading https://files.pythonhosted.org/packages/4c/85/ae64e9145f39dd6d14f8af3fa809a270ef3729f3b90b3c0cf5aa242ab0d4/queuelib-1.5.0-py2.py3-none-any.whl
Collecting cssselect>=0.9 (from Scrapy==1.5.0->-r /tmp/build_957eb7b73e9314a7e7e9bdf6a1c33b8e/requirements/base.txt (line 6))
Downloading https://files.pythonhosted.org/packages/3b/d4/3b5c17f00cce85b9a1e6f91096e1cc8e8ede2e1be8e96b87ce1ed09e92c5/cssselect-1.1.0-py2.py3-none-any.whl
Collecting w3lib>=1.17.0 (from Scrapy==1.5.0->-r /tmp/build_957eb7b73e9314a7e7e9bdf6a1c33b8e/requirements/base.txt (line 6))
Downloading https://files.pythonhosted.org/packages/6a/45/1ba17c50a0bb16bd950c9c2b92ec60d40c8ebda9f3371ae4230c437120b6/w3lib-1.21.0-py2.py3-none-any.whl
Collecting lxml (from Scrapy==1.5.0->-r /tmp/build_957eb7b73e9314a7e7e9bdf6a1c33b8e/requirements/base.txt (line 6))
Downloading https://files.pythonhosted.org/packages/ec/be/5ab8abdd8663c0386ec2dd595a5bc0e23330a0549b8a91e32f38c20845b6/lxml-4.4.1-cp36-cp36m-manylinux1_x86_64.whl (5.8MB)
Collecting attrs (from service-identity==17.0.0->-r /tmp/build_957eb7b73e9314a7e7e9bdf6a1c33b8e/requirements/base.txt (line 7))
Downloading https://files.pythonhosted.org/packages/6b/e8/2ecaf86b128a34e225807f03b22664302937ab826bd3b7eccab6754d29ea/attrs-19.2.0-py2.py3-none-any.whl (40kB)
Collecting pyasn1-modules (from service-identity==17.0.0->-r /tmp/build_957eb7b73e9314a7e7e9bdf6a1c33b8e/requirements/base.txt (line 7))
Downloading https://files.pythonhosted.org/packages/52/50/bb4cefca37da63a0c52218ba2cb1b1c36110d84dcbae8aa48cd67c5e95c2/pyasn1_modules-0.2.7-py2.py3-none-any.whl (131kB)
Collecting pyasn1 (from service-identity==17.0.0->-r /tmp/build_957eb7b73e9314a7e7e9bdf6a1c33b8e/requirements/base.txt (line 7))
Downloading https://files.pythonhosted.org/packages/a1/71/8f0d444e3a74e5640a3d5d967c1c6b015da9c655f35b2d308a55d907a517/pyasn1-0.4.7-py2.py3-none-any.whl (76kB)
Collecting click>=5.0 (from rq<1.0,>=0.13->django-rq==1.3.1->-r /tmp/build_957eb7b73e9314a7e7e9bdf6a1c33b8e/requirements/base.txt (line 2))
Downloading https://files.pythonhosted.org/packages/fa/37/45185cb5abbc30d7257104c434fe0b07e5a195a6847506c074527aa599ec/Click-7.0-py2.py3-none-any.whl (81kB)
Collecting cryptography>=2.3 (from pyOpenSSL->Scrapy==1.5.0->-r /tmp/build_957eb7b73e9314a7e7e9bdf6a1c33b8e/requirements/base.txt (line 6))
Downloading https://files.pythonhosted.org/packages/97/18/c6557f63a6abde34707196fb2cad1c6dc0dbff25a200d5044922496668a4/cryptography-2.7-cp34-abi3-manylinux1_x86_64.whl (2.3MB)
Collecting incremental>=16.10.1 (from Twisted>=13.1.0->Scrapy==1.5.0->-r /tmp/build_957eb7b73e9314a7e7e9bdf6a1c33b8e/requirements/base.txt (line 6))
Downloading https://files.pythonhosted.org/packages/f5/1d/c98a587dc06e107115cf4a58b49de20b19222c83d75335a192052af4c4b7/incremental-17.5.0-py2.py3-none-any.whl
Collecting zope.interface>=4.4.2 (from Twisted>=13.1.0->Scrapy==1.5.0->-r /tmp/build_957eb7b73e9314a7e7e9bdf6a1c33b8e/requirements/base.txt (line 6))
Downloading https://files.pythonhosted.org/packages/19/17/1d198a6aaa9aa4590862fe3d3a2ed7dd808050cab4eebe8a2f2f813c1376/zope.interface-4.6.0-cp36-cp36m-manylinux1_x86_64.whl (167kB)
Collecting PyHamcrest>=1.9.0 (from Twisted>=13.1.0->Scrapy==1.5.0->-r /tmp/build_957eb7b73e9314a7e7e9bdf6a1c33b8e/requirements/base.txt (line 6))
Downloading https://files.pythonhosted.org/packages/9a/d5/d37fd731b7d0e91afcc84577edeccf4638b4f9b82f5ffe2f8b62e2ddc609/PyHamcrest-1.9.0-py2.py3-none-any.whl (52kB)
Collecting constantly>=15.1 (from Twisted>=13.1.0->Scrapy==1.5.0->-r /tmp/build_957eb7b73e9314a7e7e9bdf6a1c33b8e/requirements/base.txt (line 6))
Downloading https://files.pythonhosted.org/packages/b9/65/48c1909d0c0aeae6c10213340ce682db01b48ea900a7d9fce7a7910ff318/constantly-15.1.0-py2.py3-none-any.whl
Collecting hyperlink>=17.1.1 (from Twisted>=13.1.0->Scrapy==1.5.0->-r /tmp/build_957eb7b73e9314a7e7e9bdf6a1c33b8e/requirements/base.txt (line 6))
Downloading https://files.pythonhosted.org/packages/7f/91/e916ca10a2de1cb7101a9b24da546fb90ee14629e23160086cf3361c4fb8/hyperlink-19.0.0-py2.py3-none-any.whl
Collecting Automat>=0.3.0 (from Twisted>=13.1.0->Scrapy==1.5.0->-r /tmp/build_957eb7b73e9314a7e7e9bdf6a1c33b8e/requirements/base.txt (line 6))
Downloading https://files.pythonhosted.org/packages/a3/86/14c16bb98a5a3542ed8fed5d74fb064a902de3bdd98d6584b34553353c45/Automat-0.7.0-py2.py3-none-any.whl
Collecting cffi!=1.11.3,>=1.8 (from cryptography>=2.3->pyOpenSSL->Scrapy==1.5.0->-r /tmp/build_957eb7b73e9314a7e7e9bdf6a1c33b8e/requirements/base.txt (line 6))
Downloading https://files.pythonhosted.org/packages/5f/bf/6aa1925384c23ffeb579e97a5569eb9abce41b6310b329352b8252cee1c3/cffi-1.12.3-cp36-cp36m-manylinux1_x86_64.whl (430kB)
Collecting asn1crypto>=0.21.0 (from cryptography>=2.3->pyOpenSSL->Scrapy==1.5.0->-r /tmp/build_957eb7b73e9314a7e7e9bdf6a1c33b8e/requirements/base.txt (line 6))
Downloading https://files.pythonhosted.org/packages/6e/1e/fb0e487b5229e5fb7b15c6d00b4e8082a3414fe62b1da4c9a905b106e672/asn1crypto-1.1.0-py2.py3-none-any.whl (103kB)
Collecting idna>=2.5 (from hyperlink>=17.1.1->Twisted>=13.1.0->Scrapy==1.5.0->-r /tmp/build_957eb7b73e9314a7e7e9bdf6a1c33b8e/requirements/base.txt (line 6))
Downloading https://files.pythonhosted.org/packages/14/2c/cd551d81dbe15200be1cf41cd03869a46fe7226e7450af7a6545bfc474c9/idna-2.8-py2.py3-none-any.whl (58kB)
Collecting pycparser (from cffi!=1.11.3,>=1.8->cryptography>=2.3->pyOpenSSL->Scrapy==1.5.0->-r /tmp/build_957eb7b73e9314a7e7e9bdf6a1c33b8e/requirements/base.txt (line 6))
Downloading https://files.pythonhosted.org/packages/68/9e/49196946aee219aead1290e00d1e7fdeab8567783e83e1b9ab5585e6206a/pycparser-2.19.tar.gz (158kB)
Installing collected packages: pytz, Django, redis, click, rq, django-rq, Pillow, easy-thumbnails, psycopg2-binary, six, PyDispatcher, lxml, cssselect, w3lib, parsel, pycparser, cffi, asn1crypto, cryptography, pyOpenSSL, incremental, zope.interface, PyHamcrest, constantly, idna, hyperlink, attrs, Automat, Twisted, queuelib, pyasn1, pyasn1-modules, service-identity, Scrapy, spidermonkey
Running setup.py install for easy-thumbnails: started
Running setup.py install for easy-thumbnails: finished with status 'done'
Running setup.py install for PyDispatcher: started
Running setup.py install for PyDispatcher: finished with status 'done'
Running setup.py install for pycparser: started
Running setup.py install for pycparser: finished with status 'done'
Running setup.py install for spidermonkey: started
Running setup.py install for spidermonkey: finished with status 'done'
Successfully installed Automat-0.7.0 Django-2.0.6 Pillow-5.1.0 PyDispatcher-2.0.5 PyHamcrest-1.9.0 Scrapy-1.5.0 Twisted-19.7.0 asn1crypto-1.1.0 attrs-19.2.0 cffi-1.12.3 click-7.0 constantly-15.1.0 cryptography-2.7 cssselect-1.1.0 django-rq-1.3.1 easy-thumbnails-2.5 hyperlink-19.0.0 idna-2.8 incremental-17.5.0 lxml-4.4.1 parsel-1.5.2 psycopg2-binary-2.7.4 pyOpenSSL-19.0.0 pyasn1-0.4.7 pyasn1-modules-0.2.7 pycparser-2.19 pytz-2019.3 queuelib-1.5.0 redis-3.3.10 rq-0.13.0 service-identity-17.0.0 six-1.12.0 spidermonkey-58.0a1.post2 w3lib-1.21.0 zope.interface-4.6.0
-----> $ python kmanga/manage.py collectstatic --noinput
118 static files copied to '/tmp/build_957eb7b73e9314a7e7e9bdf6a1c33b8e/kmanga/static', 22 unmodified.
-----> Discovering process types
Procfile declares types -> (none)
-----> Compressing...
Done: 94.9M
-----> Launching...
Released v5
https://kmng.herokuapp.com/ deployed to Heroku
If I search for e.g. "one punch man", the first three results are portuguese-only results.
The user preferences already contains a "preferred languages" selector, I believe the search results should at least consider that value and sort appropriately.
Possibly even better, I would be able to specify a list of languages I can read and the search could return only those (note in this case the search results should contain a "some results were hidden due to language limitation, click to see everything" link)
I've noticed that sometimes the manga sent to my kindle are not using the correct reading order for Kindle's "Virtual Panel" feature (ref: https://kindlegen.s3.amazonaws.com/AmazonKindlePublishingGuidelines.pdf)
It seems that you can't get the right LR or RL value from the different sources.
Instead would it be possible to leverage something like https://github.com/Ajira-FR/comics-splitter
to get the bounding box co-ordinates for a panel and then set that up as for "Panel View (Region Magnification)" feature (ref: https://kindlegen.s3.amazonaws.com/AmazonKindlePublishingGuidelines.pdf)
I'd love to have different value of number of issues per page in the subscription page, as 25 is really too low for my testes.
It would be nice if it was configurable in the user preferences.
PS. Thank you for the great service!!
My kindle is flooded with Docs. I would be nice to send a book and keep adding chapters to it.
In the list of subscriptions (i.e. /kmanga/subscription/
) completed manga (with "issues sent" == "total issues") are interleaved to ongoing ones, despite usually being less interesting than the ongoing ones.
Therefore I'd like to propose adding a clear mark for the ended ones, so when they are mixed I can quickly visually distinguish them.
When updating the list of chapters from Batoto, new chapters are put in-between already existing chapters, as such:
Notice how 82 and 83 are in the wrong order. Before I updated it, 81 was the latest chapter from Batoto.
Unsubscribing and resubscribing does not resolve the issue. This manga is being published as of filing this bug.
Lately I've been trying to set up kmanga on my own server, unfortunately I've run into some problems
root@pixelggamer:~/kmanga# kmanga/manage.py makemigrations Traceback (most recent call last): File "kmanga/manage.py", line 22, in <module> execute_from_command_line(sys.argv) File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 363, in execute_from_command_line utility.execute() File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 355, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 283, in run_from_argv self.execute(*args, **cmd_options) File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 327, in execute self.check() File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 359, in check include_deployment_checks=include_deployment_checks, File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 346, in _run_checks return checks.run_checks(**kwargs) File "/usr/local/lib/python2.7/dist-packages/django/core/checks/registry.py", line 81, in run_checks new_errors = check(app_configs=app_configs) File "/usr/local/lib/python2.7/dist-packages/django/core/checks/urls.py", line 16, in check_url_config return check_resolver(resolver) File "/usr/local/lib/python2.7/dist-packages/django/core/checks/urls.py", line 26, in check_resolver return check_method() File "/usr/local/lib/python2.7/dist-packages/django/urls/resolvers.py", line 254, in check for pattern in self.url_patterns: File "/usr/local/lib/python2.7/dist-packages/django/utils/functional.py", line 35, in __get__ res = instance.__dict__[self.name] = self.func(instance) File "/usr/local/lib/python2.7/dist-packages/django/urls/resolvers.py", line 405, in url_patterns patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module) File "/usr/local/lib/python2.7/dist-packages/django/utils/functional.py", line 35, in __get__ res = instance.__dict__[self.name] = self.func(instance) File "/usr/local/lib/python2.7/dist-packages/django/urls/resolvers.py", line 398, in urlconf_module return import_module(self.urlconf_name) File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module __import__(name) File "/root/kmanga/kmanga/kmanga/urls.py", line 32, in <module> url(r'^kmanga/', include('core.urls')), File "/usr/local/lib/python2.7/dist-packages/django/conf/urls/__init__.py", line 50, in include urlconf_module = import_module(urlconf_module) File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module __import__(name) File "/root/kmanga/kmanga/core/urls.py", line 3, in <module> from .views import AboutTemplateView File "/root/kmanga/kmanga/core/views.py", line 19, in <module> from .forms import ContactForm File "/root/kmanga/kmanga/core/forms.py", line 8, in <module> from scrapyctl.utils import send File "/root/kmanga/kmanga/scrapyctl/utils.py", line 7, in <module> from scrapyctl.mobictl import create_mobi_and_send File "/root/kmanga/kmanga/scrapyctl/mobictl.py", line 13, in <module> from scrapyctl.emailctl import send_mobi File "/root/kmanga/kmanga/scrapyctl/emailctl.py", line 9, in <module> from mobi.cache import MobiCache ImportError: No module named cache root@pixelggamer:~/kmanga#
I installed all the requirements, I don't know what I am doing wrong, since there is no documentation
First I'd like to say great job with this, really useful.
I have a feature request to add series metadata to the generated ebook files.
This should make it easier for Calibre to manage the automatic collection generation based on the added series metadata.
I think that it would take adding to this block of code:
https://github.com/aplanas/kmanga/blob/master/mobi/mobi.py#L554-L560
The following:
ET.SubElement(metadata, 'meta', {
'property': 'calibre:series'
}).text = self.info.series_name
if isAcceptableCalibreSeriesIndex(self.info.number_in_series):
ET.SubElement(metadata, 'meta', {
'property': 'calibre:series_index'
}).text = self.info.number_in_series
isAcceptableCalibreSeriesIndex returns true if it is a parse-able number else false. I'm not sure what happens in Calibre if you started creating books with "13a" for a series_index though it looks like "11.1" and such is supported (ref: https://manual.calibre-ebook.com/template_lang.html and search "If you use series indices with sub values (e.g., 1.1)")
You would also need to expose these new properties on MobiInfo here:
kmanga/kmanga/scrapyctl/mobictl.py
Line 27 in 535df12
You may also be interested in adding the Mobi3 standard series metadata which is shown here:
dteviot/WebToEpub#1
Though not sure if anyone would immediately benefit.
Thanks, hope you can add this feature.
I am trying to incorporate Marvel and DC Comics sources into the code, but am unable to understand some parts, can anyone look into it? I am a not very versed in python.
In the list of subscriptions (i.e. /kmanga/subscription/
) I can't really tell how things are sorted.
I'm proposing a sorting switch, so I can sort them however I see fit (alphabetically, % remaining, ...).
Having hundreds of chapters in a kindle becomes very difficult to handle. Sending them in ranges would make a lot of sense for longer series.
Since batoto closed this new site has been gaining popularity due to being a similar concept, would be nice to have it as a source.
Thanks for your service!
As a new user, can't register. It says "Whops!"
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.