Giter VIP home page Giter VIP logo

ipfs / ipfs-desktop Goto Github PK

View Code? Open in Web Editor NEW
5.8K 188.0 844.0 17.96 MB

An unobtrusive and user-friendly desktop application for IPFS on Windows, Mac and Linux.

Home Page: https://docs.ipfs.tech/install/ipfs-desktop/

License: MIT License

JavaScript 96.39% NSIS 1.27% Shell 0.30% PowerShell 0.30% TypeScript 0.67% CSS 0.97% HTML 0.10%
menubar ipfs p2p desktop protocol dweb ipfs-desktop ipfs-gui

ipfs-desktop's Issues

Create Help Page

There should be some form of help/documentation page inside the app, so people can understand what the app is doing and how to use it.

name of app?

maybe we should use a different name than "electron-ipfs" -- maybe "IPFS Node - Alpha" or "IPFS Node" ?

Add test setup

Every decent (software) project needs tests

"Frontend" (browser processes)

This is about testing react components in isolation. To run the tests we should use karma and spawn a chrome process (close enough to electrons chromium instances). Interesting modules and notes

"Backend" (electron main process)

This is much harder, as too much functionality depends on running the real deal aka an electron instance. So very happy to hear any suggestions around this.

Update stats on window show

At the moment depending on the timeout position there is a delay between opening the profile screen and the stats updating. We should listen for the window show event and update the stats at that point.

Bundle correct go-ipfs version when generating the bundle

With Ubuntu 15.04:

~/Downloads/Station-linux-x64 $ ./Station 
info: Booting
info: Application is ready
info: Starting tray
Uncaught Error: non-zero exit code 2
  while running: /home/kyle/Downloads/Station-linux-x64/resources/app/node_modules/subcomandante/subcom 7894 /home/kyle/Downloads/Station-linux-x64/resources/app/node_modules/go-ipfs/bin/ipfs version

  /home/kyle/Downloads/Station-linux-x64/resources/app/node_modules/go-ipfs/bin/ipfs: 1: /home/kyle/Downloads/Station-linux-x64/resources/app/node_modules/go-ipfs/bin/ipfs: Syntax error: "(" unexpected

    at ChildProcess.<anonymous> (/home/kyle/Downloads/Station-linux-x64/resources/app/node_modules/subcomandante/fork.js:21:23)
    at <error: TypeError: Cannot read property 'name' of undefined>
    at <error: TypeError: Cannot read property 'name' of undefined>
    at <error: TypeError: Cannot read property 'name' of undefined>
    at <error: TypeError: Cannot read property 'name' of undefined>
    at <error: TypeError: Cannot read property 'name' of undefined>
    at <error: TypeError: Cannot read property 'name' of undefined>
    at <error: TypeError: Cannot read property 'name' of undefined>
    at <error: TypeError: Cannot read property 'name' of undefined>
----------------------------------------
    at EventEmitter.on
    at makeWrappedCallback (/home/kyle/Downloads/Station-linux-x64/resources/app/node_modules/long-stack-traces/lib/long-stack-traces.js:65:26)
    at Stream.object.(anonymous function) [as on] (/home/kyle/Downloads/Station-linux-x64/resources/app/node_modules/long-stack-traces/lib/long-stack-traces.js:51:38)
    at Object.module.exports.version (/home/kyle/Downloads/Station-linux-x64/resources/app/node_modules/ipfsd-ctl/index.js:175:8)
    at onRequestState (/home/kyle/Downloads/Station-linux-x64/resources/app/build/init.js:74:25)
    at EventEmitter.<anonymous> (/home/kyle/Downloads/Station-linux-x64/resources/app/node_modules/long-stack-traces/lib/long-stack-traces.js:76:33)
    at emitNone (events.js:67:13)
    at EventEmitter.emit (events.js:166:7)
    at /home/kyle/Downloads/Station-linux-x64/resources/app/node_modules/electron-safe-ipc/protocol.js:25:18
    at /home/kyle/Downloads/Station-linux-x64/resources/app/node_modules/long-stack-traces/lib/long-stack-traces.js:76:33
    at doNTCallback0 (node.js:419:9)
----------------------------------------
    at EventEmitter.on
    at makeWrappedCallback (/home/kyle/Downloads/Station-linux-x64/resources/app/node_modules/long-stack-traces/lib/long-stack-traces.js:65:26)
    at EventEmitter.object.(anonymous function) [as on] (/home/kyle/Downloads/Station-linux-x64/resources/app/node_modules/long-stack-traces/lib/long-stack-traces.js:51:38)
    at startTray (/home/kyle/Downloads/Station-linux-x64/resources/app/build/init.js:156:7)
    at EventEmitter.<anonymous> (/home/kyle/Downloads/Station-linux-x64/resources/app/build/init.js:257:7)
    at EventEmitter.<anonymous> (/home/kyle/Downloads/Station-linux-x64/resources/app/node_modules/long-stack-traces/lib/long-stack-traces.js:76:33)
    at emitNone (events.js:67:13)
    at EventEmitter.emit (events.js:166:7)
    at EventEmitter.appReady (/home/kyle/Downloads/Station-linux-x64/resources/app/node_modules/menubar/index.js:63:13)
    at EventEmitter.<anonymous> (/home/kyle/Downloads/Station-linux-x64/resources/app/node_modules/long-stack-traces/lib/long-stack-traces.js:76:33)
    at emitOne (events.js:82:20)
