Git Product home page Git Product logo

cordova-plugin-kiosk's Introduction

Cordova Kiosk Mode

A Cordova plugin to create a Cordova application with "kiosk mode". An app with this plugin can be set as an Android launcher. If the app starts as a launcher, it blocks hardware buttons and statusbar, so an user cannot close the app until the app request it.

This plugin does not change behavior of application until it is set as launcher - home screen of the device.

Escape from the app is possible only using javascript call KioskPlugin.exitKiosk() or by uninstalling the app using adb. (Keeping USB debug allowed necessary.) If the application starts as usual (not as a launcher), no restrictions are applied.

This plugin is for Android platform only. For kiosk on iOS platform check its Guided Access feature.

About

By adding this Cordova plugin the Cordova app becomes a homescreen (also known as a launcher) of Android device and should block any attempt of user to leave it.

To add plugin into existing Cordova / Phonegap application use:

cordova plugin add https://github.com/hkalina/cordova-plugin-kiosk.git

To add specific version of this plugin (like v2.0) use:

cordova plugin add https://github.com/hkalina/cordova-plugin-kiosk.git#v2.0

Android platform files (like AndroidManifest.xml) should be updated immediately. If you will modify plugin code, you will need to re-add android platform to plugin modifications take effect:

cordova platform rm android
cordova platform add android

To has it working, user have to set this application as launcher (see below) and start it by pressing Home button or by restarting the device.

WARNING Before installation ensure you have USB debug mode enabled. Without USB debug enabled you can get stuck in broken kiosk application.

Short API description

Exiting from Kiosk mode using Javascript in the page (for hidden/authenticated button to escape the kiosk application):

KioskPlugin.exitKiosk();

Detecting whether the app is successfly running in kiosk mode (kiosk activity is opened):

KioskPlugin.isInKiosk(function(isInKiosk){ ... });

Detecting whether the app (kiosk activity) is set as launcher:

KioskPlugin.isSetAsLauncher(function(isLauncher){ ... });

The device is effectively locked only when both methods returns true. When the app is "in kiosk", but not set as a launcher, user can escape the app by pressing a Home button (but other buttons are still locked).

Defining allowed buttons - buttons whose event propagation should not be prevented - so you can for example allow setting volume up/down:

KioskPlugin.setAllowedKeys([ 24, 25 ]); // KEYCODE_VOLUME_UP, KEYCODE_VOLUME_DOWN

For list of keycode values check KeyEvent reference: https://developer.android.com/reference/android/view/KeyEvent#KEYCODE_0

For complete example application check: https://github.com/hkalina/cordova-kiosk-demo

Tips

  • To remove this application use adb: (Do not install it without USB debug mode enabled!) (com.example.hello replace with package of your app defined in your config.xml)

      $ANDROID_HOME/platform-tools/adb uninstall com.example.hello
    
  • To change launcher (reset setting which launcher is default):

  • Alcatel: Settings - Applications - All - (This Application) / Launcher - Clear defaults, after Home press will be asked for default to set

  • Xiaomi: Settings - Installed apps - Defaults - Launcher

  • To disable screenlock: ("slide to unlock")

  • Alcatel: Settings - Security - Set up screen lock - None

  • Xiaomi: Settings - Additional settings - Developer options - Skip screen lock

"Application Error - The connection to the server was unsuccessful. (file:///android_asset/www/index.html)" occurred

  • One reason can be too long loading of index.html - you can set timeout of Cordova's WebView in config.xml of application: (value is in milliseconds)

      <preference name="loadUrlTimeoutValue" value="60000" />
    

cordova-plugin-kiosk's People

Contributors

krishna711 avatar mcouzinet avatar ngocdaothanh avatar systemparadox avatar thaarok avatar zhanghuanchong avatar zorn-v 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

cordova-plugin-kiosk's Issues

audiocontrol

Hi @honza889
Thanks a lot for the very nice work you did here.
Is there a way to allow the user interactions with the volume-control buttons (hardware)?

thanks and greetings

Conflict during instal, have to use force

I can add the plugin fine. but if i remove android platform, then add it back again, i get the following...

Failed to install 'cordova-plugin-kiosk': Error: There was a conflict trying to modify attributes with <edit-config> in plugin cordova-plugin-kiosk. The conflicting plugin, undefined, already modified the same attributes. The conflict must be resolved before cordova-plugin-kiosk can be added. You may use --force to add the plugin and overwrite the conflicting attributes.

I can use force and it will install locally, but then my ionicframework build will break, since i dont think i can force the install during the packaging process. What am I doing wrong?

