Giter VIP home page Giter VIP logo

papermc-docker's Introduction

PaperMC Docker

This is a Linux Docker image for the PaperMC Minecraft server.

PaperMC is an optimized Minecraft server with plugin support (Bukkit, Spigot, Sponge, etc.). This image provides a basic PaperMC server. All customizations are left to the user.

Usage

It is assumed that the user has already acquired a working Docker installation. If that is not the case, go do that and come back here when you're done.

Command

With this image, you can create a new PaperMC Minecraft server with one command (note that running said command indicates agreement to the Minecraft EULA). Here is an example:

sudo docker run -p 25565:25565 -e EULA="true" phyremaster/papermc

While this command will work just fine in many cases, it is only the bare minimum required to start a functional server and can be vastly improved by specifying some...

Options

There are several command line options that users may want to specify when utilizing this image. These options are listed below with some brief explanation. An example will be provided with each. In the example, the part that the user can change will be surrounded by angle brackets (< >). Remember to remove the angle brackets before running the command.

  • Port
    • This option must be specified. Use port 25565 if you don't know what this is.
    • Set this to the port number that the server will be accessed from.
    • If RCON is to be used, this option must be specified a second time for port 25575.
    • -p <12345>:25565
    • -p <12345>:25565 -p <6789>:25575
  • Volume
    • Set this to a name for the server's Docker volume (defaults to randomized gibberish).
    • Alternatively, set this to a path to a folder on your computer.
    • -v <my_volume_name>:/papermc
    • -v </path/to/files>:/papermc
  • Detached
    • Include this to make the container independent from the current command line.
    • -d
  • Terminal/Console
    • Include these flags if you want access to the server's command line via docker attach.
    • These flags can be specified separately or as one option.
    • -t and -i in any order
    • -ti or -it
  • Restart Policy
    • If you include this, the server will automatically restart if it crashes.
    • Stopping the server from its console will still stop the container.
    • It is highly recommended to only stop the server from its console (not via Docker).
    • --restart on-failure
  • Name
    • Set this to a name for the container (defaults to a couple of random words).
    • --name "<my-container-name>"

There is one more command line option, but it is a bit special and deserves its own section.

Environment Variables

Environment variables are options that are specified in the format -e <NAME>="<VALUE>" where <NAME> is the name of the environment variable and <VALUE> is the value that the environment variable is being set to. Please note that setting an evironment variable with no value does not leave it at default; instead, this sets it to an empty string, which may cause issues. This image has four environment variables:

  • Minecraft Version
    • Name: MC_VERSION
    • Set this to the Minecraft version that the server should support.
    • Note: there must be a PaperMC release for the specified version of Minecraft.
    • If this is not set, the latest version supported by PaperMC will be used.
    • Changing this on an existing server will change the version without wiping the server.
    • -e MC_VERSION="<latest>"
  • PaperMC Build
    • Name: PAPER_BUILD
    • Set this to the number of the PaperMC build that the server should use (not the Minecraft version).
    • If this is not set, the latest PaperMC build for the specified MC_VERSION will be used.
    • Changing this on an existing server will change the version without wiping the server.
    • -e PAPER_BUILD="<latest>"
  • EULA
    • Name: EULA
    • Set this to true to accept the Minecraft server EULA
    • The server will not start if this is not set to true
    • -e EULA="true"
  • RAM
    • Name: MC_RAM
    • Set this to the amount of RAM the server can use.
    • Must be formatted as a number followed by M for "Megabytes" or G for "Gigabytes".
    • If this is not set, Java allocates its own RAM based on total system/container RAM.
    • -e MC_RAM="<4G>"
  • Java options
    • Name: JAVA_OPTS
    • ADVANCED USERS ONLY
    • Set to any additional Java command line options that you would like to include.
    • By default, this environment variable is set to the empty string.
    • -e JAVA_OPTS="<-XX:+UseConcMarkSweepGC -XX:+UseParNewGC>"

Further Setup

From this point, the server should be configured in the same way as any other Minecraft server. The server's files, including server.properties, can be found in the volume that was specified earlier. The port that was specified earlier will probably need to be forwarded as well. For details on how to do this and other such configuration, Google it, because it works the same as any other Minecraft server.