----------------------------------------
    at EventEmitter.on
    at makeWrappedCallback (/home/kyle/Downloads/Station-linux-x64/resources/app/node_modules/long-stack-traces/lib/long-stack-traces.js:65:26)
    at EventEmitter.object.(anonymous function) [as on] (/home/kyle/Downloads/Station-linux-x64/resources/app/node_modules/long-stack-traces/lib/long-stack-traces.js:51:38)
    at /home/kyle/Downloads/Station-linux-x64/resources/app/build/init.js:241:8
    at Object.module.exports.local (/home/kyle/Downloads/Station-linux-x64/resources/app/node_modules/ipfsd-ctl/index.js:186:5)
    at Object.boot (/home/kyle/Downloads/Station-linux-x64/resources/app/build/init.js:236:25)
    at EventEmitter.<anonymous> (/home/kyle/Downloads/Station-linux-x64/resources/app/node_modules/long-stack-traces/lib/long-stack-traces.js:76:33)
    at emitOne (events.js:77:13)
    at EventEmitter.emit (events.js:169:7)
    at Server.handleListening (/home/kyle/Downloads/Station-linux-x64/resources/app/node_modules/monogamous/dist/monogamous.js:65:23)
    at Server.<anonymous> (/home/kyle/Downloads/Station-linux-x64/resources/app/node_modules/long-stack-traces/lib/long-stack-traces.js:76:33)