Doesn't build under PhoneGap Build

I've created a new PhoneGap application and ran phonegap cordova plugin add...

This adds the following to my config.xml:

<plugin name="cordova-plugin-kiosk" spec="https://github.com/hkalina/cordova-plugin-kiosk.git" />

If you then try and build the application on PhoneGap Build using phonegap remote run android, you get:

(node:11295) [DEP0013] DeprecationWarning: Calling an asynchronous function without callback is deprecated.
   [error] error occured while building the android app

Back button goes to recent screens

Using an emulator, and on a Samsung Galaxy View with Android v5.1 it is possible to leave the app using the back button (the recent screens button is locked as intended). I have very little experience with Cordova and Android in general so I'm not sure what other information I can supply to help. I know it's possible, having seen this in SecureLock, but haven't figured out how to get it working with Cordova.

Disable access to recent apps

On some devices it may still be possible to access the recent apps list (in my case a Honeywell Dolphin 75e, which has a direct hardware button for recent apps).

I had to add the following code to prevent this (best to add to both KioskActivity and HomeActivity):

import android.app.ActivityManager;
import android.content.Context;

public void onWindowFocusChanged(boolean hasFocus) {
    if (! hasFocus) {
        ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
        am.moveTaskToFront(getTaskId(), ActivityManager.MOVE_TASK_WITH_HOME );
    }
}

Launch another app when in kiosk mode

I banged my head for a while and am close to giving up so I thought I would ask for help from the experts.

I have an app that is in kiosk mode using this plugin. However, we need to be able to launch other apps from within our app, and then when done, we come back to the kiosk app. When I use intents to launch another app our app am still in the front. Even when we call moveToBack -- don't know what to do?

Is it at all feasible? This is beyond my skillset. Thanks

I am able to open the notification panel

I am able to swipe down from the top of the screen and than swipe down again when the status bar appears. This way I can successfully open the notification panel and change the quick settings (i.e. turn on/off wifi). Tested on Android 7.1.1.

photo5900268845833234511

Any idea how to solve this?

Can't turn off device

Thanks @honza889 for this amazing plugin.

All works as planned, except .. we can't turn off the device :) the plugin closes the popup as soon as it appears. Any advice? I believe it's the Pause event, but don't know where to handle it in your Java. Any help would be greatly appreciated (Also, I do expect this to be a common request, even Kiosk devices need to be shut down).

Touch doesn't work under StatusBar-Area

I have a simple fullscreen app where 100% of the area is touchable/clickable. As soon as I turn on kiosk mode the area under the (hidden) StatusBar is not touchable anymore.

I haven't tried to follow the steps described here yet in order to isolate the issue without the kiosk plugin.

My general question would be:

  • Is this a known issue or maybe related to a specific Android version? I'm using Android – 5.0 Lollipop
  • Could it be that your code is optimised for 4.0 or older? The docs mentioning for 4.1 and higher it is recommended to use:
View decorView = getWindow().getDecorView();
// Hide the status bar.
int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
// Remember that you should never show the action bar if the
// status bar is hidden, so hide that too if necessary.
ActionBar actionBar = getActionBar();
actionBar.hide();

Thank you for taking the time to look into my issue :)

Allow Camera?

I have a web app with kiosk enabled. I would like the user to take a picture. Is it possible to allow things like a camera to run and return safely without being closed prematurely?

Thanks for an excellent plugin!

  • Matt

Back not overridden

Nice little plugin, but I'm having trouble with it running on a Samsung Tab and a wileyfox swift.

When back is pressed the device is taken to a screen showing "Click or press any key to begin..." before relaunching the app from the begining.

Obviously I can edit this text out and the time delay until relaunch, but it would be better if nothing happened at all - that is what I suspect the behaviour should be?

The Samsung is running Android 6.0.1
WileyFox running 7.1.2

Trouble with exitKiosk with a Cordova/Ionic app

Hi,

I am a relatively newbie to Cordova development and am making a kiosk-style app. I have added your plugin and added the code in your demo, but I cannot get it to exit to application. I have tried using inline script with the onclick event as in your demo code (with the inline-unsafe exception) and also as an ng-click with the AngularJS controller executing the Javascript call to KioskPlugin, but nothing seems to work. The other function isInKiosk also doesn't work. It appears to be possibly not accessing the plugin, but I could imagine it could be a conflict with Ionic/AngularJS although not sure how.

Can you give me any assistance in this? Thanks in anticipation of your reply and wonderful work on the plugin. Even though I can't get the functions to work, the rest of the functionality seems to be intact, locking the device down nicely.

