Git Product home page Git Product logo

jitsi-meet-electron's Introduction

Jitsi Meet Electron

Desktop application for Jitsi Meet built with Electron.

Features

  • End-to-End Encryption support (BETA)
  • Works with any Jitsi Meet deployment
  • Builtin auto-updates
  • Screensharing (Windows, Mac, X11 only. Not supported under Wayland, see known issues below)
  • Remote control (currently disabled due to security issues)
  • Always-On-Top window
  • Support for deeplinks such as jitsi-meet://myroom (will open myroom on the configured Jitsi instance) or jitsi-meet://jitsi.mycompany.com/myroom (will open myroom on the Jitsi instance running on jitsi.mycompany.com)

Installation

Download our latest release and you're off to the races!

Windows macOS GNU/Linux (AppImage) GNU/Linux (Deb)
Download Download x64_64 arm64 x86_64 arm64

Third-Party builds

Download On Flathub

Homebrew

For macOS user, you can install the application using the following command:

brew install --cask jitsi-meet

Development

If you want to hack on this project, here is how you do it.

Show building instructions

Installing dependencies

Install Node.js 20 first (or if you use nvm, switch to Node.js 20 by running nvm use).

Extra dependencies for Windows
npm install --global --production windows-build-tools
Extra dependencies for GNU/Linux

X11, PNG, and zlib development packages are necessary. On Debian-like systems, they can be installed as follows:

sudo apt install libx11-dev zlib1g-dev libpng-dev libxtst-dev

Install all required packages:

npm install

Starting in development mode

npm start

The debugger tools are available when running in dev mode, and can be activated with keyboard shortcuts as defined here.

They can also be displayed automatically with the application --show-dev-tools command line flag, or with the SHOW_DEV_TOOLS environment variable as shown:

SHOW_DEV_TOOLS=true npm start

Building the production distribution

npm run dist

Working with jitsi-meet-electron-sdk

jitsi-meet-electron-sdk is a helper package which implements many features such as remote control and the always-on-top window. If new features are to be added or tested, running with a local version of these utils is very handy.

By default, the @jitsi/electron-sdk is build from npm. The default dependency path in package.json is:

"@jitsi/electron-sdk": "^3.0.0"

To work with a local copy, you must change the path to:

"@jitsi/electron-sdk": "file:///Users/name/jitsi-meet-electron-sdk-copy",

To build the project, you must force it to take the sources, as npm update will not do it.

npm install @jitsi/electron-sdk --force

NOTE: Also check the jitsi-meet-electron-sdk README to see how to configure your environment.

Publishing

  1. Create release branch: git checkout -b release-1-2-3, replacing 1-2-3 with the desired release version
  2. Increment the version: npm version patch, replacing patch with minor or major as required
  3. Push release branch to github: git push -u origin release-1-2-3
  4. Create PR: gh pr create
  5. Once PR is reviewed and ready to merge, create draft Github release: gh release create v1.2.3 --draft --title 1.2.3, replacing v1.2.3 and 1.2.3 with the desired release version
  6. Merge PR
  7. Github action will build binaries and attach to the draft release
  8. Test binaries from draft release
  9. If all tests are fine, publish draft release

Known issues

Windows

A warning that the app is unsigned will show up upon first install. This is expected.

macOS

None

GNU/Linux

  • If you can't execute the file directly after downloading it, try running chmod u+x ./jitsi-meet-x86_64.AppImage

  • Under wayland, screensharing is currently buggy:

    • Sharing a full screen is not possible
    • When trying to start screensharing under wayland, 2 permission popups will show up. First a pipewire based system selector, then a jitsi internal selector. Select an application window in the first selector and then the same in the jitsi internal selector. Sharing application windows works via this, sharing a full screen unfortunately not.
  • On Ubuntu 22.04 and later, the AppImage will fail with a fuse error (as the AppImage uses libfuse2, while 22.04 comes with libfuse3 by default):

    dlopen(): error loading libfuse.so.2
    

    To fix this, install libfuse2 as follows:

    sudo apt install libfuse2
    
  • If you experience a blank page after jitsi server upgrades, try removing the local cache files:

    rm -rf ~/.config/Jitsi\ Meet/
    

Translations

The JSON files are for all the strings inside the application, and can be translated here.

New translations require the addition of a line in index.js.

Localize desktop file on linux requires the addition of a line in package.json. Please search for Comment[hu] as an example to help add your translation of the English string Jitsi Meet Desktop App for your language.

License

Apache 2. See the LICENSE file.

Community

Jitsi is built by a large community of developers. If you want to participate, please join the community forum.

jitsi-meet-electron's People

Contributors

akshitkrnagpal avatar andrei-gavrilescu avatar aspiers avatar awlx avatar csett86 avatar damencho avatar dependabot[bot] avatar depressiverobot avatar emcho avatar gabiborlea avatar horymury avatar hristoterezov avatar imdatceleste avatar jallamsetty1 avatar jrie avatar milotype avatar miwie avatar neroburner avatar ovari avatar peterdavehello avatar quitrk avatar ribero avatar rogeriomq avatar rudrasen2 avatar saghul avatar tallted avatar theevilskeleton avatar thttg avatar ujdhesa avatar virtuacoplenny 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

jitsi-meet-electron's Issues

external_api.js

Hello there,
windows / jitsi-meet / render.js
The external_api.js file specified in the file does not exist in my jitsi-meet installation. I installed the latest version.
modules / API / external / external_api.js does not work. He is not throwing an error.
What can I do about it?

Thanks,

custom electron app

Hi,
I've modified a file of webrtc and I've rebuilt libchromecontent and electron.
I put a lot of std::cout and I modified a log line in stun where usually I have an error, only to check I can see the modification of electron.
I copied electron inside node_modules/electron/dist and I've launched the application.