----------------------------------------
    at EventEmitter.on
    at makeWrappedCallback (/home/kyle/Downloads/Station-linux-x64/resources/app/node_modules/long-stack-traces/lib/long-stack-traces.js:65:26)
    at EventEmitter.object.(anonymous function) [as on] (/home/kyle/Downloads/Station-linux-x64/resources/app/node_modules/long-stack-traces/lib/long-stack-traces.js:51:38)
    at Object.<anonymous> (/home/kyle/Downloads/Station-linux-x64/resources/app/index.js:29:8)
    at Module._compile (module.js:434:26)
    at Object.Module._extensions..js (module.js:452:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Object.<anonymous> (/home/kyle/Downloads/Station-linux-x64/resources/atom.asar/browser/lib/init.js:123:10)
    at Object.<anonymous> (/home/kyle/Downloads/Station-linux-x64/resources/atom.asar/browser/lib/init.js:125:4)
    at Module._compile (module.js:434:26)
Uncaught undefined
Uncaught undefined
error: Uncaught Exception

[packaging] Do not fork bomb

At the moment starting the packaged version (at least on OS X) results in the app fork bombing the machine. Ideas, helps and suggestions are very welcome!

Adjusting package.json?

Hi,

So i went to build electron-app and i found i had to add the following to package.json to get it to build.

,
"react": "0.13.1",
"silence-chromium": "2.0.0",
"indent-string": "1.2.2",
"har-validator": "1.8.0",
"ncp": "2.0.0",
"nugget": "1.5.4",
"node-uuid": "1.4.3",
"pretty-bytes": "1.0.4",
"shelljs": "0.4.0",
"extract-zip": "1.1.1",
"standard": "5.3.1",
"mkdirp": "0.5.1",
"electron-download": "1.1.0",
"insert-module-globals": "6.6.0",
"browser-pack": "5.0.1",
"miller-rabin": "2.0.1",
"deps-sort": "1.3.9",
"escodegen": "1.7.0",
"module-deps": "3.9.1",
"sha.js": "2.4.4",
"umd": "3.0.1",
"browserify": "10.2.3"

But i've got next to no experience with npm so it's likely i'm doing something very wrong. But those were the additional packages i needed to get it working.

Problem running on Mac OSX 10.9.4 Mavericks

Node -> 4
npm -> 2.14.2
I copy the instructions in the README, but when I exec npm run start I get:

> [email protected] prestart /Users/shuan/Projects/ipfs/station
> npm run clean && npm run build:babel

> [email protected] clean /Users/shuan/Projects/ipfs/station
> rimraf build && mkdir build

> [email protected] build:babel /Users/shuan/Projects/ipfs/station
> babel app/config.js -o build/config.js && babel app/controls -d build/controls && babel app/init.js -o build/init.js

app/controls/drag-drop.js -> build/controls/drag-drop.js
app/controls/open-browser.js -> build/controls/open-browser.js
app/controls/open-console.js -> build/controls/open-console.js
app/controls/open-settings.js -> build/controls/open-settings.js
app/controls/utils.js -> build/controls/utils.js

> [email protected] start /Users/shuan/Projects/ipfs/station
> concurrent --kill-others 'node dev-server.js' 'npm run electron'

[0] Development server started at http://localhost:3000
[1] 
[1] > [email protected] electron /Users/shuan/Projects/ipfs/station
[1] > electron index.js
[1] 
[1] (electron) app.getDataPath is deprecated. Use app.getPath instead.
[1] info: Booting
[1] (electron) loadUrl is deprecated. Use loadURL instead.
[1] info: Application is ready
[1] info: Starting tray
[0] webpack built d358ff66ae09b55454ef in 3826ms
[1] error: Uncaught Exception: Cannot read property 'Hash' of undefined [TypeError: Cannot read property 'Hash' of undefined] TypeError: Cannot read property 'Hash' of undefined
[1]     at /Users/shuan/Projects/ipfs/station/node_modules/ipfs-geoip/lib/lookup.js:27:58
[1]     at finish (/Users/shuan/Projects/ipfs/station/node_modules/ipfs-api/node_modules/wreck/lib/index.js:319:16)
[1]     at wrapped (/Users/shuan/Projects/ipfs/station/node_modules/ipfs-api/node_modules/wreck/node_modules/hoek/lib/index.js:867:20)
[1]     at onReaderFinish (/Users/shuan/Projects/ipfs/station/node_modules/ipfs-api/node_modules/wreck/lib/index.js:365:16)
[1]     at g (events.js:260:16)
[1]     at emitNone (events.js:72:20)
[1]     at emit (events.js:166:7)
[1]     at finishMaybe (_stream_writable.js:468:14)
[1]     at endWritable (_stream_writable.js:478:3)
[1]     at Writable.end (_stream_writable.js:443:5) { '0': [TypeError: Cannot read property 'Hash' of undefined] }
[1] info: Shutting down application
[1] info: Stopping daemon
[1] info: Stopped daemon
[1] info: Stopped daemon
[1] 
[1] npm
[1]  
[1] ERR!
[1]  Darwin 13.3.0
[1] npm
[1]  
[1] ERR! argv
[1]  "/Users/shuan/.nvm/versions/node/v4.0.0/bin/node" "/Users/shuan/.nvm/versions/node/v4.0.0/bin/npm" "run" "electron"
[1] npm
[1]  ERR! node
[1]  v4.0.0
[1] npm ERR! 
[1] npm  v2.14.2
[1] npm
[1]  ERR! code ELIFECYCLE
[1] npm ERR!
[1]  [email protected] electron: `electron index.js`
[1] npm ERR!
[1]  Exit status 1
[1] npm
[1]  ERR!
[1]  
[1] npm ERR!
[1]  Failed at the [email protected] electron script 'electron index.js'.
[1] npm ERR! This is most likely a problem with the ipfs-station package,
[1] npm ERR! not with npm itself.
[1] npm ERR! Tell the author that this fails on your system:
[1] npm ERR!     electron index.js
[1] npm ERR! You can get their info via:
[1] npm ERR!     npm owner ls ipfs-station
[1] npm ERR! There is likely additional logging output above.
[1] 
[1] npm ERR! Please include the following file with any support request:
[1] npm ERR!     /Users/shuan/Projects/ipfs/station/npm-debug.log
[1] npm run electron exited with code 1
--> Sending SIGTERM to other processes..
[0] node dev-server.js exited with code null

I tried debugging this myself, but it seems like the ip being passed into ipfs-geoip running the lookup function is ::1 which seems to be the ipv6 loopback address. Converting this using aton4 makes it return 0.

I've tried looking around ipfs for documentation of this problem but couldn't find anything so apologies if this is a known issue. Otherwise I have no clue why its passing ::1 as the ip.

Can't upload files in electron app console (webui works fine)

Throws this error:

[41549:0804/182709:INFO:CONSOLE(895)] "adding file: ", source: http://127.0.0.1:5001/ipfs/QmS2HL9v5YeKgQkkWMvs1EMnFtUowTEdFfSSeMT4pos1e6/bundle.js (895)
[41549:0804/182709:INFO:CONSOLE(21740)] "Uncaught TypeError: fs.createReadStream is not a function", source: http://127.0.0.1:5001/ipfs/QmS2HL9v5YeKgQkkWMvs1EMnFtUowTEdFfSSeMT4pos1e6/bundle.js (21740)

Build via npm i fails

Pulling current master out of github and following the instructions fails.

MacBook-Pro ~/code/ipfs/electron-app (git: master)
▸ npm i

[email protected] install /Users/rabble/code/ipfs/electron-app/node_modules/pre-commit
node install.js

npm WARN engine [email protected]: wanted: {"node":">=0.10.32"} (current: {"node":"0.10.31","npm":"2.1.4"})
npm WARN engine [email protected]: wanted: {"node":">=0.10.32"} (current: {"node":"0.10.31","npm":"2.1.4"})
npm WARN engine [email protected]: wanted: {"node":">=0.10.32"} (current: {"node":"0.10.31","npm":"2.1.4"})
npm WARN engine [email protected]: wanted: {"node":">=0.10.40"} (current: {"node":"0.10.31","npm":"2.1.4"})
npm WARN engine [email protected]: wanted: {"node":">=0.10.40"} (current: {"node":"0.10.31","npm":"2.1.4"})
npm WARN engine [email protected]: wanted: {"node":">=0.10.40"} (current: {"node":"0.10.31","npm":"2.1.4"})
npm WARN engine [email protected]: wanted: {"node":">=0.10.40"} (current: {"node":"0.10.31","npm":"2.1.4"})
npm WARN engine [email protected]: wanted: {"node":">=0.10.40"} (current: {"node":"0.10.31","npm":"2.1.4"})
npm WARN engine [email protected]: wanted: {"node":">=0.10.40"} (current: {"node":"0.10.31","npm":"2.1.4"})
npm WARN engine [email protected]: wanted: {"node":">=0.10.40"} (current: {"node":"0.10.31","npm":"2.1.4"})
npm WARN engine [email protected]: wanted: {"node":">=0.10.40"} (current: {"node":"0.10.31","npm":"2.1.4"})
npm WARN engine [email protected]: wanted: {"node":">=0.10.40"} (current: {"node":"0.10.31","npm":"2.1.4"})

[email protected] install /Users/rabble/code/ipfs/electron-app/node_modules/ipfsd-ctl/node_modules/go-ipfs
node install.js

Downloading ipfs_master_darwin-amd64.zip
[============================================>] 100.0% of 6.31 MB (1.4 MB/s)

[email protected] postinstall /Users/rabble/code/ipfs/electron-app/node_modules/electron-prebuilt
node install.js

Downloading electron-v0.27.3-darwin-x64.zip
Error: GET https://github.com/atom/electron/releases/download/v0.27.3/electron-v0.27.3-darwin-x64.zip returned 502

/Users/rabble/code/ipfs/electron-app/node_modules/electron-prebuilt/install.js:15
throw err
^
Error: GET https://github.com/atom/electron/releases/download/v0.27.3/electron-v0.27.3-darwin-x64.zip returned 502
npm ERR! Darwin 14.5.0
npm ERR! argv "node" "/usr/local/bin/npm" "i"
npm ERR! node v0.10.31
npm ERR! npm v2.1.4
npm ERR! code ELIFECYCLE

npm ERR! [email protected] postinstall: node install.js
npm ERR! Exit status 8
npm ERR!
npm ERR! Failed at the [email protected] postinstall script.
npm ERR! This is most likely a problem with the electron-prebuilt package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR! node install.js
npm ERR! You can get their info via:
npm ERR! npm owner ls electron-prebuilt
npm ERR! There is likely additional logging output above.

npm ERR! Please include the following file with any support request:
npm ERR! /Users/rabble/code/ipfs/electron-app/npm-debug.log

Make settings persistent

At the moment there is nothing to persist the settings between sessions. We need to add something, probably a simple text file or something more advanced? Suggestions?

Setup automated release process

  • Bump version (major/minor/patch)
  • Generate packages
  • Generate changelog
  • Commit and push to github
  • Upload packages and changelog to github releases pages

Windowing/Tray UX

Thinking this would best work as primarily a Tray app (e.g. Menu bar for OS X, Notification Tray Windows/Linux).

  • App permanently lives in the tray at all times
  • When the app window is open, a dock/task bar icon will open.
  • When the app window is closed, the dock/task bar icon is hidden, and the app lives in the tray.
  • Enable silent launching to the tray so that people can add the app to their startup apps
  • Indicate running/stopped status of the ipfs daemon via the tray (and dock?) icon.

I think this flow would help increase people running as peers in the background without having to think about it too much.

Unable to launch on Mac OS 10.11 (El Capitan)

I tried getting a clean checkout running on 10.11 GM (15A282b) and the app fails to launch. I haven't been able to find any good leads as to why it's not launching. The debug.log file does not have any useful information. Any tips on how to go about figuring out what might be causing this?

debug.log

2015-09-11T16:39:21.792Z silence-chromium starting

Shell Output

➜  Downloads  git clone https://github.com/ipfs/electron-app.git
Cloning into 'electron-app'...
remote: Counting objects: 293, done.
remote: Total 293 (delta 0), reused 0 (delta 0), pack-reused 293
Receiving objects: 100% (293/293), 416.11 KiB | 0 bytes/s, done.
Resolving deltas: 100% (147/147), done.
Checking connectivity... done.
➜  Downloads  cd electron-app 
➜  electron-app git:(master) npm i
npm WARN peerDependencies The peer dependency eslint@>=0.24.1 included from eslint-config-standard-react will no
npm WARN peerDependencies longer be automatically installed to fulfill the peerDependency 
npm WARN peerDependencies in npm 3+. Your application will need to depend on it explicitly.
npm WARN peerDependencies The peer dependency eslint@^1.0.0 included from eslint-config-standard will no
npm WARN peerDependencies longer be automatically installed to fulfill the peerDependency 
npm WARN peerDependencies in npm 3+. Your application will need to depend on it explicitly.
npm WARN peerDependencies The peer dependency eslint@^1.0.0 included from eslint-plugin-standard will no
npm WARN peerDependencies longer be automatically installed to fulfill the peerDependency 
npm WARN peerDependencies in npm 3+. Your application will need to depend on it explicitly.

> [email protected] install /Users/jdlouhy/Downloads/electron-app/node_modules/pre-commit
> node install.js


> [email protected] install /Users/jdlouhy/Downloads/electron-app/node_modules/ipfsd-ctl/node_modules/go-ipfs
> node install.js

Downloading ipfs_master_darwin-amd64.zip
[============================================>] 100.0% of 6.3 MB (1.68 MB/s)
npm WARN engine [email protected]: wanted: {"node":"0.8.x || 0.10.x"} (current: {"node":"0.12.7","npm":"2.14.2"})

> [email protected] postinstall /Users/jdlouhy/Downloads/electron-app/node_modules/electron-prebuilt
> node install.js

[email protected] node_modules/open

[email protected] node_modules/minimist

[email protected] node_modules/shelljs

[email protected] node_modules/bootstrap-toggle

[email protected] node_modules/menubar
└── [email protected]

[email protected] node_modules/pre-commit
└── [email protected]

[email protected] node_modules/rimraf
└── [email protected] ([email protected], [email protected], [email protected], [email protected])

[email protected] node_modules/multiaddr
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected] ([email protected], [email protected])
└── [email protected] ([email protected], [email protected])

