Coder Social home page Coder Social logo

basicairdata / gpslogger Goto Github PK

View Code? Open in Web Editor NEW
358.0 358.0 119.0 141.72 MB

A GPS logger for Android mobile devices

Home Page: http://www.basicairdata.eu/projects/android/android-gps-logger/

License: GNU General Public License v3.0

Java 100.00%
accuracy altitude android basicairdata gps gps-logger gpslogger gpx kml logger

gpslogger's People

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

gpslogger's Issues

Create files for Viewing & Sharing in private FilesDir instead of AppData

Actually the Exporter creates the temporary files in /GPSLogger/AppData public folder, but it should create them into the FilesDir private space and pass them to other apps using a URI generated by a FileProvider.
The proper way to share files in Android is well explained here.

Following this way we'll have 2 benefits:

  1. It will be possible to View / Share files without Storage permission;
  2. The /GPSLogger folder will contain only the exported files: no more /AppData subdirectory!

Review the behavior of some menu items when storage access permission is denied

On Android 6+ the users can grant / denied run-time the permission to access to phone storage.
If that permission is denied, the app cannot Export, Share and View tracks from tracklist.
It is necessary to find a "good" way to disable the menu items of the contextual tracklist menu.

We have different ways to proceed. We could, for example:

  • Remove them, leaving only the remaining "Delete" menu item;
  • Keep visible but disabled the relative menu items;
  • Activate all the menu items but, when the user clicks on them, the app could show a toast that see something like "To enable this feature you have to grant blah blah blah..." or "Unable to write into storage".

The first two are confusing, because some users may report something like: "I cannot export / share my tracks"; The third may be confusing ("Unable? Why?") or annoying, because "I have already denied the permission";

Personally I tend to the "conscious user" approach.

Ideas?

Add a first run setup asking to download the EGM grid

The app needs a first run screen (to download the EGM file).
Something like the following:

In order to use the right altitude above the sea level, we suggest to download the EGM96 grid file.
You can also download it later, enabling the EGM Automatic Altitude Correction on settings.
[ Download it ] [ No, thanks ]

Download it: The app downloads the EGM grid (showing the progress dialog like on settings) and enables EGM correction when the download is finished;
No, thanks: The app enables the "projected on the ground" option for displaying altitude in Google Earth.

In fact some Google Play users reported "the track is not visible in Google Earth" because they tried the app without EGM grid and using the "Absolute" altitude mode (ie. out of the box).

The app must show a first run setup in order to adjust that.
The first run setup has to run after the real time permissions check (and requests) for Android 6+, because it needs to have internet access and to write the EGM file into the SD.

Feature Requests: Add comments/Name field

Hi,

What I really miss, is a possibility to

  • edit the name of a track
  • add tags and/or comments to a track

so I could find them more easy later on.

Thanks for the great and handy tool, anyway!!

BR
Nico

Add the possibility to choose the version of the GPX standard

Many programs are only compatible with the version 1.0 of the standard GPX;
But other programs are only compatible with the version 1.1 (like Garmin Connect) of the standard.

It should be nice to add a setting to choose which GPX standard use for exportation.
Something like:

Version of GPX standard
v.1.0
v.1.1

View tracks with any installed viewer, also if Google Earth is not installed

A user's feedback on Google Play reports the following issue:

Only AFTER I install 'Google Earth' I am able to VIEW the route also with OTHER installed applications

A little correction has to be made in order to discover if any viewer is available (like Locus Map) and, in case, show the "View" menuitem. The user will be able to choose his preferred viewer.

At the moment (v2.1.4) the "View in Google Earth" menu opens a chooser in case multiple viewers are installed. The problem is that that menu appears ONLY if Google Earth is installed.
That issue forces users to install Google Earth in order to view tracks using their preferred viewer (also NOT G.E.)

Garmin MapSource - Problem on GPX importing

A user's feedback on Google Play reports problems to import GPX files into Garmin MapSource.
The reporting needs to be deepened.
I'm working on it in order to solve the problem in the next app update.

Optimization of eventbus messages

Currently all eventbus messages are strings. Strings are parsed and tokenized by the subscribers in order to re-obtain their data. But the operation with strings have a high computational cost and a long process time.

