GithubHelp home page GithubHelp logo

panicinitiative / panicbutton Goto Github PK

View Code? Open in Web Editor NEW
196.0 27.0 99.0 8.01 MB

Panic Button turns your mobile phone into a secret alarm for when you're in trouble

Home Page: https://panicbutton.io

License: GNU General Public License v3.0

Gherkin 3.66% Ruby 1.11% Python 0.85% Java 94.37%

panicbutton's Introduction

Master Build Status Dev Build Status Stories in Ready

Panic Button

Panic Button turns your mobile phone into a secret alarm for when you're in trouble

How does Panic Button work?

TAKE TIME

TAKE TIME to set-up Panic Button somewhere safe and quiet

TAKE TIME

Create a plan with your contacts so that they are PREPARED to ACT

TAKE TIME

CHECK you are ready and that your mobile phone has credit and battery

TAKE TIME

ACTIVATE Panic Button in an emergency by rapidly pressing the phone's power button

TAKE TIME

Your network will receive an SMS and regular updates of your location helping them to ACT FAST

The Organisations behind PANIC BUTTON

The Panic Button project is an initiative of Amnesty International in collaboration with key advisors and partners including Frontline Defenders, iilab and the engine room.

Panic Button also belongs to a wider community of advisors and friends. Special thanks go to the network of human rights activists from more than ten countries who have worked with us over the months to collaboratively design the app and have given many hours feeding back on the usability and functionality of the app.

A huge thanks is also owed to the many programmers and designers who have donated their time and skills to develop the app over the past two years. We are especially grateful to the OpenIDEO community for kick-starting the project and to ThoughtWorks who generously helped to develop the first working prototype of the app.

Technology

Requirements

You need an Android phone with a minimum version of 2.3.3

Building

See the notes to build your own APK

Contributing

See the issues tagged with "Help Wanted".

See the notes to setup a development environment Outdated. Migration to Android Studio/Gradle in progress see #76.

Code contributions should be sent via github from feature branches (named feature/descriptive_name_of_feature) as pull requests as explained here.

panicbutton's People

Contributors

akwizgran avatar ckarthik17 avatar ivbar avatar jeyakar avatar jmatsushita avatar khobaib avatar laurapaterson avatar mohsinraza avatar mshobana1990 avatar nsriram avatar rajivra avatar sohjsolwin avatar sragu avatar waffle-iron 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

panicbutton's Issues

Issue Report

SUMMARY

On which screen were you BEFORE the problem occured?
...
Which ACTION did you do that led to the problem?
...
What PROBLEM happened?
...
What did you EXPECT instead?
...

TECHNICAL DETAILS

Panic Button version: ...
Android version: ...
Device brand and model: ...
Any other useful information depending on context (GPS availability, Mobile provider,…)
...

crash when adding a contact

I'm running PanicButton 1.3.0 from Google Play on a Samsung Note 2 running CyanogenMod 10.1 (Android 4.2). When I click on the contact button next to the field to add a contact number, PanicButton crashes. This seems to happen for all contacts.

I have submitted the crash to Google Play, and here is it from logcat:

      BluetoothAdapter  D  1103767408: getState() :  mService = null. Returning STATE_OFF
              dalvikvm  D  GC_EXPLICIT freed 430K, 5% free 23170K/24232K, paused 12ms+8ms, total 71ms
                Finsky  D  [1] DetailsDataBasedFragment.rebindViews: Page [class=DetailsFragment] loaded in [529787 ms] (hasDetailsDataLoaded? false)
                        D  [1] FastHtmlParser.fromHtml: Doing slow HTML parse due to unexpected tag <a href="h
                        D  [1] DetailsDataBasedFragment.rebindViews: Page [class=DetailsFragment] loaded in [529893 ms] (hasDetailsDataLoaded? true)
              dalvikvm  D  GC_CONCURRENT freed 2660K, 17% free 14693K/17532K, paused 2ms+5ms, total 32ms
                        D  WAIT_FOR_CONCURRENT_GC blocked 24ms
                 >>>>>  E  no update needed
          >>>>>>>>>>>>  E  starting next activity
                >>>>>>  E  first run FALSE, running CalculatorActivity
                 >>>>>  E  Registering Restart Install receiver
                        E  Registering Restart Install receiver
                        E  Registering finish activity in oncreate -> BaseFragmentActivity
 MainActivity.onCreate  E  pageId = home-ready
                 >>>>>  E  SimpleFragment.onCreateView
                        E  SimpleFragment.onActivityCreated
            TagHandler  D  Found an unsupported tag html
                        D  Found an unsupported tag body
                        D  Found an unsupported tag html
                        D  Found an unsupported tag body