[email protected] node_modules/jquery

[email protected] node_modules/silence-chromium
├── [email protected]
└── [email protected]

[email protected] node_modules/bootstrap

[email protected] node_modules/lodash

[email protected] node_modules/browserify-shim
├── [email protected]
├── [email protected] ([email protected])
├── [email protected]
├── [email protected] ([email protected], [email protected], [email protected], [email protected], [email protected], [email protected])
└── [email protected] ([email protected])

[email protected] node_modules/ipfs-logo

[email protected] node_modules/electron-packager
├── [email protected]
├── [email protected]
├── [email protected] ([email protected])
├── [email protected] ([email protected], [email protected], [email protected], [email protected], [email protected])
├── [email protected] ([email protected])
├── [email protected] ([email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected])
├── [email protected] ([email protected], [email protected], [email protected], [email protected], [email protected])
└── [email protected] ([email protected], [email protected], [email protected], [email protected])

[email protected] node_modules/ipfsd-ctl
├── [email protected]
├── [email protected]
├── [email protected] ([email protected])
├── [email protected] ([email protected], [email protected])
├── [email protected] ([email protected], [email protected])
├── [email protected]
└── [email protected] ([email protected], [email protected], [email protected], [email protected])

[email protected] node_modules/electron-prebuilt
├── [email protected] ([email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected])
└── [email protected] ([email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected])

[email protected] node_modules/react
└── [email protected] ([email protected], [email protected])

[email protected] node_modules/reactify
├── [email protected]
└── [email protected] ([email protected], [email protected])

[email protected] node_modules/browserify
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected] ([email protected])
├── [email protected] ([email protected])
├── [email protected] ([email protected])
├── [email protected] ([email protected])
├── [email protected] ([email protected])
├── [email protected] ([email protected])
├── [email protected] ([email protected])
├── [email protected] ([email protected])
├── [email protected] ([email protected])
├── [email protected] ([email protected])
├── [email protected]
├── [email protected] ([email protected], [email protected], [email protected])
├── [email protected] ([email protected], [email protected])
├── [email protected] ([email protected], [email protected], [email protected])
├── [email protected] ([email protected])
├── [email protected] ([email protected])
├── [email protected] ([email protected], [email protected])
├── [email protected] ([email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected])
├── [email protected] ([email protected], [email protected])
├── [email protected] ([email protected], [email protected])
└── [email protected] ([email protected], [email protected])

[email protected] node_modules/standard
├── [email protected]
├── [email protected]
├── [email protected] ([email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected])
├── [email protected] ([email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected])
├── [email protected]
├── [email protected]
└── [email protected] ([email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected])
➜  electron-app git:(master) npm start

