Giter Site home page Giter Site logo

platformplatform / platformplatform Goto Github PK

View Code? Open in Web Editor NEW
189.0 13.0 21.0 4.71 MB

๐Ÿš€ Pre-alpha state. A platform designed for building enterprise-grade, multi-tenant products using Azure, .NET, React, TypeScript, Infrastructure as Code, etc.

License: MIT License

C# 55.14% Shell 2.19% Bicep 7.59% HTML 0.10% JavaScript 0.63% TypeScript 33.93% CSS 0.31% Dockerfile 0.11%
azure clean-architecture dotnet entity-framework cqrs bicep github-actions azure-container-apps azure-sql managed-identities sonarcloud react react-aria-components enterprise-grade-platform dotnet-aspire

platformplatform's Introduction

PlatformPlatform Resource Groups

AppGateway AccountManagement GitHub issues with enhancement label GitHub issues with roadmap label GitHub issues with bug label

Coverage Quality Gate Status Security Rating Reliability Rating Maintainability Rating

Code Smells Vulnerabilities Bugs Technical Debt

๐Ÿ‘‹ Welcome to PlatformPlatform

Kick-start building top-tier B2B & B2C cloud SaaS products with sleek design, fully localized and accessible, clean architecture, automated and fast DevOps, and top-notch security. All in one place โ€“ at zero cost.

This is in the box:

  • Backend - .NET and C# adhering to the principles of Clean Architecture, DDD, CQRS, and clean code
  • Frontend - React using TypeScript, with a sleek fully localized UI and a mature accessible design system
  • CI/CD - GitHub actions for fast passwordless deployments of application (Docker) and infrastructure (Bicep)
  • Infrastructure - Cost efficient and scalable Azure PaaS services like Azure Container Apps, Azure SQL, etc.
  • Developer CLI - Extendable .NET CLI for DevEx - set up CI/CD is one command and a couple of questions

Still pre-alpha state, follow our up-to-date roadmap with core SaaS features like multi-tenancy, authentication, SSO, user management, telemetry, monitoring, alerts, multi-region, feature flags, back office for support, etc.

Show your support for our project โ€“ Give us a star on GitHub! It truly means a lot! โญ

Getting Started 1-2-3

TL;DR: Open the PlatformPlatform solution in Rider or Visual Studio and run the Aspire AppHost project.

Getting Started

Prerequisites

For development, you need .NET, Aspire, Docker, Node, and Yarn. And GitHub and Azure CLI for setting up CI/CD.

Install prerequisites for Windows

Open a PowerShell terminal as Administrator and run the following commands:

  • wsl --install (Windows Subsystem for Linux, required for Docker)
  • Install Chocolatey, a package manager for Windows
  • choco install dotnet-sdk git docker-desktop nodejs yarn azure-cli gh
  • dotnet workload update and dotnet workload install aspire
Install prerequisites for Mac

Open a terminal and run the following commands:

  • Install Homebrew, a package manager for Mac
  • brew install --cask dotnet-sdk
  • brew install git docker node yarn azure-cli gh
  • dotnet workload update and dotnet workload install aspire
  • dotnet dev-certs https --trust
Install prerequisites for Linux/WSL2

Open a terminal and run the following commands:

  • Install Wget

    sudo apt update && sudo apt-get install wget -y
  • Install Microsoft repository

    source /etc/os-release
    wget https://packages.microsoft.com/config/$ID/$VERSION_ID/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
    sudo dpkg -i packages-microsoft-prod.deb
    rm packages-microsoft-prod.deb
  • Install Node repository

    curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
  • Install GitHub Package repository

    (type -p wget >/dev/null || (sudo apt update && sudo apt-get install wget -y)) \
    && sudo mkdir -p -m 755 /etc/apt/keyrings \
    && wget -qO- https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo tee /etc/apt/keyrings/githubcli-archive-keyring.gpg > /dev/null \
    && sudo chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg \
    && echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null
  • Update packages

    sudo apt-get update
  • Install .NET SDK 8.0, Node, GitHub CLI

    sudo apt-get install -y dotnet-sdk-8.0 nodejs gh
  • Install .NET Aspire workload

    sudo dotnet workload update && dotnet workload install aspire
  • Install Yarn

    npm install --global yarn
  • Install Azure CLI

    curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
  • Install Certificate

    dotnet tool update -g linux-dev-certs
    dotnet linux-dev-certs install
  • Trust Certificates

    cd /usr/local/share/ca-certificates/aspnet-dev-{Environment.UserName}.crt && explorer.exe .
    # Install self signed root certificate
    
    # Open the windows certificate manager and import root certificate
    # "\\wsl.localhost\Ubuntu-20.04\home\maximus\.aspnet\dev-certs\https\platformplatform.pfx"

