francodacosta / grav-plugin-page-stats Goto Github PK
View Code? Open in Web Editor NEWbetter page stats for Grav
License: MIT License
better page stats for Grav
License: MIT License
Add a list of IP's to plugin config
those ips will be excluded from processing
see #3
The plugin has this error in log.
grav.ERROR: PageStats plugin : unpack(): Type V: not enough input, need 4, have 0
Also the page "top-countries" appears as "top-countries copy.md" so it generates an error when accessing from the administration panel
Just wanted to let you know that I've tried out the plugin and whenever I activated it, the page load times went from under 100 ms to somewhere between 3 to 8 seconds. Needless to say, I quickly removed it again, but thought I'd let you know.
i have some pages (qr-codes) that redirects to externals urls, i would like konw how often they are used/called
Example:
title: QR-Redirect1
redirect: 'xyz'
the page is called for redirect but not counted
The plugin works really well and is definitely an alternative to Google analytics.
It would add great value:
Would love to be able to ignore any requests for wlwmanifest.xml since the bots are searching every IP in existence for it. I'm sure in 6 months it'll be some other WP vulnerability.
I suppose a regex to add a list of terms to ignore in the display would be the fix there: still record it, just don't include it in stats/calcs.
๐๐
Attempting to install via admin console. Core and all plugins at current rev. Error appears in red popup window after "Dependencies installed" popup:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 177506056 bytes) in /srv/www/[xxxmysite.comxxx]/vendor/symfony/http-client/Response/ResponseTrait.php on line 130 {"error":{"type":"Whoops\\Exception\\ErrorException","message":"Allowed memory size of 134217728 bytes exhausted (tried to allocate 177506056 bytes)","code":1,"file":"\/srv\/www\/[xxxmysite.comxxx]\/vendor\/symfony\/http-client\/Response\/ResponseTrait.php","line":130}}
End result, not installed. ๐ข Re-attempting results in same. Tools/Reports shows green checks for all other config.
Server is nginx, "top" on the machine reports:
MiB Mem : 1978.855 total, 276.793 free, 646.664 used, 1055.398 buff/cache
MiB Swap: 2048.977 total, 1878.227 free, 170.750 used. 1085.695 avail Mem
This plugin looks promising!!
After installing the plugin the menu item 'Page Stats' displays
..../public_html/user/plugins/page-stats/data contains a zip-file: geolocation.sqlite.zip, no sqlite db-file
To investigate I manually extracted 'geolocation.sqlite'
Still no page when I click the menu item.
The plugin is collecting data in user/data/page-data.sqlite
Turning the plugin 'off' and 'on' again does not solve the problem.
Your Readme says
Bot detection is based on user agent, it is not perfect, but it does work well
I would like to be able to configure this. For example, I have UpTimeRobot pinging my website, and I'd like to filter it out.
Workaround: IP filtering (but I don't know if their IP is static)
User Agent: Mozilla/5.0+(compatible; UptimeRobot/2.0; http://www.uptimerobot.com/)
In my statistics, I sometimes find calls to resources absent from the site (managed by a Grav "error 404" page).
An option to limit the calculation of statistics to existing pages or resources would be a good thing.
Every time I visit the site I do get this error logged
Any ideas?
[2023-09-24 18:22:18] grav.CRITICAL: preg_match(): Compilation failed: quantifier does not follow a repeatable item at offset 23 - Trace:
#0 /var/www/virtual/somaweb/html/system/src/Grav/Common/Debugger.php(843): Whoops\Run->handleError(2, 'preg_match(): C...', '/var/www/virtua...', 189)
#1 [internal function]: Grav\Common\Debugger->deprecatedErrorHandler(2, 'preg_match(): C...', '/var/www/virtua...', 189)
#2 /var/www/virtual/somaweb/html/user/plugins/page-stats/page-stats.php(189): preg_match('#.*wp-includes....', 'https://ima-bra...')
#3 /var/www/virtual/somaweb/html/user/plugins/page-stats/page-stats.php(300): Grav\Plugin\PageStatsPlugin->isEnabledForUrl('https://ima-bra...')
#4 /var/www/virtual/somaweb/html/vendor/symfony/event-dispatcher/EventDispatcher.php(264): Grav\Plugin\PageStatsPlugin->onPageInitialized(Object(RocketTheme\Toolbox\Event\Event), 'onPageInitializ...', Object(Symfony\Component\EventDispatcher\EventDispatcher))
#5 /var/www/virtual/somaweb/html/vendor/symfony/event-dispatcher/EventDispatcher.php(239): Symfony\Component\EventDispatcher\EventDispatcher->doDispatch(Array, 'onPageInitializ...', Object(RocketTheme\Toolbox\Event\Event))
#6 /var/www/virtual/somaweb/html/vendor/symfony/event-dispatcher/EventDispatcher.php(73): Symfony\Component\EventDispatcher\EventDispatcher->callListeners(Array, 'onPageInitializ...', Object(RocketTheme\Toolbox\Event\Event))
#7 /var/www/virtual/somaweb/html/system/src/Grav/Common/Grav.php(597): Symfony\Component\EventDispatcher\EventDispatcher->dispatch(Object(RocketTheme\Toolbox\Event\Event), 'onPageInitializ...')
#8 /var/www/virtual/somaweb/html/system/src/Grav/Common/Processors/PagesProcessor.php(60): Grav\Common\Grav->fireEvent('onPageInitializ...', Object(RocketTheme\Toolbox\Event\Event))
#9 /var/www/virtual/somaweb/html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(50): Grav\Common\Processors\PagesProcessor->process(Object(Nyholm\Psr7\ServerRequest), Object(Grav\Framework\RequestHandler\RequestHandler))
#10 /var/www/virtual/somaweb/html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(62): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest))
#11 /var/www/virtual/somaweb/html/system/src/Grav/Common/Processors/TwigProcessor.php(38): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest))
#12 /var/www/virtual/somaweb/html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(50): Grav\Common\Processors\TwigProcessor->process(Object(Nyholm\Psr7\ServerRequest), Object(Grav\Framework\RequestHandler\RequestHandler))
#13 /var/www/virtual/somaweb/html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(62): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest))
#14 /var/www/virtual/somaweb/html/system/src/Grav/Common/Processors/AssetsProcessor.php(39): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest))
#15 /var/www/virtual/somaweb/html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(50): Grav\Common\Processors\AssetsProcessor->process(Object(Nyholm\Psr7\ServerRequest), Object(Grav\Framework\RequestHandler\RequestHandler))
#16 /var/www/virtual/somaweb/html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(62): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest))
#17 /var/www/virtual/somaweb/html/system/src/Grav/Common/Processors/SchedulerProcessor.php(40): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest))
#18 /var/www/virtual/somaweb/html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(50): Grav\Common\Processors\SchedulerProcessor->process(Object(Nyholm\Psr7\ServerRequest), Object(Grav\Framework\RequestHandler\RequestHandler))
#19 /var/www/virtual/somaweb/html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(62): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest))
#20 /var/www/virtual/somaweb/html/system/src/Grav/Common/Processors/BackupsProcessor.php(39): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest))
#21 /var/www/virtual/somaweb/html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(50): Grav\Common\Processors\BackupsProcessor->process(Object(Nyholm\Psr7\ServerRequest), Object(Grav\Framework\RequestHandler\RequestHandler))
#22 /var/www/virtual/somaweb/html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(62): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest))
#23 /var/www/virtual/somaweb/html/system/src/Grav/Common/Processors/TasksProcessor.php(69): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest))
#24 /var/www/virtual/somaweb/html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(50): Grav\Common\Processors\TasksProcessor->process(Object(Nyholm\Psr7\ServerRequest), Object(Grav\Framework\RequestHandler\RequestHandler))
#25 /var/www/virtual/somaweb/html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(62): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest))
#26 /var/www/virtual/somaweb/html/system/src/Grav/Common/Processors/RequestProcessor.php(64): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest))
#27 /var/www/virtual/somaweb/html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(50): Grav\Common\Processors\RequestProcessor->process(Object(Nyholm\Psr7\ServerRequest), Object(Grav\Framework\RequestHandler\RequestHandler))
#28 /var/www/virtual/somaweb/html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(62): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest))
#29 /var/www/virtual/somaweb/html/system/src/Grav/Common/Processors/ThemesProcessor.php(38): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest))
#30 /var/www/virtual/somaweb/html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(50): Grav\Common\Processors\ThemesProcessor->process(Object(Nyholm\Psr7\ServerRequest), Object(Grav\Framework\RequestHandler\RequestHandler))
#31 /var/www/virtual/somaweb/html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(62): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest))
#32 /var/www/virtual/somaweb/html/system/src/Grav/Common/Processors/PluginsProcessor.php(39): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest))
#33 /var/www/virtual/somaweb/html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(50): Grav\Common\Processors\PluginsProcessor->process(Object(Nyholm\Psr7\ServerRequest), Object(Grav\Framework\RequestHandler\RequestHandler))
#34 /var/www/virtual/somaweb/html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(62): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest))
#35 /var/www/virtual/somaweb/html/system/src/Grav/Common/Processors/InitializeProcessor.php(130): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest))
#36 /var/www/virtual/somaweb/html/system/src/Grav/Common/Debugger.php(546): Grav\Common\Processors\InitializeProcessor::Grav\Common\Processors\{closure}()
#37 /var/www/virtual/somaweb/html/system/src/Grav/Common/Processors/InitializeProcessor.php(131): Grav\Common\Debugger->profile(Object(Closure))
#38 /var/www/virtual/somaweb/html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(50): Grav\Common\Processors\InitializeProcessor->process(Object(Nyholm\Psr7\ServerRequest), Object(Grav\Framework\RequestHandler\RequestHandler))
#39 /var/www/virtual/somaweb/html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(62): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest))
#40 /var/www/virtual/somaweb/html/system/src/Grav/Framework/RequestHandler/Middlewares/MultipartRequestSupport.php(40): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest))
#41 /var/www/virtual/somaweb/html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(50): Grav\Framework\RequestHandler\Middlewares\MultipartRequestSupport->process(Object(Nyholm\Psr7\ServerRequest), Object(Grav\Framework\RequestHandler\RequestHandler))
#42 /var/www/virtual/somaweb/html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(62): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest))
#43 /var/www/virtual/somaweb/html/system/src/Grav/Common/Grav.php(312): Grav\Framework\RequestHandler\RequestHandler->handle(Object(Nyholm\Psr7\ServerRequest))
#44 /var/www/virtual/somaweb/html/index.php(47): Grav\Common\Grav->process()
#45 {main} [] []
Hi,
awesome job.
Can you please provide information in README on how it works and whether is compliant with usage in EU regarding cookies / GDPR?
My site is installed in a subpage like https://domain.tld/myblog/, but all links skip the /my-blog
subpage part.
For exemple
The /my-blog
is ignored and links don't work.
First of all thanks for this great plugin!
On development and often in production too I have Grav installed in a subdirectory.
If so the ''view page' and 'view page stats' links on the 'admin/page-stats' page do not have the subdirectory or path in them. They always link to the web root.
For example if I have Grav in 'htdocs/grav' on localhost the URL of the standard 'typography' page is http://localhost/grav/typography
. However the 'view page' link is http://localhost/typography
and the 'view page stats' link is http://localhost/admin/page-stats/page-details?page=/typography
.
IPv6 addresses have no country associated with them but IPv4 addresses do.
One work around would be to disable IPv6, but this doesn't work behind a reverse proxy that has IPv6 enabled unless the reverse proxy can be configured not to reject connections to the service over IPv6.
An overwhelming majority of the visitors are on IPv6 in my case, so the country stats are basically useless.
I have a bug when I click on : "Display last 1000 pages".
Usage: user/data/page-data.sqlite (18.4 MB)
Server Error
Sorry, something went terribly wrong!
E_ERROR - Maximum execution time of 30 seconds exceeded
For further details please review your logs/ folder, or enable displaying of errors in your system configuration.
June 2nd at 4:57am CRITICAL Maximum execution time of 30 seconds exceeded
The file blueprints.yaml
in grav-plugin-page-stats-2.5.1
contains the following entry:
version: 2.5.0
I guess that should be version: 2.5.1
Since september 2022 the following error appears in my GRAV log
Sometimes several times a day, sometimes it skips a view days.
[2022-12-29 22:07:11] grav.ERROR: PageStats plugin : Undefined index: HTTP_USER_AGENT - File: /home/.../public_html/user/plugins/page-stats/classes/Stats.php - Line: 85 - Trace: #0 /home/.../public_html/system/src/Grav/Common/Debugger.php(843): Whoops\Run->handleError() #1 /home/.../public_html/user/plugins/page-stats/classes/Stats.php(85): Grav\Common\Debugger->deprecatedErrorHandler() #2 /home/.../public_html/user/plugins/page-stats/classes/Stats.php(127): Grav\Plugin\PageStats\Stats->isBot() #3 /home/.../public_html/user/plugins/page-stats/page-stats.php(216): Grav\Plugin\PageStats\Stats->collect() #4 /home/.../public_html/user/plugins/page-stats/page-stats.php(309): Grav\Plugin\PageStatsPlugin->collectPageData() #5 /home/.../public_html/vendor/symfony/event-dispatcher/EventDispatcher.php(264): Grav\Plugin\PageStatsPlugin->onPageInitialized() #6 /home/.../public_html/vendor/symfony/event-dispatcher/EventDispatcher.php(239): Symfony\Component\EventDispatcher\EventDispatcher->doDispatch() #7 /home/.../public_html/vendor/symfony/event-dispatcher/EventDispatcher.php(73): Symfony\Component\EventDispatcher\EventDispatcher->callListeners() #8 /home/.../public_html/system/src/Grav/Common/Grav.php(597): Symfony\Component\EventDispatcher\EventDispatcher->dispatch() #9 /home/.../public_html/system/src/Grav/Common/Processors/PagesProcessor.php(59): Grav\Common\Grav->fireEvent() #10 /home/.../public_html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(50): Grav\Common\Processors\PagesProcessor->process() #11 /home/.../public_html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(62): Grav\Framework\RequestHandler\RequestHandler->handle() #12 /home/.../public_html/system/src/Grav/Common/Processors/TwigProcessor.php(38): Grav\Framework\RequestHandler\RequestHandler->handle() #13 /home/.../public_html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(50): Grav\Common\Processors\TwigProcessor->process() #14 /home/.../public_html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(62): Grav\Framework\RequestHandler\RequestHandler->handle() #15 /home/.../public_html/system/src/Grav/Common/Processors/AssetsProcessor.php(39): Grav\Framework\RequestHandler\RequestHandler->handle() #16 /home/.../public_html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(50): Grav\Common\Processors\AssetsProcessor->process() #17 /home/.../public_html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(62): Grav\Framework\RequestHandler\RequestHandler->handle() #18 /home/.../public_html/system/src/Grav/Common/Processors/SchedulerProcessor.php(40): Grav\Framework\RequestHandler\RequestHandler->handle() #19 /home/.../public_html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(50): Grav\Common\Processors\SchedulerProcessor->process() #20 /home/.../public_html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(62): Grav\Framework\RequestHandler\RequestHandler->handle() #21 /home/.../public_html/system/src/Grav/Common/Processors/BackupsProcessor.php(39): Grav\Framework\RequestHandler\RequestHandler->handle() #22 /home/.../public_html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(50): Grav\Common\Processors\BackupsProcessor->process() #23 /home/.../public_html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(62): Grav\Framework\RequestHandler\RequestHandler->handle() #24 /home/.../public_html/system/src/Grav/Common/Processors/TasksProcessor.php(69): Grav\Framework\RequestHandler\RequestHandler->handle() #25 /home/.../public_html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(50): Grav\Common\Processors\TasksProcessor->process() #26 /home/.../public_html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(62): Grav\Framework\RequestHandler\RequestHandler->handle() #27 /home/.../public_html/system/src/Grav/Common/Processors/RequestProcessor.php(64): Grav\Framework\RequestHandler\RequestHandler->handle() #28 /home/.../public_html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(50): Grav\Common\Processors\RequestProcessor->process() #29 /home/.../public_html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(62): Grav\Framework\RequestHandler\RequestHandler->handle() #30 /home/.../public_html/system/src/Grav/Common/Processors/ThemesProcessor.php(38): Grav\Framework\RequestHandler\RequestHandler->handle() #31 /home/.../public_html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(50): Grav\Common\Processors\ThemesProcessor->process() #32 /home/.../public_html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(62): Grav\Framework\RequestHandler\RequestHandler->handle() #33 /home/.../public_html/system/src/Grav/Common/Processors/PluginsProcessor.php(39): Grav\Framework\RequestHandler\RequestHandler->handle() #34 /home/.../public_html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(50): Grav\Common\Processors\PluginsProcessor->process() #35 /home/.../public_html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(62): Grav\Framework\RequestHandler\RequestHandler->handle() #36 /home/.../public_html/system/src/Grav/Common/Processors/InitializeProcessor.php(130): Grav\Framework\RequestHandler\RequestHandler->handle() #37 /home/.../public_html/system/src/Grav/Common/Debugger.php(546): Grav\Common\Processors\InitializeProcessor::Grav\Common\Processors{closure}() #38 /home/.../public_html/system/src/Grav/Common/Processors/InitializeProcessor.php(131): Grav\Common\Debugger->profile() #39 /home/.../public_html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(50): Grav\Common\Processors\InitializeProcessor->process() #40 /home/.../public_html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(62): Grav\Framework\RequestHandler\RequestHandler->handle() #41 /home/.../public_html/system/src/Grav/Framework/RequestHandler/Middlewares/MultipartRequestSupport.php(40): Grav\Framework\RequestHandler\RequestHandler->handle() #42 /home/.../public_html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(50): Grav\Framework\RequestHandler\Middlewares\MultipartRequestSupport->process() #43 /home/.../public_html/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php(62): Grav\Framework\RequestHandler\RequestHandler->handle() #44 /home/.../public_html/system/src/Grav/Common/Grav.php(312): Grav\Framework\RequestHandler\RequestHandler->handle() #45 /home/.../public_html/index.php(47): Grav\Common\Grav->process() #46 {main} [] []
From the reports, looks like it's using UTC. The request here is to let me set a "home" time zone in settings. ๐๐
In both the Most Viewed Pages on the summary page, and on the detail page for Most Viewed Pages, it would be handy to have some time filters, like,
Mostly I'm looking at these stats to see "what's happening lately" and so knowing that my home page has 90 jillion hits since install is less actionable than "this article you wrote last week is the third most popular page right now".
Thanks for your coding time dude!
Add support to exclude a page from being processed via front matter setting
eg:
---
page-stats:
process: false
---
see #3
In "recently viewed" and "most viewed", have the option of showing the url instead of (or in addition to) the page name. Minus the base URL, naturally. Currently, there's no way to see if I've loaded a page with a tracker like /page.html/?qrcode=1 as it will have the same page name.
This will make the text field longer... at least for "full width" it would look much better if the viewed columns did not all have the same weight. (25% 25% 25% 25%) but rather something like 55% 15% 15% 15%.
Thanks man, great work on the updates recently.
Allo users to select what widgets to show, as not all widgets are relevant for all websites
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.