> [email protected] start /Users/jdlouhy/Downloads/electron-app
> ./build.sh && node_modules/.bin/electron index.js 2>&1 | node_modules/.bin/silence-chromium

rm: build: No such file or directory

Console.app Output

9/11/15 9:39:12.000 AM kernel[0]: Limiting closed port RST response from 506 to 250 packets per second
9/11/15 9:39:15.789 AM launchservicesd[80]: SecTaskLoadEntitlements failed error=22
9/11/15 9:39:15.791 AM launchservicesd[80]: SecTaskLoadEntitlements failed error=22
9/11/15 9:39:22.093 AM launchservicesd[80]: SecTaskLoadEntitlements failed error=22
9/11/15 9:39:22.100 AM lsd[389]: LaunchServices: Could not store lsd-identifiers file at /private/var/db/lsd/com.apple.lsdschemes.plist
9/11/15 9:39:22.101 AM lsd[389]: LaunchServices: Could not store lsd-identifiers file at /private/var/db/lsd/com.apple.lsdschemes.plist
9/11/15 9:39:22.102 AM launchservicesd[80]: SecTaskLoadEntitlements failed error=22
9/11/15 9:39:22.103 AM lsd[389]: LaunchServices: Could not store lsd-identifiers file at /private/var/db/lsd/com.apple.lsdschemes.plist
9/11/15 9:39:22.104 AM launchservicesd[80]: SecTaskLoadEntitlements failed error=22
9/11/15 9:39:22.145 AM appleeventsd[54]: SecTaskLoadEntitlements failed error=22
9/11/15 9:39:22.165 AM launchservicesd[80]: SecTaskLoadEntitlements failed error=22

menu bar improvements

the menu bar should give some info on the node, like:

  • say what ports it's on (swarm, gateway, api)
  • stats (maybe under a sub-menu):
    • uptime
    • of peers connected

    • bandwidth numbers

and maybe it should have some more options:

  • "Open" should be "Open Web Console" or "Open Web UI" or "Open Admin Console" or something...
  • "Open Web Console in Browser" (opens in a normal browser, just in case)
  • "Configuration" (opens config in an editor)
  • "Restart" (kills the node and reboots it)
  • "Check for Update" (checks for update-- we need to figure this out)

Keyboard shortcuts

I would like to have the electron app listening to 2 keyboard shortcuts:

  • listen to {cmd, ctrl}+i+d - If a piece of text is selected and if that piece of text is a valid hash, it gets downloaded
  • listen to {cmd, ctrl}+i+u - If a file or a group of files are selected, those files get uploaded

Does someone have opinions/thoughts on this? Maybe other hotkeys for better UX?


Todo

  • ctrl+alt+u = upload selected
  • ctrl+alt+s = screenshot upload
  • ctrl+alt+d = download hash selected

dependencies not installed with 'npm install'

I cloned the repo down and followed the setup instructions and still needed a few things:

  • rimraf
  • babel
  • electron
    • command not found. I did 'npm install electron' and it still didnt work.

There may be more, but I'm stuck on the electron issue.

Need installer binary

not high priority, but we eventually need a single binary that will install ipfs and the electron shell app.

osx: quiting app does not always kill ipfs

go-ipfs is notoriously annoying to kill, because it tries to shut down gracefully first.

  • i think electron-app or node-ipfsd-ctrl should make sure ipfs is killed by waiting + checking.
  • separately, we should make go-ipfs always respect sigterm. ipfs/kubo#1384

`open console`

The 'open console' currently opens the webui. Is this different than opening in the browser? Or, is it really a 'console' that we want to call it?

image

image

Autostart the node

Users might wonder why they have to start the node. “Did I not just start IPFS already?”

4.0 Support

At the moment trying to run it under node >= 4.0 results in this failure:

Uncaught Exception:
Error: non-zero exit code 1
  while running: /Users/dignifiedquire/opensource/ipfs/electron-app/node_modules/subcomandante/subcom 4955 /Users/dignifiedquire/opensource/ipfs/electron-app/node_modules/ipfsd-ctl/node_modules/.bin/ipfs version

  events.js:141
      throw er; // Unhandled 'error' event
      ^

Error: spawn /Users/dignifiedquire/opensource/ipfs/electron-app/node_modules/ipfsd-ctl/node_modules/.bin/ipfs ENOENT
    at exports._errnoException (util.js:837:11)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:178:32)
    at onErrorNT (internal/child_process.js:344:16)
    at doNTCallback2 (node.js:429:9)
    at process._tickCallback (node.js:343:17)
    at Function.Module.runMain (module.js:477:11)
    at startup (node.js:117:18)
    at node.js:951:3

    at ChildProcess.<anonymous> (/Users/dignifiedquire/opensource/ipfs/electron-app/node_modules/comandante/index.js:19:27)
    at emitTwo (events.js:92:20)
    at ChildProcess.emit (events.js:169:7)
    at maybeClose (child_process.js:996:16)
    at Process.ChildProcess._handle.onexit (child_process.js:1069:5)

Unable to run app on OS X El Capitan

Hey there!

I'm having trouble running the app on OS X El Capitan. The tray icon appears for 2 seconds but it crashes right after.

Below is the result log of doing npm start:

➜  station git:(master) npm start

> [email protected] start /Users/xicombd/Code/ipfs/station
> npm run clean && npm run build:babel && ./node_modules/.bin/concurrent --kill-others "node dev-server.js" "npm run electron"


> [email protected] clean /Users/xicombd/Code/ipfs/station
> rimraf build && mkdir build


> [email protected] build:babel /Users/xicombd/Code/ipfs/station
> babel app/config.js -o build/config.js && ./node_modules/.bin/babel app/controls -d build/controls && ./node_modules/.bin/babel app/init.js -o build/init.js && ./node_modules/.bin/babel app/helpers.js -o build/helpers.js

