GithubHelp home page GithubHelp logo

tristanlatr / wpwatcher Goto Github PK

View Code? Open in Web Editor NEW
45.0 4.0 19.0 4.86 MB

Wordpress Watcher is a wrapper for WPScan that manages scans on multiple sites and reports by email and/or syslog. Schedule scans and get notified when vulnerabilities, outdated plugins and other risks are found.

Home Page: https://wpwatcher.readthedocs.io

License: Apache License 2.0

Python 99.12% Shell 0.04% Dockerfile 0.80% Ruby 0.03%
wpscan auto multiple bulk batch scan wordpress email report alerts

wpwatcher's People

Contributors

tristanlatr avatar

Stargazers

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

Watchers

 avatar  avatar  avatar  avatar

wpwatcher's Issues

KeyError: 'wpscan_output' after sleeping 1 day

INFO - Scanning site wp.exemple.com/site
ERROR - WPScan command '/usr/local/rvm/gems/default/wrappers/wpscan --no-banner --random-user-agent --disable-tls-checks --format json --detection-mode aggressive --enumerate p,t,cb,dbe,u,m --api-token *** --url wp.exemple.com/site' failed with exit code 4 scan_aborted: Your API limit has been reached
INFO - API limit has been reached after 7 sites, sleeping 1 day, 0:00:00 and continuing the scans...
INFO - Scanning site wp.exemple.com/site
INFO - Updating WPScan
INFO - ** WPScan INFO wp.exemple.com/site ** Wordpress Version: 5.3.4 Release Date: 2020-06-10 Status: Latest
INFO - ** WPScan INFO wp.exemple.com/site ** Plugin: fusion-builder Location: wp.exemple.com/site/wp-content/plugins/fusion-builder/ The version could not be determined
INFO - ** WPScan INFO wp.exemple.com/site ** Plugin: fusion-core Location: wp.exemple.com/site/wp-content/plugins/fusion-core/ The version could not be determined
INFO - ** WPScan INFO wp.exemple.com/site ** Plugin: wp-timelines Location: wp.exemple.com/site/wp-content/plugins/wp-timelines/ The version could not be determined
INFO - ** WPScan INFO wp.exemple.com/site ** Theme: twentytwenty Location: wp.exemple.com/site/wp-content/themes/twentytwenty/ Latest Version: 1.4 Readme: wp.exemple.com/site/wp-content/themes/twentytwenty/readme.txt The version could not be determined Style URL: wp.exemple.com/site/wp-content/themes/twentytwenty/style.css Style Name: Twenty Twenty Style URI: https://wordpress.org/themes/twentytwenty/ Author: the WordPress team Author URI: https://wordpress.org/
INFO - ** WPScan INFO wp.exemple.com/site ** XML-RPC seems to be enabled: wp.exemple.com/site/xmlrpc.php URL: wp.exemple.com/site/xmlrpc.php  References: - Url: http://codex.wordpress.org/XML-RPC_Pingback_API - Metasploit: auxiliary/scanner/http/wordpress_ghost_scanner - Metasploit: auxiliary/dos/http/wordpress_xmlrpc_dos - Metasploit: auxiliary/scanner/http/wordpress_xmlrpc_login - Metasploit: auxiliary/scanner/http/wordpress_pingback_access
INFO - ** WPScan INFO wp.exemple.com/site ** Readme URL: wp.exemple.com/site/readme.html
INFO - ** WPScan INFO wp.exemple.com/site ** Wp_Cron URL: wp.exemple.com/site/wp-cron.php  References: - Url: https://www.iplocation.net/defend-wordpress-from-ddos - Url: https://github.com/wpscanteam/wpscan/issues/1299
INFO - ** WPScan INFO wp.exemple.com/site ** User Identified: aurelienceagv
INFO - ** WPScan INFO wp.exemple.com/site ** WPVulnDB API Infos Plan: free Requests Done During Scan: 6 Requests Remaining: 44
INFO - ** WPScan INFO wp.exemple.com/site ** Target URL: wp.exemple.com/site/ Target IP: 184.86.34.161 Effective URL: wp.exemple.com/site/
INFO - ** WPScan INFO wp.exemple.com/site ** Enlapsed: 570 seconds
WARNING - ** WPScan WARNING wp.exemple.com/site ** Plugin: wordpress-seo Warning: The version is out of date Location: wp.exemple.com/site/wp-content/plugins/wordpress-seo/ Latest Version: 14.5 Current Version: 13.1
INFO - WPScan_output_httpsici.radio-canada.cagillesvilleneuve_2020-07-14T03-07-00 attached
INFO - Email sent: WPWatcher WARNING report - wp.exemple.com/site - 2020-07-14T03-07-00 to [email protected]
INFO - Progress - [==========================   ] 88% - 8 / 9
Traceback (most recent call last):
  File "/usr/local/bin/wpwatcher", line 8, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.6/site-packages/wpwatcher/cli.py", line 175, in main
    WPWatcherCLI()
  File "/usr/local/lib/python3.6/site-packages/wpwatcher/cli.py", line 50, in __init__
    exit_code,_=wpwatcher.run_scans_and_notify()
  File "/usr/local/lib/python3.6/site-packages/wpwatcher/core.py", line 193, in run_scans_and_notify
    new_reports=self.run_scans_wrapper(self.wp_sites)
  File "/usr/local/lib/python3.6/site-packages/wpwatcher/core.py", line 176, in run_scans_wrapper
    try: self.new_reports.append(f.result())
  File "/usr/lib64/python3.6/concurrent/futures/_base.py", line 432, in result
    return self.__get_result()
  File "/usr/lib64/python3.6/concurrent/futures/_base.py", line 384, in __get_result
    raise self._exception
  File "/usr/lib64/python3.6/concurrent/futures/thread.py", line 56, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/usr/local/lib/python3.6/site-packages/wpwatcher/core.py", line 163, in scan_site_wrapper
    wp_report= self.scanner.scan_site(wp_site,  last_wp_report)
  File "/usr/local/lib/python3.6/site-packages/wpwatcher/scan.py", line 356, in scan_site
    if self.mail.notify(wp_site, wp_report, last_wp_report):
  File "/usr/local/lib/python3.6/site-packages/wpwatcher/notification.py", line 58, in notify
    self._notify(wp_site, wp_report, last_wp_report)
  File "/usr/local/lib/python3.6/site-packages/wpwatcher/notification.py", line 165, in _notify
    self.send_report(wp_report, to)
  File "/usr/local/lib/python3.6/site-packages/wpwatcher/notification.py", line 93, in send_report
    wp_report['wpscan_output'] = re.sub(r'(\x1b|\[[0-9][0-9]?m)','', str(wp_report['wpscan_output']))
