Coder Social home page Coder Social logo

romain / matomo-ip-to-company Goto Github PK

View Code? Open in Web Editor NEW
14.0 2.0 11.0 1.25 MB

A plugin for Matomo which gives you the name of the company that visited your website, based on its IP.

License: GNU General Public License v3.0

PHP 100.00%
matomo ipinfo traffic-analysis analytics analytics-tracking

matomo-ip-to-company's Introduction

Matomo IPtoCompany Plugin

New in version 0.3.0

  • Daily email report containing the list of companies that visited your website

Description

This plugin is meant to be installed on Matomo. It provides you with the name of the company which holds the IP that visited your website.

You can also use IPInfo.io to get a more reliable result if you have an account. You will just have to set your access token in the General Parameters of Matomo.

This plugin has first been developed for the needs of the company I've been working for, Wipsim

License

GPL v3 or later

Requirements

Your Matomo version should be between 3.9.0 and below 4.0.0.

Installation

Install it via Matomo Marketplace.

Where to find the report once the plugin is activated?

Once you've activated your plugin, you'll see in the Visitors tab of each website a new Companies subcategory. This is were your new report lies.

You can also add this report as a widget to your dashboards.

How reliable is this data?

The collected company names are based on the PHP function gethostbyaddr. This function returns the name of the company provided by the proxy used by the user.

Most of the big companies have their own proxy set up with a real name configured. But SMBs may not and in this case, you could see the name of their ISP appear.

Therefore, this information is not 100% reliable but this is still an interesting information to check from time to time.

If you have an access token set up for IPInfo.io, this plugin will use this data in the first place, before falling back to gethostbyaddr;

Can I receive this report by email?

Yes! As of version 0.3.0, you can receive this report by email. You just have to go to Settings > Personal Settings and check the checkbox located in the IPtoCompany section which asks you if you want to subscribe to this report.

This report will then be sent to you once a day, for each site that you have access to, with the list of companies that visited your website the day before.

How to activate the email report

Can I define the lifetime of the cache?

As of version 0.4.0, yes, you can. In the general settings section, you can set the number of weeks during which the results should be kept in cache. By default, we keep them 2 weeks, and the minimum is 1 week.

matomo-ip-to-company's People

Contributors

ljo avatar monschder avatar romain avatar solracsf avatar weblate avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

matomo-ip-to-company's Issues

No data displaying

I would love to support this plugin, but it doesn't seem to be working.

Describe the bug
There is not company data displayed in Matomo.

To Reproduce
See above. No steps

Expected behavior
To see company data

Screenshots
If applicable, add screenshots to help explain your problem.

Desktop (please complete the following information):
NA

Smartphone (please complete the following information):
NA

Additional context
NA

Archiving triggered with scheduled tasks no longer work

There has been a recent update to how Matomo scheduled tasks can function. In matomo-org/matomo#17976
some additional checks were added to stop scheduled tasks from triggering archiving.
(This was included in the recent 4.6.0 release)

From my understanding of how this plugin functions, it uses the scheduled tasks to archive its reports (Instead of being archived during the normal archiving process).

Recently we had some users that experienced issues around this. For example, when a user defines a maximum number of concurrent archivers, Matomo will still trigger any scheduled tasks that are set to execute. For large servers this can take some time, if additional archivers start and then immediately exit because it detects that the maximum number of archivers are already running, then again it triggers the scheduled tasks.

For example, we would see something like this in the archive logs:

INFO [2021-11-30 06:15:02] 289292  START
INFO [2021-11-30 06:15:02] 289292  Starting Matomo reports archiving...
INFO [2021-11-30 06:15:02] 289292  Archiving will stop now because 40 archivers are already running and max 2 are supposed to run at once.
INFO [2021-11-30 06:15:02] 289292  Reached maximum concurrent archivers allowed (2), aborting run.
INFO [2021-11-30 06:15:02] 289292  ---------------------------
INFO [2021-11-30 06:15:02] 289292  SCHEDULED TASKS
INFO [2021-11-30 06:15:02] 289292  Starting Scheduled tasks... 
INFO [2021-11-30 06:15:02] 289292  Scheduler: executing task Piwik\Plugins\CustomJsTracker\Tasks.updateTracker...
INFO [2021-11-30 06:15:02] 289292  Scheduler: finished. Time elapsed: 0.015s
INFO [2021-11-30 06:15:02] 289292  Scheduler: executing task Piwik\Plugins\TagManager\Tasks.regenerateReleasedContainers...
INFO [2021-11-30 06:15:33] 289292  Scheduler: finished. Time elapsed: 30.912s
INFO [2021-11-30 06:15:33] 289292  Scheduler: executing task Piwik\Plugins\IPtoCompany\Tasks.getListOfCompaniesThatVisitedWebsiteYesterday_51...
INFO [2021-11-30 06:17:46] 289292  Scheduler: finished. Time elapsed: 132.869s
INFO [2021-11-30 06:17:46] 289292  Scheduler: executing task Piwik\Plugins\IPtoCompany\Tasks.getListOfCompaniesThatVisitedWebsiteYesterday_52...
INFO [2021-11-30 06:17:46] 289292  Scheduler: finished. Time elapsed: 0.056s
INFO [2021-11-30 06:17:46] 289292  Scheduler: executing task Piwik\Plugins\IPtoCompany\Tasks.getListOfCompaniesThatVisitedWebsiteYesterday_53...
INFO [2021-11-30 06:24:35] 289049  Scheduler: finished. Time elapsed: 1442.608s
INFO [2021-11-30 06:24:35] 289049  Scheduler: executing task Piwik\Plugins\IPtoCompany\Tasks.getListOfCompaniesThatVisitedWebsiteYesterday_85...
INFO [2021-11-30 06:26:30] 289292  Scheduler: finished. Time elapsed: 524.222s
INFO [2021-11-30 06:26:30] 289292  Scheduler: executing task Piwik\Plugins\IPtoCompany\Tasks.getListOfCompaniesThatVisitedWebsiteYesterday_54...
INFO [2021-11-30 06:26:30] 289292  Scheduler: finished. Time elapsed: 0.116s
INFO [2021-11-30 06:26:30] 289292  Scheduler: executing task Piwik\Plugins\IPtoCompany\Tasks.getListOfCompaniesThatVisitedWebsiteYesterday_58...
INFO [2021-11-30 06:26:30] 289292  Scheduler: finished. Time elapsed: 0.046s
INFO [2021-11-30 06:26:30] 289292  Scheduler: executing task Piwik\Plugins\IPtoCompany\Tasks.getListOfCompaniesThatVisitedWebsiteYesterday_59...
INFO [2021-11-30 06:26:30] 289292  Scheduler: finished. Time elapsed: 0.041s
INFO [2021-11-30 06:26:30] 289292  Scheduler: executing task Piwik\Plugins\IPtoCompany\Tasks.getListOfCompaniesThatVisitedWebsiteYesterday_67...
INFO [2021-11-30 06:26:30] 289292  Scheduler: finished. Time elapsed: 0.039s
INFO [2021-11-30 06:26:30] 289292  Scheduler: executing task Piwik\Plugins\IPtoCompany\Tasks.getListOfCompaniesThatVisitedWebsiteYesterday_69...
INFO [2021-11-30 06:26:30] 289292  Scheduler: finished. Time elapsed: 0.040s
INFO [2021-11-30 06:26:30] 289292  Scheduler: executing task Piwik\Plugins\IPtoCompany\Tasks.getListOfCompaniesThatVisitedWebsiteYesterday_71...
INFO [2021-11-30 06:26:30] 289292  Scheduler: finished. Time elapsed: 0.047s
INFO [2021-11-30 06:26:30] 289292  Scheduler: executing task Piwik\Plugins\IPtoCompany\Tasks.getListOfCompaniesThatVisitedWebsiteYesterday_73...
INFO [2021-11-30 06:30:02] 289545  ---------------------------

This can lead to a very high number of concurrently running archivers that are all trying to process IPtoCompany reports:
Archiving will stop now because 40 archivers are already running and max 2 are supposed to run at once.

