Code Monkey home page Code Monkey logo

storyproducer's Introduction

Story Producer (SP app)

Purpose: to enable end users to orally translate still-picture audio-narrated stories with community help, then dramatize, publish and digitally share new local language videos.

End users and target audience: speakers of (minority) languages, some of whom are bilingual in a major language.

End recipients of videos produced: members of local language communities

Developers:

  • Original vision and design by Robin Rempel, while with SIL
  • Original logo by Jordan Skomer and Mackenzie Sanders
  • Software engineers for Prototype app: LeTourneau University students (Jordan Skomer, Hannah Brown, Caleb Phillips)
  • Software engineers for v1.2: Cedarville University students (Noah Bragg, Grant Dennison, Robert Jacubec, Andrew Lockridge, Michael Baxter and Abigail Riffle guided by Dr. Seth Hamman)
  • Software engineers for Remote Oral Consultant Checker website and app v1.4 and v2.0: Cedarville University students (Blake Lasky, Daniel Weaver, Ann Costantino and Brendon Burns guided by Dr. Seth Hamman)
  • Software engineer for app v2.3(MVP)-2.5: John Lambert
  • Software engineers for app v2.3 and testing frameworks and Remote Oral Consultant Checker website: Cedarville Univesity students (Aaron Cannon, Justin Stallard, Jonny Taylor, Ben Ratkey, Lindsey Carroll, Nathan Herr)
  • Software engineers for Film Producer: Cedarville Univesity students (Donald Shade,...)
  • Software engineer for v3.0.2: Chad Dalton
  • Software engineers for filtered story list, Film Producer, extensive refactoring based on v3.02: Cedarville Univesity students (Jake Allinson, Nathan ONeel, Clare)
  • Software engineer for v3.0.4 - 3.0.6 Dale Hensley
  • Software engineer for v3.1 Bryan Wussow
  • Software engineer for v3.2 - 3.4 Peter Cheeseman
  • Software engineer for v4.0 - current Peter Cheeseman

Translate and produce stories (starting with templates in a major language made up of images, audio and text) by working through these phases:

  • [REGISTER project and team information (one time)]
  • LEARN or internalize the story
  • TRANSLATE+REVISE an audio translation
  • COMMUNITY CHECK the draft for naturalness and clarity
  • ACCURACY CHECK for Biblical accuracy and approval
  • VOICE STUDIO to dramatize the final audio
  • FINALIZE create new videos
  • SHARE the videos

Creating a signed APK

To install onto a device, an APK needs to be signed. When uploading to Google Play, it has to be signed by the same keystore that was used on the initial upload. For testing on a device using side loading, it can be signed with any keystore. We do not want to check in a keystore to the repo, so developers can either download a pre-made set of files or create their own.

To download pre-made set of files:

  • run these commands in the root directory
    • curl "https://sil-storyproducer-resources.s3.amazonaws.com/dev/dev-keystore.jks" -o "dev-keystore.jks"
    • curl "https://sil-storyproducer-resources.s3.amazonaws.com/dev/keystore.properties" -o "keystore.properties"

To create the set of files:

  • create a keystore (a .jks file) and save in the root directory.
  • create keystore.properties with the values:
    • storeFile=.jks
    • storePassword=
    • keyAlias=
    • keyPassword=
  • run gradle clean assembleRelease