KeyError: 'wpscan_output'

Parser bug

Shows like it has an alert, but it doesn't display the alert details :/

please make deploy to heroku button

hi tristanlatr,
please make deploy to heroku button for don't use my personal system hardware & vps req.
its so important for me
waiting for your response
finest regards

ERRORS don't get reported in database anymore

An bug slipped through the cracks and errors don't get reported in Json database (Version 2.0)

The code that choose what to store in database and what will be included in emails will be changed in order to always save everything in database and exclude infos or warnings from messages afterwards

Not running scans when configured as cron job

Hello,

I have a problem where WPWatcher refuses to do all of the work when configured as a cron job. I set it to run with verbose mode and to output logging to a file in my home folder, and all I can se it doing is sort of faking a run, almost as if it was dry-running.

0 * * * * /home/user/.local/bin/wpwatcher -v --conf /home/user/wpwatcher.conf >> /home/user/wpwatcher.log

Approximate config:

DEBUG - WPWatcher configuration:
wp_sites                        =       [{"url": "..."}, {"url": "..."}, {"url": "..."}, {"url": "..."}]
send_email_report               =       True
send_errors                     =       True
email_to                        =       ["[email protected]"]
send_infos                      =       True
quiet                           =       True
verbose                         =       True
attach_wpscan_output            =       True
fail_fast                       =       False
api_limit_wait                  =       False
daemon                          =       False
daemon_loop_sleep               =       0:00:00
resend_emails_after             =       0:00:00
wp_reports                      =       /home/user/.wpwatcher/wp_reports.json
asynch_workers                  =       4
log_file                        =       /home/user/.wpwatcher/wpwatcher.log
follow_redirect                 =       True
wpscan_output_folder            =       /home/user/.wpwatcher/wpscan-results/
wpscan_args                     =       ["--format", "json", "--random-user-agent", "--update"]
scan_timeout                    =       0:25:00
false_positive_strings          =       []
send_warnings                   =       True
email_errors_to                 =       ["[email protected]"]
wpscan_path                     =       wpscan
smtp_server                     =       smtp.example.com:587
smtp_auth                       =       True
smtp_user                       =       [email protected]
smtp_pass                       =       ***
smtp_ssl                        =       True
from_email                      =       [email protected]
use_monospace_font              =       True
syslog_server                   =
syslog_port                     =       514
syslog_stream                   =       SOCK_STREAM
syslog_kwargs                   =       {"enterprise_id": 42, "msg_as_utf8": true, "utc_timestamp": true}