I don't see my modification (the prints and the stun log line).
could you tell me where I'm doing not well?
Thank you very much
Angelo

Prepare 1.0.0 release

  • Land onboarding PR
  • Update dependencies
  • UI review
  • Final overall review
  • README review

No App Structure

Currently, the app does not have a structure. It would become difficult to understand and contribute to this project for others.
There should be separate folders for main processes, renderer processes and assets.

No Loading Screen

Current Behavior
It shows blank white screen while external_api.js is being loaded.

Desired Behaviour
It should at least show a loading screen.

I would like to work on this.

Does not run on Ubuntu 14.04

me@host:~$ Downloads/jitsi-meet-x86_64.AppImage 
28082
[28750:0721/121145.898703:FATAL:nss_util.cc(632)] NSS_VersionCheck("3.26") failed. NSS >= 3.26 is required. Please upgrade to the latest NSS, and if you still get this error, contact your distribution maintainer.
Aborted
me@host:~$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="14.04.1 LTS, Trusty Tahr"

This can be worked around by patching jitsi-meet:

sed -i -e 's|3.26|3.00|g' jitsi-meet

It then launches. Also seems to work without issues.

Start application with a white page.

$ jitsi-meet-electron git:(master) ✗ npm start

> [email protected] start /Users/root1/Desktop/jitsi-meet-electron
> webpack --config ./webpack.config.js --mode development && electron ./build/main.js

Hash: 52cef22eca1aadc2c2c896ddc26f361f45be3123
Version: webpack 4.8.1
Child
    Hash: 52cef22eca1aadc2c2c8
    Time: 1652ms
    Built at: 2018-07-16 10:58:05
      Asset    Size  Chunks             Chunk Names
    main.js  49 KiB    main  [emitted]  main
    Entrypoint main = main.js
    [./main.js] 3.96 KiB {main} [built]
    [assert] external "assert" 42 bytes {main} [built]
    [constants] external "constants" 42 bytes {main} [built]
    [electron] external "electron" 42 bytes {main} [built]
    [electron-debug] external "require('electron-debug')" 42 bytes {main} [built]
    [fs] external "fs" 42 bytes {main} [built]
    [jitsi-meet-electron-utils] external "require('jitsi-meet-electron-utils')" 42 bytes {main} [built]
    [path] external "path" 42 bytes {main} [built]
    [stream] external "stream" 42 bytes {main} [built]
    [url] external "url" 42 bytes {main} [built]
    [util] external "util" 42 bytes {main} [built]
        + 11 hidden modules
Child
    Hash: 96ddc26f361f45be3123
    Time: 4523ms
    Built at: 2018-07-16 10:58:08
         Asset       Size  Chunks             Chunk Names
        app.js   3.37 MiB     app  [emitted]  app
    index.html  361 bytes          [emitted]
    Entrypoint app = app.js
    [./app/features/app/index.js] 366 bytes {app} [built]
    [./app/features/conference/index.js] 637 bytes {app} [built]
    [./app/features/config/index.js] 711 bytes {app} [built]
    [./app/features/navbar/index.js] 1.45 KiB {app} [built]
    [./app/features/redux/index.js] 552 bytes {app} [built]
    [./app/features/redux/middleware.js] 360 bytes {app} [built]
    [./app/features/redux/persistor.js] 373 bytes {app} [built]
    [./app/features/redux/reducers.js] 371 bytes {app} [built]
    [./app/features/redux/store.js] 929 bytes {app} [built]
    [./app/features/router/index.js] 752 bytes {app} [built]
    [./app/features/settings/index.js] 1.65 KiB {app} [built]
    [./app/features/settings/middleware.js] 903 bytes {app} [built]
    [./app/features/settings/reducer.js] 2.14 KiB {app} [built]
    [./app/features/welcome/index.js] 637 bytes {app} [built]
    [./app/index.js] 3.13 KiB {app} [built]
        + 697 hidden modules
    Child html-webpack-plugin for "index.html":
         1 asset
        Entrypoint undefined = index.html
        [./node_modules/html-webpack-plugin/lib/loader.js!./app/index.html] 521 bytes {0} [built]
        [./node_modules/webpack/buildin/module.js] (webpack)/buildin/module.js 519 bytes {0} [built]
            + 1 hidden module

start success, but with a white page, what's wrong?

open developer tool get this:

 action persist/PERSIST @ 10:58:09.974
redux-logger.js:1  prev state Object
redux-logger.js:1  action     Object
redux-logger.js:1  next state Object
redux-logger.js:1  action persist/REHYDRATE @ 10:58:09.989
redux-logger.js:1  prev state Object
redux-logger.js:1  action     Object
redux-logger.js:1  next state Object
redux-logger.js:1  action @@router/LOCATION_CHANGE @ 10:58:10.000
redux-logger.js:1  prev state Object
redux-logger.js:1  action     Object
redux-logger.js:1  next state Object
SettingsButton.js:77 Uncaught TypeError: Mousetrap.bindGlobal is not a function
    at SettingsButton.componentDidMount (SettingsButton.js:77)
    at commitLifeCycles (react-dom.development.js:9784)
    at commitAllLifeCycles (react-dom.development.js:11455)
    at HTMLUnknownElement.callCallback (react-dom.development.js:100)
    at Object.invokeGuardedCallbackDev (react-dom.development.js:138)
    at invokeGuardedCallback (react-dom.development.js:187)
    at commitRoot (react-dom.development.js:11594)
    at completeRoot (react-dom.development.js:12502)
    at performWorkOnRoot (react-dom.development.js:12452)
    at performWork (react-dom.development.js:12370)
