Coder Social home page Coder Social logo

dnncommunity / polydeploy Goto Github PK

View Code? Open in Web Editor NEW
49.0 12.0 21.0 1.7 MB

A Bulk Deployment tool for the DNN CMS. PolyDeploy is focussed on security, reliability and auditability.

License: Apache License 2.0

C# 75.49% JavaScript 17.98% HTML 5.40% Less 0.86% ASP.NET 0.27%
dnn dotnetnuke dnncms dnn-frameworks deployment deploy-tool hacktoberfest

polydeploy's Introduction

PolyDeploy

PolyDeploy

Seasoned DNN developers will no doubt have experience of installing many modules at once by placing their module install files in the [websiteroot]/Install/Module/ directory and calling [domain]/Install.aspx?Mode=InstallResources. It was the only efficient way to install many modules together while avoiding multiple AppPool restarts.

Unfortunately, due to a security exploit within Install.aspx it is now removed after the installation of DNN is complete. This leaves the installation of large numbers of modules a tedius and time consuming task.

What is PolyDeploy?

PolyDeploy aims to bring that deployment convenience back to DNN developers so deployments can once again be quick and easy. In addition, we aim to add additional convenience to allow more flexible deployment solutions including remote deployments and automated deployments that can be performed by your continuous integration solution to help streamline the development process.

Features

Security

PolyDeploy has been architected with security in mind from the very beginning. There are multiple mechanisms in place to prevent the unauthorised use of PolyDeploy to defend against attackers deploying modules.

IP Whitelisting

By default, PolyDeploy will only allow access from the host machine (127.0.0.1). Starting out with the strictest possible whitelisting and requiring that the user log in on the host machine to specify additional trusted IP addresses ensures no security vulnerability is introduced if PolyDeploy is installed and not immediately configured.

Host Only

The API exposed for use with PolyDeploy's Angular user interface requires a Host user account in order to be accessible. If for some reason the PolyDeploy module is mistakenly placed on a page which is accessible by standard DNN users or visitors who aren't logged in, no vulnerability is created.

DNN Services Framework

The API available to allow management of PolyDeploy through its Angular user interface requires that the appropriate anti-forgery token is supplied in the request. The DNN Services Framework provides this security.

API Users

PolyDeploy requires that clients accessing its API to perform remote deployments have an API User. Each API User can be uniquely indentified by its API Key. Access to the API can be quickly and easily revoked on an individual basis in the event that an API Key is considered compromised.

Encryption

Modules being deployed remotely using a valid API Key must also be encrypted using the unique Encryption Key which is generated when the API User is created. This Encryption Key is never passed over the web for security. If an attacker were to acquire a client's API Key, any modules that were sent to the API would be rejected as it wouldn't be possible to decrypt them unless they also had the Encryption Key.

Local Deployments

PolyDeploy provides an easy to use drag and drop interface that allows the user to upload multiple modules quickly and inititate a deployment.

Remote Deployments

PolyDeploy provides the ability to perform secure module deployments over the web through the use of many security features described above.

Additionally, an example of a client is provided in this repository which we currently use in our development workflow as part of our continous integration solution.

Dependency Detection

When you upload modules to PolyDeploy, it looks through the modules' dependencies and ensures that they can be met. Dependencies are checked against modules that are already installed as well as modules that are included as part of the current deployment session.

During the dependency checks, modules in the deployment session are placed into a suitable installation order. Modules will only be installed after the modules they depend on have been installed. For example, if I add Module A and Module B to a deployment session and Module B has a dependency on Module A, PolyDeploy will make sure that Module A is installed before Module B during the deployment.

Circular Dependencies

PolyDeply is also able to detect circular dependencies in modules and will prevent a deployment from starting if a circular dependency is found.

Auditability

PolyDeploy logs all key activities including:

  • Failed IP Whitelist Checks
  • Failed API User Checks
  • Session Creation
  • Module Upload
  • Module Installation

Find out more about our products and services at www.cantarus.com.

polydeploy's People

Contributors