It outputs the correct config, it then continues to output:

INFO - Starting scans on 22 configured sites
INFO - Scanning site https://www.my-first-site-to-scan.com/
INFO - Scanning site https://www.the-next-site-to-scan.com/
DEBUG - Running WPScan command: wpscan --version --format json --no-banner
.....

It all looks like it is running correctly, but looking at HTOP I see that WPWatcher is running from start to stop in less than half a second, and I receive no emails. If I run the exact same command as the same user but not in cron it runs as it should, it takes some time and I receive emails for all scanned sites etc.

I'm running a fresh install of Ubuntu 20.04.1 LTS with Python 3.8.5, ruby 2.7.0p0, WPWatcher 2.4.8 and WPScan 3.8.15.

Any idea what I'm missing here? Is this a bug?

Improve Documentation for ReadTheDocs and Codebase

Description

The current documentation for WPWatcher, both on ReadTheDocs and within the codebase, could benefit from improvements to help users better understand the application and make it more accessible to contributors.

Suggested improvements include

  1. Expand ReadTheDocs documentation: Enhance the existing Quickstart Guide to include sections on Troubleshooting and Common Issues, Tips for Effective Scanning, Contribution and Support, and License Information. This would provide a more comprehensive guide for users and encourage community involvement.
  2. In-code documentation: Add more detailed docstrings and comments throughout the codebase to clarify the purpose and functionality of classes, methods, and functions. This would help contributors better understand the code, making it easier for them to contribute and maintain the project.
  3. Best practices and troubleshooting: Provide a section in the ReadTheDocs documentation dedicated to best practices when using WPWatcher, as well as common troubleshooting tips to help users resolve issues they may encounter.

By implementing these improvements, we can make WPWatcher more accessible and user-friendly, ultimately benefiting both end-users and contributors to the project.

Consider using the WPScanAPI directly to improve performance and simplify dependencies

Description

Currently, WPWatcher relies on the Ruby-based WPScan tool to perform WordPress vulnerability scans. This adds a dependency on Ruby and the WPScan tool, which can complicate the installation process and might affect performance.

An alternative approach would be to use the WPScan API directly within the Python application. This could potentially improve performance, simplify dependencies, and allow for more control over the scanning process. However, this change would require a significant refactor of the existing codebase to integrate the WPScan API directly.

Benefits

  • Improved performance: By using the API directly, we can potentially reduce overhead and improve the performance of WPWatcher.
  • Simplified dependencies: Removing the dependency on the Ruby-based WPScan tool could make it easier to install and use WPWatcher.
  • Increased control: By interacting with the WPScan API directly, we can have more control over the scanning process and possibly offer more features or customisations.

Potential Drawbacks

  • Significant refactoring: This change would require a substantial rewrite of the existing codebase to integrate the WPScan API directly.

This issue is to discuss the feasibility of this change and gather input from contributors on whether it would be a valuable improvement to WPWatcher.

Syslog output broken

ERROR - Unable to send syslog messages for site URL
Traceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/wpwatcher/scan.py", line 507, in scan_site
    self.syslog.emit_messages(wp_report)
  File "/usr/local/lib/python3.6/site-packages/wpwatcher/syslogout.py", line 48, in emit_messages
    for m in self.get_messages(wp_report):
  File "/usr/local/lib/python3.6/site-packages/wpwatcher/syslogout.py", line 68, in get_messages
    c.set_prefix("deviceVersion", VERSION)
