Git Product home page Git Product logo

opendigitaltwins-building's Introduction

Digital Twins Definition Language-based RealEstateCore ontology for smart buildings

Motivation and purpose

Azure Digital Twins (ADT), and its underlying Digital Twins Definition Language (DTDL), are at the heart of Smart Building solutions built on Azure.

DTDL is the language by which developers can define the language of the entities they expect to use in their topologies. Since DTDL is a blank canvas which can model any entity, it is important to accelerate developers' time to results by providing a common domain-specific ontology to bootstrap solution building, as well as seamless integration between DTDL-based solutions from different vendors.

Our partnership with the RealEstateCore Consortium has delivered this DTDL-based ontology (or set of models) for the real estate industry, which provides common ground for modeling smart buildings while leveraging industry standards to prevent reinvention. As part of the delivery, we also provide best practices for how to consume and properly extend the ontology.

This is an open-source ontology definition which learns from, builds on, and uses industry standards, and meets the needs of solution builders in the built world. We hope it will be widely adopted and/or extended by developers, and strongly encourage active participation and contribution.

DTDL-based RealEstateCore ontology overview

This DTDL ontology is implemented based on the domain ontology RealEstateCore. RealEstateCore is a common language used to model and control buildings, simplifying the development of new services. The ontology is rich and complete, while providing simplicity and real-world applicability with proven industry solutions and partnerships. It has seen practical deployments across sizeable real estate portfolios over the past several years, and has gone through several revisions based on real-world feedback and learning. RealEstateCore specifically does not aim to be a new standard, but rather provides a common denominator and bridge with other building industry standards such as Brick Schema, Project Haystack, W3C Building Topology Ontology (W3C BOT), and more. Read more about our ontology alignment with standards.

The original RealEstateCore ontology is represented using the W3C Web Ontology Language (OWL) and it can be visualized here. It has been converted into the DTDL syntax used in this repository using our universal OWL2DTDL tool.

RealEstateCore structure

Building Ontology

RealEstateCore ontology consists of a main set of interfaces:

  • Asset – An object which is placed inside of a building, but is not an integral part of that building's structure, for example architectural, furniture, equipment, systems, etc.
  • LogicalDevice – A physical or logical object defined as an electronic equipment or software that communicates and interacts with a digital twin platform. A logical device could be an integrated circuit inside of a smart HVAC unit, or a virtual server running on a Kubernetes cluster. Logical devices can have Capability instances (through hasCapability) that describe their input/output capabilities. If Logical Devices are embedded within Asset entities (through the hostedBy property) such capabilities typically denote the capabilities of the asset.
  • Capability - A capability indicates the capacity of a entity, be it a Space, an Asset, or a LogicalDevice, to produce or ingest data. This is equivalent to the term "point" in Brick Schema and generic Building Management System. Specific subclasses specialize this behavior: Sensor entities harvest data from the real world, Actuator entities accept commands from a digital twin platform, and Parameter entities configure some capability or system. For more detailed information, refer to the Capability Readme.
  • Space - A contiguous part of the physical world that has a 3D spatial extent and that contains or can contain sub-spaces. For example a Region can contain many pieces of Land, which in turn can contain many Buildings, which in turn can contain Levels and Rooms.

RealEstateCore also contains additional base interfaces:

  • Agent - Any basic types of stakeholder that can have roles or perform activities, e.g., people, companies, departments.
  • Building Component - A part that constitutes a piece of a building's structural makeup, for example Facade, Wall, Slab, RoofInner, etc.
  • Collection - An administrative grouping of entities that are addressed and treated as a unit for some purpose. These entities may have some spatial arrangement (e.g., an Apartment is typically contiguous), however that is not a requirement (see, e.g., a distributed Campus consisting of spatially disjoint plots or buildings).
  • Document - A formal piece of written, printed or electronic matter that provides information or evidence or that serves as an official record, for example LeaseContract, Building Specification, Warranty, Drawing, etc.
  • Event - A spatiotemporally indexed entity with participants, something which occurs somewhere, and that has or takes some time, for example a Lease or Rent.
  • Role - A role that is held by some agent, for example a person could hold a Sales Representative role, or an organization could hold a Maintenance Responsibility role