SimpleFragment.onStart  E  home-ready
  MainActivity.onStart  E  .
 MainActivity.onResume  E  pageId = home-ready and flagRiseFromPause = false
impleFragment.onResume  E  home-ready
SimpleFragment.onPause  E  home-ready
  MainActivity.onPause  E  .
                        E  flagRiseFromPause = true
                 >>>>>  E  Registering finish activity in oncreate -> BaseFragmentActivity
 MainActivity.onCreate  E  pageId = settings
                 >>>>>  E  SimpleFragment.onCreateView
                        E  SimpleFragment.onActivityCreated
SimpleFragment.onStart  E  settings
  MainActivity.onStart  E  .
 MainActivity.onResume  E  pageId = settings and flagRiseFromPause = false
impleFragment.onResume  E  settings
 SimpleFragment.onStop  E  home-ready
   MainActivity.onStop  E  .
SimpleFragment.onPause  E  settings
  MainActivity.onPause  E  .
                        E  flagRiseFromPause = true
                 >>>>>  E  Registering finish activity in oncreate -> BaseFragmentActivity
 MainActivity.onCreate  E  pageId = settings-contacts
                ??????  E  text changed
                        E  text changed
                        E  text changed
            TagHandler  D  Found an unsupported tag html
                        D  Found an unsupported tag body
                        D  Found an unsupported tag html
                        D  Found an unsupported tag body
  MainActivity.onStart  E  .
 MainActivity.onResume  E  pageId = settings-contacts and flagRiseFromPause = false
 SimpleFragment.onStop  E  settings
   MainActivity.onStop  E  .
  MainActivity.onPause  E  .
                        E  flagRiseFromPause = true
ContactsIntentResolver  I  Called with action: android.intent.action.GET_CONTENT
   MainActivity.onStop  E  .
      ContactsProvider  D  Contacts query from application with privacy guard! pid=21860
        AndroidRuntime  D  Shutting down VM
              dalvikvm  W  threadid=1: thread exiting with uncaught exception (group=0x41876930)
        AndroidRuntime  E  FATAL EXCEPTION: main
                        E  java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=196708, result=-1, data=Intent { dat=content://com.android.contacts/data/523647 flg=0x1 }} to act
                           ivity {org.iilab.pb/org.iilab.pb.MainActivity}: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
                        E      at android.app.ActivityThread.deliverResults(ActivityThread.java:3447)
                        E      at android.app.ActivityThread.handleSendResult(ActivityThread.java:3490)
                        E      at android.app.ActivityThread.access$1100(ActivityThread.java:153)
                        E      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1295)
                        E      at android.os.Handler.dispatchMessage(Handler.java:99)
                        E      at android.os.Looper.loop(Looper.java:137)
                        E      at android.app.ActivityThread.main(ActivityThread.java:5227)
                        E      at java.lang.reflect.Method.invokeNative(Native Method)
                        E      at java.lang.reflect.Method.invoke(Method.java:511)
                        E      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
                        E      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
                        E      at dalvik.system.NativeStart.main(Native Method)
                        E  Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
                        E      at android.database.AbstractCursor.checkPosition(AbstractCursor.java:424)
                        E      at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
                        E      at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
                        E      at android.database.CursorWrapper.getString(CursorWrapper.java:114)
                        E      at org.iilab.pb.common.ContactPickerFragment.getPhoneNumber(ContactPickerFragment.java:86)
                        E      at org.iilab.pb.common.ContactPickerFragment.onActivityResult(ContactPickerFragment.java:78)
                        E      at android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:161)
                        E      at android.app.Activity.dispatchActivityResult(Activity.java:5293)
                        E      at android.app.ActivityThread.deliverResults(ActivityThread.java:3443)
                        E      ... 11 more