NameError: name 'VERSION' is not defined

This bug was introduced when improving the setup.py

Implement SQLite for report storage to address concurrency issues

Description

When running WPWatcher with multiple instances or scheduled scans, there is a risk of data corruption and failures due to concurrent access to the JSON report database file. This issue impacts users who have multiple scans running at the same time or who use a combination of cron jobs and the Linux service.

Proposed Solution

To address these concurrency issues, I propose migrating from JSON file storage to SQLite for storing scan reports. SQLite provides built-in support for concurrent access and ensures data consistency even when multiple processes access the database simultaneously. By using SQLite, WPWatcher can run multiple instances without the risk of data corruption due to concurrent access.

  • Update the DataBase class to use SQLite instead of a JSON file.
  • Create a table named reports in the SQLite database to store report data.
  • Modify the write and find methods to work with the SQLite database.
  • Ensure the updated implementation maintains backward compatibility with existing configurations and usage.
  • Test the updated implementation with multiple instances of WPWatcher running concurrently to confirm that the concurrency issues are resolved.

Benefit

By implementing SQLite for report storage, WPWatcher will be able to handle multiple instances and concurrent scans without the risk of data corruption or failures. This change will greatly enhance the reliability and robustness of the tool for users who need to perform frequent or overlapping scans.

Docker compatibility and image

WPWatcher should be able to run docker images of WPScan seamlessly.

Currently wpscan_path only accept single path values. Meaning that il will fail if wpscan_path=docker run -it --rm wpscanteam/wpscan.

WPWatcher should also have it's own docker image.

Refactor config.py to improve maintainability and readability

Description

The config.py module is responsible for handling WPWatcher's configuration. To improve maintainability and readability, we should address the issues reported by Code Climate in the config.py module.

Code Climate Recommendations

  1. Cyclomatic complexity: Break down complex functions into smaller, more focused functions. This will make the code more readable and maintainable.
  2. Cognitive complexity: Simplify the logic in some of the functions by using helper functions or more straightforward control structures.
  3. Maintainability: Refactor the code to improve its maintainability and readability.

Specific Recommendations

  • Refactor the _ini2conf function to reduce its complexity by breaking it into smaller, more focused functions.
  • Simplify the _load_files function by using more straightforward control structures.
  • Refactor the _find_files function to reduce its complexity by breaking it into smaller, more focused functions.

By addressing these issues, we can improve the overall quality and maintainability of the WPWatcher codebase.

Fixed items are too verbose and are taking too much space in emails

Fixed items should be after warnings.
Issue details is not really relevant.
Only 2 lines per fixed items like :

Issue regarding component "Potential Vulnerability: Chained Quiz < 1.0 - Multiple XSS" has been fixed since last report.
Last report sent the 2020-07-06T12-54-48.

Complete tests suite

Even if all functionalities are working, WPWatcher surely have bugs and should be properly tested.

Create a wiki for clearer docs

Wiki pages:

  • Basic configuration overview and exemples
  • False positives use cases
  • Email reports statuses and config
  • Linux service
  • Docker install
  • All options and config table
  • Json database summary
  • Library usage

Improve code clarty

It's a little bit complicated in there and it would require structural changes to make it more clear.

Enhance WPWatcher with Additional Notification Methods

Description

To increase the flexibility and adaptability of WPWatcher for various user preferences and requirements, it would be beneficial to extend the application with more notification methods beyond the existing email notifications. The proposed enhancements include the integration of Slack and custom webhooks as notification channels for vulnerability alerts.

Proposed Methods

  1. Slack: Enable users to configure WPWatcher to send alerts to a Slack channel using either incoming webhooks or the Slack API.
  2. Webhooks: Support user-defined webhooks for custom integrations with other services, applications, or incident management platforms.

By implementing a variety of notification methods, WPWatcher can better cater to user preferences, streamline vulnerability alert reception, and facilitate seamless integration with other tools and services.

Customizable email report messages

We should be able to customize email report messages.

