Code Monkey home page Code Monkey logo

ftp-deploy's Introduction

ftp-deploy

A Node.js package to help with deploying code. Ftp a folder from your local disk to a remote ftp destination. Does not delete from destination directory.

Installation

npm install --save-dev ftp-deploy

Usage

The most basic usage:

const FtpDeploy = require("ftp-deploy");
const ftpDeploy = new FtpDeploy();

const config = {
    user: "user",
    // Password optional, prompted if none given
    password: "password",
    host: "ftp.someserver.com",
    port: 21,
    localRoot: __dirname + "/local-folder",
    remoteRoot: "/public_html/remote-folder/",
    // include: ["*", "**/*"],      // this would upload everything except dot files
    include: ["*.php", "dist/*", ".*"],
    // e.g. exclude sourcemaps, and ALL files in node_modules (including dot files)
    exclude: [
        "dist/**/*.map",
        "node_modules/**",
        "node_modules/**/.*",
        ".git/**",
    ],
    // delete ALL existing files at destination before uploading, if true
    deleteRemote: false,
    // Passive mode is forced (EPSV command is not sent)
    forcePasv: true,
    // use sftp or ftp
    sftp: false,
};

ftpDeploy
    .deploy(config)
    .then((res) => console.log("finished:", res))
    .catch((err) => console.log(err));

Note:

  • in version 2 the config file expects a field of user rather than username in 1.x.
  • The config file is passed as-is to Promise-FTP.
  • I create a file - e.g. deploy.js - in the root of my source code and add a script to its package.json so that I can npm run deploy.
"scripts": {
    "deploy": "node deploy"
},
  • You can use callback instead of promise.
// use with callback
ftpDeploy.deploy(config, function (err, res) {
    if (err) console.log(err);
    else console.log("finished:", res);
});

Configuration include and exclude

These are lists of minimatch globs. ftp-deploy works by checking for each file in your source directory, whether it is included by one of the include patterns and whether it is NOT excluded by one of the exclude patterns. In other words:

  • include: all files that match will be uploaded. Note that a [ ] matches nothing
  • exclude: if a file matches the include pattern a subset may nonetheless be excluded

Events

ftp-deploy reports to clients using events. To get the output you need to implement watchers for "uploading", "uploaded" and "log":

ftpDeploy.on("uploading", function (data) {
    console.log(data.totalFilesCount); // total file count being transferred
    console.log(data.transferredFileCount); // number of files transferred
    console.log(data.filename); // partial path with filename being uploaded
});
ftpDeploy.on("uploaded", function (data) {
    console.log(data); // same data as uploading event
});
ftpDeploy.on("log", function (data) {
    console.log(data); // same data as uploading event
});
ftpDeploy.on("upload-error", function (data) {
    console.log(data.err); // data will also include filename, relativePath, and other goodies
});

Testing

A script to run a simple ftp server (using ftp-srv) is included, together with a test directory.

To use open a console to run the ftp server:

cd test
npm run server

and then in another console run the tests:

npm test

Release

npm version patch
git commit -m 'bump'
npm publish
git push origin vx.y.z

ToDo

  • re-enable continueOnError
  • update newer files only (PR welcome)

ftp-deploy's People

Contributors

aberigle avatar abhijitparida avatar almostinteractive avatar amfio avatar cyrdam avatar dependabot[bot] avatar der-on avatar dgkimpton avatar hexatan avatar isiahzzzz avatar jonycheung avatar kbialowas avatar keyle avatar pirumpi avatar pq1949 avatar rickbergfalk avatar rodrigograca31 avatar simonh1000 avatar sourcesoft avatar tbntdima avatar vtrofin 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  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  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

ftp-deploy's Issues

Add compatibility for jsftp-configuration

ftp-deploy uses jsftp as base but names the AUTH-keys in the config-object "username: " and "password: ". The username/password-keys in the jsfpt-config-object are "user: " and "pass: ". Would be nice if I could use the same config-object for both.

I run the test given by you,and got a error message