Clarify alert message and location message

Currently the application sends the customised alert message even when no location is found. It seems unnecessary to repeat the alert message after the first alert, and it is useful to continue sending alert messages with the expected interval, even the GPS coordinate cannot be found.

Training/Practice Reminders

Simulation (2/3 days after installation).

  • Training/Tutorial if you can make the app do what you want it to do. Maybe:
    • Alerting the user (allow to snooze)
    • Running the Wizard again.

Drill (every quarter or so).

  • Alerting the user (allow to snooze)
  • Actually triggering the alert to also test the "human" side with your trusted contacts.
  • Could be Quarterly but become weekly if the user doesn't do well (like answering in more than 30 secs).

Notes

  • Obfuscate the alert: Setup a common name and use that as text for a reminder to do a training refresher. "Anna: Hey, do you mind if I come to see you, I'm in a bit of a Panic :)"
  • First three reminders are about testing the app activation.
  • Congratulations you remember how to activate it. (Should be already done).
  • Can you go to the settings screen.
  • Are you using the checklist. Are the contacts the right ones.

Ideas for facades

Hi Nonie,

Can you please post any sketches or ideas you have for your facade designs that you have been working on.

Also please give us some ideas on how the user will activate Panic Button from these new designs, and any other thinking you have.

Thanks.

Bernard

Black Screen when scrolling on the Checklist

Submitter: Alice

SUMMARY

On which screen were you BEFORE the problem occured?
…Checklist (Lista de verificacion - was using in Spanish)
Which ACTION did you do that led to the problem?
…scrolled up and down the screen to read what's at the bottom
What PROBLEM happened?
…the items in the checklist were covered by a black screen
What did you EXPECT instead?
…to be able to scroll up and down screen.

TECHNICAL DETAILS

Panic Button version: …1.2.6
Android version: …2.3.3
Device brand and model: …Samsung GT-I9100
Any other useful information depending on context (GPS availability, Mobile provider,…)
...

App Shortcut can sometimes disappear

After restarting the installation wizard, it is possible that the application shortcut disappears from the Applications menu. The only workaround currently is to Uninstall the application from the Settings > Apps menu

Help is in German

Affects the new upcoming 1.4.0 release. Even when the language settings are in English the Help is in German. When the language is set to French or Spanish, the help is in English. When the language is set to German, the help says it's not implemented.

Sent to wrong Launcher after sending alert

After sending out an alert message the phone shows what appears to be the 'default' launcher instead of the Nova Launcher I normally use. Hitting the home button repeatedly in the 'wrong' Launcher eventually returns the Nova Launcher screen. A colleague using a Samsung SIII experienced the same problem (not sure if he was using Nova Launcher, but he ended up with a different Launcher than he normally sees too).

Could it be that after the app is triggered and sent out the alarm it opens the default Launcher instead of the one currently active?

Feature 78: Please create an updated apk file with guardian feature code.

This is our first public feature story on Github! Thanks for being the first person Nonie :)

The code for this feature was written during a development weekend a few months ago by some developers who are still involved. Hopefully they'll get subscribe and get involved on Github too.

Nonie, the first thing we need is to get an APK file created with this feature. I don't think there is any real UI developed yet, so that is something I need to do.

When it is created let me know and we can then QA it.

Any questions, please let me know!

Bernard

So we have as much documentation available on Github, here is the feature request story from Mingle:


#78 Guardian feature
Story title
Guardian feature for users to routinely check-in to indicate they are no in danger