A field in the config: email_message read and added at the beginning of every reports.

Splitting vulnerabilities regarding same component into several messages for better false positives control

Current behaviour

When using default format (cli), vulnerabilities or warnings regarding one component (i.e. Wordpress version) are displayed all together in one big message. So one message per component.

Ignore specific Warnings regarding a component and still display other is impossible, it'll ignore the entire message because false positive strings are tested against the entire message string, that contain ALL vulnerabilities titles.

Future behaviour

Split messages like when using --format json in WPScan arguments

Workaround : Use --format json in WPScan arguments

Separate Concerns in cli.py Module

Description

The cli.py module currently contains multiple responsibilities, such as configuration handling, argument parsing, and command execution. To improve maintainability and readability, we should divide the cli.py module into smaller, more focused modules, as well as address the issues reported by Code Climate.

Proposed Split

  • args.py: Manages command-line argument parsing and validation.
  • cli.py: Executes WPWatcher commands using the parsed arguments and config file.

Code Climate Recommendations

In addition to splitting the cli.py module, we should also address the following issues reported by Code Climate:

  1. Cyclomatic complexity: Break down complex functions into smaller, more focused functions. This will make the code more readable and maintainable.
  2. Cognitive complexity: Simplify the logic in some of the functions by using helper functions or more straightforward control structures.

By addressing these issues and splitting the cli.py module, we can improve the overall quality and maintainability of the WPWatcher codebase.

Auto delete /tmp/wpscan can cause No such file or directory error (rare)

Error sample :

ERROR - WPScan command 'wpscan --format cli --no-banner --random-user-agent --disable-tls-checks --enumerate t,p,tt,cb,dbe,u,m --url ' failed with exit code 3 . WPScan output: [+] URL: *** [] [+] Effective URL: ***/ [+] Started: Thu Apr 16 00:06:37 2020 [!] No WPVulnDB API Token given, as a result vulnerability data has not been output. [!] You can get a free API token with 50 daily requests by registering at https://wpvulndb.com/users/sign_up [+] Finished: Thu Apr 16 00:06:37 2020 [+] Requests Done: 4 [+] Cached Requests: 0 [+] Data Sent: 1.354 KB [+] Data Received: 75.075 KB [+] Memory used: 37.961 MB [+] Elapsed time: 00:00:00 Scan Aborted: No such file or directory @ rb_sysopen - /tmp/wpscan/cache/b20515b38b68645f5c87c5ac518148bb/1655927643 Trace: [...]

Currently the program tries to delete /tmp/wpscan and fails silently if errors.
Initially, it delete /tmp/wpscan to save space, the cache can rapidly increase size to a few Gigas.

Could do a clear_wpscan_cache=Yes/No in the config and --clear argument

Add Issue Templates to Streamline Issue Reporting

Description

To facilitate a more structured and efficient issue reporting process, it is recommended to add issue templates to the WPWatcher repository. These templates will help guide users in submitting issues and ensure that all necessary information is provided, ultimately making it easier for maintainers to address and resolve issues.

Proposed Issue Templates

  1. Bug Report: A template that prompts users to provide details on the unexpected behaviour or errors they encountered, steps to reproduce the issue, and any relevant logs or error messages.
  2. Feature Request: A template that guides users in describing a new feature or enhancement they would like to see added to WPWatcher, including the benefits, use cases, and any potential implementation considerations.
  3. Documentation Improvement: A template that enables users to report issues or suggest improvements related to the project documentation, such as unclear explanations, missing sections, or outdated information.

Benefits:

By adding issue templates to the WPWatcher repository, the project can benefit from a more organised and efficient issue reporting process. These templates will help users provide comprehensive and relevant information, making it easier for maintainers to understand, triage, and address reported issues.

Use API Token only on site that have outdated WordPress version or plugin

WPWatcher should be able to run scans without API token first and then use token on site that have outdated WordPress version or plugin only to save API calls .

Would need to do some research to see if that's a safe way to scan sites anyway.

Would not work if API Token is written to wpscan config file or environnement variable

File lock RuntimeError