react-dom.development.js:9643 The above error occurred in the <SettingsButton> component:
    in SettingsButton (created by Connect(SettingsButton))
    in Connect(SettingsButton) (created by Navbar)
    in button (created by GlobalItemInner)
    in GlobalItemInner (created by GlobalItem)
    in GlobalItem (created by Navbar)
    in div (created by GlobalPrimaryActionsList)
    in div (created by GlobalPrimaryActionsList)
    in GlobalPrimaryActionsList (created by GlobalPrimaryActions)
    in div (created by GlobalPrimaryActionsItemsWrapper)
    in GlobalPrimaryActionsItemsWrapper (created by GlobalPrimaryActions)
    in div (created by GlobalPrimaryActionsInner)
    in GlobalPrimaryActionsInner (created by GlobalPrimaryActions)
    in GlobalPrimaryActions (created by ContainerNavigation)
    in div (created by RevealInner)
    in RevealInner (created by Reveal)
    in Reveal (created by ContainerNavigation)
    in div (created by ContainerNavigationInner)
    in ContainerNavigationInner (created by ContainerNavigation)
    in ThemeProvider (created by WithRootTheme)
    in WithRootTheme (created by ContainerNavigation)
    in ContainerNavigation (created by Navigation)
    in div (created by NavigationContainerNavigationWrapper)
    in NavigationContainerNavigationWrapper (created by Navigation)
    in div (created by NavigationFixedContainer)
    in NavigationFixedContainer (created by Navigation)
    in div (created by SpacerInner)
    in SpacerInner (created by Spacer)
    in Spacer (created by Navigation)
    in div (created by Navigation)
    in ThemeProvider (created by WithElectronTheme)
    in WithElectronTheme (created by Navigation)
    in Navigation (created by WithTheme(Navigation))
    in WithTheme(Navigation)
    in ThemeProvider
    in Unknown (created by Navbar)
    in Navbar (created by Connect(Navbar))
    in Connect(Navbar) (created by Welcome)
    in div (created by styled.div)
    in styled.div (created by AkPage)
    in div (created by styled.div)
    in styled.div (created by AkPage)
    in div (created by styled.div)
    in styled.div (created by AkPage)
    in ThemeProvider (created by AkPage)
    in AkPage (created by Welcome)
    in Welcome (created by Connect(Welcome))
    in Connect(Welcome) (created by Route)
    in Route (created by App)
    in Switch (created by App)
    in Router (created by ConnectedRouter)
    in ConnectedRouter (created by App)
    in div (created by styled.div)
    in styled.div (created by AtlaskitThemeProvider)
    in ThemeProvider (created by AtlaskitThemeProvider)
    in AtlaskitThemeProvider (created by App)
    in App (created by Root)
    in PersistGate (created by Root)
    in Provider (created by Root)
    in Root

Consider adding an error boundary to your tree to customize error handling behavior.
Visit https://fb.me/react-error-boundaries to learn more about error boundaries.
logCapturedError @ react-dom.development.js:9643
/Users/root1/Desktop/jitsi-meet-electron/node_modules/electron/dist/Electron.app/Contents/Resources/electron.asar/renderer/security-warnings.js:188 Electron Security Warning (Insecure Content-Security-Policy) This renderer process has either no Content Security Policy set or a policy with "unsafe-eval" enabled. This exposes users of this app to unnecessary security risks.

For more information and help, consult https://electronjs.org/docs/tutorial/security.
This warning will not show up once the app is packaged.
warnAboutInsecureCSP @ /Users/root1/Desktop/jitsi-meet-electron/node_modules/electron/dist/Electron.app/Contents/Resources/electron.asar/renderer/security-warnings.js:188
SettingsButton.js:77 Uncaught (in promise) TypeError: Mousetrap.bindGlobal is not a function
    at SettingsButton.componentDidMount (SettingsButton.js:77)
    at commitLifeCycles (react-dom.development.js:9784)
    at commitAllLifeCycles (react-dom.development.js:11455)
    at HTMLUnknownElement.callCallback (react-dom.development.js:100)
    at Object.invokeGuardedCallbackDev (react-dom.development.js:138)
    at invokeGuardedCallback (react-dom.development.js:187)
    at commitRoot (react-dom.development.js:11594)
    at completeRoot (react-dom.development.js:12502)
    at performWorkOnRoot (react-dom.development.js:12452)
    at performWork (react-dom.development.js:12370)
redux-logger.js:1  action persist/REHYDRATE @ 10:58:15.596
redux-logger.js:1  prev state Object
redux-logger.js:1  action     Object
redux-logger.js:1  next state Object

Mousetrap.bindGlobal is not a function, how to fix in SettingsButton component.

[PROPOSAL] Auto-updates integration

Following are steps to build an auto-updates feature:

Deploying an Update Server