image
I use the fileZilla ftp server,and it show a error message:
rickbergfalk (127.0.0.1)> stor /Users/rickbergfalk/Public//folder a/folder b/empty c/folder d/test-inside-d-2.txt
(000053)2015/2/11 14:29:03 - rickbergfalk (127.0.0.1)> 503 Bad sequence of commands.

it is ok when I upload only one file.
otherwise, it got error when uploading the second file.

btw: my platform is window 7 ,not linux.

thx.

SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode

On Windows 10, current Node/NPM.

`C:\wamp64\www\node-testing\ftp-testing>npm run deploy

[email protected] deploy C:\wamp64\www\node-testing\ftp-testing
node deploy

C:\wamp64\www\node-testing\ftp-testing\node_modules\ftp-deploy\ftp-deploy.js:22
let transferredFileCount = 0;
^^^

SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode
at exports.runInThisContext (vm.js:53:16)
at Module._compile (module.js:373:25)
at Object.Module._extensions..js (module.js:416:10)
at Module.load (module.js:343:32)
at Function.Module._load (module.js:300:12)
at Module.require (module.js:353:17)
at require (internal/module.js:12:17)
at Object. (C:\wamp64\www\node-testing\ftp-testing\deploy.js:1:79)
at Module._compile (module.js:409:26)
at Object.Module._extensions..js (module.js:416:10)`

Tripping up on my hidden files

Seems to be throwing an error uploading hidden files...

{ totalFileCount: 539,
  transferredFileCount: 1,
  percentComplete: 0,
  filename: '/.htaccess' }
events.js:165
      throw err;
      ^

Error: Uncaught, unspecified "error" event. ([object Object])
    at emit (events.js:163:17)

Convert console.log to events

e.g.