Messages could be divided in 3 categories:

  • SHORT: short EVENTBUS.MSGTYPE
    EventBus.getDefault().post("APP_RESUME");
    EventBus.getDefault().post("APP_PAUSE");
    EventBus.getDefault().post("NEW_TRACK");
    EventBus.getDefault().post("UPDATE_FIX");
    EventBus.getDefault().post("UPDATE_TRACKLIST");
    EventBus.getDefault().post("UPDATE_SETTINGS");
    EventBus.getDefault().post("REQUEST_ADD_PLACEMARK");
    EventBus.getDefault().post("ADD_PLACEMARK");
    EventBus.getDefault().post("APPLY_SETTINGS");
    EventBus.getDefault().post("UPDATE_TRACK");

  • NORMAL: short EVENTBUS.MSGTYPE + long ID
    EventBus.getDefault().post("DELETE_TRACK " + data.get(ii).getId());
    EventBus.getDefault().post("EXPORT_TRACK " + data.get(i).getId());
    EventBus.getDefault().post("VIEW_TRACK " + data.get(i).getId());
    EventBus.getDefault().post("SHARE_TRACK " + data.get(i).getId());
    EventBus.getDefault().post("TRACK_EXPORTED " + track.getId());
    EventBus.getDefault().post("TRACKLIST_SELECTION " + track.getId());
    EventBus.getDefault().post("INTENT_SEND " + trackid);
    EventBus.getDefault().post("TOAST UNABLE_TO_WRITE_THE_FILE " + track.getId());

  • LONG: short EVENTBUS.MSGTYPE + long ID + long Value
    EventBus.getDefault().post("TRACK_SETPROGRESS " + track.getId() + " " + progress);

Buttons bug

Hi,
I installed the app on a AVD api level 25, but on the Track app I can't see the buttons is that normal ?

Bug Report - NullPointerException on GPSActivity.onCreate:118

Google reports 1 crash at GPSActivity.java:118:

java.lang.RuntimeException:
at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2924)
at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2985)
at android.app.ActivityThread.-wrap14 (ActivityThread.java)
at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1635)
at android.os.Handler.dispatchMessage (Handler.java:102)
at android.os.Looper.loop (Looper.java:154)
at android.app.ActivityThread.main (ActivityThread.java:6692)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1468)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1358)

Caused by: java.lang.NullPointerException:
at eu.basicairdata.graziano.gpslogger.GPSActivity.onCreate (GPSActivity.java:118)
at android.app.Activity.performCreate (Activity.java:6912)
at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1126)
at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2877)

// Check for runtime Permissions (for Android 23+)
118 if (!GPSApplication.getInstance().isPermissionsChecked()) {
119 GPSApplication.getInstance().setPermissionsChecked(true);
120 CheckPermissions();
121 }

Add Satellites Used for FIX

The goal is to add the number of satellites used for the FIX to every LocationExtended.
The code in order to retrieve the number of used satellites is already present (and commented out).
The value must be saved into the DB for every FIX, like for the "in-view satellites" field.
That operation needs a DB upgrade, in order to add the new INTEGER data field.
Old saved locations will have "NOT_AVAILABLE" value.

No needs to show that value into GPS FIX tab: we only want to start saving it and, in the future, export it in <sat> tag of gpx files.

GPS disconnects when I make a call

Hello,

Some time ago I open a new issue #3 with GPS that stops tracking in specific conditions. Now I know what is "specific conditions".

GPS stop tracking when I make a call or answering a call. For example:

I start tracking with GPS Logger.
I use home button to minimize the app.
I make a call.

And now GPS is disconnected and GPS Logger stops the recording.

But when I enable "airplane mode" (sometimes called "offline mode") in my phone GPS Logger works very well.

Thanks for help.
Jacek.

Preload and Keep in memory Tracks Thumbnail

Currently the thumbnail of each tracks is loaded on-the-fly by a tracklist card when needed, causing:

  • the repeated loading/unloading of the same images,
  • an extra disk I/O (that also impacts on DB and exportation performances) and
  • a "far from optimal" scrolling performance.

It would be fine to keep in memory the thumbnail of every track of the tracklist.