Regards, Neil

Change launcher label

Hello,

When exiting kiosk mode, Android displays the launchers list. The kiosk mode plugin uses the label "Cordova kiosk app launcher" for the application. Is there a way to change it and put a custom label? Thank you.

Jimmy

fk.fadeit.play does not exist

Hey folks,

i tried to include this plugin to my existing ionic v1 app. After doing so- i get this compilation error:

/KioskActivity.java:69:
error: package dk.fadeit.play does not exist
i googled, but was unable to find anything helpful. Do you guys have a hint for me?

Shutting down

Hey again @honza889

Right now, as soon as the window loses focus the plugin sends the intent android.intent.action.CLOSE_SYSTEM_DIALOGS which closes the power down dialog. Is there any way to detect power down attempt and allow it? Searched everywhere and can't find an answer that works.

Thanks a lot for your courtesy and support

Open a cordova plugin

Hi,
When opening a cordova plugin for example barcode scanner,it doesn't open in kiosk mode.
It opens in normal mode.
Any idea how to fix that?
Thx,

Error at install: Unable to graft xml at selector

I'm getting the following error using the latest git commit aswell as #v2.0
Failed to install 'cordova-plugin-kiosk': Error: Unable to graft xml at selector "/manifest/application/activity[@android:label='@string/activity_name']" from "platforms\android\AndroidManifest.xml" during config install

Is that something I need to set manually? I couldn't find anything mentioned in the readme.

NFC Reader does not work in kiosk mode

The plugin works fine, but in my application I use the NFC reader, but when Kiosk mode is active not get anything to the application.
Is there a way to solve this problem?

KioskPlugin not loaded (Ionic)

back button and other button is working properly. If I click on middle (Home button) it goes to default launcher. Home button is not locked.

brick mode

Hello,

I've set up kiosk mode. All fine.
I added a button so the user can leave the app and go somewhere else.
It works just fine, but it goes to a page that says: Click any button to begin...

So, i wanted to leave the app, not to go to another screen that brings me back to the app again.

How can I overwrite this?

Thanks in advance.

Every change orientation load my app from start

I check before I add the plugin,and it work good. But after adding the plugin,every orientation change its reload. Sometimes show white page with:"press to continue.. " and then load.

The plugin very good but I need the app in portrait and landscape too.
Thanks,
Reut

Exit kiosk Mode possible with home on Huawei P10 Androdi 7.01

hi,

I tried your plugin, but It didn't work. I tried your demo app, added the platform and the plugin, compiled it. I can leave the window to the default launcher although wenn the kiosk mode is on. "in kiosk"

I tried to activate the Start-App feature in the Settings of the App, but when I open the Start-App, I can choose a lot of things, App-links, special things... where is my fault?

Nav Bar remains stuck after inputting text

edit: this was for using the <preference name="Fullscreen" value="true" /> tag to get fullscreen, this is not issue with kiosk plugin but with fullscreen

When I click on a <input type="text"> field the android keyboard and Nav Bar pop up to enter text. When I exit the keyboard, the Nav Bar remains stuck at the bottom and covers up the bottom of the app. Clicking 'back' button or 'home' button does nothing, but clicking the 'recent apps' button hides the Nav Bar like it should be. Correct function should be Nav Bar is hidden after closing keyboard.

Orientation override

After installing the plugin and have selected it as the default launcher, there is an override of orientation preference.
Having it set as "landscape" in my config.xml, this is overwritten and is no longer valid.

Is there a way to avoid this?

Thanks

Exit from kiosk mode in app

Hello.

Thanks for a wonderful app. But I can't get out of kiosk mode of the application. Use command KioskPlugin.exitKiosk(); onclick button. But I'm still in kiosk mode

can exit kiosk without KioskPlugin.exitKiosk();

Hi @honza889
I am facing the problem that I can exit kiosk mode just by clicking this button multiple times :
image

Is there any solution to make the only way to exit kiosk mode is by calling KioskPlugin.exitKiosk()?

Thanks

Feature "allowedPackages"

I need help to implement an "allowedPackages" feature like "allowedKeys".
So you can enable other packages (e.g. "com.android.chrome") to open from Kiosk App.

KioskPlugin.setAllowedPackages(["com.android.chrome", "com.google.android.youtube" ]);

Is it possible to implement this in the "onWindowFocusChanged" handler in the file "KioskActivity.java"?

Thanks!

Update android app vesrion in kiosk mode