As mentioned in the official documentation of electron (https://electronjs.org/docs/tutorial/updates), to update the application using electron auto-updater module we need to deploy a server that the autoUpdater module will download new updates from.
I suggest Hazel for deploying the update server as it is widely used and can be deployed for free on Now. It pulls from GitHub Releases and leverages the power of GitHub's CDN.

const hazel = require('hazel-server')

http.createServer((req, res) => {
  hazel(req, res)
})

Auto Update Feature for Mac and Windows application

This feature will be implemented in jitsi-meet-electron-utils and then integrated with jitsi-meet-electron

Currently, only macOS and Windows are supported. There is no built-in support for auto-updater on Linux, so it is recommended to use the distribution's package manager to update your app.

Auto-updating for OSX is handled by Squirrel.Mac, which is built-in Electron. The way Squirrel.Mac works are by checking a given API endpoint to see if there is a new version of the app. If there is no new version, the endpoint should return HTTP 204. If there is a new version, however, it will expect a HTTP 200 JSON-formatted response, containing an URL to a .zip file:

{
  "url": "http://example.com/path/to/app.zip"
}

Squirrel will make an application/zip request using that URL, download the file, and fire up the final event to let you know that the update is ready to install.

On Windows, you have to install your app into a user's machine before you can use the autoUpdater, so it is recommended that you use the electron-winstaller, electron-forge or the grunt-electron-installer package to generate a Windows installer.

const { app, autoUpdater, dialog } = require('electron')

Next, construct the URL of the update server and tell autoUpdater about it:

const server = 'https://deployment-url.com'
const feed = `${server}/update/${process.platform}/${app.getVersion()}`
  
autoUpdater.setFeedURL(feed)

As the final step, check for updates. The example below will check every minute:

setInterval(() => {
    autoUpdater.checkForUpdates()
  }, 60000)

Once your application is packaged, it will receive an update for each new GitHub Release that you publish.

Applying Updates

Now that you've configured the basic update mechanism for your application, you need to ensure that the user will get notified when there's an update. This can be achieved using the autoUpdater API events:

autoUpdater.on('update-downloaded', (event, releaseNotes, releaseName) => {
    const dialogOpts = {
      type: 'info',
      buttons: ['Restart', 'Later'],
      title: 'Application Update',
      message: process.platform === 'darwin' ? releaseNotes : releaseName,
      detail: 'A new version has been downloaded. Restart the application to apply the updates.'
    }
  
    dialog.showMessageBox(dialogOpts, (response) => {
      if (response === 0) autoUpdater.quitAndInstall()
    })
  })

Also make sure that errors are being handled. Here's an example for logging them to stderr:

autoUpdater.on('error', message => {
    console.error('There was a problem updating the application')
    console.error(message)
  })

Note: If possible, I like to work on this.

Add calendar integration

Integrate with Google Calendar / Office 365 / system calendars on macOS (?). Design is TBD, but using a separate drawer for this is a possibility.

Alternatives if using web APIs directly is a no-go:

Add call history

The design is TBD. Having a separate drawer is a potential candidate.

error during building application

I'm trying to build the application and I have the following error:

`MANANGEL-M-139C:j_electron angelomantellini$ npm install

[email protected] postinstall /Users/angelomantellini/j_electron
electron-builder install-app-deps

• electron-builder version=20.28.1
• loaded configuration file=package.json ("build" field)
• rebuilding native production dependencies platform=darwin arch=x64
Error: /usr/local/Cellar/node/10.10.0/bin/node exited with code 6
Output:

[email protected] install /Users/angelomantellini/j_electron/node_modules/fsevents
node install

Error output:
node-pre-gyp ERR! Completion callback never invoked!
node-pre-gyp ERR! System Darwin 17.7.0
node-pre-gyp ERR! command "/usr/local/Cellar/node/10.10.0/bin/node" "/Users/angelomantellini/j_electron/node_modules/fsevents/node_modules/node-pre-gyp/bin/node-pre-gyp" "install" "--fallback-to-build"
node-pre-gyp ERR! cwd /Users/angelomantellini/j_electron/node_modules/fsevents
node-pre-gyp ERR! node -v v10.10.0
node-pre-gyp ERR! node-pre-gyp -v v0.10.0
node-pre-gyp ERR! This is a bug in node-pre-gyp.
node-pre-gyp ERR! Try to update node-pre-gyp and file an issue if it does not help:
node-pre-gyp ERR! https://github.com/mapbox/node-pre-gyp/issues
npm ERR! code ELIFECYCLE
npm ERR! errno 6
npm ERR! [email protected] install: node install
npm ERR! Exit status 6
npm ERR!
npm ERR! Failed at the [email protected] install script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR! /Users/angelomantellini/.npm/_logs/2018-09-18T11_31_56_927Z-debug.log

at ChildProcess.childProcess.once.code (/Users/angelomantellini/j_electron/node_modules/builder-util/src/util.ts:254:14)
at Object.onceWrapper (events.js:273:13)
at ChildProcess.emit (events.js:182:13)
at maybeClose (internal/child_process.js:962:16)
at Socket.stream.socket.on (internal/child_process.js:381:11)
at Socket.emit (events.js:182:13)
at Pipe._handle.close (net.js:606:12)

From previous event:
at rebuild (/Users/angelomantellini/j_electron/node_modules/app-builder-lib/out/util/yarn.js:239:18)
at /Users/angelomantellini/j_electron/node_modules/app-builder-lib/src/util/yarn.ts:20:11
From previous event:
at installOrRebuild (/Users/angelomantellini/j_electron/node_modules/app-builder-lib/out/util/yarn.js:68:17)
at /Users/angelomantellini/j_electron/node_modules/electron-builder/src/cli/install-app-deps.ts:56:9
at Generator.next ()
From previous event:
at installAppDeps (/Users/angelomantellini/j_electron/node_modules/electron-builder/out/cli/install-app-deps.js:174:17)
at then (/Users/angelomantellini/j_electron/node_modules/electron-builder/src/cli/cli.ts:42:48)
at runCallback (timers.js:694:18)
at tryOnImmediate (timers.js:665:5)
at processImmediate (timers.js:647:5)
From previous event:
at Object.args [as handler] (/Users/angelomantellini/j_electron/node_modules/electron-builder/src/cli/cli.ts:42:48)
at Object.runCommand (/Users/angelomantellini/j_electron/node_modules/yargs/lib/command.js:237:44)
at Object.parseArgs [as _parseArgs] (/Users/angelomantellini/j_electron/node_modules/yargs/yargs.js:1059:30)
at Object.get [as argv] (/Users/angelomantellini/j_electron/node_modules/yargs/yargs.js:1000:21)
at Object. (/Users/angelomantellini/j_electron/node_modules/electron-builder/src/cli/cli.ts:25:28)
at Module._compile (internal/modules/cjs/loader.js:689:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
at Module.load (internal/modules/cjs/loader.js:599:32)
at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
at Function.Module._load (internal/modules/cjs/loader.js:530:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
at startup (internal/bootstrap/node.js:279:19)
at bootstrapNodeJSCore (internal/bootstrap/node.js:696:3)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] postinstall: electron-builder install-app-deps
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the [email protected] postinstall script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.`
How can I solve this issue?

Invalid Server URL

Hi,

I'm seeing Invalid Server URL. The url works fine from a browser but not from this project.
The jitsi server was created with https://github.com/jitsi/docker-jitsi-meet

Not sure what the issue is?

conference: check if valid jitsi-meet server

It would be nice if we can check if the given domain from settings or from the link is a valid domain and display an error if not.

Currently, it goes back to the Welcome page.

If https://${domain}/external_api.js exists, the server is valid jitsi-meet server. Does this sound good?

Window dragging during remote control screenshare

The new screen share remote control feature is fantastic! I found one bug however.

It seems as though there is a windowhandler for the electron app, where the intention is to be able to click in non-titlebar locations of the electron app, so you might drag the electron app around the screen. Normally of course, this is limited to clicking on a window's title bar (I should mention all of this testing was on MacOS). Ive noticed you can click and drag on the bottom jitsi toolbar where the hangup/screenshare/raise hand icons are. That would be cool - except it also seems to impact a remote screen sharing session. If i try to click and drag something within remote control session, it actually moves my LOCAL electron jitsi meet app window around, the same way it would if i was dragging by own jitsi meet window titlebar around.

If there's a way I can capture relevant data, please let me know, happy to share but wanted to report it nonetheless.

No Webpack (or React)

It will be nice to have Webpack to generate static assets for the application.
It would be beneficial to create a welcome screen or any other offline components.

I can work on it.

electron-builder install-app-deps fails.

Hello,

I am quite excited about this new electron app.
Nevertheless, I am not able to make it work on a windows 7 computer. I managed to make it work on my friend windows 10 computer though. I'd really appreciate your help.

I am failing at the first step of the process : npm install.
I get the following error (with set DEBUG=electron-builder):

[email protected] postinstall E:\git\jitsi-meet-electron\node_modules\electron
node install.js

[email protected] postinstall E:\git\jitsi-meet-electron
electron-builder install-app-deps

• electron-builder version=20.28.1
• loaded configuration file=package.json ("build" field)
• unresolved dependencies after first round unresolved=fsevents
• rebuilding native production dependencies platform=win32 arch=ia32
• spawning command=C:\Program Files (x86)\nodejs\node.exe C:\Program Files (x86)\nodejs\node_modules\npm\bin\npm-cli.js rebuild [email protected] [email protected] cwd=E:\git\jitsi-meet-electron

[email protected] install E:\git\jitsi-meet-electron\node_modules\jitsi-meet-electron-utils
prebuild-install || node-gyp rebuild

E:\git\jitsi-meet-electron\node_modules\node-abi\index.js:30
throw new Error('Could not detect abi for version ' + target + ' and runtime ' + runtime + '. Updating "node-abi" might help solve this issue if it is a new release of ' + runtime)
^

Error: Could not detect abi for version 3.0.0-beta.5 and runtime electron. Updating "node-abi" might help solve this issue if it is a new release of electron
at getAbi (E:\git\jitsi-meet-electron\node_modules\node-abi\index.js:30:9)
at module.exports (E:\git\jitsi-meet-electron\node_modules\prebuild-install\rc.js:64:12)
at Object. (E:\git\jitsi-meet-electron\node_modules\prebuild-install\bin.js:8:25)
at Module._compile (module.js:652:30)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (module.js:565:32)
at tryModuleLoad (module.js:505:12)
at Function.Module._load (module.js:497:3)
at Function.Module.runMain (module.js:693:10)
at startup (bootstrap_node.js:191:16)

E:\git\jitsi-meet-electron\node_modules\jitsi-meet-electron-utils>if not defined npm_config_node_gyp (node "C:\Program Files (x86)\nodejs\node_modules\npm\node_modules\npm-lifecycle\node-gyp-bin\....\node_modules\node-gyp\bin\node-gyp.js" rebuild ) else (node "C:\Program Files (x86)\nodejs\node_modules\npm\node_modules\node-gyp\bin\node-gyp.js" rebuild )
Building the projects in this solution one at a time. To enable parallel build, please add the "/m" switch.
index.cc
sourceId2Coordinates.cc
win_delay_load_hook.cc
C:\Users\aduver.electron-gyp\iojs-3.0.0-beta.5\deps\v8\include\v8.h(2509): error C2144: syntax error : 'int' should be preceded by ';' (..\node_addons\sourceId2Coordinates\src\index.cc) [E:\git\jitsi-me
et-electron\node_modules\jitsi-meet-electron-utils\build\sourceId2Coordinates.vcxproj]
C:\Users\aduver.electron-gyp\iojs-3.0.0-beta.5\deps\v8\include\v8.h(2509): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int (..\node_addons\sourceId2Coordinates
src\index.cc) [E:\git\jitsi-meet-electron\node_modules\jitsi-meet-electron-utils\build\sourceId2Coordinates.vcxproj]
C:\Users\aduver.electron-gyp\iojs-3.0.0-beta.5\deps\v8\include\v8.h(4124): error C2610: 'v8::WasmCompiledModule::TransferrableModule::TransferrableModule(v8::WasmCompiledModule::TransferrableModule &&)'
: is not a special member function which can be defaulted (..\node_addons\sourceId2Coordinates\src\index.cc) [E:\git\jitsi-meet-electron\node_modules\jitsi-meet-electron-utils\build\sourceId2Coordinates
.vcxproj]
C:\Users\aduver.electron-gyp\iojs-3.0.0-beta.5\deps\v8\include\v8.h(4127): error C2610: 'v8::WasmCompiledModule::TransferrableModule &v8::WasmCompiledModule::TransferrableModule::operator =(v8::WasmComp
iledModule::TransferrableModule &&)' : is not a special member function which can be defaulted (..\node_addons\sourceId2Coordinates\src\index.cc) [E:\git\jitsi-meet-electron\node_modules\jitsi-meet-elect
ron-utils\build\sourceId2Coordinates.vcxproj]
C:\Users\aduver.electron-gyp\iojs-3.0.0-beta.5\deps\v8\include\v8.h(4215): error C2610: 'v8::WasmModuleObjectBuilderStreaming::WasmModuleObjectBuilderStreaming(v8::WasmModuleObjectBuilderStreaming &&)'
: is not a special member function which can be defaulted (..\node_addons\sourceId2Coordinates\src\index.cc) [E:\git\jitsi-meet-electron\node_modules\jitsi-meet-electron-utils\build\sourceId2Coordinates.
vcxproj]
C:\Users\aduver.electron-gyp\iojs-3.0.0-beta.5\deps\v8\include\v8.h(4220): error C2610: 'v8::WasmModuleObjectBuilderStreaming &v8::WasmModuleObjectBuilderStreaming::operator =(v8::WasmModuleObjectBuilde
rStreaming &&)' : is not a special member function which can be defaulted (..\node_addons\sourceId2Coordinates\src\index.cc) [E:\git\jitsi-meet-electron\node_modules\jitsi-meet-electron-utils\build\sourc
eId2Coordinates.vcxproj]
C:\Users\aduver.electron-gyp\iojs-3.0.0-beta.5\deps\v8\include\v8.h(4510): error C2146: syntax error : missing ';' before identifier 'size_t' (..\node_addons\sourceId2Coordinates\src\index.cc) [E:\git\j
itsi-meet-electron\node_modules\jitsi-meet-electron-utils\build\sourceId2Coordinates.vcxproj]
C:\Users\aduver.electron-gyp\iojs-3.0.0-beta.5\deps\v8\include\v8.h(4510): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int (..\node_addons\sourceId2Coordinates
src\index.cc) [E:\git\jitsi-meet-electron\node_modules\jitsi-meet-electron-utils\build\sourceId2Coordinates.vcxproj]
C:\Users\aduver.electron-gyp\iojs-3.0.0-beta.5\src\node_buffer.h(34): error C2597: illegal reference to non-static member 'v8::TypedArray::kMaxLength' (..\node_addons\sourceId2Coordinates\src\index.cc)
[E:\git\jitsi-meet-electron\node_modules\jitsi-meet-electron-utils\build\sourceId2Coordinates.vcxproj]
C:\Users\aduver.electron-gyp\iojs-3.0.0-beta.5\src\node_buffer.h(34): error C2440: 'initializing' : cannot convert from 'unknown' to 'const unsigned int' (..\node_addons\sourceId2Coordinates\src\index.c
c) [E:\git\jitsi-meet-electron\node_modules\jitsi-meet-electron-utils\build\sourceId2Coordinates.vcxproj]
There is no context in which this conversion is possible
gyp ERR! build error
gyp ERR! stack Error: msbuild failed with exit code: 1
gyp ERR! stack at ChildProcess.onExit (C:\Program Files (x86)\nodejs\node_modules\npm\node_modules\node-gyp\lib\build.js:262:23)
gyp ERR! stack at emitTwo (events.js:126:13)
gyp ERR! stack at ChildProcess.emit (events.js:214:7)
gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:198:12)
gyp ERR! System Windows_NT 6.1.7601
gyp ERR! command "C:\Program Files (x86)\nodejs\node.exe" "C:\Program Files (x86)\nodejs\node_modules\npm\node_modules\node-gyp\bin\node-gyp.js" "rebuild"
gyp ERR! cwd E:\git\jitsi-meet-electron\node_modules\jitsi-meet-electron-utils
gyp ERR! node -v v8.11.4
gyp ERR! node-gyp -v v3.8.0
gyp ERR! not ok
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] install: prebuild-install || node-gyp rebuild
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the [email protected] install script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR! C:\Users\aduver\AppData\Roaming\npm-cache_logs\2018-08-27T16_17_39_207Z-debug.log
• exited command=node.exe code=1 pid=18684
Error: C:\Program Files (x86)\nodejs\node.exe exited with code 1
at ChildProcess.childProcess.once.code (E:\git\jitsi-meet-electron\node_modules\builder-util\src\util.ts:254:14)
at Object.onceWrapper (events.js:317:30)
at emitTwo (events.js:126:13)
at ChildProcess.emit (events.js:214:7)
at maybeClose (internal/child_process.js:925:16)
at Process.ChildProcess._handle.onexit (internal/child_process.js:209:5)
From previous event:
at rebuild (E:\git\jitsi-meet-electron\node_modules\app-builder-lib\out\util\yarn.js:239:18)
at E:\git\jitsi-meet-electron\node_modules\app-builder-lib\src\util\yarn.ts:20:11
From previous event:
at installOrRebuild (E:\git\jitsi-meet-electron\node_modules\app-builder-lib\out\util\yarn.js:68:17)
at E:\git\jitsi-meet-electron\node_modules\electron-builder\src\cli\install-app-deps.ts:56:9
at Generator.next ()
From previous event:
at installAppDeps (E:\git\jitsi-meet-electron\node_modules\electron-builder\out\cli\install-app-deps.js:174:17)
at then (E:\git\jitsi-meet-electron\node_modules\electron-builder\src\cli\cli.ts:42:48)
at runCallback (timers.js:810:20)
at tryOnImmediate (timers.js:768:5)
at processImmediate [as _immediateCallback] (timers.js:745:5)
From previous event:
at Object.args [as handler] (E:\git\jitsi-meet-electron\node_modules\electron-builder\src\cli\cli.ts:42:48)
at Object.runCommand (E:\git\jitsi-meet-electron\node_modules\yargs\lib\command.js:237:44)
at Object.parseArgs [as _parseArgs] (E:\git\jitsi-meet-electron\node_modules\yargs\yargs.js:1059:30)
at Object.get [as argv] (E:\git\jitsi-meet-electron\node_modules\yargs\yargs.js:1000:21)
at Object. (E:\git\jitsi-meet-electron\node_modules\electron-builder\src\cli\cli.ts:25:28)
at Module._compile (module.js:652:30)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (module.js:565:32)
at tryModuleLoad (module.js:505:12)
at Function.Module._load (module.js:497:3)
at Function.Module.runMain (module.js:693:10)
at startup (bootstrap_node.js:191:16)
at bootstrap_node.js:612:3
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] postinstall: electron-builder install-app-deps
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the [email protected] postinstall script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR! C:\Users\aduver\AppData\Roaming\npm-cache_logs\2018-08-27T16_17_39_390Z-debug.log