Technical

This project does NOT redistribute the Minecraft server files. Instead, the (very small) script that is inside of the image, papermc.sh, downloads these files from their official sources during installation.

PLEASE NOTE: This is an unofficial project. I did not create PaperMC. This is the official PaperMC website.

Project Pages

papermc-docker's People

Contributors

area45 avatar bmlandis2010 avatar cookie04de avatar courteouscoder avatar cptchuckles avatar dcorbe avatar kwilson62 avatar phyremaster avatar richardklint avatar stelfux avatar timi7007 avatar xnufarx 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

papermc-docker's Issues

Please bump java version

Can you please update line 15 of the docker file from && apk add openjdk17-jre \

Error message:

Starting org.bukkit.craftbukkit.Main
Exception in thread "ServerMain" java.lang.UnsupportedClassVersionError: org/bukkit/craftbukkit/Main has been compiled by a more recent version of the Java Runtime (class file version 65.0), this version of the Java Runtime only recognizes class file versions up to 61.0
        at java.base/java.lang.ClassLoader.defineClass1(Native Method)
        at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1017)
        at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
        at java.base/java.net.URLClassLoader.defineClass(URLClassLoader.java:524)
        at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:427)
        at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:421)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:712)
        at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:420)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:592)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
        at java.base/java.lang.Class.forName0(Native Method)
        at java.base/java.lang.Class.forName(Class.java:467)
        at io.papermc.paperclip.Paperclip.lambda$main$0(Paperclip.java:38)
        at java.base/java.lang.Thread.run(Thread.java:833)

Thank you.

Script not working...

It seems like the papermc api website is down.
I know this is not your issue, but maybe you could add a function that prevents the server from destroying itself.
If the API is down, the server downloads a paper--.jar file.

I hope you understand what i mean.

In my console is:
Error: Invalid or corrupt jarfile paper--.jar ...

Bug in exposed ports

Summary

The current Dockerfile is not correctly exposing the ports/protocols.

Minecraft Port

Minecraft Java Edition only needs 25565/tcp and not UDP. Bedrock Edition requires UDP instead of TCP.
Citation: see the table under step 7 of this section of Microsoft's documentation.

I don't think PaperMC supports Bedrock Edition, so we can safely remove EXPOSE 25565/udp from the Dockerfile. It probably wouldn't hurt to leave it exposed since its inside a container, but it would probably be better to remove it for not being used.

Remote Console Port

In README.md, there is an example for mapping the RCON port to the container's port 25575/tcp. However this port is not exposed in the Dockerfile.
To allow RCON to work, EXPOSE 25575/tcp should be added to the Dockerfile.

Add License

Hello,
In this repository, there is no license, even for the start-up script.
I think the MIT license is the most appropriate here.
Would it be to add one?

IP-Address

Hello, I checked the ip address from joining users and the address is the ip address from the docker-gateway.
172.17.0.1

I am new to docker, so maybe is my config wrong, does anyone know a fix for this?

Thanks

Security vulnerabilities in openjdk:17-slim

There are several security vulnerabilities in the base image used here that have gone unpatched for a number of months (as of this writing). Whoever is responsible for coordinating security releases at the openjdk project seems to be asleep at the wheel. PR#72 addresses this issue.

Further, basing off Alpine instead of Debian makes this image smaller and faster.

#72

[Suggestion] Set PUID and PGID.

It would be cool if we could set PUID and PGID in the docker container so everything isn't created as root into my local filesystem.

Thanks for your image!

Java 17 not recognized

Minecraft 1.18 requires running the server with Java 17 or above. Download Java 17 (or above) from https://adoptium.net/

Java 17 is already set as my default. java -version shows:

openjdk version "17.0.3" 2022-04-19 OpenJDK Runtime Environment (build 17.0.3+7) OpenJDK 64-Bit Server VM (build 17.0.3+7, mixed mode)

I'm starting the image using
docker run -p 28765:25565 -v /home/$USER/Documents/minecraft-server:/papermc -d --restart on-failure -e MC_RAM="4G" --name "minecraft" phyremaster/papermc:latest