1. Fork and clone the repository

Forking is only required to configure GitHub repository with continuous deployments to Azure (step 3).

Our clean commit history serves as a great learning and troubleshooting resource. We recommend you keep it ๐Ÿ˜ƒ

2. Run the Aspire AppHost to spin up everything on localhost

Using .NET Aspire, docker images with SQL Server, Blob Storage, and mail server will be downloaded and started. No need install anything, or learn complicated commands. Simply run this command, and everything just works ๐ŸŽ‰

cd developer-cli
dotnet run dev # First run will be slow as Docker images are downloaded

Alternatively, open the PlatformPlatform solution in Rider or Visual Studio and run the Aspire AppHost project.

3. Set up CI/CD with passwordless deployments from GitHub to Azure

Run this command to automate Azure Subscription configuration and set up GitHub Workflows for deploying Azure Infrastructure (using Bicep) and compiling application code to Docker images deployed to Azure Container Apps:

cd developer-cli
dotnet run configure-continuous-deployments # Tip: Add --verbose-logging to show the used CLI commands

You need to be the owner of the GitHub repository and the Azure Subscription, plus have permissions to create Service Principals and Active Directory Groups.

The command will first prompt you to login to Azure and GitHub, and collect information. You will be presented with a complete list of changes before they are applied. It will look something like this:

Configure Continuous Deployments

Except for adding a DNS record, everything is fully automated. After successful setup, the command will provide simple instructions on how to configure branch policies, Sonar Cloud static code analysis, and more.

The infrastructure is configured with auto-scaling and hosting costs in focus. It will cost less than 2 USD per day for a cluster, and it will allow scaling to millions of users ๐ŸŽ‰

Inside Our Monorepo

PlatformPlatform is a monorepo containing all application code, infrastructure, tools, libraries, documentation, etc. A monorepo is a powerful way to organize a codebase, used by Google, Facebook, Uber, Microsoft, etc.

.
โ”œโ”€ .github               # Separate GitHub workflows for deploying Infrastructure and app
โ”œโ”€ application           # Contains the application source code
โ”‚  โ”œโ”€ AppHost            # .NET Aspire project starting app and all dependencies in Docker
โ”‚  โ”œโ”€ AppGateway         # Main entry point for the app using YARP as a reverse proxy 
โ”‚  โ”œโ”€ account-management # Self-contained system with account sign-up, user management, etc.
โ”‚  โ”‚   โ”œโ”€ WebApp         # React SPA frontend using TypeScript and React Aria Components
โ”‚  โ”‚   โ”œโ”€ Api            # Presentation layer exposing the API to WebApp or other clients
โ”‚  โ”‚   โ”œโ”€ Application    # Use Case layer containing CQRS Command and Query handlers 
โ”‚  โ”‚   โ”œโ”€ Domain         # Business logic containing DDD aggregates, entities, etc.
โ”‚  โ”‚   โ”œโ”€ Infrastructure # Integrations for accessing external resources (e.g., database)
โ”‚  โ”‚   โ”œโ”€ Workers        # Background workers for long-running tasks and event processing
โ”‚  โ”‚   โ””โ”€ Tests          # Tests for the API, Application, Domain, and Infrastructure
โ”‚  โ”œโ”€ shared-kernel      # Reusable components for all self-contained systems
โ”‚  โ”œโ”€ [saas-scs]         # [Your SCS] Create your SaaS product as a self-contained system
โ”‚  โ””โ”€ [back-office]      # [Planned] A self-contained system for operations and support
โ”œโ”€ cloud-infrastructure  # Contains Bash and Bicep scripts (IaC) for Azure resources
โ”‚  โ”œโ”€ cluster            # Scale units like production-west-eu, production-east-us, etc.
โ”‚  โ”œโ”€ environment        # Shared resources like App Insights for all Production clusters
โ”‚  โ”œโ”€ shared             # Azure Container Registry shared between all environments
โ”‚  โ””โ”€ modules            # Reusable Bicep modules like Container App, SQL Server, etc.
โ””โ”€ development-cli       # A .NET CLI tool for automating common developer tasks

** A Self-Contained System is a large microservice (or a small monolith) that contains the full stack, including frontend, background jobs, etc. These can be developed, tested, deployed, and scaled in isolation.

Technologies

.NET 8 Backend With Clean Architecture, DDD, CQRS, Minimal API, and Aspire

