GithubHelp home page GithubHelp logo

areksredzki / electron-release-server Goto Github PK

View Code? Open in Web Editor NEW
2.1K 35.0 548.0 553 KB

A fully featured, self-hosted release server for electron applications, compatible with auto-updater.

License: MIT License

JavaScript 72.60% Shell 1.55% Dockerfile 0.17% Pug 10.22% SCSS 15.46%
electron electron-application updater nodejs angularjs update-server squirrel

electron-release-server's Introduction

Electron Release Server

GitHub stars GitHub forks Join the chat at https://gitter.im/ArekSredzki/electron-release-server

A node web server which serves & manages releases of your Electron App, and is fully compatible with Squirrel Auto-updater (which is built into Electron).

Electron Release Server Demo

Note: Despite being advertised as a release server for Electron applications, it would work for any application using Squirrel.

If you host your project on your Github and do not need a UI for your app, then Nuts is probably what you're looking for. Otherwise, you're in the same boat as I was, and you've found the right place!

Advisory Notices

IMPORTANT:

  • Version 2.0.0 updates many packages, most importantly to SailsJS 1.x.x. At a bare minimum, you must rename connections to datastores in your config/local.js file. You may need to make further changes depending on how significantly you have customized the project.
  • The release of Angular 1.6.0 has broken all electron-release-server versions prior to 1.4.2. Please use the instructions under the Maintenance heading below to update your fork! Sorry for the inconvenience.
  • Since release 1.5.0 several models have changed to accommodate new features. Please use the instructions under Migration to update your database! Sorry for the inconvenience.

Features

  • ✨ Docker 🐳 support (thanks to EvgeneOskin)!
  • ✨ Awesome release management interface powered by AngularJS
    • Authenticates with LDAP, easy to modify to another authentication method if needed
  • ✨ Store assets on server disk, or Amazon S3 (with minor modifications)
    • Use pretty much any database for persistence, thanks to Sails & Waterline
  • ✨ Code-less app customization through env variables
  • ✨ Simple but powerful download urls (NOTE: when no assets are uploaded, server returns 404 by default):
    • /download/latest
    • /download/latest/:platform
    • /download/:version
    • /download/:version/:platform
    • /download/:version/:platform/:filename
    • /download/channel/:channel
    • /download/channel/:channel/:platform
    • /download/flavor/:flavor/latest
    • /download/flavor/:flavor/latest/:platform
    • /download/flavor/:flavor/:version
    • /download/flavor/:flavor/:version/:platform
    • /download/flavor/:flavor/:version/:platform/:filename
    • /download/flavor/:flavor/channel/:channel
    • /download/flavor/:flavor/channel/:channel/:platform
  • ✨ Support pre-release channels (beta, alpha, ...)
  • ✨ Support multiple flavors of your app
  • ✨ Auto-updates with Squirrel:
    • Update URLs provided:
      • /update/:platform/:version[/:channel]
      • /update/flavor/:flavor/:platform/:version[/:channel]
    • Mac uses *.dmg and *.zip
    • Windows uses *.exe and *.nupkg
  • ✨ Auto-updates with NSIS differential updates for Windows
  • ✨ Serve the perfect type of assets: .zip for Squirrel.Mac, .nupkg for Squirrel.Windows, .dmg for Mac users, ...
  • ✨ Specify date of availability for releases
  • ✨ Release notes endpoint
    • /notes/:version/:flavor?

NOTE: if you don't provide the appropriate type of file for Squirrel you won't be able to update your app since the update endpoint will not return a JSON. (.zip for Squirrel.Mac, .nupkg for Squirrel.Windows).

Deploy it / Start it

Follow our guide to deploy Electron Release Server.

Auto-updater / Squirrel

This server provides an endpoint for Squirrel auto-updater, it supports both OS X and Windows.

Documentation

Check out the documentation for more details.

Building Releases

I highly recommend using electron-builder for packaging & releasing your applications. Once you have built your app with that, you can upload the artifacts for your users right away!

Maintenance

You should keep your fork up to date with the electron-release-server master.

Doing so is simple, rebase your repo using the commands below.

git remote add upstream https://github.com/ArekSredzki/electron-release-server.git
git fetch upstream
git rebase upstream/master

Credit

This project has been built from Sails.js up by Arek Sredzki, with inspiration from nuts.

License

MIT License

electron-release-server's People

Contributors

aayore avatar achingbrain avatar akimyou avatar alexander-torosh avatar areksredzki avatar asplinsol avatar barrycarlyon avatar brunocascio avatar dhrubesh avatar dustinbrett avatar evgeneoskin avatar fedegratti avatar hubdotcom avatar jj-8 avatar jmvallejo avatar karljakober avatar kdziamura avatar kjellski avatar krevindiou avatar lauer avatar laurimyllari avatar mathijsvvelde avatar nullxx avatar pellejacobs avatar perlun avatar pierbover avatar qquanwei avatar tarjei avatar tolerant avatar weihong1028 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  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

electron-release-server's Issues

local.js is not found in config folder

After fork the repository, run npm install, I didn't find local.js file in config folder.

When I run npm start, it tell me this error: Cannot read property 'config' of undefined.

Can I use AWS S3 replace of using electron-release-server?

Endless install loop?

As far as I can tell, I'm following your instructions to the letter. After initially installing my app on Windows, my instance of electron-release-server is pinged for updates. The server returns an array containing a single entry: the current version - which I've just installed. The app then proceeds to download this and install it - again, again, and again.