I tried including Picasso library with a good result (I left commented out the few lines of code I've added to try it). But the use of Picasso for very little and static images isn't an optimized solution. It would be better to include the thumb Bitmap directly into each Track object, maybe including a synchronous and an asynchronous setter, and a getter (for the cards).

Thus, I think we could implement a way to enable these features:

  1. The app can tell to a track to Async load a thumbnail (on start, or when the thumb is ready);
  2. The tracklist can request a thumbnail, causing a (urgent) synchronous load of the thumb if not yet loaded.

Exporter - DB query, String building, and SD write task in 3 separated threads

In order to speedup the exportation process, should be fine to split the 3 macro tasks of the exporter into 3 separated threads.

Thread 1 = Performs DB queries and populates the lists (a BlockingQueue) of Location items;
Thread 2 = Reads Location items from the list, builds strings for output file(s) and puts them into one list for each file format;
Thread 3 = Reads strings from the string list(s) and write file(s);

I tried to split DB queries from the rest of exportation process a couple of months ago, and I found a noticeable performance improvement. The downside was the memory usage: the exportation was more memory hungry.

Bug Report - java.lang.ArrayIndexOutOfBoundsException at EGM96.getEGMCorrection:118

java.lang.ArrayIndexOutOfBoundsException:
at eu.basicairdata.graziano.gpslogger.EGM96.getEGMCorrection (EGM96.java:118)
at eu.basicairdata.graziano.gpslogger.LocationExtended. (LocationExtended.java:39)
at eu.basicairdata.graziano.gpslogger.GPSApplication.onLocationChanged (GPSApplication.java:732)
at android.location.LocationManager$ListenerTransport._handleMessage (LocationManager.java:281)
at android.location.LocationManager$ListenerTransport.access$000 (LocationManager.java:210)
at android.location.LocationManager$ListenerTransport$1.handleMessage (LocationManager.java:226)
at android.os.Handler.dispatchMessage (Handler.java:111)
at android.os.Looper.loop (Looper.java:194)
at android.app.ActivityThread.main (ActivityThread.java:5637)
at java.lang.reflect.Method.invoke (Native Method)
at java.lang.reflect.Method.invoke (Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:960)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:755)
at de.robv.android.xposed.XposedBridge.main (XposedBridge.java:107)

Translation & Proofreading

Translators and Proofreaders:
Please subscribe to receive the Notifications

We use the Crowdin platform to make, manage and maintain the localizations.
Sign up for free and start to translate GPS Logger!

Here in this issue we inform Translators and Proofreaders when we update the strings in Crowdin.
This is also a good place to discuss about source strings and implementation details.

Inclusion Process

The inclusion of a new Language into GPS Logger will be done in two phases:

  1. Translation - The translation of 100% of the application strings. Anyone can contribute to translate, without any obligation.

  2. Proofreader Research - A proofreader is a reference person that will work (using Crowdin platform) with the developing team in order to optimize and keep the translation updated. We ask proofreaders a modest follow-up effort (few minutes when we update strings file, maximum once every 2-3 months), and a constructive collaboration spirit.

Translations will be integrated into GPS Logger - just before a new release - when they will be 100% completed and handled by one or more proofreaders.
No longer maintained and incomplete localizations will be removed from the app.

The implementation of an unlisted language is welcome!
Just ask, and we will add it.

There is no money behind this open project, only passion, and desire to do something useful.
We have absolutely NO interest to have as many languages as possible. We hope instead of cooperation with people (maybe GPS Logger users) that share our interests and contribute translating and keep updated this software with our same passion.
This is the reason why we will not cooperate with any paid translator or proofreader.

Included Languages

Thanks to translators and proofreaders, GPS Logger now officially includes the following languages:

  • Brazilian Portuguese
  • Chinese (Simplified)
  • English (the source language)
  • French
  • Hungarian
  • German
  • Greek
  • Italian
  • Portuguese
  • Russian
  • Spanish

Choose the system of measurement for TXT exportation

KML and GPX files must be exported using the International System of Units, to follow their standards.
But for TXT files (csv) we are free to change the units of measurement, on condition of specify them on column labels.
It would be fine to add the possibility to users to export the TXT file using their preferred system of measurement.

New Feature: BLE sensor

Hello, is everyone interested in Bluetooth Low Energy support for this app?
So one can bind an heart beat sensor for example and have all the informations (GPS track and heartbeat) in the same file. It could be exported as .tcx file...

Thank you!

Lack of feedback when the exportation aborts because the file is not writable

I'll explain this issue presenting a typical scenario:

A user does a track exportation and he opens the exported file with another app that keeps the file busy (like a text editor for example). Then the user switches back to GPS Logger and launch again the exportation of the same track.

In that case the exporter simply will not write the new file, and does it silently.

We need to abort the exportation process, showing a visual feedback (like a toast) that warns the user about the exportation failure.

Add a folder chooser for track exportation

