Giter Site home page Giter Site logo

factorio-tools's Introduction

Factorio Tools

This repository contains two tools which support the Factorio Calculator (repo).

factoriocalc loads data from a Factorio installation, starts an HTTP server hosting the calculator, and opens it in a browser. It provides a quick and easy way to use a custom combination of mods with the calculator.

factoriodump is used to load data from a Factorio installation, and write the data files and sprite sheet used by the calculator. It is primarily a tool which supports development of the calculator.

How to build

You will need:

Change into either tool's subdirectory and build it with:

$ packr build

factorio-tools's People

Contributors

kirkmcdonald avatar rustyblade64 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

Watchers

 avatar  avatar  avatar  avatar  avatar

factorio-tools's Issues

factoriocalc.exe does not pick up mods

I am trying to get the standalong executable to pick up the mod I have installed so that I can work out what ratios I need to have using this new mod.

 Directory of D:\apps\Factorio_factoriocalc\mods

09/09/2019  18:23    <DIR>          .
09/09/2019  18:23    <DIR>          ..
09/09/2019  06:19       115,982,931 IndustrialRevolution_0.99.1.zip
09/09/2019  18:23               163 mod-list.json
09/09/2019  18:22               728 mod-settings.dat
               3 File(s)    115,983,822 bytes

However factoriocalc appears to ignore the mod folder I have given it. And when I go into the browser window that opens up I can not see anything new under "Use recipe set" in Settings

D:\apps\Factorio_factoriocalc>factoriocalc -moddir d:\apps\Factorio_factoriocalc\mods -verbose
data loaded
hack icon:      infinity-pipe
hack icon:      electric-energy-interface
no localized name for   mining-tool     named   dummy-steel-axe
recipe skip:    empty-lubricant-barrel  because of      icon
recipe skip:    empty-lubricant-barrel  because of      icon
recipe skip:    empty-light-oil-barrel  because of      icon
recipe skip:    empty-light-oil-barrel  because of      icon
recipe skip:    empty-heavy-oil-barrel  because of      icon
recipe skip:    empty-heavy-oil-barrel  because of      icon
main product does not exist:    fill-heavy-oil-barrel
recipe skip:    fill-heavy-oil-barrel   because of      icon
main product does not exist:    fill-heavy-oil-barrel
recipe skip:    fill-heavy-oil-barrel   because of      icon
recipe skip:    empty-crude-oil-barrel  because of      icon
recipe skip:    empty-crude-oil-barrel  because of      icon
recipe skip:    empty-sulfuric-acid-barrel      because of      icon
recipe skip:    empty-sulfuric-acid-barrel      because of      icon
main product does not exist:    fill-sulfuric-acid-barrel
recipe skip:    fill-sulfuric-acid-barrel       because of      icon
main product does not exist:    fill-sulfuric-acid-barrel
recipe skip:    fill-sulfuric-acid-barrel       because of      icon
main product does not exist:    fill-light-oil-barrel
recipe skip:    fill-light-oil-barrel   because of      icon
main product does not exist:    fill-light-oil-barrel
recipe skip:    fill-light-oil-barrel   because of      icon
main product does not exist:    fill-water-barrel
recipe skip:    fill-water-barrel       because of      icon
main product does not exist:    fill-water-barrel
recipe skip:    fill-water-barrel       because of      icon
main product does not exist:    fill-lubricant-barrel
recipe skip:    fill-lubricant-barrel   because of      icon
main product does not exist:    fill-lubricant-barrel
recipe skip:    fill-lubricant-barrel   because of      icon
main product does not exist:    nuclear-fuel-reprocessing
recipe skip:    empty-water-barrel      because of      icon
recipe skip:    empty-water-barrel      because of      icon
main product does not exist:    fill-crude-oil-barrel
recipe skip:    fill-crude-oil-barrel   because of      icon
main product does not exist:    fill-crude-oil-barrel
recipe skip:    fill-crude-oil-barrel   because of      icon
main product does not exist:    fill-petroleum-gas-barrel
recipe skip:    fill-petroleum-gas-barrel       because of      icon
main product does not exist:    fill-petroleum-gas-barrel
recipe skip:    fill-petroleum-gas-barrel       because of      icon
recipe skip:    empty-petroleum-gas-barrel      because of      icon
recipe skip:    empty-petroleum-gas-barrel      because of      icon
Starting server on http://localhost:8000/calc.html
(Ctrl-C to exit.)