deploy trouble

Hey,I meet with some problems within the local.js

  • Is it possible to use mysql to be the DB(just comment pg and add new lines of mysql in connection?)
  • Do I need to learn LDAP server and develop one first?I don't know what it is...
  • According to sail.js I'd better not to modify the session secret for it was generated by sails when create the app,is it OK to input a randomizedd secret? And is there any difference between seesion.secret and jwt.token_secret

I think it's a little difficult to a novice,it can't be better if there is a Dockerfile

Cannot read property 'name' of undefined

Hi all,

We are getting this error for Win32 releases. It works just fine for OSX.

We have:

  • v0.2.0: our baseline
  • v0.2.1: release we are baking

We have uploaded the .exe files to each version. These are present at the Download page and we were able to manually download them.

An pointers will be greatly appreciated.


For version 0.1.9
$ http get "http://$host/update/win32/0.1.9"

HTTP/1.1 500 Internal Server Error
{
    "message": "Cannot read property 'name' of undefined", 
    "stack": "TypeError: Cannot read property 'name' of undefined at /api/controllers/VersionController.js:125:62
    at tryCatcher (/node_modules/waterline/node_modules/bluebird/js/release/util.js:11:23)
    at Promise._settlePromiseFromHandler (/node_modules/waterline/node_modules/bluebird/js/release/promise.js:491:31)
    at Promise._settlePromise (/node_modules/waterline/node_modules/bluebird/js/release/promise.js:548:18)
    at Promise._settlePromise0 (/node_modules/waterline/node_modules/bluebird/js/release/promise.js:593:10)
    at Promise._settlePromises (/node_modules/waterline/node_modules/bluebird/js/release/promise.js:676:18)
    at Promise._fulfill (/node_modules/waterline/node_modules/bluebird/js/release/promise.js:617:18)
    at /node_modules/waterline/node_modules/bluebird/js/release/nodeback.js:42:21
    at wrapper (/node_modules/waterline/node_modules/lodash/index.js:3592:19)
    at applyInOriginalCtx (/node_modules/waterline/lib/waterline/utils/normalize.js:421:80)
    at wrappedCallback (/node_modules/waterline/lib/waterline/utils/normalize.js:324:18)
    at callback.success (/node_modules/waterline/node_modules/switchback/lib/normalize.js:33:31)
    at _switch (/node_modules/waterline/node_modules/switchback/lib/factory.js:58:28)
    at returnResults (/node_modules/waterline/lib/waterline/query/finders/basic.js:392:9)
    at /node_modules/waterline/lib/waterline/query/finders/basic.js:277:16
    at /node_modules/waterline/lib/waterline/query/finders/operations.js:78:46
    at wrapper (/node_modules/waterline/node_modules/lodash/index.js:3592:19)
    at applyInOriginalCtx (/node_modules/waterline/lib/waterline/utils/normalize.js:421:80)
    at wrappedCallback (/node_modules/waterline/lib/waterline/utils/normalize.js:324:18)
    at callback.success (/node_modules/waterline/node_modules/switchback/lib/normalize.js:33:31)
    at _switch (/node_modules/waterline/node_modules/switchback/lib/factory.js:58:28)
    at /node_modules/sails-postgresql/lib/adapter.js:1469:16"
}
For version 0.2.0 and 0.2.1
$ http get "http://$host/update/win32/0.2.0"

HTTP/1.1 204 No Content

(empty body)

Used ports list

I getting 400 Bad Request on socket.io/?__sails_io_sdk_version=0.13.6&__sails_io_sdk_platform=browser&__sails_io_sdk_language=javascript&EIO=3&transport=websocket

Which port need to be open (except 1337 or we point on config) ?
My localhost is ok but i am using pm2 & nginx for port forwarding,

location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwared-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;

    proxy_pass http://127.0.0.1:5014/;
    proxy_redirect off;
  }

Version candidate undefined

I've tried this on latest master and on latest release:

I have two versions in my code, 2.0.0 and 2.0.1 - both osx_64
When I call the following URL: localhost:1337/update/osx_64/2.0.0 I get this response:

debug: Update Search Query { platform: [ 'osx_64' ], version: '2.0.0', channel: 'stable' }
debug: Applicable Channels [ 'stable' ]
debug: Time Filter { '>': 2016-07-11T14:16:05.000Z }
debug: Newer Versions [ { assets: 
     [ { name: 'MyApp2.0.1.dmg',
         platform: 'osx_64',
         filetype: '.dmg',
         hash: '',
         size: 56474430,
         download_count: 0,
         fd: '/Users/andy/electron-versions/8b2c19d4-9265-4333-bd92-028afceafc87.dmg',
         createdAt: '2016-07-11T14:16:33.000Z',
         updatedAt: '2016-07-11T14:16:33.000Z',
         version: '2.0.1' } ],
    channel: 'stable',
    name: '2.0.1',
    notes: 'dsgs',
    createdAt: '2016-07-11T14:16:22.000Z',
    updatedAt: '2016-07-11T14:16:22.000Z' } ]
debug: Version candidate undefined
debug: Current version 2.0.0
debug: Version candidate denied

It looks like the latest version is undefined, but I can't see how it's possible for me to influence what the main version is?

Cannot request 32bit Windows version via update/platform/version/stable

I am either misunderstanding the documentation or this is not possible. Inside my Electron app, I know if I am ia32 or x64 and need auto-updates for the same architecture. I have tried combinations such as:

/update/win32/1.1.0/stable
/update/win64/1.1.0/stable
/update/windows_32/1.1.0/stable
/update/windows_64/1.1.0/stable

I understand that win32 is a common term for Windows platform in general but was going off of other posts I have read on here for possible solutions.

I have the following assets uploaded for v1.1.1 on the server:

app-1.1.1-full-ia32.nupkg
app-32bit.exe
app-1.1.1-full.nupkg
app.exe

All of my attempts have resulted in the 64bit version being served up to my auto update logic. Can anyone point me in the right direction or blatantly point out my stupidity? Thanks!

Unit Testing

The api offered should be extensively unit tested.

Unfortunately I don't have time to dedicate to such a task right now, volunteers are much appreciated!

Software License

I stumbled across this from the electron docs, so I would have assumed this was under an open source license. Checking quickly brought me to the conclusion that this is completely unlicensed, and as such defaults to copyright law which reserves all right to retain ownership and prevent use or modification of the code.

Is there any plan to release this under an open source license? Or at least provide some clarification on whether we have permission to use this project, if you aren't going to put one of the generic licenses on it?

Download url returned from "update" endpoint contains undefined version.

I know this is a new project so not sure if you're ready for bug reports, but I figured I'd share my experience with you just in case.

Here is the url I'm using:
http://xxx.xxx.xxx.xxx:5014/update/osx_x64/0.0.2

And here is what is returned:
{"url":"http://xxx.xxx.xxx.xxx:5014/download/version/0.0.3/undefined?filetype=zip","name":"0.0.3","notes":"## 0.0.3\nBlah","pub_date":"2016-03-03T22:33:56.224Z"}

I struggled a bit finding the right way to create the update url as well. The docs make it look like the url parameters can be specified in a couple of different ways and I tried just about every combination of urls, query string variables, and platform names until I finally found the one above that worked. Perhaps that's by design, but if so the docs could make it a little more clear :)

Anyways, super glad somebody put something like this together, I was just about to build something like this myself when I discovered this project. Great job!

Squirrel Endpoint for Windows Either 404 or empty

Hi There,

I'm working with the latest release of electron-release-server 1.1.1 and am getting some odd errors from Squirrel when setting the endpoint for updates.

From digging it seems that Squirrel.Windows auto-appends the /RELEASES to the URL set for auto-updates. So initially I had set my update endpoint to:

https://download.myapp.io/update/win32/1.0.0/stable

I'm able to access that directly and get the RELEASES file, but Squirrel is throwing an error saying:

The remote server returned an error: (404) Not Found.

Additionally if I change the endpoint to (just for testing):

https://download.myapp.io/update/win32

I get the error:

Remote release File is empty or corrupted

Which seems to be at least reaching the server. Not sure if I'm missing something in my configuration that could be causing this. Any insights you could offer would be greatly appreciated.

Thanks!

How do I prevent the electron-release-server from responding with a 304?

autoUpdater.checkForUpdates() fails with "Error: Update check failed".

  • The electron-release-server response is a 304 (I used wireshark to check this).
  • silly output is "silly: res.ok() :: Sending 200 ("OK") response".

I'm pretty certain that it's this 304 response thats causing the autoupdater check to fail. If so, do I prevent this from happening, otherwise what else could be causing this?

Thanks!

Unable to create asset error during upload

Running into an odd issue after update - whenever I try to upload an asset to a version the progress bar appears and it begins to upload. After reaching ~35% it resets back to 0 and continues uploading. It does that a couple times and then stops and displays a notification with the error:

Unable to create asset
Unknown error occurred

Uploading smaller files it gets to ~20% and fails after one time.

In local.js the files section looks like:

files: {
  dirname: 'downloads',
  maxBytes: 524288000
}

The downloads directly is set up in the app folder with write permissions for the app/nginx.

Any tips on what could be causing this would be greatly appreciated.

Thanks!

"https" is not working.

Thanks for this awesome electron release server.
It's working very fine with port 80 (http),
When i enable https , it was throwing below error.
NOTE: i purchased cert from godaddy and placed them in config/ssl directory.
Also enabled port 443 in env/production.js

[email protected] start /usr/local/electron-release-server
node app.js