anierzad avatar bdukes avatar can-dan-rigbey avatar canmk avatar danielbolef avatar david-poindexter avatar engage-chancock avatar haggi13 avatar jmbockhorst avatar mitchelsellers avatar stevenfishercantarus avatar timothyengagesoftware avatar willstrohl 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  avatar  avatar  avatar  avatar

Watchers

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

polydeploy's Issues

Add command line arguments to allow setting app.config settings.

If the "TargetUri", "APIKey", and "EncryptionKey" could be set via command line arguments, or environment variables. The executable file could be more portable and not rely on the app.config.
For CI/CD systems, this would make setting up a Module deploy task easier

Deploy.bundle.js - Error: transition superseded

When i try to install this on a DNN 9.1.1 installation, i get
Deploy.bundle.js?cdv=334:1 Error: transition superseded
Error: transition prevented
Error: transition aborted
https://{domainname}/DesktopModules/PolyDeploy/API/Session/Create 403 (Forbidden)

Possibly unhandled rejection: {"data":{"Message":"Access denied."},"status":403,"config":{"method":"POST","transformRequest":[null],"transformResponse":[null],"jsonpCallbackParam":"callback","url":"/DesktopModules/PolyDeploy/API/Session/Create","headers":{"Accept":"application/json, text/plain, /","ModuleId":2520,"TabId":"675","__RequestVerificationToken":"_PQ1Idob6iJgnLnU61Fu8ruJ57bMSCEheCYFDag0wdF8JB9rKFzHf3Se00LBp43AVw3F9ofEbKEEnY3s0","RequestVerificationToken":"_PQ1Idob6iJgnLnU61Fu8ruJ57bMSCEheCYFDag0wdF8JB9rKFzHf3Se00LBp43AVw3F9ofEbKEEnY3s0"}},"statusText":"Forbidden","xhrStatus":"complete"}

Any tips on how to resolve this?

Prompt to Delete Archives

After the deployment is done, it would be nice to have a Y/N prompt to decide whether or not to delete the installation packages.

VSTS task

I've created a basic VSTS task to deploy via PolyDeploy, which I've published as https://github.com/bdukes/cantarus-polydeploy-client.

This doesn't address the IP whitelisting issue (see #24), but if you're using an on-premise build agent that you can IP whitelist, it should work fine.

So, this is mostly an FYI that this now exists, but if y'all are interested in that project being part of this repo or just under the cantarus org on GitHub, let me know.

Update IP Allow List on Install

It would be useful for the IUpgradeable feature to be added that automatically adds the current IP address that's installing the module so it doesn't need to be done via SQL in production environments.

DNN 9.6.2 Exception on Deploy

I'm testing the latest release locally right now.

When I use the standard command below during testing using PolyDeploy 0.9.3 and DNN 9.6.2 I get an exception.

DeployClient.exe --target-uri https://polydeploy1.loc/ --api-key 836FBBF86DD54D8A965DB25CE6842301 --encryption-key ABF15F9AFA5E4560B751C2B8EC497783

image

This appears to be the offending line of code, maybe. But I can't debug it because of Issue #74

string json = await client.GetStringAsync(endpoint);

An error occurred while sending the request.

I am getting the below error while deploying the extensions to DNN stage site:
2021-07-22T13:57:23.9783440Z System.Net.Http.HttpRequestException | An error occurred while sending the request.
2021-07-22T13:57:24.0224123Z at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
2021-07-22T13:57:24.0224748Z at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
2021-07-22T13:57:24.0225261Z at DeployClient.API.d__2.MoveNext() in C:\DNNDev\CantarusCore\PolyDeploy\DeployClient\API.cs:line 37
2021-07-22T13:57:24.0225747Z --- End of stack trace from previous location where exception was thrown ---
2021-07-22T13:57:24.0226092Z at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
2021-07-22T13:57:24.0226474Z at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
2021-07-22T13:57:24.0227324Z at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
2021-07-22T13:57:24.0227771Z at DeployClient.Program.