The backend is built using the most popular, mature, and commonly used technologies in the .NET ecosystem:

Read more about the backend architecture
  • Clean Architecture: The codebase is organized into layers that promote separation of concerns and maintainability.
  • Domain-Driven Design (DDD): DDD principles are applied to ensure a clear and expressive domain model.
  • Command Query Responsibility Segregation (CQRS): This clearly separates read (query) and write (command) operations, adhering to the single responsibility principle (each action is in a separate command).
  • Screaming architecture: The architecture is designed with namespaces (folders) per feature, making the concepts easily visible and expressive, rather than organizing the code by types like models and repositories.
  • MediatR pipelines: MediatR pipeline behaviors are used to ensure consistent handling of cross-cutting concerns like validation, unit of work, and handling of domain events.
  • Strongly Typed IDs: The codebase uses strongly typed IDs, which are a combination of the entity type and the entity ID. This is even at the outer API layer, and Swagger translates this to the underlying contract. This ensures type safety and consistency across the codebase.
  • JetBrains Code style and Cleanup: JetBrains Rider/ReSharper is used for code style and automatic cleanup (configured in .DotSettings), ensuring consistent code formatting. No need to discuss tabs vs. spaces anymore; Invalid formatting breaks the build.
  • Monolith prepared for self-contained systems: The codebase is organized into a monolith, but the architecture is prepared for splitting in to self-contained systems. A self-contained system is a large microservice (or a small monolith) that contains the full stack including frontend, background jobs, etc. These can be developed, tested, deployed, and scaled in isolation, making it a good compromise between a large monolith and many small microservices. Unlike the popular backend-for-frontend (BFF) style with one shared frontend, this allows teams to work fully independently.
  • Shared Kernel: The codebase uses a shared kernel for all the boilerplate code required to build a clean codebase. The shared kernel ensures consistency between self-contained systems, e.g., enforcing tenant isolation, auditing, tracking, implementation of tactical DDD patterns like aggregate, entities, repository base, ID generation, etc.

Although some features like authentication and multi-tenancy are not yet implemented, the current implementation serves as a solid foundation for building business logic without unnecessary boilerplate.

React Frontend With TypeScript, React Aria Components, and Node

The frontend is built with these technologies:

Azure Cloud Infrastructure With Enterprise-Grade Security and Zero Secrets

PlatformPlatform's cloud infrastructure is built using the latest Azure Platform as a Service (PaaS) technologies:

Read more about this enterprise-grade architecture
  • Platform as a Service (PaaS) technologies: Azure is the leading Cloud Service Provider (CSP) when it comes to PaaS technologies. PlatformPlatform uses PaaS technologies which are fully managed by Microsoft, as opposed to Infrastructure as a Service (IaaS) technologies where the customer is responsible for the underlying infrastructure. This means that Microsoft is responsible for the availability of the infrastructure, and you are only responsible for the application and data. This makes it possible for even a small team to run a highly scalable, stable, and secure solution.
  • Enterprise-grade security with zero secrets:
    • Managed Identities: No secrets are used when Container Apps connect to e.g. Databases, Blob Storage, and Service Bus. The infrastructure uses Managed Identities for all communication with Azure resources, eliminating the need for secrets.
    • Federated credentials: Deployment from GitHub to Azure is done using federated credentials, establishing a trust between the GitHub repository and Azure subscription based on the repository's URL, without the need for secrets.
    • No secrets expires: Since no secrets are used, there is no need to rotate secrets, and no risk of secrets expiring.
    • 100% Security Score: The current infrastructure configuration follows best practices, and the current setup code achieves a 100% Security Score in Microsoft Defender for Cloud. This minimizes the attack surface and protects against even sophisticated attacks.
  • Automatic certificate management: The infrastructure is configured to automatically request and renew SSL certificates, eliminating the need for manual certificate management.
  • Multiple environments: The setup includes different environments like Development, Staging, and Production, deployed into clearly named resource groups within a single Azure Subscription.
  • Multi-region: Spinning up a cluster in a new region is a matter of adding one extra deployment job to the GitHub workflow. This allows customers to select a region where their data is close to the user and local data protection laws like GDPR, CCPA, etc. are followed.
  • Azure Container Apps: The application is hosted using Azure Container Apps, which is a new service from Azure that provides a fully managed Kubernetes environment for running containerized applications. You don't need to be a Kubernetes expert to run your application in a scalable and secure environment.
  • Scaling from zero to millions of users: The Azure Container App Environment is configured to scale from zero to millions of users, and the infrastructure is configured to scale automatically based on load. This means the starting costs are very low, and the solution can scale to millions of users without any manual intervention. This enables having Development and Staging environments running with very low costs.
  • Azure SQL: The database is hosted using Azure SQL Database, which is a fully managed SQL Server instance. SQL Server is known for its high performance, stability, scalability, and security. The server will easily handle millions of users with single-digit millisecond response times.