factoriodump generates "results": [ [] ]

The output of factoriodump on my (heavily modded, details below) installation includes entries with "results": [ [] ] that he web UI barfs on. Looking at the rest of the JSON file, it looks like this is indeed not valid content.

Example

        "cobalt-oxide-from-copper": {
                "amount": 1,
                "name": "stone",
                "type": "item"
            }, {
                "amount": 1,
                "name": "solid-carbon",
                "type": "item"
            }, {
                "amount": 5,
                "name": "gas-hydrogen",
                "type": "fluid"
            } ],
            "localized_name": {
                "en": "Advanced copper processing with Cobalt oxide"
            },
            "main_product": "copper-plate",
            "name": "cobalt-oxide-from-copper",
            "order": "c-b[cobalt-oxide-from-copper]",
            "results": [ [], [] ],
            "subgroup": "bob-material-chemical",
            "type": "recipe"
        },

Environment

Side-note

I understand this is probably a weird edge-case that only comes up with tons of complex mods. Then again, a calculator is especially useful in such a playthrough. And who knows, maybe it's an easy fix, or highlights some other problem that was hiding so far, so thought I'd submit this anyway.

๐ŸŒˆ

Setting Preferred Electronic Machine

I used this for Bob's Pack, trying to get ratios for making Electronic Circuits.

However the calculator only lets you select which Assembly Machine is preferred, but not which Electronic Assembly Machine. Which means it defaulted to the Tech 3 variant.

Is there a way to set this to a lower level?

Provided stacktraces for lua errors

When a runtime error happens while executing lua code only the error, but no stacktrace is displayed. It would be a nice convenience feature if that could be added.

I know this strictly doesn't belong here, but your golua repository does not have issues enabled (due to being forked I believe) and the original project seems inactive, so I thought I'd put it here.

For reference this has also been reported at aarzilli/golua#58

Error: [string <mod_file_name>]:<n>: attempt to index a nil value (field 'startup')

I really love your calculator! I've just discovered the offline version which imports local mod data and would like to use it.

If I do, I see error messages like:
[string "bobassembly_0.17.2/prototypes/assembly-electr..."]:1: attempt to index a nil value (field 'startup')
or
[string "BigDrills_0.5.4/prototypes/tech/tech.lua"]:47: attempt to call a nil value (global 'unpack')

The relevant lua code from said mods looks like this:
if settings.startup["bobmods-assembly-electronicmachines"].value == true then
and
prerequisites = {"logistics-2", "bucket-wheel-excavator", "advanced-material-processing-2", unpack(preMK2 or {})},

If I start the calculator with an empty mod dir everything works fine. As do most mods, except those that reference settings.startup or try to call unpack.

Factorio version: 0.17.28
Calculator version: 0.3 binary for windows
Mods causing error messages: bobassembly_0.17.2.zip, BigDrills_0.5.4.zip

Is there anything I can do to fix this issue on my end?