d__2.MoveNext() in C:\DNNDev\CantarusCore\PolyDeploy\DeployClient\Program.cs:line 97
2021-07-22T13:57:24.0228313Z System.Net.WebException | The underlying connection was closed: An unexpected error occurred on a send.
2021-07-22T13:57:24.0282127Z at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
2021-07-22T13:57:24.0282575Z at System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar)
2021-07-22T13:57:24.0298227Z System.IO.IOException | Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.
2021-07-22T13:57:24.0395630Z at System.Net.TlsStream.EndWrite(IAsyncResult asyncResult)
2021-07-22T13:57:24.0396041Z at System.Net.PooledStream.EndWrite(IAsyncResult asyncResult)
2021-07-22T13:57:24.0396428Z at System.Net.ConnectStream.WriteHeadersCallback(IAsyncResult ar)
2021-07-22T13:57:24.0396787Z System.Net.Sockets.SocketException | An existing connection was forcibly closed by the remote host
2021-07-22T13:57:24.0405894Z at System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult)
2021-07-22T13:57:24.0406333Z at System.Net.Sockets.NetworkStream.EndRead(IAsyncResult asyncResult)
2021-07-22T13:57:24.0655104Z ##[error]The process 'F:\Build\Agent2_work_tool\DeployClient.exe\0.9.3\x64\DeployClient.exe' failed with exit code 1
2021-07-22T13:57:24.0667359Z ##[error]Deploy failed
2021-07-22T13:57:24.0709072Z ##[section]Finishing: Deploy with Cantarus PolyDeploy

Kindly advice.

Removing the UseTaskFriendlySynchronizationContext key on uninstall breaks other modules

Removing the aspnet:UseTaskFriendlySynchronizationContext key from the web.config on module uninstall breaks other modules installed on my DNN site that require the use of the key.

Can we just add the key on install if it's not already present in the web.config and then not remove it on uninstall. As there's no way to tell if it was already present / if anything else uses the key.

Automatically update web.config on installation and uninstall

PolyDeploy requires that a web.config update is made in order for it to work properly, per the documentation below:

https://github.com/cantarus/PolyDeploy/blob/master/docs/poly-deploy/installation.md

DNN has the XML Merge capability for you to do this via the API, the Configuration Manager, and in the module manifest. As an administrator, I want to be able to install this module without having to manually make any direct updates to the web.config to reduce the complexity of installation, recycles of the website, and human errors.