Some users ask to have the possibility to manage the exporting folder, moving also into the second SD card.
It is necessary to check read/write permissions of the selected folder before switch to the new one.

We must pay attention; different Android versions may have different behavior, so this is not a trivial task.
Some users, in fact, wrote that they need a double pass in order to save exported tracks on your PC via USB.

We must find a good way to do that task before to start implementation.

Implement a smart collecting method

The feature consists in an addition of a "Smart" mode in available Collecting Densities.
The smart mode would try to recognize when the user is going straight, in order to avoid to record a lot of points of a straight line.

This mode aims to reduce the amount of trackpoints recorded in every track.

Separation between data and data visualization in Track and Location objects

There are many good reasons to divide the data string formatting from the numeric data:

  • Removal of the duplication of code between Track and Location objects;
  • We'll have Track and Location objects smaller, using less memory allocation, specially useful when load Location lists during exportation;
  • Separation between data (access to DB) and data visualization (access to app strings);
  • General performances improvements;
  • We'll allow to easily implement the translations of the units of measurement;

The implementation of PhysicalData.java and PhysicalDataFormatter.java is started.
The goal is to add this improvement in the next app update.

Possibility to release on F Droid?

Hello there!

Your app looks interesting, I would sure like to try it! Would it be possible to release it on F-Droid? It will be very helpful if you can.

Maybe a little bug with the aviation and nautics measurement system

Hello,

thank you for this great app without any unnecessary frills!

While browsing through this app (v2.1.7) I think I found a little bug with aviation / nautic measurement system: As unit for distance the nautical mile is implemented. And as units for speed I can choose between kn and mph. But the calculation for mph differes from kn. I think here is a mix of aviation / nautic and imperial system of measurement - for mph the statutory mile is used. In my opinion in aviation / nautics both kn and mph should be the same (based on the nautical mile).

I did not dare to change it because I do not know whether you implemented this intentionally that way.

On the other hand I am not sure if mph is a used unit for speed in aviation / nautics. I think only kn is used.

Kind regards,
Gudrun

Bug Report - java.lang.OutOfMemoryError at AsyncThumbsLoaderThreadClass.run:1193

java.lang.OutOfMemoryError:
at android.graphics.BitmapFactory.nativeDecodeStream (Native Method)
at android.graphics.BitmapFactory.decodeStreamInternal (BitmapFactory.java:632)
at android.graphics.BitmapFactory.decodeStream (BitmapFactory.java:608)
at android.graphics.BitmapFactory.decodeFile (BitmapFactory.java:380)
at android.graphics.BitmapFactory.decodeFile (BitmapFactory.java:406)
at eu.basicairdata.graziano.gpslogger.GPSApplication$AsyncThumbsLoaderThreadClass.run (GPSApplication.java:1193)

Add a full screen view for some fields

It would be fine to add a full screen visualization mode for some GPS FIX and TRACK fields (like speeds, direction, and so on), with the following behavior:

  • Clicking on one of them, the app will show the field at full screen, using a character as big as possible.
  • A back Arrow will be present on the top left corner (in the same position of the back Arrow on Settings), in order to close the big view and return to the normal view mode.

Add the ability to install the app into SD

Some users asked to add the possibility to install/move the app into SD instead of the internal memory of the device, depending on user choice.

The installation into real SD should save a small amount of device space (less than 2 MB), because all the app data must still be saved into the device memory (this is an Android restriction).
Moreover, with the app on SD, when the user enables USB mass storage to share files with a computer or unmounts the SD card via the system settings, the external storage is unmounted from the device and all applications running on the external storage are immediately killed (Thus the app will stops working, and the service will be killed).

Here you can find the Google documentation about the App Install Location.

I'm a little skeptic about the implementation of this feature.
For now I open the issue to take track of this need and, of course, to collect other opinions.

Add the Shutdown item on main menu

A menu item with the explicit "Shutdown" option must be added.
The new menu will close the app the same way as the BACK hardware button does now.
After the introduction of the foreground service many users asked about closing the service and the app: back button is not enough visible and clear.

App won't run in background

I cannot minimize app with Home Button. App must be "on top" to register track.

Please consider add "run in background" option.

Add Track color chooser

A new settings in Exporting section in order to choose the track color for KML.
Could be cool to add extra options like "Color based on speed", "Color based on Altitude", and so on.

It is possible to change also the color of the GPX one?

Bug Report - java.lang.NullPointerException at GPSApplication.updateSats:625