error before call starts

Hi,
I'm trying to use jitsi electron with my internal server.
I have the following error:

external_api.js:1 Uncaught SyntaxError: Unexpected identifier
Conference.js:187 Uncaught TypeError: JitsiMeetExternalAPI is not a constructor
at Conference._onScriptLoad (Conference.js:187)
at HTMLScriptElement.script.onload (Conference.js:88)

do you have ideas about it?
Thank you
Angelo

Cannot connect to custom jitsi meet

The app works perfectly for meet.jit.si but not for my domain. It doesn't connect.
Do I need to enable anything in jitsi meet config? Or what could I be doing wrong?
Also how can see the error log for this?

Some eslint rules are not applied

Note this:

                        <Button
                            appearance = 'primary'
                            type = 'button'
                            onClick = { this._onJoin }>
                            GO
                        </Button>

This should trigger react/jsx-sort-props, but somehow it doesn't seem to be working.

error switching server

Hi,
I'm trying to switch the server from https://meet.jit.si to another internal server.
The problem is that a message "invalid server URL" is shown.
do you have idea to understand why I have this error?
thank you

Angelo

Setup some CI

We don't have any tests yet, but having a CI to at least run the linter would be nice. @damencho, as the Chief CI Officer, WDYT? I think we could use travis for this.