Build error: github.com/KirkMcDonald/golua/lua: build constraints exclude all Go files

  • I'm trying to build factoriodump from source on Windows 10.
  • The README.md file says to install Go, packr, a C compiler, Lua 5.3, and some Lua libraries.
    • I have a default systemwide Go go version go1.20.6 windows/amd64
    • I have VS2019 and VS2022 installed with the VC compiler, but I'm unsure how to configure that in this case.
    • I installed Lua 5.3 and Lua 5.4 via winget (the README.md says to install 5.3, but the current version of luarocks complains if I didn't have 5.4 also available).
    • packr build seems to be for Packr v1 which seems to have disappeared - I'm only able to get Packr v2 packr2 to install, but it seems to work.
  • When running cd factorio-tools\factoriodump or cd factorio-tools\factorioload then go build or packr2 build I get this error:
C:\git\clones\kirkmcdonald\factorio-tools\factoriodump>packr2 build
github.com/KirkMcDonald/golua/lua: build constraints exclude all Go files in C:\Users\David\go\pkg\mod\github.com\!kirk!mc!donald\[email protected]\lua
Error: exit status 1

(Using --verbose doesn't show any relevant extra details, unfortunately).

None of the .go files in C:\Users\David\go\pkg\mod\github.com\!kirk!mc!donald\[email protected]\lua have build-constraint comments in them, so I'm unsure where that's coming from.


(running go clean -modcache didn't solve the problem: any attempt to build will fail with the same build-constraints error as above)

Is this repo still up to date? / factoriodump crashes on requires clause in 1.1 vanilla factorio prototypes

I tried to generate a recipe table for vanilla factorio 1.1 before adding several mods to be calculated, but factoriodump crashed.
It choked on a requires clause within the vanilla prototypes yielding the following error:

> ./factoriodump --calcdir=../factorio-web-calc/ --gamedir=~/Programme/Linux/Steam/steamapps/common/Factorio --prefix=vanilla-1-0 --verbose
...io/data/base/prototypes/entity/spidertron-animations.lua:521: module '__base__/prototypes/entity/spidertron-light-positions' not found:
	no field package.preload['__base__/prototypes/entity/spidertron-light-positions']could not find ../FactorioLoaderLib/__base__/prototypes/entity/spidertron-light-positions.lua
	no file '~/Programme/Linux/Steam/steamapps/common/Factorio/data/base/__base__/prototypes/entity/spidertron-light-positions.lua'
	no file '~/Programme/Linux/Steam/steamapps/common/Factorio/data/core/lualib/__base__/prototypes/entity/spidertron-light-positions.lua'
	no file '/usr/local/share/lua/5.3/__base__/prototypes/entity/spidertron-light-positions.lua'
	no file '/usr/local/share/lua/5.3/__base__/prototypes/entity/spidertron-light-positions/init.lua'
	no file '/usr/local/lib/lua/5.3/__base__/prototypes/entity/spidertron-light-positions.lua'
	no file '/usr/local/lib/lua/5.3/__base__/prototypes/entity/spidertron-light-positions/init.lua'
	no file '/usr/share/lua/5.3/__base__/prototypes/entity/spidertron-light-positions.lua'
	no file '/usr/share/lua/5.3/__base__/prototypes/entity/spidertron-light-positions/init.lua'
	no file './__base__/prototypes/entity/spidertron-light-positions.lua'
	no file './__base__/prototypes/entity/spidertron-light-positions/init.lua'
	no file '/usr/local/lib/lua/5.3/__base__/prototypes/entity/spidertron-light-positions.so'
	no file '/usr/lib/x86_64-linux-gnu/lua/5.3/__base__/prototypes/entity/spidertron-light-positions.so'
	no file '/usr/lib/lua/5.3/__base__/prototypes/entity/spidertron-light-positions.so'
	no file '/usr/local/lib/lua/5.3/loadall.so'
	no file './__base__/prototypes/entity/spidertron-light-positions.so'

The line in question is in base/prototypes/entity/spidertron-animations.lua, however the same problem also occurs in other places if I edit out the __base__/ in this line.
light_positions = require("__base__/prototypes/entity/spidertron-light-positions"),

It seems that __base__ is not being replaced/removed before searching for the file.

Since the webversion can handle 1.1 just fine, I guess either I'm doing something wrong or this repository hasn't been updated. I'd love to get this fixed soon :) Thank you for all your work!

Error: attempt to index a nil value using factoriocalc

Your calculator is amazing for vanilla, so thank you.

I'm interested in running factoriocalc locally so I can have it calculate the rates for recipes in some of the mods I use.

I'm running Factorio 0.17 on Linux, using the standalone installation. I have Factorio installed at /run/media/seonwoo/Steam/Factorio-Linux (despite the path, I don't actually have Factorio installed through Steam on Linux) and I have my mods directory at /mnt/veracrypt2/Factorio/mods. When I run

go run main.go -gamedir /run/media/seonwoo/Steam/Factorio-Linux/ -moddir /mnt/veracrypt2/Factorio/mods/ -verbose

I get the nil value attempted error.

I've narrowed it down to this line:

err = L.Call(2, 1)

I've never used Lua so I have no idea what L.Call is meant to do.

Does this have anything to do with the fact that FactorioLoaderLib doesn't work with packed mods? What exactly do you mean by "packed" mods - mods that have been compiled and don't provide source code? (I should preface this with I have no experience with creating mods in Factorio).

Error when mod-settings.dat does not exist

Steam path: e:\Steam
game path: f:\SteamLibrary\steamapps\common\Factorio
game version: 0.16.51
tool path: b:\tool

my startup attempts:

b:\tool>factoriocalc.exe
Factorio game directory not found.

b:\tool>factoriocalc.exe -gamedir=f:\SteamLibrary\steamapps\common\Factorio
[string "../FactorioLoaderLib/library/settingloader.lu..."]:6: attempt to index a nil value (local 'f')

b:\tool>factoriocalc.exe -gamedir="f:/SteamLibrary/steamapps/common/Factorio"
[string "../FactorioLoaderLib/library/settingloader.lu..."]:6: attempt to index a nil value (local 'f')

Not going down the rabbit hole of perfectly recreating the Factorio environment

KirkMcDonald/FactorioLoaderLib#3 addresses two more differences between how mods are processed as opposed to how Factorio does it. I think these and the ones already fixed are only the first of a whole lot of probably more subtle and harder to track down discrepancies. The examples I can think of right now:

  • Actual load order isn't covered by table.sort.
    • Factorio uses Natural sort order instead of ASCII value based one (source)
    • There seems to be special cases for core and base always loading first
    • If a mod has multiple dependencies, in which order will these dependencies be called? Probably also in natural sort order, but that would need testing, since I couldn't find information on that.
  • Factorio's version is slightly different from normal Lua in order to support determinism in multiplayer. Most prominently modders can expect pairs() to be deterministic (by I think insertion order) while it won't be in the loader. These will probably not manifest themselves in hard crashes, but instead cause slightly wrong recipe lists (aka harder to find and fix).
  • Aside from the differences betweeen normal and Factorio Lua, there might also be problems with using Lua 5.3. A bit of a constructed example would be with the new integers: tostring(10.0) == "10" is true in 5.2 but false in 5.3.

Because of that I would suggest to use the Factorio environment itself rather than emulating it. Two options I see here:

  1. Dynamically generate a mod that depends on all mods in the mod-list.json and executes it's code in data-final-fixes.lua. I don't know how well this would work when the game is running simultaneously (probably a desired feature). I think it is possible at least in the stand-alone version, I don't have any idea whether this would work with the steam build though.
  2. Kindly ask Rseding if he could update the Lua version used by Factorio and use that instead of default Lua. IMHO less convenient to implement, but fixing the differences regarding mod load order is probably manageable.

Add support for Factorio 0.18

I tried to running factoriocalc 0.3 on factorio 0.18 but I unfortunately get a crash. I am using the windows build 0.3.

image

I have tried running it with 0.17 and it does work there. Would you be able to add support for 0.18?

I know the recipes havn't changed in 0.18 but I would like to use it with a mod.

Issues with generating data dump for Factorio 0.17.38 + Space Exploration mod

I'm trying to generate a data dump for Factorio 0.17.38 + Space Exploration mod but I'm facing a few issues in the process. It's likely that some of the changed recipes come from AAI Industry mod.

Issues:

  • it seems that the new Space Exploration items and recipes are not being found
    EDIT: it seems that even though the Space Exploration mod is recognized and found the data*.lua files do not get executed
    EDIT2: dependencies are not parsed correctly in less common cases:
    ! test
    (?) angelsbioprocessing
  • a few items in the sprite that probably come from AAI Industry are incorrectly cropped - they have the size doubled and, thus show only the top left quarter of the icon
    EDIT: yes, they come from AAI Industry, and these ones are 64x64 instead of 32x32 as the most of other icons)

Execution log (with -verbose):

data loaded
no localized name for	ammo	named	grappling-gun-ammo
no localized name for	gun	named	grappling-gun
hack icon:	electric-energy-interface
no localized name for	item	named	burner-assembling-machine
no localized name for	item	named	aai-signal-sender
no localized name for	item	named	motor
no localized name for	item	named	vehicle-fuel
no localized name for	item	named	concrete-wall
no localized name for	item	named	burner-turbine
hack icon:	infinity-pipe
no localized name for	item	named	fuel-processor
no localized name for	item	named	glass
no localized name for	item	named	sand
no localized name for	item	named	aai-signal-receiver
no localized name for	item	named	burner-lab
no localized name for	item	named	steel-wall
no localized name for	item	named	small-iron-electric-pole
no localized name for	item	named	stone-tablet
hack icon:	escape-pod-power
no localized name for	item	named	electric-motor
no localized name for	mining-tool	named	dummy-steel-axe
main product does not exist:	fill-petroleum-gas-barrel
recipe skip:	fill-petroleum-gas-barrel	because of	icon
main product does not exist:	fill-petroleum-gas-barrel
recipe skip:	fill-petroleum-gas-barrel	because of	icon
recipe skip:	empty-sulfuric-acid-barrel	because of	icon
recipe skip:	empty-sulfuric-acid-barrel	because of	icon
no localized name for	recipe	named	burner-assembling-machine
no localized name for	recipe	named	burner-assembling-machine
main product does not exist:	vehicle-fuel-from-coal
recipe skip:	vehicle-fuel-from-coal	because of	subgroup
main product does not exist:	vehicle-fuel-from-coal
recipe skip:	vehicle-fuel-from-coal	because of	subgroup
main product does not exist:	vehicle-fuel-from-solid-fuel
recipe skip:	vehicle-fuel-from-solid-fuel	because of	subgroup
main product does not exist:	vehicle-fuel-from-solid-fuel
recipe skip:	vehicle-fuel-from-solid-fuel	because of	subgroup
main product does not exist:	vehicle-fuel-from-nuclear-fuel
recipe skip:	vehicle-fuel-from-nuclear-fuel	because of	subgroup
main product does not exist:	vehicle-fuel-from-nuclear-fuel
recipe skip:	vehicle-fuel-from-nuclear-fuel	because of	subgroup
main product does not exist:	vehicle-fuel-from-rocket-fuel
recipe skip:	vehicle-fuel-from-rocket-fuel	because of	subgroup
main product does not exist:	vehicle-fuel-from-rocket-fuel
recipe skip:	vehicle-fuel-from-rocket-fuel	because of	subgroup
no localized name for	recipe	named	aai-signal-sender
no localized name for	recipe	named	aai-signal-sender
recipe skip:	empty-heavy-oil-barrel	because of	icon
recipe skip:	empty-heavy-oil-barrel	because of	icon
main product does not exist:	fill-heavy-oil-barrel
recipe skip:	fill-heavy-oil-barrel	because of	icon
main product does not exist:	fill-heavy-oil-barrel
recipe skip:	fill-heavy-oil-barrel	because of	icon
main product does not exist:	fill-light-oil-barrel
recipe skip:	fill-light-oil-barrel	because of	icon
main product does not exist:	fill-light-oil-barrel
recipe skip:	fill-light-oil-barrel	because of	icon
no localized name for	recipe	named	motor
no localized name for	recipe	named	motor
recipe skip:	empty-crude-oil-barrel	because of	icon
recipe skip:	empty-crude-oil-barrel	because of	icon
main product does not exist:	fill-crude-oil-barrel
recipe skip:	fill-crude-oil-barrel	because of	icon
main product does not exist:	fill-crude-oil-barrel
recipe skip:	fill-crude-oil-barrel	because of	icon
recipe skip:	empty-water-barrel	because of	icon
recipe skip:	empty-water-barrel	because of	icon
main product does not exist:	fill-water-barrel
recipe skip:	fill-water-barrel	because of	icon
main product does not exist:	fill-water-barrel
recipe skip:	fill-water-barrel	because of	icon
recipe skip:	empty-petroleum-gas-barrel	because of	icon
recipe skip:	empty-petroleum-gas-barrel	because of	icon
recipe skip:	empty-lubricant-barrel	because of	icon
recipe skip:	empty-lubricant-barrel	because of	icon
main product does not exist:	fill-lubricant-barrel
recipe skip:	fill-lubricant-barrel	because of	icon
main product does not exist:	fill-lubricant-barrel
recipe skip:	fill-lubricant-barrel	because of	icon
main product does not exist:	fill-sulfuric-acid-barrel
recipe skip:	fill-sulfuric-acid-barrel	because of	icon
main product does not exist:	fill-sulfuric-acid-barrel
recipe skip:	fill-sulfuric-acid-barrel	because of	icon
no localized name for	recipe	named	grappling-gun-ammo
no localized name for	recipe	named	grappling-gun-ammo
no localized name for	recipe	named	concrete-wall
no localized name for	recipe	named	concrete-wall
no localized name for	recipe	named	grappling-gun
no localized name for	recipe	named	grappling-gun
no localized name for	recipe	named	aai-signal-receiver
no localized name for	recipe	named	aai-signal-receiver
no localized name for	recipe	named	burner-lab
no localized name for	recipe	named	burner-lab
no localized name for	recipe	named	steel-wall
no localized name for	recipe	named	steel-wall
no localized name for	recipe	named	small-iron-electric-pole
no localized name for	recipe	named	small-iron-electric-pole
no localized name for	recipe	named	glass-from-sand
no localized name for	recipe	named	glass-from-sand
no localized name for	recipe	named	sand-from-stone
no localized name for	recipe	named	sand-from-stone
no localized name for	recipe	named	burner-turbine
no localized name for	recipe	named	burner-turbine
recipe skip:	empty-light-oil-barrel	because of	icon
recipe skip:	empty-light-oil-barrel	because of	icon
main product does not exist:	nuclear-fuel-reprocessing
no localized name for	recipe	named	fuel-processor
no localized name for	recipe	named	fuel-processor
main product does not exist:	vehicle-fuel-from-wood
recipe skip:	vehicle-fuel-from-wood	because of	subgroup
main product does not exist:	vehicle-fuel-from-wood
recipe skip:	vehicle-fuel-from-wood	because of	subgroup
no localized name for	recipe	named	stone-tablet
no localized name for	recipe	named	stone-tablet
no localized name for	recipe	named	electric-motor
no localized name for	recipe	named	electric-motor
no localized name for	furnace	named	fuel-processor
no localized name for	assembling-machine	named	burner-assembling-machine
no localized name for	boiler	named	burner-turbine
no localized name for	generator	named	burner-turbine-generator
Created files:
  /home/wladek/fd/kirkmcdonald.github.io/images/sprite-sheet-be7d3fcec0558bfba2c30582fb45ba17.png
  /home/wladek/fd/kirkmcdonald.github.io/data/space-exploration-0.17.38.json
  /home/wladek/fd/kirkmcdonald.github.io/data/space-exploration-0.17.38-expensive.json

Mod list:

aai-industry_0.3.17.zip
aai-signal-transmission_0.1.4.zip
alien-biomes_0.4.14.zip
bullet-trails_0.4.1.zip
grappling-gun_0.1.2.zip
robot_attrition_0.3.6.zip
space-exploration_0.1.56.zip
space-exploration-graphics_0.1.39.zip
space-exploration-hr-graphics_0.1.38.zip
space-exploration-postprocess_0.1.37.zip

(bonus question: does the "enabled" flag in the mod-list.cfg matter?)

Any hints how to get around these issues?

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.