java.lang.NullPointerException:
at android.location.GpsStatus.setStatus (GpsStatus.java:189)
at android.location.GpsStatus.setStatus (GpsStatus.java:209)
at android.location.LocationManager.getGpsStatus (LocationManager.java:2194)
at eu.basicairdata.graziano.gpslogger.GPSApplication.updateSats (GPSApplication.java:625)
at eu.basicairdata.graziano.gpslogger.GPSApplication.onGpsStatusChanged (GPSApplication.java:700)

at android.location.LocationManager$GnssStatusListenerTransport$1.onSatelliteStatusChanged (LocationManager.java:1486)
at android.location.LocationManager$GnssStatusListenerTransport$GnssHandler.handleMessage (LocationManager.java:1434)
at android.os.Handler.dispatchMessage (Handler.java:102)
at android.os.Looper.loop (Looper.java:154)
at android.app.ActivityThread.main (ActivityThread.java:6776)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1496)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1386)

Add a speed threshold (1 m/s) to discriminate movement from still phase

Normally the GPS set the speed to zero when the speed is very low (to remove the random walking during the still phase), but some GPS hardware doesn't filter well the low speeds.
As result the on-movement statistics are wrong, because the threshold speed between movement and still phase is set to zero.
This threshold must be moved to 1 m/s (it seems a good value, used by other GPX visualizers).

Move EGM Binary Geoid Height File into FilesDir

For historical reasons, the EGM Binary Geoid Height File is saved into /GPSLogger/AppData/.

Would be nice to move it into the FilesDir, that is a private folder and is not normally accessed by the user.
The file will be downloaded in the new folder when the user enables the EGM correction for the first time.
In case the file already exists in /GPSLogger/AppData/, we have to copy it into the new folder.

In that way will be possible in the future to clear and remove the "/AppData" subfolder on Shutdown.

Add the GPS Time field to GPS FIX tab

Many users requested the inclusion of this field, in order to be able to synchronize the time of the Camera with the GPS time.

We need a minimum of design phase before start the implementation.

Remove Bearing data on location when Speed is Zero

We found that some GPS sensors returns the bearing (with the value "0") when the speed of the fix is zero.
As result, the GPS FIX tab shows the Direction "N" when the user is still.

We can fix this bad behavior using removeBearing() when Speed = 0.

Add an option to choose a KML or a GPX viewer

Some users complain that they cannot view speed graph of the track on external GPX viewers.
The reason of this behavior is on the "View" command, that sends a KML file to the viewer.
in fact KML files don't contain some useful information (like speeds).
A GPX file contains speeds, times, satellites and other useful information instead.

An option should be added, in order to set the desired viewer type.
Something like this:

View tracks with:

  • KML viewer
  • GPX viewer

Bug Report - java.lang.NullPointerException at GPSApplication.updateSats:647

java.lang.NullPointerException:
at android.location.GpsStatus.setStatus (GpsStatus.java:186)
at android.location.GpsStatus.setStatus (GpsStatus.java:205)
at android.location.LocationManager.getGpsStatus (LocationManager.java:2194)
at eu.basicairdata.graziano.gpslogger.GPSApplication.updateSats (GPSApplication.java:647)
at eu.basicairdata.graziano.gpslogger.GPSApplication.onGpsStatusChanged (GPSApplication.java:721)
at android.location.LocationManager$GnssStatusListenerTransport$1.onSatelliteStatusChanged (LocationManager.java:1486)
at android.location.LocationManager$GnssStatusListenerTransport$GnssHandler.handleMessage (LocationManager.java:1434)
at android.os.Handler.dispatchMessage (Handler.java:102)
at android.os.Looper.loop (Looper.java:154)
at android.app.ActivityThread.main (ActivityThread.java:6123)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:867)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:757)

Add the system of measurement used in aviation and nautics

Some users asked to implement the system of measurement used in aviation and nautics:

  • Distance in Nautical Miles (nmi or NM), where 1 nmi = 1852 m;
  • Speed in Knots (kn or kts), where 1 kn = 1.852 km/h; (one nautical mile (1.852 km) per hour)
  • Altitude in feet (ft).

I specify that the new units are only for visualization purpose; GPX and KML files must be exported in the ISU.

Add an online help

It would be nice to add a little online help, hosted on BasicAirData website and accessible even directly from the application.

We could include:

  • Basic usage
  • Description of the functions
  • Description of the Settings
  • Frequently Asked Questions
  • Useful links

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.