function deleteDir(ftp, dir) {
    return ftp.list(dir).then(lst => {
        // FIXME move this to an event
        console.log("Deleting directory:", dir);

Would be more idiomatic than #59

Exlude do not work ?

Hi there,
I just try to exclude some files by extension like in the example config
exclude: ['.git', '.idea', '.db', '.php', '.sh', 'tmp/*']

but it seems to not work :'(

is there another param to activate ?
thanks

create destination if not exists

Would it be possible to make ftp-deploy automatically (try to) create the destination folder(s) on the server, if it does not exist..? Maybe even recursively like a mkdir -p..?

How do I run this?

I created a javascript file called deploy.js using your example. I run "node deploy.js" and nothing happens, no console.log occurs. I tried adding a infinite setTimeout to see if it the script was terminating early, but that did not fix anything.

Help wanted: maintain or adopt outright?

I'm finding myself with less and less open time, and maintaining this library isn't very high on my list of priorities. It does what I needed it to do, and I no longer use it.

If anyone would like to take it over I'd happily pass it on.

Alternatively, I can just add you as an owner on npm with access to this repo if you'd like to assist with maintenance and features without being the sole owner...

Let me know!

Deprecation Warnings

(node:20673) DeprecationWarning: Ftp.rawuser: Use Ftp.raw('user args') instead.
(node:20673) DeprecationWarning: Ftp.rawpass: Use Ftp.raw('pass args') instead.
(node:20673) DeprecationWarning: Ftp.rawtype: Use Ftp.raw('type args') instead.
(node:20673) DeprecationWarning: Ftp.rawcwd: Use Ftp.raw('cwd args') instead.

Binary tranfer

While using the tool, I've encountered an issue where file transfer is ASCII.

The server responded with an error saying that the file is corrupted.

Can you add binary transfer functionality and its parameter to config?

Replace Older

Does this currently only replace files that are older than the new file?

Deploying to Unix from Windows environment

I'm trying to deploy a local /build folder, including its contents, to a unix server however I am getting some breaking inconsistencies.

Local Config

var config = {
    user: process.argv[2],
    password: process.argv[3], 
    host: process.argv[4],
    port: 21,
    localRoot: __dirname + '/build',
    remoteRoot: '/var/www/html',
    include: ['*', '**/*'],
    exclude: []
}

Deploy Command

node deploy user password hostname

Expected Outcome

Remote server /var/www/html directory will contain files from local /build directory

Actual Outome

Remote server /home/user/ directory contains files named \var\www\html\ and then their relative file names and paths e.g.:
/home/user/\var\www\html\index.html
/home/user/\var\www\html\js\bundle.js

I did see issue #3 may relate to this, however as it is four years old I thought it would be good to revisit this.

sFTP

Hi it's me again :)

I was wondering if there is any chance you could integrate SFTP into your library. I have researched a few other options like this one. But I haven't found one that offers a programmable interface as good as the one your module has (I don't need it for Grunt).

Greetings
Mattias

Unix ftp

It would be good to switch this out into 2 steps: a full recursive walk gathering information, then a full recursive walk deploying things. (or maybe during the first recursive walk we gather a list of all the files and folders, so we don't have to recursively walk the directories again?)

There seems to be trouble deploying to unix-based ftp using ftp-deploy

Include & Exclude function

I try to use exclude to ignore folder node_modules, but seems doesn't work.

Why just include all files inside any folders then just ignore folder or files that you don't want to upload, instead of entering each file need to upload or not need to upload?

Also would be great only upload newer files~

thanks!

do the opposite of exclude ?

hello
I would like to know if it is possible to add a param which is the exact opposite of exclude ...
i would like to choose to upload only "*.jpeg" files of my directory
it could be very helpful ;)

include param should be master of exclude of course ;)
thanks a lot
++

Hangs when username is too long

Hangs for 17 minutes and then:

Fri Jun 15 2018 19:30:36 GMT+0100 (WEST)                                                                             
Failed undefined                                                                                                     
Failed function                                                                                                      
{ Error: read ETIMEDOUT                                                                                              
    at _errnoException (util.js:992:11)                                                                              
    at TCP.onread (net.js:618:25) code: 'ETIMEDOUT', errno: 'ETIMEDOUT', syscall: 'read' }                           
{ Error: read ETIMEDOUT                                                                                              
    at _errnoException (util.js:992:11)                                                                              
    at TCP.onread (net.js:618:25) code: 'ETIMEDOUT', errno: 'ETIMEDOUT', syscall: 'read' }                           
Fri Jun 15 19:47:42 WEST 2018

config:

console.log(Date());

var FtpDeploy = require('ftp-deploy');
var ftpDeploy = new FtpDeploy();

var config = {
	user: "XX",
    password: "xx",
	host: "XX",
	port: 21,
	localRoot: __dirname + '/',
	remoteRoot: '/',
	include: ['*', '**/*'],      // this would upload everything except dot files
    exclude: ['deploy.js, node_modules, package.json, package-lock.json'],     // e.g. exclude sourcemaps
    deleteRoot: false
}

// use with promises
ftpDeploy.deploy(config)
	.then(res => console.log('finished'))
	.catch(err => console.log(err))
	
// use with callback
ftpDeploy.deploy(config, function(err) {
	if (err) console.log(err)
	else console.log('finished');
});

I run it like this: node deploy.js && date to output the date after it runs...

can't logged In

host: waws-prod-am2-125.ftp.azurewebsites.windows.net

Able to log in from browser and Filezilla but can't able to logged in from ftp-deploy package.

screenshot_15

i will appreciate if you could help me Thanks!

How to deploy a single file?

Currently I'm running this, but it uploads everything...

  ftpDeploy.deploy({
    ...,
    localRoot: __dirname,
    remoteRoot: '/',
    exclude: ['./**/*'],
    include: ['index.html']
  }, callback)

How can I change exclude and include so that it only uploads index.html?

Actually, I need to upload a few single files in a directory that I wish to explicitly upload, instead of excluding the rest (which is much more).

Behavior when upload not possible

Hello!

Today I tried to upload a directory using ftp-deploy. I ran into the problem that the program would become unresponsive (stop doing anything) at a specific file. After further investigation I found out that the file on the FTP was created under a different user than the FTP user. The Problem is obvious, but sadly ftp-deploy does not have an error event and stops any further execution.

It would be awesome if ftp-deploy would emit an error and skip the file that is causing the problem.

Fails Without Callback Call

A few weeks ago my builds have stopped passing successfully, without a code change. Previously it worked like a charm:

https://github.com/julmot/form-components/blob/ac3e4efc9ea1c4f85257debcbb99fffd6a7d083c/build/deploy.js#L18

The ftp upload is started and I can track files being uploaded too. However, at some point it seems to hang, without printing something to the console or calling the specified callback. So the upload isn't complete and after a max delay of 10 minutes the build fails.

What could be the reason?

Travis: https://travis-ci.org/julmot/form-components/builds/357280644#L4517

topic

error in deploy:Timed out while making data connection

const path = require('path');
const FtpDeploy = require('ftp-deploy');
const ftpDeploy = new FtpDeploy();

const buildPath = path.join(__dirname, '..', 'build');

const log = (...args) => {
    console.log('β†’', ...args);
}

const config = {
    user: 'XXXX',
    password: 'XXXX',
    host: 'XXXX',
    port: 21,
    localRoot: buildPath,
    remoteRoot: './',
    include: ['*', '**/*'],
    exclude: [],
}

ftpDeploy.deploy(config)
    .then(res => log('πŸ“¦', ' deploy finish'))
    .catch(err => log('πŸ“¦', ' deploy error', err));

ftpDeploy.on('uploading', data => {
    log('β€ŒπŸ“¦', ` uploading ${parseInt((data.transferredFileCount / data.totalFilesCount) * 100)}% (${data.transferredFileCount}/${data.totalFilesCount})`, data.filename);
});

but with this config work on yummy ftp pro app

The content of the file is replaced to its file name.

I uploaded the file with the following config and succeeded.

const deployConfig = {
  ...
  localRoot: __dirname,
  remoteRoot: REMORT_ROOT,
  include: ['/dist/**/*'],
  exclude: []
}

But this result is the following.

REMORT_ROOT/
   β”” dist/ 
        β”œ index.html (7kb)
        β”” style.css (20kb)

I expected the following result.

REMORT_ROOT/
    β”œ index.html (7kb)
    β”” style.css (20kb)

So, I changed the config as follows and the result was as expected.

const deployConfig = {
  ...
  localRoot: `${__dirname}/dist`,
  remoteRoot: REMORT_ROOT,
  include: ['**/*'],
  exclude: []
}

But, For example, index.html has become 11B only, The contents of index.html replaced to/index.html.

What could be the reason?
Please help me.

Catch ECONNRESET

Im scripting with your module, thought occasionally i get an ECONNRESET from the server and basically just want to subscribe to that error event and retry a deploy a set amount of times before closing the process. What would be the best way to get a subscription on the socket object for the error within this module, or is there something i'm overlooking on the continueOnError functionality?

Cannot read property 'reduce' of undefined in version 2

using this setup, and getting failed promise... any ideas?

No errors when using v1

Cannot read property 'reduce' of undefined at canIncludePath (/Users/singleton/sites/detroit-history-hotline/node_modules/ftp-deploy/src/lib.js:53:31) at handleItem (/Users/singleton/sites/detroit-history-hotline/node_modules/ftp-deploy/src/lib.js:79:17)

const config = {
  user: process.env.FTP_USER,
  password: process.env.FTP_PASSWORD,
  host: process.env.FTP_HOST,
  port: 21,
  localRoot: __dirname,
  include: ['build/*'],
  remoteRoot: '/',
  deleteRoot: false
};

ftp
  .deploy(config)
  .then(res => console.log('Finished'))
  .catch(err => console.warn(err));

deleteRemote causes error when there are subdirectories at destination

If there are only files within the /folder/ the deletion before upload works.
However if there is something like /folder/subfolder I get an error😰:

Error: /folder/subfolder: Is a directory

Here my upload-config:

remoteRoot: '/folder/',
  include: ['*', '**/*'],
  exclude: [],
  deleteRemote: true

SFTP support?

This tool works beautifully! But many of the servers I work with are restricted to SFTP only, and I'd love to continue using this one with them as well.

delete remote directory error ?

When I run deploy in windows platform while the ftp server is on linux platform.
I find it will not delete remote direcory correctly.

function deleteDir(ftp, dir) {
    return ftp.list(dir).then(lst => {
        // FIXME move this to an event
        console.log("Deleting directory:", dir);
        let dirNames = lst
            .filter(f => f.type == "d" && f.name != ".." && f.name != ".")
            .map(f => path.join(dir, f.name));

        let fnames = lst
            .filter(f => f.type != "d")
            .map(f => path.join(dir, f.name));

        // delete sub-directories and then all files
        return Promise.mapSeries(dirNames, dirName => {
            // deletes everything in sub-directory, and then itself
            return deleteDir(ftp, dirName).then(() => ftp.rmdir(dirName));
        }).then(() => Promise.mapSeries(fnames, fname => ftp.delete(fname)));
    });
}

In window platform run the script
path.join will use \ to contact the path
so , ftp.list(dir) will not get the correct info since the ftp server is on a Linux platform
Linux platform-specific path segment separator is /

Note that using Unix / on Windows works perfectly inside nodejs (and other languages), so there's no reason to stick to the Windows legacy at all. (https://github.com/anodynos/upath/)

My solution is use path.posix instead of path

Error 550 if destination folder doesn't exist

Following the discussion from #19. Here's my config:

var FtpDeploy = require('ftp-deploy');
var ftpDeploy = new FtpDeploy();

// var config = require('./config');
var config = {
  username: "XXX",
  password: "XXX", // optional, prompted if none given
  host: "XXX",
  port: 21,
  localRoot: __dirname + "/dist",
  remoteRoot: "/dist",
  continueOnError: true
}

ftpDeploy.on('uploading', function(data) {
    data.totalFileCount;       // total file count being transferred
    data.transferredFileCount; // number of files transferred
    data.percentComplete;      // percent as a number 1 - 100
    data.filename;             // partial path with filename being uploaded
});

ftpDeploy.on('uploaded', function(data) {
  console.log(data);         // same data as uploading event
});

ftpDeploy.deploy(config, function(err) {
  if (err) console.log(err) // error authenticating or creating/traversing directory
  else console.log('finished');
});

ftpDeploy.on('upload-error', function (data) {
  console.log(data.err); // data will also include filename, relativePath, and other goodies
});

ftpDeploy.deploy(config, function(err) {
  if (err) console.log(err)
  else console.log('finished');
});

Here's my script: "deploy": "yarn run build:production && node deploy && yarn run rmdist".

I'm getting this error:

{ Error: 550-Ne peut creer le repertoire: Aucun fichier ou dossier de ce type
550 3029 Ko utilises (2%) - autorises : 102400 Ko
    at module.exports.Ftp.parse (/Users/macadmin/Desktop/Projet/montblanc/wp-content/themes/pamplemousse/node_modules/jsftp/lib/jsftp.js:255:11)
    at module.exports.Ftp.parseResponse (/Users/macadmin/Desktop/Projet/montblanc/wp-content/themes/pamplemousse/node_modules/jsftp/lib/jsftp.js:171:8)
    at Stream.<anonymous> (/Users/macadmin/Desktop/Projet/montblanc/wp-content/themes/pamplemousse/node_modules/jsftp/lib/jsftp.js:139:10)
    at emitOne (events.js:96:13)
    at Stream.emit (events.js:188:7)
    at ResponseParser.reemit (/Users/macadmin/Desktop/Projet/montblanc/wp-content/themes/pamplemousse/node_modules/duplexer/index.js:70:25)
    at emitOne (events.js:96:13)
    at ResponseParser.emit (events.js:188:7)
    at readableAddChunk (/Users/macadmin/Desktop/Projet/montblanc/wp-content/themes/pamplemousse/node_modules/ftp-response-parser/node_modules/readable-stream/lib/_stream_readable.js:195:16)
    at ResponseParser.Readable.push (/Users/macadmin/Desktop/Projet/montblanc/wp-content/themes/pamplemousse/node_modules/ftp-response-parser/node_modules/readable-stream/lib/_stream_readable.js:162:10) code: 550 }

If I create the folder before, empty or full, there's no problem. For now I'm using the lftp command that doesn't encounter this issue.

Any idea? Thanks

Issue with Umlauten in host URI

FtpDeploy works really easy and fine. However, if there is a German "Umlaut" in the host URI (yes, that is possible and valid πŸ˜ƒ), it throws:

Error: getaddrinfo ENOTFOUND www.ΓΌwieumlaut.de (I changed the domain name here)

Also this error is thrown and not returned in to the callback function.

I appreciate any help.

v1.0 refactoring feedback and discussion

@keyle @pirumpi @der-On

Not sure where to post this or best communicate it, but I've just pushed a fairly large refactoring of this module. I wanted to give you all a heads up since each of you have helped with this package at some point in the past.

I'm hoping it makes the code easier to understand and work with. It also makes it a bit easier to add in support for sftp..

If you have any thoughts on the changes or corrections let me know. I'm open to further refactoring.

Hopefully none of you were in the middle of adding a feature or making some large changes...

Thanks!

Error after successful connection

Hi
I've tried to fix this for a couple hours now but I just can't seem to figure out what is going wrong. FTP Data is correct, and User can write, using FileZilla I get no Problems.
I'm using this inside an electron App.

I'm calling:

let ftpDeploy = new FtpDeploy();

let config = {
    user: ftpS.ftpUsername, // NOTE that this was username in 1.x 
    password: store.get('ftpPassword'), // optional, prompted if none given
    host: ftpS.ftpHost,
    port: ftpS.ftpPort,
    localRoot: path.join(currentProjectPath.toString(), '_site'),
    remoteRoot: ftpS.ftpDirectory,
    // include: ['*', '**/*'],      // this would upload everything except dot files
    include: ['*', '**/*'],
    exclude: [],
    deleteRemote: true // delete existing files at destination before uploading
}
    
// use with callback
ftpDeploy.deploy(config, function (err) {
    htmlOutput.innerHTML = ''
    if (err) {
        htmlOutput.insertAdjacentHTML('beforeend', err)
        console.log(err)
    }
    else htmlOutput.insertAdjacentHTML('beforeend', 'Files Uploaded')
})

Getting the following Console Log`

Connected to: SERVERADDRESSHERE
C:\PATHHERE\node_modules\ftp-deploy\src\ftp-deploy.js:80 Connected: Server message: --------- Welcome to Pure-FTPd [privsep] [TLS] ----------
You are user number 14 of 100 allowed.
Local time is now 21:58. Server port: 21.
This is a private system - No anonymous login
IPv6 connections are also welcome on this server.
You will be disconnected after 15 minutes of inactivity.
C:\PATHHERE\assets\js\upload.js:105 Error: Unknown command
    at makeError (C:\PATHHERE\node_modules\@icetee\ftp\lib\connection.js:1128)
    at Parser.<anonymous> (C:\PATHHERE\node_modules\@icetee\ftp\lib\connection.js:122)
    at emitTwo (events.js:126)
    at Parser.emit (events.js:214)
    at Parser._write (C:\PATHHERE\node_modules\@icetee\ftp\lib\parser.js:61)
    at doWrite (_stream_writable.js:387)
    at writeOrBuffer (_stream_writable.js:373)
    at Parser.Writable.write (_stream_writable.js:290)
    at Socket.ondata (C:\PATHHERE\node_modules\@icetee\ftp\lib\connection.js:298)
    at emitOne (events.js:116)
    at Socket.emit (events.js:211)
    at addChunk (_stream_readable.js:263)
    at readableAddChunk (_stream_readable.js:250)
    at Socket.Readable.push (_stream_readable.js:208)
    at TCP.onread (net.js:594)

uploads.js:105 is the line console.log(err) from within the deploy call.

Would love some help on this.

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.