Handle URL parameters

A user may enter the following URL: https://meet.jit.si/fooo#config.p2p.enabled=false

We need to convert all the hash parameters into config overrides which the iframe API takes (right @hristoterezov ?).

how to log

How can I print logs in the application?
Thanks

can't start this project

  jitsi-meet-electron git:(master) ✗ npm start

> [email protected] start /Users/root1/Desktop/jitsi-meet-electron
> webpack --config ./webpack.config.js --mode development && electron ./build/main.js

Hash: 320fd2532dfcf2892fa276fca7e446794b0e37dc
Version: webpack 4.8.1
Child
    Hash: 320fd2532dfcf2892fa2
    Time: 470ms
    Built at: 2018-07-16 10:28:01
      Asset      Size  Chunks             Chunk Names
    main.js  4.29 KiB    main  [emitted]  main
    Entrypoint main = main.js
    [./main.js] 1.49 KiB {main} [built] [failed] [1 error]

    ERROR in ./main.js
    Module build failed: Error: Couldn't find preset "es2015" relative to directory "/Users/root1/Desktop"
        at /Users/root1/Desktop/jitsi-meet-electron/node_modules/babel-core/lib/transformation/file/options/option-manager.js:293:19
        at Array.map (<anonymous>)
        at OptionManager.resolvePresets (/Users/root1/Desktop/jitsi-meet-electron/node_modules/babel-core/lib/transformation/file/options/option-manager.js:275:20)
        at OptionManager.mergePresets (/Users/root1/Desktop/jitsi-meet-electron/node_modules/babel-core/lib/transformation/file/options/option-manager.js:264:10)
        at OptionManager.mergeOptions (/Users/root1/Desktop/jitsi-meet-electron/node_modules/babel-core/lib/transformation/file/options/option-manager.js:249:14)
        at OptionManager.init (/Users/root1/Desktop/jitsi-meet-electron/node_modules/babel-core/lib/transformation/file/options/option-manager.js:368:12)
        at File.initOptions (/Users/root1/Desktop/jitsi-meet-electron/node_modules/babel-core/lib/transformation/file/index.js:212:65)
        at new File (/Users/root1/Desktop/jitsi-meet-electron/node_modules/babel-core/lib/transformation/file/index.js:135:24)
        at Pipeline.transform (/Users/root1/Desktop/jitsi-meet-electron/node_modules/babel-core/lib/transformation/pipeline.js:46:16)
        at transpile (/Users/root1/Desktop/jitsi-meet-electron/node_modules/babel-loader/lib/index.js:50:20)
        at Object.module.exports (/Users/root1/Desktop/jitsi-meet-electron/node_modules/babel-loader/lib/index.js:173:20)