There is a possible workaround in the linked issue, but we would recommend changing the archiving behaviour so that it doesn't need to be triggered with a scheduled task.

isPHPVersionMoreRecentThan($version) function is completely broken

This code simply doesn't work and is functionally broken. It will compare 8.0.0 to 7.4.0 and return FALSE when it should return TRUE.

I will work on a PR, but in the meantime as a workaround it is easier to just remove the use of this function from the code if you know you are running a PHP version >8.0.0

edit: looks like a PR has already been created with the fix. Needs to be merged.

	/**
	 * A private methode to save the company details in the DB.
	 *
	 * @param mixed $version
	 *
	 * @return bool
	 */
	private function isPHPVersionMoreRecentThan($version)
	{
		$phpVersion = PHP_VERSION;
		$phpVersionParts = explode('.', $phpVersion);
		$phpMinVersionParts = explode('.', $version);

		if ((int) $phpVersionParts[0] < (int) $phpMinVersionParts[0]) {
			return false;
		} elseif ((int) $phpVersionParts[1] < (int) $phpMinVersionParts[1]) {
			return false;
		} elseif ((int) $phpVersionParts[2] < (int) $phpMinVersionParts[2]) {
			return false;
		}

		return true;
	}

Plugin throws error during core:archive when visits log is disabled