Add PUID and PGID env option for Portainer compatibility

Heya,

I've seen that someone else already created a similar issue found here: #5

However this doesn't really work well with Portainer since it always runs the container as root no matter what, and you can't change this easily without changing your whole Docker installation. This makes updating plugin configs annoying since they always get saved as "root" then which you first have to chown again before modifying them properly.

Please add such an option, most other Docker containers support such an option specifically to avoid conflicts like these :)

Thanks in advance!

Upgrade to Java 16 for Minecraft version 1.17+

The issue is that I am trying to figure out how to upgrade the docker to use Java 16 instead Java 11.

I am trying to figure this out especially since this notice appears in console on startup:

[Thu, 13. May 2021 01:24:14 UTC WARN] ************************************************************
[Thu, 13. May 2021 01:24:14 UTC WARN] * WARNING - YOU ARE RUNNING AN OUTDATED VERSION OF JAVA.
[Thu, 13. May 2021 01:24:14 UTC WARN] * PAPER WILL STOP BEING COMPATIBLE WITH THIS VERSION OF
[Thu, 13. May 2021 01:24:14 UTC WARN] * JAVA WHEN MINECRAFT 1.17 IS RELEASED.
[Thu, 13. May 2021 01:24:14 UTC WARN] *
[Thu, 13. May 2021 01:24:14 UTC WARN] * Please update the version of Java you use to run Paper
[Thu, 13. May 2021 01:24:14 UTC WARN] * to at least Java 16. When Paper for Minecraft 1.17 is
[Thu, 13. May 2021 01:24:14 UTC WARN] * released support for versions of Java before 16 will
[Thu, 13. May 2021 01:24:14 UTC WARN] * be dropped.
[Thu, 13. May 2021 01:24:14 UTC WARN] *
[Thu, 13. May 2021 01:24:14 UTC WARN] * Current Java version: 11.0.10
[Thu, 13. May 2021 01:24:14 UTC WARN] *
[Thu, 13. May 2021 01:24:14 UTC WARN] * Check this forum post for more information:
[Thu, 13. May 2021 01:24:14 UTC WARN] * https://papermc.io/java16
[Thu, 13. May 2021 01:24:14 UTC WARN] ************************************************************

The image attached is how I currently have it setup, yet it seems to want to default to Java 11.

Capture

Prevent auto-update from corrupting the world

The Paper dev team apparently doesn't like auto-updaters because they risk corrupting the world by... using the latest release of Paper. That's not really an auto-updater problem if you ask me, but I want to add some form of automatic backup functionality to this image to save users from this type of issue.

Can this run on ARMv7 32bit architecture?

I tried running the given command:
sudo docker run -p 25565:25565 phyremaster/papermc
and I get this from the console:

/storage/.kodi/userdata/addon_data/mtoensing-Docker-Minecraft-PaperMC-Server-33c7ca5$ docker run -p 25565:25565 phyremaster/papermc
Unable to find image 'phyremaster/papermc:latest' locally
latest: Pulling from phyremaster/papermc
docker: no matching manifest for linux/arm/v7 in the manifest list entries.
See 'docker run --help'.

Does this Docker container currently work with ARM 32bit architecture?

This is my first time trying to install a docker container not included with LibreELEC, so I'm not really sure if this can work with my system.

Can't set additional java arguments.

I would recommend adding another (blank by default) ENV variable that gets added to the papermc.sh java start command. This would allow me to add custom arguments for garbage collection, etc.

Consider adding a license

Please consider adding a license so there are no legal uncertainties, and changing and running your code is actually legal.

Enhancement: Control EULA with environment variable

Summary

It would be great to set the EULA with an environment variable (with a sensible default of false). This way anyone who uses this docker image can accept or decline the EULA before starting up the container and can freely change their mind later.

I suggest adding an environment variable called EULA that defaults to the empty string, and replacing these lines with the following:

echo "eula=${EULA:-false}" > eula.txt

A nice bonus is that this solution might also fix some issues related to running this with something like Kubernetes. I was using Rancher to manage my Kubernetes cluster, and when I first fired up papermc, I had to bring it down just to edit the eula.txt manually.