app/controls/drag-drop.js -> build/controls/drag-drop.js
app/controls/open-browser.js -> build/controls/open-browser.js
app/controls/open-console.js -> build/controls/open-console.js
app/controls/open-settings.js -> build/controls/open-settings.js
app/controls/utils.js -> build/controls/utils.js
[0] Development server started at http://localhost:3000
[1]
[1] > [email protected] electron /Users/xicombd/Code/ipfs/station
[1] > electron index.js
[1]
[1] info: Booting
[1] info: Application is ready
[1] info: Starting tray
[1] Uncaught SyntaxError: Unexpected token u
[1]     at <error: TypeError: Cannot read property 'name' of undefined>
[1]     at <error: TypeError: Cannot read property 'name' of undefined>
[1]     at <error: TypeError: Cannot read property 'name' of undefined>
[1]     at <error: TypeError: Cannot read property 'name' of undefined>
[1]     at <error: TypeError: Cannot read property 'name' of undefined>
[1]     at <error: TypeError: Cannot read property 'name' of undefined>
[1]     at <error: TypeError: Cannot read property 'name' of undefined>
[1]     at <error: TypeError: Cannot read property 'name' of undefined>
[1]     at <error: TypeError: Cannot read property 'name' of undefined>
[1]     at <error: TypeError: Cannot read property 'name' of undefined>
[1] ----------------------------------------
[1]     at EventEmitter.on
[1]     at makeWrappedCallback (/Users/xicombd/Code/ipfs/station/node_modules/long-stack-traces/lib/long-stack-traces.js:65:26)
[1]     at Request.object.(anonymous function) [as on] (/Users/xicombd/Code/ipfs/station/node_modules/long-stack-traces/lib/long-stack-traces.js:51:38)
[1]     at Request.init (/Users/xicombd/Code/ipfs/station/node_modules/request/request.js:201:10)
[1]     at new Request (/Users/xicombd/Code/ipfs/station/node_modules/request/request.js:140:8)
[1]     at request (/Users/xicombd/Code/ipfs/station/node_modules/request/index.js:55:10)
[1]     at makeRequest (/Users/xicombd/Code/ipfs/station/node_modules/ipfs-api/src/request-api.js:80:10)
[1]     at requestAPI (/Users/xicombd/Code/ipfs/station/node_modules/ipfs-api/src/request-api.js:129:5)
[1]     at Object.get (/Users/xicombd/Code/ipfs/station/node_modules/ipfs-api/src/index.js:52:14)
[1]     at _lookup (/Users/xicombd/Code/ipfs/station/node_modules/ipfs-geoip/lib/lookup.js:13:15)
[1]     at conf.original (/Users/xicombd/Code/ipfs/station/node_modules/memoizee/ext/async.js:103:18)
[1] ----------------------------------------
[1]     at EventEmitter.on
[1]     at makeWrappedCallback (/Users/xicombd/Code/ipfs/station/node_modules/long-stack-traces/lib/long-stack-traces.js:65:26)
[1]     at Request.object.(anonymous function) [as on] (/Users/xicombd/Code/ipfs/station/node_modules/long-stack-traces/lib/long-stack-traces.js:51:38)
[1]     at Request.init (/Users/xicombd/Code/ipfs/station/node_modules/request/request.js:201:10)
[1]     at new Request (/Users/xicombd/Code/ipfs/station/node_modules/request/request.js:140:8)
[1]     at request (/Users/xicombd/Code/ipfs/station/node_modules/request/index.js:55:10)
[1]     at makeRequest (/Users/xicombd/Code/ipfs/station/node_modules/ipfs-api/src/request-api.js:80:10)
[1]     at requestAPI (/Users/xicombd/Code/ipfs/station/node_modules/ipfs-api/src/request-api.js:129:5)
[1]     at IpfsAPI.self.id (/Users/xicombd/Code/ipfs/station/node_modules/ipfs-api/src/index.js:159:12)
[1]     at pollStats (/Users/xicombd/Code/ipfs/station/build/init.js:62:8)
[1]     at /Users/xicombd/Code/ipfs/station/build/init.js:103:5
[1] ----------------------------------------
[1]     at EventEmitter.on
[1]     at makeWrappedCallback (/Users/xicombd/Code/ipfs/station/node_modules/long-stack-traces/lib/long-stack-traces.js:65:26)
[1]     at Stream.object.(anonymous function) [as on] (/Users/xicombd/Code/ipfs/station/node_modules/long-stack-traces/lib/long-stack-traces.js:51:38)
[1]     at /Users/xicombd/Code/ipfs/station/node_modules/ipfsd-ctl/index.js:107:12
[1]     at parseConfig (/Users/xicombd/Code/ipfs/station/node_modules/ipfsd-ctl/index.js:178:5)
[1]     at Object.startDaemon (/Users/xicombd/Code/ipfs/station/node_modules/ipfsd-ctl/index.js:93:7)
[1]     at onStartDaemon (/Users/xicombd/Code/ipfs/station/build/init.js:92:8)
[1]     at EventEmitter.<anonymous> (/Users/xicombd/Code/ipfs/station/build/init.js:263:9)
[1]     at EventEmitter.<anonymous> (/Users/xicombd/Code/ipfs/station/node_modules/long-stack-traces/lib/long-stack-traces.js:76:33)
[1]     at emitNone (events.js:67:13)
[1]     at EventEmitter.emit (events.js:166:7)
[1] ----------------------------------------
[1]     at EventEmitter.on
[1]     at makeWrappedCallback (/Users/xicombd/Code/ipfs/station/node_modules/long-stack-traces/lib/long-stack-traces.js:65:26)
[1]     at EventEmitter.object.(anonymous function) [as on] (/Users/xicombd/Code/ipfs/station/node_modules/long-stack-traces/lib/long-stack-traces.js:51:38)
[1]     at /Users/xicombd/Code/ipfs/station/build/init.js:241:8
[1]     at Object.module.exports.local (/Users/xicombd/Code/ipfs/station/node_modules/ipfsd-ctl/index.js:199:5)
[1]     at Object.boot (/Users/xicombd/Code/ipfs/station/build/init.js:236:25)
[1]     at EventEmitter.<anonymous> (/Users/xicombd/Code/ipfs/station/node_modules/long-stack-traces/lib/long-stack-traces.js:76:33)
[1]     at emitOne (events.js:77:13)
[1]     at EventEmitter.emit (events.js:169:7)
[1]     at Server.handleListening (/Users/xicombd/Code/ipfs/station/node_modules/monogamous/dist/monogamous.js:65:23)
[1]     at Server.<anonymous> (/Users/xicombd/Code/ipfs/station/node_modules/long-stack-traces/lib/long-stack-traces.js:76:33)
[1] ----------------------------------------
[1]     at EventEmitter.on
[1]     at makeWrappedCallback (/Users/xicombd/Code/ipfs/station/node_modules/long-stack-traces/lib/long-stack-traces.js:65:26)
[1]     at EventEmitter.object.(anonymous function) [as on] (/Users/xicombd/Code/ipfs/station/node_modules/long-stack-traces/lib/long-stack-traces.js:51:38)
[1]     at Object.<anonymous> (/Users/xicombd/Code/ipfs/station/index.js:30:8)
[1]     at Module._compile (module.js:434:26)
[1]     at Object.Module._extensions..js (module.js:452:10)
[1]     at Module.load (module.js:355:32)
[1]     at Function.Module._load (module.js:310:12)
[1]     at Object.<anonymous> (/Users/xicombd/Code/ipfs/station/node_modules/electron-prebuilt/dist/Electron.app/Contents/Resources/default_app/main.js:246:23)
[1]     at Module._compile (module.js:434:26)
[1]     at Object.Module._extensions..js (module.js:452:10)
[1] Uncaught undefined
[1] Uncaught undefined
[1] Uncaught undefined
[1] error: Uncaught Exception:   undefined 0=
[1] info: Shutting down application
[1] info: Stopping daemon
[1] info: Stopped daemon
[1] info: Stopped daemon
[1]
[1] npm ERR! Darwin 15.0.0
[1] npm ERR! argv "/Users/xicombd/.nvm/versions/node/v4.2.2/bin/node" "/Users/xicombd/.nvm/versions/node/v4.2.2/bin/npm" "run" "electron"
[1] npm ERR! node v4.2.2
[1] npm ERR! npm  v3.3.12
[1] npm ERR! code ELIFECYCLE
[1] npm ERR! [email protected] electron: `electron index.js`
[1] npm ERR! Exit status 1
[1] npm ERR!
[1] npm ERR! Failed at the [email protected] electron script 'electron index.js'.
[1] npm ERR! Make sure you have the latest version of node.js and npm installed.
[1] npm ERR! If you do, this is most likely a problem with the ipfs-station package,
[1] npm ERR! not with npm itself.
[1] npm ERR! Tell the author that this fails on your system:
[1] npm ERR!     electron index.js
[1] npm ERR! You can get their info via:
[1] npm ERR!     npm owner ls ipfs-station
[1] npm ERR! There is likely additional logging output above.
[1]
[1] npm ERR! Please include the following file with any support request:
[1] npm ERR!     /Users/xicombd/Code/ipfs/station/npm-debug.log
[1] npm run electron exited with code 1
--> Sending SIGTERM to other processes..
[0] node dev-server.js exited with code null