I wanted to ask if it is possible that I can update my app's version while it is a launcher (the only app running on the mobile, ink iosk mode). How can I do such thing>
Sorry I/m new to this concept and asked about from my supervisor

top statusbar height customizable

Hello, I have a problem since using it in ionic, the upper nav bar with menu control (open menu, go back) is not clickable on my resolution (is a 24" screen for a kiosk)

I suppose this insensitivity is to prevent that upper statusbar to open, but in this case the status bar is smaller than the insensitive area, maybe because of the screen resolution.

So can you add a method like KioskPlugin.setStatubarInsensitiveHeight(integer) that allows me to set at runtime the value of insensitive height for fine regulations?

Thanks

Hide navigationbar

I have successfully used the plugin to set the app as Launcher.

My next problem is, that is my device (Lenovo Tab 3) got a "quick access" button. This allows the user to bypass the launcher and launch some of the other builtin apps like Music or Mail.

Furthermore it seems that I can still access the statusbar by pulling it down.

I tried to use the fullscreen plugin, but this still allows access by pulling from top or bottom of screen. Then navigationbar and statusbar will open.

How do I make sure that this does not happen?

screenshot_20170929-025049

Installing via ionic1

I have been trying for hours to use your plugin. but to no avail.

It installs successfully, and seems like everything is fine, but when I try to use the KioskPlugin.exitKiosk() function, I get the response that KioskPlugin is not defined.

I also searched for it in window, plugins, ionic & cordova.plugins but it is nowhere to be seen.

Also, I tried installing a different launcher and now when I press the home button I have two options, but not three.

Any ideas?

System UI Tuner

If you remove the System UI Tuner function, the settings menu opens

Enable or Disable Kioskmode at Appstart (flagdepending)

Hey honza,

Thank you very much for the plugin, I was wondering if it is possible to make the Kiosk mode settings depending, so that when the App starts a Flag decides if the kiosk mode is enabled or disabled. A szenario would be that the Admin can toggle Kiosk mode in the App settings which will be saved in the local Storage so when it is disabled the next time the App starts it wont be in kiosk mode anymore?

I dont have much java knowledge, but I think If I add a function to the kiosk.js and add an action to the java execute function this could work ?

Regards
Christopher

Multiple instance creation

Hi.
Your plugin is awesome. I have one problem with the kiosk plugin. Whenever I clicks the home button, it creates a new instance in android. What happens is, for each instance the application is running the process simultaneously. So the application is running same background for more than one time.

Can you please fix it ASAP?

Prompt to click to begin

Hi,

Android boots up on this kiosk app which is wonderful.

Only issue is it prompts me to tap before it loads on startup.
Since a kiosk should boot up by its own every morning, that's kind of a problem.

Here is a video showing the problem https://www.youtube.com/watch?v=RocIgTV_ttw

App is the demo one, with zero modifications. Build done on OS X 10.11.4 with cordova 6.0.0
Tablet is from a chinese vendor, running a stock Android 4.2.2 (kernel 3.0.50).

Remi

Cannot build for target < android-23

If you set target=android-19 (for example) in platforms/android/project.properties you get these errors

...\cordova\platforms\android\app\src\main\java\jk\cordova\plugin\kiosk\StatusBarOverlay.java:59: error: cannot find symbol
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // added in API level 23
                                                        ^
  symbol:   variable M
  location: class VERSION_CODES
...\cordova\platforms\android\app\src\main\java\jk\cordova\plugin\kiosk\StatusBarOverlay.java:60: error: cannot find symbol
            if (! Settings.canDrawOverlays(activity)) {
                          ^
  symbol:   method canDrawOverlays(Activity)
  location: class Settings
...\cordova\platforms\android\app\src\main\java\jk\cordova\plugin\kiosk\StatusBarOverlay.java:61: error: cannot find symbol
                Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                                                   ^
  symbol:   variable ACTION_MANAGE_OVERLAY_PERMISSION
  location: class Settings

Even if change Build.VERSION_CODES.M to 23 other errors still remain

App crash when tried to hit back button

Hi, Plugin is work fine but there is flaw in it. Sometimes it crash when we use back button or any button. Back button not blocked on some device as well. App crash allow user to open other apps in the device.

It there any fix for this issue?

Stopped working because of overlay permission

Workaround: use version v2.0: https://github.com/hkalina/cordova-plugin-kiosk/tree/v2.0

05-08 09:48:32.831 E/AndroidRuntime( 1848): java.lang.RuntimeException: Unable to start activity ComponentInfo{jk.cordova.kioskdemo/jk.cordova.plugin.kiosk.KioskActivity}: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@9510cbb -- permission denied for this window type

05-08 09:48:32.831 E/AndroidRuntime( 1848): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)

05-08 09:48:32.831 E/AndroidRuntime( 1848): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)