Describe the bug
When the Visits log and Visitor profile is disabled (https://matomo.org/faq/how-to/how-do-i-disable-the-visits-log-or-the-visitor-profile-feature/) the plugin throws the following error in the core:archive logs:

/usr/bin/php7.2 /srv/http/matomo/console core:archive --no-ansi >> /var/log/matomo/cron-matomo-archive.log
ERROR [2022-06-17 00:10:56] 9045 Uncaught exception in API: /srv/http/matomo/plugins/Live/Live.php(68): Visits log is deactivated globally. A user with super user access can enable this feature in the general settings.
#0 /srv/http/matomo/plugins/Live/API.php(165): Piwik\Plugins\Live\Live::checkIsVisitorLogEnabled('1')
#1 [internal function]: Piwik\Plugins\Live\API->getLastVisitsDetails('1', 'day', 'yesterday', false, '200', false, false, false, false)
#2 /srv/http/matomo/core/API/Proxy.php(244): call_user_func_array(Array, Array)
#3 /srv/http/matomo/core/Context.php(28): Piwik\API\Proxy->Piwik\API\{closure}()
#4 /srv/http/matomo/core/API/Proxy.php(335): Piwik\Context::executeWithQueryParameters(Array, Object(Closure))
#5 /srv/http/matomo/core/API/Request.php(266): Piwik\API\Proxy->call('\\Piwik\\Plugins\\...', 'getLastVisitsDe...', Array)
#6 /srv/http/matomo/core/API/Request.php(559): Piwik\API\Request->process()
#7 /srv/http/matomo/plugins/IPtoCompany/API.php(64): Piwik\API\Request::processRequest('Live.getLastVis...', Array)
#8 [internal function]: Piwik\Plugins\IPtoCompany\API->getCompanies('1', 'day', 'yesterday', false, 200)
#9 /srv/http/matomo/core/API/Proxy.php(244): call_user_func_array(Array, Array)
#10 /srv/http/matomo/core/Context.php(28): Piwik\API\Proxy->Piwik\API\{closure}()
#11 /srv/http/matomo/core/API/Proxy.php(335): Piwik\Context::executeWithQueryParameters(Array, Object(Closure))
#12 /srv/http/matomo/core/API/Request.php(266): Piwik\API\Proxy->call('\\Piwik\\Plugins\\...', 'getCompanies', Array)
#13 /srv/http/matomo/core/API/Request.php(559): Piwik\API\Request->process()
#14 /srv/http/matomo/plugins/IPtoCompany/Tasks.php(46): Piwik\API\Request::processRequest('IPtoCompany.get...', Array)
#15 [internal function]: Piwik\Plugins\IPtoCompany\Tasks->getListOfCompaniesThatVisitedWebsiteYesterday('1')
#16 /srv/http/matomo/core/Scheduler/Scheduler.php(309): call_user_func(Array, '1')
#17 /srv/http/matomo/core/Scheduler/Scheduler.php(154): Piwik\Scheduler\Scheduler->executeTask(Object(Piwik\Scheduler\Task))
#18 /srv/http/matomo/plugins/CoreAdminHome/API.php(68): Piwik\Scheduler\Scheduler->run()
#19 /srv/http/matomo/core/CronArchive.php(653): Piwik\Plugins\CoreAdminHome\API->runScheduledTasks()
#20 /srv/http/matomo/core/CronArchive.php(279): Piwik\CronArchive->runScheduledTasks()
#21 /srv/http/matomo/core/Access.php(661): Piwik\CronArchive->Piwik\{closure}()
#22 /srv/http/matomo/core/CronArchive.php(284): Piwik\Access::doAsSuperUser(Object(Closure))
#23 /srv/http/matomo/plugins/CoreConsole/Commands/CoreArchiver.php(32): Piwik\CronArchive->main()
#24 /srv/http/matomo/vendor/symfony/console/Symfony/Component/Console/Command/Command.php(257): Piwik\Plugins\CoreConsole\Commands\CoreArchiver->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#25 /srv/http/matomo/vendor/symfony/console/Symfony/Component/Console/Application.php(874): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#26 /srv/http/matomo/vendor/symfony/console/Symfony/Component/Console/Application.php(195): Symfony\Component\Console\Application->doRunCommand(Object(Piwik\Plugins\CoreConsole\Commands\CoreArchiver), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#27 [internal function]: Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#28 /srv/http/matomo/core/Console.php(135): call_user_func(Array, Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#29 /srv/http/matomo/core/Access.php(670): Piwik\Console->Piwik\{closure}()
#30 /srv/http/matomo/core/Console.php(136): Piwik\Access::doAsSuperUser(Object(Closure))
#31 /srv/http/matomo/core/Console.php(87): Piwik\Console->doRunImpl(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#32 /srv/http/matomo/vendor/symfony/console/Symfony/Component/Console/Application.php(126): Piwik\Console->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#33 /srv/http/matomo/console(32): Symfony\Component\Console\Application->run()
#34 {main} [Query: , CLI mode: 1]

To Reproduce
Steps to reproduce the behavior:

  1. Disable Visits log setting
  2. Execute core:archive command
  3. See error in the logs/output

Expected behavior
It would likely be best that the plugin detects that the Visits Log (And therefore the Live API) is disabled and use a different method of getting the data for the report generation.
If that isn't possible then maybe detecting the setting is enabled and throwing a warning in the logs or perhaps the UI could work.

E-mail delivery although not checked

Describe the bug
I receive every morning an email for every website after the 0.3.0 update.

To Reproduce
Personal settings > Subscribe to ... is not checked

Expected behavior
No email reports.

Screenshots
SCREEN_2020-03-06_081838

Btw: Great plugin - I am a new user but it looks great for our requirements

Recurrent error in logs

The following error message appears regularly in the logs:

Uncaught exception: Error: Undefined constant "Piwik\Plugins\IPtoCompany\FILTER_SANITIZE_MAGIC_QUOTES" in /var/www/html/<redacted>/plugins/IPtoCompany/API.php:268

PHP version: 8.0.28
Matomo version: 4.14.2
Matomo Update History: 4.11.0,4.10.1,4.5.0,4.4.1,4.3.1,4.2.1
Matomo Install Version: Unknown - pre 3.8.
Latest Available Version: 4.14.2
MySQL version: 8.0.33-0ubuntu0.22.04.2
OS: Ubuntu 22.04

Thank you.

No longer provides data

Describe the bug
We have entered ipinfo key. All settings correct. No data showing in Copanies section.

To Reproduce
Pretty simple. No data in Companies

Expected behavior
Expected to see name of companies based on ips as advertised.

Screenshots
Proof attached

Desktop (please complete the following information):
NA

Smartphone (please complete the following information):
NA

Additional context
NA

Screen Shot 2022-08-01 at 5 38 42 PM

Screen Shot 2022-08-01 at 5 38 14 PM

ut the problem here.

IPtoCompany plugin not working

I have installed the IPtoCompany plugin and get these two warnings:

WARNING: Sorting the API method &quot;Live.getLastVisitDetails&quot; by column is currently not supported. To avoid this warning remove the URL parameter &quot;filter_sort_column&quot; from your API request. (Module: API, Action: getCompanies, Method: Live.getLastVisitsDetails, In CLI mode: false)

WARNING: /piwik/plugins/IPtoCompany/API.php(53): Warning - gethostbyaddr(): Address is not a valid IPv4 or IPv6 address - Matomo 3.13.1-b2 - Please report this message in the Matomo forums: https://forum.matomo.org (please do a search first as it might have been reported already) (Module: IPtoCompany, Action: getCompanies, Method: IPtoCompany.getCompanies, In CLI mode: false)

Matomo-Version: 3.13.1-b2
MySQL-Version: 5.7.28-nmm1-log
PHP-Version: 7.3.11-nmm1

FILTER_SANITIZE_MAGIC_QUOTES is deprecated (Matomo 3.13.1)

WARNING: /var/www/matomo/plugins/IPtoCompany/API.php(225): Deprecated - filter_var(): FILTER_SANITIZE_MAGIC_QUOTES is deprecated, use FILTER_SANITIZE_ADD_SLASHES instead - Matomo 3.13.1 - Please report this message in the Matomo forums: https://forum.matomo.org (please do a search first as it might have been reported already) (Module: IPtoCompany, Action: getCompanies, Method: IPtoCompany.getCompanies, In CLI mode: false)

WARNING: /var/www/matomo/plugins/IPtoCompany/API.php(245): Deprecated - filter_var(): FILTER_SANITIZE_MAGIC_QUOTES is deprecated, use FILTER_SANITIZE_ADD_SLASHES instead - Matomo 3.13.1 - Please report this message in the Matomo forums: https://forum.matomo.org (please do a search first as it might have been reported already) (Module: IPtoCompany, Action: getCompanies, Method: IPtoCompany.getCompanies, In CLI mode: false)

Widget takes too long to load, times out

Hello!

I've added the IPtoCompany widget to my dashboard.

If I've selected a site with a relatively small amount of visits, say under 100, it loads fine. When I select a site that has had thousands of visits, the widget tries to load for 60 seconds and then times out.

I believe that the timeout is related to a PHP setting for max_input_time which is currently set to 60 seconds in php.ini on my server. I can change this setting, but I'd rather not.

I have enabled auto-archiving for Matomo by doing the following:

nano /etc/cron.d/matomo-archive
5 * * * * www-data /usr/bin/php /var/www/html/console core:archive --url=<my website> | logger -t matomoarchive

Is there something else I'm meant to be doing in order to explicitly ensure that archiving is enabled for this plugin? Or is archiving not the issue?

Have I overlooked some critical step in using this plugin's widget?

Thank you all in advance!

Tested on Desktop

  • OS: Mac OS Big Sur 11.7
  • Browser: Chrome
  • Version: 105.0.5195.125 (Official Build) (x86_64)

Screen Shot 2022-12-05 at 2 19 38 PM

Problem after removing the IPinfo.io token

I used the plugin for some month without problems. I put in my (free) IPinfo token to check if there is a difference in the quality.

After removing the token, the Plugin stopped working.

At Visitors —> Companies I get an error message: IPinfo request quota exceeded.

Ist seems, that the Plugin still tries to use IPInfo.io, but with no valid token.

Deleting and reinstalling the Plugin does not help.

PHP 8.2 - deprecated warnings

A noisy warning

WARNING: /plugins/IPtoCompany/Reports/GetCompanies.php(43): Deprecated - Creation of dynamic property Piwik\Plugins\IPtoCompany\Reports\GetCompanies::$columns is deprecated - Matomo 4.13.1 - Please report this message in the Matomo forums: https://forum.matomo.org (please do a search first as it might have been reported already) (Module: CoreAdminHome, Action: home, In CLI mode: false)

Versione di Matomo: 4.13.1
Versione MySQL: 8.0.30-22
Versione PHP: 8.2.1

Thank you

Pagination missing in results table, generates a warning

We have a problem with the IPtoCompany results table; it does not show “Next >” although there are more than 5 results
(we can see it if we select more “Rows to display”):

iptocompnay_pagination

WARNING: Sorting the API method "Live.getLastVisitDetails" by column is currently not supported. To avoid this warning remove the URL parameter "filter_sort_column" from your API request. (Module: API, Action: getCompanies, Method: Live.getLastVisitsDetails, In CLI mode: false)

The warning also seems to disable the plugin in Matomo.

'Exception: {"status":400}" when installing the plugin with matomo 3.14.1

Describe the bug

I installed Ip2 to company on Matomo version: 3.14.1

and i trigger the bug mentioned in #4

To Reproduce
Steps to reproduce the behavior:

  1. install ip2company
  2. Click on Visitors/Companies
  3. Get the 'Exception: {"status":400}"

Expected behavior

See a list of companies like in the screenshot in the documentation

Screenshots

ip2comapny-bugs

Desktop (please complete the following information):

  • OS: Debian Buster
  • Browser [Firefox]
  • Version [78.6.1esr]

Additional context
Add any other context about the problem here.

Segment support

It is currently not possible to create a segment based on the data collected by the plugin.

Matomo 5 compatibility

Dear Matomo Plugin Author,
We are excited that Matomo 5.0.0 is on the horizon, and we would greatly appreciate your assistance in ensuring that your plugin remains compatible with this upcoming release. Maintaining compatibility will enable Matomo users to seamlessly use your plugin after they upgrade to Matomo 5. (If the plugin is not updated to be compatible with Matomo 5, then whenever a user will upgrade to Matomo 5, the plugin would be automatically disabled to prevent issues.)

Updating your plugin to be Matomo 5 compatible is a straightforward process and should not require a significant time investment. You can find more information about updating your plugin at: https://developer.matomo.org/guides/migrate-matomo-4-to-5

Thank you for your ongoing support and commitment to the Matomo community.
Your contribution is really appreciated!

The Matomo Team

PS: we’re also available to help if you have any question about making the plugin compatible.

I took the liberty of forking this project and making the necessary changes. If you create a 5.x-dev branch, merge my changes into that branch, and create a new release, you should be good to go.

Plugin Not Capturing Company Name

Hi There,

I just installed your IP2Company plugin on matomo 4.1 running on Windows Server 2016/IIS 10 with PHP 7.4.13. I installed it from the matomo Marketplace.

It's all working fine in that it is capturing hits and displaying them in Companies widget on the dashboard. But, the company column is blank. Well, actually, it's "-". All the other columns are populated correctly.

The IP address which appears in the Companies widget on the matomo dashboard is 73.114.0.0. (I'm connected to a Comcast (Xfinity) WiFi hotspot.)

Any thoughts on what might be the problem?

Thanks,

-Jeff

Translations using Weblate

Hello,

Lukas from Matomo team here. We are currently in the process of moving our translations from Transifex to Weblate (matomo-org/matomo#17907).
As Weblate makes it easier to add a git repository as a component and merge back updated translations via pull requests, I thought it would be great if more plugins in Matomo were available in the users languages if someone is interested in translating them.

If you are interested in adding your plugin, simply comment here, and I'll help you with the setup.

Plugin not working

When going to Visitors/Companies the following error shows up:

  • Exception: {"status":400}

This also shows up in the dashboard of Matomo:

  • _WARNING: /home/secure/public_html/analytics.myserver.com/plugins/IPtoCompany/API.php(141): Warning - gethostbyaddr(): Address is not a valid IPv4 or IPv6 address - Matomo 3.13.5

(Module: IPtoCompany, Action: getCompanies, Method: IPtoCompany.getCompanies, In CLI mode: false)_

We did add the IPinfo.io access token and have uninstalled and re-installed the plugin a few times and still get the error.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.