Story Description
As a user I must have a way of indicating to the application that I am not in danger so that emergency messages are not sent by accident.

Acceptance Criteria

  • I open the application
  • I enter my PIN code
  • I go to the settings screen and choose guardian feature setup
  • I set up start date/time for the period the guardian feature is to be active
  • I set up end date/time for the period the guardian feature is to be active
  • I then setup the check-in time I need to respond to.
  • I then save the setting and go back to the calculator screen.

Once set-up a pop-up message appears on my screen every X minutes configured and requires me to respond.

If I do not respond in time, the application will send an emergency message.


Explain better how the alerting works

@Tanoca @sragu @nsriram @rajivra @jeyakar please comment!

Problem

Currently, users are often surprised that when the alert is triggered Panic Button will keep sending alerts every 5 minutes. In addition, when they realise this, they often don't know how to turn the alert off.

Possible solutions

Proposed Play store text edit:

Explain this feature in the Playstore description. Possibly using some "ascii art" to attract the user's attention (there might be other ways to improve the formatting in playstore descriptions. Additions below in italic.


Panic Button is a free and beta application that turns your mobile phone into a secret alarm for when you're in trouble. When triggered, it will sends alerts every 5 minutes with your location. Anyone in the world who is concerned about facing risk because of their human rights work can use the Panic Button alert application on their Android phone.

!> Panic Button sends alerts automatically every 5 minutes <!

Once Panic Button is triggered, it will send alerts every 5 minutes to your contacts to keep them informed about your location.

!> Panic Button alerts can only be deactivated with a Pin code <!

To prevent deactivation by someone else, you will need to enter your chosen pin code to deactivate the automatic sending of the alert every 5 minutes.

Panic Button can only facilitate emergency assistance when a user's contacts are in a position to act. The disguise delays the discovery of the application for as long as possible so that the app can send location updates to their chosen contacts. However, this does not prevent a competent adversary from accessing the content or recipient of the message through the network operator. Users are encouraged to visit our help pages to understand more about the general security risks of using their mobile phone.

... follows the rest of the text


Clarify in the app's installation wizard

This could be done in a few places:

  • Once in the first screen on installation:

Panic Button is an Android app that secretly alerts your contacts when you are in trouble. When triggered, it will sends alerts every 5 minutes with your location. The app stays hidden on your phone by looking like a simple calculator.


  • Once in Setup contacts screen:

These people will receive the alert every 5 minutes if you activate it_.


  • Once in the Create a pincode screen:

This pincode is needed to stop the app from sending the alert automatically and to access the app settings. It is not needed to alert contacts in an emergency.


  • In the Well Done! screens (for both the power button and calculator trigger).

Your test was successful! In an actual emergency, your alerts will have started to be automatically sent every 5 minutes_.


  • In the Setup Disguise screen.

Panic button stays hidden on your phone by looking like a simple calculator. From now on, you will see the calculator disguise whenever you open the app. You will need to learn how to unlock the disguise to stop the automatic sending of the alert every 5 minutes. Learn how it works.


sending alert message wakes up screen

On a Samsung Note 2 running CyanogenMod 10.1 (Android 4.2), the screen turns on each time the alert message is sent out. This just shows the lock screen, and is not especially obvious that a panic button is causing that, but it will drain the battery faster.

trigering vibrations too loud

when triggering the app to send signals vibration is too loud and may attract the attention. would be great to have a way of setting how many times and how long the vibration will be.

if location is disabled, enable after panic is triggered