RealEstateCore contains a number of relationship types, here we list the main ones:

  • isPartOf, hasPart - A simplified set of topological relations to connect sub- and super-entities within the top-level RealEstateCore interface tree. "isPartOf" and "hasPart" are now defined to operate on entities of the same type, for example Spaces have only Spaces as parts, Assets have only Assets as parts, etc.
  • hasCapability - Indicates that a Space, Asset or LogicalDevice has the ability to produces or ingest data represented by sensors, actuators or parameters, for example a VAV.L01.01 hasCapability relationship to an TemperatureSensor. Inverse of isCapabilityOf.
  • includedIn - Indicates that an entity is included in some Collection, for example a Building is included in a RealEstate, or a Room is included in an Apartment. Inverse of includes, for example a Campus includes some Space, an Apartment includes some Room
  • locatedIn - Indicates that a given Asset is physically located in a Space. Inverse of: isLocationOf
  • hosts - Indicates that a given Asset hosts a logical device; for example a Raspberry Pi hosts a Home Assistant installation, or an IoT-connect smart camera unit hosts an IoT Edge runtime. Inverse of: hostedBy, which indicates the physical hardware asset that a given logical device is hosted and executed on.
  • serves - The coverage or impact area of a given Asset or Sensor/Actuator. For example: an air-treatment unit might serve several Rooms or a full Building. Note that Assets can also service one another, for example an air-treatment Asset might serve an air diffuser Asset. Inverse of: servedBy
  • feeds - Indicates that a given equipment is feeding "something" to another equipment or space, like electricity, water or air. For example, an AHU equipment feeds air to a VAV equipment. See Equipment interface for details. Inverse of: isFedBy
  • hasBuildingComponent - Parthood traversal property linking Buildings to the Building Components that they are made up of, for example a Building hasBuildingComponent a Facade or Wall which are of type BuildingComponent,. Inverse of: componentOfBuilding.
  • owns - Indicates that an agent is the legal owner of a given entity, for example a Company owns some Real Estate. Inverse of: ownedBy

Using RealEstateCore ontology

Here is a real example of a subgraph of an Azure Digital Twins instance based on this ontology:

Using the models

We have instantiated the following twins:

Below is the Azure Digital Twins query to find out all rooms' temperatures in Building 121, Level 1 which values are below 73.

SELECT Room, Sensor, Level 
    FROM DIGITALTWINS Room  
    JOIN Level RELATED Room.isPartOf
    JOIN Sensor RELATED Room.hasCapability
    JOIN Building RELATED Level.isPartOf
    WHERE IS_OF_MODEL(Room, 'dtmi:digitaltwins:rec_3_3:core:Room;1') 
    AND IS_OF_MODEL(Level, 'dtmi:digitaltwins:rec_3_3:core:Level;1')
    AND IS_OF_MODEL(Building, 'dtmi:digitaltwins:rec_3_3:core:Building;1')
    AND IS_OF_MODEL(Sensor, 'dtmi:digitaltwins:rec_3_3:core:TemperatureSensor;1')
    AND Level.levelNumber = 1 
    AND IS_DEFINED(Sensor.hasValue)
    AND Building.$dtId = 'Building121'
    AND Sensor.hasValue < 73