Child
    Hash: 76fca7e446794b0e37dc
    Time: 708ms
    Built at: 2018-07-16 10:28:01
         Asset       Size  Chunks             Chunk Names
        app.js   4.32 KiB     app  [emitted]  app
    index.html  361 bytes          [emitted]
    Entrypoint app = app.js
    [./app/index.js] 1.49 KiB {app} [built] [failed] [1 error]

    ERROR in ./app/index.js
    Module build failed: Error: Couldn't find preset "es2015" relative to directory "/Users/root1/Desktop"
        at /Users/root1/Desktop/jitsi-meet-electron/node_modules/babel-core/lib/transformation/file/options/option-manager.js:293:19
        at Array.map (<anonymous>)
        at OptionManager.resolvePresets (/Users/root1/Desktop/jitsi-meet-electron/node_modules/babel-core/lib/transformation/file/options/option-manager.js:275:20)
        at OptionManager.mergePresets (/Users/root1/Desktop/jitsi-meet-electron/node_modules/babel-core/lib/transformation/file/options/option-manager.js:264:10)
        at OptionManager.mergeOptions (/Users/root1/Desktop/jitsi-meet-electron/node_modules/babel-core/lib/transformation/file/options/option-manager.js:249:14)
        at OptionManager.init (/Users/root1/Desktop/jitsi-meet-electron/node_modules/babel-core/lib/transformation/file/options/option-manager.js:368:12)
        at File.initOptions (/Users/root1/Desktop/jitsi-meet-electron/node_modules/babel-core/lib/transformation/file/index.js:212:65)
        at new File (/Users/root1/Desktop/jitsi-meet-electron/node_modules/babel-core/lib/transformation/file/index.js:135:24)
        at Pipeline.transform (/Users/root1/Desktop/jitsi-meet-electron/node_modules/babel-core/lib/transformation/pipeline.js:46:16)
        at transpile (/Users/root1/Desktop/jitsi-meet-electron/node_modules/babel-loader/lib/index.js:50:20)
        at Object.module.exports (/Users/root1/Desktop/jitsi-meet-electron/node_modules/babel-loader/lib/index.js:173:20)
    Child html-webpack-plugin for "index.html":
         1 asset
        Entrypoint undefined = index.html
        [./node_modules/html-webpack-plugin/lib/loader.js!./app/index.html] 521 bytes {0} [built]
        [./node_modules/webpack/buildin/module.js] (webpack)/buildin/module.js 519 bytes {0} [built]
            + 1 hidden module