Traceback (most recent call last):
  File "/home/ec2-user/.local/bin/wpwatcher", line 8, in <module>
    sys.exit(main())
  File "/home/ec2-user/.local/lib/python3.9/site-packages/wpwatcher/cli.py", line 72, in main
    exit_code, reports = wpwatcher.run_scans()
  File "/home/ec2-user/.local/lib/python3.9/site-packages/wpwatcher/core.py", line 230, in run_scans
    self._run_scans(self.wp_sites)
  File "/home/ec2-user/.local/lib/python3.9/site-packages/wpwatcher/core.py", line 207, in _run_scans
    self.new_reports.append(f.result())
  File "/usr/lib64/python3.9/concurrent/futures/_base.py", line 446, in result
    return self.__get_result()
  File "/usr/lib64/python3.9/concurrent/futures/_base.py", line 391, in __get_result
    raise self._exception
  File "/usr/lib64/python3.9/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/home/ec2-user/.local/lib/python3.9/site-packages/wpwatcher/core.py", line 179, in _scan_site
    self.wp_reports.write([wp_report])
  File "/home/ec2-user/.local/lib/python3.9/site-packages/wpwatcher/db.py", line 111, in write
    raise RuntimeError("The file lock must be acquired before writing data. ")
RuntimeError: The file lock must be acquired before writing data. 

I don't understand what is tripping it off or how to suppress this error?

Refactor email.py to address Code Climate issues

Description:

The email.py file has several issues reported by Code Climate. These issues include high cyclomatic complexity, cognitive complexity, and maintainability. In order to improve the code quality, we should address the following:

  1. High cyclomatic complexity: Break down complex functions into smaller, more focused functions. This will make the code more readable and maintainable.
  2. High cognitive complexity: Simplify the logic in some of the functions by using helper functions or more straightforward control structures.
  3. Maintainability: Refactor the code to improve its maintainability and readability.

Some areas to focus on for improvement include:

  • send_email: This function has a high cyclomatic complexity and cognitive complexity. Consider breaking down the function into smaller, more focused functions.
  • smtp_send: This function has a high cyclomatic complexity. Splitting the function into smaller functions that handle specific tasks, such as establishing a connection and sending the email, can help reduce complexity.

These improvements should help address the issues reported by Code Climate and improve the overall quality of the email.py file.

Unable to use wp_args within wp_sites in the config file

When I try and use wp_sites in the wpwatcher.conf file and set wp_args for a site, then running wpwatcher fails with the following:

 INFO - WPWatcher -  Automating WPscan to scan and report vulnerable Wordpress sites
Traceback (most recent call last):
  File "/usr/local/bin/wpwatcher", line 11, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.6/dist-packages/wpwatcher/cli.py", line 408, in main
    WPWatcherCLI()
  File "/usr/local/lib/python3.6/dist-packages/wpwatcher/cli.py", line 53, in __init__
    configuration = self.build_config_cli(args)
  File "/usr/local/lib/python3.6/dist-packages/wpwatcher/cli.py", line 343, in build_config_cli
    configuration, files = WPWatcherConfig(files=conf_files).build_config()
  File "/usr/local/lib/python3.6/dist-packages/wpwatcher/config.py", line 55, in __init__
    self.parser.read_file(fp)
  File "/usr/lib/python3.6/configparser.py", line 718, in read_file
    self._read(f, source)
  File "/usr/lib/python3.6/configparser.py", line 1092, in _read
    fpname, lineno)
configparser.DuplicateOptionError: While reading from '/root/.wpwatcher/wpwatcher.old' [line 19]: option '{"url"' in section 'wpwatcher' already exists

Here's my conf with the actual URLs omitted:

[wpwatcher]
wp_sites=[
{"url":"url1.com","wpscan_args":["--ignore-main-redirect"]},
{"url":"url2.com"} ]

If I remove the wpscan_args protion, and only set the url, then it runs fine. However, I need to set different wpscan_args for each site I'll be scanning.

Any assistance with this would be appreciated.

Integrate HTML Page Export for Vulnerability Reports

Description

To provide users with an alternative, easily shareable format for vulnerability reports, it would be advantageous to add an HTML page export feature to WPWatcher. This feature would allow users to generate an interactive, visually appealing report that can be viewed in any web browser, shared with team members, or archived for future reference.

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.