npm ERR! Darwin 15.0.0
npm ERR! argv "/Users/xicombd/.nvm/versions/node/v4.2.2/bin/node" "/Users/xicombd/.nvm/versions/node/v4.2.2/bin/npm" "start"
npm ERR! node v4.2.2
npm ERR! npm  v3.3.12
npm ERR! code ELIFECYCLE
npm ERR! [email protected] start: `npm run clean && npm run build:babel && ./node_modules/.bin/concurrent --kill-others "node dev-server.js" "npm run electron"`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the [email protected] start script 'npm run clean && npm run build:babel && ./node_modules/.bin/concurrent --kill-others "node dev-server.js" "npm run electron"'.
npm ERR! Make sure you have the latest version of node.js and npm installed.
npm ERR! If you do, this is most likely a problem with the ipfs-station package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     npm run clean && npm run build:babel && ./node_modules/.bin/concurrent --kill-others "node dev-server.js" "npm run electron"
npm ERR! You can get their info via:
npm ERR!     npm owner ls ipfs-station
npm ERR! There is likely additional logging output above.

npm ERR! Please include the following file with any support request:
npm ERR!     /Users/xicombd/Code/ipfs/station/npm-debug.log

My node and npm versions are:

  • node: v4.2.2
  • npm: v3.3.12

I tried removing node_modules and npm install a few times and the result has been always the same.

Am I missing something?

Thanks!

Crash on Archlinux with ipfs 0.3.9

Installation process is fine. But any subsequent launch will output :

[geoffrey@ES1-Archlinux station]$ npm run electron

> [email protected] electron /home/geoffrey/git/station
> electron index.js

info: Booting
info: Application is ready
info: Starting tray
Uncaught SyntaxError: Unexpected token u
    at <error: TypeError: Cannot read property 'name' of undefined>
    at <error: TypeError: Cannot read property 'name' of undefined>
    at <error: TypeError: Cannot read property 'name' of undefined>
    at <error: TypeError: Cannot read property 'name' of undefined>
    at <error: TypeError: Cannot read property 'name' of undefined>
    at <error: TypeError: Cannot read property 'name' of undefined>
    at <error: TypeError: Cannot read property 'name' of undefined>
    at <error: TypeError: Cannot read property 'name' of undefined>
    at <error: TypeError: Cannot read property 'name' of undefined>
    at <error: TypeError: Cannot read property 'name' of undefined>
----------------------------------------
    at EventEmitter.on
    at makeWrappedCallback (/home/geoffrey/git/station/node_modules/long-stack-traces/lib/long-stack-traces.js:65:26)
    at Request.object.(anonymous function) [as on] (/home/geoffrey/git/station/node_modules/long-stack-traces/lib/long-stack-traces.js:51:38)
    at Request.init (/home/geoffrey/git/station/node_modules/request/request.js:201:10)
    at new Request (/home/geoffrey/git/station/node_modules/request/request.js:140:8)
    at request (/home/geoffrey/git/station/node_modules/request/index.js:55:10)
    at makeRequest (/home/geoffrey/git/station/node_modules/ipfs-api/src/request-api.js:80:10)
    at requestAPI (/home/geoffrey/git/station/node_modules/ipfs-api/src/request-api.js:129:5)
    at Object.get (/home/geoffrey/git/station/node_modules/ipfs-api/src/index.js:52:14)
    at _lookup (/home/geoffrey/git/station/node_modules/ipfs-geoip/lib/lookup.js:13:15)
    at conf.original (/home/geoffrey/git/station/node_modules/memoizee/ext/async.js:103:18)