ARM64 request

I'm not very good when it comes to anything coding. However following a few guides I've gotten your PaperMC-Docker to work on a Raspberry Pi running 64bit Ubuntu Server. I'd like to request having you build using buildX to support ARM through your docker hub and maybe just putting a disclaimer that ARM isn't officially supported. It'd be greatly appreciated as I kinda struggle with having to do that with any update (Especially since PaperMC seems to be making some large changes [apiv2]). However I understand since it's your project and you're doing it for free if you don't want to I'd understand. Thanks for reading my request!

Out of memory error

I'm trying to run a docker instance of a Minecraft 1.16.1 server on Centos 7. I'm rather new to both server administration and Docker so maybe I'm just missing something super obvious, but I pulled the container correctly and then ran this command as instructed by the readme:

sudo docker run -p 25565:25565 -v /var lib/minecraft:/papermc -d -it --restart always --name "papermc-1-16-1" -e MC_VERSION="1.16.1" -e PAPER_BUILD="1.16.1" -e MC_RAM="4G" phyremaster/papermc

And I got:

papermc-1.16.1-1.16.1.jar: Permission denied Error: Unable to access jarfile papermc-1.16.1-1.16.1.jar sed: can't read eula.txt: No such file or directory Error: Unable to access jarfile papermc-1.16.1-1.16.1.jar

I also got the same result running it with the flag -e PAPER_BUILD="latest" and an almost identical result removing the paper version altogether.

Am I doing something wrong here or is something just broken? I'm generally a Spigot guy (this is my first time messing with Paper) but after having no end of other issues trying to get Spigot to run, I thought I'd give this a shot instead. Any help is greatly appreciated.

Server doesn’t respond to commands

When attached to the server, typing /stop, stop, sending SIGINT does nothing. How can you send server commands?

As an aside, I'm somewhat new to docker so I might be missing something obvious. I'm willing to add/rewrite the README as well.

Restarting server

Not sure if an issue with papermc-docker, but when running "restart" from the console (and I presume via rcon as well), it fails to actually restart the server. Once the java application exits, the container exits.

I have not got the --restart always parameter

Should I have the --restart always parameter, and if so, how do I then safely stop the server? Or, is there a different mechanism to restart from console/rcon without the entire docker image going down?

Make "latest" option not case sensitive

When adding to the env in the container you get

It seems a extra - appears where it should not be

PAPER_BUILD | 1.17.1-133

./papermc.sh: 8: [: =: unexpected operator
--2021-07-28 01:59:20-- https://papermc.io/api/v2/projects/paper/versions//builds/1.17.1-133/downloads/paper--1.17.1-133.jar
Resolving papermc.io (papermc.io)... 104.26.13.138, 172.67.72.198, 104.26.12.138, ...
Connecting to papermc.io (papermc.io)|104.26.13.138|:443... connected.
HTTP request sent, awaiting response... 404 Not Found
2021-07-28 01:59:21 ERROR 404: Not Found.

Error: Invalid or corrupt jarfile paper--1.17.1-133.jar

jdk8 - papermc 1.8.8

hello, i would like to use jdk 8 for my papermc server
can you help me?
thanks in advance

cgroups error when deploying in a kubernetes environment

Hi,

Just in case someone is having this issue in a kubernetes environment :

java.lang.InternalError: java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.platform.Metrics.systemMetrics(Metrics.java:65)
        at java.base/jdk.internal.platform.Container.metrics(Container.java:43)
        at jdk.management/com.sun.management.internal.OperatingSystemImpl.<init>(OperatingSystemImpl.java:48)
        at jdk.management/com.sun.management.internal.PlatformMBeanProviderImpl.getOperatingSystemMXBean(PlatformMBeanProviderImpl.java:279)
        at jdk.management/com.sun.management.internal.PlatformMBeanProviderImpl$3.nameToMBeanMap(PlatformMBeanProviderImpl.java:198)
        at java.management/sun.management.spi.PlatformMBeanProvider$PlatformComponent.getMBeans(PlatformMBeanProvider.java:195)
        at java.management/java.lang.management.ManagementFactory.getPlatformMXBean(ManagementFactory.java:686)
        at java.management/java.lang.management.ManagementFactory.getOperatingSystemMXBean(ManagementFactory.java:388)
        at org.bukkit.craftbukkit.Main.main(Main.java:277)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:567)
        at io.papermc.paperclip.Paperclip.main(Paperclip.java:58)