Screenshots

This is how it looks when GitHub workflows has deployed Azure Infrastructure:

GitHub Environments

These are the resource groups created when deploying one staging cluster, and two production clusters:

PlatformPlatform Resource Groups

This is the security score after deploying PlatformPlatform resources to Azure. Achieving a 100% security score in Azure Defender for Cloud without exemptions is not trivial.

Azure Security Recommendations

https://123456789012345678901234.blob.core.windows.net/profileimages/01HS13BVF09A8AYYCMR2T9P7ZN.png

platformplatform's People

Contributors

bluebasher avatar dependabot[bot] avatar janmechtel avatar martinrl avatar maximus404 avatar mstypsan avatar platformplatformadmin avatar raix avatar tjementum 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

platformplatform's Issues

Frontend foundation

Tasks

  1. enhancement
    raix
  2. enhancement
    raix tjementum
  3. 4 of 4
    enhancement
    raix

https://component.gallery/design-systems/

Front end foundation

Customizable Components - Customizable Foundation More than foundation, some custom stiles

Design Systems

These are full frameworks. Recognizable like Bootstrap.

Validation

  • Zod

Forms state management

Used for validation, blurring, interactions, are not part of Design Systems

  • React Hook From (with Zod)

Router

  • React Router

Animations

  • React Spring
  • Ant Motion if going with Ant Desing

Back office

Tasks

Add fake data generators library

Alternatives:

  • AutoFixture is designed to minimize the 'Arrange' phase of your unit tests in order to maximize maintainability. Its primary goal is to allow developers to focus on what is being tested rather than how to setup the test scenario, by minimizing the setup phase. It can be used to create anonymous variables of almost any type, to fill properties for complex object graphs and a lot more.
  • Bogus is a simple and sane fake data generator for .NET languages like C#, F# and VB.NET. It is fundamentally a C# port of faker.js and inspired by FluentValidation's syntax sugar. It can be used to generate realistic but not real data for testing or for populating databases with realistic data.

Security systems

Tasks

Multi region setup

Tasks

GitHub setup

Tasks

  1. enhancement
    tjementum
  2. enhancement
    tjementum
  3. enhancement
    tjementum

Clean Architecture and DDD foundation

Tasks

  1. enhancement
    tjementum
  2. enhancement
    tjementum
  3. enhancement
    tjementum
  4. enhancement
    tjementum
  5. documentation enhancement
    tjementum
  6. enhancement
    tjementum
  7. enhancement
    tjementum
  8. enhancement
    tjementum
  9. enhancement
    tjementum
  10. enhancement
    tjementum
  11. enhancement
    tjementum
  12. enhancement
    tjementum
  13. enhancement
    tjementum
  14. enhancement
    tjementum
  15. enhancement
    tjementum
  16. enhancement
    tjementum
  17. enhancement
    tjementum
  18. enhancement
    tjementum
  19. enhancement
    tjementum
  20. enhancement
    tjementum
  21. enhancement
    tjementum
  22. enhancement
    tjementum

Tracking and logging

Database schema and data migrations

Tasks

Problem

In .NET Entity Framework, there can be several database schema migrations. However, between each Database migration, there might be the need to have data migration don by code code.Example:

  1. Schema migration: Add new FirstName and LastName columns to the Users table that allows null
  2. Data migration that populates the new columns from the existing Users.DisplayName column using C# code
  3. Schema migration: Remove the null check and delete the old DisplayName column

This is just a simple example. The solution should handle that many complex migrations are run in a certain order, if a system has not been updated for some time (e.g. Schema, Data, Schema, Schema, Data, Schema, Data).

How can I create a good migration strategy that runs as part of the Application startup?

Solution 1

Use SQL .dbproj and DacPac: Power your DevOps Development with SQL Server Containers

Solution 2

Managing database migrations and code transformations in a sequential and reliable manner is indeed an important aspect of maintaining a robust application, especially in a complex domain-driven design project. Your problem is about orchestrating these operations in a way that ensures database integrity and data consistency.

For .NET and Entity Framework, you have a tool called EF Migrations which can handle database schema changes. However, EF Migrations doesn't inherently support code migrations that transform data between schema migrations.