----------------------------------------
    at EventEmitter.on
    at makeWrappedCallback (/home/geoffrey/git/station/node_modules/long-stack-traces/lib/long-stack-traces.js:65:26)
    at Request.object.(anonymous function) [as on] (/home/geoffrey/git/station/node_modules/long-stack-traces/lib/long-stack-traces.js:51:38)
    at Request.init (/home/geoffrey/git/station/node_modules/request/request.js:201:10)
    at new Request (/home/geoffrey/git/station/node_modules/request/request.js:140:8)
    at request (/home/geoffrey/git/station/node_modules/request/index.js:55:10)
    at makeRequest (/home/geoffrey/git/station/node_modules/ipfs-api/src/request-api.js:80:10)
    at requestAPI (/home/geoffrey/git/station/node_modules/ipfs-api/src/request-api.js:129:5)
    at IpfsAPI.self.id (/home/geoffrey/git/station/node_modules/ipfs-api/src/index.js:159:12)
    at pollStats (/home/geoffrey/git/station/build/init.js:62:8)
    at /home/geoffrey/git/station/build/init.js:103:5
----------------------------------------
    at EventEmitter.on
    at makeWrappedCallback (/home/geoffrey/git/station/node_modules/long-stack-traces/lib/long-stack-traces.js:65:26)
    at Stream.object.(anonymous function) [as on] (/home/geoffrey/git/station/node_modules/long-stack-traces/lib/long-stack-traces.js:51:38)
    at /home/geoffrey/git/station/node_modules/ipfsd-ctl/index.js:106:12
    at parseConfig (/home/geoffrey/git/station/node_modules/ipfsd-ctl/index.js:177:5)
    at Object.startDaemon (/home/geoffrey/git/station/node_modules/ipfsd-ctl/index.js:92:7)
    at onStartDaemon (/home/geoffrey/git/station/build/init.js:92:8)
    at EventEmitter.<anonymous> (/home/geoffrey/git/station/build/init.js:263:9)
    at EventEmitter.<anonymous> (/home/geoffrey/git/station/node_modules/long-stack-traces/lib/long-stack-traces.js:76:33)
    at emitNone (events.js:67:13)
    at EventEmitter.emit (events.js:166:7)
----------------------------------------
    at EventEmitter.on
    at makeWrappedCallback (/home/geoffrey/git/station/node_modules/long-stack-traces/lib/long-stack-traces.js:65:26)
    at EventEmitter.object.(anonymous function) [as on] (/home/geoffrey/git/station/node_modules/long-stack-traces/lib/long-stack-traces.js:51:38)
    at /home/geoffrey/git/station/build/init.js:241:8
    at Object.module.exports.local (/home/geoffrey/git/station/node_modules/ipfsd-ctl/index.js:198:5)
    at Object.boot (/home/geoffrey/git/station/build/init.js:236:25)
    at EventEmitter.<anonymous> (/home/geoffrey/git/station/node_modules/long-stack-traces/lib/long-stack-traces.js:76:33)
    at emitOne (events.js:77:13)
    at EventEmitter.emit (events.js:169:7)
    at Server.handleListening (/home/geoffrey/git/station/node_modules/monogamous/dist/monogamous.js:65:23)
    at Server.<anonymous> (/home/geoffrey/git/station/node_modules/long-stack-traces/lib/long-stack-traces.js:76:33)
----------------------------------------
    at EventEmitter.on
    at makeWrappedCallback (/home/geoffrey/git/station/node_modules/long-stack-traces/lib/long-stack-traces.js:65:26)
    at EventEmitter.object.(anonymous function) [as on] (/home/geoffrey/git/station/node_modules/long-stack-traces/lib/long-stack-traces.js:51:38)
    at Object.<anonymous> (/home/geoffrey/git/station/index.js:30:8)
    at Module._compile (module.js:434:26)
    at Object.Module._extensions..js (module.js:452:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Object.<anonymous> (/home/geoffrey/git/station/node_modules/electron-prebuilt/dist/resources/default_app/main.js:246:23)
    at Module._compile (module.js:434:26)
    at Object.Module._extensions..js (module.js:452:10)
Uncaught undefined
Uncaught undefined
Uncaught undefined
error: Uncaught Exception:   undefined { '0': '' }
info: Shutting down application
info: Stopping daemon
info: Stopped daemon
info: Stopped daemon

npm ERR! Linux 4.2.5-1-ARCH
npm ERR! argv "/usr/bin/node" "/usr/bin/npm" "run" "electron"
npm ERR! node v5.0.0
npm ERR! npm  v3.3.12
npm ERR! code ELIFECYCLE
npm ERR! [email protected] electron: `electron index.js`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the [email protected] electron script 'electron index.js'.
npm ERR! Make sure you have the latest version of node.js and npm installed.
npm ERR! If you do, this is most likely a problem with the ipfs-station package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     electron index.js
npm ERR! You can get their info via:
npm ERR!     npm owner ls ipfs-station
npm ERR! There is likely additional logging output above.

npm ERR! Please include the following file with any support request:
npm ERR!     /home/geoffrey/git/station/npm-debug.log

Delete Node and Uninstall IPFS

We need both a "Delete Node" and "Uninstall IPFS" (which implies "Delete Node").

  • maybe accessible from Settings, once that exists)
  • asks user to confirm, saying something like "This will delete all IPFS data (1.3 GB)"
  • stops the node
  • deletes the data
  • "Uninstall IPFS" shuts down application and removes itself completely

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.