Caused by: java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:567)
        at java.base/jdk.internal.platform.Metrics.systemMetrics(Metrics.java:61)
        ... 13 more
Caused by: java.lang.ExceptionInInitializerError
        at java.base/jdk.internal.platform.CgroupSubsystemFactory.create(CgroupSubsystemFactory.java:107)
        at java.base/jdk.internal.platform.CgroupMetrics.getInstance(CgroupMetrics.java:167)
        ... 18 more
Caused by: java.lang.NullPointerException
        at java.base/java.util.Objects.requireNonNull(Objects.java:208)
        at java.base/sun.nio.fs.UnixFileSystem.getPath(UnixFileSystem.java:260)
        at java.base/java.nio.file.Path.of(Path.java:147)
        at java.base/java.nio.file.Paths.get(Paths.java:69)
        at java.base/jdk.internal.platform.CgroupUtil.lambda$readStringValue$1(CgroupUtil.java:66)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:554)
        at java.base/jdk.internal.platform.CgroupUtil.readStringValue(CgroupUtil.java:68)
        at java.base/jdk.internal.platform.CgroupSubsystemController.getStringValue(CgroupSubsystemController.java:65)
        at java.base/jdk.internal.platform.CgroupSubsystemController.getLongValue(CgroupSubsystemController.java:124)
        at java.base/jdk.internal.platform.cgroupv1.CgroupV1Subsystem.getLongValue(CgroupV1Subsystem.java:272)
        at java.base/jdk.internal.platform.cgroupv1.CgroupV1Subsystem.getHierarchical(CgroupV1Subsystem.java:218)
        at java.base/jdk.internal.platform.cgroupv1.CgroupV1Subsystem.setPath(CgroupV1Subsystem.java:201)
        at java.base/jdk.internal.platform.cgroupv1.CgroupV1Subsystem.setSubSystemControllerPath(CgroupV1Subsystem.java:173)
        at java.base/jdk.internal.platform.cgroupv1.CgroupV1Subsystem.lambda$initSubSystem$5(CgroupV1Subsystem.java:113)
        at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
        at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
        at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
        at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
        at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
        at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
        at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
        at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
        at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
        at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
        at java.base/jdk.internal.platform.cgroupv1.CgroupV1Subsystem.initSubSystem(CgroupV1Subsystem.java:113)
        at java.base/jdk.internal.platform.cgroupv1.CgroupV1Subsystem.<clinit>(CgroupV1Subsystem.java:47)
        ... 20 more
2021-05-27 17:55:14,982 main WARN Advanced terminal features are not available in this environment

I fixed it by adding -XX:-UseContainerSupport to JAVA_OPTS

My full deployment for reference :

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: minecraft
  name: minecraft
spec:
  replicas: 1
  selector:
    matchLabels:
      app: minecraft
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: minecraft
    spec:
      containers:
        - image: phyremaster/papermc
          name: minecraft
          env:
            - name: MC_VERSION
              value: '1.16.5'
            - name: MC_RAM
              value: '30G'
            - name: JAVA_OPTS
              value: '-XX:-UseContainerSupport'
          ports:
            - containerPort: 25565
          volumeMounts:
            - mountPath: /papermc
              name: mc-data
          resources:
            requests:
              memory: "32G"
              cpu: "8"
            limits:
              memory: "35G"
              cpu: "10"
      restartPolicy: Always
      volumes:
        - name: mc-data
          persistentVolumeClaim:
            claimName: mc-data

Add support for no RAM limit

When a container is created with a container RAM limit but also a Minecraft RAM limit of same/similar size, there is a risk for SEGFAULTs (Java thinks it can use all the RAM, but it can't). There should be support for not setting a Minecraft RAM limit, so that users can avoid this problem completely. I think I know how this can be done, but I'll have to get to it later, so I'm making this issue in case I forget.

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.