Code Monkey home page Code Monkey logo

inaturalist's Introduction

iNaturalist

Open source Rails app behind iNaturalist.org

Want to help out? Fork the project and check out the Contributing Code to iNaturalist (might be a bit out of date, contact kueda if you hit problems getting set up).

Thinking about running your own version of iNaturalist? Consider joining the iNaturalist Network instead of forking the community.

Attribution

Use of the Time Zone Geometries feature with the recommended source data will include information from Timezone Boundary Builder, which is made available under the Open Database License.

inaturalist's People

Contributors

aescobarr avatar albullington avatar altay avatar calonsot avatar carrieseltzer avatar dependabot-preview[bot] avatar dependabot-support avatar dependabot[bot] avatar evanburchard avatar frewsxcv avatar greysteil avatar kaldari avatar kueda avatar loarie avatar maxhou00 avatar mayuresh0072 avatar md5 avatar n8agrin avatar nikerabbit avatar pleary avatar rainhead avatar sam1vp avatar seanclifford avatar siebrand avatar sylvain-morin avatar tensiondriven avatar thatkaiguy avatar todtb avatar tomsaleeba avatar translatewiki avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

inaturalist's Issues

Not finding most free license images on Wikimedia Commons

For some reason when I try to search for images to add to a species page from Wikimedia Commons, it usually finds none or a very small number. For example, if I search for 'spider' it finds no images, but if I search for 'jumping spider' it finds 1 image. Either term should find dozens of matches. I haven't been able to figure out any rhyme or reason for why it finds some images, but not others. It doesn't seem to be related to the licensing, which was my first guess.

Trips

While the "1 taxon / 1 place / 1 time" of the iNat Observation is a decent model for occurrence data and fits a photo-centric view of natural history data recording, many natural history practices, like birding, are oriented more toward a "check list / place / time period" model, from which occurrences can be extracted, as well as absences.

So I'm proposing that we build iNat Trips. A Trip will be an extension of a journal Post, and it will add datetime, coordinates, and a list of taxa. Users can either add all the taxa they observed, or work from a place check list to pre-populate the taxa and check off the ones they saw. They can also state a broad purpose, i.e. "I was birding" and the UI can use that purpose to ask if the user wants to work from a check list.

This would also be a great opportunity for social interaction / recruitment: if you go birding with 3 of your friends who aren't on iNat, you could list them as participants, and iNat could send them an email summarizing the species you all saw, the pics you took, and of course links to sign up for iNat (we could even prepopulate life lists from the trips they were listed on).

We could also use trips for cool comparative visualizations of repeated trips. For example, I go on a birding trip to Sacramento National Wildlife Refuge with some friends of mine every winter. I have this hidden, date-base, not-ready-for primetime page I use to compare our findings, but trips would be a much better way to handle this kind of thing.

I haven't worked out all the details yet and I feel like I'm already overscoping this, but let's restart this discussion. Is anyone else interested in functionality like this? If so, are there ways this model doesn't meet your needs and if not can you recommend changes?

Here's some stuff I out together

Core Model

Model

Possible Extensions

Model Extensions

Wireframe of What the Form Might Look Like

Form Wireframe

duplicate observation alert

When viewing your own observation at obs/show, check for other observations with the same taxon_id, time_observed_at, latitude, longitude, and user_id. If one exists, add an alert with a link to merge the observations.

Consolidate settings.yml and config.yml

I would like to:

  • Merge settings.yml and config.yml into a single config.yml file
  • Create a config.default.yml file which contains the default values
  • Create a helper method for getting config values

At the moment the default config values are hard-coded and scattered throughout the codebase.

e.g.

<%= image_tag INAT_CONFIG['logo'] || 'logo-small.gif', :alt => SITE_NAME %>

I'd like it to be more like:

<%= image_tag inat_config(:logo), :alt => inat_config(:general, :site_name) %>

I imagine the implementation looking something like this:

config/initializers/00_config.rb

begin
  INAT_DEFAULT_CONFIG = YAML.load_file(Rails.root.join("config", "config.default.yml"))[Rails.env].symbolize_keys
  INAT_CONFIG = YAML.load_file(Rails.root.join("config", "config.yml"))[Rails.env].symbolize_keys
  INAT_CONFIG = INAT_DEFAULT_CONFIG.deep_merge(INAT_CONFIG)
rescue
  INAT_CONFIG = {}
end

def inat_config(*keys)
  value = INAT_CONFIG
  begin
    keys.each do |key|
      value = value.fetch(key)
    end
  rescue KeyError => error
    logger.error "Missing config values: #{keys.join(',')}"
    value = nil
  end

  value