If the user has location services turned off, then triggering the panic should enable it so that the location can be sent. I suppose this should be an opt-in feature and perhaps on the same screen as the similar feature for enabling the cell service (#53)

Issue Report

Submitter: Tester
On which screen were you BEFORE the problem occured?
Which ACTION did you do that led to the problem?
What PROBLEM happened?
What did you EXPECT instead?

Technical details:

Panic Button version:
Android version:
Device brand and model:
Any other useful information depending on context (GPS availability, Mobile provider,…)

Integrate with Encrypted SMS solution

I would be completely unsurprised to learn that this is impossible, but...if it is possible, it might be interesting to support the use of a default, user-configured (non-standard) "messaging" app. Advantages: TextSecure message encryption, message authentication and local data encryption. Disadvantages: if local data has not been decrypted with the app password, sending through the app will probably fail.

pin field does not automatically have focus

Here is a little usability nitpick: when you long-press to get to the pin screen, the pin code text field does not have focus. That means I have to click on the text field before I can entire my pin code. Since that screen does nothing else. the textfield should have focus. I think its something you can set in the XML for that layout. something like <requestFocus/>.

ability to switch on the phone's GSM interface

it would be good to have an option, that if panic button is initialized it switch on the phone's GSM and starts sending the messages. in this scenario given person could walk with switched off phone or in flight mode (in this way avoiding being tracked) and could still initiate the panic button.

Power button trigger fails after crash (though app setup displays "Ready")

Key press Power Key press after crash Power after crash
Setup test works works N/A N/A
App open works works works fails
App not open N/A works N/A fails
Device off N/A works N/A fails

After a crash, the app relaunches itself, enters setup, and states that it is "Ready." However, the power button trigger does not work until the "Disguise" button (and the subsequent "Disguise Now" button) are pressed. In this state, the app should display "Not Ready" (or some such).

Steps to reproduce:

  1. Enter setup
  2. Click "Disguise"
  3. Click "security tips..." to crash the app
  4. Note the "Ready" status
  5. (optional: exit the app by clicking Home, Back, Power, etc.)
  6. (optional: relaunch the "Calculate!" app)
  7. Rapidly click the power button

Force change of default alert message.

Prevent to go to the next step in the installation wizard if the default alert message is not changed.

Implementation notes

The relevant code is https://github.com/iilab/PanicButton/blob/master/src/main/java/org/iilab/pb/fragment/SetupMessageFragment.java and default message https://github.com/iilab/PanicButton/blob/master/res/values-en/strings.xml#L23

Note that with the current system to manage the user flow in the installation wizard:

The reason for this is that the content (titles, text and so on) used to be updated through an API (independently of static resources in the APK) but this mechanism has been deprecated to reduce the attack surface. However the system of generation of the json asset file, in multiple lanugages, has been kept in order to allow non-technical users to update this content and translate it.

Include a "security tip" or Help/FAQ note related to message exposure?

Mention the visibility of sent alerts in Help > Using Panic Button > Creating your alert message. (Or in the FAQ?) Perhaps also mention the possibility of message surveillance? (In which case, also acknowledge that such exposure will frequently be a small price to pay for the ability to alert one's network in an emergency.)

Some phone require double press to confirm.

For the Cherry Gem with Android 4.2.2 the power button needs to be pressed twice to register as "one press". This means that it has to be pressed about 10 times to trigger the alarm, and twice to confirm.

Problem going through disguise with Cherry Gem on Android v4.2.2

With the upcoming 1.4.0 release I was able to go through the training screen (which used to not be the case on 1.3.1 alpha) but however when trying to go through the disguise after activating the alarm I got the same problem I used to have with the training screen, i.e. when long pressing a calculator button, the button looses focus after 3 seconds and displays the number preventing to do the required 5 second long press to get to the pin entry.

Sent a wrong alert

The app sent an alert, but I didn't want to. And I found no button to stop this.

Remove Content API

Reduce the attack surface and prevent leaking of information about Panic Button usage for possible eavesdroppers on the wire.

Limit size of SMS to fit into a single message

Feedback received via email:

As you're repeating the location message every 5 minutes: to limit costs for some subscriber plans, it might be nice if the SMS size does not exceed 160 characters, to fit into a single message?

1- It seems that the character count on https://panicbutton.io/help/help-using.html#help_using_configuration_alert_messages does not take the ACTUAL resulting Google Maps URL into account. Maybe use a longer placeholder instead of " http://maps.google.com/GPS-location" Or make the counter use more characters for that placeholder. (As an aside: the counter in that image doesn't seem to take newlines into account either, and is one off.)

2- Maybe the Google Maps URLs can be shortened, like to http://p.panicbutton.io/-900000,-1800000 (That also allows you to change the URL if Google changes something, without the need to release a new app. But maybe blocking your domain might be easier than blocking Google's? I guess you'll have to ensure the latitude and longitude values are always human readable.)

Some background:

An (old?) demo photo showed me something like:

 http://maps.google.com/maps?q=(-1.2865,36.8068)+to:(-1.2865,36.8086) 

...which does not work for me. Removing the last part,

 http://maps.google.com/maps?q=(-1.2865,36.8068) 

...works fine, but with 47 characters (plus at most 3 additional characters for other locations) that is still longer than the 35 characters of:

http://maps.google.com/GPS-location  

Using your own domain, like:

 http://p.panicbutton.io/-900000,-1800000

...would still need at least 40 characters (or 41 when using HTTPS, plus 2 more when using proper decimal dots). That only saves 10 characters at best then. I guess it's most important to get the counter to show the pessimistic total count.

Bypassing the app (Android 4.4.2)

Hi,
I'm not sure if it's the way you meant to develop as "Exit" in the app, but since you didn't mention how to exit it in the documentation, here's what i think it might be a way, or a bug.

After disguising, when i click and hold "Menu" button, Google Now' search pops up, if i click then "Back" button, i'll be redirected to the main home screen.

Tested on "Samsung Galaxy Mega 6.3 i9200 (KNOX Rom, Android v4.4.2)

screenshot_2014-06-27-13-16-21

Send message about authorized stopping of the alert.

Maybe when the user manually stops the alert (after unlocking the disguise) we should send a last SMS saying: "The alert has been stopped by an authorized user". This would allow to differentiate from when the alert stops because of a problem, because the phone is turned off, or ran out of battery.

message sent with not updated GPS coordinates

on some phones i have tested (like Samsung Galaxy Nexus) , the app after triggering sends first message with the GPS coordinates that is not accurate. coordinates are from last time GPS syncs with satellite signal. it is a matter of the phone and i am not sure anything can be done about this...

Issue Report

On which screen were you BEFORE the problem occured?
Which ACTION did you do that led to the problem?
What PROBLEM happened?
What did you EXPECT instead?

Technical details:

Panic Button version:
Android version:
Device brand and model:
Any other useful information depending on context (GPS availability, Mobile provider,…)

On Android 4.4 the messages are stored in Sent Items

It seems that android 4.4 is behaving differently and we need to look into it. see below from http://developer.android.com/reference/android/telephony/SmsManager.html#STATUS_ON_ICC_SENT

Note: Beginning with Android 4.4 (API level 19), if and only if an app is not selected as the default SMS app, the system automatically writes messages sent using this method to the SMS Provider (the default SMS app is always responsible for writing its sent messages to the SMS Provider). For information about how to behave as the default SMS app, see Telephony.

Issue Report

SUMMARY

On which screen were you BEFORE the problem occured?
...
Which ACTION did you do that led to the problem?
...
What PROBLEM happened?
...
What did you EXPECT instead?
...

TECHNICAL DETAILS

Panic Button version: ...
Android version: ...
Device brand and model: ...
Any other useful information depending on context (GPS availability, Mobile provider,…)
...

Restart location finding steps if device turned off and on while alerting

Hi,

The last know location (from before being turned off) is sent when a device is turned back on after being turned off. This is misleading as the device could be in a different location.

We should start searching for the location and send "Trying to find location" messages until we acquire a new location.

Jun

Old contacts still alerted

The app sends the alert message to contacts that were deleted previously from the contacts configuration in the app.

Allow multiple facades/disguises to be developped

Change the code architecture to allow the development of different facades/disguised.

Would it be better to have some kind of plugin architecture or development guidelines to fork the app? Possibly users could be allowed to change facades as well instead of having various binaries with various facades.

See #3

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.