/usr/local/electron-release-server/config/local.js:99
ssl: {
^^^

SyntaxError: Unexpected identifier
at exports.runInThisContext (vm.js:53:16)
at Module._compile (module.js:414:25)
at Object.Module._extensions..js (module.js:442:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:313:12)
at Module.require (module.js:366:17)
at require (module.js:385:17)
at /usr/local/electron-release-server/node_modules/include-all/index.js:129:29
at Array.forEach (native)
at requireAll (/usr/local/electron-release-server/node_modules/include-all/index.js:44:9)
at buildDictionary (/usr/local/electron-release-server/node_modules/sails/node_modules/sails-build-dictionary/index.js:68:14)
at Function.module.exports.aggregate (/usr/local/electron-release-server/node_modules/sails/node_modules/sails-build-dictionary/index.js:190:9)
at Array.loadOtherConfigFiles (/usr/local/electron-release-server/node_modules/sails/lib/hooks/moduleloader/index.js:239:27)
at /usr/local/electron-release-server/node_modules/sails/node_modules/async/lib/async.js:591:38
at _arrayEach (/usr/local/electron-release-server/node_modules/sails/node_modules/async/lib/async.js:85:13)
at Object.async.auto (/usr/local/electron-release-server/node_modules/sails/node_modules/async/lib/async.js:552:9)

Thanks,
Raj

Handle non-existent asset file on request

Currently the server throws an ENOENT error and exists upon trying to serve a non-existent asset.
We would like it to log the error and return a 500 response instead.

[Question] Instructions on configuring for S3?

The Readme mentions that it's easy to support assets on S3, but there are no docs for this. Is this feasible right now? I could send over a PR if someone can point me to the right places :)

anyone programmatically adding assets?

Hi,
I'm interested in adding assets to the database programmatically.
I get partially through the upload of a file and then I get a 400 http error.

One thing that I know that I am not doing providing the sails.sid cookie with the request.
Is this required?

I am able to successfully add a version prior to trying to add an asset to the version.
Here is my python code. Any advice appreciated, even in other languages.

def addAsset(version, platform, asset):
    # I've already authenticated as admin
    token = auth.getToken()
    url = http:/localhost:1337/asset'
    filename = os.path.basename(asset)
    files = {'token': token, 'version': version, 'platform': platform, 'file': (filename, open(asset, 'rb'), 'application/zip', {'Expires': '0'})}
    headers = {'Content-Type': 'multipart/form-data', 'Authorization' : 'Bearer %s' %  token, 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Accept': 'application/json, text/plain, */*'}
    r = requests.post(url, files=files, headers=headers)

File upload request times out after 2 minutes

I noticed this when I was uploading a larger file (~120mb) over a slow connection. The request times out after 2 minutes giving a generic error. Perhaps the timeout could be extended when uploading files? To 10 minutes maybe?

error: error: password authentication failed for user "electron_release_server_user"

I was trying to throw the release server up on an Azure Ubuntu 14.04 VM.

I followed all of the steps that I followed in order to get this working on OS X locally but I'm running in to this issue:

error: error: password authentication failed for user "electron_release_server_user"

I know for a fact that my credentials are correct because

psql -U electron_release_server_user -h localhost electron_release_server

seems to work fine when it prompts me to put the password in.

My local.js includes:

connections: {
    postgresql: {
      adapter: 'sails-postgresql',
      host: 'localhost',
      user: 'electron_release_server_user',
      password: '',
      database: 'electron_release_server'
    }
  },

  session: {
    secret: '1939DFCED4B55FB4179081E8EBBC22134CCC5E08D3A5CC3A549783BF9DB1D2A2',
    database: 'electron_release_server_sessions',
    host: 'localhost',
    user: 'electron_release_server_user',
    password: '',
    port: 5432
  },

Please help as soon as you can. I'm in a bit of a rush to get this out the door.

Feature: Let users select executable architecture

We can reliably automatically detect the system platform from the browser user-agent.
However, this cannot be said for their system architecture, which is either 64 or 32 bit.

For Windows and Linux users, they should be presented to choose from the available architectures.

Cert error : You may need to install an Intermediate/chain certificate to link it to a trusted root certificate

This electron-release-server works great.

I am working an enabling https ,
I tried with Godaddy and Thawte certificate,

when i check the https site, i am receiving below error.

"The certificate is not trusted in all web browsers. You may need to install an Intermediate/chain certificate to link it to a trusted root certificate."

intermediate/chaining cert are there in right place.
i am wondering, is node.js handle intermediate certificate differently ?
Godaddy provides a certificate chain file, This single file has 3 certificates, will this cause issue ?

NOTE: Signed cert, certificate chain and private key are there in right location.

am i missing anything ? kindly advise us.

Thanks,
Raj

Failed: Error during WebSocket handshake: Unexpected response code: 400

@ArekSredzki , First of all, great tool and code. I really like your work. I am setting your server tool on our production server but it's giving me this error -

"WebSocket connection to 'wss://electronreleaseserver.xyz.abc.edu/socket.io/?__sails_io_sdk_version=0…tform=browser&__sails_io_sdk_language=javascript&EIO=3&transport=websocket' failed: Error during WebSocket handshake: Unexpected response code: 400
sails.io.js:438  
        Socket is trying to reconnect to Sails...
_-|>_-  (attempt #5)

If i run same code on production server using npm start, works fine on localhost:1337

Also, I have following in local.js under config -

 connections: {
    postgresql: {
      adapter: 'sails-disk'
    }
  },

Please help if you have any idea about this error, I have release this week.

function sals_session_store_get(unknown) does not exist

Hi There,

Really appreciate this package, should make things much easier.

I'm running into an odd issue when running npm start on the server:

error:` sails-pg-session#get - error: function sails_session_store_get(unknown) does not exist
at Connection.parseE (/usr/share/nginx/html/electron-release-server/node_modules/sails-pg-session/node_modules/pg/lib/connection.js:539:11)
at Connection.parseMessage (/usr/share/nginx/html/electron-release-server/node_modules/sails-pg-session/node_modules/pg/lib/connection.js:366:17)
at Socket. (/usr/share/nginx/html/electron-release-server/node_modules/sails-pg-session/node_modules/pg/lib/connection.js:105:22)
at emitOne (events.js:77:13)
at Socket.emit (events.js:169:7)
at readableAddChunk (_stream_readable.js:153:18)
at Socket.Readable.push (_stream_readable.js:111:10)
at TCP.onread (net.js:531:20) { [error: function sails_session_store_get(unknown) does not exist]
name: 'error',
length: 218,
severity: 'ERROR',
code: '42883',
detail: undefined,
hint: 'No function matches the given name and argument types. You might need to add explicit type casts.',
position: '22',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_func.c',
line: '306',
routine: 'ParseFuncOrColumn' }

All the services appear to be running and accessible, so not sure if I missed something in config.

Windows getting 404 on download update

So im having trouble getting the windows updates to work correctly. Ive set up an update version (1.0.1) on the server, and updated the assets.

(win32) XXX-1.0.1-full-ia32.nupkg
(win64) XXX-1.0.1-full.nupkg
(mac) XXX-1.0.1-mac.zip

When the windows build trys to go to download the update, I get the following error from squirrel,

"The remote server returned an error: (404) Not Found."

When I curl the following url,

"curl -i https://<my_server>/update/windows_64/1.0.1/RELEASES"

I get a 204 No Content (which I think is correct).

Is there some sort of naming convention im screwing up, or something wrong im doing?

Side Note -- im generating the url like this:

const version = package.version
const platform = os.platform() + '_' + os.arch()
switch(os.arch()) {
    case 'ia32':
      platform = 'windows_32';
    break;
    case 'x64':
      platform = 'windows_64';
    break;
  }

End Result:
https://auto-updater.servername.com/update/${platform}/${version}

Unable to get it running

Hi there,

What information are we supposed to put in local.js? Why does the app need postgres etc..?

Cheers.

/download/channel/stable on Win32 downloads 64 bits version

Link to download latests stable version on Win32 platforms (tested on win10/XP, chrome/IE) always downloads the x64 version.

Log says: Asset requested with options { platform: [ 'windows_32', 'windows_64' ] }

But pointing to /download/channel/stable/windows_32 the 32bits version is downloaded without problems.

Log says: Asset requested with options { platform: [ 'windows_32' ] }

We have one version with the 4 assets:

App-ia32-1.1.6-full.nupkg   Windows 32 bit
App-x64-1.1.6-full.nupkg    Windows 64 bit
AppInstaller-ia32-1.1.6.exe Windows 32 bit
AppInstaller-x64-1.1.6.exe  Windows 64 bit

It's a known problem? I'm doing something wrong?

Thanks!

is PostgreSQL mandatory?

i see mongodb option in config/connections.js, but i am not sure is acceptable because no referral on docs.
Can we use mongodb or maybe just disk db?

Heroku?

How can I deploy this onto an Heroku Server or an similar Service?

Auto-updating on OSX always response with 204

In the client I setup as:

updater.setFeedURL('http://127.0.0.1:1337/update/osx/1.2.0?v=1.2.0');

And I got the log on the server side:

debug: Update Search Query { platform: [ 'osx_64' ], version: '1.2.0', channel: 'stable' }
debug: Applicable Channels [ 'stable' ]
debug: The specified version does not exist
debug: Time Filter undefined
debug: Newer Versions [ { assets:
[ { name: 'myapp-1.5.0.dmg',
hash: '',
filetype: '.dmg',
fd: '/data1/web/local/app-releaser/.tmp/uploads/clients/9188cb5c-2813-402e-bd9a-89eac3635365.dmg',
size: 57956105,
version: '1.4.0',
platform: 'osx_64',
download_count: 0,
createdAt: '2016-07-19T11:01:51.093Z',
updatedAt: '2016-07-19T11:01:51.093Z' } ],
channel: 'stable',
name: '1.4.0',
notes: 'test1',
createdAt: '2016-07-15T09:34:15.677Z',
updatedAt: '2016-07-15T09:34:15.677Z' } ]
debug: Version candidate undefined
debug: Current version undefined
debug: Version candidate denied

According to the log, it actually has a new version, but it also says

debug:Version candidate undefined
debug: Current version undefined
debug: Version candidate denied

and return 204.

Is there anything wrong with my settings?

Thanks!

which file should I upload

when use electron-builder to build a app,it creates a few files such as foo setup.exe,foo-0.0.1-full.nupkg and RELEASES.But when I add a new version and click add assest, I can upload only one file.Need I upload all of those files and how to do that

how to create delta file

Hi:
after uploading the first version of my app,how can I build the second version to support auto-update?
it seems that auto-update need a foo-version-delta.nupkg file right?I found an option win.remoteReleases in electron-builder which requires a URL to your exists updates.I'm not sure what this exactly means.For example,I created a version 0.0.1 and upload assests foo-0.0.1-full.nupkg and foo setup.exe, and then I do some changes for my app and want to build the version 0.0.2,but I don't how to build the delta file

Release to npm?

Hi, is there a package on npm? Would you like to release it?

[FR] support multiple apps

That would be great to be able to handle multiple apps on one instance.
Would make things a lot easier!

Thanks

Nginx and Amazon ELB blocking websocket connections

Thank you very much for electron release server , It works great !

We tried to use nginx as webserver , and we followed the documentation.
And noticed below issues.

  • When i click "show all versions" , it shows nothing.
  • Authentication fails too.

So we took OFF the ngnix and placed amazon Load balancer in front of electron release server.
Means, Amazon ELB receives connections from user and send it to electron release server.
BUT still we got below issues.

  • When i click "show all versions" , it shows nothing.
    • Authentication fails too.

Without Ngnix or Amazon ELB , Electron Release server works fine.
am i missing anything ? any advise would highly appreciable !

Thanks,
Bommuraj

Unable to add Version

I run my Version on Heroku and my postgresql on ElephantSQL.

When I try to add a new Version I get:

2016-09-07T20:23:26.747987+00:00 heroku[router]: at=info method=POST path="/api/version" host=ls-update-alt.herokuapp.com request_id=ab4ef905-9483-4ee3-8036-547f65b9a8a4 fwd="91.35.4.246" dyno=web.1 connect=0ms service=49ms status=500 bytes=356
2016-09-07T20:23:26.741094+00:00 app[web.1]: Sending 500 ("Server Error") response: 
2016-09-07T20:23:26.741113+00:00 app[web.1]:  Error (E_UNKNOWN) :: Encountered an unexpected error
2016-09-07T20:23:26.741113+00:00 app[web.1]: error: relation "public.channel" does not exist
2016-09-07T20:23:26.741115+00:00 app[web.1]:     at Connection.parseE (/app/node_modules/sails-postgresql/node_modules/pg/lib/connection.js:539:11)
2016-09-07T20:23:26.741116+00:00 app[web.1]:     at Connection.parseMessage (/app/node_modules/sails-postgresql/node_modules/pg/lib/connection.js:366:17)
2016-09-07T20:23:26.741116+00:00 app[web.1]:     at Socket.<anonymous> (/app/node_modules/sails-postgresql/node_modules/pg/lib/connection.js:105:22)
2016-09-07T20:23:26.741117+00:00 app[web.1]:     at emitOne (events.js:90:13)
2016-09-07T20:23:26.741119+00:00 app[web.1]:     at readableAddChunk (_stream_readable.js:153:18)
2016-09-07T20:23:26.741119+00:00 app[web.1]:     at Socket.Readable.push (_stream_readable.js:111:10)
2016-09-07T20:23:26.741120+00:00 app[web.1]:     at TCP.onread (net.js:534:20)
2016-09-07T20:23:26.741121+00:00 app[web.1]: 

WebSocket error

Hi,

I have added nginx as webserver But i could not find any asset on download page.
Also i am seeing below error on browser console.

WebSocket connection to 'ws://ec2-54-205-65-189.compute-1.amazonaws.com/socket.io/?__sails_io_sdk_version=0.13.8&__sails_io_sdk_platform=browser&__sails_io_sdk_language=javascript&EIO=3&transport=websocket' failed: WebSocket is closed before the connection is established.

Any suggestion would be highly appreciable.

Thanks and Regards,
Bommuraj Paramaraj

Uploading assets - xyzrelease.com/api/asset gives 404 error

@ArekSredzki Thank you for all your advice yesterday for using postgres for production, and i have it running now. Only problem i am getting now is during uploading assets.
API is giving me an 404 error

angular.js:11821 POST https://electronreleaseserver.abc.edu/api/asset 404 (Not Found)

Anything i have to do specifically for API ?

npm start - error: A hook(`orm`) failed to load!

npm start leaves me with this:

error: A hook (orm) failed to load!
error: TypeError: Cannot read property 'config' of undefined
at validateModelDef (/Users/xxx/electron-release-server/node_modules/sails-hook-orm/lib/validate-model-def.js:108:84)
at /Users/xxx/electron-release-server/node_modules/sails-hook-orm/lib/initialize.js:218:36
at arrayEach (/Users/xxx/electron-release-server/node_modules/sails-hook-orm/node_modules/lodash/index.js:1289:13)
at Function. (/Users/xxx/electron-release-server/node_modules/sails-hook-orm/node_modules/lodash/index.js:3345:13)
at Array.async.auto._normalizeModelDefs (/Users/xxx/electron-release-server/node_modules/sails-hook-orm/lib/initialize.js:216:11)
at listener (/Users/xxx/electron-release-server/node_modules/async/lib/async.js:605:42)
at /Users/xxx/electron-release-server/node_modules/async/lib/async.js:544:17
at _arrayEach (/Users/xxx/electron-release-server/node_modules/async/lib/async.js:85:13)
at Immediate.taskComplete (/Users/xxx/electron-release-server/node_modules/async/lib/async.js:543:13)
at processImmediate as _immediateCallback [TypeError: Cannot read property 'config' of undefined]

Any thoughts? :(

Error starting server

Hey guys
I'm setting up my server for the very first time and I'm having this issue that I don't understand how to solve, maybe you can lend a hand, please?
I tried the troubleshooting tips, but still no luck.

Are "grunt" and related grunt task modules installed locally? Run npm install if you're not sure.
Or maybe you don't have permissions to access the .tmp directory?

About malformed LESS, SASS, CoffeeScript file, etc. I haven't edited or created any files yet.
Any ideas?
Thanks!

npm start

> [email protected] start /var/www/node
> node app.js

info: 
info:                .-..-.
info: 
info:    Sails              <|    .-..-.
info:    v0.12.4             |\
info:                       /|.\
info:                      / || \
info:                    ,'  |'  \
info:                 .-'.-==|/_--'
info:                 `--'-------' 
info:    __---___--___---___--___---___--___
info:  ____---___--___---___--___---___--___-__
info: 
info: Server lifted in `/var/www/node`
info: To see your app, visit http://localhost:6000
info: To shut down Sails, press <CTRL> + C at any time.

debug: -------------------------------------------------------
debug: :: Wed Sep 07 2016 06:17:54 GMT+0000 (UTC)

debug: Environment : development
debug: Port        : 6000
debug: -------------------------------------------------------
error: ** Grunt :: An error occurred. **
error: 
------------------------------------------------------------------------
Aborted due to warnings.
Running "sass:dev" (sass) task
>> Error: File to import not found or unreadable: ../bower_components/bootstrap-sass-official/assets/stylesheets/_bootstrap.scss
>>        Parent style sheet: /var/www/node/assets/styles/importer.scss
>>         on line 4 of assets/styles/importer.scss
>> >> @import '../bower_components/bootstrap-sass-official/assets/stylesheets/_boots
>>    ^
Warning:  
------------------------------------------------------------------------

error: Looks like a Grunt error occurred--
error: Please fix it, then **restart Sails** to continue running tasks (e.g. watching for changes in assets)
error: Or if you're stuck, check out the troubleshooting tips below.

error: Troubleshooting tips:
error: 
error:  *-> Are "grunt" and related grunt task modules installed locally?  Run `npm install` if you're not sure.
error: 
error:  *-> You might have a malformed LESS, SASS, CoffeeScript file, etc.
error: 
error:  *-> Or maybe you don't have permissions to access the `.tmp` directory?
error:      e.g., `/var/www/node/.tmp` ?
error: 
error:      If you think this might be the case, try running:
error:      sudo chown -R 500 /var/www/node/.tmp

MongoDb instead of PostgreSql, sessions?

When using the sails-mongo adapter it's easy to configure electron-release-server to use mongodb instead of postgresql for storing versions and assets.

package.json:

"dependencies": {
...
    "sails-postgresql": "^0.12.1", // not used anymore, instead:
    "sails-mongo": "^0.12.0", // new adapter
    "connect-mongodb-session": "^1.1.1", // used for session.js, see below
...
  },

local.js:

  connections: {
    postgresql: {
      adapter: 'sails-mongo', // was: 'sails-postgresql'
      host: 'localhost',
      port: 27017,
      user: '',
      password: '',
      database: 'electron_release_server'
    }
  },

But what about sessions? Not sure where, when and why they are used but some configuration is available for it.

local.js:

session: {
    // Recommended: 63 random alpha-numeric characters
    // Generate using: https://www.grc.com/passwords.htm
    secret: 'LE8wNW5oTFbJZqJtfitHRPkcsdOaybamQ9cWkovbLJPh8DjfTGCQeNCaEZvxpGQ',
    database: 'electron_release_server_sessions',
    host: 'localhost',
    port: 27017
  },

session.js:

module.exports.session = {
  adapter: 'connect-mongodb-session',
  url: 'mongodb://:localhost:27017/electron_release_server_session'
};

With these settings I can add versions with assets in the admin(http://localhost:1337/admin) and request the frontend (http://localhost:1337/update?platform=Windows%2064%20bit) and notice that there is a 'test' mongo-database created with a sessions collection:

image

So where does this 'test' come from and why isn't it 'electron_release_server_sessions' like configured in the session in local.js and in the mongodb-url in session.js.

Thank you for your effort and awesome project!

On "checking-for-update" in Windows 64 I get The remote server returned an error: (500) Internal Server Error

Im trying to use auto-updates with electron-boilerplate & electron-builder. To host my updates I've setup a test electron-release-server & set my feed url to http://52.64.55.12:1337/update/win64/0.1.0/stable.

Trying desperately to get auto-updates on windows working but my solution does not seem to work.

Can someone help me & check if my release server has been setup correctly? Also, if anyone could share sample code for auto-update on windows it would be much appreciated.

My squirrel log is as follows ..
2016-07-17 20:15:42> Program: Starting Squirrel Updater: --download http://52.64.55.12:1337/update/win64/0.1.0/stable 2016-07-17 20:15:43> Program: Fetching update information, downloading from http://52.64.55.12:1337/update/win64/0.1.0/stable 2016-07-17 20:15:43> SingleGlobalInstance: Failed to grab lockfile, will retry: C:\Users\rousr\AppData\Local\Temp\.squirrel-lock-295D93693F94C0D6D2061F2C88BED0805730F7ED: System.IO.IOException: The process cannot access the file 'C:\Users\rousr\AppData\Local\Temp\.squirrel-lock-295D93693F94C0D6D2061F2C88BED0805730F7ED' because it is being used by another process. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost) at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share) at Squirrel.SingleGlobalInstance..ctor(String key, TimeSpan timeOut) 2016-07-17 20:15:43> SingleGlobalInstance: Failed to grab lockfile, will retry: C:\Users\rousr\AppData\Local\Temp\.squirrel-lock-295D93693F94C0D6D2061F2C88BED0805730F7ED: System.IO.IOException: The process cannot access the file 'C:\Users\rousr\AppData\Local\Temp\.squirrel-lock-295D93693F94C0D6D2061F2C88BED0805730F7ED' because it is being used by another process. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost) at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share) at Squirrel.SingleGlobalInstance..ctor(String key, TimeSpan timeOut) 2016-07-17 20:15:43> SingleGlobalInstance: Failed to grab lockfile, will retry: C:\Users\rousr\AppData\Local\Temp\.squirrel-lock-295D93693F94C0D6D2061F2C88BED0805730F7ED: System.IO.IOException: The process cannot access the file 'C:\Users\rousr\AppData\Local\Temp\.squirrel-lock-295D93693F94C0D6D2061F2C88BED0805730F7ED' because it is being used by another process. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost) at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share) at Squirrel.SingleGlobalInstance..ctor(String key, TimeSpan timeOut) 2016-07-17 20:15:43> SingleGlobalInstance: Failed to grab lockfile, will retry: C:\Users\rousr\AppData\Local\Temp\.squirrel-lock-295D93693F94C0D6D2061F2C88BED0805730F7ED: System.IO.IOException: The process cannot access the file 'C:\Users\rousr\AppData\Local\Temp\.squirrel-lock-295D93693F94C0D6D2061F2C88BED0805730F7ED' because it is being used by another process. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost) at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share) at Squirrel.SingleGlobalInstance..ctor(String key, TimeSpan timeOut) 2016-07-17 20:15:44> SingleGlobalInstance: Failed to grab lockfile, will retry: C:\Users\rousr\AppData\Local\Temp\.squirrel-lock-295D93693F94C0D6D2061F2C88BED0805730F7ED: System.IO.IOException: The process cannot access the file 'C:\Users\rousr\AppData\Local\Temp\.squirrel-lock-295D93693F94C0D6D2061F2C88BED0805730F7ED' because it is being used by another process. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost) at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share) at Squirrel.SingleGlobalInstance..ctor(String key, TimeSpan timeOut) 2016-07-17 20:15:44> SingleGlobalInstance: Failed to grab lockfile, will retry: C:\Users\rousr\AppData\Local\Temp\.squirrel-lock-295D93693F94C0D6D2061F2C88BED0805730F7ED: System.IO.IOException: The process cannot access the file 'C:\Users\rousr\AppData\Local\Temp\.squirrel-lock-295D93693F94C0D6D2061F2C88BED0805730F7ED' because it is being used by another process. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost) at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share) at Squirrel.SingleGlobalInstance..ctor(String key, TimeSpan timeOut) 2016-07-17 20:15:44> CheckForUpdateImpl: Generated new staging user ID: badd65b5-e4bb-5d04-8f21-f24a3cad9bc3 2016-07-17 20:15:44> CheckForUpdateImpl: Downloading RELEASES file from http://52.64.55.12:1337/update/win64/0.1.0/stable 2016-07-17 20:15:44> FileDownloader: Downloading url: http://52.64.55.12:1337/update/win64/0.1.0/stable/RELEASES?id=electronboilerplate&localVersion=0.1.0&arch=amd64 2016-07-17 20:15:44> IEnableLogger: Failed to download url: http://52.64.55.12:1337/update/win64/0.1.0/stable/RELEASES?id=electronboilerplate&localVersion=0.1.0&arch=amd64: System.Net.WebException: The remote server returned an error: (500) Internal Server Error. at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult) at System.Net.WebClient.GetWebResponse(WebRequest request, IAsyncResult result) at System.Net.WebClient.DownloadBitsResponseCallback(IAsyncResult result) --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Squirrel.Utility.<LogIfThrows>d__351.MoveNext()
2016-07-17 20:15:44> FileDownloader: Downloading url: http://52.64.55.12:1337/update/win64/0.1.0/stable/releases?id=electronboilerplate&localversion=0.1.0&arch=amd64
2016-07-17 20:15:44> IEnableLogger: Failed to download url: http://52.64.55.12:1337/update/win64/0.1.0/stable/releases?id=electronboilerplate&localversion=0.1.0&arch=amd64: System.Net.WebException: The remote server returned an error: (500) Internal Server Error.
at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
at System.Net.WebClient.GetWebResponse(WebRequest request, IAsyncResult result)
at System.Net.WebClient.DownloadBitsResponseCallback(IAsyncResult result)
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Squirrel.Utility.d__351.MoveNext() 2016-07-17 20:15:44> CheckForUpdateImpl: Download resulted in WebException (returning blank release list): System.Net.WebException: The remote server returned an error: (500) Internal Server Error. at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult) at System.Net.WebClient.GetWebResponse(WebRequest request, IAsyncResult result) at System.Net.WebClient.DownloadBitsResponseCallback(IAsyncResult result) --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Squirrel.Utility.<LogIfThrows>d__351.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Squirrel.FileDownloader.d__3.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
at Squirrel.UpdateManager.CheckForUpdateImpl.d__2.MoveNext()
2016-07-17 20:15:44> FileDownloader: Downloading url: http://52.64.55.12:1337/update/win64/0.1.0/stable/RELEASES?id=electronboilerplate&localVersion=0.1.0&arch=amd64
2016-07-17 20:15:45> IEnableLogger: Failed to download url: http://52.64.55.12:1337/update/win64/0.1.0/stable/RELEASES?id=electronboilerplate&localVersion=0.1.0&arch=amd64: System.Net.WebException: The remote server returned an error: (500) Internal Server Error.
at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
at System.Net.WebClient.GetWebResponse(WebRequest request, IAsyncResult result)
at System.Net.WebClient.DownloadBitsResponseCallback(IAsyncResult result)
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Squirrel.Utility.d__351.MoveNext() 2016-07-17 20:15:45> FileDownloader: Downloading url: http://52.64.55.12:1337/update/win64/0.1.0/stable/releases?id=electronboilerplate&localversion=0.1.0&arch=amd64 2016-07-17 20:15:45> IEnableLogger: Failed to download url: http://52.64.55.12:1337/update/win64/0.1.0/stable/releases?id=electronboilerplate&localversion=0.1.0&arch=amd64: System.Net.WebException: The remote server returned an error: (500) Internal Server Error. at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult) at System.Net.WebClient.GetWebResponse(WebRequest request, IAsyncResult result)

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.