(FYI - I already have a fork where I've done the work to send a PR to you once Issue #1 is resolved.)

https://github.com/hismightiness/polydeploy/tree/feature/webconfig-install-update

Add PolyDeploy to DNN Store

DNN Store is the primary place people go to look for extensions. PolyDeploy should have a listing on the DNN Store to help it get exposure and adoption.

Update IP Allow List to Support Range

As-is, the IP allow list enables you to add a single computer (IP address) which works great. However, it doesn't allow you to add an IP range. IP ranges would be useful for certain corporate and VPN environments where the external IP address may be assigned dynamically, but within a known range (e.g., 123.123.0.0/24).

The front-end implementation would require validating the 123.123.123.123 value for a single IP address, as well as 123.123.0.0/24 for a range of IP addresses.

The back-end implementation would need to be updated to know the difference and then confirm the current IP address accordingly.

Unable to Use Module on Azure AppService environments

After adding my IP to the IP Address whitelist, the module still fails to load this is due to the fact that with Microsoft Azure the IP address that is coming in has a port number after it. Below is what I get in the PolyDeploy_EventLogs table

Whitelist check failed for IP address: x.x.x.x:58290, forwarded by: x.x.x.x.

Can we either get a way to bypass this filter entirely or support for a port. (NOTE: This port # is dynamic and changes often)

Unable to Build Solution Due to Nuget Package Errors

This may not be an issue that's directly related to this solution. Please feel free to close this if that's the case.

Steps to Reproduce:

  1. Fork and clone the repo
  2. Create a new branch from the Development branch
  3. Open the solution in VS 2017
  4. Build the solution in debug mode

Expected Behavior:
The solution builds successfully.

Actual Behavior:
The build process takes a long time the first time and fails with the errors in the link below. Subsequent builds simply fail immediately. It appears that the DNN Nuget packages are not available or the configuration needs to be updated to allow the packages to be included.

https://www.screencast.com/t/vwBfP4Iv

Add to Log: Key Creation

It would be nice to have an entry added with the date/time stamp when a key set is created/delete with the username and IP address that created/deleted it.

Management Settings page - API Users - minor UI issue

Short Description:
If you try to create two API Users with the same name, then the an empty row is being added to the table. Reloading the page fixes that issue.

Steps to reproduce:

  1. Open the page with PolyDeploy module in edit mode
  2. Navigate to the Manage page from the ActionMenu
  3. Add a user with the name TestUser (this generates the keys)
  4. Try to add a user with the same name TestUser.

Outcome: Minor UI bug

An empty row is added to the [API Users] table because the angular controller is adding an empty [API User] when the database fails to add other API Users with existing names due to a database constraint.

Workaround:

Refreshing the page removes the empty row,

image

No json results from failed deploy

When deploying to our development DNN, PolyDeploy failed to return the expected json results. Instead we got the and error
Received error {"Message":"Error during serialization or deserialization using the JSON JavaScriptSerializer. The length of the string exceeds the value set on the maxJsonLength property."}

Triaging the DNN Admin Logs discovered the deploy failure was due to sql timeout. When a DNN deploy fails due to sql timeout the entire sql file is added to the log message. It was a very large sql file. Because DNN includes the sql that failed to run in the error message, it exceeded PolyDeploy's ability to generate the results json. This prevented our pipeline from failing gracefully.

We've resolved this issue before by ensuring the serializer supports potentially large objects for serialization, as .net doesn't look at the server web.config for max size for json serialization
using Newtonsoft.Json; JavaScriptSerializer serializer = new JavaScriptSerializer { MaxJsonLength = int.MaxValue };

I'm requesting the results handling get the serialization intitalized to support large objects so when DNN fails for sql issues, the proper results can be passed back in the json

Event Log is incorrectly reporting successful installations when it fails.

The PolyDeploy Event log is logging PACKAGE_INSTALLED events incorrectly for failed installations.

Scenario 1:

  1. Upload 6 packages for installation (Modules A, B, C, D, E & F)
  2. 2 modules install successfully (Module A & B)
  3. Event log records that modules C, D & E have correctly installed.

Scenario Notes:

  • Modules B and F are theme modules with two packages in each (Skin and container).

Scenario 2:

  1. Upload 20 modules for installation (23 packages)
  2. 19 modules install successfully (20 packages) and 1 module install fails (0 packages out of 3).
  3. Event log records that 23 packages have installed correctly.

Create Admin page on Install

It seems that for an administrative module like this, it would be a bit time-saving to use the built-in API endpoint to create an Admin page for this module and add it to the page automatically. This would also put the feature in the Persona Bar automatically.

This module has already been out there for a while, so this update probably should first check for if the module state is an upgrade or new install before adding the Admin page.

Thoughts?

Update for DNN 9.xx UI

There are minor differences in DNN 9.xx compatibility with the current UI that the installed module has. Things like improperly styled bullet points, out-of-place installation tiles, etc.

Sign PolyDeploy Client executable with certificate

I am working in an environment that's locked down a lot and has AVG virus scanner running in it as well.
AVG doesn't trust the unsigned executable and won't let me run it correctly.

Is it possible to sign the executable with a certificate so that we don't run into trust issues on our servers?

PolyDeploy Client Watch Folder option

I'd like to have a CMD utility where I specify a folder, and the utility watches the folder indefinitely or until I stop it.
When a Module zip is dropped into the folder, the CMD utility uploads the zips via the DeployClient.
If it installs successfully, it's moved into a subfolder "Deployed", otherwise it goes in a subfolder "Failed".

I don't think this should be part of the DeployClient, but a separate cmd utility that interacts with the DeployClient.

If there's no interest to incorporate it into the PolyDeploy repo, I can create a separate repo to develop it for myself.

File Extension not allowed?

When installing a module, which installs in DNN I get this error....

image

However, on the log it tells me it has installed?

Is there some issue with file extensions? I can understand some file extensions being blocked. but ".rules" ? why ? Or is this a bug?

No agent found in pool TFSvNext which satisfies the specified demands

Hello Team,

I am using DNN9.2.2 in one of my project. I am working on CI/CD pipeline. I found PolyDeploy to be useful to deploy multiple modules via pipeline.
I have installed the module on one of the environments and created API and Encryption key. I am using Azure DevOps. I have added PolyDeploy task in the pipeline. I am using "TFSvNext" agent in the pipeline. When i am running it, I am getting the following error:
##[Error 1]
No agent found in pool TFSvNext which satisfies the specified demands:
msbuild
visualstudio
vstest
cantarus-deploy-client
Agent.Version -gtVersion 2.144.0

Kindly suggest.

Prompt for Installation Folders

In the case of when you're doing incremental upgrades, a command prompt would be useful to specify a child folder relative to the client to help save time for remote upgrades/deployments.

For Example:

> Child folders were found. Would you like to install from a child folder instead of the current folder? (y/n)
> y
> Please specify the folder and hit enter.
> DNN9

The rest of the process would be the same... Looking for, prompting, and installing the installation packages that are found.

Event Log Paging - Struggles at large number of pages

The paging for the event log struggles at large numbers of pages (see the image below for an example). Whist you can navigate to pages over 128, you have to use the next button, repeatedly. It also displays the logs oldest first rather than latest first.

polydeploy event log paging

I suggest that:

  • First and last pages buttons be added
  • The number of displayed pages cuts down to 5 either side of the current page
  • The order of the log is reversed to be latest first

IP whitelisting is not possible from host server

I'm trying to whitelist an IP address from the host web server, however I am unable to do so, due to some novel IP address configuration on the server itself. It logs that the traffic is coming from the IP address of the server rather than the loopback address 127.0.0.1.

Is it possible for the IP whitelisting to include the IP address of the server itself? It doesn't look like this is stored in DNN, but it looks like you are able to get it from ASP.NET.

We will need to be certain that the source of IP address cannot be compromised as this would be exploitable.

Ability to Disable IP Whitelisting

I would like to create a task for VSTS to use their CI/CD pipeline to deploy to different environments. However, because tasks are run from a pool of build agents in the cloud, I don't have a reliable IP address to whitelist (it is possible to get a list of public IP addresses used by VSTS, but it's a pretty long list and can change on a weekly basis).

So, for this scenario, it would be nice to be able to disable the IP whitelist for the deploy client. Is this an option y'all are open to?

Add to Log: White List IP

It would be nice to have an entry added with the date/time stamp when a white list IP is added/deleted, including the username and IP address that created it.

Modules are not installed when the PolyDeploy is being opened from a different view except the Upload one

Environment info:

Dnn Platform: v08.04.00
PolyDeploy: v0.8.0

Steps to reproduce the issue:

  1. Install PolyDeploy on the website and place it on a page under the Host page (e.g. https://local.dnndev.me/Host/Deploy-Modules).
  2. Create a simple DNN module. (i.e. display Hello World! from within the View.ascx.cs)
  3. Install it and modify it to display Hello PolyDeploy!.
  4. Go to the PolyDeploy page other than the upload page of PolyDeploy.
    e.g. Consider the summary page because the browser decided that it should store that page: https://local.dnndev.me/Host/Deploy-Modules/portalid/0#!/install/summary
  5. You are automatically redirected to the upload page. (I believe that at this point the installation has already been flagged as completed.)
  6. Upload the module created during step2 and click on Upload.
  7. Proceed by clicking on the Continue button once the module has been uploaded.
  8. See the summary of the installation and continue to summary view.
  9. An installation will be triggered saying that everything has been installed, but there won't be any AppPool refresh.

Expected outcome:

A successful installation,

Add command to uninstall unused non-core modules

One of the most common use cases we have that would involve this extension is performing client upgrades. One of my first steps when doing upgrades for clients is to uninstall any unused extension that's not an out-of-the-box extension. An incredible number of DNN sites have 5+ extensions on the site that were installed and never put onto a page. These extensions often cause module installation/upgrade conflicts and DNN upgrade issues.

It would be great to have a command to automatically uninstall all unused, non-core, extensions at once.

DeployClient Unable to overwrite existing file

Hi There, Im modifying our Azure Dev Ops release pipeline to deploy modules onto the Staging slot (with the Poly Deploy task) , then do an azure Slot Swap , then Deploy again (with Poly Deploy) to the Prod slot - so that there is no downtime.

However, on the second deployment the Poly Deploy task fails with this error :

##[error]Unhandled: Failed cp: cp: dest file already exists: D:\a\1\s\ModuleName_Install.zip

Here's some additional logging if it helps.

C:\hostedtoolcache\windows\DeployClient.exe\0.9.3\x64\DeployClient.exe --target-uri https://website.net --api-key 123 --encryption-key xyz --no-prompt --installation-status-timeout 60

Can't build the project.

When we pull down the latest zip and try to build we get the following errors.
NuGet Package restore failed for project PolyDeploy: Unable to find version '7.0.0' of package 'DotNetNuke_Community_System.Web.Http'.
NuGet Package restore failed for project PolyDeploy: Unable to find version '7.0.0' of package 'DotNetNuke_Community_System.Net.Http.Formatting'.
NuGet Package restore failed for project PolyDeploy: Unable to find version '7.0.0' of package 'DotNetNuke_Community_Newtonsoft.Json'.
NuGet Package restore failed for project PolyDeploy: Unable to find version '7.0.0' of package 'DotNetNuke_Community_System.Net.Http'.
NuGet Package restore failed for project PolyDeploy: Unable to find version '7.0.0' of package 'DotNetNuke_Community_DotNetNuke.Web'.
NuGet Package restore failed for project PolyDeploy: Unable to find version '7.0.0' of package 'DotNetNuke_Community_DotNetNuke.Web.Client'.
NuGet Package restore failed for project PolyDeploy: Unable to find version '7.0.0' of package 'DotNetNuke_Community_DotNetNuke'.

Getting 403 error while downloading PolyDeploy from pipeline task

We are getting "Unexpected HTTP response: 403" while downloading "PolyDeploy" from the pipeline task.

We are using this from last year or so but we suddenly getting this issue now from last 1 month or so.

Kindly suggest and let me know in case any other details are required.

Module in DNN 9.02 not Displaying

I am unable to see any functionality in the module when I install it in DNN. When I go to the page I have added the module on, it doesn't display properly.
PolyDeployScreenShot

Deployment from command line returns failure, but did install

I have deployments that use the command line tool through Octopus Deploy. Octopus Deploy is saying the deployment step with Polydeploy failed because polydeploy returns a failure. However when I go to my DNN site all the module versions updated, the database updated, and I all the views update. It appears that the deployment was really successful. How can I best trouble shoot this issue and see if it is something on my end or if there is a possible bug in the command line tool? When I look through the PolyDeploy logs I dont see any failures, but maybe I am looking in the wrong place.

Provide download via GitHub releases

There's another issue talking about adding PolyDeploy to DNN store which is great.
I'm a DNN newb and for newcomers it would be easier to just be able to download PolyDeploy directly from GitHub without the hassle of logging in and going through the "purchasing" flow on the DNN store.

Integrate with Prompt

It would be really cool to do the management for these features in Prompt so we don't necessarily need to navigate to the module's page every time we need to make an edit.

DeployClient displays a limited amount of information on failure

The DeployClient writes to the console output only the number of modules that have failed. The session object also contains the list of modules that failed and why they did so. The commandline output from the deploy client should be improved to report these additional bits of information.

Add Note Column to IP Address

In many environments, multiple people at multiple locations may need to manage the installation/upgrade of extensions. It would be useful to have a required [Note] (or another more useful name) column added so that everyone knows the context of the given IP address in the table.

It would also be useful to see this information in the front-end view as well.

This is especially true today since more and more people are working remotely and they may not have a static IP address.

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.