npm ERR! code ELIFECYCLE
npm ERR! errno 2
npm ERR! [email protected] start: `webpack --config ./webpack.config.js --mode development && electron ./build/main.js`
npm ERR! Exit status 2
npm ERR!
npm ERR! Failed at the [email protected] start script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/root1/.npm/_logs/2018-07-16T02_28_01_375Z-debug.log

and the log

➜  jitsi-meet-electron git:(master) ✗ more /Users/root1/.npm/_logs/2018-07-16T02_28_01_375Z-debug.log
0 info it worked if it ends with ok
1 verbose cli [ '/usr/local/bin/node', '/usr/local/bin/npm', 'start' ]
2 info using [email protected]
3 info using [email protected]
4 verbose run-script [ 'prestart', 'start', 'poststart' ]
5 info lifecycle [email protected]~prestart: [email protected]
6 info lifecycle [email protected]~start: [email protected]
7 verbose lifecycle [email protected]~start: unsafe-perm in lifecycle true
8 verbose lifecycle [email protected]~start: PATH: /usr/local/lib/node_modules/npm/node_modules/npm-lifecycle/node-gyp-bin:/Users/root1/Desktop/jitsi-meet-electron/node_modules/.bin:/Users/root1/.jenv/shims:/Users/root1/.jenv/bin:/Users/root1/torch/install/bin:/Users/root1/torch/install/bin:/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/bin:/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/bin:/Users/root1/bin:/opt/local/bin:/Users/root1/.rvm/gems/ruby-2.3.0/bin:/Users/root1/.rvm/gems/ruby-2.3.0@global/bin:/Users/root1/.rvm/rubies/ruby-2.3.0/bin:/Users/root1/.sdkman/candidates/springboot/current/bin:/Users/root1/torch/install/bin:/Users/root1/torch/install/bin:/Library/Frameworks/Python.framework/Versions/3.6/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/opt/X11/bin:/Library/Frameworks/Mono.framework/Versions/Current/Commands:/Users/root1/.rvm/bin:/Users/root1/Library/Android/android-sdk-macosx/platform-tools/:/Users/root1/apache-maven-3.5.0/bin:/Users/root1/gradle-4.3.1/bin:/Users/root1/wine-2.0.2/bin:/usr/local/mysql-5.7.18-macos10.12-x86_64/bin:/usr/local/share/scala-2.12.3/bin:/Users/root1/go/bin:/Users/root1/.rvm/bin:/Users/root1/gradle-4.1/bin
9 verbose lifecycle [email protected]~start: CWD: /Users/root1/Desktop/jitsi-meet-electron
10 silly lifecycle [email protected]~start: Args: [ '-c',
10 silly lifecycle   'webpack --config ./webpack.config.js --mode development && electron ./build/main.js' ]
11 silly lifecycle [email protected]~start: Returned: code: 2  signal: null
12 info lifecycle [email protected]~start: Failed to exec start script
13 verbose stack Error: [email protected] start: `webpack --config ./webpack.config.js --mode development && electron ./build/main.js`
13 verbose stack Exit status 2
13 verbose stack     at EventEmitter.<anonymous> (/usr/local/lib/node_modules/npm/node_modules/npm-lifecycle/index.js:304:16)
13 verbose stack     at EventEmitter.emit (events.js:182:13)
13 verbose stack     at ChildProcess.<anonymous> (/usr/local/lib/node_modules/npm/node_modules/npm-lifecycle/lib/spawn.js:55:14)
13 verbose stack     at ChildProcess.emit (events.js:182:13)
13 verbose stack     at maybeClose (internal/child_process.js:961:16)
13 verbose stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:248:5)
14 verbose pkgid [email protected]
15 verbose cwd /Users/root1/Desktop/jitsi-meet-electron
16 verbose Darwin 17.7.0
17 verbose argv "/usr/local/bin/node" "/usr/local/bin/npm" "start"
18 verbose node v10.2.1
19 verbose npm  v6.1.0
20 error code ELIFECYCLE
21 error errno 2
22 error [email protected] start: `webpack --config ./webpack.config.js --mode development && electron ./build/main.js`
22 error Exit status 2
23 error Failed at the [email protected] start script.
23 error This is probably not a problem with npm. There is likely additional logging output above.
24 verbose exit [ 2, true ]

Add recording functionality

It would be great if streams could be recorded locally so that they could be edited (e.g., cut using Kdenlive) afterwards, in addition to being able to do live streams on YouTube.

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.