Another query example on above subgraph is to find the rooms which are affected by VAVs with serialNumber 2561A5510 (because it's going to be replaced).

SELECT VAV, Room 
    FROM DIGITALTWINS VAV
    JOIN Room RELATED VAV.locatedIn  
    JOIN Level RELATED Room.isPartOf
    JOIN Building RELATED Level.isPartOf
    WHERE IS_OF_MODEL(Room, 'dtmi:digitaltwins:rec_3_3:core:Room;1') 
    AND IS_OF_MODEL(Level, 'dtmi:digitaltwins:rec_3_3:core:Level;1')
    AND IS_OF_MODEL(Building, 'dtmi:digitaltwins:rec_3_3:core:Building;1')
    AND Building.$dtId = 'Building121'
    AND VAV.serialNumber ='2561A5510'

To learn more on Azure Digital Twins queries, please refer to Query the Azure Digital Twins twin graph article.

Tools to use this (and other REC based) Ontology

The tools for this Ontology have been moved to this Github repository Tools for Digital Twins Definition Language (DTDL) based Ontologies.

Extending the ontology

This is the decision tree workflow we recommend for extending and contributing to this DTDL-based RealEstateCore ontology.

Extending ontology

We encourage users to extend existing models via inheritance by using the DTDL extends property. Interface inheritance can be used to create specialized interfaces from more general interfaces. If you need to add a new interface or add additional properties, try to find the interfaces to extend from. For example, if you need to add a specialized type of room, like FocusRoom, add a new interface FocusRoom which inherits from Room interface. Through inheritance, the FocusRoom has two properties Room: the personCapacity property (from Room) and the occupied property (from FocusRoom).

[
  {
    "@id": "dtmi:digitaltwins:rec_3_3:core:Room;1",
    "@type": "Interface",
    "dtmi:dtdl:property:contents;2": {
      "@type": "Property",
      // ...
      "name": "personCapacity",
      "schema": "integer"
    },
    // ...
    "extends": "dtmi:digitaltwins:rec_3_3:core:Space;1",
    "@context": "dtmi:dtdl:context;2"
  },
  {
    "@id": "dtmi:digitaltwins:rec_3_3:core:FocusRoom;1",
    "@type": "Interface",
    "dtmi:dtdl:property:contents;2": {
      "@type": "Property",
      // ...
      "name": "occupied",
      "schema": "bool"
    },
    // ...
    "extends": "dtmi:digitaltwins:rec_3_3:core:Room;1",
    "@context": "dtmi:dtdl:context;2"
  }
]

Now that you have extended your specialized interface(s), ask yourself if your extensions are generic and could benefit other users. If the answer is yes, our recommendation is to fork the existing repository, make your changes and send a pull request (see the section below).

Contributing to ontology

We are working on improving the main interfaces, adding more interfaces in areas that we don't yet support, as well as making better tools to integrate and use the models in smart building platforms and its applications.

We encourage you to contribute to continue improving the DTDL-based RealEstateCore ontology. Please point out bugs or peculiarities, add or extend interfaces and vocabularies, and suggest improvements to evolve this ontology.

  • Comment or create a new issue for bug reporting
  • For improvements, please fork this repository, make your changes and send a pull request

Pull requests will be evaluated based on the quality of the proposed interface models, adherence to the modeling conventions used in the repo (see below), and conceptual and roadmap compliance with the RealEstateCore OWL model project that DTDL RealEstateCore is generated from.

Modeling conventions

  • All entity naming (Interfaces, Properties, Relationships, Components, etc.) is done in English.
  • Interfaces are named as singular nouns using CamelCase with capital initial (aka. PascalCase); e.g., Space or Asset. For the sake of clarity, sub-interfaces can include suffixes indicating parent interfaces, e.g., LightingEquipment or SpaceCollection.
  • Properties are named as singular nouns using camelCase with lower-case initial, typically with two or three name components; e.g., filterType, maxVerticalRise. Exceptions to the singular noun rule may be made in cases where the property represents a count (e.g., maxLandings for an Elevator interface).
  • Relationships are named as singular nouns using camelCase with lower-case initial, typically with two or three name components. Naming can represent either the relationship itself, in the case of generic relationships (e.g., isPartOf or serves), or a target Interface (e.g., hasCapability or subMeterOf).
  • Please use language-tagged displayNameand description fields, providing at minimum English-language versions of these (more languages are of course welcome!).
  • The English-language value of displayName should mirror the DTMI local name written out in lowercase, i.e., isPartOf has the display name is part of.

Alignment with standards

  • Asset interfaces, covering systems and equipment within buildings is based on an interpretation and extension of the Brick Schema Ontology, carried out in conjunction with Willow Inc.
  • Our spatial modeling is in line with the W3C BOT ontology and clearly differentiates between Building Components and Spaces; where the former make up the building's structural elements, and the latter make up physical spaces inside (rooms, levels, etc) or outside (regions, land, etc) of a building.
  • Capability interfaces are based on the Building Management System (BMS) notion of Points (as represented in Brick Schema or Haystack). Subclasses of Capability denote specific sensorsing or actuation capabilities that can be assigned to Spaces, Assets, etc.
  • LogicalDevice is inspired by Azure IoT Hub's Device terminology and represents a connected entity that pushes data to the cloud or receives commands from the cloud (typically an endpoint such as a piece of software like an IoTEdge module, a HomeAssistant install, or some proprietary BMS system, etc.). The reason we have created the LogicalDevice interface different from the Device interface, is that we see the physical device being represented as a Device digital twin in IoT Hub and the LogicalDevice twin being represented in this ontology. For example, the LogicalDevice may have hasCapability relationships to Capability. A physical device connected to IoT Hub would not have those relationships, instead it would have Telemetry, Properties, and Commands potentially feeding the Sensors, Parameters, and Actuators in this ontology.

The DTDL-based RealEstateCore ontology accelerates developers from the “blank page” and facilitates business-to-business integrations between vendors in a smart building. Since the DTDL-based ontology is open sourced, developers can easily annotate existing models while contributing their own domain expertise. Read more about:

More about Azure Digital Twins

This project has adopted the Microsoft Open Source Code of Conduct. For more information see the Code of Conduct FAQ or contact [email protected] with any additional questions or comments.

Microsoft collects performance and usage information which may be used to provide and improve Microsoft products and services and enhance your experience. To learn more, review the privacy statement.

Contributors

Jönköping University: Karl Hammar
Microsoft: Alina Stanciu, Brian Crawford, Bert Van Hoof, Akshay Johar, Matthew Vogel, Kevin Hilscher, Miriam Berhane Russom, OP Ravi
RealEstateCore Consortium: Karl Hammar, Erik Wallin, Per Karlberg, Peter Hartlev, Joakim Eriksson
Idun Real Estate Solutions: Erik Wallin, Per Karlberg
Willow: Rick Szcodronski

opendigitaltwins-building's People

Contributors

akshayj-msft avatar alinamstanciu avatar erikoskarwallin avatar hammar avatar jmayrbaeurl avatar katriendg avatar mavoge avatar microsoft-github-operations[bot] avatar microsoftopensource avatar rszcodronski 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

opendigitaltwins-building's Issues

Confusion about building new models on top of REC

Hey devs,

What would be the best way to build new models that contain multiple measurements on top of REC 3 with preferably DTDLv3. We have devices equiped with multiple sensors, for example a sensor that measures temperature, humidity and co2 (and some more things).

Options that might be it:

  1. Create a model that contains a component for every value (I believe this is not possible).
  2. One overlaying twin (Capability?) that extends multiple models (I believe this is possible, but can't upload v3 models as of now).
  3. One twin that has relationships to specific twins for each measure.

Is it true that 2 would be the way to go (if this is possible in the first place) and is it true that uploading v3 is not possible yet?
I get the following error when I try to upload the DTDLv3 version of REC_3_3, while it worked fine when it was on DTDLv2.

DocumentParseError: Failed to parse input. Error: jsonld.InvalidUrl: Dereferencing a URL did not result in a valid JSON-LD object.

Thanks!

Add externalIDs on all relationships

Hi Karl @hammar ,

@davidemassarenti has a feedback on Relationships we have added in REC models. When uploading BMS data into ADT, he is using externalIds property to modify only twins which are coming from BMS. He is saying that we need relationships to have “externalIds” property. I am proposing we should add it on all relationships.

Thanks

Barrier Asset

The Barrier Asset has a property type (Enum: Interior, Exterior) which isn't a very good representation of what it is describing. Instead, I propose that we change this to be named service (Enum: Interior, Exterior) to better align with how the term service is being used throughout the ontology. The term type is being used throughout the ontology to define different styles (aka type) of that particular asset you may have and not its placement context (aka service).

Willow has extended the REC Barrier Asset model like this to include a service property.

Food Handling Room - Pentry vs Pantry

I believe the model at opendigitaltwins-building/Ontology/Space/Room/FoodHandlingRoom/Pentry.json is supposed to represent a food pantry; was it named "pentry" intentionally? Will it be updated to reflect the Pantry?

Make OWL2DTDL generate writeable properties

Developer comment:

I reviewed some of the DTDL files generated by OWL2DTDL. The DTDL generated by OWL2DTDL omits the writable property, thereby making the property read-only. Is there a Datatype property equivalent in REC that we can use to toggle the writable property in DTDL?

My response:

In an OWL or RDF model, the notion of a property being "writable" or "non-writable" doesn't really make sense -- it is just a data model, such things would be handled by overlying authorization mechanisms. I guess the most flexible approach would be to make all OWL data properties generate writable DTDL Properties, that is, to add writable:true on all of the DTDL properties.

To do: implement writeable properties as per above.

Issue with generated multiplicity fields (and perhaps other numeric fields)

The generated REC classes currently contain definitions such as the following:
"maxMultiplicity": {
"@type": "xsd:integer",
"@value": "1"
},
"minMultiplicity": {
"@type": "xsd:integer",
"@value": "0"
},

I believe this really should just read maxMultiplicity: 1 and minMultiplicity: 0

While this currently passes the DTDL validator, it is not officially valid DTDL syntax, to the best of my knowledge, and may fail in future versions of the DTDL parser .

Support for REC V4

Hi team,

I would like to ask around supporting Real Estate Core V4 as this is released by RealEstateCore OWL model project on Feb 11st.
I know REC4 is a major and backwards-incompatible rewrite, but as we're using in a production application I would where possible plan in advance.
Any info are very appreciated.

Thank you very much

Floor Confusion

I have heard several people raise confusion about Level (Space) vs Floor (BuildingComponent). These terms are often used interchangeably in the US when talking about the vertical delineations of space in a building.

I believe the Floor BuildingComponent is meant to refer to the type of finished flooring that are installed on top of a slab such as carpet, tile, or wood. If this is true, I recommend we change the term from Floor to Flooring to avoid this confusion. This would remove Floor from the ontology at this time and hopefully eliminate confusion about which to use.

Defining property lastValue higher in the hierarchy?

Hi all,

I believe it would make sense to define the property "lastValue" higher in the inheritance hierarchy.
More specifically, is there a good reason to not define "lastValue" on the "Capability"-model? In the end, what is the purpose of having a property "lastValueTime" without having the option to store/reference that lastValue?

I believe this approach would make more sense than the current 127 references where "lastValue" is currently defined: https://github.com/Azure/opendigitaltwins-building/search?q=lastValue&type=code

A related question on this topic was discussed before in #42.

Best,
Michiel

Optimizing the repository for different DTDL versions

After changing the DTDL version to 3 in this repository, I can't clone the repository and upload it to Azure ADT because Azure ADT only supports DTDL version 2. The repository should be structured differently, e.g. contain a separate directory for each DTDL version.

Example:
Azure / opendigitaltwins-building / Ontology / DTDL / V2
Azure / opendigitaltwins-building / Ontology / DTDL / V3

Upgrade to DTDLv3

Hi,

the ontology has been upgraded to DTDLv3.
Where can we find information about v3 of the DTDL?

Thanks,
Hannes

HVAC Equipment reusability

The HVAC equipment has several areas where creating a reusable component would help for consistency. Created a pull request with recommended changes #18 .

No model names for some DTDL models

Small issue, the model names are missing for the following models:

  • DamperStatusSensor
  • FanStatusSensor
  • FireExtinguisherRemovedSensor
  • FireExtinguisherTroubleSensor
  • LeakSensor

Is there any info yet about when DTDL v3 + REC4 will be released? This repo still contains DTDL v3 as the latest commit and it's not possible to upload these models.

Not all sensors have a lastValue field

Perhaps this was intentional, but I find myself extending the default sensors a lot. dtmi:digitaltwins:rec_3_3:device:TemperatureSensor;1 has a property lastValue. But none of the binary sensors seem to have that field, for instance: dtmi:digitaltwins:rec_3_3:device:OccupancySensor;1.

In the building I am describing with REC, I have rooms that utilize multiple occupancy sensors. The occupancy of the room is then determined by any of these sensors reporting occupancy. Without knowing the last value of these sensors, I can't be certain of the occupancy in a room. Is there a way to achieve this with REC without extending models? I would like to stay as close to the standard as possible.

Incorrect 'schema' property name in ElevatorTripEvent.json

This line's property name of 'schema' seems to be inconsistent with how other 'schema' properties are defined, which seem to be either [ 'string', 'double', 'date','duration', 'boolean', 'integer', 'dateTime' ], while this 'schema' property is an object with '@type' of enum. I think this property name should be 'dtmi:dtdl:property:schema;2' if trying to be consistent with the rest of the files.

Model Uploader can't upload complete ontology

On trying to upload the complete ontology to an empty ADT instance, Model Uploader will crash with stack overflow. In my setup this happens after 5-6 models, while processing the Balcony.json file.

DTDL Version Issue ..V3 is not supporting

image
while uploading this ontology to digital twin instance it is observed that V3 is not supported only V2 supported ...@context specifier has value 'dtmi:dtdl:context;3', which specifies a DTDL version that exceeds the configured max version of 2.
where can we get V2 repository?

"dtmi:digitaltwins:rec_3_3:asset:Server;1" extends missing "dtmi:digitaltwins:rec_3_3:asset:ITHardware;1"

Current ontology models failed validation due to "dtmi:digitaltwins:rec_3_3:asset:Server;1" (Asset\Equipment\ICT\ITHardwareEquipment\Server.json) extends missing "dtmi:digitaltwins:rec_3_3:asset:ITHardware;1".

I assume there is a typo and it should reference "dtmi:digitaltwins:rec_3_3:asset:ICTHardware;1" (Asset\Equipment\ICT\ITCHardware.json), but there is one more inconsistency, file name (ITCHardware) is not matching the declaring interface (ICTHardware).

Question regarding instantiation of digital twins building

Hello,

We noticed some contradictions between the underlying dtdl framework and opendigitaltwins-building.
In particular, dtdl has orphaned the capability model with their update to: dtmi:dtdl:context;2
However, in digital twins building we noticed that the capability model has been kept.

Our questions:

  1. Is this intentional or is an update coming?
  2. what is the standard (suggested ops) to instantiate these models with the proper relationships?

Thank you for your time =)

Update/Correct description of "REC Full" section in README.md

I have noticed that "REC Full" section has mentioned about:

This full version was generated using OWL2DTDL converter which created FullBuildingRecModels.json to be uploaded into your Azure Digital Twins instance as described by upload models article.

But seems like this file was renamed to "FullBuildingModels.json" (Ontology/FullBuildingModels.json) If this readme section is supposed to point to this file, it would be great if somebody could update the name of the file and/or insert link to this file for easier navigation.

Thanks!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.