Here is an approach you might consider:

  1. Separate Schema Migrations and Data Migrations: Separate schema migrations (handled by EF Migrations) and data migrations (custom scripts for data transformations).
  2. Sequential Naming Convention: Adopt a naming convention for your migrations that includes a sequence number (e.g., 001_AddColumns, 002_PopulateColumns, 003_RemoveNullCheck). This will ensure that migrations are executed in the correct order.
  3. Custom Migration Runner: Implement a custom migration runner that executes at application startup. This runner should:
  • Run the EF Migrations up to the point where a data migration is needed.

  • Run the corresponding data migration scripts.

  • Continue with the rest of the EF Migrations.

    This could be achieved by using the DbContext.Database.Migrate() method to apply the EF
    Migrations and a custom method to execute the data migrations. The data migration scripts could be SQL scripts or C# scripts depending on the complexity of the data transformations.

  1. Idempotent Migrations: Make sure your migrations are idempotent - that is, they can be run multiple times without causing issues. This is important as migrations might fail and need to be rerun.
  2. Test Your Migrations: Always test your migrations, ideally in an environment that mirrors your production environment.

This solution allows you to manage both schema migrations and data transformations in a sequential manner. It also makes sure the order of operations is preserved when you deploy to different environments.

Remember that handling migrations this way could potentially cause longer downtimes during deployment, especially for large data migrations. So, you need to plan your deployments carefully.

Solution 3

A more naรฏve approach would be to run migration as part of the application startup. If not done carefully this might cause race conditions. One way to avoid Race conditions is to use "Init containers":

Generally available: Init containers in Azure Container Apps
Published date: August 16, 2023
The init containers feature in Azure Container Apps is now generally available. Init containers are specialized containers that run to completion before application containers are started in a replica, and they can contain utilities or setup scripts not present in your container app image. Init containers are useful for performing initialization logic such as setting up accounts, running setup scripts, and configuring databases.

To learn more, visit: https://aka.ms/aca/init-containers

User management

Tasks

Cloud infrastructure

Tasks

  1. enhancement
    tjementum
  2. enhancement
    tjementum
  3. enhancement
    tjementum
  4. enhancement
    tjementum
  5. enhancement
    tjementum
  6. enhancement
    tjementum
  7. enhancement
    tjementum
  8. enhancement
    tjementum
  9. enhancement
    tjementum
  10. enhancement
    tjementum
  11. enhancement
    tjementum
  12. enhancement
    tjementum
  13. enhancement
    tjementum
  14. enhancement
    tjementum
  15. enhancement
    tjementum
  16. enhancement
    tjementum
  17. enhancement
    tjementum
  18. enhancement
    tjementum
  19. enhancement
    tjementum
  20. enhancement
    tjementum
  21. enhancement
    tjementum

Require that contributes sign the Contributor License Agreement (CLA)

We can make signing a Contributor License Agreement (CLA) part of the workflow in GitHub using a few tools or by integrating CLA signing into your repository. There are several ways to implement this:

  1. Use CLA bots: You can use CLA assistant bots like the CLA Assistant (https://cla-assistant.io) to automate the process of signing CLAs. Once set up, the bot will automatically prompt new contributors to sign the CLA before their pull requests can be merged. It will also check if the contributor has already signed the CLA and, if not, guide them through the process.
  2. Use GitHub Actions: You can create a custom GitHub Action that enforces CLA signing for every pull request. The action can check if the contributor has signed the CLA and, if not, prompt them to sign it before their pull request can be merged.
  3. Manual process: You can create a CONTRIBUTING.md file in your repository that describes the process of signing the CLA and include a link to the CLA document. You can then ask contributors to email you a signed copy or use a digital signing service. This method requires manual verification and can be time-consuming.

By incorporating CLA signing into your workflow, you can ensure that all contributors agree to the terms before their contributions are merged into the project, providing you with more control over the use and distribution of the software.

Tenant management

Tasks

Continuous Integration (CI)

Tasks

  1. enhancement
    tjementum
  2. enhancement
    tjementum
  3. enhancement
    tjementum
  4. enhancement
    tjementum
  5. enhancement
    tjementum
  6. enhancement
    tjementum

Authentication

Tasks

  1. enhancement
  2. enhancement

https://www.youtube.com/@duendesoftware

Json Web Token RFC: https://www.rfc-editor.org/rfc/rfc8725

See an example here:
https://github.com/jasontaylordev/CleanArchitecture
https://www.youtube.com/watch?v=dK4Yb6-LxAk

Introducing the Identity API endpoints in .NET8:
https://andrewlock.net/exploring-the-dotnet-8-preview-introducing-the-identity-api-endpoints/

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.