Giter Site home page Giter Site logo

i7 / extensions Goto Github PK

View Code? Open in Web Editor NEW
117.0 60.0 60.0 5.2 MB

Inform 7 extensions -- some may be ready for public use, others may be barely working experiments. Enjoy!

Home Page: https://intfiction.org/t/friends-of-i7-github/4103

License: Creative Commons Attribution 4.0 International

Inform 7 100.00%
interactive-fiction inform-7 inform7

extensions's Introduction

The Friends of Inform 7 extensions (for v10.1)

This git branch of the Friends of I7 Extensions is for Inform 7 version 10.1 (the current version, released in 2022). The extensions here are believed to work in 10.1 (or, at a minimum to compile). Per the LICENSE they are shared with no implied warranty of fitness for a particular purpose.

If you would like access to the repository to add your own extensions, please ask at the intfiction.org forums Friends of I7 Github repo thread

If you find a bug in any of these extensions, or indeed in any Inform 7 extension at all, please make a new issue and we may be able to help. The purpose of the group is that we can all work together to maintain and develop these extensions. Sharing the load will make it easier on us all, while experienced programmers can help those just starting out.

How to download a few extensions

  1. Locate the extension that you want to use via the GitHub website.
  2. Click on the Raw button.
  3. Download the resulting file anywhere on your computer.
  4. Inside I7, go to File -> Install Extension and locate the file you just downloaded.
  5. Repeat this for any other extensions that the one you wanted also includes (and you don't already have).
  6. Repeat all of this for any other extensions that you want.

How to download all the extensions

  1. Locate your current Extensions folder -- from within I7, select File -> Show Installed Extensions Folder -- then close I7.
  2. Go up to the parent directory and rename the Extensions folder to Extensions Old (for now).
  3. Download this zip file and extract it into that location.
  4. Rename the extensions-10.1 folder that it just created to just Extensions (such that this now contains subfolders with peoples' names).
  5. You now have all of the extensions in this repository, which includes those from the Public Library. (Don't touch the blue or purple buttons in the Public Library tab, or you'll downgrade something.)
  6. If there's any extensions from your Extensions Old folder that you need to "rescue" (perhaps some you've written yourself, or installed from elsewhere), you can use File -> Install Extension to copy them from that folder into the new Extensions folder (or close down I7 and move them manually).
  7. To update in the future, you can either update the extensions one-by-one as above or you can download a fresh zip and install the whole thing over the top.

(Alternatively, if you're familiar with Git then you can use a Git clone in place of downloading the zip, if you prefer.)

extensions's People

Contributors

alice-blue avatar andrewschultz avatar angstsmurf avatar aubloom avatar chrispc avatar curiousdannii avatar danyadsmith avatar david-a-wheeler avatar dhakajack avatar dscorbett avatar dstelzer avatar ektemple avatar emacsuser avatar golmac avatar harvimt avatar jeffnyman avatar juhana avatar leonardo-boselli avatar mattweiner avatar mciul avatar neroden avatar notquitethere avatar peterorme avatar sarganar avatar shin-sekai-no-kami avatar tarynmichelle avatar uecasm avatar xavidotron avatar youdevit avatar zedlopez 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

extensions's Issues

GEP/FW: investigate rearrange events

Rearrange events don't seem to be passed to Flexible Windows. Are they not being handled by GEP correctly?

Once that is solved, then perhaps change when we call the redraw rules - not for text buffer windows?

Flexible Windows - Incorporate Text Window Input-Output Control

There are a few places where the templates run glk_set_window(gg_mainwin);:

  1. VM_MainWindow()
  2. Box__Routine()
  3. FileIO_Close()

I think that we should probably patch these to instead refer to the current g-window. It's too much to expect authors to do this themselves, and if they don't use the variable the behaviour will be as it is now. If they are using the variable, I can't think of any reason why they wouldn't want it to be patched.

In 4dd07fa I began patching it with an after constructing the status line rule and with changes to VM_KeyChar() (which I left commented out). If we do what I suggest above then I don't think the status line rule will be required. The change to VM_KeyChar() won't actually change where stuff is printed, and Text Window Input-Output Control could be used for that if needed.

Set up automated testing for 9.3/10.1 branches

It would be great to set up automated testing for the 9.3/10.1 branches, so that any files that are updated by a pull request get tested against those I7 releases. Probably all we can do is to test if they compile after being included, but maybe we could also check if their examples compile too?

Flexible Windows - allow the main window to be opened and closed at will

Now that FW can treat any window (or windows) as the main window for purposes of either output or input, it would be good to allow the author total control of the main window (gg_mainwin). Possible use cases include:

  • Closing and reopening the main window in order to change text styles. (This is how the glulx version of Photopia was able to change text colors for each chapter, for example.)
  • Allowing the author to close the main window when it is not needed rather than making use of the frowned-upon expedient of "popping" another window over it. Examples include graphic intro screens such as Kerkerkruip has. (There are still use cases where the popover window is the best option, however: for example, a popover menu screen allows the main window to retain scrollback.)
  • Allowing the author to use window types other than buffer windows as the main I/O interface, i.e. a text grid window or even a graphics window.

GEP does useless caching

Glulx Entry Points has a function GEP_TestGestalts which checks all the Glk and Glulx gestalt selectors and caches their results.

This appears to be done correctly -- that is, it's re-checked during IdentifyGlkObject(), which is important. However, it's kind of useless. The @gestalt opcode test is faster than an Inform array lookup. A glk_gestalt() call is slower by one function call but this is really not worth worrying about. (And even if it were, the time saved will usually be outweighed by the cost of caching the 35 values that most games ignore.)

Removing the function and the GEP_GlulxGestaltResults/GEP_GlkGestaltResults arrays would save some bytes and simplify the extension.

I think I've mentioned this before, so I apologize for being tedious about it.

Objects Matching Snippets is broken, and I have some unbroken code

The posted code for Objects Matching Snippets by Mike Ciul is broken. The critical relation "to be identified with" is defined nowhere in the extensions. (I think Mike took some code that was supposed to go after the already existing version one of Objects Matching Snippets and accidentally replaced the already existing version.)

I have installed on my computer a version that seems to work. I'd like to branch the existing Objects Matching Snippets with this code, but I have no way to do this. (I tried to fork the extension and I wound up forking the entire extensions repository onto my site, and then I had to search for five minutes to find out how to delete the fork. For an open-source collaboration tool, Github sure doesn't seem to explain itself.)

So... I think I'd like to make a pull request with the working code? Anyone know how this works?

A pull/merge/push gone awry?

Sorry guys! I meant to pull, merge, then push, but somehow I wound up causing changes to other people's extensions by accident. And I'm not sure how to fix it.

GEP changes

  • Change gestalt code
  • line echoing code
  • editing the current input line
  • check examples
  • use {-my:x}
  • Check whether I can rfalse from GGRecoverObjects in Glk object recovery, and then not need to indirectly call it in ASR

cut vs taglia

Maybe I've found a little bug with italian commands.

Mattatoio is a room. Mucca Tina is a feminine gender animal in Mattatoio.
Instead of cutting Mucca:
    say "Mio Dio no! Sarebbe una cosa tanto spiacevole quanto crudele...".

Try with "cut Mucca Tina" and "taglia Mucca Tina".

The first say: «Sarebbe una cosa spiacevole nonchè crudele.».
The second throws: «A che scopo?»

This happens with every "thing" (as I may have tried).

Adding functionality: Adaptive text for doors

I think that could be implemented something like this:

The Mattatoio is a room. "Di certo non vorrei entrare [inp Mattatoio]...".

These types of adaptive texts are not provided for doors.

Menus bug: true and false hidden-row entries treated alike

@curiousdannii -- In your Menus extension, in lines 174, 216, and 325, the code checks for a hidden-row entry, but if it's present, treats it the same whether it's true or false. I think these should be changed from

if there is a hidden-row entry:

to

if there is a hidden-row entry and the hidden-row entry is true:

I could change it myself but thought I should ask first.

Repository reorganization for multiple Inform versions

Now that the latest Inform version has dropped, it would a good time to reorganize the extensions repository so that it works for both 6M62 and 10.x. Some extensions aren't compatible with 10.1.0 and syntax changes in 10.1.0 mean that new extensions made for 10.x won't be compatible with 6M62 anymore.

The proposal is this:

  • Move all extensions to a new top-level folder called 6M62
  • Create another top-level folder called latest and copy all extensions there that are confirmed to compile without errors in 10.1.0
  • If an extension isn't compatible with either of them, create a folder for the last version it is compatible with and move it there
  • When someone modifies an existing extension to be compatible with 10.1.0, they copy it to the latest folder and change the release number to use the new semantic versioning scheme that has the major version one larger than the old release number. E.g. release 4 becomes 5.0.0.

This way everyone using the repository knows which extensions are compatible with the version of Inform they're using and extensions can have both 6M62 and 10.x compatible versions available at the same time.

Does this sound reasonable? Any suggestions/objections/discussion?

Simple Graphical Window documentation

Simple Graphical Window has an error in the documentation--it uses the old "change x to y" syntax instead of "now x is y" in this example:

Carry out looking:
        change currently shown picture to the room illustration of the location;
        follow the current graphics drawing rule.

This is easy enough for me to change if you want me to upload it here, but thought I'd check first.

Deluxe Doors issues

Latched doors do not automatically close if they are open when you try to latch them. Also, unlatching an unlocked latched door results in "You don't see any such thing." (Inform 7 v10.1.2)

I resolved the first with this:

Carry out an actor turning a door-latch which is part of something (called the parent door) (this is the carry out turning door-latches rule):
	if the parent door is locked:
		safely unlock parent door;
	otherwise:
		if the parent door is open:
			say "(first closing [the noun])[command clarification break]";
			safely close the parent door;
		safely lock parent door.

I resolved the second with:

Understand "unlatch [an unlocked latched door]" as a mistake ("[The noun] is already unlatched.").

Glulx Entry Points command pasting is not invoked, preventing hyperlink extensions from working

I'm trying to use the Inline Hyperlinks extension with the Flexible Windows extension and I've hit an impasse. The latter needs a newer version of Glulx Entry Points than the one which is stocked with Inform; the former stops working when the latest Glulx Entry Points are installed.

My attempts at debugging suggest that Inline Hyperlinks' behavior doesn't change much. It invokes the following Inform 6 code when clicking links, but the glulx replacement command is never processed:

if (glk_gestalt(gestalt_Hyperlinks, 0)) glk_request_hyperlink_event(gg_mainwin);

This thread suggests the issue also affected an earlier version of Glulx Entry Points, although that version also appears to depend on Dannii Willis' additions.

https://intfiction.org/t/inline-hyperlinks-is-broken-update-not-flexible-windows/11047/7

Threaded Conversation by Chris Conley gives wrong parser errors in 6M62

When a story includes this extension, the player doesn't get the correct error for trying to interact with something out of scope.
It seems like the game first checks the correct command, then when that doesn't work it checks whether the input is a performative quip. If this test also fails we get the unrecognised verb error.

Sample story:

"Threaded Conversation bug" by Poke
Include Threaded Conversation by Chris Conley.
The stage is a room.
Backstage is a room.
The cake is an edible thing in backstage.
Test me with "x egg / touch sky / eat cake / abcde "

This will output:

>test me
(Testing.)
>[1] x egg
That's not a verb I recognise.
>[2] touch sky
That's not a verb I recognise.
>[3] eat cake
That's not a verb I recognise.
>[4] abcde
That's not a verb I recognise.

If we don't include the extension, we get the correct errors:

>[1] x egg
You can't see any such thing.
>[2] touch sky
You can't see any such thing.
>[3] eat cake
You can't see any such thing.
>[4] abcde
That's not a verb I recognise.

Common Commands Sidebar issues

There are three bugs that manifest when using Common Commands Sidebar that I have not been able to fix. I suspect at least two of them are related to Flexible Windows or one of its included extensions.

  1. Crashes in Spatterlight. (Not fixable)

    Example Code:

    Include Flexible Windows by Jon Ingold.
    
    Red Window is a g-window. The main window spawns Red Window.
    The background color of Red Window is "#FF0000".
    
    Instead of jumping:
    open Red Window.
    
    Place is a room.
    

    With the above code, this sequence of events will crash Spatterlight (in a testing release):
    RULES. ACTIONS. Resize the window. LOOK. crash (becomes unresponsive).

    spatterlight bgcolortest rules actions resize look

  2. In Gargoyle, the text color used in a new window will also be the color used for the cursor in the main window. So, for instance, if you're using white text in the new window, and your main window has a white background, the cursor will totally disappear in Gargoyle. (Fixed--thanks Dannii!)

    Example code:

    Include Flexible Windows by Jon Ingold.
    
    Window A is a g-window spawned by the main window.
    
    Table of User Styles (continued)
    window (a g-window) color (a text)
    Window A    "#ffffff"
    
    The background color of Window A is "#123456".
    
    After looking:
    open Window A.
    
    Place is a room.
    
  3. Refreshing the window may result in an extra line break in the main window. I think this has already been noted elsewhere. (Fixed in FW--see issue#32. Thanks, Dannii!)

This is my first attempt at an extension, so insight on these issues, or other suggestions about the extension, are welcome. I'm trying to make it very low-effort for the story author.

Add a dynamic index of extensions and descriptions

It is difficult to find an extension of interest in this repository based purely on the author's name and, sometimes, even on the name of the extensions file. Would be useful to have a process that dynamically writes basic information about each extension file (either on a scheduled time or after a file modification) for developer's to use as a reference. Something similar to the data provided by the Inform 7 Installed Extensions window on the Mac:

Installed Extensions screen shot

Menu improvements

From i7/kerkerkruip#13

I'd like to make some improvements to Menus. Some would be appropriate to be kept in the standard I7 extension, others might be better as add-on extensions (or perhaps they could be turned on with a use option.)

Core extension:

  • Add back blank line(s) at top of menu like I6 menus have
  • Proportional text in menus
  • Numerical menus
  • Accept more keys to go back from a text page
  • Support menus longer than a page is long
  • Hint system compatible with Emily's Menus

Glulx interface possibilities:

  • Consider Erik's code to hide rather than empty the main window
  • Hyperlinks in menus
  • Add code to vertically align menus to the top in Gargoyle
  • Proportional text in status line (might not happen due to Gargoyle not supporting enough text style hints)

bug in can't eat other people's food rule when including Rideable Vehicles

Original can't each other people's food rule:

Check an actor eating (this is the can't eat other people's food rule):
    if the noun is enclosed by a person (called the owner) who is not the actor:
        if the actor is the player:
            say "[The owner] [might not appreciate] that." (A);
        stop the action.

If the player has an edible item and is on a horse and tries to eat the item, they'll get "The horse might not appreciate that" because the horse encloses the item. Fix:

Check an actor eating (this is the rideable vehicles compatible can't eat other people's food rule):
  if the actor does not enclose the noun and the noun is enclosed by a person (called the owner) begin;
    if the actor is the player, say "[The owner] [might not appreciate] that.";
    stop the action;
  end if;

The rideable vehicles compatible  can't eat other people's food rule is listed instead of the can't eat other people's food rule in the check eating rules.

Conversation Suggestions by Eric Eve and Keyword Interface by Aaron Reed

At Dannii's suggestion I've committed the current public library versions of these two extensions as well as the minor changes I made to get them to compile. This is my first time collaborating on a github repo, so if there's anything I should do differently (either code-wise with the two extensions, or just github-wise) please let me know.

Source of "Version 11 of Conversation Framework by Eric Eve"?

The 6L02 compatible version of "Threaded Conversation by Chris Conley" relies on a specific version of "Conversation Framework by Eric Eve" ... it would be nice if this was also present in this repository; I'm tracking down where to get it from.

Threaded Conversation: quip disambiguation

I nearly have this up and running in the new version of I7, all functionality appears to be working properly, I even got implicit greetings working again, except... something seems to have broken disambiguation between quips. I'm a little worried because that's the only part of the code with much in the way of I6 inclusions.

Licence of the extensions

The repo has no licence information, and I think that it's important to know under what licence the extensions are released.

Since the extensions available in the Public Library are under the CC-BY licence, I guess that's the licence of a lot of the extensions in the repo.

However, since there are many authors, I understand it's difficult to take care of all this. Maybe authors can add a LICENSE file in their folder if they don't wan't to have the default licence of the repo (which may or may not be CC-BY).

(I'm far from being an expert on legal matters, so it may be even more complicated that I think it is.)

"Glulx Real Time" needs updating for 6M62

Current build failure

The extension "Glulx Real Time" by Erik Temple does not compile on 6M62. The culprit is these lines

if the current glk event is glk-initiated:
	event-outcome be glk event handled in null-event context;[Handles the event; we'll just ignore the outcome since it doesn't stem from player input.]

which are repeated in the chapters "Delaying input until all timers end" and "Delaying input until just one timer has ended".

The goal of these lines is to handle an event and throw away the result. But Inform 6M62 does not like unread variables:

You wrote 'let event-outcome be glk event handled in null-event context' , but when a temporary value is created inside an 'if ..., ...' or an 'otherwise ...', it only lasts until that line is complete - which means it can never be used for anything, because it goes away as soon as created. To make something more durable, create it before the 'if' or 'otherwise'.

I have an ugly fix, but it's probably possible to do better:

@@ -161,6 +161,9 @@ Definition: A g-event is glk-initiated if it is timer-event or it is sound-notif
 To decide what number is glk event handled in (ev - a g-event) context:
        (- HandleGlkEvent(gg_event, {ev}, gg_arguments) -)
 
+To ignore (event-outcome - a number):
+       do nothing.
+
 
 Chapter - Delaying input until all timers end
 
@@ -172,6 +175,7 @@ To delay input until all timers are complete:
                wait for glk input;
                if the current glk event is glk-initiated:
                        let event-outcome be glk event handled in null-event context;[Handles the event; we'll just ignore the outcome since it doesn't stem from player input.]
+                       ignore event-outcome.
                        
 
 Chapter - Delaying input until just one timer has ended
@@ -184,6 +188,7 @@ To delay input until (chron - a virtual timer) is complete:
                wait for glk input;
                if the current glk event is glk-initiated:
                        let event-outcome be glk event handled in null-event context;[Handles the event; we'll just ignore the outcome since it doesn't stem from player input.]
+                       ignore event-outcome.

Updates in dependencies

"Glulx Real Time" depends on "Glulx Entry Points" by Emily Short, which has been updated many times since the latest version of "Glulx Real Time".

I don't really understand the changes, and most of them seem to be simply moving functionality to the dependencies. Could someone take a look and see if "Glulx Real Time" should be changed in response?

"Glulx Real Time" also requires "Basic Screen Effects" by Emily Short, because it uses wait for any key and wait for the SPACE key. However, it does not include it, instead relying on the user to do so. Is that intentional?

I've cross-posted this issue to the IntFiction forum.

Destinations can't start with a number in Transit System extension

While using Emily Short's Transit System extension, I realized that destinations defined in tables can't start with a number. One of the examples has stops (rooms) named Fifth Street, Sixth Street, etc. But this would be clunky in a bigger city where you have stops named 112th Street (which works fine as a basic room name). I'm working around it for now by coming up with an alternate way to name these stations.

Do you have any suggestions for a way to get around this and still keep the rooms that are destinations named "112th St" or "24th St"? I tried various ways of escaping, quoting, and so on, but that didn't work. Thanks!

Glulx Input Loops by Erik Temple doesn't compile under 6M62

In Chapter - Definition of input loop kind in the extension Glulx Input Loops by Erik Temple:

Problem. In the sentence 'The focal window is usually the main-window' , it looks as if you intend 'The focal window is usually the main-window' to be asserting something, but that tries to set the value of the 'focal window' property to an object - which must be wrong because this property has to be a g-window.

In Chapter - New HandleGlkEvent routine, Section - The glulx input handling rulebook in the extension Glulx Input Loops by Erik Temple:

Problem. You wrote 'The glulx input handling rules have outcomes replace player input (success) and require input loop to continue (success)' : but this duplicates a previous assignment of the same outcome, and to the same rulebook.

Move in-progress / broken extensions to branches?

Curious what others think - this can be closed as "wont fix" if it doesn't fit our charter. But since there has been some confusion expressed about what this repo is for, what if we could say that the master branch had extensions that definitely work for 6L38 (or whatever the most recent version happens to be), while other in-progress extensions were in branches?

This is more a potential solution for the larger problem of, "how do we give Inform users a clear indication of where the most recent extensions are?" I imagine there are better answers to that question. :) (Can we put the sources for the inform7 website up on github?)

Author-specific readmes?

Would it be ok to add a readme file to an author's folder that describes what the extensions are for, or should only extension files be there? I7 gives a warning about a non-extension file being in the folder, but on the other hand it warns about the main readme as well.

Undo Output Control by Erik Temple steps on #undef from 6.3.3 compiler

I don't know if it is practical to do anything to fix this, but ... in Undo Output Control, the user is allowed to specify new words for "undo" and "oops." This gets in the way of code such as

Include (-

	#Undef OOPS1__WD;
	Constant OOPS1__WD = 'o//';
	#Undef OOPS2__WD;
	Constant OOPS2__WD = 'o//';
	#Undef OOPS3__WD;
	Constant OOPS3__WD = 'o//';

-) after "Language.i6t".

Which is simpler, and it's usable for compiler version 6.3.3 and above. (We are at 6.3.6, but 6.3.3 has been around for years.)

Though this was a very forward-thinking thing for Erik to do, and it provided immediate flexibility, he couldn't look into the future and see #Undefs. The result was, I couldn't figure how/why the OOPS word was still enabled in Ailihphilia.

My test case was that I 1) set AGAIN1__WD etc. elsewhere and 2) assumed the same would work for OOPS1_WD (it works fine without this extension and seems like a better general approach.)

So is it worth upgrading Undo Output Control to note this? Should we assume that people have/want the latest compiler version? Is there a way we can/should document things so other people are less likely to run into the same dead end I did?

The code in question would be

To decide which value is undo word #1:
	(- 'undo' -)
	
To decide which value is undo word #2:
	(- 'undo' -)
	
To decide which value is undo word #3:
	(- 'undo' -)
	
To decide which value is oops word #1:
	(- 'oops' -)

To decide which value is oops word #2:
	(- 'o//' -)
	
To decide which value is oops word #3:
	(- 'oops' -)

And changing "undo word #1" in the code to UNDO__W1, etc.

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.