Code Monkey home page Code Monkey logo

carbon-kernel's Introduction

Welcome to WSO2 Carbon Kernel

WSO2 Carbon Kernel 5 is the core of the next-generation WSO2 Carbon platform.

Carbon Kernel 5 is completely rearchitected from the ground up with the latest technologies and patterns. Additionally, the Carbon Kernel is now a lightweight, general-purpose OSGi runtime specializing in hosting servers, providing key functionality for server developers. The result is a streamlined and even more powerful middleware platform than ever before.

Architecture

Carbon Kernel is a modular, light-weight, OSGi-based server development framework, which provides the base for developing servers. Eclipse Equinox is used as the OSGi runtime from Kernel 5.0.0 onwards. However, you can plug in any OSGi implementation to your Carbon server. The diagram below depicts the architecture of WSO2 Carbon Kernel and its key components.

carbon-kernel-architecture-01

Key Features and Tools

Follow the links given below for details of the core capabilities of Carbon Kernel.

Follow the links given below for details of tools, archetypes and other capabilities that can be used for developing Carbon products.

Follow the links given below for details of plugins:

Getting Started

See the steps for setting up and starting a WSO2 Carbon server.

How To Contribute

Contact Us

WSO2 developers can be contacted via the mailing lists:

carbon-kernel's People

Contributors

afkham avatar anugayan avatar arunasujith avatar callkalpa avatar chirangaalwis avatar cnapagoda avatar daneshk avatar darshanasbg avatar dinushab avatar dnwick avatar imesh avatar jsdjayanga avatar kasunbg avatar kishanthan avatar lakshmanudayakantha avatar manoj-kristhombu avatar manuri avatar mohanvive avatar nilminiwso2 avatar nipuni avatar niranjan-k avatar pcnfernando avatar sameerajayasoma avatar senthuran16 avatar shan1024 avatar susankha avatar thanu avatar this avatar vidurananayakkara avatar wso2-jenkins-bot 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

carbon-kernel's Issues

typo in the startuporderresolver log

There is a typo in the following WARN level log for StartupComponentManager

[2016-11-28 12:35:57,960] WARN {org.wso2.carbon.kernel.internal.startupresolver.StartupComponentManager} - You are trying to add an available capability org.wso2.msf4j.Microservice from bundle(org.wso2.carbon.uuf.httpconnector.msf4j:1.0.0.SNAPSHOT) to an already activated startup listener component wso2-microservices-server in bundle(msf4j-core:2.1.0). Refer the Startup Order Resolver documentation and validated your configuration

Fatal error compiling: invalid target release: 1.8

I got this error when building this project:

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 21:10 min
[INFO] Finished at: 2016-02-03T11:59:04+00:00
[INFO] Final Memory: 39M/448M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.3:compile (default-compile) on project org.wso2.carbon.launcher: Fatal error compiling: invalid target release: 1.8 -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
[ERROR]
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR] mvn -rf :org.wso2.carbon.launcher

How to fix this?

Correct place to set carbon server start up time

In the current implementation, carbon server startup time is set as the first step in Main class [1] and then again it's reset in CarbonServer start() in [2].

Don't we need to set the startup time as in [1] considering the time needed to load carbon server configurations?

Remove carbon.product

Currently carbon.product is used when creating the distribution. This is required by carbon-feature-plugin version 3.0.0, but with [1], this is being removed. Once carbon-feature-plugin is released with this feature, update carbon-kernel to support this.

[1] - wso2/carbon-maven-plugins#57

[Warnings] JavaDoc warning in Config Resolver

The following is printed when trying to build carbon-kernel:

[WARNING] Javadoc Warnings
[WARNING] /home/nira/wso2/git/carbon-kernel/core/src/main/java/org/wso2/carbon/kernel/configresolver/ConfigResolverUtils.java:40: warning: no @param for rootElement
[WARNING] public static String convertYAMLToXML(String yamlString, String rootElement) {
[WARNING] ^
[WARNING] /home/nira/wso2/git/carbon-kernel/core/src/main/java/org/wso2/carbon/kernel/configresolver/ConfigResolverUtils.java:51: warning: no @param for rootElement
[WARNING] public static String convertXMLToYAML(String xmlString, String rootElement) {
[WARNING] ^
[WARNING] /home/nira/wso2/git/carbon-kernel/core/src/main/java/org/wso2/carbon/kernel/configresolver/ConfigResolverUtils.java:75: warning: no @param for rootElement
[WARNING] public static String convertJSONToYAML(String jsonString, String rootElement) {
[WARNING] ^
[WARNING] /home/nira/wso2/git/carbon-kernel/core/src/main/java/org/wso2/carbon/kernel/configresolver/ConfigResolverUtils.java:93: warning: no @param for rootElement
[WARNING] public static String convertJSONToXML(String jsonString, String rootElement) {
[WARNING] ^
[WARNING] /home/nira/wso2/git/carbon-kernel/core/src/main/java/org/wso2/carbon/kernel/configresolver/ConfigResolverUtils.java:142: warning: no @param for rootElement
[WARNING] public static String convertPropertiesToXml(InputStream inputStream, String rootElement) {
[WARNING] ^
[WARNING] /home/nira/wso2/git/carbon-kernel/core/src/main/java/org/wso2/carbon/kernel/configresolver/ConfigResolverUtils.java:166: warning: no @param for rootElement
[WARNING] public static String convertXMLToProperties(String xmlString, String rootElement) {
[WARNING] ^
[WARNING] /home/nira/wso2/git/carbon-kernel/core/src/main/java/org/wso2/carbon/kernel/configprovider/ConfigFileReader.java:36: warning: no @throws for org.wso2.carbon.kernel.configprovider.CarbonConfigurationException
[WARNING] public Map<String, String> getDeploymentConfiguration() throws CarbonConfigurationException;
[WARNING] ^
[WARNING] /home/nira/wso2/git/carbon-kernel/core/src/main/java/org/wso2/carbon/kernel/configprovider/ConfigProvider.java:35: warning: no description for @throws
[WARNING] * @throws CarbonConfigurationException
[WARNING] ^
[WARNING] /home/nira/wso2/git/carbon-kernel/core/src/main/java/org/wso2/carbon/kernel/configprovider/ConfigProvider.java:43: warning: no description for @throws
[WARNING] * @throws CarbonConfigurationException
[WARNING] ^
[WARNING] /home/nira/wso2/git/carbon-kernel/core/src/main/java/org/wso2/carbon/kernel/configprovider/utils/ConfigurationUtils.java:48: warning: no @param for filename
[WARNING] public static Path getConfigurationFileLocation(String filename) {
[WARNING] ^

Wait for a capability by the name of the capability given dynamically.

[Moved from carbon-kernel jira]

Current required capability listener can wait until the given number of capabilities are available, but this number of capabilities are decide at the compile time and there is no way to decide them dynamically at the run time. There are some use cases where the component should only wait for capabilities that decided by a configuration file or some run time configuration. To cater this requirement, following features will be useful.

  1. Feature to decide required capabilities in the run time based on an OSGi property and to give the list of required capabilities dynamically.
  2. Feature to give a custom error message when a capability is not available as the current error message is only showing what type of capability it is waiting for.
    See mail: Improvements For The OSGi Required Capability Listiner

Runtime specific carbon.pid

Currently carbon.pid is created at <CARBON_HOME> location, but this is an issue when there are multiple runtimes and all start at the same time. This needs to be changed so that the pid file is specific for each runtime.

Username get appended with '$USERNAME_SEPARATOR$' when user has a different display name.

When displayname attribute is enabled for LDAP based user stores, '$USERNAME_SEPARATOR$' string is appended in user name when the users display name is different from user name.

This issue does not exist when viewing users list through Carbon Management Console, issue only occurs once we select a role and view it's assigned users or when assigning new users to a role via Carbon Management Console.

Expected behavior is showing 'domainName/username|domainname/displayname'

Re-structure C5 kernel OSGi related directories

This p/r is to resolve CARBON-16076.

The carbon kernel OSGi related directories have been re-structured as follow:
(Only OSGi related directories are mentioned here)

<CARBON_HOME>
├── lib   
│   └── README.txt
└── wso2
    ├── default
    └── lib
        ├── artifacts.xml
        ├── features
        ├── p2
        ├── plugins
        └── README.txt
  1. lib - Addtional OSGi bundles needed for carbon servers can be added here. It's similar to /osgi/dropins directory in kernel 5.2.0-m2

  2. wso2 - This directory will have following sub directories:
    2.1. lib - This will be the OSGi Repository for carbon which will have features, plugins and p2 directories.
    2.2. profile-n - This directory will be profile-n directory which will have all the profile-n's configurations. The 'default' profile will be as below:

<CARBON_HOME>
└── wso2
    ├── default
    │   ├── configuration
    │   │   ├── config.ini
    │   │   ├── org.eclipse.equinox.simpleconfigurator
    │   │   └── org.eclipse.update
    │   └── eclipse.ini

A way to change default startup message

Currently kernel gives the following startup message when the server is started.

[2016-12-09 08:24:36,676] INFO {org.wso2.carbon.kernel.internal.CarbonStartupHandler} - WSO2 Carbon started in xxx sec

At the moment message is hard cored in CarbonStartupHandler.
logger.info("WSO2 Carbon started in " + decimalFormatter.format(startupTime) + " sec");

We need a way to customize this message.

Probably through filter.properties file in distribution.

[1] https://github.com/wso2/carbon-kernel/blob/master/core/src/main/java/org/wso2/carbon/kernel/internal/CarbonStartupHandler.java

Build from source failed

JDK 1.7
Maven: 3.3.3
Carbon-kernel master commit 489a4d1

>mvn eclipse:eclipse
...
[ERROR] Failed to execute goal on project org.wso2.carbon.test.feature1: Could n
ot resolve dependencies for project org.wso2.carbon:org.wso2.carbon.test.feature
1:pom:1.0.0-SNAPSHOT: Could not find artifact org.wso2.carbon:org.wso2.carbon.te
st.component1:jar:1.0.0-SNAPSHOT in wso2.releases (http://maven.wso2.org/nexus/c
ontent/repositories/releases/) -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e swit
ch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please rea
d the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/DependencyReso
lutionException
[ERROR]
[ERROR] After correcting the problems, you can resume the build with the command

[ERROR]   mvn <goals> -rf :org.wso2.carbon.test.feature1

Non-OSGi datasource and secure vault components

We have a requirement where the carbon datasource and secure vault components will need to be accessed from a non-OSGi environment. Could you please do the needful so that the services there are exposed through Java SPI as well, so that they could be loaded from this non-OSGi environment.

Separate the Bundles and standalone jars into separate features

The Kernel features contains both bundles, which can be installed to multiple runtimes and standalone jars. This needs to be separate out, so that the feature that contains the standalone jars is installed into one runtime and is removed from features folder in the pack.

[Warnings] Javadoc warning in Secure vault

The following is printed when trying to build carbon-kernel:

[WARNING] /home/nira/wso2/git/carbon-kernel/core/src/main/java/org/wso2/carbon/kernel/securevault/SecureVaultUtils.java:165: warning: no description for @throws
[WARNING] * @throws SecureVaultException
[WARNING] ^
[WARNING] /home/nira/wso2/git/carbon-kernel/core/src/main/java/org/wso2/carbon/kernel/securevault/SecureVaultUtils.java:183: warning: no @param for matcher
[WARNING] public static String substituteVariables(String value, Matcher matcher, Function<String, String> function)
[WARNING] ^
[WARNING] /home/nira/wso2/git/carbon-kernel/core/src/main/java/org/wso2/carbon/kernel/securevault/SecureVaultUtils.java:183: warning: no @param for function
[WARNING] public static String substituteVariables(String value, Matcher matcher, Function<String, String> function)
[WARNING] ^
[WARNING] /home/nira/wso2/git/carbon-kernel/core/src/main/java/org/wso2/carbon/kernel/securevault/SecureVaultUtils.java:183: warning: no @throws for org.wso2.carbon.kernel.securevault.exception.SecureVaultException
[WARNING] public static String substituteVariables(String value, Matcher matcher, Function<String, String> function)
[WARNING] ^
[WARNING] /home/nira/wso2/git/carbon-kernel/core/src/main/java/org/wso2/carbon/kernel/internal/DataHolder.java:82: warning: no description for @param
[WARNING] * @param optConfigResolver
[WARNING] ^
[WARNING] /home/nira/wso2/git/carbon-kernel/core/src/main/java/org/wso2/carbon/kernel/internal/DataHolder.java:100: warning: no description for @param
[WARNING] * @param configProvider
[WARNING] ^

Javadocs are missing for some of the private and public methods for this feature.

Maven Configuration Plugin - configurations with multiple elements are not properly written to the config file

    @Element(description = "MSF4J transport configuration")
    private TransportsConfigurable transportsConfiguration = new TransportsConfiguration();

    @Element(description = "MSf4J configuration")
    private MSF4JConfigurable msf4JConfigurable = new MSF4JConfiguration();

For instance, considering the above configuration, the file would be generated as follows:

    # MSF4J transport configuration
  transportsConfiguration: !!org.wso2.msf4j.configuration.transport.TransportsConfiguration {}
    # MSf4J configuration
  msf4JConfigurable: !!org.wso2.msf4j.configuration.msf4j.MSF4JConfiguration {}

As stated above, a configuration with a tree structure will not be written properly to the files

[Warning] JavaDocs warning in kernel core

The following is printed when trying to build carbon-kernel:

[WARNING] /home/nira/wso2/git/carbon-kernel/core/src/main/java/org/wso2/carbon/kernel/internal/CarbonStartupHandler.java:39: warning: no @param for serverName
[WARNING] public static void logServerStartupTime(String serverName) {
[WARNING] ^
[WARNING] /home/nira/wso2/git/carbon-kernel/core/src/main/java/org/wso2/carbon/kernel/utils/manifest/ManifestElement.java:340: warning: no @param for bundle
[WARNING] public static List parseHeader(String header, String value, Bundle bundle)
[WARNING] ^

Utils.getCarbonConfigHome() throws an NPE in non-Carbon environments

In a piece of code which can be common to Carbon and non-Carbon environments, the usage of Utils.getCarbonConfigHome() throws an NPE in non-Carbon environments since the System.getenv(Constants.CARBON_HOME_ENV) call fails.

Ideally, in such cases, an exception should be thrown so that the calling party can proceed accordingly.

Maven Configuration Plugin - in proper configuration when specifying reference variables

Maven configuration plugin will not produce the proper output when reference variables are present as elements.

For instance, consider the example below:

private List<ListenerConfiguration> listenerConfigurations =
            Arrays.asList(new HttpListenerConfiguration(), new HttpsListenerConfiguration());

The output the above gives currently is as shown below:

listenerConfigurations:
  - {}
  - {}

Assuming ListenerConfiguration class has the @Configuration annotation present.

However, the proper output should be

listenerConfigurations:
-
  id: "msf4j-http"
  host: "127.0.0.1"
  port: 8080
-
  id: "jaxrs-http"
  host: "0.0.0.0"
  port: 8094
  scheme: https
  keyStoreFile: "src/test/resources/cert.jks"
  keyStorePass: secret
  certPass: secret

Timing issue in StartupOrderResolver

[Moved from [carbon-kernel jira(https://wso2.org/jira/browse/CARBON-15998)]

It seems there is a race condition in,

  1. OSGi framework notifying a component on a dependency (@reference()) and
  2. StartupOrderResolver notifying a component when all capabilities are ready
    So, a component sometimes notified via the "onAllRequiredCapabilitiesAvailable" before it actually get notified via OSGi framework about the service availability

Startup Order Resolver in C5 does not work with Maven Bundle Plugin 3.0.*

There is a different in the generated value of the Provide-Capability manifest header. See the below comparison.
With Maven bundle plugin 2.5.4 (WSO2 parent pom v2)
Provide-Capability: osgi.service;objectClass:List="org.wso2.carbon.kernel.startupresolver.RequiredCapabilityListener"
With Maven bundle plugin 3.0.1 (WSO2 parent pom v3)
Provide-Capability: osgi.service;objectClass="org.wso2.carbon.kernel.startupresolver.RequiredCapabilityListener"

Can't start with profile flag

Can't start with profiling jvm parameter.

$ export JAVA_OPTS='-prof'
$ ./carbon.sh

Throws:

Exception in thread "main" java.lang.NoClassDefFoundError: java/lang/invoke/LambdaForm$MH
    at com.sun.demo.jvmti.hprof.Tracker.nativeCallSite(Native Method)
    at com.sun.demo.jvmti.hprof.Tracker.CallSite(Tracker.java:99)
    at java.lang.invoke.InvokerBytecodeGenerator.emitNewArray(InvokerBytecodeGenerator.java:889)
    at java.lang.invoke.InvokerBytecodeGenerator.generateCustomizedCodeBytes(InvokerBytecodeGenerator.java:688)
    at java.lang.invoke.InvokerBytecodeGenerator.generateCustomizedCode(InvokerBytecodeGenerator.java:618)
    at java.lang.invoke.LambdaForm.compileToBytecode(LambdaForm.java:654)
    at java.lang.invoke.LambdaForm.prepare(LambdaForm.java:635)
    at java.lang.invoke.MethodHandle.<init>(MethodHandle.java:461)
    at java.lang.invoke.BoundMethodHandle.<init>(BoundMethodHandle.java:56)
    at java.lang.invoke.BoundMethodHandle$Species_L.<init>(BoundMethodHandle.java:209)
    at java.lang.invoke.BoundMethodHandle$Species_L.copyWith(BoundMethodHandle.java:226)
    at java.lang.invoke.MethodHandle.asCollector(MethodHandle.java:1002)
    at java.lang.invoke.MethodHandleImpl$AsVarargsCollector.<init>(MethodHandleImpl.java:460)
    at java.lang.invoke.MethodHandleImpl$AsVarargsCollector.<init>(MethodHandleImpl.java:454)
    at java.lang.invoke.MethodHandleImpl.makeVarargsCollector(MethodHandleImpl.java:445)
    at java.lang.invoke.MethodHandle.setVarargs(MethodHandle.java:1325)
    at java.lang.invoke.MethodHandles$Lookup.getDirectMethodCommon(MethodHandles.java:1666)
    at java.lang.invoke.MethodHandles$Lookup.getDirectMethod(MethodHandles.java:1601)
    at java.lang.invoke.MethodHandles$Lookup.findStatic(MethodHandles.java:778)
    at java.lang.invoke.MethodHandleImpl$Lazy.<clinit>(MethodHandleImpl.java:627)
    at java.lang.invoke.MethodHandleImpl.varargsArray(MethodHandleImpl.java:1506)
    at java.lang.invoke.MethodHandleImpl.varargsArray(MethodHandleImpl.java:1623)
    at java.lang.invoke.MethodHandle.asCollector(MethodHandle.java:999)
    at java.lang.invoke.MethodHandleImpl$AsVarargsCollector.<init>(MethodHandleImpl.java:460)
    at java.lang.invoke.MethodHandleImpl$AsVarargsCollector.<init>(MethodHandleImpl.java:454)
    at java.lang.invoke.MethodHandleImpl.makeVarargsCollector(MethodHandleImpl.java:445)
    at java.lang.invoke.MethodHandle.setVarargs(MethodHandle.java:1325)
    at java.lang.invoke.MethodHandles$Lookup.getDirectMethodCommon(MethodHandles.java:1666)
    at java.lang.invoke.MethodHandles$Lookup.getDirectMethod(MethodHandles.java:1601)
    at java.lang.invoke.MethodHandles$Lookup.findStatic(MethodHandles.java:778)
    at java.lang.invoke.CallSite.<clinit>(CallSite.java:226)
    at java.lang.invoke.MethodHandleNatives.linkCallSiteImpl(MethodHandleNatives.java:307)
    at java.lang.invoke.MethodHandleNatives.linkCallSite(MethodHandleNatives.java:297)
    at org.wso2.carbon.launcher.Main.processCmdLineArgs(Main.java:170)
    at org.wso2.carbon.launcher.Main.main(Main.java:64)

Maven Configuration Plugin - Collections without specifying the argument type and collections with argument types which do not have @Configuration annotation will provide improper configuration

Specifying

private List listenerConfigurations =
            Arrays.asList(new HttpListenerConfiguration(), new HttpsListenerConfiguration());

will throw an exception. However

private List<Object> listenerConfigurations =
            Arrays.asList(new HttpListenerConfiguration(), new HttpsListenerConfiguration());

will work and produce an output as stated below:

listenerConfigurations:
    - !!org.wso2.msf4j.configuration.transport.listener.HttpListenerConfiguration {}
    - !!org.wso2.msf4j.configuration.transport.listener.HttpsListenerConfiguration {}

In case if we specify without specifying the argument type, the maven configuration plugin should ideally throw a warning and ignore the element assuming that the argument type is of Object type.

Furthermore specifying an argument type that do not have the @Configuration annotation also should ideally throw a warning and ignore the element

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.