05-08 09:48:32.831 E/AndroidRuntime( 1848): at android.app.ActivityThread.-wrap11(ActivityThread.java)

05-08 09:48:32.831 E/AndroidRuntime( 1848): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)

05-08 09:48:32.831 E/AndroidRuntime( 1848): at android.os.Handler.dispatchMessage(Handler.java:102)

05-08 09:48:32.831 E/AndroidRuntime( 1848): at android.os.Looper.loop(Looper.java:148)

05-08 09:48:32.831 E/AndroidRuntime( 1848): at android.app.ActivityThread.main(ActivityThread.java:5417)

05-08 09:48:32.831 E/AndroidRuntime( 1848): at java.lang.reflect.Method.invoke(Native Method)

05-08 09:48:32.831 E/AndroidRuntime( 1848): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)

05-08 09:48:32.831 E/AndroidRuntime( 1848): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

05-08 09:48:32.831 E/AndroidRuntime( 1848): Caused by: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@9510cbb -- permission denied for this window type

05-08 09:48:32.831 E/AndroidRuntime( 1848): at android.view.ViewRootImpl.setView(ViewRootImpl.java:591)

05-08 09:48:32.831 E/AndroidRuntime( 1848): at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:310)

05-08 09:48:32.831 E/AndroidRuntime( 1848): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)

05-08 09:48:32.831 E/AndroidRuntime( 1848): at jk.cordova.plugin.kiosk.StatusBarOverlay.create(StatusBarOverlay.java:46)

05-08 09:48:32.831 E/AndroidRuntime( 1848): at jk.cordova.plugin.kiosk.KioskActivity.onCreate(KioskActivity.java:68)

05-08 09:48:32.831 E/AndroidRuntime( 1848): at android.app.Activity.performCreate(Activity.java:6237)

05-08 09:48:32.831 E/AndroidRuntime( 1848): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)

05-08 09:48:32.831 E/AndroidRuntime( 1848): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)

05-08 09:48:32.831 E/AndroidRuntime( 1848): ... 9 more

KioskPlugin.exitKiosk() does not seem to work

This issue is occurring using Genymotion v2.12.0 Android emulator with S7 Android 6.0.0 API 23 image.

The app has a button, 'Exit Kiosk Mode' when it is clicked I can see the KioskPlugin.exitKiosk(); firing but still cannot switch app or access settings to change default launcher.

If the command KioskPlugin.exitKiosk(); is run directly in the console it returns undefined.

Any suggestions?

Thanks.

still see status bar

Even in kiosk mode,i can see my status bar (android 4.4.4)
from here,i can go to settings and uninstall the apk..

How to remove it ?

open application in kiosk

Hi,
When I start the application for the first time it doesn't open in kiosk mode.
I need to execute KioskPlugin.exitKiosk(); then select the application to run it as kisok.

Any ideas what might be the issue?

Can't exit permanently

Hi.

First: thanks for building the plugin, it is very useful.

I am compiling the demo (unchanged) using Phonegap Build. I add <plugin name="cordova-plugin-kiosk" spec="https://github.com/honza889/cordova-plugin-kiosk.git" source="git" /> in the config.xml.

Everything is working well, except the KioskPlugin.exitKiosk() part. It show the "Select destination.." popup, when I tap another launcher, it switch to that launcher, BUT when I tap the android home button, it show the kiosk plugin demo again instead of the launcher that I just select.

Is there any solution for this?

Thanks a lot for your help. I really appreciate it...

launcher

On Restart, Select A home App dialog opens

I restarted the device to see what would happen, And apparently when the device boots up, it lets you choose which launcher you want to use again.

Now I know that it is impossible to turn off the device, because it is locked in the launcher, But I am afraid that the battery will die (maybe even on purpose), and then on a recharge, the tablet is open to all, they can even uninstall my app...

Could it have to do with the fact that in order to turn off the device I used the KioskPlugin.exitKiosk() function?

I don't think it should make a difference since before restart, if I click the home button again it goes strait back in to the app.

Your help please?

Disable auto kiosk mode

@honza889
Thanks again for a great app!

We want to include your plugin in a production app but want to enable kiosk mode manually (so admins enter password) rather than at startup for some devices.

If you can guide me, we can work on it and maybe do a PR. It would be very appreciated as it is very technical and requires experience in the different intents.

Thanks!

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.