Installing the application

  • Minimum Requirements:
    • Android 5.x.x
    • 2+GB RAM is needed to create the longer/larger videos
    • an average of 500 MB storage must be available per story template one wishes to create; it is suggested to put templates on an SD card
    • an (Android) file manager
  • Typical Install:
    • Install Story Producer app from Google Play Store
    • In the app, tap the Unlocked Demo story to begin a test drive of Story Producer.
    • Use "Download Bible Story Templates" (on the app menu) to install Bible story templates (corrected and vetted by SIL).
    • Please send your User Registration (also on the app menu).

  • Manual or offline install:
    • If you uninstall a version of the app that is v3.3 or later, deleting the app may delete all the template folders and any work you did on the translations. However, when you manually 'Select SP Templates Folder' (recommended), the data is stored in a "user-owned" location and nothing is lost when you unistall the app.
    • Enable a manual install of apk file:
      • Settings(gear icon) -> Security -> (scroll down) Enable "Unknown sources"; disable "Verify apps"
    • Insert SD card if desired
      • You will need approximately 500 MB of storage for each story you wish to produce.
    • Connect to your device via USB (it will show as a drive on your computer)
      • If it does not show up as a drive, swipe down from the top. You should see a notification: USB for charging. Touch it. Select USB for file transfer.
    • Download StoryProducer_v[most recent version].apk and copy the file onto your phone or tablet. Use your file manager on your Android device to open the apk and install it onto your device.
    • Download .bloom template files from Story Producer Resources (these templates are corrected and vetted by SIL) to your computer.
    • Copy the the .bloom files to your SD card. The standard folder there is [SDCARD]/SP Templates
    • Open Story Producer and select the folder "SP Templates" which is the folder that all the templates are in.
    • Continue with User Registration and test drive.

Unit Tests

Organization

  • All unit tests are located in the app\src\test\java\org\sil\storyproducer\test directory.
  • Test files are named for the class that they test, plus the word "Test" prepended.
    • Example: TestRegistrationActivity contains tests for the RegistrationActivity class.

  • Folders in the unit test directory correspond to folders in the source directory.
    • Example: org.sil.storyproducer.test/controller/ contains tests for code that lives in org.sil.storyproducer/controller/

  • Individual tests are named according to the following format: FunctionName_When_[Condition]_Should_[DoExpectedBehavior]
    • Example: OnCreate_When_WorkspaceDirectoryIsAlreadySet_Should_NotStartFileTreeActivity

Running the Unit Tests

From the command line:
  1. Navigate to the root directory of the repository.
  2. Run ./gradlew test (on Linux) or gradlew.bat test(on Windows). Note: You may need to run the gradle wrapper with sudo or make the gradle wrapper executable with sudo chmod +x ./gradlew
From Android Studio:
  1. Open the Story Producer project (StoryProducer.iml) in Android Studio.
  2. Set the "Project" tool window to show "Local Unit Tests" (or just navigate a the folder containing unit tests).
  3. Right click on one of the files or directories that contains some unit tests (this can be the "app" directory, a specific folder, or a single test file.).
  4. Click "Run 'All Tests'" (or a more specific option if you chose a folder or file).
  5. The "Run" tool window shows the results of the tests. Note: If no tests appear in the "Run" window, you may need to toggle the visibility of passing tests. Currently, the toggle button looks like green checkmark inside of a circle.

Espresso Tests (UI Tests)

Organization

  • All Espresso tests are located in the app\src\androidTest\java\org\sil\storyproducer directory.
  • Folders in the Espresso test directory should roughly correspond to the screen and/or features they exercise.

Before You Run the Espresso Tests:

The Espresso tests make a couple of assumptions about the state of the emulator/device that they run on. In order for the tests to pass, you must do the following:

  1. Create a directory on the phone to act as the Story Producer workspace. The path needs to match the "pathToWorkspaceDirectory" constant defined in app\src\androidTest\java\org\sil\storyproducer\androidtest\utilities\Constants.kt
  2. Create a directory on the phone to store resource files that the Espresso tests use. The path needs to match the "pathToEspressoResourceDirectory" value defined in app\src\androidTest\java\org\sil\storyproducer\androidtest\utilities\Constants.kt
  3. Copy the "Lost Coin" story template into the espresso resource directory you created in step #2. The name of the directory needs to match the "nameOfTestStoryDirectory" value defined in app\src\androidTest\java\org\sil\storyproducer\androidtest\utilities\Constants.kt
  4. Copy an .mp4 video file (the particular length or content doesn't matter) into the espresso resource directory. The name of the .mp4 file needs to match the "nameOfSampleExportVideo" value defined in app\src\androidTest\java\org\sil\storyproducer\androidtest\utilities\Constants.kt
  5. Launch your emulator device (or connect a physical one via adb).
  6. Run ./gradlew :app:assembleDebug :app:assembleDebugAndroidTest :app:installDebug :app:installDebugAndroidTest from the root directory of the repository.
  7. Run adb shell am instrument -w -e debug false -e package 'org.sil.storyproducer.androidtest.runfirst' org.sil.storyproducer.test/androidx.test.runner.AndroidJUnitRunner from the root directory of the repository. (Note that the folder containing ADB must be in your path for this command to work.)

Why is this necessary? The Espresso tests rely on the presence of the "Lost Coin" template as a sample with which to exercise the features of the app. The Espresso Tests also require the workspace to have been set up, but Espresso is not capable interacting with the operating system's file picker, so the WorkspaceSetter class uses UIAutomator to select the workspace.

Running the Espresso Tests

From the command line:
  1. Ensure that you have set up your Android device according to the previous section, "Before You Run the Tests." (The device/emulator should be running.)
  2. Navigate to the root directory of the repository.
  3. Run adb shell am instrument -w -e debug false org.sil.storyproducer.test/androidx.test.runner.AndroidJUnitRunner.
From Android Studio:
  1. Ensure that you have set up your Android device according to the previous section, "Before You Run the Tests."
  2. Open the Story Producer project (StoryProducer.iml) in Android Studio.
  3. Set the "Project" tool window to show "Android Instrumented Tests" (or just navigate to a directory containing Espresso tests).
  4. Right click on one of the directories that contains some Espresso tests (this can be the "app" directory, a specific folder, or a single test file.).
  5. Click "Run 'Tests in org.sil.storyproducer...'".
  6. The "Run" tool window shows the results of the tests. Note: If no tests appear in the "Run" window, you may need to toggle the visibility of passing tests. Currently, the toggle button looks like green checkmark inside of a circle.

Word Links (WL)

  • WLs are imported in the workspace, wordlinks/wordlinks.csv is read from the workspace path

storyproducer's People

Contributors

aaroncannonedusource avatar aarontcannon avatar abigailriffle avatar alexcwatt avatar andrew-polk avatar andrewlockridge avatar brendoburns avatar bryanwussow avatar bskwared avatar cebedard avatar chrisvire avatar chronotrigger21 avatar cucsdept avatar dalehensley avatar daviddalton avatar godismyjudge95 avatar grant-dennison avatar ithinkapps avatar jakedallinson avatar johnml1135 avatar jonathanataylor avatar justinrstallard avatar lgtm-migrator avatar michaelbaxter9 avatar mungomash avatar noahbragg avatar noneel avatar normdoow avatar pikapal101 avatar rjacubec avatar

Stargazers

 avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

storyproducer's Issues

Fix labels

Should change lables
Registration -> register
Dramatization -> dramatize

template sorting -- progress color code

We need a way (or perhaps several ways?) to order the templates … preferably in order of number low to high on the folder name in the Template Directory. Another way would be according to what is done, pending, and not begun.
related to #124

Allow Change Photo for Every Slide

Description of your problem

Ability to have more versatility in modifying and localizing a story, be able to delete the template pictures and insert a photo (of a real life scene or of a local drawing).
What steps will reproduce the problem?

What is the expected output? What do you see instead?
In the Draft phase (or Dramatize phase), somewhere on the corner of the picture, put icons (camera? X? +?) that when tapped, give the user the options to delete the picture or replace the picture with a photo .

Please provide any additional information below
This would be similar to replacing the background on the title slide.

Versions of the software and Android

  • StoryProducer Version: 1.5
  • Android SDK Version:

Templates from Bloom HTML

By early 2018, Bloom (HTML) will become the template creator for SP app. So the app needs to learn how to speak the Bloom HTML code as well as the XML code (which might gradually become redundant) Consult with @andrew-polk on this.

rename (icons?) video resolution settings

Perhaps relabel the resolution numbers as Low (320x240) - Mid (640x480) - High (1280x720) or something more intuitive. Even “resolution” could be relabeled to something like “video quality/size/res”. Possibly icons could be used as well.

keyterm links (translation helps) in draft text

Description of your problem

When translating from the draft texts, the user will sometimes need more explanation of a key word or phrase (e.g. Lord, temple, disciple, priest, Sea of Galilee) in order to meaningfully and accurately render it in their language. It is a bit clumsy/awkward to include explanations in brackets in the text. Textual notes in brackets also makes for menial work to put in the explanation every time the key word appears. And consistency issues arise with this method. It would be better if we had one key terms info document that a term in the story texts could link to. If the user needed more information on a term, they could tap the word and the info on that term would appear in a pop-up window. Tap the window's X and the user is back to the draft text screen.
The hyperlinks are also accessible in the text in the Consultant Check phase.
What steps will reproduce the problem?

What is the expected output? What do you see instead?

Please provide any additional information below
related to #51

Versions of the software and Android

  • StoryProducer Version: 1.7
  • Android SDK Version:

video output for feature phone

Relabel the File formats as 3gp for small screen / square screen / feature phone; mp4 for smartphone / big screen /rectangle screen Or maybe have a picture of a feature phone to tap and a smartphone rather than the text.

Draft to Learn audio switch crash

Here is the dump:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: org.sil.storyproducer, PID: 3214  
    java.lang.NullPointerException  
        at org.sil.storyproducer.tools.media.AudioPlayer.setVolume(AudioPlayer.java:160)  
        at   org.sil.storyproducer.controller.learn.LearnActivity$4.onCheckedChanged(LearnActivity.java:344)  
        at android.widget.CompoundButton.setChecked (CompoundButton.java:127)
        at android.widget.Switch.setChecked(Switch.java:666)
        at android.widget.CompoundButton.toggle(CompoundButton.java:87)
        at android.widget.CompoundButton.performClick(CompoundButton.java:99)
        at android.view.View$PerformClick.run(View.java:18599)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:157)
        at android.app.ActivityThread.main(ActivityThread.java:5883)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:872)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:688)
        at dalvik.system.NativeStart.main(Native Method)