end

If this is an acceptable approach we may want to think about doing something similar for the other config files, if required.

Or the other option is to use something like the configuration gem.

Any thoughts?

confusion on Calendar Map

Calendar is showing obscured locations as stemmed observations in the public locations and tabulating statistics from those public locations (e.g. 1 from Thornton Beach State Park, CA, US for obs with private locations in McLaren Park here: http://www.inaturalist.org/calendar/loarie/2013/5/11).

Ideally would show stemless public locations to users without permissions and stemmed private locations to users with permissions and calculate place stats on private locations visible to all users

invite-only projects

Let project managers predetermine who can join the project. Will probably require something like

  • mod proj form to allow list of invited users
  • only show join button to invited users
  • new models:
    • ProjectInvitation
      • project_id
      • user_id
    • ProjectUserRule
      • validates ProjectInvitation exists for user
  • ProjectUser should not be valid for invite-only project unless ProjectInvitation exists
  • ProjectInvitation creation should send an email to the invited user
  • ProjectInvitation creation should generate an update for the invited user
  • ProjectObservation should not be valid for invite-only project unless ProjectUser exists (assuming this is post new project obs stuff...)
  • other ui stuff
    • projects/edit
      • add check box to make the project invite-only
      • clicking checkbox shows list of invited users
      • add list of invited users
      • use chooser to add an autocompleting tool for inviting new users
    • projects/show
      • remove join link for invite-only

I'm guessing this would take me 3 days, which probably means it would be more like a week.

Strange places in Singapore get automatically added when using "Add a place" interface

I used the "Add a place" interface to add a few states to the Habronattus amicus taxon page. Once I was done, I saw that the following places I didn't explicitly add myself now appeared on the taxon page:

  • United States (makes sense)
  • Singapore
  • 22, Singapore, SG
  • 14
  • Singapore, Central Singapore, SG
  • Central Singapore, SG

Not sure what's going on there or how to remove the bogus ones.

conditions for subscriptions

Some people would like to subscribe to "rare plants of Vermont" or "introduced insects of California." Allow subscriptions to be configured

  • listed taxon establishment means
  • listed taxon occurrence level
  • observation wild/captive status

Using the preferences gem is probably the way to go here, that or some kind of bitfield column in the subscriptions table.

Yes and No links report translation missing

In the Data Quality Assessment interface if I hover over the "Yes" or "No" links, a title tooltip pops up saying "translation missing: en.yes" or "translation missing: en.no".

"Add more photos" interface is really confusing

When I click on the "Add more photos" interface I have no idea what's going on. I choose "Source: Your computer", which does nothing, and I'm just left with a bunch of random photos from Flickr. What I would expect here would be 2 buttons:

  • "Add photo from your computer", which let's me choose a photo from my hard drive
  • "Add photo from Flickr", which let's me enter a Flickr URL or search term, and then choose one of the resulting images.

Update config.yml.example

Could you please update config.yml.example to include the new config options such as 'bounds', 'logo_icon_square_big' etc?

Cheers

Cannot connect to Yahoo

When I click Connect to Yahoo on my profile, I get a 500 error.

On my development copy I get the following.

NoMethodError in Provider authorizationsController#create

You have a nil object when you didn't expect it!
You might have expected an instance of ActiveRecord::Base.
The error occurred while evaluating nil.[]
/vagrant/app/controllers/provider_authorizations_controller.rb:98:in `create_provider_authorization'
/vagrant/app/controllers/provider_authorizations_controller.rb:61:in `create'
/var/lib/gems/1.8/gems/actionpack-2.3.12/lib/action_controller/base.rb:1333:in `send'
/var/lib/gems/1.8/gems/actionpack-2.3.12/lib/action_controller/base.rb:1333:in `perform_action_without_filters'
/var/lib/gems/1.8/gems/actionpack-2.3.12/lib/action_controller/filters.rb:617:in `call_filters'
/var/lib/gems/1.8/gems/actionpack-2.3.12/lib/action_controller/filters.rb:638:in `run_before_filters'
/vagrant/app/controllers/application_controller.rb:190:in `catch_missing_mobile_templates'
/var/lib/gems/1.8/gems/activesupport-2.3.12/lib/active_support/callbacks.rb:178:in `send'
/var/lib/gems/1.8/gems/activesupport-2.3.12/lib/active_support/callbacks.rb:178:in `evaluate_method'
/var/lib/gems/1.8/gems/actionpack-2.3.12/lib/action_controller/filters.rb:186:in `call'
/var/lib/gems/1.8/gems/actionpack-2.3.12/lib/action_controller/filters.rb:635:in `run_before_filters'
/var/lib/gems/1.8/gems/actionpack-2.3.12/lib/action_controller/filters.rb:615:in `call_filters'
/var/lib/gems/1.8/gems/actionpack-2.3.12/lib/action_controller/filters.rb:610:in `perform_action_without_benchmark'
/var/lib/gems/1.8/gems/actionpack-2.3.12/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue'
/var/lib/gems/1.8/gems/activesupport-2.3.12/lib/active_support/core_ext/benchmark.rb:17:in `ms'
/usr/lib/ruby/1.8/benchmark.rb:308:in `realtime'
/var/lib/gems/1.8/gems/activesupport-2.3.12/lib/active_support/core_ext/benchmark.rb:17:in `ms'
/var/lib/gems/1.8/gems/actionpack-2.3.12/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue'
/var/lib/gems/1.8/gems/actionpack-2.3.12/lib/action_controller/rescue.rb:160:in `perform_action_without_flash'
/var/lib/gems/1.8/gems/actionpack-2.3.12/lib/action_controller/flash.rb:151:in `perform_action'
/var/lib/gems/1.8/gems/actionpack-2.3.12/lib/action_controller/base.rb:532:in `send'
/var/lib/gems/1.8/gems/actionpack-2.3.12/lib/action_controller/base.rb:532:in `process_without_filters'
/var/lib/gems/1.8/gems/actionpack-2.3.12/lib/action_controller/filters.rb:606:in `process'
/var/lib/gems/1.8/gems/actionpack-2.3.12/lib/action_controller/base.rb:391:in `process'
/var/lib/gems/1.8/gems/actionpack-2.3.12/lib/action_controller/base.rb:386:in `call'
/var/lib/gems/1.8/gems/actionpack-2.3.12/lib/action_controller/routing/route_set.rb:438:in `call'
/var/lib/gems/1.8/gems/actionpack-2.3.12/lib/action_controller/dispatcher.rb:87:in `dispatch'
/var/lib/gems/1.8/gems/actionpack-2.3.12/lib/action_controller/dispatcher.rb:121:in `_call'
/var/lib/gems/1.8/gems/actionpack-2.3.12/lib/action_controller/dispatcher.rb:130:in `build_middleware_stack'
/var/lib/gems/1.8/gems/activerecord-2.3.12/lib/active_record/query_cache.rb:29:in `call'
/var/lib/gems/1.8/gems/activerecord-2.3.12/lib/active_record/query_cache.rb:29:in `call'
/var/lib/gems/1.8/gems/activerecord-2.3.12/lib/active_record/connection_adapters/abstract/query_cache.rb:34:in `cache'
/var/lib/gems/1.8/gems/activerecord-2.3.12/lib/active_record/query_cache.rb:9:in `cache'
/var/lib/gems/1.8/gems/activerecord-2.3.12/lib/active_record/query_cache.rb:28:in `call'
/var/lib/gems/1.8/gems/activerecord-2.3.12/lib/active_record/connection_adapters/abstract/connection_pool.rb:361:in `call'
/var/lib/gems/1.8/gems/oa-core-0.2.6/lib/omniauth/strategy.rb:164:in `call_app!'
/var/lib/gems/1.8/gems/oa-core-0.2.6/lib/omniauth/strategy.rb:129:in `callback_phase'
/var/lib/gems/1.8/gems/oa-openid-0.2.6/lib/omniauth/strategies/open_id.rb:89:in `callback_phase'
/var/lib/gems/1.8/gems/oa-core-0.2.6/lib/omniauth/strategy.rb:68:in `callback_call'
/var/lib/gems/1.8/gems/oa-core-0.2.6/lib/omniauth/strategy.rb:42:in `call!'
/var/lib/gems/1.8/gems/oa-core-0.2.6/lib/omniauth/strategy.rb:30:in `call'
/var/lib/gems/1.8/gems/oa-core-0.2.6/lib/omniauth/strategy.rb:44:in `call!'
/var/lib/gems/1.8/gems/oa-core-0.2.6/lib/omniauth/strategy.rb:30:in `call'
/var/lib/gems/1.8/gems/oa-core-0.2.6/lib/omniauth/strategy.rb:44:in `call!'
/var/lib/gems/1.8/gems/oa-core-0.2.6/lib/omniauth/strategy.rb:30:in `call'
/var/lib/gems/1.8/gems/oa-core-0.2.6/lib/omniauth/strategy.rb:44:in `call!'
/var/lib/gems/1.8/gems/oa-core-0.2.6/lib/omniauth/strategy.rb:30:in `call'
/var/lib/gems/1.8/gems/oa-core-0.2.6/lib/omniauth/builder.rb:30:in `call'
/var/lib/gems/1.8/gems/actionpack-2.3.12/lib/action_controller/string_coercion.rb:25:in `call'
/var/lib/gems/1.8/gems/rack-1.1.2/lib/rack/head.rb:9:in `call'
/var/lib/gems/1.8/gems/rack-1.1.2/lib/rack/methodoverride.rb:24:in `call'
/var/lib/gems/1.8/gems/actionpack-2.3.12/lib/action_controller/params_parser.rb:15:in `call'
/var/lib/gems/1.8/gems/actionpack-2.3.12/lib/action_controller/session/cookie_store.rb:99:in `call'
/var/lib/gems/1.8/gems/activesupport-2.3.12/lib/active_support/cache/strategy/local_cache.rb:25:in `call'
/var/lib/gems/1.8/gems/actionpack-2.3.12/lib/action_controller/failsafe.rb:26:in `call'
/var/lib/gems/1.8/gems/rack-1.1.2/lib/rack/lock.rb:11:in `call'
/var/lib/gems/1.8/gems/rack-1.1.2/lib/rack/lock.rb:11:in `synchronize'
/var/lib/gems/1.8/gems/rack-1.1.2/lib/rack/lock.rb:11:in `call'
/var/lib/gems/1.8/gems/actionpack-2.3.12/lib/action_controller/dispatcher.rb:114:in `call'
/var/lib/gems/1.8/gems/actionpack-2.3.12/lib/action_controller/reloader.rb:34:in `run'
/var/lib/gems/1.8/gems/actionpack-2.3.12/lib/action_controller/dispatcher.rb:108:in `call'
/var/lib/gems/1.8/gems/rails-2.3.12/lib/rails/rack/static.rb:31:in `call'
/var/lib/gems/1.8/gems/rack-1.1.2/lib/rack/urlmap.rb:47:in `call'
/var/lib/gems/1.8/gems/rack-1.1.2/lib/rack/urlmap.rb:41:in `each'
/var/lib/gems/1.8/gems/rack-1.1.2/lib/rack/urlmap.rb:41:in `call'
/var/lib/gems/1.8/gems/rails-2.3.12/lib/rails/rack/log_tailer.rb:17:in `call'
/var/lib/gems/1.8/gems/rack-1.1.2/lib/rack/content_length.rb:13:in `call'
/var/lib/gems/1.8/gems/rack-1.1.2/lib/rack/handler/webrick.rb:48:in `service'
/usr/lib/ruby/1.8/webrick/httpserver.rb:104:in `service'
/usr/lib/ruby/1.8/webrick/httpserver.rb:65:in `run'
/usr/lib/ruby/1.8/webrick/server.rb:173:in `start_thread'
/usr/lib/ruby/1.8/webrick/server.rb:162:in `start'
/usr/lib/ruby/1.8/webrick/server.rb:162:in `start_thread'
/usr/lib/ruby/1.8/webrick/server.rb:95:in `start'
/usr/lib/ruby/1.8/webrick/server.rb:92:in `each'
/usr/lib/ruby/1.8/webrick/server.rb:92:in `start'
/usr/lib/ruby/1.8/webrick/server.rb:23:in `start'
/usr/lib/ruby/1.8/webrick/server.rb:82:in `start'
/var/lib/gems/1.8/gems/rack-1.1.2/lib/rack/handler/webrick.rb:14:in `run'
/var/lib/gems/1.8/gems/rails-2.3.12/lib/commands/server.rb:111
script/server:3:in `require'
script/server:3

Proposed Improvements for Taxon Map

There is potential funding to achieve the following to make taxon maps more useful for professionals interested visualizing iNaturalist observations alongside other biogeographic data. Thoughts on the following modifications to taxa/taxon_range:
map_improvements

Project required field indicator

If a project specifies some fields (e.g. georeference) as required, there is no indicator that the field is required. Could you come up with a way to indicate this so that observations are not simply rejected from the project?

This could be a very good way to lose project contributions without the user noticing.

Custom fields do a good job by marking required fields with *'s. Thanks!

localization sistem?

Hi all!

congratulations for your nice aplication! I'm thinking about translate it, but i can't find any directory with de .po files. Is there any translation sistem with the strings out of code?

thanks!

Green blob under "Where were you?" is mysterious

In the observation interface, under "Where were you?", there's a little green blob/button next to the text field. If you click it, it activates the text field. It doesn't seem to serve any real purpose (most people activate text fields by clicking on them directly), and it's presence is mysterious. If there's some reason to keep it, it could probably use a better graphic and a title tooltip explaining what it is.

Too many signficant digits for latitude and longitude

Right now when you pick an observation location from the map it fills in the latitude and longitude values to 10 decimal places. This is the equivalent of specifying a location to 1/100th of a millimeter. Since you can't actually zoom in that close in the map, and no camera's GPS system is anywhere near that accurate, it would be better to truncate the coordinates to a more reasonable number of decimal places, like 5 or 6. Five decimal places is the equivalent of specifying the location to the exact meter.

filter lists/show by taxon

Allow users to filter the taxa shown on lists/show by an arbitrary taxon, e.g. you should be able to see all the members of Asteraceae on a given list.

Add "cultivated / captive" checkbox to obs and identification forms

No one really uses the quality metrics much, and at least one of our data partners is complaining about cultivated organisms in their research-grade observations feed. I don't want to force people to flag their own data like this, and I'm leery of adding more complication to the obs form, but what do you (@loarie in particular) think of this:

Screen Shot 2013-04-17 at 10 39 18 PM

Checking the box will automatically add a quality metric vote again wild/naturalized. I don't think it's that intrusive, and it might encourage people to flag their data more. I was also thinking we might add something similar to the identification form at the bottom of obs pages so that when people confirm identification of clearly cultivated organisms they can add a quality metric at the same time:

Screen Shot 2013-04-17 at 10 35 24 PM

Thoughts?

google account link on users/edit broken

Currently it 404s for no reason. The sign in link works fine. Either fix this or embrace the future by replacing the Open ID Google strategy with its OAuth2 equivalent.

multiple project observation rules per operator

Currently you can only have one rule per operator, which means you can't do something like require that an observation by of an amphibian OR a reptile. Allow multiple rules per operator and treat those rules as OR.

Two bugs on Lists show

'Reload from observations' on lists/show not working, also missing en.find on Add to Your List

Revoking OAuth tokens

Please correct me if I am wrong - I searched around the site but couldn't find a way to manage existing access tokens linked to my account.

It's definitely important to allow users to see which apps they've authorized and revoke access when needed.

Problem with load_iconic_taxa

Hello INaturalist has been suggested by someone for a project here in New Zealand and I am trying to get it going on my machine.

I have worked though your developer guide (more or less) and finally got to the command:
script/runner tools/load_iconic_taxa.rb

It starts off OK but finally reports "/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.11/lib/active_support/whiny_nil.rb:52:in method_missing': undefined methodtaxon' for nil:NilClass (NoMethodError)"
Then the stack trace thingy :

    from tools/load_iconic_taxa.rb:42
from tools/load_iconic_taxa.rb:38:in `each'
from tools/load_iconic_taxa.rb:38
from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:36:in `eval'
from /usr/lib/ruby/gems/1.8/gems/rails-2.3.11/lib/commands/runner.rb:46
from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:36:in `gem_original_require'
from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:36:in `require'
from script/runner:3

I would be much obliged if anyone could give me some hints about how to fix this.
From what I can see, it seems to get through to the point where it actually tries to write data to the DB

Regards,
Zane Gilmore

iNat over https

Allow users to set default connections to https; default connection right now is unencrypted.

Removing Naturalized and Managed from Establishment Means Catgories

I propose we remove the Naturalized and Managed categories from Establishment Means. Which currently includes the following categories:

native: evolved in this region or arrived by non-anthropogenic means
endemic: native and occurs nowhere else
introduced: arrived in the region via anthropogenic means
naturalised: reproduces naturally and forms part of the local ecology
invasive: has a deleterious impact on another organism, multiple organisms, or the ecosystem as a whole
managed: maintains presence through intentional cultivation or husbandry

Pros:

  1. less confusing - indroduced overlaps with naturalised, and managed overlaps with iNat's convention of not checklisting non-wild/naturalized taxa
  2. will fit CONABIO's database.

Cons:

  1. Departs from the DarwinCore/TDWG recommended vocabulary:
    https://code.google.com/p/darwincore/wiki/Occurrence#establishmentMeans

Thoughts?

Weird message when starting a new list

When you create a new list, at the bottom of the page it says:
"You haven't observed any species to list yet! Try to list yet! Try adding some observations or just adding species using the form on this page."

The sentence "Try to list yet!" doesn't make sense.

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.