Add Local Hymn Slide

We need to have the option to add audio of a local hymn at the end of the story along with the option of a local photo while the hymn is playing.

sound track fx overlay

Be able to select a sound track to play in the back and have it play along. Here a are a few thoughts:

  • It may need to be selectable per image
  • Some audio processing to merge between audio tracks
  • Possible some compression to not overdo the speakers
    • What does Faith Comes By Hearing do? Can we talk to their sound engineers?

automated archival

We need an automated archival function of any created and shared videos.

  • As soon as a video is created and filed (or have a specific action, such as view video->was it good?->archive it!), it automatically gets sent to the outbox by email to the archiving contacts in the Registration.
  • When there is connectivity, the video is sent/uploaded automatically.
  • Note: the automated naming would be helpful for meaningful archives.

audio renderings of key terms in user's language

Description of your problem

In the Draft phase when users research a key term (from the key terms info sheet activated by tapping a linked word in the text), it would be helpful for them to have a systematic way to record (via audio and/or text) their decision for rendering that key term in their language. Then, when they come across that key term again (perhaps in another story), they can be reminded of how they rendered it previously and be consistent
What steps will reproduce the problem?

What is the expected output? What do you see instead?
Perhaps, when a hyperlinked key term is tapped and the popup window appears with textual explanation for that term, in that window (maybe at the top) there could be a mic/record button for the user to record in his/her language the rendering for that term. When a recording has been done, a replay triangle button becomes available for play back. It would probably be good to keep a list of all the renderings recorded (like the comments in the community check) which can also be deleted. and renamed by press and hold.
Greenlighting: parallel to the column of recorded renderings, would be a column of recorded or text/typed back translations for each rendering. Or, maybe the user should be encouraged to give a literal word for word back translation in the LWC after saying the local language rendering in the same recording. Each recording for that key term would be automatically named in the LWC (the actual term + #).
These key term links and associated audio recordings are also accessible from the LWC text in the Consultant phase.

Please provide any additional information below
related to #50

Versions of the software and Android

  • StoryProducer Version: 1.5
  • Android SDK Version:

write to temp files when recording

Make file writing (specifically recording and video creation) write first to temp files then move to a permanent location.
This may make it more stable but would also add complexity.

Community check in tan rather than dark brown

The dark brown phase border could perhaps be a lighter shade of brown (tan?) so that the black icon shows up better. Or make it a different, lighter color, maybe purple or lavender.

Permissions checkbox

At the top/front of the Registration page, maybe we need to add a permissions checkbox and statement indicating that, from the end-users, it is ok to get their contacts and that the info will not be used for commercial gain but only for team communication and archiving ….

Update consultant icon

The icon for this phase should be reworked:

  • Gender neutral
  • Show team of bilingual people for when consultant does not know MT

Proposals:

  1. Perhaps have a person silhouette with a graduation cap on in front of two others to show that some others need to be involved with the consultant in this check.

Better display of text

What is the best way to display fonts?

  • Increase text size to be more readable?
  • Increase text size to the largest that can be on one page?
  • Have it be larger and then scroll?
    • The way to scroll without flipping the phase is to press and hold on the text to scroll it rather than flipping the screen.

reading only export (text but no audio)

Under Options, could there also be Include Audio Narration? (If Audio Narration is not checked, but Text is checked, then the video can be a reading book.) This may also be better to export as a gif or possibly a pdf.

add localization image to Title Slide in video

We need to add a way to localize the title slide by inserting a local photo (or insert a picture from the story) to replace the empty gray background slide that is there.
Using stock android sharing capabilities Insert picture into title slide
RR: also enable better texting on top of the title slide image (light color text with dark color background and vice versa)

warning before recording over draft

If the recording bar stays visible once a recording has been made, perhaps there should be a warning if the mic icon is tapped that the first recording will be deleted, or the user could be given a choice to delete or not, so that the recording is somehow protected.

record, pause, stop, append buttons

A need for consistent, readable understandable controls that are applicable to the stage:

  • Observation: When recording, there is only a stop button, but actually, tapping the stop pauses the recording, then the record-append icon appears.
  • Solution 1: Do away with the append-record icon and just have a pause button appear while recording along with a stop button. If the pause it tapped, an append-record icon appears. When the square stop icon is tapped, that ends the recording. I think we should do away with the double-tick icon as it currently functions as a stop-record.
    • should this be used just for dramatization or for everything?
  • Icons: The play and stop icons on the image (for the MT translation) are a bit unintuitive. Make the square stop icon to be a pause icon since that is the actual function.

Split export into two phases: create and share

Could the Export phases be split into two separate phases: Create Video & Share [or Publish and Distribute]. Having these in the same phase is a bit confusing/clunky and the Export UI gets hidden behind the Video Sharing label. It’s a bit confusing to have a Video Creation label at the top and also a ‘create video’ button at the bottom.

template name from folder

At the moment, the story template name comes from the Title cell in the story script (.doc). It might be more helpful if it could come from the name of the folder housing the template files.

Logo for sensitive situations

  1. Create an optional logo for sensitive situations -- replace the cross in the logo with a book/Bible silhouette, open or closed, with a typical Bible ribbon ?
  2. Alternatively, have the main logo be suitable for sensitive situations

Crash in registration

Description of your problem

The app crashes

What steps will reproduce the problem?

  1. skip registration
  2. go back to registration
  3. skip registration again
    Crash!

Versions of the software and Android

  • StoryProducer Version: V1.2
  • Android SDK Version: nougat

Abstract color code

Currently, our code uses lots of indirect color literals (e.g. @color/gray) for backgrounds, text colors, and such. We really ought to use some scheme of foreground/background colors, or primary/secondary, etc. Then, our backgrounds can be @color/background, and we can change all of the backgrounds in the app in one change rather than having to change all of the literals.

Renumber slides beginning with zero

Description of your problem

v1.2 has the story slides numbered, beginning with the title slide, from 1 to whatever. However, the Word scripts have the numbering, beginning with the title slide, from 0 to whatever. These need to be consistent to enable less confusing remote consulting where the remote consultant might be using the Word scripts.
What steps will reproduce the problem?

What is the expected output? What do you see instead?
Page/Slide numbers in the UI will begin with the title slide as number zero (0)

Please provide any additional information below

Versions of the software and Android

  • StoryProducer Version: 1.3
  • Android SDK Version:

Video creation: It's kind of jumpy

Description of your problem

When a video is made, there are often a few jumps in the video.

How can we make it less jumpy? What is the root cause? Can we make it not jumpy even on an underpowered phone?

Versions of the software and Android

  • StoryProducer Version: V1.2

Video upload status icon

When a video is being shared or uploaded somewhere, maybe there should be a waiting/uploading icon or circle or bar to indicate when the upload or sharing is finished.

Reordering slides (with narration?)

Description of your problem:

We'd like the ability to further adapt or modify the slide-show video template by being able to reorder slides to fit with the story telling style of the end-user. E.g. the template has a general story structure that looks like (1) introduce characters + (2) actions that introduce a problem + (3) climactic resolution of problem + (4) summarize story lesson. But maybe the receptor language has a general story structure that looks more like (4) + (1) + (2) + (3)

What steps will reproduce the problem?

What is the expected output? What do you see instead?
Perhaps the UI would have a sliding "bar" where all the pictures of a story in tiny format can be seen in a sliding line. If you press to select a picture and move it to another location then release it, it would move that slide (plus it's corresponding script text and audio narration) to a new location in the story.

Please provide any additional information below
Would slide/page numbers change or remain the same when relocated?

Versions of the software and Android

  • StoryProducer Version: 1.7
  • Android SDK Version:

remove file browse, include save as with auto-generated name

Here a are a few thoughts:

  • Can we remove the browse button altogether?
    • The saving location should default to the Movies folder.
    • Is the user expected to type anything into this field? If not, let’s remove the line.
  • Replace browse with save/save as
  • Maybe it should be Save As with a line after it and “short video name (key words)” on the line to prompt the user to type in a short language name for the video.
    • auto-generated name: ###_ShortLangFileName_Language_Country_LWCKeyWord.mp4
      • The initial 3 digit number of the file should come from the Template file #
      • The ShortLangFileName should come from what the user types in the Save As line
      • The Language would come from the Registration information, or maybe just put the 3 letter Ethnologue language code
      • The Country would come from the Registration info.
      • The LWC Key Word(s) would also come from the Template file name (i.e. Creation or Babel or Leopard)
    • The reason for having this file naming smart and automated is because:
      1. when a video is shared to archives, the file name will have helpful information right in it for proper archiving
      2. when a video is shared within the community, it will arrange itself in chronological/numerical order with the other videos for the viewer. Otherwise, the videos will be chaotically scattered all over the place on their phone.

When text included force high resolution

When Include Text is checked, the app would be smart if it automatically only allowed the highest resolution video. The low and mid resolution formats are not good enough for the text to be stable on the screen. Language text in a video does not come out clearly with the low or mid resolution.

double-tick when all slides have recording, then export

When all the slides have a recording, then make the black double-tick icon appear on the recording bar. This will require and remind end-users to listen to the dramatized story through from beginning to end -- and check off each slide as it is ok -- and only when all slides have been checked or double-ticked, allow them to go to Export phase.

Simplify Template Installation

Installation of the Templates with the app is a bit complicated. * Find the Templates wherever they may be.

  • Instructions for requesting a url for templates
  • Autodownload templates
  • At least one public sample Template

dramatize "x" not removed

Description of your problem

The "X" is not removed when it should be

What steps will reproduce the problem?
Consultant approval -> Dramatize -> Record Draft for first time -> X still shows in Dramatize (although can be clicked and played properly)

Versions of the software and Android

  • StoryProducer Version: 1.2
  • Android SDK Version: Nougat

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.